From 08132be41fe75d6c18e0b6a468ef8ea4e8737930 Mon Sep 17 00:00:00 2001 From: feiyangqingyun Date: Wed, 22 Apr 2020 14:37:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=86=E9=A2=91=E6=B5=81?= =?UTF-8?q?=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- ffmpegdemo/ffmpeg/ffmpeg.cpp | 431 ++ ffmpegdemo/ffmpeg/ffmpeg.h | 107 + ffmpegdemo/ffmpeg/ffmpeg.pri | 31 + .../ffmpeg3/include/libavcodec/avcodec.h | 6425 +++++++++++++++++ .../ffmpeg/ffmpeg3/include/libavcodec/avdct.h | 84 + .../ffmpeg/ffmpeg3/include/libavcodec/avfft.h | 118 + .../ffmpeg3/include/libavcodec/d3d11va.h | 112 + .../ffmpeg/ffmpeg3/include/libavcodec/dirac.h | 131 + .../ffmpeg3/include/libavcodec/dv_profile.h | 83 + .../ffmpeg/ffmpeg3/include/libavcodec/dxva2.h | 93 + .../ffmpeg/ffmpeg3/include/libavcodec/jni.h | 46 + .../ffmpeg3/include/libavcodec/mediacodec.h | 88 + .../ffmpeg/ffmpeg3/include/libavcodec/qsv.h | 107 + .../ffmpeg/ffmpeg3/include/libavcodec/vaapi.h | 195 + .../ffmpeg/ffmpeg3/include/libavcodec/vda.h | 230 + .../ffmpeg/ffmpeg3/include/libavcodec/vdpau.h | 253 + .../ffmpeg3/include/libavcodec/version.h | 243 + .../ffmpeg3/include/libavcodec/videotoolbox.h | 127 + .../include/libavcodec/vorbis_parser.h | 74 + .../ffmpeg/ffmpeg3/include/libavcodec/xvmc.h | 170 + .../ffmpeg3/include/libavdevice/avdevice.h | 514 ++ .../ffmpeg3/include/libavdevice/version.h | 50 + .../ffmpeg3/include/libavfilter/avfilter.h | 1197 +++ .../include/libavfilter/avfiltergraph.h | 28 + .../ffmpeg3/include/libavfilter/buffersink.h | 165 + .../ffmpeg3/include/libavfilter/buffersrc.h | 209 + .../ffmpeg3/include/libavfilter/version.h | 74 + .../ffmpeg3/include/libavformat/avformat.h | 3008 ++++++++ .../ffmpeg/ffmpeg3/include/libavformat/avio.h | 867 +++ .../ffmpeg3/include/libavformat/version.h | 105 + .../ffmpeg3/include/libavutil/adler32.h | 60 + .../ffmpeg/ffmpeg3/include/libavutil/aes.h | 65 + .../ffmpeg3/include/libavutil/aes_ctr.h | 83 + .../ffmpeg3/include/libavutil/attributes.h | 167 + .../ffmpeg3/include/libavutil/audio_fifo.h | 187 + .../ffmpeg3/include/libavutil/avassert.h | 75 + .../ffmpeg3/include/libavutil/avconfig.h | 6 + .../ffmpeg3/include/libavutil/avstring.h | 407 ++ .../ffmpeg/ffmpeg3/include/libavutil/avutil.h | 365 + .../ffmpeg/ffmpeg3/include/libavutil/base64.h | 72 + .../ffmpeg3/include/libavutil/blowfish.h | 82 + .../ffmpeg/ffmpeg3/include/libavutil/bprint.h | 219 + .../ffmpeg/ffmpeg3/include/libavutil/bswap.h | 109 + .../ffmpeg/ffmpeg3/include/libavutil/buffer.h | 291 + .../ffmpeg3/include/libavutil/camellia.h | 70 + .../ffmpeg/ffmpeg3/include/libavutil/cast5.h | 80 + .../include/libavutil/channel_layout.h | 232 + .../ffmpeg/ffmpeg3/include/libavutil/common.h | 530 ++ .../ffmpeg/ffmpeg3/include/libavutil/cpu.h | 129 + .../ffmpeg/ffmpeg3/include/libavutil/crc.h | 103 + .../ffmpeg/ffmpeg3/include/libavutil/des.h | 77 + .../ffmpeg/ffmpeg3/include/libavutil/dict.h | 200 + .../ffmpeg3/include/libavutil/display.h | 114 + .../ffmpeg3/include/libavutil/downmix_info.h | 115 + .../ffmpeg/ffmpeg3/include/libavutil/error.h | 126 + .../ffmpeg/ffmpeg3/include/libavutil/eval.h | 113 + .../ffmpeg3/include/libavutil/ffversion.h | 5 + .../ffmpeg/ffmpeg3/include/libavutil/fifo.h | 179 + .../ffmpeg/ffmpeg3/include/libavutil/file.h | 69 + .../ffmpeg/ffmpeg3/include/libavutil/frame.h | 821 +++ .../ffmpeg/ffmpeg3/include/libavutil/hash.h | 263 + .../ffmpeg/ffmpeg3/include/libavutil/hmac.h | 100 + .../ffmpeg3/include/libavutil/hwcontext.h | 582 ++ .../include/libavutil/hwcontext_cuda.h | 51 + .../include/libavutil/hwcontext_d3d11va.h | 168 + .../ffmpeg3/include/libavutil/hwcontext_drm.h | 166 + .../include/libavutil/hwcontext_dxva2.h | 75 + .../ffmpeg3/include/libavutil/hwcontext_qsv.h | 53 + .../include/libavutil/hwcontext_vaapi.h | 117 + .../include/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + .../ffmpeg3/include/libavutil/imgutils.h | 277 + .../ffmpeg3/include/libavutil/intfloat.h | 77 + .../ffmpeg3/include/libavutil/intreadwrite.h | 634 ++ .../ffmpeg/ffmpeg3/include/libavutil/lfg.h | 71 + .../ffmpeg/ffmpeg3/include/libavutil/log.h | 376 + .../ffmpeg/ffmpeg3/include/libavutil/lzo.h | 66 + .../ffmpeg/ffmpeg3/include/libavutil/macros.h | 50 + .../libavutil/mastering_display_metadata.h | 128 + .../ffmpeg3/include/libavutil/mathematics.h | 242 + .../ffmpeg/ffmpeg3/include/libavutil/md5.h | 98 + .../ffmpeg/ffmpeg3/include/libavutil/mem.h | 699 ++ .../ffmpeg3/include/libavutil/motion_vector.h | 57 + .../ffmpeg3/include/libavutil/murmur3.h | 114 + .../ffmpeg/ffmpeg3/include/libavutil/opt.h | 866 +++ .../ffmpeg3/include/libavutil/parseutils.h | 193 + .../ffmpeg3/include/libavutil/pixdesc.h | 430 ++ .../ffmpeg3/include/libavutil/pixelutils.h | 52 + .../ffmpeg/ffmpeg3/include/libavutil/pixfmt.h | 544 ++ .../ffmpeg3/include/libavutil/random_seed.h | 43 + .../ffmpeg3/include/libavutil/rational.h | 214 + .../ffmpeg/ffmpeg3/include/libavutil/rc4.h | 66 + .../ffmpeg3/include/libavutil/replaygain.h | 50 + .../ffmpeg/ffmpeg3/include/libavutil/ripemd.h | 83 + .../ffmpeg3/include/libavutil/samplefmt.h | 272 + .../ffmpeg/ffmpeg3/include/libavutil/sha.h | 95 + .../ffmpeg/ffmpeg3/include/libavutil/sha512.h | 97 + .../ffmpeg3/include/libavutil/spherical.h | 232 + .../ffmpeg3/include/libavutil/stereo3d.h | 209 + .../ffmpeg/ffmpeg3/include/libavutil/tea.h | 71 + .../ffmpeg3/include/libavutil/threadmessage.h | 107 + .../ffmpeg/ffmpeg3/include/libavutil/time.h | 56 + .../ffmpeg3/include/libavutil/timecode.h | 140 + .../ffmpeg3/include/libavutil/timestamp.h | 78 + .../ffmpeg/ffmpeg3/include/libavutil/tree.h | 138 + .../ffmpeg3/include/libavutil/twofish.h | 70 + .../ffmpeg3/include/libavutil/version.h | 149 + .../ffmpeg/ffmpeg3/include/libavutil/xtea.h | 94 + .../ffmpeg3/include/libpostproc/postprocess.h | 111 + .../ffmpeg3/include/libpostproc/version.h | 49 + .../include/libswresample/swresample.h | 579 ++ .../ffmpeg3/include/libswresample/version.h | 45 + .../ffmpeg3/include/libswscale/swscale.h | 336 + .../ffmpeg3/include/libswscale/version.h | 53 + .../ffmpeg/ffmpeg3/include/mfx/mfxdefs.h | 112 + .../ffmpeg/ffmpeg3/include/mfx/mfxjpeg.h | 45 + .../ffmpeg/ffmpeg3/include/mfx/mfxmvc.h | 91 + .../ffmpeg/ffmpeg3/include/mfx/mfxplugin++.h | 55 + .../ffmpeg/ffmpeg3/include/mfx/mfxplugin.h | 90 + .../ffmpeg3/include/mfx/mfxstructures.h | 763 ++ .../ffmpeg/ffmpeg3/include/mfx/mfxvideo++.h | 127 + .../ffmpeg/ffmpeg3/include/mfx/mfxvideo.h | 117 + .../ffmpeg3/include64/libavcodec/avcodec.h | 6425 +++++++++++++++++ .../ffmpeg3/include64/libavcodec/avdct.h | 84 + .../ffmpeg3/include64/libavcodec/avfft.h | 118 + .../ffmpeg3/include64/libavcodec/d3d11va.h | 112 + .../ffmpeg3/include64/libavcodec/dirac.h | 131 + .../ffmpeg3/include64/libavcodec/dv_profile.h | 83 + .../ffmpeg3/include64/libavcodec/dxva2.h | 93 + .../ffmpeg/ffmpeg3/include64/libavcodec/jni.h | 46 + .../ffmpeg3/include64/libavcodec/mediacodec.h | 88 + .../ffmpeg/ffmpeg3/include64/libavcodec/qsv.h | 107 + .../ffmpeg3/include64/libavcodec/vaapi.h | 195 + .../ffmpeg/ffmpeg3/include64/libavcodec/vda.h | 230 + .../ffmpeg3/include64/libavcodec/vdpau.h | 253 + .../ffmpeg3/include64/libavcodec/version.h | 243 + .../include64/libavcodec/videotoolbox.h | 127 + .../include64/libavcodec/vorbis_parser.h | 74 + .../ffmpeg3/include64/libavcodec/xvmc.h | 170 + .../ffmpeg3/include64/libavdevice/avdevice.h | 514 ++ .../ffmpeg3/include64/libavdevice/version.h | 50 + .../ffmpeg3/include64/libavfilter/avfilter.h | 1197 +++ .../include64/libavfilter/avfiltergraph.h | 28 + .../include64/libavfilter/buffersink.h | 165 + .../ffmpeg3/include64/libavfilter/buffersrc.h | 209 + .../ffmpeg3/include64/libavfilter/version.h | 74 + .../ffmpeg3/include64/libavformat/avformat.h | 3008 ++++++++ .../ffmpeg3/include64/libavformat/avio.h | 867 +++ .../ffmpeg3/include64/libavformat/version.h | 105 + .../ffmpeg3/include64/libavutil/adler32.h | 60 + .../ffmpeg/ffmpeg3/include64/libavutil/aes.h | 65 + .../ffmpeg3/include64/libavutil/aes_ctr.h | 83 + .../ffmpeg3/include64/libavutil/attributes.h | 167 + .../ffmpeg3/include64/libavutil/audio_fifo.h | 187 + .../ffmpeg3/include64/libavutil/avassert.h | 75 + .../ffmpeg3/include64/libavutil/avconfig.h | 6 + .../ffmpeg3/include64/libavutil/avstring.h | 407 ++ .../ffmpeg3/include64/libavutil/avutil.h | 365 + .../ffmpeg3/include64/libavutil/base64.h | 72 + .../ffmpeg3/include64/libavutil/blowfish.h | 82 + .../ffmpeg3/include64/libavutil/bprint.h | 219 + .../ffmpeg3/include64/libavutil/bswap.h | 109 + .../ffmpeg3/include64/libavutil/buffer.h | 291 + .../ffmpeg3/include64/libavutil/camellia.h | 70 + .../ffmpeg3/include64/libavutil/cast5.h | 80 + .../include64/libavutil/channel_layout.h | 232 + .../ffmpeg3/include64/libavutil/common.h | 530 ++ .../ffmpeg/ffmpeg3/include64/libavutil/cpu.h | 129 + .../ffmpeg/ffmpeg3/include64/libavutil/crc.h | 103 + .../ffmpeg/ffmpeg3/include64/libavutil/des.h | 77 + .../ffmpeg/ffmpeg3/include64/libavutil/dict.h | 200 + .../ffmpeg3/include64/libavutil/display.h | 114 + .../include64/libavutil/downmix_info.h | 115 + .../ffmpeg3/include64/libavutil/error.h | 126 + .../ffmpeg/ffmpeg3/include64/libavutil/eval.h | 113 + .../ffmpeg3/include64/libavutil/ffversion.h | 5 + .../ffmpeg/ffmpeg3/include64/libavutil/fifo.h | 179 + .../ffmpeg/ffmpeg3/include64/libavutil/file.h | 69 + .../ffmpeg3/include64/libavutil/frame.h | 821 +++ .../ffmpeg/ffmpeg3/include64/libavutil/hash.h | 263 + .../ffmpeg/ffmpeg3/include64/libavutil/hmac.h | 100 + .../ffmpeg3/include64/libavutil/hwcontext.h | 582 ++ .../include64/libavutil/hwcontext_cuda.h | 51 + .../include64/libavutil/hwcontext_d3d11va.h | 168 + .../include64/libavutil/hwcontext_drm.h | 166 + .../include64/libavutil/hwcontext_dxva2.h | 75 + .../include64/libavutil/hwcontext_qsv.h | 53 + .../include64/libavutil/hwcontext_vaapi.h | 117 + .../include64/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + .../ffmpeg3/include64/libavutil/imgutils.h | 277 + .../ffmpeg3/include64/libavutil/intfloat.h | 77 + .../include64/libavutil/intreadwrite.h | 634 ++ .../ffmpeg/ffmpeg3/include64/libavutil/lfg.h | 71 + .../ffmpeg/ffmpeg3/include64/libavutil/log.h | 376 + .../ffmpeg/ffmpeg3/include64/libavutil/lzo.h | 66 + .../ffmpeg3/include64/libavutil/macros.h | 50 + .../libavutil/mastering_display_metadata.h | 128 + .../ffmpeg3/include64/libavutil/mathematics.h | 242 + .../ffmpeg/ffmpeg3/include64/libavutil/md5.h | 98 + .../ffmpeg/ffmpeg3/include64/libavutil/mem.h | 699 ++ .../include64/libavutil/motion_vector.h | 57 + .../ffmpeg3/include64/libavutil/murmur3.h | 114 + .../ffmpeg/ffmpeg3/include64/libavutil/opt.h | 866 +++ .../ffmpeg3/include64/libavutil/parseutils.h | 193 + .../ffmpeg3/include64/libavutil/pixdesc.h | 430 ++ .../ffmpeg3/include64/libavutil/pixelutils.h | 52 + .../ffmpeg3/include64/libavutil/pixfmt.h | 540 ++ .../ffmpeg3/include64/libavutil/random_seed.h | 43 + .../ffmpeg3/include64/libavutil/rational.h | 214 + .../ffmpeg/ffmpeg3/include64/libavutil/rc4.h | 66 + .../ffmpeg3/include64/libavutil/replaygain.h | 50 + .../ffmpeg3/include64/libavutil/ripemd.h | 83 + .../ffmpeg3/include64/libavutil/samplefmt.h | 272 + .../ffmpeg/ffmpeg3/include64/libavutil/sha.h | 95 + .../ffmpeg3/include64/libavutil/sha512.h | 97 + .../ffmpeg3/include64/libavutil/spherical.h | 232 + .../ffmpeg3/include64/libavutil/stereo3d.h | 209 + .../ffmpeg/ffmpeg3/include64/libavutil/tea.h | 71 + .../include64/libavutil/threadmessage.h | 107 + .../ffmpeg/ffmpeg3/include64/libavutil/time.h | 56 + .../ffmpeg3/include64/libavutil/timecode.h | 140 + .../ffmpeg3/include64/libavutil/timestamp.h | 78 + .../ffmpeg/ffmpeg3/include64/libavutil/tree.h | 138 + .../ffmpeg3/include64/libavutil/twofish.h | 70 + .../ffmpeg3/include64/libavutil/version.h | 149 + .../ffmpeg/ffmpeg3/include64/libavutil/xtea.h | 94 + .../include64/libpostproc/postprocess.h | 111 + .../ffmpeg3/include64/libpostproc/version.h | 49 + .../include64/libswresample/swresample.h | 579 ++ .../ffmpeg3/include64/libswresample/version.h | 45 + .../ffmpeg3/include64/libswscale/swscale.h | 336 + .../ffmpeg3/include64/libswscale/version.h | 53 + .../ffmpeg/ffmpeg3/include64/mfx/mfxdefs.h | 112 + .../ffmpeg/ffmpeg3/include64/mfx/mfxjpeg.h | 45 + .../ffmpeg/ffmpeg3/include64/mfx/mfxmvc.h | 91 + .../ffmpeg3/include64/mfx/mfxplugin++.h | 55 + .../ffmpeg/ffmpeg3/include64/mfx/mfxplugin.h | 90 + .../ffmpeg3/include64/mfx/mfxstructures.h | 763 ++ .../ffmpeg/ffmpeg3/include64/mfx/mfxvideo++.h | 127 + .../ffmpeg/ffmpeg3/include64/mfx/mfxvideo.h | 117 + ffmpegdemo/ffmpeg/ffmpeg3/winlib/avcodec.lib | Bin 0 -> 189782 bytes ffmpegdemo/ffmpeg/ffmpeg3/winlib/avdevice.lib | Bin 0 -> 475992 bytes ffmpegdemo/ffmpeg/ffmpeg3/winlib/avfilter.lib | Bin 0 -> 59140 bytes ffmpegdemo/ffmpeg/ffmpeg3/winlib/avformat.lib | Bin 0 -> 170820 bytes ffmpegdemo/ffmpeg/ffmpeg3/winlib/avutil.lib | Bin 0 -> 388892 bytes ffmpegdemo/ffmpeg/ffmpeg3/winlib/postproc.lib | Bin 0 -> 8904 bytes .../ffmpeg/ffmpeg3/winlib/swresample.lib | Bin 0 -> 18696 bytes ffmpegdemo/ffmpeg/ffmpeg3/winlib/swscale.lib | Bin 0 -> 27064 bytes .../ffmpeg/ffmpeg3/winlib64/avcodec.lib | Bin 0 -> 190786 bytes .../ffmpeg/ffmpeg3/winlib64/avdevice.lib | Bin 0 -> 478340 bytes .../ffmpeg/ffmpeg3/winlib64/avfilter.lib | Bin 0 -> 59444 bytes .../ffmpeg/ffmpeg3/winlib64/avformat.lib | Bin 0 -> 171176 bytes ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avutil.lib | Bin 0 -> 390820 bytes .../ffmpeg/ffmpeg3/winlib64/postproc.lib | Bin 0 -> 8952 bytes .../ffmpeg/ffmpeg3/winlib64/swresample.lib | Bin 0 -> 18774 bytes .../ffmpeg/ffmpeg3/winlib64/swscale.lib | Bin 0 -> 27204 bytes .../ffmpeg4/include/libavcodec/ac3_parser.h | 36 + .../ffmpeg4/include/libavcodec/adts_parser.h | 37 + .../ffmpeg4/include/libavcodec/avcodec.h | 6228 ++++++++++++++++ .../ffmpeg/ffmpeg4/include/libavcodec/avdct.h | 84 + .../ffmpeg/ffmpeg4/include/libavcodec/avfft.h | 118 + .../ffmpeg4/include/libavcodec/d3d11va.h | 112 + .../ffmpeg/ffmpeg4/include/libavcodec/dirac.h | 131 + .../ffmpeg4/include/libavcodec/dv_profile.h | 83 + .../ffmpeg/ffmpeg4/include/libavcodec/dxva2.h | 93 + .../ffmpeg/ffmpeg4/include/libavcodec/jni.h | 46 + .../ffmpeg4/include/libavcodec/mediacodec.h | 101 + .../ffmpeg/ffmpeg4/include/libavcodec/qsv.h | 107 + .../ffmpeg/ffmpeg4/include/libavcodec/vaapi.h | 86 + .../ffmpeg/ffmpeg4/include/libavcodec/vdpau.h | 176 + .../ffmpeg4/include/libavcodec/version.h | 140 + .../ffmpeg4/include/libavcodec/videotoolbox.h | 127 + .../include/libavcodec/vorbis_parser.h | 74 + .../ffmpeg/ffmpeg4/include/libavcodec/xvmc.h | 170 + .../ffmpeg4/include/libavdevice/avdevice.h | 514 ++ .../ffmpeg4/include/libavdevice/version.h | 50 + .../ffmpeg4/include/libavfilter/avfilter.h | 1168 +++ .../ffmpeg4/include/libavfilter/buffersink.h | 165 + .../ffmpeg4/include/libavfilter/buffersrc.h | 209 + .../ffmpeg4/include/libavfilter/version.h | 66 + .../ffmpeg4/include/libavformat/avformat.h | 3092 ++++++++ .../ffmpeg/ffmpeg4/include/libavformat/avio.h | 861 +++ .../ffmpeg4/include/libavformat/version.h | 114 + .../ffmpeg4/include/libavutil/adler32.h | 60 + .../ffmpeg/ffmpeg4/include/libavutil/aes.h | 65 + .../ffmpeg4/include/libavutil/aes_ctr.h | 88 + .../ffmpeg4/include/libavutil/attributes.h | 167 + .../ffmpeg4/include/libavutil/audio_fifo.h | 187 + .../ffmpeg4/include/libavutil/avassert.h | 75 + .../ffmpeg4/include/libavutil/avconfig.h | 6 + .../ffmpeg4/include/libavutil/avstring.h | 413 ++ .../ffmpeg/ffmpeg4/include/libavutil/avutil.h | 365 + .../ffmpeg/ffmpeg4/include/libavutil/base64.h | 72 + .../ffmpeg4/include/libavutil/blowfish.h | 82 + .../ffmpeg/ffmpeg4/include/libavutil/bprint.h | 219 + .../ffmpeg/ffmpeg4/include/libavutil/bswap.h | 109 + .../ffmpeg/ffmpeg4/include/libavutil/buffer.h | 291 + .../ffmpeg4/include/libavutil/camellia.h | 70 + .../ffmpeg/ffmpeg4/include/libavutil/cast5.h | 80 + .../include/libavutil/channel_layout.h | 232 + .../ffmpeg/ffmpeg4/include/libavutil/common.h | 560 ++ .../ffmpeg/ffmpeg4/include/libavutil/cpu.h | 130 + .../ffmpeg/ffmpeg4/include/libavutil/crc.h | 100 + .../ffmpeg/ffmpeg4/include/libavutil/des.h | 77 + .../ffmpeg/ffmpeg4/include/libavutil/dict.h | 200 + .../ffmpeg4/include/libavutil/display.h | 114 + .../ffmpeg4/include/libavutil/downmix_info.h | 115 + .../include/libavutil/encryption_info.h | 205 + .../ffmpeg/ffmpeg4/include/libavutil/error.h | 126 + .../ffmpeg/ffmpeg4/include/libavutil/eval.h | 113 + .../ffmpeg4/include/libavutil/ffversion.h | 5 + .../ffmpeg/ffmpeg4/include/libavutil/fifo.h | 179 + .../ffmpeg/ffmpeg4/include/libavutil/file.h | 71 + .../ffmpeg/ffmpeg4/include/libavutil/frame.h | 971 +++ .../ffmpeg/ffmpeg4/include/libavutil/hash.h | 269 + .../include/libavutil/hdr_dynamic_metadata.h | 343 + .../ffmpeg/ffmpeg4/include/libavutil/hmac.h | 100 + .../ffmpeg4/include/libavutil/hwcontext.h | 584 ++ .../include/libavutil/hwcontext_cuda.h | 52 + .../include/libavutil/hwcontext_d3d11va.h | 169 + .../ffmpeg4/include/libavutil/hwcontext_drm.h | 169 + .../include/libavutil/hwcontext_dxva2.h | 75 + .../include/libavutil/hwcontext_mediacodec.h | 36 + .../ffmpeg4/include/libavutil/hwcontext_qsv.h | 53 + .../include/libavutil/hwcontext_vaapi.h | 117 + .../include/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + .../ffmpeg4/include/libavutil/imgutils.h | 277 + .../ffmpeg4/include/libavutil/intfloat.h | 77 + .../ffmpeg4/include/libavutil/intreadwrite.h | 644 ++ .../ffmpeg/ffmpeg4/include/libavutil/lfg.h | 71 + .../ffmpeg/ffmpeg4/include/libavutil/log.h | 362 + .../ffmpeg/ffmpeg4/include/libavutil/lzo.h | 66 + .../ffmpeg/ffmpeg4/include/libavutil/macros.h | 50 + .../libavutil/mastering_display_metadata.h | 128 + .../ffmpeg4/include/libavutil/mathematics.h | 242 + .../ffmpeg/ffmpeg4/include/libavutil/md5.h | 98 + .../ffmpeg/ffmpeg4/include/libavutil/mem.h | 700 ++ .../ffmpeg4/include/libavutil/motion_vector.h | 57 + .../ffmpeg4/include/libavutil/murmur3.h | 120 + .../ffmpeg/ffmpeg4/include/libavutil/opt.h | 865 +++ .../ffmpeg4/include/libavutil/parseutils.h | 193 + .../ffmpeg4/include/libavutil/pixdesc.h | 440 ++ .../ffmpeg4/include/libavutil/pixelutils.h | 52 + .../ffmpeg/ffmpeg4/include/libavutil/pixfmt.h | 552 ++ .../ffmpeg4/include/libavutil/random_seed.h | 43 + .../ffmpeg4/include/libavutil/rational.h | 214 + .../ffmpeg/ffmpeg4/include/libavutil/rc4.h | 66 + .../ffmpeg4/include/libavutil/replaygain.h | 50 + .../ffmpeg/ffmpeg4/include/libavutil/ripemd.h | 87 + .../ffmpeg4/include/libavutil/samplefmt.h | 272 + .../ffmpeg/ffmpeg4/include/libavutil/sha.h | 95 + .../ffmpeg/ffmpeg4/include/libavutil/sha512.h | 97 + .../ffmpeg4/include/libavutil/spherical.h | 232 + .../ffmpeg4/include/libavutil/stereo3d.h | 233 + .../ffmpeg/ffmpeg4/include/libavutil/tea.h | 71 + .../ffmpeg4/include/libavutil/threadmessage.h | 115 + .../ffmpeg/ffmpeg4/include/libavutil/time.h | 56 + .../ffmpeg4/include/libavutil/timecode.h | 140 + .../ffmpeg4/include/libavutil/timestamp.h | 78 + .../ffmpeg/ffmpeg4/include/libavutil/tree.h | 138 + .../ffmpeg4/include/libavutil/twofish.h | 70 + .../ffmpeg/ffmpeg4/include/libavutil/tx.h | 81 + .../ffmpeg4/include/libavutil/version.h | 139 + .../ffmpeg/ffmpeg4/include/libavutil/xtea.h | 94 + .../ffmpeg4/include/libpostproc/postprocess.h | 107 + .../ffmpeg4/include/libpostproc/version.h | 45 + .../include/libswresample/swresample.h | 579 ++ .../ffmpeg4/include/libswresample/version.h | 45 + .../ffmpeg4/include/libswscale/swscale.h | 336 + .../ffmpeg4/include/libswscale/version.h | 53 + .../ffmpeg/ffmpeg4/include/mfx/mfxdefs.h | 112 + .../ffmpeg/ffmpeg4/include/mfx/mfxjpeg.h | 45 + .../ffmpeg/ffmpeg4/include/mfx/mfxmvc.h | 91 + .../ffmpeg/ffmpeg4/include/mfx/mfxplugin++.h | 55 + .../ffmpeg/ffmpeg4/include/mfx/mfxplugin.h | 90 + .../ffmpeg4/include/mfx/mfxstructures.h | 763 ++ .../ffmpeg/ffmpeg4/include/mfx/mfxvideo++.h | 127 + .../ffmpeg/ffmpeg4/include/mfx/mfxvideo.h | 117 + .../ffmpeg4/include64/libavcodec/ac3_parser.h | 36 + .../include64/libavcodec/adts_parser.h | 37 + .../ffmpeg4/include64/libavcodec/avcodec.h | 6228 ++++++++++++++++ .../ffmpeg4/include64/libavcodec/avdct.h | 84 + .../ffmpeg4/include64/libavcodec/avfft.h | 118 + .../ffmpeg4/include64/libavcodec/d3d11va.h | 112 + .../ffmpeg4/include64/libavcodec/dirac.h | 131 + .../ffmpeg4/include64/libavcodec/dv_profile.h | 83 + .../ffmpeg4/include64/libavcodec/dxva2.h | 93 + .../ffmpeg/ffmpeg4/include64/libavcodec/jni.h | 46 + .../ffmpeg4/include64/libavcodec/mediacodec.h | 101 + .../ffmpeg/ffmpeg4/include64/libavcodec/qsv.h | 107 + .../ffmpeg4/include64/libavcodec/vaapi.h | 86 + .../ffmpeg4/include64/libavcodec/vdpau.h | 176 + .../ffmpeg4/include64/libavcodec/version.h | 140 + .../include64/libavcodec/videotoolbox.h | 127 + .../include64/libavcodec/vorbis_parser.h | 74 + .../ffmpeg4/include64/libavcodec/xvmc.h | 170 + .../ffmpeg4/include64/libavdevice/avdevice.h | 514 ++ .../ffmpeg4/include64/libavdevice/version.h | 50 + .../ffmpeg4/include64/libavfilter/avfilter.h | 1168 +++ .../include64/libavfilter/buffersink.h | 165 + .../ffmpeg4/include64/libavfilter/buffersrc.h | 209 + .../ffmpeg4/include64/libavfilter/version.h | 66 + .../ffmpeg4/include64/libavformat/avformat.h | 3092 ++++++++ .../ffmpeg4/include64/libavformat/avio.h | 861 +++ .../ffmpeg4/include64/libavformat/version.h | 114 + .../ffmpeg4/include64/libavutil/adler32.h | 60 + .../ffmpeg/ffmpeg4/include64/libavutil/aes.h | 65 + .../ffmpeg4/include64/libavutil/aes_ctr.h | 88 + .../ffmpeg4/include64/libavutil/attributes.h | 167 + .../ffmpeg4/include64/libavutil/audio_fifo.h | 187 + .../ffmpeg4/include64/libavutil/avassert.h | 75 + .../ffmpeg4/include64/libavutil/avconfig.h | 6 + .../ffmpeg4/include64/libavutil/avstring.h | 413 ++ .../ffmpeg4/include64/libavutil/avutil.h | 365 + .../ffmpeg4/include64/libavutil/base64.h | 72 + .../ffmpeg4/include64/libavutil/blowfish.h | 82 + .../ffmpeg4/include64/libavutil/bprint.h | 219 + .../ffmpeg4/include64/libavutil/bswap.h | 109 + .../ffmpeg4/include64/libavutil/buffer.h | 291 + .../ffmpeg4/include64/libavutil/camellia.h | 70 + .../ffmpeg4/include64/libavutil/cast5.h | 80 + .../include64/libavutil/channel_layout.h | 232 + .../ffmpeg4/include64/libavutil/common.h | 560 ++ .../ffmpeg/ffmpeg4/include64/libavutil/cpu.h | 130 + .../ffmpeg/ffmpeg4/include64/libavutil/crc.h | 100 + .../ffmpeg/ffmpeg4/include64/libavutil/des.h | 77 + .../ffmpeg/ffmpeg4/include64/libavutil/dict.h | 200 + .../ffmpeg4/include64/libavutil/display.h | 114 + .../include64/libavutil/downmix_info.h | 115 + .../include64/libavutil/encryption_info.h | 205 + .../ffmpeg4/include64/libavutil/error.h | 126 + .../ffmpeg/ffmpeg4/include64/libavutil/eval.h | 113 + .../ffmpeg4/include64/libavutil/ffversion.h | 5 + .../ffmpeg/ffmpeg4/include64/libavutil/fifo.h | 179 + .../ffmpeg/ffmpeg4/include64/libavutil/file.h | 71 + .../ffmpeg4/include64/libavutil/frame.h | 971 +++ .../ffmpeg/ffmpeg4/include64/libavutil/hash.h | 269 + .../libavutil/hdr_dynamic_metadata.h | 343 + .../ffmpeg/ffmpeg4/include64/libavutil/hmac.h | 100 + .../ffmpeg4/include64/libavutil/hwcontext.h | 584 ++ .../include64/libavutil/hwcontext_cuda.h | 52 + .../include64/libavutil/hwcontext_d3d11va.h | 169 + .../include64/libavutil/hwcontext_drm.h | 169 + .../include64/libavutil/hwcontext_dxva2.h | 75 + .../libavutil/hwcontext_mediacodec.h | 36 + .../include64/libavutil/hwcontext_qsv.h | 53 + .../include64/libavutil/hwcontext_vaapi.h | 117 + .../include64/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + .../ffmpeg4/include64/libavutil/imgutils.h | 277 + .../ffmpeg4/include64/libavutil/intfloat.h | 77 + .../include64/libavutil/intreadwrite.h | 644 ++ .../ffmpeg/ffmpeg4/include64/libavutil/lfg.h | 71 + .../ffmpeg/ffmpeg4/include64/libavutil/log.h | 362 + .../ffmpeg/ffmpeg4/include64/libavutil/lzo.h | 66 + .../ffmpeg4/include64/libavutil/macros.h | 50 + .../libavutil/mastering_display_metadata.h | 128 + .../ffmpeg4/include64/libavutil/mathematics.h | 242 + .../ffmpeg/ffmpeg4/include64/libavutil/md5.h | 98 + .../ffmpeg/ffmpeg4/include64/libavutil/mem.h | 700 ++ .../include64/libavutil/motion_vector.h | 57 + .../ffmpeg4/include64/libavutil/murmur3.h | 120 + .../ffmpeg/ffmpeg4/include64/libavutil/opt.h | 865 +++ .../ffmpeg4/include64/libavutil/parseutils.h | 193 + .../ffmpeg4/include64/libavutil/pixdesc.h | 440 ++ .../ffmpeg4/include64/libavutil/pixelutils.h | 52 + .../ffmpeg4/include64/libavutil/pixfmt.h | 552 ++ .../ffmpeg4/include64/libavutil/random_seed.h | 43 + .../ffmpeg4/include64/libavutil/rational.h | 214 + .../ffmpeg/ffmpeg4/include64/libavutil/rc4.h | 66 + .../ffmpeg4/include64/libavutil/replaygain.h | 50 + .../ffmpeg4/include64/libavutil/ripemd.h | 87 + .../ffmpeg4/include64/libavutil/samplefmt.h | 272 + .../ffmpeg/ffmpeg4/include64/libavutil/sha.h | 95 + .../ffmpeg4/include64/libavutil/sha512.h | 97 + .../ffmpeg4/include64/libavutil/spherical.h | 232 + .../ffmpeg4/include64/libavutil/stereo3d.h | 233 + .../ffmpeg/ffmpeg4/include64/libavutil/tea.h | 71 + .../include64/libavutil/threadmessage.h | 115 + .../ffmpeg/ffmpeg4/include64/libavutil/time.h | 56 + .../ffmpeg4/include64/libavutil/timecode.h | 140 + .../ffmpeg4/include64/libavutil/timestamp.h | 78 + .../ffmpeg/ffmpeg4/include64/libavutil/tree.h | 138 + .../ffmpeg4/include64/libavutil/twofish.h | 70 + .../ffmpeg/ffmpeg4/include64/libavutil/tx.h | 81 + .../ffmpeg4/include64/libavutil/version.h | 139 + .../ffmpeg/ffmpeg4/include64/libavutil/xtea.h | 94 + .../include64/libpostproc/postprocess.h | 107 + .../ffmpeg4/include64/libpostproc/version.h | 45 + .../include64/libswresample/swresample.h | 579 ++ .../ffmpeg4/include64/libswresample/version.h | 45 + .../ffmpeg4/include64/libswscale/swscale.h | 336 + .../ffmpeg4/include64/libswscale/version.h | 53 + .../ffmpeg/ffmpeg4/include64/mfx/mfxdefs.h | 112 + .../ffmpeg/ffmpeg4/include64/mfx/mfxjpeg.h | 45 + .../ffmpeg/ffmpeg4/include64/mfx/mfxmvc.h | 91 + .../ffmpeg4/include64/mfx/mfxplugin++.h | 55 + .../ffmpeg/ffmpeg4/include64/mfx/mfxplugin.h | 90 + .../ffmpeg4/include64/mfx/mfxstructures.h | 763 ++ .../ffmpeg/ffmpeg4/include64/mfx/mfxvideo++.h | 127 + .../ffmpeg/ffmpeg4/include64/mfx/mfxvideo.h | 117 + ffmpegdemo/ffmpeg/ffmpeg4/winlib/avcodec.lib | Bin 0 -> 184554 bytes ffmpegdemo/ffmpeg/ffmpeg4/winlib/avdevice.lib | Bin 0 -> 15798 bytes ffmpegdemo/ffmpeg/ffmpeg4/winlib/avfilter.lib | Bin 0 -> 56298 bytes ffmpegdemo/ffmpeg/ffmpeg4/winlib/avformat.lib | Bin 0 -> 134282 bytes ffmpegdemo/ffmpeg/ffmpeg4/winlib/avutil.lib | Bin 0 -> 405534 bytes ffmpegdemo/ffmpeg/ffmpeg4/winlib/postproc.lib | Bin 0 -> 9034 bytes .../ffmpeg/ffmpeg4/winlib/swresample.lib | Bin 0 -> 18766 bytes ffmpegdemo/ffmpeg/ffmpeg4/winlib/swscale.lib | Bin 0 -> 27064 bytes .../ffmpeg/ffmpeg4/winlib64/avcodec.lib | Bin 0 -> 185506 bytes .../ffmpeg/ffmpeg4/winlib64/avdevice.lib | Bin 0 -> 15874 bytes .../ffmpeg/ffmpeg4/winlib64/avfilter.lib | Bin 0 -> 56582 bytes .../ffmpeg/ffmpeg4/winlib64/avformat.lib | Bin 0 -> 134982 bytes ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avutil.lib | Bin 0 -> 407528 bytes .../ffmpeg/ffmpeg4/winlib64/postproc.lib | Bin 0 -> 9078 bytes .../ffmpeg/ffmpeg4/winlib64/swresample.lib | Bin 0 -> 18842 bytes .../ffmpeg/ffmpeg4/winlib64/swscale.lib | Bin 0 -> 27204 bytes ffmpegdemo/ffmpeg/ffmpeghead.h | 30 + ffmpegdemo/ffmpegdemo.pro | 22 + ffmpegdemo/main.cpp | 43 + ffmpegdemo/readme.txt | 17 + ffmpegdemo/widget.cpp | 38 + ffmpegdemo/widget.h | 24 + ffmpegdemo/widget.ui | 63 + snap/ffmpegdemo.png | Bin 0 -> 347167 bytes snap/vlcdemo.png | Bin 0 -> 482080 bytes vlcdemo/main.cpp | 43 + vlcdemo/readme.txt | 17 + vlcdemo/vlc/vlc.cpp | 193 + vlcdemo/vlc/vlc.h | 84 + vlcdemo/vlc/vlc.pri | 30 + vlcdemo/vlc/vlc2/include/deprecated.h | 69 + vlcdemo/vlc/vlc2/include/libvlc.h | 634 ++ vlcdemo/vlc/vlc2/include/libvlc_events.h | 253 + vlcdemo/vlc/vlc2/include/libvlc_media.h | 609 ++ .../vlc2/include/libvlc_media_discoverer.h | 111 + .../vlc/vlc2/include/libvlc_media_library.h | 99 + vlcdemo/vlc/vlc2/include/libvlc_media_list.h | 209 + .../vlc2/include/libvlc_media_list_player.h | 224 + .../vlc/vlc2/include/libvlc_media_player.h | 1881 +++++ vlcdemo/vlc/vlc2/include/libvlc_structures.h | 73 + vlcdemo/vlc/vlc2/include/libvlc_version.h | 55 + vlcdemo/vlc/vlc2/include/libvlc_vlm.h | 349 + vlcdemo/vlc/vlc2/include/plugins/vlc_about.h | 1374 ++++ vlcdemo/vlc/vlc2/include/plugins/vlc_access.h | 181 + vlcdemo/vlc/vlc2/include/plugins/vlc_addons.h | 218 + vlcdemo/vlc/vlc2/include/plugins/vlc_aout.h | 339 + .../vlc2/include/plugins/vlc_aout_volume.h | 54 + vlcdemo/vlc/vlc2/include/plugins/vlc_arrays.h | 622 ++ vlcdemo/vlc/vlc2/include/plugins/vlc_atomic.h | 430 ++ .../vlc/vlc2/include/plugins/vlc_avcodec.h | 34 + vlcdemo/vlc/vlc2/include/plugins/vlc_bits.h | 197 + vlcdemo/vlc/vlc2/include/plugins/vlc_block.h | 321 + .../vlc2/include/plugins/vlc_block_helper.h | 517 ++ .../vlc/vlc2/include/plugins/vlc_charset.h | 213 + vlcdemo/vlc/vlc2/include/plugins/vlc_codec.h | 258 + vlcdemo/vlc/vlc2/include/plugins/vlc_common.h | 932 +++ vlcdemo/vlc/vlc2/include/plugins/vlc_config.h | 114 + .../vlc/vlc2/include/plugins/vlc_config_cat.h | 263 + .../vlc2/include/plugins/vlc_configuration.h | 234 + vlcdemo/vlc/vlc2/include/plugins/vlc_cpu.h | 198 + vlcdemo/vlc/vlc2/include/plugins/vlc_demux.h | 256 + vlcdemo/vlc/vlc2/include/plugins/vlc_dialog.h | 124 + vlcdemo/vlc/vlc2/include/plugins/vlc_epg.h | 97 + vlcdemo/vlc/vlc2/include/plugins/vlc_es.h | 468 ++ vlcdemo/vlc/vlc2/include/plugins/vlc_es_out.h | 163 + vlcdemo/vlc/vlc2/include/plugins/vlc_events.h | 263 + vlcdemo/vlc/vlc2/include/plugins/vlc_filter.h | 419 ++ .../vlc2/include/plugins/vlc_fingerprinter.h | 92 + vlcdemo/vlc/vlc2/include/plugins/vlc_fourcc.h | 575 ++ vlcdemo/vlc/vlc2/include/plugins/vlc_fs.h | 107 + vlcdemo/vlc/vlc2/include/plugins/vlc_gcrypt.h | 103 + vlcdemo/vlc/vlc2/include/plugins/vlc_http.h | 67 + vlcdemo/vlc/vlc2/include/plugins/vlc_httpd.h | 153 + vlcdemo/vlc/vlc2/include/plugins/vlc_image.h | 81 + .../vlc/vlc2/include/plugins/vlc_inhibit.h | 54 + vlcdemo/vlc/vlc2/include/plugins/vlc_input.h | 676 ++ .../vlc/vlc2/include/plugins/vlc_input_item.h | 351 + vlcdemo/vlc/vlc2/include/plugins/vlc_keys.h | 237 + vlcdemo/vlc/vlc2/include/plugins/vlc_main.h | 43 + vlcdemo/vlc/vlc2/include/plugins/vlc_md5.h | 59 + .../vlc2/include/plugins/vlc_media_library.h | 127 + .../vlc/vlc2/include/plugins/vlc_messages.h | 90 + vlcdemo/vlc/vlc2/include/plugins/vlc_meta.h | 167 + .../vlc2/include/plugins/vlc_meta_fetcher.h | 38 + vlcdemo/vlc/vlc2/include/plugins/vlc_mime.h | 31 + .../vlc/vlc2/include/plugins/vlc_modules.h | 77 + vlcdemo/vlc/vlc2/include/plugins/vlc_mouse.h | 148 + vlcdemo/vlc/vlc2/include/plugins/vlc_mtime.h | 79 + .../vlc/vlc2/include/plugins/vlc_network.h | 370 + .../vlc/vlc2/include/plugins/vlc_objects.h | 79 + vlcdemo/vlc/vlc2/include/plugins/vlc_opengl.h | 95 + .../vlc/vlc2/include/plugins/vlc_picture.h | 285 + .../vlc2/include/plugins/vlc_picture_fifo.h | 89 + .../vlc2/include/plugins/vlc_picture_pool.h | 126 + .../vlc/vlc2/include/plugins/vlc_playlist.h | 412 ++ vlcdemo/vlc/vlc2/include/plugins/vlc_plugin.h | 538 ++ vlcdemo/vlc/vlc2/include/plugins/vlc_probe.h | 69 + vlcdemo/vlc/vlc2/include/plugins/vlc_rand.h | 37 + .../include/plugins/vlc_services_discovery.h | 185 + vlcdemo/vlc/vlc2/include/plugins/vlc_sout.h | 252 + vlcdemo/vlc/vlc2/include/plugins/vlc_spu.h | 112 + vlcdemo/vlc/vlc2/include/plugins/vlc_stream.h | 233 + .../vlc/vlc2/include/plugins/vlc_strings.h | 67 + .../vlc/vlc2/include/plugins/vlc_subpicture.h | 208 + .../vlc/vlc2/include/plugins/vlc_text_style.h | 107 + .../vlc/vlc2/include/plugins/vlc_threads.h | 481 ++ vlcdemo/vlc/vlc2/include/plugins/vlc_tls.h | 82 + vlcdemo/vlc/vlc2/include/plugins/vlc_url.h | 55 + .../vlc/vlc2/include/plugins/vlc_variables.h | 755 ++ .../vlc2/include/plugins/vlc_video_splitter.h | 158 + vlcdemo/vlc/vlc2/include/plugins/vlc_vlm.h | 369 + vlcdemo/vlc/vlc2/include/plugins/vlc_vout.h | 167 + .../vlc2/include/plugins/vlc_vout_display.h | 453 ++ .../vlc/vlc2/include/plugins/vlc_vout_osd.h | 98 + .../vlc2/include/plugins/vlc_vout_window.h | 167 + vlcdemo/vlc/vlc2/include/plugins/vlc_xlib.h | 57 + vlcdemo/vlc/vlc2/include/plugins/vlc_xml.h | 120 + vlcdemo/vlc/vlc2/include64/deprecated.h | 69 + vlcdemo/vlc/vlc2/include64/libvlc.h | 634 ++ vlcdemo/vlc/vlc2/include64/libvlc_events.h | 253 + vlcdemo/vlc/vlc2/include64/libvlc_media.h | 609 ++ .../vlc2/include64/libvlc_media_discoverer.h | 111 + .../vlc/vlc2/include64/libvlc_media_library.h | 99 + .../vlc/vlc2/include64/libvlc_media_list.h | 209 + .../vlc2/include64/libvlc_media_list_player.h | 224 + .../vlc/vlc2/include64/libvlc_media_player.h | 1881 +++++ .../vlc/vlc2/include64/libvlc_structures.h | 73 + vlcdemo/vlc/vlc2/include64/libvlc_version.h | 55 + vlcdemo/vlc/vlc2/include64/libvlc_vlm.h | 349 + .../vlc/vlc2/include64/plugins/vlc_about.h | 1374 ++++ .../vlc/vlc2/include64/plugins/vlc_access.h | 181 + .../vlc/vlc2/include64/plugins/vlc_addons.h | 218 + vlcdemo/vlc/vlc2/include64/plugins/vlc_aout.h | 339 + .../vlc2/include64/plugins/vlc_aout_volume.h | 54 + .../vlc/vlc2/include64/plugins/vlc_arrays.h | 622 ++ .../vlc/vlc2/include64/plugins/vlc_atomic.h | 430 ++ .../vlc/vlc2/include64/plugins/vlc_avcodec.h | 34 + vlcdemo/vlc/vlc2/include64/plugins/vlc_bits.h | 197 + .../vlc/vlc2/include64/plugins/vlc_block.h | 321 + .../vlc2/include64/plugins/vlc_block_helper.h | 517 ++ .../vlc/vlc2/include64/plugins/vlc_charset.h | 213 + .../vlc/vlc2/include64/plugins/vlc_codec.h | 258 + .../vlc/vlc2/include64/plugins/vlc_common.h | 932 +++ .../vlc/vlc2/include64/plugins/vlc_config.h | 114 + .../vlc2/include64/plugins/vlc_config_cat.h | 263 + .../include64/plugins/vlc_configuration.h | 234 + vlcdemo/vlc/vlc2/include64/plugins/vlc_cpu.h | 198 + .../vlc/vlc2/include64/plugins/vlc_demux.h | 256 + .../vlc/vlc2/include64/plugins/vlc_dialog.h | 124 + vlcdemo/vlc/vlc2/include64/plugins/vlc_epg.h | 97 + vlcdemo/vlc/vlc2/include64/plugins/vlc_es.h | 468 ++ .../vlc/vlc2/include64/plugins/vlc_es_out.h | 163 + .../vlc/vlc2/include64/plugins/vlc_events.h | 263 + .../vlc/vlc2/include64/plugins/vlc_filter.h | 419 ++ .../include64/plugins/vlc_fingerprinter.h | 92 + .../vlc/vlc2/include64/plugins/vlc_fourcc.h | 575 ++ vlcdemo/vlc/vlc2/include64/plugins/vlc_fs.h | 107 + .../vlc/vlc2/include64/plugins/vlc_gcrypt.h | 103 + vlcdemo/vlc/vlc2/include64/plugins/vlc_http.h | 67 + .../vlc/vlc2/include64/plugins/vlc_httpd.h | 153 + .../vlc/vlc2/include64/plugins/vlc_image.h | 81 + .../vlc/vlc2/include64/plugins/vlc_inhibit.h | 54 + .../vlc/vlc2/include64/plugins/vlc_input.h | 676 ++ .../vlc2/include64/plugins/vlc_input_item.h | 351 + vlcdemo/vlc/vlc2/include64/plugins/vlc_keys.h | 237 + vlcdemo/vlc/vlc2/include64/plugins/vlc_main.h | 43 + vlcdemo/vlc/vlc2/include64/plugins/vlc_md5.h | 59 + .../include64/plugins/vlc_media_library.h | 127 + .../vlc/vlc2/include64/plugins/vlc_messages.h | 90 + vlcdemo/vlc/vlc2/include64/plugins/vlc_meta.h | 167 + .../vlc2/include64/plugins/vlc_meta_fetcher.h | 38 + vlcdemo/vlc/vlc2/include64/plugins/vlc_mime.h | 31 + .../vlc/vlc2/include64/plugins/vlc_modules.h | 77 + .../vlc/vlc2/include64/plugins/vlc_mouse.h | 148 + .../vlc/vlc2/include64/plugins/vlc_mtime.h | 79 + .../vlc/vlc2/include64/plugins/vlc_network.h | 370 + .../vlc/vlc2/include64/plugins/vlc_objects.h | 79 + .../vlc/vlc2/include64/plugins/vlc_opengl.h | 95 + .../vlc/vlc2/include64/plugins/vlc_picture.h | 285 + .../vlc2/include64/plugins/vlc_picture_fifo.h | 89 + .../vlc2/include64/plugins/vlc_picture_pool.h | 126 + .../vlc/vlc2/include64/plugins/vlc_playlist.h | 412 ++ .../vlc/vlc2/include64/plugins/vlc_plugin.h | 538 ++ .../vlc/vlc2/include64/plugins/vlc_probe.h | 69 + vlcdemo/vlc/vlc2/include64/plugins/vlc_rand.h | 37 + .../plugins/vlc_services_discovery.h | 185 + vlcdemo/vlc/vlc2/include64/plugins/vlc_sout.h | 252 + vlcdemo/vlc/vlc2/include64/plugins/vlc_spu.h | 112 + .../vlc/vlc2/include64/plugins/vlc_stream.h | 233 + .../vlc/vlc2/include64/plugins/vlc_strings.h | 67 + .../vlc2/include64/plugins/vlc_subpicture.h | 208 + .../vlc2/include64/plugins/vlc_text_style.h | 107 + .../vlc/vlc2/include64/plugins/vlc_threads.h | 481 ++ vlcdemo/vlc/vlc2/include64/plugins/vlc_tls.h | 82 + vlcdemo/vlc/vlc2/include64/plugins/vlc_url.h | 55 + .../vlc2/include64/plugins/vlc_variables.h | 755 ++ .../include64/plugins/vlc_video_splitter.h | 158 + vlcdemo/vlc/vlc2/include64/plugins/vlc_vlm.h | 369 + vlcdemo/vlc/vlc2/include64/plugins/vlc_vout.h | 167 + .../vlc2/include64/plugins/vlc_vout_display.h | 453 ++ .../vlc/vlc2/include64/plugins/vlc_vout_osd.h | 98 + .../vlc2/include64/plugins/vlc_vout_window.h | 167 + vlcdemo/vlc/vlc2/include64/plugins/vlc_xlib.h | 57 + vlcdemo/vlc/vlc2/include64/plugins/vlc_xml.h | 120 + vlcdemo/vlc/vlc2/winlib/libvlc.lib | Bin 0 -> 226748 bytes vlcdemo/vlc/vlc2/winlib/libvlccore.lib | Bin 0 -> 520972 bytes vlcdemo/vlc/vlc2/winlib64/libvlc.lib | Bin 0 -> 227294 bytes vlcdemo/vlc/vlc2/winlib64/libvlccore.lib | Bin 0 -> 522246 bytes vlcdemo/vlc/vlc3/include/deprecated.h | 489 ++ vlcdemo/vlc/vlc3/include/libvlc.h | 580 ++ vlcdemo/vlc/vlc3/include/libvlc_dialog.h | 241 + vlcdemo/vlc/vlc3/include/libvlc_events.h | 296 + vlcdemo/vlc/vlc3/include/libvlc_media.h | 893 +++ .../vlc3/include/libvlc_media_discoverer.h | 188 + .../vlc/vlc3/include/libvlc_media_library.h | 96 + vlcdemo/vlc/vlc3/include/libvlc_media_list.h | 202 + .../vlc3/include/libvlc_media_list_player.h | 239 + .../vlc/vlc3/include/libvlc_media_player.h | 2091 ++++++ .../vlc3/include/libvlc_renderer_discoverer.h | 255 + vlcdemo/vlc/vlc3/include/libvlc_version.h | 55 + vlcdemo/vlc/vlc3/include/libvlc_vlm.h | 342 + vlcdemo/vlc/vlc3/include/plugins/vlc_about.h | 1525 ++++ vlcdemo/vlc/vlc3/include/plugins/vlc_access.h | 81 + .../vlc/vlc3/include/plugins/vlc_actions.h | 275 + vlcdemo/vlc/vlc3/include/plugins/vlc_addons.h | 227 + vlcdemo/vlc/vlc3/include/plugins/vlc_aout.h | 409 ++ .../vlc3/include/plugins/vlc_aout_volume.h | 59 + vlcdemo/vlc/vlc3/include/plugins/vlc_arrays.h | 627 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_atomic.h | 224 + .../vlc/vlc3/include/plugins/vlc_avcodec.h | 34 + vlcdemo/vlc/vlc3/include/plugins/vlc_bits.h | 269 + vlcdemo/vlc/vlc3/include/plugins/vlc_block.h | 626 ++ .../vlc3/include/plugins/vlc_block_helper.h | 369 + vlcdemo/vlc/vlc3/include/plugins/vlc_boxes.h | 165 + .../vlc/vlc3/include/plugins/vlc_charset.h | 291 + vlcdemo/vlc/vlc3/include/plugins/vlc_codec.h | 422 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_common.h | 1049 +++ vlcdemo/vlc/vlc3/include/plugins/vlc_config.h | 114 + .../vlc/vlc3/include/plugins/vlc_config_cat.h | 271 + .../vlc3/include/plugins/vlc_configuration.h | 237 + vlcdemo/vlc/vlc3/include/plugins/vlc_cpu.h | 192 + vlcdemo/vlc/vlc3/include/plugins/vlc_demux.h | 525 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_dialog.h | 483 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_epg.h | 120 + vlcdemo/vlc/vlc3/include/plugins/vlc_es.h | 668 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_es_out.h | 183 + vlcdemo/vlc/vlc3/include/plugins/vlc_events.h | 209 + vlcdemo/vlc/vlc3/include/plugins/vlc_filter.h | 470 ++ .../vlc3/include/plugins/vlc_fingerprinter.h | 91 + vlcdemo/vlc/vlc3/include/plugins/vlc_fourcc.h | 692 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_fs.h | 294 + vlcdemo/vlc/vlc3/include/plugins/vlc_gcrypt.h | 47 + vlcdemo/vlc/vlc3/include/plugins/vlc_http.h | 97 + vlcdemo/vlc/vlc3/include/plugins/vlc_httpd.h | 152 + vlcdemo/vlc/vlc3/include/plugins/vlc_image.h | 81 + .../vlc/vlc3/include/plugins/vlc_inhibit.h | 54 + vlcdemo/vlc/vlc3/include/plugins/vlc_input.h | 703 ++ .../vlc/vlc3/include/plugins/vlc_input_item.h | 483 ++ .../vlc/vlc3/include/plugins/vlc_interface.h | 332 + .../vlc/vlc3/include/plugins/vlc_interrupt.h | 238 + .../vlc/vlc3/include/plugins/vlc_keystore.h | 317 + vlcdemo/vlc/vlc3/include/plugins/vlc_main.h | 38 + vlcdemo/vlc/vlc3/include/plugins/vlc_md5.h | 59 + .../vlc3/include/plugins/vlc_media_library.h | 127 + .../vlc/vlc3/include/plugins/vlc_memstream.h | 76 + .../vlc/vlc3/include/plugins/vlc_messages.h | 108 + vlcdemo/vlc/vlc3/include/plugins/vlc_meta.h | 165 + .../vlc3/include/plugins/vlc_meta_fetcher.h | 38 + vlcdemo/vlc/vlc3/include/plugins/vlc_mime.h | 31 + .../vlc/vlc3/include/plugins/vlc_modules.h | 85 + vlcdemo/vlc/vlc3/include/plugins/vlc_mouse.h | 148 + vlcdemo/vlc/vlc3/include/plugins/vlc_mtime.h | 78 + .../vlc/vlc3/include/plugins/vlc_network.h | 299 + .../vlc/vlc3/include/plugins/vlc_objects.h | 75 + vlcdemo/vlc/vlc3/include/plugins/vlc_opengl.h | 121 + .../vlc/vlc3/include/plugins/vlc_picture.h | 259 + .../vlc3/include/plugins/vlc_picture_fifo.h | 89 + .../vlc3/include/plugins/vlc_picture_pool.h | 189 + .../vlc/vlc3/include/plugins/vlc_playlist.h | 443 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_plugin.h | 557 ++ vlcdemo/vlc/vlc3/include/plugins/vlc_probe.h | 69 + vlcdemo/vlc/vlc3/include/plugins/vlc_rand.h | 37 + .../include/plugins/vlc_renderer_discovery.h | 219 + .../include/plugins/vlc_services_discovery.h | 234 + vlcdemo/vlc/vlc3/include/plugins/vlc_sout.h | 311 + vlcdemo/vlc/vlc3/include/plugins/vlc_spu.h | 105 + vlcdemo/vlc/vlc3/include/plugins/vlc_stream.h | 498 ++ .../include/plugins/vlc_stream_extractor.h | 170 + .../vlc/vlc3/include/plugins/vlc_strings.h | 159 + .../vlc/vlc3/include/plugins/vlc_subpicture.h | 237 + .../vlc/vlc3/include/plugins/vlc_text_style.h | 404 ++ .../vlc/vlc3/include/plugins/vlc_threads.h | 1068 +++ .../include/plugins/vlc_timestamp_helper.h | 101 + vlcdemo/vlc/vlc3/include/plugins/vlc_tls.h | 352 + vlcdemo/vlc/vlc3/include/plugins/vlc_url.h | 210 + .../vlc/vlc3/include/plugins/vlc_variables.h | 671 ++ .../vlc3/include/plugins/vlc_video_splitter.h | 158 + .../vlc/vlc3/include/plugins/vlc_viewpoint.h | 68 + vlcdemo/vlc/vlc3/include/plugins/vlc_vlm.h | 368 + vlcdemo/vlc/vlc3/include/plugins/vlc_vout.h | 167 + .../vlc3/include/plugins/vlc_vout_display.h | 481 ++ .../vlc/vlc3/include/plugins/vlc_vout_osd.h | 102 + .../vlc3/include/plugins/vlc_vout_window.h | 373 + vlcdemo/vlc/vlc3/include/plugins/vlc_xlib.h | 57 + vlcdemo/vlc/vlc3/include/plugins/vlc_xml.h | 121 + vlcdemo/vlc/vlc3/include64/deprecated.h | 489 ++ vlcdemo/vlc/vlc3/include64/libvlc.h | 580 ++ vlcdemo/vlc/vlc3/include64/libvlc_dialog.h | 241 + vlcdemo/vlc/vlc3/include64/libvlc_events.h | 296 + vlcdemo/vlc/vlc3/include64/libvlc_media.h | 893 +++ .../vlc3/include64/libvlc_media_discoverer.h | 188 + .../vlc/vlc3/include64/libvlc_media_library.h | 96 + .../vlc/vlc3/include64/libvlc_media_list.h | 202 + .../vlc3/include64/libvlc_media_list_player.h | 239 + .../vlc/vlc3/include64/libvlc_media_player.h | 2091 ++++++ .../include64/libvlc_renderer_discoverer.h | 255 + vlcdemo/vlc/vlc3/include64/libvlc_version.h | 55 + vlcdemo/vlc/vlc3/include64/libvlc_vlm.h | 342 + .../vlc/vlc3/include64/plugins/vlc_about.h | 1525 ++++ .../vlc/vlc3/include64/plugins/vlc_access.h | 81 + .../vlc/vlc3/include64/plugins/vlc_actions.h | 275 + .../vlc/vlc3/include64/plugins/vlc_addons.h | 227 + vlcdemo/vlc/vlc3/include64/plugins/vlc_aout.h | 409 ++ .../vlc3/include64/plugins/vlc_aout_volume.h | 59 + .../vlc/vlc3/include64/plugins/vlc_arrays.h | 627 ++ .../vlc/vlc3/include64/plugins/vlc_atomic.h | 224 + .../vlc/vlc3/include64/plugins/vlc_avcodec.h | 34 + vlcdemo/vlc/vlc3/include64/plugins/vlc_bits.h | 269 + .../vlc/vlc3/include64/plugins/vlc_block.h | 626 ++ .../vlc3/include64/plugins/vlc_block_helper.h | 369 + .../vlc/vlc3/include64/plugins/vlc_boxes.h | 165 + .../vlc/vlc3/include64/plugins/vlc_charset.h | 291 + .../vlc/vlc3/include64/plugins/vlc_codec.h | 422 ++ .../vlc/vlc3/include64/plugins/vlc_common.h | 1049 +++ .../vlc/vlc3/include64/plugins/vlc_config.h | 114 + .../vlc3/include64/plugins/vlc_config_cat.h | 271 + .../include64/plugins/vlc_configuration.h | 237 + vlcdemo/vlc/vlc3/include64/plugins/vlc_cpu.h | 192 + .../vlc/vlc3/include64/plugins/vlc_demux.h | 525 ++ .../vlc/vlc3/include64/plugins/vlc_dialog.h | 483 ++ vlcdemo/vlc/vlc3/include64/plugins/vlc_epg.h | 120 + vlcdemo/vlc/vlc3/include64/plugins/vlc_es.h | 668 ++ .../vlc/vlc3/include64/plugins/vlc_es_out.h | 183 + .../vlc/vlc3/include64/plugins/vlc_events.h | 209 + .../vlc/vlc3/include64/plugins/vlc_filter.h | 470 ++ .../include64/plugins/vlc_fingerprinter.h | 91 + .../vlc/vlc3/include64/plugins/vlc_fourcc.h | 692 ++ vlcdemo/vlc/vlc3/include64/plugins/vlc_fs.h | 294 + .../vlc/vlc3/include64/plugins/vlc_gcrypt.h | 47 + vlcdemo/vlc/vlc3/include64/plugins/vlc_http.h | 97 + .../vlc/vlc3/include64/plugins/vlc_httpd.h | 152 + .../vlc/vlc3/include64/plugins/vlc_image.h | 81 + .../vlc/vlc3/include64/plugins/vlc_inhibit.h | 54 + .../vlc/vlc3/include64/plugins/vlc_input.h | 703 ++ .../vlc3/include64/plugins/vlc_input_item.h | 483 ++ .../vlc3/include64/plugins/vlc_interface.h | 332 + .../vlc3/include64/plugins/vlc_interrupt.h | 238 + .../vlc/vlc3/include64/plugins/vlc_keystore.h | 317 + vlcdemo/vlc/vlc3/include64/plugins/vlc_main.h | 38 + vlcdemo/vlc/vlc3/include64/plugins/vlc_md5.h | 59 + .../include64/plugins/vlc_media_library.h | 127 + .../vlc3/include64/plugins/vlc_memstream.h | 76 + .../vlc/vlc3/include64/plugins/vlc_messages.h | 108 + vlcdemo/vlc/vlc3/include64/plugins/vlc_meta.h | 165 + .../vlc3/include64/plugins/vlc_meta_fetcher.h | 38 + vlcdemo/vlc/vlc3/include64/plugins/vlc_mime.h | 31 + .../vlc/vlc3/include64/plugins/vlc_modules.h | 85 + .../vlc/vlc3/include64/plugins/vlc_mouse.h | 148 + .../vlc/vlc3/include64/plugins/vlc_mtime.h | 78 + .../vlc/vlc3/include64/plugins/vlc_network.h | 299 + .../vlc/vlc3/include64/plugins/vlc_objects.h | 75 + .../vlc/vlc3/include64/plugins/vlc_opengl.h | 121 + .../vlc/vlc3/include64/plugins/vlc_picture.h | 259 + .../vlc3/include64/plugins/vlc_picture_fifo.h | 89 + .../vlc3/include64/plugins/vlc_picture_pool.h | 189 + .../vlc/vlc3/include64/plugins/vlc_playlist.h | 443 ++ .../vlc/vlc3/include64/plugins/vlc_plugin.h | 557 ++ .../vlc/vlc3/include64/plugins/vlc_probe.h | 69 + vlcdemo/vlc/vlc3/include64/plugins/vlc_rand.h | 37 + .../plugins/vlc_renderer_discovery.h | 219 + .../plugins/vlc_services_discovery.h | 234 + vlcdemo/vlc/vlc3/include64/plugins/vlc_sout.h | 311 + vlcdemo/vlc/vlc3/include64/plugins/vlc_spu.h | 105 + .../vlc/vlc3/include64/plugins/vlc_stream.h | 498 ++ .../include64/plugins/vlc_stream_extractor.h | 170 + .../vlc/vlc3/include64/plugins/vlc_strings.h | 159 + .../vlc3/include64/plugins/vlc_subpicture.h | 237 + .../vlc3/include64/plugins/vlc_text_style.h | 404 ++ .../vlc/vlc3/include64/plugins/vlc_threads.h | 1068 +++ .../include64/plugins/vlc_timestamp_helper.h | 101 + vlcdemo/vlc/vlc3/include64/plugins/vlc_tls.h | 352 + vlcdemo/vlc/vlc3/include64/plugins/vlc_url.h | 210 + .../vlc3/include64/plugins/vlc_variables.h | 671 ++ .../include64/plugins/vlc_video_splitter.h | 158 + .../vlc3/include64/plugins/vlc_viewpoint.h | 68 + vlcdemo/vlc/vlc3/include64/plugins/vlc_vlm.h | 368 + vlcdemo/vlc/vlc3/include64/plugins/vlc_vout.h | 167 + .../vlc3/include64/plugins/vlc_vout_display.h | 481 ++ .../vlc/vlc3/include64/plugins/vlc_vout_osd.h | 102 + .../vlc3/include64/plugins/vlc_vout_window.h | 373 + vlcdemo/vlc/vlc3/include64/plugins/vlc_xlib.h | 57 + vlcdemo/vlc/vlc3/include64/plugins/vlc_xml.h | 121 + vlcdemo/vlc/vlc3/winlib/libvlc.lib | Bin 0 -> 257772 bytes vlcdemo/vlc/vlc3/winlib/libvlccore.lib | Bin 0 -> 586968 bytes vlcdemo/vlc/vlc3/winlib64/libvlc.lib | Bin 0 -> 259040 bytes vlcdemo/vlc/vlc3/winlib64/libvlccore.lib | Bin 0 -> 589928 bytes vlcdemo/vlc/vlchead.h | 71 + vlcdemo/vlcdemo.pro | 22 + vlcdemo/widget.cpp | 38 + vlcdemo/widget.h | 24 + vlcdemo/widget.ui | 63 + 915 files changed, 231380 insertions(+), 1 deletion(-) create mode 100644 ffmpegdemo/ffmpeg/ffmpeg.cpp create mode 100644 ffmpegdemo/ffmpeg/ffmpeg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg.pri create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avcodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avdct.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avfft.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dirac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dv_profile.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/jni.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/mediacodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vda.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vorbis_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/xvmc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/avdevice.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfilter.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfiltergraph.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersink.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersrc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avformat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avio.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/adler32.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes_ctr.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/attributes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/audio_fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avassert.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avconfig.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avstring.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avutil.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/base64.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/blowfish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bprint.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bswap.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/buffer.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/camellia.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cast5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/channel_layout.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/common.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cpu.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/crc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/des.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/dict.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/display.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/downmix_info.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/error.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/eval.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ffversion.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/file.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/frame.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hash.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hmac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_cuda.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_drm.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/imgutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intfloat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intreadwrite.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lfg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/log.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lzo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/macros.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mastering_display_metadata.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mathematics.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/md5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mem.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/motion_vector.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/murmur3.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/opt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/parseutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixdesc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixelutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixfmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/random_seed.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rational.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rc4.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/replaygain.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ripemd.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/samplefmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha512.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/spherical.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/stereo3d.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/threadmessage.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/time.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timecode.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timestamp.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tree.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/twofish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/xtea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/postprocess.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/swresample.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/swscale.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxdefs.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxjpeg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxmvc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxstructures.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avcodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avdct.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avfft.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dirac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dv_profile.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/jni.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/mediacodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vda.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vorbis_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/xvmc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/avdevice.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfilter.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfiltergraph.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersink.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersrc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avformat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avio.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/adler32.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes_ctr.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/attributes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/audio_fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avassert.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avconfig.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avstring.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avutil.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/base64.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/blowfish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bprint.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bswap.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/buffer.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/camellia.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cast5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/channel_layout.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/common.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cpu.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/crc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/des.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/dict.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/display.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/downmix_info.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/error.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/eval.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ffversion.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/file.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/frame.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hash.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hmac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_cuda.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_drm.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/imgutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intfloat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intreadwrite.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lfg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/log.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lzo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/macros.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mastering_display_metadata.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mathematics.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/md5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mem.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/motion_vector.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/murmur3.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/opt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/parseutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixdesc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixelutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixfmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/random_seed.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rational.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rc4.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/replaygain.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ripemd.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/samplefmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha512.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/spherical.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/stereo3d.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/threadmessage.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/time.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timecode.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timestamp.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tree.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/twofish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/xtea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/postprocess.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/swresample.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/swscale.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxdefs.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxjpeg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxmvc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxstructures.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/avcodec.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/avdevice.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/avfilter.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/avformat.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/avutil.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/postproc.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/swresample.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib/swscale.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avcodec.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avdevice.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avfilter.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avformat.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avutil.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/postproc.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/swresample.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg3/winlib64/swscale.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/ac3_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/adts_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avcodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avdct.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avfft.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dirac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dv_profile.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/jni.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/mediacodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vorbis_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/xvmc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/avdevice.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/avfilter.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersink.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersrc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avformat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avio.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/adler32.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes_ctr.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/attributes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/audio_fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avassert.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avconfig.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avstring.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avutil.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/base64.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/blowfish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bprint.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bswap.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/buffer.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/camellia.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cast5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/channel_layout.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/common.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cpu.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/crc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/des.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/dict.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/display.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/downmix_info.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/encryption_info.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/error.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/eval.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ffversion.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/file.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/frame.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hash.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hdr_dynamic_metadata.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hmac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_cuda.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_drm.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_mediacodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/imgutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intfloat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intreadwrite.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lfg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/log.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lzo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/macros.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mastering_display_metadata.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mathematics.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/md5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mem.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/motion_vector.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/murmur3.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/opt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/parseutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixdesc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixelutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixfmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/random_seed.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rational.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rc4.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/replaygain.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ripemd.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/samplefmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha512.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/spherical.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/stereo3d.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/threadmessage.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/time.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timecode.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timestamp.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tree.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/twofish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tx.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/xtea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/postprocess.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/swresample.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/swscale.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxdefs.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxjpeg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxmvc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxstructures.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/ac3_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/adts_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avcodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avdct.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avfft.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dirac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dv_profile.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/jni.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/mediacodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vorbis_parser.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/xvmc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/avdevice.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/avfilter.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersink.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersrc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avformat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avio.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/adler32.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes_ctr.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/attributes.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/audio_fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avassert.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avconfig.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avstring.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avutil.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/base64.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/blowfish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bprint.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bswap.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/buffer.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/camellia.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cast5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/channel_layout.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/common.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cpu.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/crc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/des.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/dict.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/display.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/downmix_info.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/encryption_info.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/error.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/eval.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ffversion.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/fifo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/file.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/frame.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hash.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hdr_dynamic_metadata.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hmac.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_cuda.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_d3d11va.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_drm.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_dxva2.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_mediacodec.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_qsv.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vaapi.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vdpau.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_videotoolbox.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/imgutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intfloat.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intreadwrite.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lfg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/log.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lzo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/macros.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mastering_display_metadata.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mathematics.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/md5.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mem.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/motion_vector.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/murmur3.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/opt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/parseutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixdesc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixelutils.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixfmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/random_seed.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rational.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rc4.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/replaygain.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ripemd.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/samplefmt.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha512.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/spherical.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/stereo3d.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/threadmessage.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/time.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timecode.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timestamp.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tree.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/twofish.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tx.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/xtea.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/postprocess.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/swresample.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/swscale.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/version.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxdefs.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxjpeg.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxmvc.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxstructures.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo++.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo.h create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/avcodec.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/avdevice.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/avfilter.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/avformat.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/avutil.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/postproc.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/swresample.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib/swscale.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avcodec.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avdevice.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avfilter.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avformat.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avutil.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/postproc.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/swresample.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeg4/winlib64/swscale.lib create mode 100644 ffmpegdemo/ffmpeg/ffmpeghead.h create mode 100644 ffmpegdemo/ffmpegdemo.pro create mode 100644 ffmpegdemo/main.cpp create mode 100644 ffmpegdemo/readme.txt create mode 100644 ffmpegdemo/widget.cpp create mode 100644 ffmpegdemo/widget.h create mode 100644 ffmpegdemo/widget.ui create mode 100644 snap/ffmpegdemo.png create mode 100644 snap/vlcdemo.png create mode 100644 vlcdemo/main.cpp create mode 100644 vlcdemo/readme.txt create mode 100644 vlcdemo/vlc/vlc.cpp create mode 100644 vlcdemo/vlc/vlc.h create mode 100644 vlcdemo/vlc/vlc.pri create mode 100644 vlcdemo/vlc/vlc2/include/deprecated.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_events.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_media.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_media_discoverer.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_media_library.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_media_list.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_media_list_player.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_media_player.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_structures.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_version.h create mode 100644 vlcdemo/vlc/vlc2/include/libvlc_vlm.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_about.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_access.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_addons.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_aout.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_aout_volume.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_arrays.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_atomic.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_avcodec.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_bits.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_block.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_block_helper.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_charset.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_codec.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_common.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_config.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_config_cat.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_configuration.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_cpu.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_demux.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_dialog.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_epg.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_es.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_es_out.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_events.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_filter.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_fingerprinter.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_fourcc.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_fs.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_gcrypt.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_http.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_httpd.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_image.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_inhibit.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_input.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_input_item.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_keys.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_main.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_md5.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_media_library.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_messages.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_meta.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_meta_fetcher.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_mime.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_modules.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_mouse.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_mtime.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_network.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_objects.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_opengl.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_picture.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_picture_fifo.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_picture_pool.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_playlist.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_plugin.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_probe.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_rand.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_services_discovery.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_sout.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_spu.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_stream.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_strings.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_subpicture.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_text_style.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_threads.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_tls.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_url.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_variables.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_video_splitter.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_vlm.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_vout.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_vout_display.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_vout_osd.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_vout_window.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_xlib.h create mode 100644 vlcdemo/vlc/vlc2/include/plugins/vlc_xml.h create mode 100644 vlcdemo/vlc/vlc2/include64/deprecated.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_events.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_media.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_media_discoverer.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_media_library.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_media_list.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_media_list_player.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_media_player.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_structures.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_version.h create mode 100644 vlcdemo/vlc/vlc2/include64/libvlc_vlm.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_about.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_access.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_addons.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_aout.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_aout_volume.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_arrays.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_atomic.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_avcodec.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_bits.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_block.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_block_helper.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_charset.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_codec.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_common.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_config.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_config_cat.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_configuration.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_cpu.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_demux.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_dialog.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_epg.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_es.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_es_out.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_events.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_filter.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_fingerprinter.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_fourcc.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_fs.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_gcrypt.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_http.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_httpd.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_image.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_inhibit.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_input.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_input_item.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_keys.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_main.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_md5.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_media_library.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_messages.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_meta.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_meta_fetcher.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_mime.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_modules.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_mouse.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_mtime.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_network.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_objects.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_opengl.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_picture.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_fifo.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_pool.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_playlist.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_plugin.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_probe.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_rand.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_services_discovery.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_sout.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_spu.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_stream.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_strings.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_subpicture.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_text_style.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_threads.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_tls.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_url.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_variables.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_video_splitter.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_vlm.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_vout.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_display.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_osd.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_window.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_xlib.h create mode 100644 vlcdemo/vlc/vlc2/include64/plugins/vlc_xml.h create mode 100644 vlcdemo/vlc/vlc2/winlib/libvlc.lib create mode 100644 vlcdemo/vlc/vlc2/winlib/libvlccore.lib create mode 100644 vlcdemo/vlc/vlc2/winlib64/libvlc.lib create mode 100644 vlcdemo/vlc/vlc2/winlib64/libvlccore.lib create mode 100644 vlcdemo/vlc/vlc3/include/deprecated.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_dialog.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_events.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_media.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_media_discoverer.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_media_library.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_media_list.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_media_list_player.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_media_player.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_renderer_discoverer.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_version.h create mode 100644 vlcdemo/vlc/vlc3/include/libvlc_vlm.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_about.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_access.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_actions.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_addons.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_aout.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_aout_volume.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_arrays.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_atomic.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_avcodec.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_bits.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_block.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_block_helper.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_boxes.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_charset.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_codec.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_common.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_config.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_config_cat.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_configuration.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_cpu.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_demux.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_dialog.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_epg.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_es.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_es_out.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_events.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_filter.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_fingerprinter.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_fourcc.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_fs.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_gcrypt.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_http.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_httpd.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_image.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_inhibit.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_input.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_input_item.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_interface.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_interrupt.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_keystore.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_main.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_md5.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_media_library.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_memstream.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_messages.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_meta.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_meta_fetcher.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_mime.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_modules.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_mouse.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_mtime.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_network.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_objects.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_opengl.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_picture.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_picture_fifo.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_picture_pool.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_playlist.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_plugin.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_probe.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_rand.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_renderer_discovery.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_services_discovery.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_sout.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_spu.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_stream.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_stream_extractor.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_strings.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_subpicture.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_text_style.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_threads.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_timestamp_helper.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_tls.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_url.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_variables.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_video_splitter.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_viewpoint.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_vlm.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_vout.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_vout_display.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_vout_osd.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_vout_window.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_xlib.h create mode 100644 vlcdemo/vlc/vlc3/include/plugins/vlc_xml.h create mode 100644 vlcdemo/vlc/vlc3/include64/deprecated.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_dialog.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_events.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_media.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_media_discoverer.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_media_library.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_media_list.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_media_list_player.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_media_player.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_renderer_discoverer.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_version.h create mode 100644 vlcdemo/vlc/vlc3/include64/libvlc_vlm.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_about.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_access.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_actions.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_addons.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_aout.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_aout_volume.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_arrays.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_atomic.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_avcodec.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_bits.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_block.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_block_helper.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_boxes.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_charset.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_codec.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_common.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_config.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_config_cat.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_configuration.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_cpu.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_demux.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_dialog.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_epg.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_es.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_es_out.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_events.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_filter.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_fingerprinter.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_fourcc.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_fs.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_gcrypt.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_http.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_httpd.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_image.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_inhibit.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_input.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_input_item.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_interface.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_interrupt.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_keystore.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_main.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_md5.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_media_library.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_memstream.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_messages.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_meta.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_meta_fetcher.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_mime.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_modules.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_mouse.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_mtime.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_network.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_objects.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_opengl.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_picture.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_fifo.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_pool.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_playlist.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_plugin.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_probe.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_rand.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_renderer_discovery.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_services_discovery.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_sout.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_spu.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_stream.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_stream_extractor.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_strings.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_subpicture.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_text_style.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_threads.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_timestamp_helper.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_tls.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_url.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_variables.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_video_splitter.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_viewpoint.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_vlm.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_vout.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_display.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_osd.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_window.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_xlib.h create mode 100644 vlcdemo/vlc/vlc3/include64/plugins/vlc_xml.h create mode 100644 vlcdemo/vlc/vlc3/winlib/libvlc.lib create mode 100644 vlcdemo/vlc/vlc3/winlib/libvlccore.lib create mode 100644 vlcdemo/vlc/vlc3/winlib64/libvlc.lib create mode 100644 vlcdemo/vlc/vlc3/winlib64/libvlccore.lib create mode 100644 vlcdemo/vlc/vlchead.h create mode 100644 vlcdemo/vlcdemo.pro create mode 100644 vlcdemo/widget.cpp create mode 100644 vlcdemo/widget.h create mode 100644 vlcdemo/widget.ui diff --git a/README.md b/README.md index 7197883..e08d76f 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ | 31 | screenwidget | 屏幕截图控件 | | 32 | echartgauge | echart仪表盘含交互支持webkit及webengine | | 33 | imageswitch | 图片开关控件 | +| 34 | ffmpegdemo | 视频流播放ffmpeg内核 | +| 35 | vlcdemo | 视频流播放vlc内核 | ![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/lightbutton.gif) ![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/movewidget.gif) @@ -67,4 +69,6 @@ ![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/videowidget.gif) ![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/screenwidget.gif) ![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/echartgauge.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/imageswitch.gif) \ No newline at end of file +![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/imageswitch.gif) +![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/ffmpegdemo.png) +![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/snap/vlcdemo.png) \ No newline at end of file diff --git a/ffmpegdemo/ffmpeg/ffmpeg.cpp b/ffmpegdemo/ffmpeg/ffmpeg.cpp new file mode 100644 index 0000000..fdf33a1 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg.cpp @@ -0,0 +1,431 @@ +#include "ffmpeg.h" + +#pragma execution_character_set("utf-8") +#define TIMEMS qPrintable(QTime::currentTime().toString("HH:mm:ss zzz")) +#define STRDATETIME qPrintable(QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss")) + +FFmpegThread::FFmpegThread(QObject *parent) : QThread(parent) +{ + setObjectName("FFmpegThread"); + stopped = false; + isPlay = false; + + frameFinish = false; + videoWidth = 0; + videoHeight = 0; + oldWidth = 0; + oldHeight = 0; + videoStreamIndex = -1; + audioStreamIndex = -1; + + url = "rtsp://192.168.1.128:554/1"; + + buffer = NULL; + avPacket = NULL; + avFrame = NULL; + avFrame2 = NULL; + avFrame3 = NULL; + avFormatContext = NULL; + videoCodec = NULL; + audioCodec = NULL; + swsContext = NULL; + + options = NULL; + videoDecoder = NULL; + audioDecoder = NULL; + + //初始化注册,一个软件中只注册一次即可 + FFmpegThread::initlib(); +} + +//一个软件中只需要初始化一次就行 +void FFmpegThread::initlib() +{ + static QMutex mutex; + QMutexLocker locker(&mutex); + static bool isInit = false; + if (!isInit) { + //注册库中所有可用的文件格式和解码器 + av_register_all(); + //注册所有设备,主要用于本地摄像机播放支持 +#ifdef ffmpegdevice + avdevice_register_all(); +#endif + //初始化网络流格式,使用网络流时必须先执行 + avformat_network_init(); + + isInit = true; + qDebug() << TIMEMS << "init ffmpeg lib ok" << " version:" << FFMPEG_VERSION; +#if 0 + //输出所有支持的解码器名称 + QStringList listCodeName; + AVCodec *code = av_codec_next(NULL); + while (code != NULL) { + listCodeName << code->name; + code = code->next; + } + + qDebug() << TIMEMS << listCodeName; +#endif + } +} + +bool FFmpegThread::init() +{ + //在打开码流前指定各种参数比如:探测时间/超时时间/最大延时等 + //设置缓存大小,1080p可将值调大 + av_dict_set(&options, "buffer_size", "8192000", 0); + //以tcp方式打开,如果以udp方式打开将tcp替换为udp + av_dict_set(&options, "rtsp_transport", "tcp", 0); + //设置超时断开连接时间,单位微秒,3000000表示3秒 + av_dict_set(&options, "stimeout", "3000000", 0); + //设置最大时延,单位微秒,1000000表示1秒 + av_dict_set(&options, "max_delay", "1000000", 0); + //自动开启线程数 + av_dict_set(&options, "threads", "auto", 0); + + //打开视频流 + avFormatContext = avformat_alloc_context(); + + int result = avformat_open_input(&avFormatContext, url.toStdString().data(), NULL, &options); + if (result < 0) { + qDebug() << TIMEMS << "open input error" << url; + return false; + } + + //释放设置参数 + if (options != NULL) { + av_dict_free(&options); + } + + //获取流信息 + result = avformat_find_stream_info(avFormatContext, NULL); + if (result < 0) { + qDebug() << TIMEMS << "find stream info error"; + return false; + } + + //----------视频流部分开始,打个标记方便折叠代码---------- + if (1) { + videoStreamIndex = av_find_best_stream(avFormatContext, AVMEDIA_TYPE_VIDEO, -1, -1, &videoDecoder, 0); + if (videoStreamIndex < 0) { + qDebug() << TIMEMS << "find video stream index error"; + return false; + } + + //获取视频流 + AVStream *videoStream = avFormatContext->streams[videoStreamIndex]; + + //获取视频流解码器,或者指定解码器 + videoCodec = videoStream->codec; + videoDecoder = avcodec_find_decoder(videoCodec->codec_id); + //videoDecoder = avcodec_find_decoder_by_name("h264_qsv"); + if (videoDecoder == NULL) { + qDebug() << TIMEMS << "video decoder not found"; + return false; + } + + //设置加速解码 + videoCodec->lowres = videoDecoder->max_lowres; + videoCodec->flags2 |= AV_CODEC_FLAG2_FAST; + + //打开视频解码器 + result = avcodec_open2(videoCodec, videoDecoder, NULL); + if (result < 0) { + qDebug() << TIMEMS << "open video codec error"; + return false; + } + + //获取分辨率大小 + videoWidth = videoStream->codec->width; + videoHeight = videoStream->codec->height; + + //如果没有获取到宽高则返回 + if (videoWidth == 0 || videoHeight == 0) { + qDebug() << TIMEMS << "find width height error"; + return false; + } + + QString videoInfo = QString("视频流信息 -> 索引: %1 解码: %2 格式: %3 时长: %4 秒 分辨率: %5*%6") + .arg(videoStreamIndex).arg(videoDecoder->name).arg(avFormatContext->iformat->name) + .arg((avFormatContext->duration) / 1000000).arg(videoWidth).arg(videoHeight); + qDebug() << TIMEMS << videoInfo; + } + //----------视频流部分开始---------- + + //----------音频流部分开始,打个标记方便折叠代码---------- + if (1) { + //循环查找音频流索引 + audioStreamIndex = -1; + for (uint i = 0; i < avFormatContext->nb_streams; i++) { + if (avFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { + audioStreamIndex = i; + break; + } + } + + //有些没有音频流,所以这里不用返回 + if (audioStreamIndex == -1) { + qDebug() << TIMEMS << "find audio stream index error"; + } else { + //获取音频流 + AVStream *audioStream = avFormatContext->streams[audioStreamIndex]; + audioCodec = audioStream->codec; + + //获取音频流解码器,或者指定解码器 + audioDecoder = avcodec_find_decoder(audioCodec->codec_id); + //audioDecoder = avcodec_find_decoder_by_name("aac"); + if (audioDecoder == NULL) { + qDebug() << TIMEMS << "audio codec not found"; + return false; + } + + //打开音频解码器 + result = avcodec_open2(audioCodec, audioDecoder, NULL); + if (result < 0) { + qDebug() << TIMEMS << "open audio codec error"; + return false; + } + + QString audioInfo = QString("音频流信息 -> 索引: %1 解码: %2 比特率: %3 声道数: %4 采样: %5") + .arg(audioStreamIndex).arg(audioDecoder->name).arg(avFormatContext->bit_rate) + .arg(audioCodec->channels).arg(audioCodec->sample_rate); + qDebug() << TIMEMS << audioInfo; + } + } + //----------音频流部分结束---------- + + //预分配好内存 + avPacket = av_packet_alloc(); + avFrame = av_frame_alloc(); + avFrame2 = av_frame_alloc(); + avFrame3 = av_frame_alloc(); + + //比较上一次文件的宽度高度,当改变时,需要重新分配内存 + if (oldWidth != videoWidth || oldHeight != videoHeight) { + int byte = avpicture_get_size(AV_PIX_FMT_RGB32, videoWidth, videoHeight); + buffer = (uint8_t *)av_malloc(byte * sizeof(uint8_t)); + oldWidth = videoWidth; + oldHeight = videoHeight; + } + + //定义像素格式 + AVPixelFormat srcFormat = AV_PIX_FMT_YUV420P; + AVPixelFormat dstFormat = AV_PIX_FMT_RGB32; + //通过解码器获取解码格式 + srcFormat = videoCodec->pix_fmt; + + //默认最快速度的解码采用的SWS_FAST_BILINEAR参数,可能会丢失部分图片数据,可以自行更改成其他参数 + int flags = SWS_FAST_BILINEAR; + + //开辟缓存存储一帧数据 + //以下两种方法都可以,avpicture_fill已经逐渐被废弃 + //avpicture_fill((AVPicture *)avFrame3, buffer, dstFormat, videoWidth, videoHeight); + av_image_fill_arrays(avFrame3->data, avFrame3->linesize, buffer, dstFormat, videoWidth, videoHeight, 1); + + //图像转换 + swsContext = sws_getContext(videoWidth, videoHeight, srcFormat, videoWidth, videoHeight, dstFormat, flags, NULL, NULL, NULL); + + //输出视频信息 + //av_dump_format(avFormatContext, 0, url.toStdString().data(), 0); + + //qDebug() << TIMEMS << "init ffmpeg finsh"; + return true; +} + +void FFmpegThread::run() +{ + //计时 + QTime time; + while (!stopped) { + //根据标志位执行初始化操作 + if (isPlay) { + this->init(); + isPlay = false; + continue; + } + + time.restart(); + if (av_read_frame(avFormatContext, avPacket) >= 0) { + //判断当前包是视频还是音频 + int packetSize = avPacket->size; + int index = avPacket->stream_index; + if (index == videoStreamIndex) { + //解码视频流 + avcodec_decode_video2(videoCodec, avFrame2, &frameFinish, avPacket); + + if (frameFinish) { + //将数据转成一张图片 + sws_scale(swsContext, (const uint8_t *const *)avFrame2->data, avFrame2->linesize, 0, videoHeight, avFrame3->data, avFrame3->linesize); + + //以下两种方法都可以 + //QImage image(avFrame3->data[0], videoWidth, videoHeight, QImage::Format_RGB32); + QImage image((uchar *)buffer, videoWidth, videoHeight, QImage::Format_RGB32); + if (!image.isNull()) { + emit receiveImage(image); + } + + msleep(1); + } + } else if (index == audioStreamIndex) { + //解码音频流,这里暂不处理,以后交给sdl播放 + } + } + + av_packet_unref(avPacket); + av_freep(avPacket); + msleep(1); + } + + //线程结束后释放资源 + free(); + stopped = false; + isPlay = false; + qDebug() << TIMEMS << "stop ffmpeg thread"; +} + +void FFmpegThread::setUrl(const QString &url) +{ + this->url = url; +} + +void FFmpegThread::free() +{ + if (swsContext != NULL) { + sws_freeContext(swsContext); + swsContext = NULL; + } + + if (avPacket != NULL) { + av_packet_unref(avPacket); + avPacket = NULL; + } + + if (avFrame != NULL) { + av_frame_free(&avFrame); + avFrame = NULL; + } + + if (avFrame2 != NULL) { + av_frame_free(&avFrame2); + avFrame2 = NULL; + } + + if (avFrame3 != NULL) { + av_frame_free(&avFrame3); + avFrame3 = NULL; + } + + if (videoCodec != NULL) { + avcodec_close(videoCodec); + videoCodec = NULL; + } + + if (audioCodec != NULL) { + avcodec_close(audioCodec); + audioCodec = NULL; + } + + if (avFormatContext != NULL) { + avformat_close_input(&avFormatContext); + avFormatContext = NULL; + } + + av_dict_free(&options); + //qDebug() << TIMEMS << "close ffmpeg ok"; +} + +void FFmpegThread::play() +{ + //通过标志位让线程执行初始化 + isPlay = true; +} + +void FFmpegThread::pause() +{ + +} + +void FFmpegThread::next() +{ + +} + +void FFmpegThread::stop() +{ + //通过标志位让线程停止 + stopped = true; +} + +//实时视频显示窗体类 +FFmpegWidget::FFmpegWidget(QWidget * parent) : QWidget(parent) +{ + ffmpeg = new FFmpegThread(this); + connect(ffmpeg, SIGNAL(receiveImage(QImage)), this, SLOT(updateImage(QImage))); + image = QImage(); +} + +FFmpegWidget::~FFmpegWidget() +{ + close(); +} + +void FFmpegWidget::paintEvent(QPaintEvent *) +{ + if (image.isNull()) { + return; + } + + //qDebug() << TIMEMS << "paintEvent" << objectName(); + QPainter painter(this); + painter.drawImage(this->rect(), image); +} + +void FFmpegWidget::updateImage(const QImage &image) +{ + //this->image = image.copy(); + this->image = image; + this->update(); +} + +void FFmpegWidget::setUrl(const QString &url) +{ + ffmpeg->setUrl(url); +} + +void FFmpegWidget::open() +{ + //qDebug() << TIMEMS << "open video" << objectName(); + clear(); + + ffmpeg->play(); + ffmpeg->start(); +} + +void FFmpegWidget::pause() +{ + ffmpeg->pause(); +} + +void FFmpegWidget::next() +{ + ffmpeg->next(); +} + +void FFmpegWidget::close() +{ + //qDebug() << TIMEMS << "close video" << objectName(); + if (ffmpeg->isRunning()) { + ffmpeg->stop(); + ffmpeg->quit(); + ffmpeg->wait(500); + } + + QTimer::singleShot(1, this, SLOT(clear())); +} + +void FFmpegWidget::clear() +{ + image = QImage(); + update(); +} diff --git a/ffmpegdemo/ffmpeg/ffmpeg.h b/ffmpegdemo/ffmpeg/ffmpeg.h new file mode 100644 index 0000000..2af2c8a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg.h @@ -0,0 +1,107 @@ +#ifndef FFMPEG_H +#define FFMPEG_H + +#include +#if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) +#include +#endif + +#include "ffmpeghead.h" +class FFmpegWidget; + +class FFmpegThread : public QThread +{ + Q_OBJECT +public: + explicit FFmpegThread(QObject *parent = 0); + static void initlib(); + +protected: + void run(); + +private: + volatile bool stopped; //线程停止标志位 + volatile bool isPlay; //播放视频标志位 + + int frameFinish; //一帧完成 + int videoWidth; //视频宽度 + int videoHeight; //视频高度 + int oldWidth; //上一次视频宽度 + int oldHeight; //上一次视频高度 + int videoStreamIndex; //视频流索引 + int audioStreamIndex; //音频流索引 + + QString url; //视频流地址 + + uint8_t *buffer; //存储解码后图片buffer + AVPacket *avPacket; //包对象 + AVFrame *avFrame; //帧对象 + AVFrame *avFrame2; //帧对象 + AVFrame *avFrame3; //帧对象 + AVFormatContext *avFormatContext;//格式对象 + AVCodecContext *videoCodec; //视频解码器 + AVCodecContext *audioCodec; //音频解码器 + SwsContext *swsContext; //处理图片数据对象 + + AVDictionary *options; //参数对象 + AVCodec *videoDecoder; //视频解码 + AVCodec *audioDecoder; //音频解码 + +signals: + //收到图片信号 + void receiveImage(const QImage &image); + +public slots: + //设置视频流地址 + void setUrl(const QString &url); + + //初始化视频对象 + bool init(); + //释放对象 + void free(); + //播放视频对象 + void play(); + //暂停播放 + void pause(); + //继续播放 + void next(); + //停止采集线程 + void stop(); +}; + +//实时视频显示窗体类 +class FFmpegWidget : public QWidget +{ + Q_OBJECT +public: + explicit FFmpegWidget(QWidget *parent = 0); + ~FFmpegWidget(); + +protected: + void paintEvent(QPaintEvent *); + +private: + FFmpegThread *ffmpeg; //实时视频采集对象 + QImage image; //要显示的图片 + +private slots: + //接收图像并绘制 + void updateImage(const QImage &image); + +public slots: + //设置视频流地址 + void setUrl(const QString &url); + + //打开设备 + void open(); + //暂停 + void pause(); + //继续 + void next(); + //关闭设备 + void close(); + //清空 + void clear(); +}; + +#endif // FFMPEG_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg.pri b/ffmpegdemo/ffmpeg/ffmpeg.pri new file mode 100644 index 0000000..5e5ce40 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg.pri @@ -0,0 +1,31 @@ +HEADERS += $$PWD/ffmpeghead.h +HEADERS += $$PWD/ffmpeg.h +SOURCES += $$PWD/ffmpeg.cpp + +#ffmpeg4则使用ffmpeg4的目录 +contains(DEFINES, ffmpeg4) { +strPath = ffmpeg4 +} else { +strPath = ffmpeg3 +} + +#32位的库则使用32位的库的头文件和lib文件 +contains(DEFINES, qt32) { +strLib = winlib +strInclude = include +} else { +strLib = winlib64 +strInclude = include64 +} + +INCLUDEPATH += $$PWD/$$strPath/$$strInclude +INCLUDEPATH += $$PWD/$$strPath/$$strInclude/plugins + +win32 { +LIBS += -L$$PWD/$$strPath/$$strLib/ -lavcodec -lavfilter -lavformat -lswscale -lavutil -lswresample -lavdevice +} + +#请自行替换 +unix { +LIBS += -L$$PWD/linuxlib/ -lavfilter -lavformat -lavdevice -lavcodec -lswscale -lavutil -lswresample -lavdevice -lpthread -lm -lz -lrt -ldl +} diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avcodec.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avcodec.h new file mode 100644 index 0000000..18c3e3e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avcodec.h @@ -0,0 +1,6425 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVCODEC_AVCODEC_H +#define AVCODEC_AVCODEC_H + +/** + * @file + * @ingroup libavc + * Libavcodec external API header + */ + +#include +#include "libavutil/samplefmt.h" +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/cpu.h" +#include "libavutil/channel_layout.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "version.h" + +/** + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * + * @{ + * + * @defgroup lavc_decoding Decoding + * @{ + * @} + * + * @defgroup lavc_encoding Encoding + * @{ + * @} + * + * @defgroup lavc_codec Codecs + * @{ + * @defgroup lavc_codec_native Native Codecs + * @{ + * @} + * @defgroup lavc_codec_wrappers External library wrappers + * @{ + * @} + * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge + * @{ + * @} + * @} + * @defgroup lavc_internal Internal + * @{ + * @} + * @} + */ + +/** + * @ingroup libavc + * @defgroup lavc_encdec send/receive encoding and decoding API overview + * @{ + * + * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ + * avcodec_receive_packet() functions provide an encode/decode API, which + * decouples input and output. + * + * The API is very similar for encoding/decoding and audio/video, and works as + * follows: + * - Set up and open the AVCodecContext as usual. + * - Send valid input: + * - For decoding, call avcodec_send_packet() to give the decoder raw + * compressed data in an AVPacket. + * - For encoding, call avcodec_send_frame() to give the encoder an AVFrame + * containing uncompressed audio or video. + * In both cases, it is recommended that AVPackets and AVFrames are + * refcounted, or libavcodec might have to copy the input data. (libavformat + * always returns refcounted AVPackets, and av_frame_get_buffer() allocates + * refcounted AVFrames.) + * - Receive output in a loop. Periodically call one of the avcodec_receive_*() + * functions and process their output: + * - For decoding, call avcodec_receive_frame(). On success, it will return + * an AVFrame containing uncompressed audio or video data. + * - For encoding, call avcodec_receive_packet(). On success, it will return + * an AVPacket with a compressed frame. + * Repeat this call until it returns AVERROR(EAGAIN) or an error. The + * AVERROR(EAGAIN) return value means that new input data is required to + * return new output. In this case, continue with sending input. For each + * input frame/packet, the codec will typically return 1 output frame/packet, + * but it can also be 0 or more than 1. + * + * At the beginning of decoding or encoding, the codec might accept multiple + * input frames/packets without returning a frame, until its internal buffers + * are filled. This situation is handled transparently if you follow the steps + * outlined above. + * + * In theory, sending input can result in EAGAIN - this should happen only if + * not all output was received. You can use this to structure alternative decode + * or encode loops other than the one suggested above. For example, you could + * try sending new input on each iteration, and try to receive output if that + * returns EAGAIN. + * + * End of stream situations. These require "flushing" (aka draining) the codec, + * as the codec might buffer multiple frames or packets internally for + * performance or out of necessity (consider B-frames). + * This is handled as follows: + * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) + * or avcodec_send_frame() (encoding) functions. This will enter draining + * mode. + * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() + * (encoding) in a loop until AVERROR_EOF is returned. The functions will + * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. + * - Before decoding can be resumed again, the codec has to be reset with + * avcodec_flush_buffers(). + * + * Using the API as outlined above is highly recommended. But it is also + * possible to call functions outside of this rigid schema. For example, you can + * call avcodec_send_packet() repeatedly without calling + * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed + * until the codec's internal buffer has been filled up (which is typically of + * size 1 per output frame, after initial input), and then reject input with + * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to + * read at least some output. + * + * Not all codecs will follow a rigid and predictable dataflow; the only + * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on + * one end implies that a receive/send call on the other end will succeed, or + * at least will not fail with AVERROR(EAGAIN). In general, no codec will + * permit unlimited buffering of input or output. + * + * This API replaces the following legacy functions: + * - avcodec_decode_video2() and avcodec_decode_audio4(): + * Use avcodec_send_packet() to feed input to the decoder, then use + * avcodec_receive_frame() to receive decoded frames after each packet. + * Unlike with the old video decoding API, multiple frames might result from + * a packet. For audio, splitting the input packet into frames by partially + * decoding packets becomes transparent to the API user. You never need to + * feed an AVPacket to the API twice (unless it is rejected with AVERROR(EAGAIN) - then + * no data was read from the packet). + * Additionally, sending a flush/draining packet is required only once. + * - avcodec_encode_video2()/avcodec_encode_audio2(): + * Use avcodec_send_frame() to feed input to the encoder, then use + * avcodec_receive_packet() to receive encoded packets. + * Providing user-allocated buffers for avcodec_receive_packet() is not + * possible. + * - The new API does not handle subtitles yet. + * + * Mixing new and old function calls on the same AVCodecContext is not allowed, + * and will result in undefined behavior. + * + * Some codecs might require using the new API; using the old API will return + * an error when calling it. All codecs support the new API. + * + * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This + * would be an invalid state, which could put the codec user into an endless + * loop. The API has no concept of time either: it cannot happen that trying to + * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second + * later accepts the packet (with no other receive/flush API calls involved). + * The API is a strict state machine, and the passage of time is not supposed + * to influence it. Some timing-dependent behavior might still be deemed + * acceptable in certain cases. But it must never result in both send/receive + * returning EAGAIN at the same time at any point. It must also absolutely be + * avoided that the current state is "unstable" and can "flip-flop" between + * the send/receive APIs allowing progress. For example, it's not allowed that + * the codec randomly decides that it actually wants to consume a packet now + * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an + * avcodec_send_packet() call. + * @} + */ + +/** + * @defgroup lavc_core Core functions/structures. + * @ingroup libavc + * + * Basic definitions, functions for querying libavcodec capabilities, + * allocating core structures, etc. + * @{ + */ + + +/** + * Identify the syntax and semantics of the bitstream. + * The principle is roughly: + * Two decoders with the same ID can decode the same streams. + * Two encoders with the same ID can encode compatible streams. + * There may be slight deviations from the principle due to implementation + * details. + * + * If you add a codec ID to this list, add it so that + * 1. no value of an existing codec ID changes (that would break ABI), + * 2. it is as close as possible to similar codecs + * + * After adding new codec IDs, do not forget to add an entry to the codec + * descriptor list and bump libavcodec minor version. + */ +enum AVCodecID { + AV_CODEC_ID_NONE, + + /* video codecs */ + AV_CODEC_ID_MPEG1VIDEO, + AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding +#if FF_API_XVMC + AV_CODEC_ID_MPEG2VIDEO_XVMC, +#endif /* FF_API_XVMC */ + AV_CODEC_ID_H261, + AV_CODEC_ID_H263, + AV_CODEC_ID_RV10, + AV_CODEC_ID_RV20, + AV_CODEC_ID_MJPEG, + AV_CODEC_ID_MJPEGB, + AV_CODEC_ID_LJPEG, + AV_CODEC_ID_SP5X, + AV_CODEC_ID_JPEGLS, + AV_CODEC_ID_MPEG4, + AV_CODEC_ID_RAWVIDEO, + AV_CODEC_ID_MSMPEG4V1, + AV_CODEC_ID_MSMPEG4V2, + AV_CODEC_ID_MSMPEG4V3, + AV_CODEC_ID_WMV1, + AV_CODEC_ID_WMV2, + AV_CODEC_ID_H263P, + AV_CODEC_ID_H263I, + AV_CODEC_ID_FLV1, + AV_CODEC_ID_SVQ1, + AV_CODEC_ID_SVQ3, + AV_CODEC_ID_DVVIDEO, + AV_CODEC_ID_HUFFYUV, + AV_CODEC_ID_CYUV, + AV_CODEC_ID_H264, + AV_CODEC_ID_INDEO3, + AV_CODEC_ID_VP3, + AV_CODEC_ID_THEORA, + AV_CODEC_ID_ASV1, + AV_CODEC_ID_ASV2, + AV_CODEC_ID_FFV1, + AV_CODEC_ID_4XM, + AV_CODEC_ID_VCR1, + AV_CODEC_ID_CLJR, + AV_CODEC_ID_MDEC, + AV_CODEC_ID_ROQ, + AV_CODEC_ID_INTERPLAY_VIDEO, + AV_CODEC_ID_XAN_WC3, + AV_CODEC_ID_XAN_WC4, + AV_CODEC_ID_RPZA, + AV_CODEC_ID_CINEPAK, + AV_CODEC_ID_WS_VQA, + AV_CODEC_ID_MSRLE, + AV_CODEC_ID_MSVIDEO1, + AV_CODEC_ID_IDCIN, + AV_CODEC_ID_8BPS, + AV_CODEC_ID_SMC, + AV_CODEC_ID_FLIC, + AV_CODEC_ID_TRUEMOTION1, + AV_CODEC_ID_VMDVIDEO, + AV_CODEC_ID_MSZH, + AV_CODEC_ID_ZLIB, + AV_CODEC_ID_QTRLE, + AV_CODEC_ID_TSCC, + AV_CODEC_ID_ULTI, + AV_CODEC_ID_QDRAW, + AV_CODEC_ID_VIXL, + AV_CODEC_ID_QPEG, + AV_CODEC_ID_PNG, + AV_CODEC_ID_PPM, + AV_CODEC_ID_PBM, + AV_CODEC_ID_PGM, + AV_CODEC_ID_PGMYUV, + AV_CODEC_ID_PAM, + AV_CODEC_ID_FFVHUFF, + AV_CODEC_ID_RV30, + AV_CODEC_ID_RV40, + AV_CODEC_ID_VC1, + AV_CODEC_ID_WMV3, + AV_CODEC_ID_LOCO, + AV_CODEC_ID_WNV1, + AV_CODEC_ID_AASC, + AV_CODEC_ID_INDEO2, + AV_CODEC_ID_FRAPS, + AV_CODEC_ID_TRUEMOTION2, + AV_CODEC_ID_BMP, + AV_CODEC_ID_CSCD, + AV_CODEC_ID_MMVIDEO, + AV_CODEC_ID_ZMBV, + AV_CODEC_ID_AVS, + AV_CODEC_ID_SMACKVIDEO, + AV_CODEC_ID_NUV, + AV_CODEC_ID_KMVC, + AV_CODEC_ID_FLASHSV, + AV_CODEC_ID_CAVS, + AV_CODEC_ID_JPEG2000, + AV_CODEC_ID_VMNC, + AV_CODEC_ID_VP5, + AV_CODEC_ID_VP6, + AV_CODEC_ID_VP6F, + AV_CODEC_ID_TARGA, + AV_CODEC_ID_DSICINVIDEO, + AV_CODEC_ID_TIERTEXSEQVIDEO, + AV_CODEC_ID_TIFF, + AV_CODEC_ID_GIF, + AV_CODEC_ID_DXA, + AV_CODEC_ID_DNXHD, + AV_CODEC_ID_THP, + AV_CODEC_ID_SGI, + AV_CODEC_ID_C93, + AV_CODEC_ID_BETHSOFTVID, + AV_CODEC_ID_PTX, + AV_CODEC_ID_TXD, + AV_CODEC_ID_VP6A, + AV_CODEC_ID_AMV, + AV_CODEC_ID_VB, + AV_CODEC_ID_PCX, + AV_CODEC_ID_SUNRAST, + AV_CODEC_ID_INDEO4, + AV_CODEC_ID_INDEO5, + AV_CODEC_ID_MIMIC, + AV_CODEC_ID_RL2, + AV_CODEC_ID_ESCAPE124, + AV_CODEC_ID_DIRAC, + AV_CODEC_ID_BFI, + AV_CODEC_ID_CMV, + AV_CODEC_ID_MOTIONPIXELS, + AV_CODEC_ID_TGV, + AV_CODEC_ID_TGQ, + AV_CODEC_ID_TQI, + AV_CODEC_ID_AURA, + AV_CODEC_ID_AURA2, + AV_CODEC_ID_V210X, + AV_CODEC_ID_TMV, + AV_CODEC_ID_V210, + AV_CODEC_ID_DPX, + AV_CODEC_ID_MAD, + AV_CODEC_ID_FRWU, + AV_CODEC_ID_FLASHSV2, + AV_CODEC_ID_CDGRAPHICS, + AV_CODEC_ID_R210, + AV_CODEC_ID_ANM, + AV_CODEC_ID_BINKVIDEO, + AV_CODEC_ID_IFF_ILBM, +#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM + AV_CODEC_ID_KGV1, + AV_CODEC_ID_YOP, + AV_CODEC_ID_VP8, + AV_CODEC_ID_PICTOR, + AV_CODEC_ID_ANSI, + AV_CODEC_ID_A64_MULTI, + AV_CODEC_ID_A64_MULTI5, + AV_CODEC_ID_R10K, + AV_CODEC_ID_MXPEG, + AV_CODEC_ID_LAGARITH, + AV_CODEC_ID_PRORES, + AV_CODEC_ID_JV, + AV_CODEC_ID_DFA, + AV_CODEC_ID_WMV3IMAGE, + AV_CODEC_ID_VC1IMAGE, + AV_CODEC_ID_UTVIDEO, + AV_CODEC_ID_BMV_VIDEO, + AV_CODEC_ID_VBLE, + AV_CODEC_ID_DXTORY, + AV_CODEC_ID_V410, + AV_CODEC_ID_XWD, + AV_CODEC_ID_CDXL, + AV_CODEC_ID_XBM, + AV_CODEC_ID_ZEROCODEC, + AV_CODEC_ID_MSS1, + AV_CODEC_ID_MSA1, + AV_CODEC_ID_TSCC2, + AV_CODEC_ID_MTS2, + AV_CODEC_ID_CLLC, + AV_CODEC_ID_MSS2, + AV_CODEC_ID_VP9, + AV_CODEC_ID_AIC, + AV_CODEC_ID_ESCAPE130, + AV_CODEC_ID_G2M, + AV_CODEC_ID_WEBP, + AV_CODEC_ID_HNM4_VIDEO, + AV_CODEC_ID_HEVC, +#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC + AV_CODEC_ID_FIC, + AV_CODEC_ID_ALIAS_PIX, + AV_CODEC_ID_BRENDER_PIX, + AV_CODEC_ID_PAF_VIDEO, + AV_CODEC_ID_EXR, + AV_CODEC_ID_VP7, + AV_CODEC_ID_SANM, + AV_CODEC_ID_SGIRLE, + AV_CODEC_ID_MVC1, + AV_CODEC_ID_MVC2, + AV_CODEC_ID_HQX, + AV_CODEC_ID_TDSC, + AV_CODEC_ID_HQ_HQA, + AV_CODEC_ID_HAP, + AV_CODEC_ID_DDS, + AV_CODEC_ID_DXV, + AV_CODEC_ID_SCREENPRESSO, + AV_CODEC_ID_RSCC, + + AV_CODEC_ID_Y41P = 0x8000, + AV_CODEC_ID_AVRP, + AV_CODEC_ID_012V, + AV_CODEC_ID_AVUI, + AV_CODEC_ID_AYUV, + AV_CODEC_ID_TARGA_Y216, + AV_CODEC_ID_V308, + AV_CODEC_ID_V408, + AV_CODEC_ID_YUV4, + AV_CODEC_ID_AVRN, + AV_CODEC_ID_CPIA, + AV_CODEC_ID_XFACE, + AV_CODEC_ID_SNOW, + AV_CODEC_ID_SMVJPEG, + AV_CODEC_ID_APNG, + AV_CODEC_ID_DAALA, + AV_CODEC_ID_CFHD, + AV_CODEC_ID_TRUEMOTION2RT, + AV_CODEC_ID_M101, + AV_CODEC_ID_MAGICYUV, + AV_CODEC_ID_SHEERVIDEO, + AV_CODEC_ID_YLC, + AV_CODEC_ID_PSD, + AV_CODEC_ID_PIXLET, + AV_CODEC_ID_SPEEDHQ, + AV_CODEC_ID_FMVC, + AV_CODEC_ID_SCPR, + AV_CODEC_ID_CLEARVIDEO, + AV_CODEC_ID_XPM, + AV_CODEC_ID_AV1, + AV_CODEC_ID_BITPACKED, + AV_CODEC_ID_MSCC, + AV_CODEC_ID_SRGC, + AV_CODEC_ID_SVG, + AV_CODEC_ID_GDV, + AV_CODEC_ID_FITS, + + /* various PCM "codecs" */ + AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs + AV_CODEC_ID_PCM_S16LE = 0x10000, + AV_CODEC_ID_PCM_S16BE, + AV_CODEC_ID_PCM_U16LE, + AV_CODEC_ID_PCM_U16BE, + AV_CODEC_ID_PCM_S8, + AV_CODEC_ID_PCM_U8, + AV_CODEC_ID_PCM_MULAW, + AV_CODEC_ID_PCM_ALAW, + AV_CODEC_ID_PCM_S32LE, + AV_CODEC_ID_PCM_S32BE, + AV_CODEC_ID_PCM_U32LE, + AV_CODEC_ID_PCM_U32BE, + AV_CODEC_ID_PCM_S24LE, + AV_CODEC_ID_PCM_S24BE, + AV_CODEC_ID_PCM_U24LE, + AV_CODEC_ID_PCM_U24BE, + AV_CODEC_ID_PCM_S24DAUD, + AV_CODEC_ID_PCM_ZORK, + AV_CODEC_ID_PCM_S16LE_PLANAR, + AV_CODEC_ID_PCM_DVD, + AV_CODEC_ID_PCM_F32BE, + AV_CODEC_ID_PCM_F32LE, + AV_CODEC_ID_PCM_F64BE, + AV_CODEC_ID_PCM_F64LE, + AV_CODEC_ID_PCM_BLURAY, + AV_CODEC_ID_PCM_LXF, + AV_CODEC_ID_S302M, + AV_CODEC_ID_PCM_S8_PLANAR, + AV_CODEC_ID_PCM_S24LE_PLANAR, + AV_CODEC_ID_PCM_S32LE_PLANAR, + AV_CODEC_ID_PCM_S16BE_PLANAR, + + AV_CODEC_ID_PCM_S64LE = 0x10800, + AV_CODEC_ID_PCM_S64BE, + AV_CODEC_ID_PCM_F16LE, + AV_CODEC_ID_PCM_F24LE, + + /* various ADPCM codecs */ + AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, + AV_CODEC_ID_ADPCM_IMA_WAV, + AV_CODEC_ID_ADPCM_IMA_DK3, + AV_CODEC_ID_ADPCM_IMA_DK4, + AV_CODEC_ID_ADPCM_IMA_WS, + AV_CODEC_ID_ADPCM_IMA_SMJPEG, + AV_CODEC_ID_ADPCM_MS, + AV_CODEC_ID_ADPCM_4XM, + AV_CODEC_ID_ADPCM_XA, + AV_CODEC_ID_ADPCM_ADX, + AV_CODEC_ID_ADPCM_EA, + AV_CODEC_ID_ADPCM_G726, + AV_CODEC_ID_ADPCM_CT, + AV_CODEC_ID_ADPCM_SWF, + AV_CODEC_ID_ADPCM_YAMAHA, + AV_CODEC_ID_ADPCM_SBPRO_4, + AV_CODEC_ID_ADPCM_SBPRO_3, + AV_CODEC_ID_ADPCM_SBPRO_2, + AV_CODEC_ID_ADPCM_THP, + AV_CODEC_ID_ADPCM_IMA_AMV, + AV_CODEC_ID_ADPCM_EA_R1, + AV_CODEC_ID_ADPCM_EA_R3, + AV_CODEC_ID_ADPCM_EA_R2, + AV_CODEC_ID_ADPCM_IMA_EA_SEAD, + AV_CODEC_ID_ADPCM_IMA_EA_EACS, + AV_CODEC_ID_ADPCM_EA_XAS, + AV_CODEC_ID_ADPCM_EA_MAXIS_XA, + AV_CODEC_ID_ADPCM_IMA_ISS, + AV_CODEC_ID_ADPCM_G722, + AV_CODEC_ID_ADPCM_IMA_APC, + AV_CODEC_ID_ADPCM_VIMA, +#if FF_API_VIMA_DECODER + AV_CODEC_ID_VIMA = AV_CODEC_ID_ADPCM_VIMA, +#endif + + AV_CODEC_ID_ADPCM_AFC = 0x11800, + AV_CODEC_ID_ADPCM_IMA_OKI, + AV_CODEC_ID_ADPCM_DTK, + AV_CODEC_ID_ADPCM_IMA_RAD, + AV_CODEC_ID_ADPCM_G726LE, + AV_CODEC_ID_ADPCM_THP_LE, + AV_CODEC_ID_ADPCM_PSX, + AV_CODEC_ID_ADPCM_AICA, + AV_CODEC_ID_ADPCM_IMA_DAT4, + AV_CODEC_ID_ADPCM_MTAF, + + /* AMR */ + AV_CODEC_ID_AMR_NB = 0x12000, + AV_CODEC_ID_AMR_WB, + + /* RealAudio codecs*/ + AV_CODEC_ID_RA_144 = 0x13000, + AV_CODEC_ID_RA_288, + + /* various DPCM codecs */ + AV_CODEC_ID_ROQ_DPCM = 0x14000, + AV_CODEC_ID_INTERPLAY_DPCM, + AV_CODEC_ID_XAN_DPCM, + AV_CODEC_ID_SOL_DPCM, + + AV_CODEC_ID_SDX2_DPCM = 0x14800, + AV_CODEC_ID_GREMLIN_DPCM, + + /* audio codecs */ + AV_CODEC_ID_MP2 = 0x15000, + AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 + AV_CODEC_ID_AAC, + AV_CODEC_ID_AC3, + AV_CODEC_ID_DTS, + AV_CODEC_ID_VORBIS, + AV_CODEC_ID_DVAUDIO, + AV_CODEC_ID_WMAV1, + AV_CODEC_ID_WMAV2, + AV_CODEC_ID_MACE3, + AV_CODEC_ID_MACE6, + AV_CODEC_ID_VMDAUDIO, + AV_CODEC_ID_FLAC, + AV_CODEC_ID_MP3ADU, + AV_CODEC_ID_MP3ON4, + AV_CODEC_ID_SHORTEN, + AV_CODEC_ID_ALAC, + AV_CODEC_ID_WESTWOOD_SND1, + AV_CODEC_ID_GSM, ///< as in Berlin toast format + AV_CODEC_ID_QDM2, + AV_CODEC_ID_COOK, + AV_CODEC_ID_TRUESPEECH, + AV_CODEC_ID_TTA, + AV_CODEC_ID_SMACKAUDIO, + AV_CODEC_ID_QCELP, + AV_CODEC_ID_WAVPACK, + AV_CODEC_ID_DSICINAUDIO, + AV_CODEC_ID_IMC, + AV_CODEC_ID_MUSEPACK7, + AV_CODEC_ID_MLP, + AV_CODEC_ID_GSM_MS, /* as found in WAV */ + AV_CODEC_ID_ATRAC3, +#if FF_API_VOXWARE + AV_CODEC_ID_VOXWARE, +#endif + AV_CODEC_ID_APE, + AV_CODEC_ID_NELLYMOSER, + AV_CODEC_ID_MUSEPACK8, + AV_CODEC_ID_SPEEX, + AV_CODEC_ID_WMAVOICE, + AV_CODEC_ID_WMAPRO, + AV_CODEC_ID_WMALOSSLESS, + AV_CODEC_ID_ATRAC3P, + AV_CODEC_ID_EAC3, + AV_CODEC_ID_SIPR, + AV_CODEC_ID_MP1, + AV_CODEC_ID_TWINVQ, + AV_CODEC_ID_TRUEHD, + AV_CODEC_ID_MP4ALS, + AV_CODEC_ID_ATRAC1, + AV_CODEC_ID_BINKAUDIO_RDFT, + AV_CODEC_ID_BINKAUDIO_DCT, + AV_CODEC_ID_AAC_LATM, + AV_CODEC_ID_QDMC, + AV_CODEC_ID_CELT, + AV_CODEC_ID_G723_1, + AV_CODEC_ID_G729, + AV_CODEC_ID_8SVX_EXP, + AV_CODEC_ID_8SVX_FIB, + AV_CODEC_ID_BMV_AUDIO, + AV_CODEC_ID_RALF, + AV_CODEC_ID_IAC, + AV_CODEC_ID_ILBC, + AV_CODEC_ID_OPUS, + AV_CODEC_ID_COMFORT_NOISE, + AV_CODEC_ID_TAK, + AV_CODEC_ID_METASOUND, + AV_CODEC_ID_PAF_AUDIO, + AV_CODEC_ID_ON2AVC, + AV_CODEC_ID_DSS_SP, + + AV_CODEC_ID_FFWAVESYNTH = 0x15800, + AV_CODEC_ID_SONIC, + AV_CODEC_ID_SONIC_LS, + AV_CODEC_ID_EVRC, + AV_CODEC_ID_SMV, + AV_CODEC_ID_DSD_LSBF, + AV_CODEC_ID_DSD_MSBF, + AV_CODEC_ID_DSD_LSBF_PLANAR, + AV_CODEC_ID_DSD_MSBF_PLANAR, + AV_CODEC_ID_4GV, + AV_CODEC_ID_INTERPLAY_ACM, + AV_CODEC_ID_XMA1, + AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, + AV_CODEC_ID_ATRAC3AL, + AV_CODEC_ID_ATRAC3PAL, + AV_CODEC_ID_DOLBY_E, + + /* subtitle codecs */ + AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. + AV_CODEC_ID_DVD_SUBTITLE = 0x17000, + AV_CODEC_ID_DVB_SUBTITLE, + AV_CODEC_ID_TEXT, ///< raw UTF-8 text + AV_CODEC_ID_XSUB, + AV_CODEC_ID_SSA, + AV_CODEC_ID_MOV_TEXT, + AV_CODEC_ID_HDMV_PGS_SUBTITLE, + AV_CODEC_ID_DVB_TELETEXT, + AV_CODEC_ID_SRT, + + AV_CODEC_ID_MICRODVD = 0x17800, + AV_CODEC_ID_EIA_608, + AV_CODEC_ID_JACOSUB, + AV_CODEC_ID_SAMI, + AV_CODEC_ID_REALTEXT, + AV_CODEC_ID_STL, + AV_CODEC_ID_SUBVIEWER1, + AV_CODEC_ID_SUBVIEWER, + AV_CODEC_ID_SUBRIP, + AV_CODEC_ID_WEBVTT, + AV_CODEC_ID_MPL2, + AV_CODEC_ID_VPLAYER, + AV_CODEC_ID_PJS, + AV_CODEC_ID_ASS, + AV_CODEC_ID_HDMV_TEXT_SUBTITLE, + + /* other specific kind of codecs (generally used for attachments) */ + AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. + AV_CODEC_ID_TTF = 0x18000, + + AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. + AV_CODEC_ID_BINTEXT = 0x18800, + AV_CODEC_ID_XBIN, + AV_CODEC_ID_IDF, + AV_CODEC_ID_OTF, + AV_CODEC_ID_SMPTE_KLV, + AV_CODEC_ID_DVD_NAV, + AV_CODEC_ID_TIMED_ID3, + AV_CODEC_ID_BIN_DATA, + + + AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it + + AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS + * stream (only used by libavformat) */ + AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems + * stream (only used by libavformat) */ + AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. + AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket +}; + +/** + * This struct describes the properties of a single codec described by an + * AVCodecID. + * @see avcodec_descriptor_get() + */ +typedef struct AVCodecDescriptor { + enum AVCodecID id; + enum AVMediaType type; + /** + * Name of the codec described by this descriptor. It is non-empty and + * unique for each codec descriptor. It should contain alphanumeric + * characters and '_' only. + */ + const char *name; + /** + * A more descriptive name for this codec. May be NULL. + */ + const char *long_name; + /** + * Codec properties, a combination of AV_CODEC_PROP_* flags. + */ + int props; + /** + * MIME type(s) associated with the codec. + * May be NULL; if not, a NULL-terminated array of MIME types. + * The first item is always non-NULL and is the preferred MIME type. + */ + const char *const *mime_types; + /** + * If non-NULL, an array of profiles recognized for this codec. + * Terminated with FF_PROFILE_UNKNOWN. + */ + const struct AVProfile *profiles; +} AVCodecDescriptor; + +/** + * Codec uses only intra compression. + * Video and audio codecs only. + */ +#define AV_CODEC_PROP_INTRA_ONLY (1 << 0) +/** + * Codec supports lossy compression. Audio and video codecs only. + * @note a codec may support both lossy and lossless + * compression modes + */ +#define AV_CODEC_PROP_LOSSY (1 << 1) +/** + * Codec supports lossless compression. Audio and video codecs only. + */ +#define AV_CODEC_PROP_LOSSLESS (1 << 2) +/** + * Codec supports frame reordering. That is, the coded order (the order in which + * the encoded packets are output by the encoders / stored / input to the + * decoders) may be different from the presentation order of the corresponding + * frames. + * + * For codecs that do not have this property set, PTS and DTS should always be + * equal. + */ +#define AV_CODEC_PROP_REORDER (1 << 3) +/** + * Subtitle codec is bitmap based + * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. + */ +#define AV_CODEC_PROP_BITMAP_SUB (1 << 16) +/** + * Subtitle codec is text based. + * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field. + */ +#define AV_CODEC_PROP_TEXT_SUB (1 << 17) + +/** + * @ingroup lavc_decoding + * Required number of additionally allocated bytes at the end of the input bitstream for decoding. + * This is mainly needed because some optimized bitstream readers read + * 32 or 64 bit at once and could read over the end.
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged + * MPEG bitstreams could cause overread and segfault. + */ +#define AV_INPUT_BUFFER_PADDING_SIZE 32 + +/** + * @ingroup lavc_encoding + * minimum encoding buffer size + * Used to avoid some checks during header writing. + */ +#define AV_INPUT_BUFFER_MIN_SIZE 16384 + +#if FF_API_WITHOUT_PREFIX +/** + * @deprecated use AV_INPUT_BUFFER_PADDING_SIZE instead + */ +#define FF_INPUT_BUFFER_PADDING_SIZE 32 + +/** + * @deprecated use AV_INPUT_BUFFER_MIN_SIZE instead + */ +#define FF_MIN_BUFFER_SIZE 16384 +#endif /* FF_API_WITHOUT_PREFIX */ + +/** + * @ingroup lavc_encoding + * motion estimation type. + * @deprecated use codec private option instead + */ +#if FF_API_MOTION_EST +enum Motion_Est_ID { + ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed + ME_FULL, + ME_LOG, + ME_PHODS, + ME_EPZS, ///< enhanced predictive zonal search + ME_X1, ///< reserved for experiments + ME_HEX, ///< hexagon based search + ME_UMH, ///< uneven multi-hexagon search + ME_TESA, ///< transformed exhaustive search algorithm + ME_ITER=50, ///< iterative search +}; +#endif + +/** + * @ingroup lavc_decoding + */ +enum AVDiscard{ + /* We leave some space between them for extensions (drop some + * keyframes for intra-only or drop just some bidir frames). */ + AVDISCARD_NONE =-16, ///< discard nothing + AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi + AVDISCARD_NONREF = 8, ///< discard all non reference + AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames + AVDISCARD_NONINTRA= 24, ///< discard all non intra frames + AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes + AVDISCARD_ALL = 48, ///< discard all +}; + +enum AVAudioServiceType { + AV_AUDIO_SERVICE_TYPE_MAIN = 0, + AV_AUDIO_SERVICE_TYPE_EFFECTS = 1, + AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2, + AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3, + AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4, + AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5, + AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6, + AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7, + AV_AUDIO_SERVICE_TYPE_KARAOKE = 8, + AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI +}; + +/** + * @ingroup lavc_encoding + */ +typedef struct RcOverride{ + int start_frame; + int end_frame; + int qscale; // If this is 0 then quality_factor will be used instead. + float quality_factor; +} RcOverride; + +#if FF_API_MAX_BFRAMES +/** + * @deprecated there is no libavcodec-wide limit on the number of B-frames + */ +#define FF_MAX_B_FRAMES 16 +#endif + +/* encoding support + These flags can be passed in AVCodecContext.flags before initialization. + Note: Not everything is supported yet. +*/ + +/** + * Allow decoders to produce frames with data planes that are not aligned + * to CPU requirements (e.g. due to cropping). + */ +#define AV_CODEC_FLAG_UNALIGNED (1 << 0) +/** + * Use fixed qscale. + */ +#define AV_CODEC_FLAG_QSCALE (1 << 1) +/** + * 4 MV per MB allowed / advanced prediction for H.263. + */ +#define AV_CODEC_FLAG_4MV (1 << 2) +/** + * Output even those frames that might be corrupted. + */ +#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3) +/** + * Use qpel MC. + */ +#define AV_CODEC_FLAG_QPEL (1 << 4) +/** + * Use internal 2pass ratecontrol in first pass mode. + */ +#define AV_CODEC_FLAG_PASS1 (1 << 9) +/** + * Use internal 2pass ratecontrol in second pass mode. + */ +#define AV_CODEC_FLAG_PASS2 (1 << 10) +/** + * loop filter. + */ +#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11) +/** + * Only decode/encode grayscale. + */ +#define AV_CODEC_FLAG_GRAY (1 << 13) +/** + * error[?] variables will be set during encoding. + */ +#define AV_CODEC_FLAG_PSNR (1 << 15) +/** + * Input bitstream might be truncated at a random location + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG_TRUNCATED (1 << 16) +/** + * Use interlaced DCT. + */ +#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18) +/** + * Force low delay. + */ +#define AV_CODEC_FLAG_LOW_DELAY (1 << 19) +/** + * Place global headers in extradata instead of every keyframe. + */ +#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) +/** + * Use only bitexact stuff (except (I)DCT). + */ +#define AV_CODEC_FLAG_BITEXACT (1 << 23) +/* Fx : Flag for H.263+ extra options */ +/** + * H.263 advanced intra coding / MPEG-4 AC prediction + */ +#define AV_CODEC_FLAG_AC_PRED (1 << 24) +/** + * interlaced motion estimation + */ +#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) +#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) + +/** + * Allow non spec compliant speedup tricks. + */ +#define AV_CODEC_FLAG2_FAST (1 << 0) +/** + * Skip bitstream encoding. + */ +#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2) +/** + * Place global headers at every keyframe instead of in extradata. + */ +#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3) + +/** + * timecode is in drop frame format. DEPRECATED!!!! + */ +#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13) + +/** + * Input bitstream might be truncated at a packet boundaries + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG2_CHUNKS (1 << 15) +/** + * Discard cropping information from SPS. + */ +#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16) + +/** + * Show all frames before the first keyframe + */ +#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) +/** + * Export motion vectors through frame side data + */ +#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) +/** + * Do not skip samples and export skip information as frame side data + */ +#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) +/** + * Do not reset ASS ReadOrder field on flush (subtitles decoding) + */ +#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +/** + * Decoder can use draw_horiz_band callback. + */ +#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0) +/** + * Codec uses get_buffer() for allocating buffers and supports custom allocators. + * If not set, it might not use get_buffer() at all or use operations that + * assume the buffer was allocated by avcodec_default_get_buffer. + */ +#define AV_CODEC_CAP_DR1 (1 << 1) +#define AV_CODEC_CAP_TRUNCATED (1 << 3) +/** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + */ +#define AV_CODEC_CAP_DELAY (1 << 5) +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) + +#if FF_API_CAP_VDPAU +/** + * Codec can export data for HW decoding (VDPAU). + */ +#define AV_CODEC_CAP_HWACCEL_VDPAU (1 << 7) +#endif + +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carrying such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define AV_CODEC_CAP_SUBFRAMES (1 << 8) +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9) +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10) +/** + * Codec supports frame-level multithreading. + */ +#define AV_CODEC_CAP_FRAME_THREADS (1 << 12) +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define AV_CODEC_CAP_SLICE_THREADS (1 << 13) +/** + * Codec supports changed parameters at any point. + */ +#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14) +/** + * Codec supports avctx->thread_count == 0 (auto). + */ +#define AV_CODEC_CAP_AUTO_THREADS (1 << 15) +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) +/** + * Decoder is not a preferred choice for probing. + * This indicates that the decoder is not a good choice for probing. + * It could for example be an expensive to spin up hardware decoder, + * or it could simply not provide a lot of useful information about + * the stream. + * A decoder marked with this flag should only be used as last resort + * choice for probing. + */ +#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) +/** + * Codec is intra only. + */ +#define AV_CODEC_CAP_INTRA_ONLY 0x40000000 +/** + * Codec is lossless. + */ +#define AV_CODEC_CAP_LOSSLESS 0x80000000 + + +#if FF_API_WITHOUT_PREFIX +/** + * Allow decoders to produce frames with data planes that are not aligned + * to CPU requirements (e.g. due to cropping). + */ +#define CODEC_FLAG_UNALIGNED AV_CODEC_FLAG_UNALIGNED +#define CODEC_FLAG_QSCALE AV_CODEC_FLAG_QSCALE +#define CODEC_FLAG_4MV AV_CODEC_FLAG_4MV +#define CODEC_FLAG_OUTPUT_CORRUPT AV_CODEC_FLAG_OUTPUT_CORRUPT +#define CODEC_FLAG_QPEL AV_CODEC_FLAG_QPEL +#if FF_API_GMC +/** + * @deprecated use the "gmc" private option of the libxvid encoder + */ +#define CODEC_FLAG_GMC 0x0020 ///< Use GMC. +#endif +#if FF_API_MV0 +/** + * @deprecated use the flag "mv0" in the "mpv_flags" private option of the + * mpegvideo encoders + */ +#define CODEC_FLAG_MV0 0x0040 +#endif +#if FF_API_INPUT_PRESERVED +/** + * @deprecated passing reference-counted frames to the encoders replaces this + * flag + */ +#define CODEC_FLAG_INPUT_PRESERVED 0x0100 +#endif +#define CODEC_FLAG_PASS1 AV_CODEC_FLAG_PASS1 +#define CODEC_FLAG_PASS2 AV_CODEC_FLAG_PASS2 +#define CODEC_FLAG_GRAY AV_CODEC_FLAG_GRAY +#if FF_API_EMU_EDGE +/** + * @deprecated edges are not used/required anymore. I.e. this flag is now always + * set. + */ +#define CODEC_FLAG_EMU_EDGE 0x4000 +#endif +#define CODEC_FLAG_PSNR AV_CODEC_FLAG_PSNR +#define CODEC_FLAG_TRUNCATED AV_CODEC_FLAG_TRUNCATED + +#if FF_API_NORMALIZE_AQP +/** + * @deprecated use the flag "naq" in the "mpv_flags" private option of the + * mpegvideo encoders + */ +#define CODEC_FLAG_NORMALIZE_AQP 0x00020000 +#endif +#define CODEC_FLAG_INTERLACED_DCT AV_CODEC_FLAG_INTERLACED_DCT +#define CODEC_FLAG_LOW_DELAY AV_CODEC_FLAG_LOW_DELAY +#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER +#define CODEC_FLAG_BITEXACT AV_CODEC_FLAG_BITEXACT +#define CODEC_FLAG_AC_PRED AV_CODEC_FLAG_AC_PRED +#define CODEC_FLAG_LOOP_FILTER AV_CODEC_FLAG_LOOP_FILTER +#define CODEC_FLAG_INTERLACED_ME AV_CODEC_FLAG_INTERLACED_ME +#define CODEC_FLAG_CLOSED_GOP AV_CODEC_FLAG_CLOSED_GOP +#define CODEC_FLAG2_FAST AV_CODEC_FLAG2_FAST +#define CODEC_FLAG2_NO_OUTPUT AV_CODEC_FLAG2_NO_OUTPUT +#define CODEC_FLAG2_LOCAL_HEADER AV_CODEC_FLAG2_LOCAL_HEADER +#define CODEC_FLAG2_DROP_FRAME_TIMECODE AV_CODEC_FLAG2_DROP_FRAME_TIMECODE +#define CODEC_FLAG2_IGNORE_CROP AV_CODEC_FLAG2_IGNORE_CROP + +#define CODEC_FLAG2_CHUNKS AV_CODEC_FLAG2_CHUNKS +#define CODEC_FLAG2_SHOW_ALL AV_CODEC_FLAG2_SHOW_ALL +#define CODEC_FLAG2_EXPORT_MVS AV_CODEC_FLAG2_EXPORT_MVS +#define CODEC_FLAG2_SKIP_MANUAL AV_CODEC_FLAG2_SKIP_MANUAL + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +#define CODEC_CAP_DRAW_HORIZ_BAND AV_CODEC_CAP_DRAW_HORIZ_BAND ///< Decoder can use draw_horiz_band callback. +/** + * Codec uses get_buffer() for allocating buffers and supports custom allocators. + * If not set, it might not use get_buffer() at all or use operations that + * assume the buffer was allocated by avcodec_default_get_buffer. + */ +#define CODEC_CAP_DR1 AV_CODEC_CAP_DR1 +#define CODEC_CAP_TRUNCATED AV_CODEC_CAP_TRUNCATED +#if FF_API_XVMC +/* Codec can export data for HW decoding. This flag indicates that + * the codec would call get_format() with list that might contain HW accelerated + * pixel formats (XvMC, VDPAU, VAAPI, etc). The application can pick any of them + * including raw image format. + * The application can use the passed context to determine bitstream version, + * chroma format, resolution etc. + */ +#define CODEC_CAP_HWACCEL 0x0010 +#endif /* FF_API_XVMC */ +/** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + */ +#define CODEC_CAP_DELAY AV_CODEC_CAP_DELAY +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define CODEC_CAP_SMALL_LAST_FRAME AV_CODEC_CAP_SMALL_LAST_FRAME +#if FF_API_CAP_VDPAU +/** + * Codec can export data for HW decoding (VDPAU). + */ +#define CODEC_CAP_HWACCEL_VDPAU AV_CODEC_CAP_HWACCEL_VDPAU +#endif +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carrying such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define CODEC_CAP_SUBFRAMES AV_CODEC_CAP_SUBFRAMES +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define CODEC_CAP_EXPERIMENTAL AV_CODEC_CAP_EXPERIMENTAL +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define CODEC_CAP_CHANNEL_CONF AV_CODEC_CAP_CHANNEL_CONF +#if FF_API_NEG_LINESIZES +/** + * @deprecated no codecs use this capability + */ +#define CODEC_CAP_NEG_LINESIZES 0x0800 +#endif +/** + * Codec supports frame-level multithreading. + */ +#define CODEC_CAP_FRAME_THREADS AV_CODEC_CAP_FRAME_THREADS +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define CODEC_CAP_SLICE_THREADS AV_CODEC_CAP_SLICE_THREADS +/** + * Codec supports changed parameters at any point. + */ +#define CODEC_CAP_PARAM_CHANGE AV_CODEC_CAP_PARAM_CHANGE +/** + * Codec supports avctx->thread_count == 0 (auto). + */ +#define CODEC_CAP_AUTO_THREADS AV_CODEC_CAP_AUTO_THREADS +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define CODEC_CAP_VARIABLE_FRAME_SIZE AV_CODEC_CAP_VARIABLE_FRAME_SIZE +/** + * Codec is intra only. + */ +#define CODEC_CAP_INTRA_ONLY AV_CODEC_CAP_INTRA_ONLY +/** + * Codec is lossless. + */ +#define CODEC_CAP_LOSSLESS AV_CODEC_CAP_LOSSLESS + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 +#endif /* FF_API_WITHOUT_PREFIX */ + +#if FF_API_MB_TYPE +//The following defines may change, don't expect compatibility if you use them. +#define MB_TYPE_INTRA4x4 0x0001 +#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific +#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific +#define MB_TYPE_16x16 0x0008 +#define MB_TYPE_16x8 0x0010 +#define MB_TYPE_8x16 0x0020 +#define MB_TYPE_8x8 0x0040 +#define MB_TYPE_INTERLACED 0x0080 +#define MB_TYPE_DIRECT2 0x0100 //FIXME +#define MB_TYPE_ACPRED 0x0200 +#define MB_TYPE_GMC 0x0400 +#define MB_TYPE_SKIP 0x0800 +#define MB_TYPE_P0L0 0x1000 +#define MB_TYPE_P1L0 0x2000 +#define MB_TYPE_P0L1 0x4000 +#define MB_TYPE_P1L1 0x8000 +#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0) +#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1) +#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1) +#define MB_TYPE_QUANT 0x00010000 +#define MB_TYPE_CBP 0x00020000 +// Note bits 24-31 are reserved for codec specific use (H.264 ref0, MPEG-1 0mv, ...) +#endif + +/** + * Pan Scan area. + * This specifies the area which should be displayed. + * Note there may be multiple such areas for one frame. + */ +typedef struct AVPanScan{ + /** + * id + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int id; + + /** + * width and height in 1/16 pel + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int width; + int height; + + /** + * position of the top left corner in 1/16 pel for up to 3 fields/frames + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int16_t position[3][2]; +}AVPanScan; + +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int max_bitrate; + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int min_bitrate; + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int avg_bitrate; + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; + +#if FF_API_QSCALE_TYPE +#define FF_QSCALE_TYPE_MPEG1 0 +#define FF_QSCALE_TYPE_MPEG2 1 +#define FF_QSCALE_TYPE_H264 2 +#define FF_QSCALE_TYPE_VP56 3 +#endif + +/** + * The decoder will keep a reference to the frame and may reuse it later. + */ +#define AV_GET_BUFFER_FLAG_REF (1 << 0) + +/** + * @defgroup lavc_packet AVPacket + * + * Types and functions for working with AVPacket. + * @{ + */ +enum AVPacketSideDataType { + /** + * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE + * bytes worth of palette. This side data signals that a new palette is + * present. + */ + AV_PKT_DATA_PALETTE, + + /** + * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format + * that the extradata buffer was changed and the receiving side should + * act upon it appropriately. The new extradata is embedded in the side + * data buffer and should be immediately used for processing the current + * frame or packet. + */ + AV_PKT_DATA_NEW_EXTRADATA, + + /** + * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: + * @code + * u32le param_flags + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) + * s32le channel_count + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) + * u64le channel_layout + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) + * s32le sample_rate + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) + * s32le width + * s32le height + * @endcode + */ + AV_PKT_DATA_PARAM_CHANGE, + + /** + * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of + * structures with info about macroblocks relevant to splitting the + * packet into smaller packets on macroblock edges (e.g. as for RFC 2190). + * That is, it does not necessarily contain info about all macroblocks, + * as long as the distance between macroblocks in the info is smaller + * than the target payload size. + * Each MB info structure is 12 bytes, and is laid out as follows: + * @code + * u32le bit offset from the start of the packet + * u8 current quantizer at the start of the macroblock + * u8 GOB number + * u16le macroblock address within the GOB + * u8 horizontal MV predictor + * u8 vertical MV predictor + * u8 horizontal MV predictor for block number 3 + * u8 vertical MV predictor for block number 3 + * @endcode + */ + AV_PKT_DATA_H263_MB_INFO, + + /** + * This side data should be associated with an audio stream and contains + * ReplayGain information in form of the AVReplayGain struct. + */ + AV_PKT_DATA_REPLAYGAIN, + + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the decoded video frames for + * correct presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_PKT_DATA_DISPLAYMATRIX, + + /** + * This side data should be associated with a video stream and contains + * Stereoscopic 3D information in form of the AVStereo3D struct. + */ + AV_PKT_DATA_STEREO3D, + + /** + * This side data should be associated with an audio stream and corresponds + * to enum AVAudioServiceType. + */ + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + + /** + * This side data contains quality related information from the encoder. + * @code + * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). + * u8 picture type + * u8 error count + * u16 reserved + * u64le[error count] sum of squared differences between encoder in and output + * @endcode + */ + AV_PKT_DATA_QUALITY_STATS, + + /** + * This side data contains an integer value representing the stream index + * of a "fallback" track. A fallback track indicates an alternate + * track to use when the current track can not be decoded for some reason. + * e.g. no decoder available for codec. + */ + AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, + + /** + * Recommmends skipping the specified number of samples + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_PKT_DATA_SKIP_SAMPLES=70, + + /** + * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that + * the packet may contain "dual mono" audio specific to Japanese DTV + * and if it is true, recommends only the selected channel to be used. + * @code + * u8 selected channels (0=mail/left, 1=sub/right, 2=both) + * @endcode + */ + AV_PKT_DATA_JP_DUALMONO, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. + */ + AV_PKT_DATA_STRINGS_METADATA, + + /** + * Subtitle event position + * @code + * u32le x1 + * u32le y1 + * u32le x2 + * u32le y2 + * @endcode + */ + AV_PKT_DATA_SUBTITLE_POSITION, + + /** + * Data found in BlockAdditional element of matroska container. There is + * no end marker for the data, so it is required to rely on the side data + * size to recognize the end. 8 byte id (as found in BlockAddId) followed + * by data. + */ + AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, + + /** + * The optional first identifier line of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_IDENTIFIER, + + /** + * The optional settings (rendering instructions) that immediately + * follow the timestamp specifier of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_SETTINGS, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. This + * side data includes updated metadata which appeared in the stream. + */ + AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID, this is required to pass the stream ID + * information from the demuxer to the corresponding muxer. + */ + AV_PKT_DATA_MPEGTS_STREAM_ID, + + /** + * Mastering display metadata (based on SMPTE-2086:2014). This metadata + * should be associated with a video stream and contains data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This metadata should be + * associated with a video stream and contains data in the form of the + * AVContentLightMetadata struct. + */ + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + + /** + * ATSC A53 Part 4 Closed Captions. This metadata should be associated with + * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. + * The number of bytes of CC data is AVPacketSideData.size. + */ + AV_PKT_DATA_A53_CC, + + /** + * The number of side data elements (in fact a bit more than it). + * This is not part of the public API/ABI in the sense that it may + * change when new side data types are added. + * This must stay the last enum value. + * If its value becomes huge, some code using it + * needs to be updated as it assumes it to be smaller than other limits. + */ + AV_PKT_DATA_NB +}; + +#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED + +typedef struct AVPacketSideData { + uint8_t *data; + int size; + enum AVPacketSideDataType type; +} AVPacketSideData; + +/** + * This structure stores compressed data. It is typically exported by demuxers + * and then passed as input to decoders, or received as output from encoders and + * then passed to muxers. + * + * For video, it should typically contain one compressed frame. For audio it may + * contain several compressed frames. Encoders are allowed to output empty + * packets, with no compressed data, containing only side data + * (e.g. to update some stream parameters at the end of encoding). + * + * AVPacket is one of the few structs in FFmpeg, whose size is a part of public + * ABI. Thus it may be allocated on stack and no new fields can be added to it + * without libavcodec and libavformat major bump. + * + * The semantics of data ownership depends on the buf field. + * If it is set, the packet data is dynamically allocated and is + * valid indefinitely until a call to av_packet_unref() reduces the + * reference count to 0. + * + * If the buf field is not set av_packet_ref() would make a copy instead + * of increasing the reference count. + * + * The side data is always allocated with av_malloc(), copied by + * av_packet_ref() and freed by av_packet_unref(). + * + * @see av_packet_ref + * @see av_packet_unref + */ +typedef struct AVPacket { + /** + * A reference to the reference-counted buffer where the packet data is + * stored. + * May be NULL, then the packet data is not reference-counted. + */ + AVBufferRef *buf; + /** + * Presentation timestamp in AVStream->time_base units; the time at which + * the decompressed packet will be presented to the user. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + * pts MUST be larger or equal to dts as presentation cannot happen before + * decompression, unless one wants to view hex dumps. Some formats misuse + * the terms dts and pts/cts to mean something different. Such timestamps + * must be converted to true pts/dts before they are stored in AVPacket. + */ + int64_t pts; + /** + * Decompression timestamp in AVStream->time_base units; the time at which + * the packet is decompressed. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + */ + int64_t dts; + uint8_t *data; + int size; + int stream_index; + /** + * A combination of AV_PKT_FLAG values + */ + int flags; + /** + * Additional packet data that can be provided by the container. + * Packet can contain several types of side information. + */ + AVPacketSideData *side_data; + int side_data_elems; + + /** + * Duration of this packet in AVStream->time_base units, 0 if unknown. + * Equals next_pts - this_pts in presentation order. + */ + int64_t duration; + + int64_t pos; ///< byte position in stream, -1 if unknown + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated Same as the duration field, but as int64_t. This was required + * for Matroska subtitles, whose duration values could overflow when the + * duration field was still an int. + */ + attribute_deprecated + int64_t convergence_duration; +#endif +} AVPacket; +#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe +#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * Flag is used to discard packets which are required to maintain valid + * decoder state but are not required for output and should be dropped + * after decoding. + **/ +#define AV_PKT_FLAG_DISCARD 0x0004 +/** + * The packet comes from a trusted source. + * + * Otherwise-unsafe constructs such as arbitrary pointers to data + * outside the packet may be followed. + */ +#define AV_PKT_FLAG_TRUSTED 0x0008 + +enum AVSideDataParamChangeFlags { + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, + AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, + AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, +}; +/** + * @} + */ + +struct AVCodecInternal; + +enum AVFieldOrder { + AV_FIELD_UNKNOWN, + AV_FIELD_PROGRESSIVE, + AV_FIELD_TT, //< Top coded_first, top displayed first + AV_FIELD_BB, //< Bottom coded first, bottom displayed first + AV_FIELD_TB, //< Top coded first, bottom displayed first + AV_FIELD_BT, //< Bottom coded first, top displayed first +}; + +/** + * main external API structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * applications. + * The name string for AVOptions options matches the associated command line + * parameter name and can be found in libavcodec/options_table.h + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + * sizeof(AVCodecContext) must not be used outside libav*. + */ +typedef struct AVCodecContext { + /** + * information on struct for av_log + * - set by avcodec_alloc_context3 + */ + const AVClass *av_class; + int log_level_offset; + + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + const struct AVCodec *codec; +#if FF_API_CODEC_NAME + /** + * @deprecated this field is not used for anything in libavcodec + */ + attribute_deprecated + char codec_name[32]; +#endif + enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ + + /** + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * A demuxer should set this to what is stored in the field used to identify the codec. + * If there are multiple such fields in a container then the demuxer should choose the one + * which maximizes the information about the used codec. + * If the codec tag field in a container is larger than 32 bits then the demuxer should + * remap the longer ID to 32 bits with a table or other structure. Alternatively a new + * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated + * first. + * - encoding: Set by user, if not then the default based on codec_id will be used. + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int codec_tag; + +#if FF_API_STREAM_CODEC_TAG + /** + * @deprecated this field is unused + */ + attribute_deprecated + unsigned int stream_codec_tag; +#endif + + void *priv_data; + + /** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + */ + struct AVCodecInternal *internal; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + + /** + * the average bitrate + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: Set by user, may be overwritten by libavcodec + * if this info is available in the stream + */ + int64_t bit_rate; + + /** + * number of bits the bitstream is allowed to diverge from the reference. + * the reference can be CBR (for CBR pass1) or VBR (for pass2) + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: unused + */ + int bit_rate_tolerance; + + /** + * Global quality for codecs which cannot change it per frame. + * This should be proportional to MPEG-1/2/4 qscale. + * - encoding: Set by user. + * - decoding: unused + */ + int global_quality; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + + /** + * AV_CODEC_FLAG_*. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags; + + /** + * AV_CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags2; + + /** + * some codecs need / can use extradata like Huffman tables. + * MJPEG: Huffman tables + * rv10: additional flags + * MPEG-4: global headers (they can be in the bitstream or here) + * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger + * than extradata_size to avoid problems if it is read with the bitstream reader. + * The bytewise contents of extradata must not depend on the architecture or CPU endianness. + * - encoding: Set/allocated/freed by libavcodec. + * - decoding: Set/allocated/freed by user. + */ + uint8_t *extradata; + int extradata_size; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identically 1. + * This often, but not always is the inverse of the frame rate or field rate + * for video. 1/time_base is not the average frame rate if the frame rate is not + * constant. + * + * Like containers, elementary streams also can store timestamps, 1/time_base + * is the unit in which these timestamps are specified. + * As example of such codec time base see ISO/IEC 14496-2:2001(E) + * vop_time_increment_resolution and fixed_vop_rate + * (fixed_vop_rate == 0 implies that it is different from the framerate) + * + * - encoding: MUST be set by user. + * - decoding: the use of this field for decoding is deprecated. + * Use framerate instead. + */ + AVRational time_base; + + /** + * For some codecs, the time base is closer to the field rate than the frame rate. + * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration + * if no telecine is used ... + * + * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. + */ + int ticks_per_frame; + + /** + * Codec delay. + * + * Encoding: Number of frames delay there will be from the encoder input to + * the decoder output. (we assume the decoder matches the spec) + * Decoding: Number of frames delay in addition to what a standard decoder + * as specified in the spec would produce. + * + * Video: + * Number of frames the decoded output will be delayed relative to the + * encoded input. + * + * Audio: + * For encoding, this field is unused (see initial_padding). + * + * For decoding, this is the number of samples the decoder needs to + * output before the decoder's output is valid. When seeking, you should + * start decoding this many samples prior to your desired seek point. + * + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int delay; + + + /* video only */ + /** + * picture width / height. + * + * @note Those fields may not match the values of the last + * AVFrame output by avcodec_decode_video2 due frame + * reordering. + * + * - encoding: MUST be set by user. + * - decoding: May be set by the user before opening the decoder if known e.g. + * from the container. Some decoders will require the dimensions + * to be set by the caller. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int width, height; + + /** + * Bitstream width / height, may be different from width/height e.g. when + * the decoded frame is cropped before being output or lowres is enabled. + * + * @note Those field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: unused + * - decoding: May be set by the user before opening the decoder if known + * e.g. from the container. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int coded_width, coded_height; + +#if FF_API_ASPECT_EXTENDED +#define FF_ASPECT_EXTENDED 15 +#endif + + /** + * the number of pictures in a group of pictures, or 0 for intra_only + * - encoding: Set by user. + * - decoding: unused + */ + int gop_size; + + /** + * Pixel format, see AV_PIX_FMT_xxx. + * May be set by the demuxer if known from headers. + * May be overridden by the decoder if it knows better. + * + * @note This field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: Set by user. + * - decoding: Set by user if known, overridden by libavcodec while + * parsing the data. + */ + enum AVPixelFormat pix_fmt; + +#if FF_API_MOTION_EST + /** + * This option does nothing + * @deprecated use codec private options instead + */ + attribute_deprecated int me_method; +#endif + + /** + * If non NULL, 'draw_horiz_band' is called by the libavcodec + * decoder to draw a horizontal band. It improves cache usage. Not + * all codecs can do that. You must check the codec capabilities + * beforehand. + * When multithreading is used, it may be called from multiple threads + * at the same time; threads might draw different parts of the same AVFrame, + * or multiple AVFrames, and there is no guarantee that slices will be drawn + * in order. + * The function is also used by hardware acceleration APIs. + * It is called at least once during frame decoding to pass + * the data needed for hardware render. + * In that mode instead of pixel data, AVFrame points to + * a structure specific to the acceleration API. The application + * reads the structure and can change some fields to indicate progress + * or mark state. + * - encoding: unused + * - decoding: Set by user. + * @param height the height of the slice + * @param y the y position of the slice + * @param type 1->top field, 2->bottom field, 3->frame + * @param offset offset into the AVFrame.data from which the slice should be read + */ + void (*draw_horiz_band)(struct AVCodecContext *s, + const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], + int y, int type, int height); + + /** + * callback to negotiate the pixelFormat + * @param fmt is the list of formats which are supported by the codec, + * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. + * The first is always the native one. + * @note The callback may be called again immediately if initialization for + * the selected (hardware-accelerated) pixel format failed. + * @warning Behavior is undefined if the callback returns a value not + * in the fmt list of formats. + * @return the chosen format + * - encoding: unused + * - decoding: Set by user, if not set the native format will be chosen. + */ + enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + + /** + * maximum number of B-frames between non-B-frames + * Note: The output will be delayed by max_b_frames+1 relative to the input. + * - encoding: Set by user. + * - decoding: unused + */ + int max_b_frames; + + /** + * qscale factor between IP and B-frames + * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_factor; + +#if FF_API_RC_STRATEGY + /** @deprecated use codec private option instead */ + attribute_deprecated int rc_strategy; +#define FF_RC_STRATEGY_XVID 1 +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_frame_strategy; +#endif + + /** + * qscale offset between IP and B-frames + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_offset; + + /** + * Size of the frame reordering buffer in the decoder. + * For MPEG-2 it is 1 IPB or 0 low delay IP. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int has_b_frames; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int mpeg_quant; +#endif + + /** + * qscale factor between P- and I-frames + * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_factor; + + /** + * qscale offset between P and I-frames + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_offset; + + /** + * luminance masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float lumi_masking; + + /** + * temporary complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float temporal_cplx_masking; + + /** + * spatial complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float spatial_cplx_masking; + + /** + * p block masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float p_masking; + + /** + * darkness masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float dark_masking; + + /** + * slice count + * - encoding: Set by libavcodec. + * - decoding: Set by user (or 0). + */ + int slice_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int prediction_method; +#define FF_PRED_LEFT 0 +#define FF_PRED_PLANE 1 +#define FF_PRED_MEDIAN 2 +#endif + + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + + /** + * sample aspect ratio (0 if unknown) + * That is the width of a pixel divided by the height of the pixel. + * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVRational sample_aspect_ratio; + + /** + * motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_cmp; + /** + * subpixel motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_sub_cmp; + /** + * macroblock comparison function (not supported yet) + * - encoding: Set by user. + * - decoding: unused + */ + int mb_cmp; + /** + * interlaced DCT comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int ildct_cmp; +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_MEDIAN_SAD 15 +#define FF_CMP_CHROMA 256 + + /** + * ME diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int dia_size; + + /** + * amount of previous MV predictors (2a+1 x 2a+1 square) + * - encoding: Set by user. + * - decoding: unused + */ + int last_predictor_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int pre_me; +#endif + + /** + * motion estimation prepass comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_pre_cmp; + + /** + * ME prepass diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int pre_dia_size; + + /** + * subpel ME quality + * - encoding: Set by user. + * - decoding: unused + */ + int me_subpel_quality; + +#if FF_API_AFD + /** + * DTG active format information (additional aspect ratio + * information only used in DVB MPEG-2 transport streams) + * 0 if not set. + * + * - encoding: unused + * - decoding: Set by decoder. + * @deprecated Deprecated in favor of AVSideData + */ + attribute_deprecated int dtg_active_format; +#define FF_DTG_AFD_SAME 8 +#define FF_DTG_AFD_4_3 9 +#define FF_DTG_AFD_16_9 10 +#define FF_DTG_AFD_14_9 11 +#define FF_DTG_AFD_4_3_SP_14_9 13 +#define FF_DTG_AFD_16_9_SP_14_9 14 +#define FF_DTG_AFD_SP_4_3 15 +#endif /* FF_API_AFD */ + + /** + * maximum motion estimation search range in subpel units + * If 0 then no limit. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_range; + +#if FF_API_QUANT_BIAS + /** + * @deprecated use encoder private option instead + */ + attribute_deprecated int intra_quant_bias; +#define FF_DEFAULT_QUANT_BIAS 999999 + + /** + * @deprecated use encoder private option instead + */ + attribute_deprecated int inter_quant_bias; +#endif + + /** + * slice flags + * - encoding: unused + * - decoding: Set by user. + */ + int slice_flags; +#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) +#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) + +#if FF_API_XVMC + /** + * XVideo Motion Acceleration + * - encoding: forbidden + * - decoding: set by decoder + * @deprecated XvMC doesn't need it anymore. + */ + attribute_deprecated int xvmc_acceleration; +#endif /* FF_API_XVMC */ + + /** + * macroblock decision mode + * - encoding: Set by user. + * - decoding: unused + */ + int mb_decision; +#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp +#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits +#define FF_MB_DECISION_RD 2 ///< rate distortion + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: Set by libavcodec. + */ + uint16_t *intra_matrix; + + /** + * custom inter quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: Set by libavcodec. + */ + uint16_t *inter_matrix; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int scenechange_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int noise_reduction; +#endif + +#if FF_API_MPV_OPT + /** + * @deprecated this field is unused + */ + attribute_deprecated + int me_threshold; + + /** + * @deprecated this field is unused + */ + attribute_deprecated + int mb_threshold; +#endif + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: Set by libavcodec + */ + int intra_dc_precision; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + float border_masking; +#endif + + /** + * minimum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + +#if FF_API_PRIVATE_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int me_penalty_compensation; +#endif + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int brd_scale; +#endif + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int chromaoffset; +#endif + +#if FF_API_UNUSED_MEMBERS + /** + * Multiplied by qscale for each frame and added to scene_change_score. + * - encoding: Set by user. + * - decoding: unused + */ + attribute_deprecated int scenechange_factor; +#endif + + /** + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + int mv0_threshold; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_sensitivity; +#endif + + /** + * Chromaticity coordinates of the source primaries. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorPrimaries color_primaries; + + /** + * Color Transfer Characteristic. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by user. + */ + enum AVFieldOrder field_order; + + /* audio only */ + int sample_rate; ///< samples per second + int channels; ///< number of audio channels + + /** + * audio sample format + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< sample format + + /* The following data should not be initialized. */ + /** + * Number of samples per channel in an audio frame. + * + * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame + * except the last must contain exactly frame_size samples per channel. + * May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the + * frame size is not restricted. + * - decoding: may be set by some decoders to indicate constant frame size + */ + int frame_size; + + /** + * Frame counter, set by libavcodec. + * + * - decoding: total number of frames returned from the decoder so far. + * - encoding: total number of frames passed to the encoder so far. + * + * @note the counter is not incremented if encoding/decoding resulted in + * an error. + */ + int frame_number; + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + + /** + * Audio channel layout. + * - encoding: set by user. + * - decoding: set by user, may be overwritten by libavcodec. + */ + uint64_t channel_layout; + + /** + * Request decoder to use this channel layout if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + */ + uint64_t request_channel_layout; + + /** + * Type of service that the audio stream conveys. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVAudioServiceType audio_service_type; + + /** + * desired sample format + * - encoding: Not used. + * - decoding: Set by user. + * Decoder will decode to this format if it can. + */ + enum AVSampleFormat request_sample_fmt; + + /** + * This callback is called at the beginning of each frame to get data + * buffer(s) for it. There may be one contiguous buffer for all the data or + * there may be a buffer per each data plane or anything in between. What + * this means is, you may set however many entries in buf[] you feel necessary. + * Each buffer must be reference-counted using the AVBuffer API (see description + * of buf[] below). + * + * The following fields will be set in the frame before this callback is + * called: + * - format + * - width, height (video only) + * - sample_rate, channel_layout, nb_samples (audio only) + * Their values may differ from the corresponding values in + * AVCodecContext. This callback must use the frame values, not the codec + * context values, to calculate the required buffer size. + * + * This callback must fill the following fields in the frame: + * - data[] + * - linesize[] + * - extended_data: + * * if the data is planar audio with more than 8 channels, then this + * callback must allocate and fill extended_data to contain all pointers + * to all data planes. data[] must hold as many pointers as it can. + * extended_data must be allocated with av_malloc() and will be freed in + * av_frame_unref(). + * * otherwise extended_data must point to data + * - buf[] must contain one or more pointers to AVBufferRef structures. Each of + * the frame's data and extended_data pointers must be contained in these. That + * is, one AVBufferRef for each allocated chunk of memory, not necessarily one + * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), + * and av_buffer_ref(). + * - extended_buf and nb_extended_buf must be allocated with av_malloc() by + * this callback and filled with the extra buffers if there are more + * buffers than buf[] can hold. extended_buf will be freed in + * av_frame_unref(). + * + * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call + * avcodec_default_get_buffer2() instead of providing buffers allocated by + * some other means. + * + * Each data plane must be aligned to the maximum required by the target + * CPU. + * + * @see avcodec_default_get_buffer2() + * + * Video: + * + * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused + * (read and/or written to if it is writable) later by libavcodec. + * + * avcodec_align_dimensions2() should be used to find the required width and + * height, as they normally need to be rounded up to the next multiple of 16. + * + * Some decoders do not support linesizes changing between frames. + * + * If frame multithreading is used and thread_safe_callbacks is set, + * this callback may be called from a different thread, but not from more + * than one at once. Does not need to be reentrant. + * + * @see avcodec_align_dimensions2() + * + * Audio: + * + * Decoders request a buffer of a particular size by setting + * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, + * however, utilize only part of the buffer by setting AVFrame.nb_samples + * to a smaller value in the output frame. + * + * As a convenience, av_samples_get_buffer_size() and + * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() + * functions to find the required data size and to fill data pointers and + * linesize. In AVFrame.linesize, only linesize[0] may be set for audio + * since all planes must be the same size. + * + * @see av_samples_get_buffer_size(), av_samples_fill_arrays() + * + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); + + /** + * If non-zero, the decoded audio and video frames returned from + * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted + * and are valid indefinitely. The caller must free them with + * av_frame_unref() when they are not needed anymore. + * Otherwise, the decoded frames must not be freed by the caller and are + * only valid until the next decode call. + * + * This is always automatically enabled if avcodec_receive_frame() is used. + * + * - encoding: unused + * - decoding: set by the caller before avcodec_open2(). + */ + attribute_deprecated + int refcounted_frames; + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + float rc_qsquish; + + attribute_deprecated + float rc_qmod_amp; + attribute_deprecated + int rc_qmod_freq; +#endif + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + int rc_override_count; + RcOverride *rc_override; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + const char *rc_eq; +#endif + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: Set by user, may be overwritten by libavcodec. + */ + int64_t rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int64_t rc_min_rate; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + float rc_buffer_aggressivity; + + attribute_deprecated + float rc_initial_cplx; +#endif + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + +#if FF_API_CODER_TYPE +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 +#define FF_CODER_TYPE_RAW 2 +#define FF_CODER_TYPE_RLE 3 +#if FF_API_UNUSED_MEMBERS +#define FF_CODER_TYPE_DEFLATE 4 +#endif /* FF_API_UNUSED_MEMBERS */ + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int coder_type; +#endif /* FF_API_CODER_TYPE */ + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int context_model; +#endif + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int lmin; + + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int lmax; +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_factor; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_exp; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_cmp; +#endif /* FF_API_PRIVATE_OPT */ + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int min_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int max_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int64_t timecode_frame_start; +#endif + +#if FF_API_RTP_CALLBACK + /** + * @deprecated unused + */ + /* The RTP callback: This function is called */ + /* every time the encoder has a packet to send. */ + /* It depends on the encoder if the data starts */ + /* with a Start Code (it should). H.263 does. */ + /* mb_nb contains the number of macroblocks */ + /* encoded in the RTP payload. */ + attribute_deprecated + void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int rtp_payload_size; /* The size of the RTP payload: the coder will */ + /* do its best to deliver a chunk with size */ + /* below rtp_payload_size, the chunk will start */ + /* with a start code on some codecs like H.263. */ + /* This doesn't take account of any particular */ + /* headers inside the transmitted RTP payload. */ +#endif + +#if FF_API_STAT_BITS + /* statistics, used for 2-pass encoding */ + attribute_deprecated + int mv_bits; + attribute_deprecated + int header_bits; + attribute_deprecated + int i_tex_bits; + attribute_deprecated + int p_tex_bits; + attribute_deprecated + int i_count; + attribute_deprecated + int p_count; + attribute_deprecated + int skip_count; + attribute_deprecated + int misc_bits; + + /** @deprecated this field is unused */ + attribute_deprecated + int frame_bits; +#endif + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + int workaround_bugs; +#define FF_BUG_AUTODETECT 1 ///< autodetection +#if FF_API_OLD_MSMPEG4 +#define FF_BUG_OLD_MSMPEG4 2 +#endif +#define FF_BUG_XVID_ILACE 4 +#define FF_BUG_UMP4 8 +#define FF_BUG_NO_PADDING 16 +#define FF_BUG_AMV 32 +#if FF_API_AC_VLC +#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default. +#endif +#define FF_BUG_QPEL_CHROMA 64 +#define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 +#define FF_BUG_HPEL_CHROMA 2048 +#define FF_BUG_DC_CLIP 4096 +#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. +#define FF_BUG_TRUNCATED 16384 +#define FF_BUG_IEDGE 32768 + + /** + * strictly follow the standard (MPEG-4, ...). + * - encoding: Set by user. + * - decoding: Set by user. + * Setting this to STRICT or higher means the encoder and decoder will + * generally do stupid things, whereas setting it to unofficial or lower + * will mean the encoder might produce output that is not supported by all + * spec-compliant decoders. Decoders don't differentiate between normal, + * unofficial and experimental (that is, they always try to decode things + * when they can) unless they are explicitly asked to behave stupidly + * (=strictly conform to the specs) + */ + int strict_std_compliance; +#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. +#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. +#define FF_COMPLIANCE_NORMAL 0 +#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions +#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + + /** + * error concealment flags + * - encoding: unused + * - decoding: Set by user. + */ + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 +#define FF_EC_FAVOR_INTER 256 + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug; +#define FF_DEBUG_PICT_INFO 1 +#define FF_DEBUG_RC 2 +#define FF_DEBUG_BITSTREAM 4 +#define FF_DEBUG_MB_TYPE 8 +#define FF_DEBUG_QP 16 +#if FF_API_DEBUG_MV +/** + * @deprecated this option does nothing + */ +#define FF_DEBUG_MV 32 +#endif +#define FF_DEBUG_DCT_COEFF 0x00000040 +#define FF_DEBUG_SKIP 0x00000080 +#define FF_DEBUG_STARTCODE 0x00000100 +#if FF_API_UNUSED_MEMBERS +#define FF_DEBUG_PTS 0x00000200 +#endif /* FF_API_UNUSED_MEMBERS */ +#define FF_DEBUG_ER 0x00000400 +#define FF_DEBUG_MMCO 0x00000800 +#define FF_DEBUG_BUGS 0x00001000 +#if FF_API_DEBUG_MV +#define FF_DEBUG_VIS_QP 0x00002000 +#define FF_DEBUG_VIS_MB_TYPE 0x00004000 +#endif +#define FF_DEBUG_BUFFERS 0x00008000 +#define FF_DEBUG_THREADS 0x00010000 +#define FF_DEBUG_GREEN_MD 0x00800000 +#define FF_DEBUG_NOMC 0x01000000 + +#if FF_API_DEBUG_MV + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 // visualize forward predicted MVs of P-frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 // visualize forward predicted MVs of B-frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames +#endif + + /** + * Error recognition; may misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + */ + int err_recognition; + +/** + * Verify checksums embedded in the bitstream (could be of either encoded or + * decoded data, depending on the codec) and print an error message on mismatch. + * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the + * decoder returning an error. + */ +#define AV_EF_CRCCHECK (1<<0) +#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations +#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length +#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection + +#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue +#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors +#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors +#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder should not do as an error + + + /** + * opaque 64-bit number (generally a PTS) that will be reordered and + * output in AVFrame.reordered_opaque + * - encoding: unused + * - decoding: Set by user. + */ + int64_t reordered_opaque; + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + struct AVHWAccel *hwaccel; + + /** + * Hardware accelerator context. + * For some hardware accelerators, a global context needs to be + * provided by the user. In that case, this holds display-dependent + * data FFmpeg cannot instantiate itself. Please refer to the + * FFmpeg HW accelerator documentation to know how to fill this + * is. e.g. for VA API, this is a struct vaapi_context. + * - encoding: unused + * - decoding: Set by user + */ + void *hwaccel_context; + + /** + * error + * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. + * - decoding: unused + */ + uint64_t error[AV_NUM_DATA_POINTERS]; + + /** + * DCT algorithm, see FF_DCT_* below + * - encoding: Set by user. + * - decoding: unused + */ + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 + + /** + * IDCT algorithm, see FF_IDCT_* below. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#if FF_API_ARCH_SH4 +#define FF_IDCT_SH4 9 +#endif +#define FF_IDCT_SIMPLEARM 10 +#if FF_API_UNUSED_MEMBERS +#define FF_IDCT_IPP 13 +#endif /* FF_API_UNUSED_MEMBERS */ +#define FF_IDCT_XVID 14 +#if FF_API_IDCT_XVIDMMX +#define FF_IDCT_XVIDMMX 14 +#endif /* FF_API_IDCT_XVIDMMX */ +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#if FF_API_ARCH_SPARC +#define FF_IDCT_SIMPLEVIS 18 +#endif +#define FF_IDCT_FAAN 20 +#define FF_IDCT_SIMPLENEON 22 +#if FF_API_ARCH_ALPHA +#define FF_IDCT_SIMPLEALPHA 23 +#endif +#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */ +#define FF_IDCT_SIMPLEAUTO 128 + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + +#if FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + +#if FF_API_CODED_FRAME + /** + * the picture in the bitstream + * - encoding: Set by libavcodec. + * - decoding: unused + * + * @deprecated use the quality factor packet side data instead + */ + attribute_deprecated AVFrame *coded_frame; +#endif + + /** + * thread count + * is used to decide how many independent tasks should be passed to execute() + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_count; + + /** + * Which multithreading methods to use. + * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, + * so clients which cannot provide future frames should not use it. + * + * - encoding: Set by user, otherwise the default is used. + * - decoding: Set by user, otherwise the default is used. + */ + int thread_type; +#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once +#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once + + /** + * Which multithreading methods are in use by the codec. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int active_thread_type; + + /** + * Set by the client if its custom get_buffer() callback can be called + * synchronously from another thread, which allows faster multithreaded decoding. + * draw_horiz_band() will be called from other threads regardless of this setting. + * Ignored if the default get_buffer() is used. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_safe_callbacks; + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * @param count the number of things to execute + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. + * @param c context passed also to func + * @param count the number of things to execute + * @param arg2 argument passed unchanged to func + * @param ret return values of executed functions, must have space for "count" values. May be NULL. + * @param func function that will be called count times, with jobnr from 0 to count-1. + * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no + * two instances of func executing at the same time will have the same threadnr. + * @return always 0 currently, but code should handle a future improvement where when any call to func + * returns < 0 no further calls to func may be done and < 0 is returned. + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + + /** + * noise vs. sse weight for the nsse comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int nsse_weight; + + /** + * profile + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int profile; +#define FF_PROFILE_UNKNOWN -99 +#define FF_PROFILE_RESERVED -100 + +#define FF_PROFILE_AAC_MAIN 0 +#define FF_PROFILE_AAC_LOW 1 +#define FF_PROFILE_AAC_SSR 2 +#define FF_PROFILE_AAC_LTP 3 +#define FF_PROFILE_AAC_HE 4 +#define FF_PROFILE_AAC_HE_V2 28 +#define FF_PROFILE_AAC_LD 22 +#define FF_PROFILE_AAC_ELD 38 +#define FF_PROFILE_MPEG2_AAC_LOW 128 +#define FF_PROFILE_MPEG2_AAC_HE 131 + +#define FF_PROFILE_DNXHD 0 +#define FF_PROFILE_DNXHR_LB 1 +#define FF_PROFILE_DNXHR_SQ 2 +#define FF_PROFILE_DNXHR_HQ 3 +#define FF_PROFILE_DNXHR_HQX 4 +#define FF_PROFILE_DNXHR_444 5 + +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 +#define FF_PROFILE_DTS_EXPRESS 70 + +#define FF_PROFILE_MPEG2_422 0 +#define FF_PROFILE_MPEG2_HIGH 1 +#define FF_PROFILE_MPEG2_SS 2 +#define FF_PROFILE_MPEG2_SNR_SCALABLE 3 +#define FF_PROFILE_MPEG2_MAIN 4 +#define FF_PROFILE_MPEG2_SIMPLE 5 + +#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag +#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag + +#define FF_PROFILE_H264_BASELINE 66 +#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED) +#define FF_PROFILE_H264_MAIN 77 +#define FF_PROFILE_H264_EXTENDED 88 +#define FF_PROFILE_H264_HIGH 100 +#define FF_PROFILE_H264_HIGH_10 110 +#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 +#define FF_PROFILE_H264_HIGH_422 122 +#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_STEREO_HIGH 128 +#define FF_PROFILE_H264_HIGH_444 144 +#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 +#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_CAVLC_444 44 + +#define FF_PROFILE_VC1_SIMPLE 0 +#define FF_PROFILE_VC1_MAIN 1 +#define FF_PROFILE_VC1_COMPLEX 2 +#define FF_PROFILE_VC1_ADVANCED 3 + +#define FF_PROFILE_MPEG4_SIMPLE 0 +#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1 +#define FF_PROFILE_MPEG4_CORE 2 +#define FF_PROFILE_MPEG4_MAIN 3 +#define FF_PROFILE_MPEG4_N_BIT 4 +#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5 +#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 +#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 +#define FF_PROFILE_MPEG4_HYBRID 8 +#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 +#define FF_PROFILE_MPEG4_CORE_SCALABLE 10 +#define FF_PROFILE_MPEG4_ADVANCED_CODING 11 +#define FF_PROFILE_MPEG4_ADVANCED_CORE 12 +#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 +#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 +#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 + +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 +#define FF_PROFILE_JPEG2000_DCINEMA_2K 3 +#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 + +#define FF_PROFILE_VP9_0 0 +#define FF_PROFILE_VP9_1 1 +#define FF_PROFILE_VP9_2 2 +#define FF_PROFILE_VP9_3 3 + +#define FF_PROFILE_HEVC_MAIN 1 +#define FF_PROFILE_HEVC_MAIN_10 2 +#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define FF_PROFILE_HEVC_REXT 4 + + /** + * level + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int level; +#define FF_LEVEL_UNKNOWN -99 + + /** + * Skip loop filtering for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_loop_filter; + + /** + * Skip IDCT/dequantization for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_idct; + + /** + * Skip decoding for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_frame; + + /** + * Header containing style information for text subtitles. + * For SUBTITLE_ASS subtitle type, it should contain the whole ASS + * [Script Info] and [V4+ Styles] section, plus the [Events] line and + * the Format line following. It shouldn't include any Dialogue line. + * - encoding: Set/allocated/freed by user (before avcodec_open2()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; + +#if FF_API_ERROR_RATE + /** + * @deprecated use the 'error_rate' private AVOption of the mpegvideo + * encoders + */ + attribute_deprecated + int error_rate; +#endif + +#if FF_API_VBV_DELAY + /** + * VBV delay coded in the last frame (in periods of a 27 MHz clock). + * Used for compliant TS muxing. + * - encoding: Set by libavcodec. + * - decoding: unused. + * @deprecated this value is now exported as a part of + * AV_PKT_DATA_CPB_PROPERTIES packet side data + */ + attribute_deprecated + uint64_t vbv_delay; +#endif + +#if FF_API_SIDEDATA_ONLY_PKT + /** + * Encoding only and set by default. Allow encoders to output packets + * that do not contain any encoded data, only side data. + * + * Some encoders need to output such packets, e.g. to update some stream + * parameters at the end of encoding. + * + * @deprecated this field disables the default behaviour and + * it is kept only for compatibility. + */ + attribute_deprecated + int side_data_only_packets; +#endif + + /** + * Audio only. The number of "priming" samples (padding) inserted by the + * encoder at the beginning of the audio. I.e. this number of leading + * decoded samples must be discarded by the caller to get the original audio + * without leading padding. + * + * - decoding: unused + * - encoding: Set by libavcodec. The timestamps on the output packets are + * adjusted by the encoder so that they always refer to the + * first sample of the data actually contained in the packet, + * including any added padding. E.g. if the timebase is + * 1/samplerate and the timestamp of the first input sample is + * 0, the timestamp of the first output packet will be + * -initial_padding. + */ + int initial_padding; + + /** + * - decoding: For codecs that store a framerate value in the compressed + * bitstream, the decoder may export it here. { 0, 1} when + * unknown. + * - encoding: May be used to signal the framerate of CFR content to an + * encoder. + */ + AVRational framerate; + + /** + * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. + * - encoding: unused. + * - decoding: Set by libavcodec before calling get_format() + */ + enum AVPixelFormat sw_pix_fmt; + + /** + * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. + * - encoding unused. + * - decoding set by user. + */ + AVRational pkt_timebase; + + /** + * AVCodecDescriptor + * - encoding: unused. + * - decoding: set by libavcodec. + */ + const AVCodecDescriptor *codec_descriptor; + +#if !FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + + /** + * Current statistics for PTS correction. + * - decoding: maintained and used by libavcodec, not intended to be used by user apps + * - encoding: unused + */ + int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far + int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far + int64_t pts_correction_last_pts; /// PTS of the last frame + int64_t pts_correction_last_dts; /// DTS of the last frame + + /** + * Character encoding of the input subtitles file. + * - decoding: set by user + * - encoding: unused + */ + char *sub_charenc; + + /** + * Subtitles character encoding mode. Formats or codecs might be adjusting + * this setting (if they are doing the conversion themselves for instance). + * - decoding: set by libavcodec + * - encoding: unused + */ + int sub_charenc_mode; +#define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) +#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself +#define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv + + /** + * Skip processing alpha if supported by codec. + * Note that if the format uses pre-multiplied alpha (common with VP6, + * and recommended due to better video quality/compression) + * the image will look as if alpha-blended onto a black background. + * However for formats that do not use pre-multiplied alpha + * there might be serious artefacts (though e.g. libswscale currently + * assumes pre-multiplied alpha anyway). + * + * - decoding: set by user + * - encoding: unused + */ + int skip_alpha; + + /** + * Number of samples to skip after a discontinuity + * - decoding: unused + * - encoding: set by libavcodec + */ + int seek_preroll; + +#if !FF_API_DEBUG_MV + /** + * debug motion vectors + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames +#endif + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: unused. + */ + uint16_t *chroma_intra_matrix; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - encoding: Set by user. + * - decoding: Set by user. + */ + uint8_t *dump_separator; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * Properties of the stream that gets decoded + * - encoding: unused + * - decoding: set by libavcodec + */ + unsigned properties; +#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 +#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 + + /** + * Additional data associated with the entire coded stream. + * + * - decoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). + */ + AVPacketSideData *coded_side_data; + int nb_coded_side_data; + + /** + * A reference to the AVHWFramesContext describing the input (for encoding) + * or output (decoding) frames. The reference is set by the caller and + * afterwards owned (and freed) by libavcodec - it should never be read by + * the caller after being set. + * + * - decoding: This field should be set by the caller from the get_format() + * callback. The previous reference (if any) will always be + * unreffed by libavcodec before the get_format() call. + * + * If the default get_buffer2() is used with a hwaccel pixel + * format, then this AVHWFramesContext will be used for + * allocating the frame buffers. + * + * - encoding: For hardware encoders configured to use a hwaccel pixel + * format, this field should be set by the caller to a reference + * to the AVHWFramesContext describing input frames. + * AVHWFramesContext.format must be equal to + * AVCodecContext.pix_fmt. + * + * This field should be set before avcodec_open2() is called. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Control the form of AVSubtitle.rects[N]->ass + * - decoding: set by user + * - encoding: unused + */ + int sub_text_format; +#define FF_SUB_TEXT_FMT_ASS 0 +#if FF_API_ASS_TIMING +#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1 +#endif + + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + * + * - decoding: unused + * - encoding: unused + */ + int trailing_padding; + + /** + * The number of pixels per image to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + int64_t max_pixels; + + /** + * A reference to the AVHWDeviceContext describing the device which will + * be used by a hardware encoder/decoder. The reference is set by the + * caller and afterwards owned (and freed) by libavcodec. + * + * This should be used if either the codec device does not require + * hardware frames or any that are used are to be allocated internally by + * libavcodec. If the user wishes to supply any of the frames used as + * encoder input or decoder output then hw_frames_ctx should be used + * instead. When hw_frames_ctx is set in get_format() for a decoder, this + * field will be ignored while decoding the associated stream segment, but + * may again be used on a following one after another get_format() call. + * + * For both encoders and decoders this field should be set before + * avcodec_open2() is called and must not be written to thereafter. + * + * Note that some decoders may require this field to be set initially in + * order to support hw_frames_ctx at all - in that case, all frames + * contexts used must be created on the same device. + */ + AVBufferRef *hw_device_ctx; + + /** + * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated + * decoding (if active). + * - encoding: unused + * - decoding: Set by user (either before avcodec_open2(), or in the + * AVCodecContext.get_format callback) + */ + int hwaccel_flags; + + /** + * Video decoding only. Certain video codecs support cropping, meaning that + * only a sub-rectangle of the decoded frame is intended for display. This + * option controls how cropping is handled by libavcodec. + * + * When set to 1 (the default), libavcodec will apply cropping internally. + * I.e. it will modify the output frame width/height fields and offset the + * data pointers (only by as much as possible while preserving alignment, or + * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that + * the frames output by the decoder refer only to the cropped area. The + * crop_* fields of the output frames will be zero. + * + * When set to 0, the width/height fields of the output frames will be set + * to the coded dimensions and the crop_* fields will describe the cropping + * rectangle. Applying the cropping is left to the caller. + * + * @warning When hardware acceleration with opaque output frames is used, + * libavcodec is unable to apply cropping from the top/left border. + * + * @note when this option is set to zero, the width/height fields of the + * AVCodecContext and output AVFrames have different meanings. The codec + * context fields store display dimensions (with the coded dimensions in + * coded_width/height), while the frame fields store the coded dimensions + * (with the display dimensions being determined by the crop_* fields). + */ + int apply_cropping; +} AVCodecContext; + +AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); +void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); + +const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); +void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); + +unsigned av_codec_get_codec_properties(const AVCodecContext *avctx); + +int av_codec_get_lowres(const AVCodecContext *avctx); +void av_codec_set_lowres(AVCodecContext *avctx, int val); + +int av_codec_get_seek_preroll(const AVCodecContext *avctx); +void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); + +uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx); +void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val); + +/** + * AVProfile. + */ +typedef struct AVProfile { + int profile; + const char *name; ///< short name for the profile +} AVProfile; + +typedef struct AVCodecDefault AVCodecDefault; + +struct AVSubtitle; + +/** + * AVCodec. + */ +typedef struct AVCodec { + /** + * Name of the codec implementation. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + * This is the primary way to find a codec from the user perspective. + */ + const char *name; + /** + * Descriptive name for the codec, meant to be more human readable than name. + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *long_name; + enum AVMediaType type; + enum AVCodecID id; + /** + * Codec capabilities. + * see AV_CODEC_CAP_* + */ + int capabilities; + const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} + const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 + const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 + const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 + const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder + const AVClass *priv_class; ///< AVClass for the private context + const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int priv_data_size; + struct AVCodec *next; + /** + * @name Frame-level threading support functions + * @{ + */ + /** + * If defined, called on thread contexts when they are created. + * If the codec allocates writable tables in init(), re-allocate them here. + * priv_data will be set to a copy of the original. + */ + int (*init_thread_copy)(AVCodecContext *); + /** + * Copy necessary context variables from a previous thread context to the current one. + * If not defined, the next thread will start automatically; otherwise, the codec + * must call ff_thread_finish_setup(). + * + * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. + */ + int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); + /** @} */ + + /** + * Private codec-specific defaults. + */ + const AVCodecDefault *defaults; + + /** + * Initialize codec static data, called from avcodec_register(). + */ + void (*init_static_data)(struct AVCodec *codec); + + int (*init)(AVCodecContext *); + int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, + const struct AVSubtitle *sub); + /** + * Encode data to an AVPacket. + * + * @param avctx codec context + * @param avpkt output AVPacket (may contain a user-provided buffer) + * @param[in] frame AVFrame containing the raw data to be encoded + * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a + * non-empty packet was returned in avpkt. + * @return 0 on success, negative error code on failure + */ + int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, + int *got_packet_ptr); + int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); + int (*close)(AVCodecContext *); + /** + * Encode API with decoupled packet/frame dataflow. The API is the + * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except + * that: + * - never called if the codec is closed or the wrong type, + * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent, + * - only one drain frame is ever passed down, + */ + int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); + int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); + + /** + * Decode API with decoupled packet/frame dataflow. This function is called + * to get one output frame. It should call ff_decode_get_packet() to obtain + * input data. + */ + int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); + /** + * Flush buffers. + * Will be called when seeking + */ + void (*flush)(AVCodecContext *); + /** + * Internal codec capabilities. + * See FF_CODEC_CAP_* in internal.h + */ + int caps_internal; + + /** + * Decoding only, a comma-separated list of bitstream filters to apply to + * packets before decoding. + */ + const char *bsfs; +} AVCodec; + +int av_codec_get_max_lowres(const AVCodec *codec); + +struct MpegEncContext; + +/** + * @defgroup lavc_hwaccel AVHWAccel + * @{ + */ +typedef struct AVHWAccel { + /** + * Name of the hardware accelerated codec. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + */ + const char *name; + + /** + * Type of codec implemented by the hardware accelerator. + * + * See AVMEDIA_TYPE_xxx + */ + enum AVMediaType type; + + /** + * Codec implemented by the hardware accelerator. + * + * See AV_CODEC_ID_xxx + */ + enum AVCodecID id; + + /** + * Supported pixel format. + * + * Only hardware accelerated formats are supported here. + */ + enum AVPixelFormat pix_fmt; + + /** + * Hardware accelerated codec capabilities. + * see AV_HWACCEL_CODEC_CAP_* + */ + int capabilities; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + struct AVHWAccel *next; + + /** + * Allocate a custom buffer + */ + int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame); + + /** + * Called at the beginning of each frame or field picture. + * + * Meaningful frame information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * Note that buf can be NULL along with buf_size set to 0. + * Otherwise, this means the whole frame is available at this point. + * + * @param avctx the codec context + * @param buf the frame data buffer base + * @param buf_size the size of the frame in bytes + * @return zero if successful, a negative value otherwise + */ + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for each slice. + * + * Meaningful slice information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * The only exception is XvMC, that works on MB level. + * + * @param avctx the codec context + * @param buf the slice data buffer base + * @param buf_size the size of the slice in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Called at the end of each frame or field picture. + * + * The whole picture is parsed at this point and can now be sent + * to the hardware accelerator. This function is mandatory. + * + * @param avctx the codec context + * @return zero if successful, a negative value otherwise + */ + int (*end_frame)(AVCodecContext *avctx); + + /** + * Size of per-frame hardware accelerator private data. + * + * Private data is allocated with av_mallocz() before + * AVCodecContext.get_buffer() and deallocated after + * AVCodecContext.release_buffer(). + */ + int frame_priv_data_size; + + /** + * Called for every Macroblock in a slice. + * + * XvMC uses it to replace the ff_mpv_reconstruct_mb(). + * Instead of decoding to raw picture, MB parameters are + * stored in an array provided by the video driver. + * + * @param s the mpeg context + */ + void (*decode_mb)(struct MpegEncContext *s); + + /** + * Initialize the hwaccel private data. + * + * This will be called from ff_get_format(), after hwaccel and + * hwaccel_context are set and the hwaccel private data in AVCodecInternal + * is allocated. + */ + int (*init)(AVCodecContext *avctx); + + /** + * Uninitialize the hwaccel private data. + * + * This will be called from get_format() or avcodec_close(), after hwaccel + * and hwaccel_context are already uninitialized. + */ + int (*uninit)(AVCodecContext *avctx); + + /** + * Size of the private data to allocate in + * AVCodecInternal.hwaccel_priv_data. + */ + int priv_data_size; + + /** + * Internal hwaccel capabilities. + */ + int caps_internal; +} AVHWAccel; + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 + +/** + * Hardware acceleration should be used for decoding even if the codec level + * used is unknown or higher than the maximum supported level reported by the + * hardware driver. + * + * It's generally a good idea to pass this flag unless you have a specific + * reason not to, as hardware tends to under-report supported levels. + */ +#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0) + +/** + * Hardware acceleration can output YUV pixel formats with a different chroma + * sampling than 4:2:0 and/or other than 8 bits per component. + */ +#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) + +/** + * Hardware acceleration should still be attempted for decoding when the + * codec profile does not match the reported capabilities of the hardware. + * + * For example, this can be used to try to decode baseline profile H.264 + * streams in hardware - it will often succeed, because many streams marked + * as baseline profile actually conform to constrained baseline profile. + * + * @warning If the stream is actually not supported then the behaviour is + * undefined, and may include returning entirely incorrect output + * while indicating success. + */ +#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @defgroup lavc_picture AVPicture + * + * Functions for working with AVPicture + * @{ + */ + +/** + * Picture data structure. + * + * Up to four components can be stored into it, the last component is + * alpha. + * @deprecated use AVFrame or imgutils functions instead + */ +typedef struct AVPicture { + attribute_deprecated + uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes + attribute_deprecated + int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line +} AVPicture; + +/** + * @} + */ +#endif + +enum AVSubtitleType { + SUBTITLE_NONE, + + SUBTITLE_BITMAP, ///< A bitmap, pict will be set + + /** + * Plain text, the text field must be set by the decoder and is + * authoritative. ass and pict fields may contain approximations. + */ + SUBTITLE_TEXT, + + /** + * Formatted text, the ass field must be set by the decoder and is + * authoritative. pict and text fields may contain approximations. + */ + SUBTITLE_ASS, +}; + +#define AV_SUBTITLE_FLAG_FORCED 0x00000001 + +typedef struct AVSubtitleRect { + int x; ///< top left corner of pict, undefined when pict is not set + int y; ///< top left corner of pict, undefined when pict is not set + int w; ///< width of pict, undefined when pict is not set + int h; ///< height of pict, undefined when pict is not set + int nb_colors; ///< number of colors in pict, undefined when pict is not set + +#if FF_API_AVPICTURE + /** + * @deprecated unused + */ + attribute_deprecated + AVPicture pict; +#endif + /** + * data+linesize for the bitmap of this subtitle. + * Can be set for text/ass as well once they are rendered. + */ + uint8_t *data[4]; + int linesize[4]; + + enum AVSubtitleType type; + + char *text; ///< 0 terminated plain UTF-8 text + + /** + * 0 terminated ASS/SSA compatible event line. + * The presentation of this is unaffected by the other values in this + * struct. + */ + char *ass; + + int flags; +} AVSubtitleRect; + +typedef struct AVSubtitle { + uint16_t format; /* 0 = graphics */ + uint32_t start_display_time; /* relative to packet pts, in ms */ + uint32_t end_display_time; /* relative to packet pts, in ms */ + unsigned num_rects; + AVSubtitleRect **rects; + int64_t pts; ///< Same as packet pts, in AV_TIME_BASE +} AVSubtitle; + +/** + * This struct describes the properties of an encoded stream. + * + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must + * be allocated with avcodec_parameters_alloc() and freed with + * avcodec_parameters_free(). + */ +typedef struct AVCodecParameters { + /** + * General type of the encoded data. + */ + enum AVMediaType codec_type; + /** + * Specific type of the encoded data (the codec used). + */ + enum AVCodecID codec_id; + /** + * Additional information about the codec (corresponds to the AVI FOURCC). + */ + uint32_t codec_tag; + + /** + * Extra binary data needed for initializing the decoder, codec-dependent. + * + * Must be allocated with av_malloc() and will be freed by + * avcodec_parameters_free(). The allocated size of extradata must be at + * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding + * bytes zeroed. + */ + uint8_t *extradata; + /** + * Size of the extradata content in bytes. + */ + int extradata_size; + + /** + * - video: the pixel format, the value corresponds to enum AVPixelFormat. + * - audio: the sample format, the value corresponds to enum AVSampleFormat. + */ + int format; + + /** + * The average bitrate of the encoded data (in bits per second). + */ + int64_t bit_rate; + + /** + * The number of bits per sample in the codedwords. + * + * This is basically the bitrate per sample. It is mandatory for a bunch of + * formats to actually decode them. It's the number of bits for one sample in + * the actual coded bitstream. + * + * This could be for example 4 for ADPCM + * For PCM formats this matches bits_per_raw_sample + * Can be 0 + */ + int bits_per_coded_sample; + + /** + * This is the number of valid bits in each output sample. If the + * sample format has more bits, the least significant bits are additional + * padding bits, which are always 0. Use right shifts to reduce the sample + * to its actual size. For example, audio formats with 24 bit samples will + * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. + * To get the original sample use "(int32_t)sample >> 8"." + * + * For ADPCM this might be 12 or 16 or similar + * Can be 0 + */ + int bits_per_raw_sample; + + /** + * Codec-specific bitstream restrictions that the stream conforms to. + */ + int profile; + int level; + + /** + * Video only. The dimensions of the video frame in pixels. + */ + int width; + int height; + + /** + * Video only. The aspect ratio (width / height) which a single pixel + * should have when displayed. + * + * When the aspect ratio is unknown / undefined, the numerator should be + * set to 0 (the denominator may have any value). + */ + AVRational sample_aspect_ratio; + + /** + * Video only. The order of the fields in interlaced video. + */ + enum AVFieldOrder field_order; + + /** + * Video only. Additional colorspace characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + enum AVChromaLocation chroma_location; + + /** + * Video only. Number of delayed frames. + */ + int video_delay; + + /** + * Audio only. The channel layout bitmask. May be 0 if the channel layout is + * unknown or unspecified, otherwise the number of bits set must be equal to + * the channels field. + */ + uint64_t channel_layout; + /** + * Audio only. The number of audio channels. + */ + int channels; + /** + * Audio only. The number of audio samples per second. + */ + int sample_rate; + /** + * Audio only. The number of bytes per coded audio frame, required by some + * formats. + * + * Corresponds to nBlockAlign in WAVEFORMATEX. + */ + int block_align; + /** + * Audio only. Audio frame size, if known. Required by some formats to be static. + */ + int frame_size; + + /** + * Audio only. The amount of padding (in samples) inserted by the encoder at + * the beginning of the audio. I.e. this number of leading decoded samples + * must be discarded by the caller to get the original audio without leading + * padding. + */ + int initial_padding; + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + */ + int trailing_padding; + /** + * Audio only. Number of samples to skip after a discontinuity. + */ + int seek_preroll; +} AVCodecParameters; + +/** + * If c is NULL, returns the first registered codec, + * if c is non-NULL, returns the next registered codec after c, + * or NULL if c is the last one. + */ +AVCodec *av_codec_next(const AVCodec *c); + +/** + * Return the LIBAVCODEC_VERSION_INT constant. + */ +unsigned avcodec_version(void); + +/** + * Return the libavcodec build-time configuration. + */ +const char *avcodec_configuration(void); + +/** + * Return the libavcodec license. + */ +const char *avcodec_license(void); + +/** + * Register the codec codec and initialize libavcodec. + * + * @warning either this function or avcodec_register_all() must be called + * before any other libavcodec functions. + * + * @see avcodec_register_all() + */ +void avcodec_register(AVCodec *codec); + +/** + * Register all the codecs, parsers and bitstream filters which were enabled at + * configuration time. If you do not call this function you can select exactly + * which formats you want to support, by using the individual registration + * functions. + * + * @see avcodec_register + * @see av_register_codec_parser + * @see av_register_bitstream_filter + */ +void avcodec_register_all(void); + +/** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct should be freed with avcodec_free_context(). + * + * @param codec if non-NULL, allocate private data and initialize defaults + * for the given codec. It is illegal to then call avcodec_open2() + * with a different codec. + * If NULL, then the codec-specific defaults won't be initialized, + * which may result in suboptimal default settings (this is + * important mainly for encoders, e.g. libx264). + * + * @return An AVCodecContext filled with default values or NULL on failure. + */ +AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); + +/** + * Free the codec context and everything associated with it and write NULL to + * the provided pointer. + */ +void avcodec_free_context(AVCodecContext **avctx); + +#if FF_API_GET_CONTEXT_DEFAULTS +/** + * @deprecated This function should not be used, as closing and opening a codec + * context multiple time is not supported. A new codec context should be + * allocated for each new use. + */ +int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); +#endif + +/** + * Get the AVClass for AVCodecContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_class(void); + +#if FF_API_COPY_CONTEXT +/** + * Get the AVClass for AVFrame. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_frame_class(void); + +/** + * Get the AVClass for AVSubtitleRect. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_subtitle_rect_class(void); + +/** + * Copy the settings of the source AVCodecContext into the destination + * AVCodecContext. The resulting destination codec context will be + * unopened, i.e. you are required to call avcodec_open2() before you + * can use this AVCodecContext to decode/encode video/audio data. + * + * @param dest target codec context, should be initialized with + * avcodec_alloc_context3(NULL), but otherwise uninitialized + * @param src source codec context + * @return AVERROR() on error (e.g. memory allocation error), 0 on success + * + * @deprecated The semantics of this function are ill-defined and it should not + * be used. If you need to transfer the stream parameters from one codec context + * to another, use an intermediate AVCodecParameters instance and the + * avcodec_parameters_from_context() / avcodec_parameters_to_context() + * functions. + */ +attribute_deprecated +int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); +#endif + +/** + * Allocate a new AVCodecParameters and set its fields to default values + * (unknown/invalid/0). The returned struct must be freed with + * avcodec_parameters_free(). + */ +AVCodecParameters *avcodec_parameters_alloc(void); + +/** + * Free an AVCodecParameters instance and everything associated with it and + * write NULL to the supplied pointer. + */ +void avcodec_parameters_free(AVCodecParameters **par); + +/** + * Copy the contents of src to dst. Any allocated fields in dst are freed and + * replaced with newly allocated duplicates of the corresponding fields in src. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); + +/** + * Fill the parameters struct based on the values from the supplied codec + * context. Any allocated fields in par are freed and replaced with duplicates + * of the corresponding fields in codec. + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int avcodec_parameters_from_context(AVCodecParameters *par, + const AVCodecContext *codec); + +/** + * Fill the codec context based on the values from the supplied codec + * parameters. Any allocated fields in codec that have a corresponding field in + * par are freed and replaced with duplicates of the corresponding field in par. + * Fields in codec that do not have a counterpart in par are not touched. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_to_context(AVCodecContext *codec, + const AVCodecParameters *par); + +/** + * Initialize the AVCodecContext to use the given AVCodec. Prior to using this + * function the context has to be allocated with avcodec_alloc_context3(). + * + * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), + * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for + * retrieving a codec. + * + * @warning This function is not thread safe! + * + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). + * + * @code + * avcodec_register_all(); + * av_dict_set(&opts, "b", "2.5M", 0); + * codec = avcodec_find_decoder(AV_CODEC_ID_H264); + * if (!codec) + * exit(1); + * + * context = avcodec_alloc_context3(codec); + * + * if (avcodec_open2(context, codec, opts) < 0) + * exit(1); + * @endcode + * + * @param avctx The context to initialize. + * @param codec The codec to open this context for. If a non-NULL codec has been + * previously passed to avcodec_alloc_context3() or + * for this context, then this parameter MUST be either NULL or + * equal to the previously passed codec. + * @param options A dictionary filled with AVCodecContext and codec-private options. + * On return this object will be filled with options that were not found. + * + * @return zero on success, a negative value on error + * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), + * av_dict_set(), av_opt_find(). + */ +int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); + +/** + * Close a given AVCodecContext and free all the data associated with it + * (but not the AVCodecContext itself). + * + * Calling this function on an AVCodecContext that hasn't been opened will free + * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL + * codec. Subsequent calls will do nothing. + * + * @note Do not use this function. Use avcodec_free_context() to destroy a + * codec context (either open or closed). Opening and closing a codec context + * multiple times is not supported anymore -- use multiple codec contexts + * instead. + */ +int avcodec_close(AVCodecContext *avctx); + +/** + * Free all allocated data in the given subtitle struct. + * + * @param sub AVSubtitle to free. + */ +void avsubtitle_free(AVSubtitle *sub); + +/** + * @} + */ + +/** + * @addtogroup lavc_packet + * @{ + */ + +/** + * Allocate an AVPacket and set its fields to default values. The resulting + * struct must be freed using av_packet_free(). + * + * @return An AVPacket filled with default values or NULL on failure. + * + * @note this only allocates the AVPacket itself, not the data buffers. Those + * must be allocated through other means such as av_new_packet. + * + * @see av_new_packet + */ +AVPacket *av_packet_alloc(void); + +/** + * Create a new packet that references the same data as src. + * + * This is a shortcut for av_packet_alloc()+av_packet_ref(). + * + * @return newly created AVPacket on success, NULL on error. + * + * @see av_packet_alloc + * @see av_packet_ref + */ +AVPacket *av_packet_clone(const AVPacket *src); + +/** + * Free the packet, if the packet is reference counted, it will be + * unreferenced first. + * + * @param pkt packet to be freed. The pointer will be set to NULL. + * @note passing NULL is a no-op. + */ +void av_packet_free(AVPacket **pkt); + +/** + * Initialize optional fields of a packet with default values. + * + * Note, this does not touch the data and size members, which have to be + * initialized separately. + * + * @param pkt packet + */ +void av_init_packet(AVPacket *pkt); + +/** + * Allocate the payload of a packet and initialize its fields with + * default values. + * + * @param pkt packet + * @param size wanted payload size + * @return 0 if OK, AVERROR_xxx otherwise + */ +int av_new_packet(AVPacket *pkt, int size); + +/** + * Reduce packet size, correctly zeroing padding + * + * @param pkt packet + * @param size new size + */ +void av_shrink_packet(AVPacket *pkt, int size); + +/** + * Increase packet size, correctly zeroing padding + * + * @param pkt packet + * @param grow_by number of bytes by which to increase the size of the packet + */ +int av_grow_packet(AVPacket *pkt, int grow_by); + +/** + * Initialize a reference-counted packet from av_malloc()ed data. + * + * @param pkt packet to be initialized. This function will set the data, size, + * buf and destruct fields, all others are left untouched. + * @param data Data allocated by av_malloc() to be used as packet data. If this + * function returns successfully, the data is owned by the underlying AVBuffer. + * The caller may not access the data through other means. + * @param size size of data in bytes, without the padding. I.e. the full buffer + * size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); + +#if FF_API_AVPACKET_OLD_API +/** + * @warning This is a hack - the packet memory allocation stuff is broken. The + * packet is allocated if it was not really allocated. + * + * @deprecated Use av_packet_ref + */ +attribute_deprecated +int av_dup_packet(AVPacket *pkt); +/** + * Copy packet, including contents + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_ref + */ +attribute_deprecated +int av_copy_packet(AVPacket *dst, const AVPacket *src); + +/** + * Copy packet side data + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_copy_props + */ +attribute_deprecated +int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); + +/** + * Free a packet. + * + * @deprecated Use av_packet_unref + * + * @param pkt packet to free + */ +attribute_deprecated +void av_free_packet(AVPacket *pkt); +#endif +/** + * Allocate new information of a packet. + * + * @param pkt packet + * @param type side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Wrap an existing array as a packet side data. + * + * @param pkt packet + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * pkt. + * @param size side information size + * @return a non-negative number on success, a negative AVERROR code on + * failure. On failure, the packet is unchanged and the data remains + * owned by the caller. + */ +int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Shrink the already allocated side data buffer + * + * @param pkt packet + * @param type side information type + * @param size new side information size + * @return 0 on success, < 0 on failure + */ +int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Get side information from packet. + * + * @param pkt packet + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, + int *size); + +#if FF_API_MERGE_SD_API +attribute_deprecated +int av_packet_merge_side_data(AVPacket *pkt); + +attribute_deprecated +int av_packet_split_side_data(AVPacket *pkt); +#endif + +const char *av_packet_side_data_name(enum AVPacketSideDataType type); + +/** + * Pack a dictionary for use in side_data. + * + * @param dict The dictionary to pack. + * @param size pointer to store the size of the returned data + * @return pointer to data if successful, NULL otherwise + */ +uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size); +/** + * Unpack a dictionary from side_data. + * + * @param data data from side_data + * @param size size of the data + * @param dict the metadata storage dictionary + * @return 0 on success, < 0 on failure + */ +int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict); + + +/** + * Convenience function to free all the side data stored. + * All the other fields stay untouched. + * + * @param pkt packet + */ +void av_packet_free_side_data(AVPacket *pkt); + +/** + * Setup a new reference to the data described by a given packet + * + * If src is reference-counted, setup dst as a new reference to the + * buffer in src. Otherwise allocate a new buffer in dst and copy the + * data from src into it. + * + * All the other fields are copied from src. + * + * @see av_packet_unref + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_packet_ref(AVPacket *dst, const AVPacket *src); + +/** + * Wipe the packet. + * + * Unreference the buffer referenced by the packet and reset the + * remaining packet fields to their default values. + * + * @param pkt The packet to be unreferenced. + */ +void av_packet_unref(AVPacket *pkt); + +/** + * Move every field in src to dst and reset src. + * + * @see av_packet_unref + * + * @param src Source packet, will be reset + * @param dst Destination packet + */ +void av_packet_move_ref(AVPacket *dst, AVPacket *src); + +/** + * Copy only "properties" fields from src to dst. + * + * Properties for the purpose of this function are all the fields + * beside those related to the packet data (buf, data, size) + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success AVERROR on failure. + */ +int av_packet_copy_props(AVPacket *dst, const AVPacket *src); + +/** + * Convert valid timing fields (timestamps / durations) in a packet from one + * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be + * ignored. + * + * @param pkt packet on which the conversion will be performed + * @param tb_src source timebase, in which the timing fields in pkt are + * expressed + * @param tb_dst destination timebase, to which the timing fields will be + * converted + */ +void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); + +/** + * @} + */ + +/** + * @addtogroup lavc_decoding + * @{ + */ + +/** + * Find a registered decoder with a matching codec ID. + * + * @param id AVCodecID of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder(enum AVCodecID id); + +/** + * Find a registered decoder with the specified name. + * + * @param name name of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder_by_name(const char *name); + +/** + * The default callback for AVCodecContext.get_buffer2(). It is made public so + * it can be called by custom get_buffer2() implementations for decoders without + * AV_CODEC_CAP_DR1 set. + */ +int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); + +#if FF_API_EMU_EDGE +/** + * Return the amount of padding in pixels which the get_buffer callback must + * provide around the edge of the image for codecs which do not have the + * CODEC_FLAG_EMU_EDGE flag. + * + * @return Required padding in pixels. + * + * @deprecated CODEC_FLAG_EMU_EDGE is deprecated, so this function is no longer + * needed + */ +attribute_deprecated +unsigned avcodec_get_edge_width(void); +#endif + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you do not use any horizontal + * padding. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you also ensure that all + * line sizes are a multiple of the respective linesize_align[i]. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, + int linesize_align[AV_NUM_DATA_POINTERS]); + +/** + * Converts AVChromaLocation to swscale x/y chroma position. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos); + +/** + * Converts swscale x/y chroma position to AVChromaLocation. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); + +/** + * Decode the audio frame of size avpkt->size from avpkt->data into frame. + * + * Some decoders may support multiple frames in a single AVPacket. Such + * decoders would then just decode the first frame and the return value would be + * less than the packet size. In this case, avcodec_decode_audio4 has to be + * called again with an AVPacket containing the remaining data in order to + * decode the second frame, etc... Even if no frames are returned, the packet + * needs to be fed to the decoder with remaining data until it is completely + * consumed or an error occurs. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning samples. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no samples will be returned. + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] frame The AVFrame in which to store decoded audio samples. + * The decoder will allocate a buffer for the decoded frame by + * calling the AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is + * non-zero. Note that this field being set to zero + * does not mean that an error has occurred. For + * decoders with AV_CODEC_CAP_DELAY set, no given decode + * call is guaranteed to produce a frame. + * @param[in] avpkt The input AVPacket containing the input buffer. + * At least avpkt->data and avpkt->size should be set. Some + * decoders might also require additional fields to be set. + * @return A negative error code is returned if an error occurred during + * decoding, otherwise the number of bytes consumed from the input + * AVPacket is returned. + * +* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, + int *got_frame_ptr, const AVPacket *avpkt); + +/** + * Decode the video frame of size avpkt->size from avpkt->data into picture. + * Some decoders may support multiple frames in a single AVPacket, such + * decoders would then just decode the first frame. + * + * @warning The input buffer must be AV_INPUT_BUFFER_PADDING_SIZE larger than + * the actual read bytes because some optimized bitstream readers read 32 or 64 + * bits at once and could read over the end. + * + * @warning The end of the input buffer buf should be set to 0 to ensure that + * no overreading happens for damaged MPEG streams. + * + * @note Codecs which have the AV_CODEC_CAP_DELAY capability set have a delay + * between input and output, these need to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to return the remaining frames. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] picture The AVFrame in which the decoded video frame will be stored. + * Use av_frame_alloc() to get an AVFrame. The codec will + * allocate memory for the actual bitmap by calling the + * AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * + * @param[in] avpkt The input AVPacket containing the input buffer. + * You can create such packet with av_init_packet() and by then setting + * data and size, some decoders might in addition need other fields like + * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least + * fields possible. + * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame could be decompressed. + * + * @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, + int *got_picture_ptr, + const AVPacket *avpkt); + +/** + * Decode a subtitle message. + * Return a negative value on error, otherwise return the number of bytes used. + * If no subtitle could be decompressed, got_sub_ptr is zero. + * Otherwise, the subtitle is stored in *sub. + * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for + * simplicity, because the performance difference is expect to be negligible + * and reusing a get_buffer written for video codecs would probably perform badly + * due to a potentially very different allocation pattern. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning subtitles. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored, + * must be freed with avsubtitle_free if *got_sub_ptr is set. + * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. + * @param[in] avpkt The input AVPacket containing the input buffer. + */ +int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, + int *got_sub_ptr, + AVPacket *avpkt); + +/** + * Supply raw packet data as input to a decoder. + * + * Internally, this call will copy relevant AVCodecContext fields, which can + * influence decoding per-packet, and apply them when the packet is actually + * decoded. (For example AVCodecContext.skip_frame, which might direct the + * decoder to drop the frame contained by the packet sent with this function.) + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @warning Do not mix this API with the legacy API (like avcodec_decode_video2()) + * on the same AVCodecContext. It will return unexpected results now + * or in future libavcodec versions. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx codec context + * @param[in] avpkt The input AVPacket. Usually, this will be a single video + * frame, or several complete audio frames. + * Ownership of the packet remains with the caller, and the + * decoder will not write to the packet. The decoder may create + * a reference to the packet data (or copy it if the packet is + * not reference-counted). + * Unlike with older APIs, the packet is always fully consumed, + * and if it contains multiple frames (e.g. some audio codecs), + * will require you to call avcodec_receive_frame() multiple + * times afterwards before you can send a new packet. + * It can be NULL (or an AVPacket with data set to NULL and + * size set to 0); in this case, it is considered a flush + * packet, which signals the end of the stream. Sending the + * first flush packet will return success. Subsequent ones are + * unnecessary and will return AVERROR_EOF. If the decoder + * still has frames buffered, it will return them after sending + * a flush packet. + * + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_frame() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the decoder has been flushed, and no new packets can + * be sent to it (also returned if more than 1 flush + * packet is sent) + * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); + +/** + * Return decoded output data from a decoder. + * + * @param avctx codec context + * @param frame This will be set to a reference-counted video or audio + * frame (depending on the decoder type) allocated by the + * decoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * + * @return + * 0: success, a frame was returned + * AVERROR(EAGAIN): output is not available in this state - user must try + * to send new input + * AVERROR_EOF: the decoder has been fully flushed, and there will be + * no more output frames + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other negative values: legitimate decoding errors + */ +int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); + +/** + * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() + * to retrieve buffered output packets. + * + * @param avctx codec context + * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. + * Ownership of the frame remains with the caller, and the + * encoder will not write to the frame. The encoder may create + * a reference to the frame data (or copy it if the frame is + * not reference-counted). + * It can be NULL, in which case it is considered a flush + * packet. This signals the end of the stream. If the encoder + * still has packets buffered, it will return them after this + * call. Once flushing mode has been entered, additional flush + * packets are ignored, and sending frames will return + * AVERROR_EOF. + * + * For audio: + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_packet() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the encoder has been flushed, and no new frames can + * be sent to it + * AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a + * decoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); + +/** + * Read encoded data from the encoder. + * + * @param avctx codec context + * @param avpkt This will be set to a reference-counted packet allocated by the + * encoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): output is not available in the current state - user + * must try to send input + * AVERROR_EOF: the encoder has been fully flushed, and there will be + * no more output packets + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other errors: legitimate decoding errors + */ +int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); + + +/** + * @defgroup lavc_parsing Frame parsing + * @{ + */ + +enum AVPictureStructure { + AV_PICTURE_STRUCTURE_UNKNOWN, //< unknown + AV_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field + AV_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field + AV_PICTURE_STRUCTURE_FRAME, //< coded as frame +}; + +typedef struct AVCodecParserContext { + void *priv_data; + struct AVCodecParser *parser; + int64_t frame_offset; /* offset of the current frame */ + int64_t cur_offset; /* current offset + (incremented by each av_parser_parse()) */ + int64_t next_frame_offset; /* offset of the next frame */ + /* video info */ + int pict_type; /* XXX: Put it back in AVCodecContext. */ + /** + * This field is used for proper frame duration computation in lavf. + * It signals, how much longer the frame duration of the current frame + * is compared to normal frame duration. + * + * frame_duration = (1 + repeat_pict) * time_base + * + * It is used by codecs like H.264 to display telecined material. + */ + int repeat_pict; /* XXX: Put it back in AVCodecContext. */ + int64_t pts; /* pts of the current frame */ + int64_t dts; /* dts of the current frame */ + + /* private data */ + int64_t last_pts; + int64_t last_dts; + int fetch_timestamp; + +#define AV_PARSER_PTS_NB 4 + int cur_frame_start_index; + int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_pts[AV_PARSER_PTS_NB]; + int64_t cur_frame_dts[AV_PARSER_PTS_NB]; + + int flags; +#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 +#define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 +#define PARSER_FLAG_USE_CODEC_TS 0x1000 + + int64_t offset; ///< byte offset from starting packet start + int64_t cur_frame_end[AV_PARSER_PTS_NB]; + + /** + * Set by parser to 1 for key frames and 0 for non-key frames. + * It is initialized to -1, so if the parser doesn't set this flag, + * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames + * will be used. + */ + int key_frame; + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated unused + */ + attribute_deprecated + int64_t convergence_duration; +#endif + + // Timestamp generation support: + /** + * Synchronization point for start of timestamp generation. + * + * Set to >0 for sync point, 0 for no sync point and <0 for undefined + * (default). + * + * For example, this corresponds to presence of H.264 buffering period + * SEI message. + */ + int dts_sync_point; + + /** + * Offset of the current timestamp against last timestamp sync point in + * units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain a valid timestamp offset. + * + * Note that the timestamp of sync point has usually a nonzero + * dts_ref_dts_delta, which refers to the previous sync point. Offset of + * the next frame after timestamp sync point will be usually 1. + * + * For example, this corresponds to H.264 cpb_removal_delay. + */ + int dts_ref_dts_delta; + + /** + * Presentation delay of current frame in units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain valid non-negative timestamp delta (presentation time of a frame + * must not lie in the past). + * + * This delay represents the difference between decoding and presentation + * time of the frame. + * + * For example, this corresponds to H.264 dpb_output_delay. + */ + int pts_dts_delta; + + /** + * Position of the packet in file. + * + * Analogous to cur_frame_pts/dts + */ + int64_t cur_frame_pos[AV_PARSER_PTS_NB]; + + /** + * Byte position of currently parsed frame in stream. + */ + int64_t pos; + + /** + * Previous frame byte position. + */ + int64_t last_pos; + + /** + * Duration of the current frame. + * For audio, this is in units of 1 / AVCodecContext.sample_rate. + * For all other types, this is in units of AVCodecContext.time_base. + */ + int duration; + + enum AVFieldOrder field_order; + + /** + * Indicate whether a picture is coded as a frame, top field or bottom field. + * + * For example, H.264 field_pic_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag + * equal to 1 and bottom_field_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_TOP_FIELD. + */ + enum AVPictureStructure picture_structure; + + /** + * Picture number incremented in presentation or output order. + * This field may be reinitialized at the first picture of a new sequence. + * + * For example, this corresponds to H.264 PicOrderCnt. + */ + int output_picture_number; + + /** + * Dimensions of the decoded video intended for presentation. + */ + int width; + int height; + + /** + * Dimensions of the coded video. + */ + int coded_width; + int coded_height; + + /** + * The format of the coded data, corresponds to enum AVPixelFormat for video + * and for enum AVSampleFormat for audio. + * + * Note that a decoder can have considerable freedom in how exactly it + * decodes the data, so the format reported here might be different from the + * one returned by a decoder. + */ + int format; +} AVCodecParserContext; + +typedef struct AVCodecParser { + int codec_ids[5]; /* several codec IDs are permitted */ + int priv_data_size; + int (*parser_init)(AVCodecParserContext *s); + /* This callback never returns an error, a negative value means that + * the frame start was in a previous packet. */ + int (*parser_parse)(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size); + void (*parser_close)(AVCodecParserContext *s); + int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); + struct AVCodecParser *next; +} AVCodecParser; + +AVCodecParser *av_parser_next(const AVCodecParser *c); + +void av_register_codec_parser(AVCodecParser *parser); +AVCodecParserContext *av_parser_init(int codec_id); + +/** + * Parse a packet. + * + * @param s parser context. + * @param avctx codec context. + * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. + * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. + * @param buf input buffer. + * @param buf_size buffer size in bytes without the padding. I.e. the full buffer + size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. + To signal EOF, this should be 0 (so that the last frame + can be output). + * @param pts input presentation timestamp. + * @param dts input decoding timestamp. + * @param pos input byte position in stream. + * @return the number of bytes of the input bitstream used. + * + * Example: + * @code + * while(in_len){ + * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, + * in_data, in_len, + * pts, dts, pos); + * in_data += len; + * in_len -= len; + * + * if(size) + * decode_frame(data, size); + * } + * @endcode + */ +int av_parser_parse2(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts, + int64_t pos); + +/** + * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed + * @deprecated use AVBitStreamFilter + */ +int av_parser_change(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +void av_parser_close(AVCodecParserContext *s); + +/** + * @} + * @} + */ + +/** + * @addtogroup lavc_encoding + * @{ + */ + +/** + * Find a registered encoder with a matching codec ID. + * + * @param id AVCodecID of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder(enum AVCodecID id); + +/** + * Find a registered encoder with the specified name. + * + * @param name name of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder_by_name(const char *name); + +/** + * Encode a frame of audio. + * + * Takes input samples from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay, split, and combine input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. If avpkt->data and + * avpkt->size are set, avpkt->destruct must also be set. All + * other AVPacket fields will be reset by the encoder using + * av_init_packet(). If avpkt->data is NULL, the encoder will + * allocate it. The encoder will set avpkt->size to the size + * of the output packet. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw audio data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +/** + * Encode a frame of video. + * + * Takes input raw video data from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay and reorder input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. All other AVPacket fields + * will be reset by the encoder using av_init_packet(). If + * avpkt->data is NULL, the encoder will allocate it. + * The encoder will set avpkt->size to the size of the + * output packet. The returned data (if any) belongs to the + * caller, he is responsible for freeing it. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw video data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVSubtitle *sub); + + +/** + * @} + */ + +#if FF_API_AVCODEC_RESAMPLE +/** + * @defgroup lavc_resample Audio resampling + * @ingroup libavc + * @deprecated use libswresample instead + * + * @{ + */ +struct ReSampleContext; +struct AVResampleContext; + +typedef struct ReSampleContext ReSampleContext; + +/** + * Initialize audio resampling context. + * + * @param output_channels number of output channels + * @param input_channels number of input channels + * @param output_rate output sample rate + * @param input_rate input sample rate + * @param sample_fmt_out requested output sample format + * @param sample_fmt_in input sample format + * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency + * @param log2_phase_count log2 of the number of entries in the polyphase filterbank + * @param linear if 1 then the used FIR filter will be linearly interpolated + between the 2 closest, if 0 the closest will be used + * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate + * @return allocated ReSampleContext, NULL if error occurred + */ +attribute_deprecated +ReSampleContext *av_audio_resample_init(int output_channels, int input_channels, + int output_rate, int input_rate, + enum AVSampleFormat sample_fmt_out, + enum AVSampleFormat sample_fmt_in, + int filter_length, int log2_phase_count, + int linear, double cutoff); + +attribute_deprecated +int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples); + +/** + * Free resample context. + * + * @param s a non-NULL pointer to a resample context previously + * created with av_audio_resample_init() + */ +attribute_deprecated +void audio_resample_close(ReSampleContext *s); + + +/** + * Initialize an audio resampler. + * Note, if either rate is not an integer then simply scale both rates up so they are. + * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq + * @param log2_phase_count log2 of the number of entries in the polyphase filterbank + * @param linear If 1 then the used FIR filter will be linearly interpolated + between the 2 closest, if 0 the closest will be used + * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate + */ +attribute_deprecated +struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff); + +/** + * Resample an array of samples using a previously configured context. + * @param src an array of unconsumed samples + * @param consumed the number of samples of src which have been consumed are returned here + * @param src_size the number of unconsumed samples available + * @param dst_size the amount of space in samples available in dst + * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context. + * @return the number of samples written in dst or -1 if an error occurred + */ +attribute_deprecated +int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx); + + +/** + * Compensate samplerate/timestamp drift. The compensation is done by changing + * the resampler parameters, so no audible clicks or similar distortions occur + * @param compensation_distance distance in output samples over which the compensation should be performed + * @param sample_delta number of output samples which should be output less + * + * example: av_resample_compensate(c, 10, 500) + * here instead of 510 samples only 500 samples would be output + * + * note, due to rounding the actual compensation might be slightly different, + * especially if the compensation_distance is large and the in_rate used during init is small + */ +attribute_deprecated +void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance); +attribute_deprecated +void av_resample_close(struct AVResampleContext *c); + +/** + * @} + */ +#endif + +#if FF_API_AVPICTURE +/** + * @addtogroup lavc_picture + * @{ + */ + +/** + * @deprecated unused + */ +attribute_deprecated +int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +void avpicture_free(AVPicture *picture); + +/** + * @deprecated use av_image_fill_arrays() instead. + */ +attribute_deprecated +int avpicture_fill(AVPicture *picture, const uint8_t *ptr, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated use av_image_copy_to_buffer() instead. + */ +attribute_deprecated +int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt, + int width, int height, + unsigned char *dest, int dest_size); + +/** + * @deprecated use av_image_get_buffer_size() instead. + */ +attribute_deprecated +int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated av_image_copy() instead. + */ +attribute_deprecated +void av_picture_copy(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_crop(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int top_band, int left_band); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt, + int padtop, int padbottom, int padleft, int padright, int *color); + +/** + * @} + */ +#endif + +/** + * @defgroup lavc_misc Utility functions + * @ingroup libavc + * + * Miscellaneous utility functions related to both encoding and decoding + * (or neither). + * @{ + */ + +/** + * @defgroup lavc_misc_pixfmt Pixel formats + * + * Functions for working with pixel formats. + * @{ + */ + +#if FF_API_GETCHROMA +/** + * @deprecated Use av_pix_fmt_get_chroma_sub_sample + */ + +attribute_deprecated +void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); +#endif + +/** + * Return a value representing the fourCC code associated to the + * pixel format pix_fmt, or 0 if no associated fourCC code can be + * found. + */ +unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt); + +/** + * @deprecated see av_get_pix_fmt_loss() + */ +int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Find the best pixel format to convert to given a certain source pixel + * format. When converting from one pixel format to another, information loss + * may occur. For example, when converting from RGB24 to GRAY, the color + * information will be lost. Similarly, other losses occur when converting from + * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of + * the given pixel formats should be used to suffer the least amount of loss. + * The pixel formats from which it chooses one, are determined by the + * pix_fmt_list parameter. + * + * + * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. + * @return The best pixel format to convert to or -1 if none was found. + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, + enum AVPixelFormat src_pix_fmt, + int has_alpha, int *loss_ptr); + +/** + * @deprecated see av_find_best_pix_fmt_of_2() + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +attribute_deprecated +enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + +/** + * @} + */ + +#if FF_API_SET_DIMENSIONS +/** + * @deprecated this function is not supposed to be used from outside of lavc + */ +attribute_deprecated +void avcodec_set_dimensions(AVCodecContext *s, int width, int height); +#endif + +#if FF_API_TAG_STRING +/** + * Put a string representing the codec tag codec_tag in buf. + * + * @param buf buffer to place codec tag in + * @param buf_size size in bytes of buf + * @param codec_tag codec tag to assign + * @return the length of the string that would have been generated if + * enough space had been available, excluding the trailing null + * + * @deprecated see av_fourcc_make_string() and av_fourcc2str(). + */ +attribute_deprecated +size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); +#endif + +void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); + +/** + * Return a name for the specified profile, if available. + * + * @param codec the codec that is searched for the given profile + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + */ +const char *av_get_profile_name(const AVCodec *codec, int profile); + +/** + * Return a name for the specified profile, if available. + * + * @param codec_id the ID of the codec to which the requested profile belongs + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + * + * @note unlike av_get_profile_name(), which searches a list of profiles + * supported by a specific decoder or encoder implementation, this + * function searches the list of profiles from the AVCodecDescriptor + */ +const char *avcodec_profile_name(enum AVCodecID codec_id, int profile); + +int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); +int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); +//FIXME func typedef + +/** + * Fill AVFrame audio data and linesize pointers. + * + * The buffer buf must be a preallocated buffer with a size big enough + * to contain the specified samples amount. The filled AVFrame data + * pointers will point to this buffer. + * + * AVFrame extended_data channel pointers are allocated if necessary for + * planar audio. + * + * @param frame the AVFrame + * frame->nb_samples must be set prior to calling the + * function. This function fills in frame->data, + * frame->extended_data, frame->linesize[0]. + * @param nb_channels channel count + * @param sample_fmt sample format + * @param buf buffer to use for frame data + * @param buf_size size of buffer + * @param align plane size sample alignment (0 = default) + * @return >=0 on success, negative error code on failure + * @todo return the size in bytes required to store the samples in + * case of success, at the next libavutil bump + */ +int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, + enum AVSampleFormat sample_fmt, const uint8_t *buf, + int buf_size, int align); + +/** + * Reset the internal decoder state / flush internal buffers. Should be called + * e.g. when seeking or when switching to a different stream. + * + * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0), + * this invalidates the frames previously returned from the decoder. When + * refcounted frames are used, the decoder just releases any references it might + * keep internally, but the caller's reference remains valid. + */ +void avcodec_flush_buffers(AVCodecContext *avctx); + +/** + * Return codec bits per sample. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return the PCM codec associated with a sample format. + * @param be endianness, 0 for little, 1 for big, + * -1 (or anything else) for native + * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE + */ +enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be); + +/** + * Return codec bits per sample. + * Only return non-zero if the bits per sample is exactly correct, not an + * approximation. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_exact_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return audio frame duration. + * + * @param avctx codec context + * @param frame_bytes size of the frame, or 0 if unknown + * @return frame duration, in samples, if known. 0 if not able to + * determine. + */ +int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); + +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); + +#if FF_API_OLD_BSF +typedef struct AVBitStreamFilterContext { + void *priv_data; + const struct AVBitStreamFilter *filter; + AVCodecParserContext *parser; + struct AVBitStreamFilterContext *next; + /** + * Internal default arguments, used if NULL is passed to av_bitstream_filter_filter(). + * Not for access by library users. + */ + char *args; +} AVBitStreamFilterContext; +#endif + +typedef struct AVBSFInternal AVBSFInternal; + +/** + * The bitstream filter state. + * + * This struct must be allocated with av_bsf_alloc() and freed with + * av_bsf_free(). + * + * The fields in the struct will only be changed (by the caller or by the + * filter) as described in their documentation, and are to be considered + * immutable otherwise. + */ +typedef struct AVBSFContext { + /** + * A class for logging and AVOptions + */ + const AVClass *av_class; + + /** + * The bitstream filter this context is an instance of. + */ + const struct AVBitStreamFilter *filter; + + /** + * Opaque libavcodec internal data. Must not be touched by the caller in any + * way. + */ + AVBSFInternal *internal; + + /** + * Opaque filter-specific private data. If filter->priv_class is non-NULL, + * this is an AVOptions-enabled struct. + */ + void *priv_data; + + /** + * Parameters of the input stream. This field is allocated in + * av_bsf_alloc(), it needs to be filled by the caller before + * av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. This field is allocated in + * av_bsf_alloc(), it is set by the filter in av_bsf_init(). + */ + AVCodecParameters *par_out; + + /** + * The timebase used for the timestamps of the input packets. Set by the + * caller before av_bsf_init(). + */ + AVRational time_base_in; + + /** + * The timebase used for the timestamps of the output packets. Set by the + * filter in av_bsf_init(). + */ + AVRational time_base_out; +} AVBSFContext; + +typedef struct AVBitStreamFilter { + const char *name; + + /** + * A list of codec ids supported by the filter, terminated by + * AV_CODEC_ID_NONE. + * May be NULL, in that case the bitstream filter works with any codec id. + */ + const enum AVCodecID *codec_ids; + + /** + * A class for the private data, used to declare bitstream filter private + * AVOptions. This field is NULL for bitstream filters that do not declare + * any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavcodec generic + * code to this class. + */ + const AVClass *priv_class; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + int priv_data_size; + int (*init)(AVBSFContext *ctx); + int (*filter)(AVBSFContext *ctx, AVPacket *pkt); + void (*close)(AVBSFContext *ctx); +} AVBitStreamFilter; + +#if FF_API_OLD_BSF +/** + * Register a bitstream filter. + * + * The filter will be accessible to the application code through + * av_bitstream_filter_next() or can be directly initialized with + * av_bitstream_filter_init(). + * + * @see avcodec_register_all() + */ +attribute_deprecated +void av_register_bitstream_filter(AVBitStreamFilter *bsf); + +/** + * Create and initialize a bitstream filter context given a bitstream + * filter name. + * + * The returned context must be freed with av_bitstream_filter_close(). + * + * @param name the name of the bitstream filter + * @return a bitstream filter context if a matching filter was found + * and successfully initialized, NULL otherwise + */ +attribute_deprecated +AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); + +/** + * Filter bitstream. + * + * This function filters the buffer buf with size buf_size, and places the + * filtered buffer in the buffer pointed to by poutbuf. + * + * The output buffer must be freed by the caller. + * + * @param bsfc bitstream filter context created by av_bitstream_filter_init() + * @param avctx AVCodecContext accessed by the filter, may be NULL. + * If specified, this must point to the encoder context of the + * output stream the packet is sent to. + * @param args arguments which specify the filter configuration, may be NULL + * @param poutbuf pointer which is updated to point to the filtered buffer + * @param poutbuf_size pointer which is updated to the filtered buffer size in bytes + * @param buf buffer containing the data to filter + * @param buf_size size in bytes of buf + * @param keyframe set to non-zero if the buffer to filter corresponds to a key-frame packet data + * @return >= 0 in case of success, or a negative error code in case of failure + * + * If the return value is positive, an output buffer is allocated and + * is available in *poutbuf, and is distinct from the input buffer. + * + * If the return value is 0, the output buffer is not allocated and + * should be considered identical to the input buffer, or in case + * *poutbuf was set it points to the input buffer (not necessarily to + * its starting address). A special case is if *poutbuf was set to NULL and + * *poutbuf_size was set to 0, which indicates the packet should be dropped. + */ +attribute_deprecated +int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, + AVCodecContext *avctx, const char *args, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); + +/** + * Release bitstream filter context. + * + * @param bsf the bitstream filter context created with + * av_bitstream_filter_init(), can be NULL + */ +attribute_deprecated +void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); + +/** + * If f is NULL, return the first registered bitstream filter, + * if f is non-NULL, return the next registered bitstream filter + * after f, or NULL if f is the last one. + * + * This function can be used to iterate over all registered bitstream + * filters. + */ +attribute_deprecated +AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +#endif + +/** + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. + */ +const AVBitStreamFilter *av_bsf_get_by_name(const char *name); + +/** + * Iterate over all registered bitstream filters. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered bitstream filter or NULL when the iteration is + * finished + */ +const AVBitStreamFilter *av_bsf_next(void **opaque); + +/** + * Allocate a context for a given bitstream filter. The caller must fill in the + * context parameters as described in the documentation and then call + * av_bsf_init() before sending any data to the filter. + * + * @param filter the filter for which to allocate an instance. + * @param ctx a pointer into which the pointer to the newly-allocated context + * will be written. It must be freed with av_bsf_free() after the + * filtering is done. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); + +/** + * Prepare the filter for use, after all the parameters and options have been + * set. + */ +int av_bsf_init(AVBSFContext *ctx); + +/** + * Submit a packet for filtering. + * + * After sending each packet, the filter must be completely drained by calling + * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or + * AVERROR_EOF. + * + * @param pkt the packet to filter. The bitstream filter will take ownership of + * the packet and reset the contents of pkt. pkt is not touched if an error occurs. + * This parameter may be NULL, which signals the end of the stream (i.e. no more + * packets will be sent). That will cause the filter to output any packets it + * may have buffered internally. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Retrieve a filtered packet. + * + * @param[out] pkt this struct will be filled with the contents of the filtered + * packet. It is owned by the caller and must be freed using + * av_packet_unref() when it is no longer needed. + * This parameter should be "clean" (i.e. freshly allocated + * with av_packet_alloc() or unreffed with av_packet_unref()) + * when this function is called. If this function returns + * successfully, the contents of pkt will be completely + * overwritten by the returned data. On failure, pkt is not + * touched. + * + * @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the + * filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there + * will be no further output from the filter. Another negative AVERROR value if + * an error occurs. + * + * @note one input packet may result in several output packets, so after sending + * a packet with av_bsf_send_packet(), this function needs to be called + * repeatedly until it stops returning 0. It is also possible for a filter to + * output fewer packets than were sent to it, so this function may return + * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. + */ +int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Free a bitstream filter context and everything associated with it; write NULL + * into the supplied pointer. + */ +void av_bsf_free(AVBSFContext **ctx); + +/** + * Get the AVClass for AVBSFContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_bsf_get_class(void); + +/** + * Structure for chain/list of bitstream filters. + * Empty list can be allocated by av_bsf_list_alloc(). + */ +typedef struct AVBSFList AVBSFList; + +/** + * Allocate empty list of bitstream filters. + * The list must be later freed by av_bsf_list_free() + * or finalized by av_bsf_list_finalize(). + * + * @return Pointer to @ref AVBSFList on success, NULL in case of failure + */ +AVBSFList *av_bsf_list_alloc(void); + +/** + * Free list of bitstream filters. + * + * @param lst Pointer to pointer returned by av_bsf_list_alloc() + */ +void av_bsf_list_free(AVBSFList **lst); + +/** + * Append bitstream filter to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf Filter context to be appended + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); + +/** + * Construct new bitstream filter context given it's name and options + * and append it to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf_name Name of the bitstream filter + * @param options Options for the bitstream filter, can be set to NULL + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); +/** + * Finalize list of bitstream filters. + * + * This function will transform @ref AVBSFList to single @ref AVBSFContext, + * so the whole chain of bitstream filters can be treated as single filter + * freshly allocated by av_bsf_alloc(). + * If the call is successful, @ref AVBSFList structure is freed and lst + * will be set to NULL. In case of failure, caller is responsible for + * freeing the structure by av_bsf_list_free() + * + * @param lst Filter list structure to be transformed + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); + +/** + * Parse string describing list of bitstream filters and create single + * @ref AVBSFContext describing the whole chain of bitstream filters. + * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly + * allocated by av_bsf_alloc(). + * + * @param str String describing chain of bitstream filters in format + * `bsf1[=opt1=val1:opt2=val2][,bsf2]` + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); + +/** + * Get null/pass-through bitstream filter. + * + * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter + * + * @return + */ +int av_bsf_get_null_filter(AVBSFContext **bsf); + +/* memory */ + +/** + * Same behaviour av_fast_malloc but the buffer has additional + * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. + * + * In addition the whole buffer will initially and after resizes + * be 0-initialized so that no uninitialized data will ever appear. + */ +void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Same behaviour av_fast_padded_malloc except that buffer will always + * be 0-initialized after call. + */ +void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Encode extradata length to a buffer. Used by xiph codecs. + * + * @param s buffer to write to; must be at least (v/255+1) bytes long + * @param v size of extradata in bytes + * @return number of bytes written to the buffer. + */ +unsigned int av_xiphlacing(unsigned char *s, unsigned int v); + +#if FF_API_MISSING_SAMPLE +/** + * Log a generic warning message about a missing feature. This function is + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) + * only, and would normally not be used by applications. + * @param[in] avc a pointer to an arbitrary struct of which the first field is + * a pointer to an AVClass struct + * @param[in] feature string containing the name of the missing feature + * @param[in] want_sample indicates if samples are wanted which exhibit this feature. + * If want_sample is non-zero, additional verbiage will be added to the log + * message which tells the user how to report samples to the development + * mailing list. + * @deprecated Use avpriv_report_missing_feature() instead. + */ +attribute_deprecated +void av_log_missing_feature(void *avc, const char *feature, int want_sample); + +/** + * Log a generic warning message asking for a sample. This function is + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) + * only, and would normally not be used by applications. + * @param[in] avc a pointer to an arbitrary struct of which the first field is + * a pointer to an AVClass struct + * @param[in] msg string containing an optional message, or NULL if no message + * @deprecated Use avpriv_request_sample() instead. + */ +attribute_deprecated +void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3); +#endif /* FF_API_MISSING_SAMPLE */ + +/** + * Register the hardware accelerator hwaccel. + */ +void av_register_hwaccel(AVHWAccel *hwaccel); + +/** + * If hwaccel is NULL, returns the first registered hardware accelerator, + * if hwaccel is non-NULL, returns the next registered hardware accelerator + * after hwaccel, or NULL if hwaccel is the last one. + */ +AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); + + +/** + * Lock operation used by lockmgr + */ +enum AVLockOp { + AV_LOCK_CREATE, ///< Create a mutex + AV_LOCK_OBTAIN, ///< Lock the mutex + AV_LOCK_RELEASE, ///< Unlock the mutex + AV_LOCK_DESTROY, ///< Free mutex resources +}; + +/** + * Register a user provided lock manager supporting the operations + * specified by AVLockOp. The "mutex" argument to the function points + * to a (void *) where the lockmgr should store/get a pointer to a user + * allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the + * value left by the last call for all other ops. If the lock manager is + * unable to perform the op then it should leave the mutex in the same + * state as when it was called and return a non-zero value. However, + * when called with AV_LOCK_DESTROY the mutex will always be assumed to + * have been successfully destroyed. If av_lockmgr_register succeeds + * it will return a non-negative value, if it fails it will return a + * negative value and destroy all mutex and unregister all callbacks. + * av_lockmgr_register is not thread-safe, it must be called from a + * single thread before any calls which make use of locking are used. + * + * @param cb User defined callback. av_lockmgr_register invokes calls + * to this callback and the previously registered callback. + * The callback will be used to create more than one mutex + * each of which must be backed by its own underlying locking + * mechanism (i.e. do not use a single static object to + * implement your lock manager). If cb is set to NULL the + * lockmgr will be unregistered. + */ +int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); + +/** + * Get the type of the given codec. + */ +enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); + +/** + * Get the name of a codec. + * @return a static string identifying the codec; never NULL + */ +const char *avcodec_get_name(enum AVCodecID id); + +/** + * @return a positive value if s is open (i.e. avcodec_open2() was called on it + * with no corresponding avcodec_close()), 0 otherwise. + */ +int avcodec_is_open(AVCodecContext *s); + +/** + * @return a non-zero number if codec is an encoder, zero otherwise + */ +int av_codec_is_encoder(const AVCodec *codec); + +/** + * @return a non-zero number if codec is a decoder, zero otherwise + */ +int av_codec_is_decoder(const AVCodec *codec); + +/** + * @return descriptor for given codec ID or NULL if no descriptor exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id); + +/** + * Iterate over all codec descriptors known to libavcodec. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); + +/** + * @return codec descriptor with the given name or NULL if no such descriptor + * exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); + +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + +/** + * @} + */ + +#endif /* AVCODEC_AVCODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avdct.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avdct.h new file mode 100644 index 0000000..272422e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avdct.h @@ -0,0 +1,84 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVDCT_H +#define AVCODEC_AVDCT_H + +#include "libavutil/opt.h" + +/** + * AVDCT context. + * @note function pointers can be NULL if the specific features have been + * disabled at build time. + */ +typedef struct AVDCT { + const AVClass *av_class; + + void (*idct)(int16_t *block /* align 16 */); + + /** + * IDCT input permutation. + * Several optimized IDCTs need a permutated input (relative to the + * normal order of the reference IDCT). + * This permutation must be performed before the idct_put/add. + * Note, normally this can be merged with the zigzag/alternate scan
+ * An example to avoid confusion: + * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...) + * - (x -> reference DCT -> reference IDCT -> x) + * - (x -> reference DCT -> simple_mmx_perm = idct_permutation + * -> simple_idct_mmx -> x) + * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant + * -> simple_idct_mmx -> ...) + */ + uint8_t idct_permutation[64]; + + void (*fdct)(int16_t *block /* align 16 */); + + + /** + * DCT algorithm. + * must use AVOptions to set this field. + */ + int dct_algo; + + /** + * IDCT algorithm. + * must use AVOptions to set this field. + */ + int idct_algo; + + void (*get_pixels)(int16_t *block /* align 16 */, + const uint8_t *pixels /* align 8 */, + ptrdiff_t line_size); + + int bits_per_sample; +} AVDCT; + +/** + * Allocates a AVDCT context. + * This needs to be initialized with avcodec_dct_init() after optionally + * configuring it with AVOptions. + * + * To free it use av_free() + */ +AVDCT *avcodec_dct_alloc(void); +int avcodec_dct_init(AVDCT *); + +const AVClass *avcodec_dct_get_class(void); + +#endif /* AVCODEC_AVDCT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avfft.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avfft.h new file mode 100644 index 0000000..0c0f9b8 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/avfft.h @@ -0,0 +1,118 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVFFT_H +#define AVCODEC_AVFFT_H + +/** + * @file + * @ingroup lavc_fft + * FFT functions + */ + +/** + * @defgroup lavc_fft FFT functions + * @ingroup lavc_misc + * + * @{ + */ + +typedef float FFTSample; + +typedef struct FFTComplex { + FFTSample re, im; +} FFTComplex; + +typedef struct FFTContext FFTContext; + +/** + * Set up a complex FFT. + * @param nbits log2 of the length of the input array + * @param inverse if 0 perform the forward transform, if 1 perform the inverse + */ +FFTContext *av_fft_init(int nbits, int inverse); + +/** + * Do the permutation needed BEFORE calling ff_fft_calc(). + */ +void av_fft_permute(FFTContext *s, FFTComplex *z); + +/** + * Do a complex FFT with the parameters defined in av_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ +void av_fft_calc(FFTContext *s, FFTComplex *z); + +void av_fft_end(FFTContext *s); + +FFTContext *av_mdct_init(int nbits, int inverse, double scale); +void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_end(FFTContext *s); + +/* Real Discrete Fourier Transform */ + +enum RDFTransformType { + DFT_R2C, + IDFT_C2R, + IDFT_R2C, + DFT_C2R, +}; + +typedef struct RDFTContext RDFTContext; + +/** + * Set up a real FFT. + * @param nbits log2 of the length of the input array + * @param trans the type of transform + */ +RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +void av_rdft_calc(RDFTContext *s, FFTSample *data); +void av_rdft_end(RDFTContext *s); + +/* Discrete Cosine Transform */ + +typedef struct DCTContext DCTContext; + +enum DCTTransformType { + DCT_II = 0, + DCT_III, + DCT_I, + DST_I, +}; + +/** + * Set up DCT. + * + * @param nbits size of the input array: + * (1 << nbits) for DCT-II, DCT-III and DST-I + * (1 << nbits) + 1 for DCT-I + * @param type the type of transform + * + * @note the first element of the input of DST-I is ignored + */ +DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +void av_dct_calc(DCTContext *s, FFTSample *data); +void av_dct_end (DCTContext *s); + +/** + * @} + */ + +#endif /* AVCODEC_AVFFT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/d3d11va.h new file mode 100644 index 0000000..6816b6c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/d3d11va.h @@ -0,0 +1,112 @@ +/* + * Direct3D11 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * copyright (c) 2015 Steve Lhomme + * + * 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 + */ + +#ifndef AVCODEC_D3D11VA_H +#define AVCODEC_D3D11VA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_d3d11va + * Public libavcodec D3D11VA header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the Direct3D11 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + * + * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. + */ +typedef struct AVD3D11VAContext { + /** + * D3D11 decoder object + */ + ID3D11VideoDecoder *decoder; + + /** + * D3D11 VideoContext + */ + ID3D11VideoContext *video_context; + + /** + * D3D11 configuration used to create the decoder + */ + D3D11_VIDEO_DECODER_CONFIG *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + ID3D11VideoDecoderOutputView **surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; + + /** + * Mutex to access video_context + */ + HANDLE context_mutex; +} AVD3D11VAContext; + +/** + * Allocate an AVD3D11VAContext. + * + * @return Newly-allocated AVD3D11VAContext or NULL on failure. + */ +AVD3D11VAContext *av_d3d11va_alloc_context(void); + +/** + * @} + */ + +#endif /* AVCODEC_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dirac.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dirac.h new file mode 100644 index 0000000..e6d9d34 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dirac.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007 Marco Gerards + * Copyright (C) 2009 David Conrad + * Copyright (C) 2011 Jordi Ortiz + * + * 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 + */ + +#ifndef AVCODEC_DIRAC_H +#define AVCODEC_DIRAC_H + +/** + * @file + * Interface to Dirac Decoder/Encoder + * @author Marco Gerards + * @author David Conrad + * @author Jordi Ortiz + */ + +#include "avcodec.h" + +/** + * The spec limits the number of wavelet decompositions to 4 for both + * level 1 (VC-2) and 128 (long-gop default). + * 5 decompositions is the maximum before >16-bit buffers are needed. + * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting + * the others to 4 decompositions (or 3 for the fidelity filter). + * + * We use this instead of MAX_DECOMPOSITIONS to save some memory. + */ +#define MAX_DWT_LEVELS 5 + +/** + * Parse code values: + * + * Dirac Specification -> + * 9.6.1 Table 9.1 + * + * VC-2 Specification -> + * 10.4.1 Table 10.1 + */ + +enum DiracParseCodes { + DIRAC_PCODE_SEQ_HEADER = 0x00, + DIRAC_PCODE_END_SEQ = 0x10, + DIRAC_PCODE_AUX = 0x20, + DIRAC_PCODE_PAD = 0x30, + DIRAC_PCODE_PICTURE_CODED = 0x08, + DIRAC_PCODE_PICTURE_RAW = 0x48, + DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8, + DIRAC_PCODE_PICTURE_HQ = 0xE8, + DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A, + DIRAC_PCODE_INTER_NOREF_CO2 = 0x09, + DIRAC_PCODE_INTER_REF_CO1 = 0x0D, + DIRAC_PCODE_INTER_REF_CO2 = 0x0E, + DIRAC_PCODE_INTRA_REF_CO = 0x0C, + DIRAC_PCODE_INTRA_REF_RAW = 0x4C, + DIRAC_PCODE_INTRA_REF_PICT = 0xCC, + DIRAC_PCODE_MAGIC = 0x42424344, +}; + +typedef struct DiracVersionInfo { + int major; + int minor; +} DiracVersionInfo; + +typedef struct AVDiracSeqHeader { + unsigned width; + unsigned height; + uint8_t chroma_format; ///< 0: 444 1: 422 2: 420 + + uint8_t interlaced; + uint8_t top_field_first; + + uint8_t frame_rate_index; ///< index into dirac_frame_rate[] + uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[] + + uint16_t clean_width; + uint16_t clean_height; + uint16_t clean_left_offset; + uint16_t clean_right_offset; + + uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[] + uint8_t color_spec_index; ///< index into dirac_color_spec_presets[] + + int profile; + int level; + + AVRational framerate; + AVRational sample_aspect_ratio; + + enum AVPixelFormat pix_fmt; + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; + + DiracVersionInfo version; + int bit_depth; +} AVDiracSeqHeader; + +/** + * Parse a Dirac sequence header. + * + * @param dsh this function will allocate and fill an AVDiracSeqHeader struct + * and write it into this pointer. The caller must free it with + * av_free(). + * @param buf the data buffer + * @param buf_size the size of the data buffer in bytes + * @param log_ctx if non-NULL, this function will log errors here + * @return 0 on success, a negative AVERROR code on failure + */ +int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh, + const uint8_t *buf, size_t buf_size, + void *log_ctx); + +#endif /* AVCODEC_DIRAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dv_profile.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dv_profile.h new file mode 100644 index 0000000..9380a66 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dv_profile.h @@ -0,0 +1,83 @@ +/* + * 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 + */ + +#ifndef AVCODEC_DV_PROFILE_H +#define AVCODEC_DV_PROFILE_H + +#include + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "avcodec.h" + +/* minimum number of bytes to read from a DV stream in order to + * determine the profile */ +#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */ + + +/* + * AVDVProfile is used to express the differences between various + * DV flavors. For now it's primarily used for differentiating + * 525/60 and 625/50, but the plans are to use it for various + * DV specs as well (e.g. SMPTE314M vs. IEC 61834). + */ +typedef struct AVDVProfile { + int dsf; /* value of the dsf in the DV header */ + int video_stype; /* stype for VAUX source pack */ + int frame_size; /* total size of one frame in bytes */ + int difseg_size; /* number of DIF segments per DIF channel */ + int n_difchan; /* number of DIF channels per frame */ + AVRational time_base; /* 1/framerate */ + int ltc_divisor; /* FPS from the LTS standpoint */ + int height; /* picture height in pixels */ + int width; /* picture width in pixels */ + AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ + enum AVPixelFormat pix_fmt; /* picture pixel format */ + int bpm; /* blocks per macroblock */ + const uint8_t *block_sizes; /* AC block sizes, in bits */ + int audio_stride; /* size of audio_shuffle table */ + int audio_min_samples[3]; /* min amount of audio samples */ + /* for 48kHz, 44.1kHz and 32kHz */ + int audio_samples_dist[5]; /* how many samples are supposed to be */ + /* in each frame in a 5 frames window */ + const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ +} AVDVProfile; + +/** + * Get a DV profile for the provided compressed frame. + * + * @param sys the profile used for the previous frame, may be NULL + * @param frame the compressed data buffer + * @param buf_size size of the buffer in bytes + * @return the DV profile for the supplied data or NULL on failure + */ +const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, + const uint8_t *frame, unsigned buf_size); + +/** + * Get a DV profile for the provided stream parameters. + */ +const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt); + +/** + * Get a DV profile for the provided stream parameters. + * The frame rate is used as a best-effort parameter. + */ +const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate); + +#endif /* AVCODEC_DV_PROFILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dxva2.h new file mode 100644 index 0000000..22c9399 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/dxva2.h @@ -0,0 +1,93 @@ +/* + * DXVA2 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * + * 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 + */ + +#ifndef AVCODEC_DXVA2_H +#define AVCODEC_DXVA2_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_dxva2 + * Public libavcodec DXVA2 header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_dxva2 DXVA2 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the DXVA2 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct dxva_context { + /** + * DXVA2 decoder object + */ + IDirectXVideoDecoder *decoder; + + /** + * DXVA2 configuration used to create the decoder + */ + const DXVA2_ConfigPictureDecode *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + LPDIRECT3DSURFACE9 *surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; +}; + +/** + * @} + */ + +#endif /* AVCODEC_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/jni.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/jni.h new file mode 100644 index 0000000..dd99e92 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/jni.h @@ -0,0 +1,46 @@ +/* + * JNI public API functions + * + * Copyright (c) 2015-2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_JNI_H +#define AVCODEC_JNI_H + +/* + * Manually set a Java virtual machine which will be used to retrieve the JNI + * environment. Once a Java VM is set it cannot be changed afterwards, meaning + * you can call multiple times av_jni_set_java_vm with the same Java VM pointer + * however it will error out if you try to set a different Java VM. + * + * @param vm Java virtual machine + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_java_vm(void *vm, void *log_ctx); + +/* + * Get the Java virtual machine which has been set with av_jni_set_java_vm. + * + * @param vm Java virtual machine + * @return a pointer to the Java virtual machine + */ +void *av_jni_get_java_vm(void *log_ctx); + +#endif /* AVCODEC_JNI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/mediacodec.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/mediacodec.h new file mode 100644 index 0000000..5606d24 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/mediacodec.h @@ -0,0 +1,88 @@ +/* + * Android MediaCodec public API + * + * Copyright (c) 2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_MEDIACODEC_H +#define AVCODEC_MEDIACODEC_H + +#include "libavcodec/avcodec.h" + +/** + * This structure holds a reference to a android/view/Surface object that will + * be used as output by the decoder. + * + */ +typedef struct AVMediaCodecContext { + + /** + * android/view/Surface object reference. + */ + void *surface; + +} AVMediaCodecContext; + +/** + * Allocate and initialize a MediaCodec context. + * + * When decoding with MediaCodec is finished, the caller must free the + * MediaCodec context with av_mediacodec_default_free. + * + * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise + */ +AVMediaCodecContext *av_mediacodec_alloc_context(void); + +/** + * Convenience function that sets up the MediaCodec context. + * + * @param avctx codec context + * @param ctx MediaCodec context to initialize + * @param surface reference to an android/view/Surface + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface); + +/** + * This function must be called to free the MediaCodec context initialized with + * av_mediacodec_default_init(). + * + * @param avctx codec context + */ +void av_mediacodec_default_free(AVCodecContext *avctx); + +/** + * Opaque structure representing a MediaCodec buffer to render. + */ +typedef struct MediaCodecBuffer AVMediaCodecBuffer; + +/** + * Release a MediaCodec buffer and render it to the surface that is associated + * with the decoder. This function should only be called once on a given + * buffer, once released the underlying buffer returns to the codec, thus + * subsequent calls to this function will have no effect. + * + * @param buffer the buffer to render + * @param render 1 to release and render the buffer to the surface or 0 to + * discard the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/qsv.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/qsv.h new file mode 100644 index 0000000..b77158e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/qsv.h @@ -0,0 +1,107 @@ +/* + * Intel MediaSDK QSV public API + * + * 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 + */ + +#ifndef AVCODEC_QSV_H +#define AVCODEC_QSV_H + +#include + +#include "libavutil/buffer.h" + +/** + * This struct is used for communicating QSV parameters between libavcodec and + * the caller. It is managed by the caller and must be assigned to + * AVCodecContext.hwaccel_context. + * - decoding: hwaccel_context must be set on return from the get_format() + * callback + * - encoding: hwaccel_context must be set before avcodec_open2() + */ +typedef struct AVQSVContext { + /** + * If non-NULL, the session to use for encoding or decoding. + * Otherwise, libavcodec will try to create an internal session. + */ + mfxSession session; + + /** + * The IO pattern to use. + */ + int iopattern; + + /** + * Extra buffers to pass to encoder or decoder initialization. + */ + mfxExtBuffer **ext_buffers; + int nb_ext_buffers; + + /** + * Encoding only. If this field is set to non-zero by the caller, libavcodec + * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to + * the encoder initialization. This only makes sense if iopattern is also + * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. + * + * The number of allocated opaque surfaces will be the sum of the number + * required by the encoder and the user-provided value nb_opaque_surfaces. + * The array of the opaque surfaces will be exported to the caller through + * the opaque_surfaces field. + */ + int opaque_alloc; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. Before + * calling avcodec_open2(), the caller should set this field to the number + * of extra opaque surfaces to allocate beyond what is required by the + * encoder. + * + * On return from avcodec_open2(), this field will be set by libavcodec to + * the total number of allocated opaque surfaces. + */ + int nb_opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be used by libavcodec to export the + * array of the allocated opaque surfaces to the caller, so they can be + * passed to other parts of the pipeline. + * + * The buffer reference exported here is owned and managed by libavcodec, + * the callers should make their own reference with av_buffer_ref() and free + * it with av_buffer_unref() when it is no longer needed. + * + * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. + */ + AVBufferRef *opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be set to the surface type used in + * the opaque allocation request. + */ + int opaque_alloc_type; +} AVQSVContext; + +/** + * Allocate a new context. + * + * It must be freed by the caller with av_free(). + */ +AVQSVContext *av_qsv_alloc_context(void); + +#endif /* AVCODEC_QSV_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vaapi.h new file mode 100644 index 0000000..bb28455 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vaapi.h @@ -0,0 +1,195 @@ +/* + * Video Acceleration API (shared data between FFmpeg and the video player) + * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 + * + * Copyright (C) 2008-2009 Splitted-Desktop Systems + * + * 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 + */ + +#ifndef AVCODEC_VAAPI_H +#define AVCODEC_VAAPI_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vaapi + * Public libavcodec VA API header. + */ + +#include +#include "libavutil/attributes.h" +#include "version.h" + +#if FF_API_STRUCT_VAAPI_CONTEXT + +/** + * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding + * @ingroup lavc_codec_hwaccel + * @{ + */ + +/** + * This structure is used to share data between the FFmpeg library and + * the client video application. + * This shall be zero-allocated and available as + * AVCodecContext.hwaccel_context. All user members can be set once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * Deprecated: use AVCodecContext.hw_frames_ctx instead. + */ +struct attribute_deprecated vaapi_context { + /** + * Window system dependent data + * + * - encoding: unused + * - decoding: Set by user + */ + void *display; + + /** + * Configuration ID + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t config_id; + + /** + * Context ID (video decode pipeline) + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t context_id; + +#if FF_API_VAAPI_CONTEXT + /** + * VAPictureParameterBuffer ID + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t pic_param_buf_id; + + /** + * VAIQMatrixBuffer ID + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t iq_matrix_buf_id; + + /** + * VABitPlaneBuffer ID (for VC-1 decoding) + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t bitplane_buf_id; + + /** + * Slice parameter/data buffer IDs + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t *slice_buf_ids; + + /** + * Number of effective slice buffer IDs to send to the HW + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int n_slice_buf_ids; + + /** + * Size of pre-allocated slice_buf_ids + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_buf_ids_alloc; + + /** + * Pointer to VASliceParameterBuffers + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + void *slice_params; + + /** + * Size of a VASliceParameterBuffer element + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_param_size; + + /** + * Size of pre-allocated slice_params + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_params_alloc; + + /** + * Number of slices currently filled in + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_count; + + /** + * Pointer to slice data buffer base + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + const uint8_t *slice_data; + + /** + * Current size of slice data + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t slice_data_size; +#endif +}; + +/* @} */ + +#endif /* FF_API_STRUCT_VAAPI_CONTEXT */ + +#endif /* AVCODEC_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vda.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vda.h new file mode 100644 index 0000000..bde14e3 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vda.h @@ -0,0 +1,230 @@ +/* + * VDA HW acceleration + * + * copyright (c) 2011 Sebastien Zwickert + * + * 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 + */ + +#ifndef AVCODEC_VDA_H +#define AVCODEC_VDA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vda + * Public libavcodec VDA header. + */ + +#include "libavcodec/avcodec.h" + +#include + +// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes +// http://openradar.appspot.com/8026390 +#undef __GNUC_STDC_INLINE__ + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/version.h" + +// extra flags not defined in VDADecoder.h +enum { + kVDADecodeInfo_Asynchronous = 1UL << 0, + kVDADecodeInfo_FrameDropped = 1UL << 1 +}; + +/** + * @defgroup lavc_codec_hwaccel_vda VDA + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +/** + * This structure is used to provide the necessary configurations and data + * to the VDA FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct vda_context { + /** + * VDA decoder object. + * + * - encoding: unused + * - decoding: Set/Unset by libavcodec. + */ + VDADecoder decoder; + + /** + * The Core Video pixel buffer that contains the current image data. + * + * encoding: unused + * decoding: Set by libavcodec. Unset by user. + */ + CVPixelBufferRef cv_buffer; + + /** + * Use the hardware decoder in synchronous mode. + * + * encoding: unused + * decoding: Set by user. + */ + int use_sync_decoding; + + /** + * The frame width. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + int width; + + /** + * The frame height. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + int height; + + /** + * The frame format. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + int format; + + /** + * The pixel format for output image buffers. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + OSType cv_pix_fmt_type; + + /** + * unused + */ + uint8_t *priv_bitstream; + + /** + * unused + */ + int priv_bitstream_size; + + /** + * unused + */ + int priv_allocated_size; + + /** + * Use av_buffer to manage buffer. + * When the flag is set, the CVPixelBuffers returned by the decoder will + * be released automatically, so you have to retain them if necessary. + * Not setting this flag may cause memory leak. + * + * encoding: unused + * decoding: Set by user. + */ + int use_ref_buffer; +}; + +/** Create the video decoder. */ +int ff_vda_create_decoder(struct vda_context *vda_ctx, + uint8_t *extradata, + int extradata_size); + +/** Destroy the video decoder. */ +int ff_vda_destroy_decoder(struct vda_context *vda_ctx); + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing VDA decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_vda_alloc_context() and freed with av_free(). + */ +typedef struct AVVDAContext { + /** + * VDA decoder object. Created and freed by the caller. + */ + VDADecoder decoder; + + /** + * The output callback that must be passed to VDADecoderCreate. + * Set by av_vda_alloc_context(). + */ + VDADecoderOutputCallback output_callback; + + /** + * CVPixelBuffer Format Type that VDA will use for decoded frames; set by + * the caller. + */ + OSType cv_pix_fmt_type; +} AVVDAContext; + +/** + * Allocate and initialize a VDA context. + * + * This function should be called from the get_format() callback when the caller + * selects the AV_PIX_FMT_VDA format. The caller must then create the decoder + * object (using the output callback provided by libavcodec) that will be used + * for VDA-accelerated decoding. + * + * When decoding with VDA is finished, the caller must destroy the decoder + * object and free the VDA context using av_free(). + * + * @return the newly allocated context or NULL on failure + */ +AVVDAContext *av_vda_alloc_context(void); + +/** + * This is a convenience function that creates and sets up the VDA context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_vda_default_init(AVCodecContext *avctx); + +/** + * This is a convenience function that creates and sets up the VDA context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * @param vdactx the VDA context to use + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx); + +/** + * This function must be called to free the VDA context initialized with + * av_vda_default_init(). + * + * @param avctx the corresponding codec context + */ +void av_vda_default_free(AVCodecContext *avctx); + +/** + * @} + */ + +#endif /* AVCODEC_VDA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vdpau.h new file mode 100644 index 0000000..855d387 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vdpau.h @@ -0,0 +1,253 @@ +/* + * The Video Decode and Presentation API for UNIX (VDPAU) is used for + * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. + * + * Copyright (C) 2008 NVIDIA + * + * 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 + */ + +#ifndef AVCODEC_VDPAU_H +#define AVCODEC_VDPAU_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vdpau + * Public libavcodec VDPAU header. + */ + + +/** + * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer + * @ingroup lavc_codec_hwaccel + * + * VDPAU hardware acceleration has two modules + * - VDPAU decoding + * - VDPAU presentation + * + * The VDPAU decoding module parses all headers using FFmpeg + * parsing mechanisms and uses VDPAU for the actual decoding. + * + * As per the current implementation, the actual decoding + * and rendering (API calls) are done as part of the VDPAU + * presentation (vo_vdpau.c) module. + * + * @{ + */ + +#include + +#include "libavutil/avconfig.h" +#include "libavutil/attributes.h" + +#include "avcodec.h" +#include "version.h" + +#if FF_API_BUFS_VDPAU +union AVVDPAUPictureInfo { + VdpPictureInfoH264 h264; + VdpPictureInfoMPEG1Or2 mpeg; + VdpPictureInfoVC1 vc1; + VdpPictureInfoMPEG4Part2 mpeg4; +}; +#endif + +struct AVCodecContext; +struct AVFrame; + +typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, + const VdpPictureInfo *, uint32_t, + const VdpBitstreamBuffer *); + +/** + * This structure is used to share data between the libavcodec library and + * the client video application. + * The user shall allocate the structure via the av_alloc_vdpau_hwaccel + * function and make it available as + * AVCodecContext.hwaccel_context. Members can be set by the user once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * The size of this structure is not a part of the public ABI and must not + * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an + * AVVDPAUContext. + */ +typedef struct AVVDPAUContext { + /** + * VDPAU decoder handle + * + * Set by user. + */ + VdpDecoder decoder; + + /** + * VDPAU decoder render callback + * + * Set by the user. + */ + VdpDecoderRender *render; + +#if FF_API_BUFS_VDPAU + /** + * VDPAU picture information + * + * Set by libavcodec. + */ + attribute_deprecated + union AVVDPAUPictureInfo info; + + /** + * Allocated size of the bitstream_buffers table. + * + * Set by libavcodec. + */ + attribute_deprecated + int bitstream_buffers_allocated; + + /** + * Useful bitstream buffers in the bitstream buffers table. + * + * Set by libavcodec. + */ + attribute_deprecated + int bitstream_buffers_used; + + /** + * Table of bitstream buffers. + * The user is responsible for freeing this buffer using av_freep(). + * + * Set by libavcodec. + */ + attribute_deprecated + VdpBitstreamBuffer *bitstream_buffers; +#endif + AVVDPAU_Render2 render2; +} AVVDPAUContext; + +/** + * @brief allocation function for AVVDPAUContext + * + * Allows extending the struct without breaking API/ABI + */ +AVVDPAUContext *av_alloc_vdpaucontext(void); + +AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); +void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); + +/** + * Associate a VDPAU device with a codec context for hardware acceleration. + * This function is meant to be called from the get_format() codec callback, + * or earlier. It can also be called after avcodec_flush_buffers() to change + * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent + * display preemption). + * + * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes + * successfully. + * + * @param avctx decoding context whose get_format() callback is invoked + * @param device VDPAU device handle to use for hardware acceleration + * @param get_proc_address VDPAU device driver + * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags + * + * @return 0 on success, an AVERROR code on failure. + */ +int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, + VdpGetProcAddress *get_proc_address, unsigned flags); + +/** + * Gets the parameters to create an adequate VDPAU video surface for the codec + * context using VDPAU hardware decoding acceleration. + * + * @note Behavior is undefined if the context was not successfully bound to a + * VDPAU device using av_vdpau_bind_context(). + * + * @param avctx the codec context being used for decoding the stream + * @param type storage space for the VDPAU video surface chroma type + * (or NULL to ignore) + * @param width storage space for the VDPAU video surface pixel width + * (or NULL to ignore) + * @param height storage space for the VDPAU video surface pixel height + * (or NULL to ignore) + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, + uint32_t *width, uint32_t *height); + +/** + * Allocate an AVVDPAUContext. + * + * @return Newly-allocated AVVDPAUContext or NULL on failure. + */ +AVVDPAUContext *av_vdpau_alloc_context(void); + +#if FF_API_VDPAU_PROFILE +/** + * Get a decoder profile that should be used for initializing a VDPAU decoder. + * Should be called from the AVCodecContext.get_format() callback. + * + * @deprecated Use av_vdpau_bind_context() instead. + * + * @param avctx the codec context being used for decoding the stream + * @param profile a pointer into which the result will be written on success. + * The contents of profile are undefined if this function returns + * an error. + * + * @return 0 on success (non-negative), a negative AVERROR on failure. + */ +attribute_deprecated +int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile); +#endif + +#if FF_API_CAP_VDPAU +/** @brief The videoSurface is used for rendering. */ +#define FF_VDPAU_STATE_USED_FOR_RENDER 1 + +/** + * @brief The videoSurface is needed for reference/prediction. + * The codec manipulates this. + */ +#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2 + +/** + * @brief This structure is used as a callback between the FFmpeg + * decoder (vd_) and presentation (vo_) module. + * This is used for defining a video frame containing surface, + * picture parameter, bitstream information etc which are passed + * between the FFmpeg decoder and its clients. + */ +struct vdpau_render_state { + VdpVideoSurface surface; ///< Used as rendered surface, never changed. + + int state; ///< Holds FF_VDPAU_STATE_* values. + + /** picture parameter information for all supported codecs */ + union AVVDPAUPictureInfo info; + + /** Describe size/location of the compressed video data. + Set to 0 when freeing bitstream_buffers. */ + int bitstream_buffers_allocated; + int bitstream_buffers_used; + /** The user is responsible for freeing this buffer using av_freep(). */ + VdpBitstreamBuffer *bitstream_buffers; +}; +#endif + +/* @}*/ + +#endif /* AVCODEC_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/version.h new file mode 100644 index 0000000..10d9ac4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/version.h @@ -0,0 +1,243 @@ +/* + * 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 + */ + +#ifndef AVCODEC_VERSION_H +#define AVCODEC_VERSION_H + +/** + * @file + * @ingroup libavc + * Libavcodec version macros. + */ + +#include "libavutil/version.h" + +#define LIBAVCODEC_VERSION_MAJOR 57 +#define LIBAVCODEC_VERSION_MINOR 107 +#define LIBAVCODEC_VERSION_MICRO 100 + +#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT + +#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + */ + +#ifndef FF_API_VIMA_DECODER +#define FF_API_VIMA_DECODER (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AUDIO_CONVERT +#define FF_API_AUDIO_CONVERT (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AVCODEC_RESAMPLE +#define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT +#endif +#ifndef FF_API_MISSING_SAMPLE +#define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LOWRES +#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_CAP_VDPAU +#define FF_API_CAP_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_BUFS_VDPAU +#define FF_API_BUFS_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_VOXWARE +#define FF_API_VOXWARE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_SET_DIMENSIONS +#define FF_API_SET_DIMENSIONS (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_DEBUG_MV +#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AC_VLC +#define FF_API_AC_VLC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_OLD_MSMPEG4 +#define FF_API_OLD_MSMPEG4 (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ASPECT_EXTENDED +#define FF_API_ASPECT_EXTENDED (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ARCH_ALPHA +#define FF_API_ARCH_ALPHA (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_XVMC +#define FF_API_XVMC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ERROR_RATE +#define FF_API_ERROR_RATE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_QSCALE_TYPE +#define FF_API_QSCALE_TYPE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MB_TYPE +#define FF_API_MB_TYPE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MAX_BFRAMES +#define FF_API_MAX_BFRAMES (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_NEG_LINESIZES +#define FF_API_NEG_LINESIZES (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_EMU_EDGE +#define FF_API_EMU_EDGE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ARCH_SH4 +#define FF_API_ARCH_SH4 (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ARCH_SPARC +#define FF_API_ARCH_SPARC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_UNUSED_MEMBERS +#define FF_API_UNUSED_MEMBERS (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_IDCT_XVIDMMX +#define FF_API_IDCT_XVIDMMX (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_INPUT_PRESERVED +#define FF_API_INPUT_PRESERVED (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_NORMALIZE_AQP +#define FF_API_NORMALIZE_AQP (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_GMC +#define FF_API_GMC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MV0 +#define FF_API_MV0 (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_CODEC_NAME +#define FF_API_CODEC_NAME (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AFD +#define FF_API_AFD (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_VISMV +/* XXX: don't forget to drop the -vismv documentation */ +#define FF_API_VISMV (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AUDIOENC_DELAY +#define FF_API_AUDIOENC_DELAY (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_VAAPI_CONTEXT +#define FF_API_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MERGE_SD +#define FF_API_MERGE_SD (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AVCTX_TIMEBASE +#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MPV_OPT +#define FF_API_MPV_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STREAM_CODEC_TAG +#define FF_API_STREAM_CODEC_TAG (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_QUANT_BIAS +#define FF_API_QUANT_BIAS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_RC_STRATEGY +#define FF_API_RC_STRATEGY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODED_FRAME +#define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MOTION_EST +#define FF_API_MOTION_EST (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_WITHOUT_PREFIX +#define FF_API_WITHOUT_PREFIX (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_SIDEDATA_ONLY_PKT +#define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VDPAU_PROFILE +#define FF_API_VDPAU_PROFILE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CONVERGENCE_DURATION +#define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPICTURE +#define FF_API_AVPICTURE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPACKET_OLD_API +#define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_RTP_CALLBACK +#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VBV_DELAY +#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODER_TYPE +#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STAT_BITS +#define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_PRIVATE_OPT +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_ASS_TIMING +#define FF_API_ASS_TIMING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_BSF +#define FF_API_OLD_BSF (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_COPY_CONTEXT +#define FF_API_COPY_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GET_CONTEXT_DEFAULTS +#define FF_API_GET_CONTEXT_DEFAULTS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NVENC_OLD_NAME +#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STRUCT_VAAPI_CONTEXT +#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MERGE_SD_API +#define FF_API_MERGE_SD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_TAG_STRING +#define FF_API_TAG_STRING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GETCHROMA +#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 59) +#endif + + +#endif /* AVCODEC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/videotoolbox.h new file mode 100644 index 0000000..af2db0d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/videotoolbox.h @@ -0,0 +1,127 @@ +/* + * Videotoolbox hardware acceleration + * + * copyright (c) 2012 Sebastien Zwickert + * + * 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 + */ + +#ifndef AVCODEC_VIDEOTOOLBOX_H +#define AVCODEC_VIDEOTOOLBOX_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_videotoolbox + * Public libavcodec Videotoolbox header. + */ + +#include + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/avcodec.h" + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing Videotoolbox decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_videotoolbox_alloc_context() and freed with av_free(). + */ +typedef struct AVVideotoolboxContext { + /** + * Videotoolbox decompression session object. + * Created and freed the caller. + */ + VTDecompressionSessionRef session; + + /** + * The output callback that must be passed to the session. + * Set by av_videottoolbox_default_init() + */ + VTDecompressionOutputCallback output_callback; + + /** + * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames. + * set by the caller. If this is set to 0, then no specific format is + * requested from the decoder, and its native format is output. + */ + OSType cv_pix_fmt_type; + + /** + * CoreMedia Format Description that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + CMVideoFormatDescriptionRef cm_fmt_desc; + + /** + * CoreMedia codec type that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + int cm_codec_type; +} AVVideotoolboxContext; + +/** + * Allocate and initialize a Videotoolbox context. + * + * This function should be called from the get_format() callback when the caller + * selects the AV_PIX_FMT_VIDETOOLBOX format. The caller must then create + * the decoder object (using the output callback provided by libavcodec) that + * will be used for Videotoolbox-accelerated decoding. + * + * When decoding with Videotoolbox is finished, the caller must destroy the decoder + * object and free the Videotoolbox context using av_free(). + * + * @return the newly allocated context or NULL on failure + */ +AVVideotoolboxContext *av_videotoolbox_alloc_context(void); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init(AVCodecContext *avctx); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * @param vtctx the Videotoolbox context to use + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx); + +/** + * This function must be called to free the Videotoolbox context initialized with + * av_videotoolbox_default_init(). + * + * @param avctx the corresponding codec context + */ +void av_videotoolbox_default_free(AVCodecContext *avctx); + +/** + * @} + */ + +#endif /* AVCODEC_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vorbis_parser.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vorbis_parser.h new file mode 100644 index 0000000..789932a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/vorbis_parser.h @@ -0,0 +1,74 @@ +/* + * 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 + * A public API for Vorbis parsing + * + * Determines the duration for each packet. + */ + +#ifndef AVCODEC_VORBIS_PARSER_H +#define AVCODEC_VORBIS_PARSER_H + +#include + +typedef struct AVVorbisParseContext AVVorbisParseContext; + +/** + * Allocate and initialize the Vorbis parser using headers in the extradata. + */ +AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata, + int extradata_size); + +/** + * Free the parser and everything associated with it. + */ +void av_vorbis_parse_free(AVVorbisParseContext **s); + +#define VORBIS_FLAG_HEADER 0x00000001 +#define VORBIS_FLAG_COMMENT 0x00000002 +#define VORBIS_FLAG_SETUP 0x00000004 + +/** + * Get the duration for a Vorbis packet. + * + * If @p flags is @c NULL, + * special frames are considered invalid. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + * @param flags flags for special frames + */ +int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size, int *flags); + +/** + * Get the duration for a Vorbis packet. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + */ +int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size); + +void av_vorbis_parse_reset(AVVorbisParseContext *s); + +#endif /* AVCODEC_VORBIS_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/xvmc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/xvmc.h new file mode 100644 index 0000000..465ee78 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavcodec/xvmc.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2003 Ivan Kalvachev + * + * 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 + */ + +#ifndef AVCODEC_XVMC_H +#define AVCODEC_XVMC_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_xvmc + * Public libavcodec XvMC header. + */ + +#include + +#include "libavutil/attributes.h" +#include "version.h" +#include "avcodec.h" + +/** + * @defgroup lavc_codec_hwaccel_xvmc XvMC + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct + the number is 1337 speak for the letters IDCT MCo (motion compensation) */ + +struct attribute_deprecated xvmc_pix_fmt { + /** The field contains the special constant value AV_XVMC_ID. + It is used as a test that the application correctly uses the API, + and that there is no corruption caused by pixel routines. + - application - set during initialization + - libavcodec - unchanged + */ + int xvmc_id; + + /** Pointer to the block array allocated by XvMCCreateBlocks(). + The array has to be freed by XvMCDestroyBlocks(). + Each group of 64 values represents one data block of differential + pixel information (in MoCo mode) or coefficients for IDCT. + - application - set the pointer during initialization + - libavcodec - fills coefficients/pixel data into the array + */ + short* data_blocks; + + /** Pointer to the macroblock description array allocated by + XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). + - application - set the pointer during initialization + - libavcodec - fills description data into the array + */ + XvMCMacroBlock* mv_blocks; + + /** Number of macroblock descriptions that can be stored in the mv_blocks + array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_mv_blocks; + + /** Number of blocks that can be stored at once in the data_blocks array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_data_blocks; + + /** Indicate that the hardware would interpret data_blocks as IDCT + coefficients and perform IDCT on them. + - application - set during initialization + - libavcodec - unchanged + */ + int idct; + + /** In MoCo mode it indicates that intra macroblocks are assumed to be in + unsigned format; same as the XVMC_INTRA_UNSIGNED flag. + - application - set during initialization + - libavcodec - unchanged + */ + int unsigned_intra; + + /** Pointer to the surface allocated by XvMCCreateSurface(). + It has to be freed by XvMCDestroySurface() on application exit. + It identifies the frame and its state on the video hardware. + - application - set during initialization + - libavcodec - unchanged + */ + XvMCSurface* p_surface; + +/** Set by the decoder before calling ff_draw_horiz_band(), + needed by the XvMCRenderSurface function. */ +//@{ + /** Pointer to the surface used as past reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_past_surface; + + /** Pointer to the surface used as future reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_future_surface; + + /** top/bottom field or frame + - application - unchanged + - libavcodec - set + */ + unsigned int picture_structure; + + /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence + - application - unchanged + - libavcodec - set + */ + unsigned int flags; +//}@ + + /** Number of macroblock descriptions in the mv_blocks array + that have already been passed to the hardware. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may increment it + with filled_mb_block_num or zero both. + - libavcodec - unchanged + */ + int start_mv_blocks_num; + + /** Number of new macroblock descriptions in the mv_blocks array (after + start_mv_blocks_num) that are filled by libavcodec and have to be + passed to the hardware. + - application - zeroes it on get_buffer() or after successful + ff_draw_horiz_band(). + - libavcodec - increment with one of each stored MB + */ + int filled_mv_blocks_num; + + /** Number of the next free data block; one data block consists of + 64 short values in the data_blocks array. + All blocks before this one have already been claimed by placing their + position into the corresponding block description structure field, + that are part of the mv_blocks array. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may zero it together + with start_mb_blocks_num. + - libavcodec - each decoded macroblock increases it by the number + of coded blocks it contains. + */ + int next_free_data_block_num; +}; + +/** + * @} + */ + +#endif /* AVCODEC_XVMC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/avdevice.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/avdevice.h new file mode 100644 index 0000000..ee94624 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/avdevice.h @@ -0,0 +1,514 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_AVDEVICE_H +#define AVDEVICE_AVDEVICE_H + +#include "version.h" + +/** + * @file + * @ingroup lavd + * Main libavdevice API header + */ + +/** + * @defgroup lavd libavdevice + * Special devices muxing/demuxing library. + * + * Libavdevice is a complementary library to @ref libavf "libavformat". It + * provides various "special" platform-specific muxers and demuxers, e.g. for + * grabbing devices, audio capture and playback etc. As a consequence, the + * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own + * I/O functions). The filename passed to avformat_open_input() often does not + * refer to an actually existing file, but has some special device-specific + * meaning - e.g. for xcbgrab it is the display name. + * + * To use libavdevice, simply call avdevice_register_all() to register all + * compiled muxers and demuxers. They all use standard libavformat API. + * + * @{ + */ + +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/dict.h" +#include "libavformat/avformat.h" + +/** + * Return the LIBAVDEVICE_VERSION_INT constant. + */ +unsigned avdevice_version(void); + +/** + * Return the libavdevice build-time configuration. + */ +const char *avdevice_configuration(void); + +/** + * Return the libavdevice license. + */ +const char *avdevice_license(void); + +/** + * Initialize libavdevice and register all the input and output devices. + */ +void avdevice_register_all(void); + +/** + * Audio input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_audio_device_next(AVInputFormat *d); + +/** + * Video input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_video_device_next(AVInputFormat *d); + +/** + * Audio output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); + +/** + * Video output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); + +typedef struct AVDeviceRect { + int x; /**< x coordinate of top left corner */ + int y; /**< y coordinate of top left corner */ + int width; /**< width */ + int height; /**< height */ +} AVDeviceRect; + +/** + * Message types used by avdevice_app_to_dev_control_message(). + */ +enum AVAppToDevMessageType { + /** + * Dummy message. + */ + AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), + + /** + * Window size change message. + * + * Message is sent to the device every time the application changes the size + * of the window device renders to. + * Message should also be sent right after window is created. + * + * data: AVDeviceRect: new window size. + */ + AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), + + /** + * Repaint request message. + * + * Message is sent to the device when window has to be repainted. + * + * data: AVDeviceRect: area required to be repainted. + * NULL: whole area is required to be repainted. + */ + AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), + + /** + * Request pause/play. + * + * Application requests pause/unpause playback. + * Mostly usable with devices that have internal buffer. + * By default devices are not paused. + * + * data: NULL + */ + AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '), + AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'), + AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), + + /** + * Volume control message. + * + * Set volume level. It may be device-dependent if volume + * is changed per stream or system wide. Per stream volume + * change is expected when possible. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), + + /** + * Mute control messages. + * + * Change mute state. It may be device-dependent if mute status + * is changed per stream or system wide. Per stream mute status + * change is expected when possible. + * + * data: NULL. + */ + AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'), + AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'), + AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), + + /** + * Get volume/mute messages. + * + * Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or + * AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively. + * + * data: NULL. + */ + AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), + AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'), +}; + +/** + * Message types used by avdevice_dev_to_app_control_message(). + */ +enum AVDevToAppMessageType { + /** + * Dummy message. + */ + AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), + + /** + * Create window buffer message. + * + * Device requests to create a window buffer. Exact meaning is device- + * and application-dependent. Message is sent before rendering first + * frame and all one-shot initializations should be done here. + * Application is allowed to ignore preferred window buffer size. + * + * @note: Application is obligated to inform about window buffer size + * with AV_APP_TO_DEV_WINDOW_SIZE message. + * + * data: AVDeviceRect: preferred size of the window buffer. + * NULL: no preferred size of the window buffer. + */ + AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), + + /** + * Prepare window buffer message. + * + * Device requests to prepare a window buffer for rendering. + * Exact meaning is device- and application-dependent. + * Message is sent before rendering of each frame. + * + * data: NULL. + */ + AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'), + + /** + * Display window buffer message. + * + * Device requests to display a window buffer. + * Message is sent when new frame is ready to be displayed. + * Usually buffers need to be swapped in handler of this message. + * + * data: NULL. + */ + AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), + + /** + * Destroy window buffer message. + * + * Device requests to destroy a window buffer. + * Message is sent when device is about to be destroyed and window + * buffer is not required anymore. + * + * data: NULL. + */ + AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), + + /** + * Buffer fullness status messages. + * + * Device signals buffer overflow/underflow. + * + * data: NULL. + */ + AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), + AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), + + /** + * Buffer readable/writable. + * + * Device informs that buffer is readable/writable. + * When possible, device informs how many bytes can be read/write. + * + * @warning Device may not inform when number of bytes than can be read/write changes. + * + * data: int64_t: amount of bytes available to read/write. + * NULL: amount of bytes available to read/write is not known. + */ + AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), + AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), + + /** + * Mute state change message. + * + * Device informs that mute state has changed. + * + * data: int: 0 for not muted state, non-zero for muted state. + */ + AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), + + /** + * Volume level change message. + * + * Device informs that volume level has changed. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'), +}; + +/** + * Send control message from application to device. + * + * @param s device context. + * @param type message type. + * @param data message data. Exact type depends on message type. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when device doesn't implement handler of the message. + */ +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, + enum AVAppToDevMessageType type, + void *data, size_t data_size); + +/** + * Send control message from device to application. + * + * @param s device context. + * @param type message type. + * @param data message data. Can be NULL. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when application doesn't implement handler of the message. + */ +int avdevice_dev_to_app_control_message(struct AVFormatContext *s, + enum AVDevToAppMessageType type, + void *data, size_t data_size); + +/** + * Following API allows user to probe device capabilities (supported codecs, + * pixel formats, sample formats, resolutions, channel counts, etc). + * It is build on top op AVOption API. + * Queried capabilities make it possible to set up converters of video or audio + * parameters that fit to the device. + * + * List of capabilities that can be queried: + * - Capabilities valid for both audio and video devices: + * - codec: supported audio/video codecs. + * type: AV_OPT_TYPE_INT (AVCodecID value) + * - Capabilities valid for audio devices: + * - sample_format: supported sample formats. + * type: AV_OPT_TYPE_INT (AVSampleFormat value) + * - sample_rate: supported sample rates. + * type: AV_OPT_TYPE_INT + * - channels: supported number of channels. + * type: AV_OPT_TYPE_INT + * - channel_layout: supported channel layouts. + * type: AV_OPT_TYPE_INT64 + * - Capabilities valid for video devices: + * - pixel_format: supported pixel formats. + * type: AV_OPT_TYPE_INT (AVPixelFormat value) + * - window_size: supported window sizes (describes size of the window size presented to the user). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - frame_size: supported frame sizes (describes size of provided video frames). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - fps: supported fps values + * type: AV_OPT_TYPE_RATIONAL + * + * Value of the capability may be set by user using av_opt_set() function + * and AVDeviceCapabilitiesQuery object. Following queries will + * limit results to the values matching already set capabilities. + * For example, setting a codec may impact number of formats or fps values + * returned during next query. Setting invalid value may limit results to zero. + * + * Example of the usage basing on opengl output device: + * + * @code + * AVFormatContext *oc = NULL; + * AVDeviceCapabilitiesQuery *caps = NULL; + * AVOptionRanges *ranges; + * int ret; + * + * if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0) + * goto fail; + * if (avdevice_capabilities_create(&caps, oc, NULL) < 0) + * goto fail; + * + * //query codecs + * if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick codec here and set it + * av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0); + * + * //query format + * if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick format here and set it + * av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0); + * + * //query and set more capabilities + * + * fail: + * //clean up code + * avdevice_capabilities_free(&query, oc); + * avformat_free_context(oc); + * @endcode + */ + +/** + * Structure describes device capabilities. + * + * It is used by devices in conjunction with av_device_capabilities AVOption table + * to implement capabilities probing API based on AVOption API. Should not be used directly. + */ +typedef struct AVDeviceCapabilitiesQuery { + const AVClass *av_class; + AVFormatContext *device_context; + enum AVCodecID codec; + enum AVSampleFormat sample_format; + enum AVPixelFormat pixel_format; + int sample_rate; + int channels; + int64_t channel_layout; + int window_width; + int window_height; + int frame_width; + int frame_height; + AVRational fps; +} AVDeviceCapabilitiesQuery; + +/** + * AVOption table used by devices to implement device capabilities API. Should not be used by a user. + */ +extern const AVOption av_device_capabilities[]; + +/** + * Initialize capabilities probing API based on AVOption API. + * + * avdevice_capabilities_free() must be called when query capabilities API is + * not used anymore. + * + * @param[out] caps Device capabilities data. Pointer to a NULL pointer must be passed. + * @param s Context of the device. + * @param device_options An AVDictionary filled with device-private options. + * On return this parameter will be destroyed and replaced with a dict + * containing options that were not found. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * + * @return >= 0 on success, negative otherwise. + */ +int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, + AVDictionary **device_options); + +/** + * Free resources created by avdevice_capabilities_create() + * + * @param caps Device capabilities data to be freed. + * @param s Context of the device. + */ +void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); + +/** + * Structure describes basic parameters of the device. + */ +typedef struct AVDeviceInfo { + char *device_name; /**< device name, format depends on device */ + char *device_description; /**< human friendly name */ +} AVDeviceInfo; + +/** + * List of devices. + */ +typedef struct AVDeviceInfoList { + AVDeviceInfo **devices; /**< list of autodetected devices */ + int nb_devices; /**< number of autodetected devices */ + int default_device; /**< index of default device or -1 if no default */ +} AVDeviceInfoList; + +/** + * List devices. + * + * Returns available device names and their parameters. + * + * @note: Some devices may accept system-dependent device names that cannot be + * autodetected. The list returned by this function cannot be assumed to + * be always completed. + * + * @param s device context. + * @param[out] device_list list of autodetected devices. + * @return count of autodetected devices, negative on error. + */ +int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list); + +/** + * Convenient function to free result of avdevice_list_devices(). + * + * @param devices device list to be freed. + */ +void avdevice_free_list_devices(AVDeviceInfoList **device_list); + +/** + * List devices. + * + * Returns available device names and their parameters. + * These are convinient wrappers for avdevice_list_devices(). + * Device context is allocated and deallocated internally. + * + * @param device device format. May be NULL if device name is set. + * @param device_name device name. May be NULL if device format is set. + * @param device_options An AVDictionary filled with device-private options. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * @param[out] device_list list of autodetected devices + * @return count of autodetected devices, negative on error. + * @note device argument takes precedence over device_name when both are set. + */ +int avdevice_list_input_sources(struct AVInputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); +int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); + +/** + * @} + */ + +#endif /* AVDEVICE_AVDEVICE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/version.h new file mode 100644 index 0000000..9d90087 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavdevice/version.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_VERSION_H +#define AVDEVICE_VERSION_H + +/** + * @file + * @ingroup lavd + * Libavdevice version macros + */ + +#include "libavutil/version.h" + +#define LIBAVDEVICE_VERSION_MAJOR 57 +#define LIBAVDEVICE_VERSION_MINOR 10 +#define LIBAVDEVICE_VERSION_MICRO 100 + +#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT + +#define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* AVDEVICE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfilter.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfilter.h new file mode 100644 index 0000000..73a723d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfilter.h @@ -0,0 +1,1197 @@ +/* + * filter layer + * Copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTER_H +#define AVFILTER_AVFILTER_H + +/** + * @file + * @ingroup lavfi + * Main libavfilter public API header + */ + +/** + * @defgroup lavfi libavfilter + * Graph-based frame editing library. + * + * @{ + */ + +#include + +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/samplefmt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "libavfilter/version.h" + +/** + * Return the LIBAVFILTER_VERSION_INT constant. + */ +unsigned avfilter_version(void); + +/** + * Return the libavfilter build-time configuration. + */ +const char *avfilter_configuration(void); + +/** + * Return the libavfilter license. + */ +const char *avfilter_license(void); + +typedef struct AVFilterContext AVFilterContext; +typedef struct AVFilterLink AVFilterLink; +typedef struct AVFilterPad AVFilterPad; +typedef struct AVFilterFormats AVFilterFormats; + +/** + * Get the number of elements in a NULL-terminated array of AVFilterPads (e.g. + * AVFilter.inputs/outputs). + */ +int avfilter_pad_count(const AVFilterPad *pads); + +/** + * Get the name of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array it; is the caller's + * responsibility to ensure the index is valid + * + * @return name of the pad_idx'th pad in pads + */ +const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx); + +/** + * Get the type of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array; it is the caller's + * responsibility to ensure the index is valid + * + * @return type of the pad_idx'th pad in pads + */ +enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx); + +/** + * The number of the filter inputs is not determined just by AVFilter.inputs. + * The filter might add additional inputs during initialization depending on the + * options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_INPUTS (1 << 0) +/** + * The number of the filter outputs is not determined just by AVFilter.outputs. + * The filter might add additional outputs during initialization depending on + * the options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_OUTPUTS (1 << 1) +/** + * The filter supports multithreading by splitting frames into multiple parts + * and processing them concurrently. + */ +#define AVFILTER_FLAG_SLICE_THREADS (1 << 2) +/** + * Some filters support a generic "enable" expression option that can be used + * to enable or disable a filter in the timeline. Filters supporting this + * option have this flag set. When the enable expression is false, the default + * no-op filter_frame() function is called in place of the filter_frame() + * callback defined on each input pad, thus the frame is passed unchanged to + * the next filters. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC (1 << 16) +/** + * Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will + * have its filter_frame() callback(s) called as usual even when the enable + * expression is false. The filter will disable filtering within the + * filter_frame() callback(s) itself, for example executing code depending on + * the AVFilterContext->is_disabled value. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL (1 << 17) +/** + * Handy mask to test whether the filter supports or no the timeline feature + * (internally or generically). + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL) + +/** + * Filter definition. This defines the pads a filter contains, and all the + * callback functions used to interact with the filter. + */ +typedef struct AVFilter { + /** + * Filter name. Must be non-NULL and unique among filters. + */ + const char *name; + + /** + * A description of the filter. May be NULL. + * + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *description; + + /** + * List of inputs, terminated by a zeroed element. + * + * NULL if there are no (static) inputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in + * this list. + */ + const AVFilterPad *inputs; + /** + * List of outputs, terminated by a zeroed element. + * + * NULL if there are no (static) outputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in + * this list. + */ + const AVFilterPad *outputs; + + /** + * A class for the private data, used to declare filter private AVOptions. + * This field is NULL for filters that do not declare any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavfilter generic + * code to this class. + */ + const AVClass *priv_class; + + /** + * A combination of AVFILTER_FLAG_* + */ + int flags; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Filter pre-initialization function + * + * This callback will be called immediately after the filter context is + * allocated, to allow allocating and initing sub-objects. + * + * If this callback is not NULL, the uninit callback will be called on + * allocation failure. + * + * @return 0 on success, + * AVERROR code on failure (but the code will be + * dropped and treated as ENOMEM by the calling code) + */ + int (*preinit)(AVFilterContext *ctx); + + /** + * Filter initialization function. + * + * This callback will be called only once during the filter lifetime, after + * all the options have been set, but before links between filters are + * established and format negotiation is done. + * + * Basic filter initialization should be done here. Filters with dynamic + * inputs and/or outputs should create those inputs/outputs here based on + * provided options. No more changes to this filter's inputs/outputs can be + * done after this callback. + * + * This callback must not assume that the filter links exist or frame + * parameters are known. + * + * @ref AVFilter.uninit "uninit" is guaranteed to be called even if + * initialization fails, so this callback does not have to clean up on + * failure. + * + * @return 0 on success, a negative AVERROR on failure + */ + int (*init)(AVFilterContext *ctx); + + /** + * Should be set instead of @ref AVFilter.init "init" by the filters that + * want to pass a dictionary of AVOptions to nested contexts that are + * allocated during init. + * + * On return, the options dict should be freed and replaced with one that + * contains all the options which could not be processed by this filter (or + * with NULL if all the options were processed). + * + * Otherwise the semantics is the same as for @ref AVFilter.init "init". + */ + int (*init_dict)(AVFilterContext *ctx, AVDictionary **options); + + /** + * Filter uninitialization function. + * + * Called only once right before the filter is freed. Should deallocate any + * memory held by the filter, release any buffer references, etc. It does + * not need to deallocate the AVFilterContext.priv memory itself. + * + * This callback may be called even if @ref AVFilter.init "init" was not + * called or failed, so it must be prepared to handle such a situation. + */ + void (*uninit)(AVFilterContext *ctx); + + /** + * Query formats supported by the filter on its inputs and outputs. + * + * This callback is called after the filter is initialized (so the inputs + * and outputs are fixed), shortly before the format negotiation. This + * callback may be called more than once. + * + * This callback must set AVFilterLink.out_formats on every input link and + * AVFilterLink.in_formats on every output link to a list of pixel/sample + * formats that the filter supports on that link. For audio links, this + * filter must also set @ref AVFilterLink.in_samplerates "in_samplerates" / + * @ref AVFilterLink.out_samplerates "out_samplerates" and + * @ref AVFilterLink.in_channel_layouts "in_channel_layouts" / + * @ref AVFilterLink.out_channel_layouts "out_channel_layouts" analogously. + * + * This callback may be NULL for filters with one input, in which case + * libavfilter assumes that it supports all input formats and preserves + * them on output. + * + * @return zero on success, a negative value corresponding to an + * AVERROR code otherwise + */ + int (*query_formats)(AVFilterContext *); + + int priv_size; ///< size of private data to allocate for the filter + + int flags_internal; ///< Additional flags for avfilter internal use only. + + /** + * Used by the filter registration system. Must not be touched by any other + * code. + */ + struct AVFilter *next; + + /** + * Make the filter instance process a command. + * + * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. + * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be + * time consuming then a filter should treat it like an unsupported command + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ + int (*process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags); + + /** + * Filter initialization function, alternative to the init() + * callback. Args contains the user-supplied parameters, opaque is + * used for providing binary data. + */ + int (*init_opaque)(AVFilterContext *ctx, void *opaque); + + /** + * Filter activation function. + * + * Called when any processing is needed from the filter, instead of any + * filter_frame and request_frame on pads. + * + * The function must examine inlinks and outlinks and perform a single + * step of processing. If there is nothing to do, the function must do + * nothing and not return an error. If more steps are or may be + * possible, it must use ff_filter_set_ready() to schedule another + * activation. + */ + int (*activate)(AVFilterContext *ctx); +} AVFilter; + +/** + * Process multiple parts of the frame concurrently. + */ +#define AVFILTER_THREAD_SLICE (1 << 0) + +typedef struct AVFilterInternal AVFilterInternal; + +/** An instance of a filter */ +struct AVFilterContext { + const AVClass *av_class; ///< needed for av_log() and filters common options + + const AVFilter *filter; ///< the AVFilter of which this is an instance + + char *name; ///< name of this filter instance + + AVFilterPad *input_pads; ///< array of input pads + AVFilterLink **inputs; ///< array of pointers to input links + unsigned nb_inputs; ///< number of input pads + + AVFilterPad *output_pads; ///< array of output pads + AVFilterLink **outputs; ///< array of pointers to output links + unsigned nb_outputs; ///< number of output pads + + void *priv; ///< private data for use by the filter + + struct AVFilterGraph *graph; ///< filtergraph this filter belongs to + + /** + * Type of multithreading being allowed/used. A combination of + * AVFILTER_THREAD_* flags. + * + * May be set by the caller before initializing the filter to forbid some + * or all kinds of multithreading for this filter. The default is allowing + * everything. + * + * When the filter is initialized, this field is combined using bit AND with + * AVFilterGraph.thread_type to get the final mask used for determining + * allowed threading types. I.e. a threading type needs to be set in both + * to be allowed. + * + * After the filter is initialized, libavfilter sets this field to the + * threading type that is actually used (0 for no multithreading). + */ + int thread_type; + + /** + * An opaque struct for libavfilter internal use. + */ + AVFilterInternal *internal; + + struct AVFilterCommand *command_queue; + + char *enable_str; ///< enable expression string + void *enable; ///< parsed expression (AVExpr*) + double *var_values; ///< variable values for the enable expression + int is_disabled; ///< the enabled state from the last expression evaluation + + /** + * For filters which will create hardware frames, sets the device the + * filter should create them in. All other filters will ignore this field: + * in particular, a filter which consumes or processes hardware frames will + * instead use the hw_frames_ctx field in AVFilterLink to carry the + * hardware context information. + */ + AVBufferRef *hw_device_ctx; + + /** + * Max number of threads allowed in this filter instance. + * If <= 0, its value is ignored. + * Overrides global number of threads set per filter graph. + */ + int nb_threads; + + /** + * Ready status of the filter. + * A non-0 value means that the filter needs activating; + * a higher value suggests a more urgent activation. + */ + unsigned ready; +}; + +/** + * A link between two filters. This contains pointers to the source and + * destination filters between which this link exists, and the indexes of + * the pads involved. In addition, this link also contains the parameters + * which have been negotiated and agreed upon between the filter, such as + * image dimensions, format, etc. + * + * Applications must not normally access the link structure directly. + * Use the buffersrc and buffersink API instead. + * In the future, access to the header may be reserved for filters + * implementation. + */ +struct AVFilterLink { + AVFilterContext *src; ///< source filter + AVFilterPad *srcpad; ///< output pad on the source filter + + AVFilterContext *dst; ///< dest filter + AVFilterPad *dstpad; ///< input pad on the dest filter + + enum AVMediaType type; ///< filter media type + + /* These parameters apply only to video */ + int w; ///< agreed upon image width + int h; ///< agreed upon image height + AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio + /* These parameters apply only to audio */ + uint64_t channel_layout; ///< channel layout of current buffer (see libavutil/channel_layout.h) + int sample_rate; ///< samples per second + + int format; ///< agreed upon media format + + /** + * Define the time base used by the PTS of the frames/samples + * which will pass through this link. + * During the configuration stage, each filter is supposed to + * change only the output timebase, while the timebase of the + * input link is assumed to be an unchangeable property. + */ + AVRational time_base; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + /** + * Lists of formats and channel layouts supported by the input and output + * filters respectively. These lists are used for negotiating the format + * to actually be used, which will be loaded into the format and + * channel_layout members, above, when chosen. + * + */ + AVFilterFormats *in_formats; + AVFilterFormats *out_formats; + + /** + * Lists of channel layouts and sample rates used for automatic + * negotiation. + */ + AVFilterFormats *in_samplerates; + AVFilterFormats *out_samplerates; + struct AVFilterChannelLayouts *in_channel_layouts; + struct AVFilterChannelLayouts *out_channel_layouts; + + /** + * Audio only, the destination filter sets this to a non-zero value to + * request that buffers with the given number of samples should be sent to + * it. AVFilterPad.needs_fifo must also be set on the corresponding input + * pad. + * Last buffer before EOF will be padded with silence. + */ + int request_samples; + + /** stage of the initialization of the link properties (dimensions, etc) */ + enum { + AVLINK_UNINIT = 0, ///< not started + AVLINK_STARTINIT, ///< started, but incomplete + AVLINK_INIT ///< complete + } init_state; + + /** + * Graph the filter belongs to. + */ + struct AVFilterGraph *graph; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in link time_base units. + */ + int64_t current_pts; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in AV_TIME_BASE units. + */ + int64_t current_pts_us; + + /** + * Index in the age array. + */ + int age_index; + + /** + * Frame rate of the stream on the link, or 1/0 if unknown or variable; + * if left to 0/0, will be automatically copied from the first input + * of the source filter if it exists. + * + * Sources should set it to the best estimation of the real frame rate. + * If the source frame rate is unknown or variable, set this to 1/0. + * Filters should update it if necessary depending on their function. + * Sinks can use it to set a default output frame rate. + * It is similar to the r_frame_rate field in AVStream. + */ + AVRational frame_rate; + + /** + * Buffer partially filled with samples to achieve a fixed/minimum size. + */ + AVFrame *partial_buf; + + /** + * Size of the partial buffer to allocate. + * Must be between min_samples and max_samples. + */ + int partial_buf_size; + + /** + * Minimum number of samples to filter at once. If filter_frame() is + * called with fewer samples, it will accumulate them in partial_buf. + * This field and the related ones must not be changed after filtering + * has started. + * If 0, all related fields are ignored. + */ + int min_samples; + + /** + * Maximum number of samples to filter at once. If filter_frame() is + * called with more samples, it will split them. + */ + int max_samples; + + /** + * Number of channels. + */ + int channels; + + /** + * Link processing flags. + */ + unsigned flags; + + /** + * Number of past frames sent through the link. + */ + int64_t frame_count_in, frame_count_out; + + /** + * A pointer to a FFFramePool struct. + */ + void *frame_pool; + + /** + * True if a frame is currently wanted on the output of this filter. + * Set when ff_request_frame() is called by the output, + * cleared when a frame is filtered. + */ + int frame_wanted_out; + + /** + * For hwaccel pixel formats, this should be a reference to the + * AVHWFramesContext describing the frames. + */ + AVBufferRef *hw_frames_ctx; + +#ifndef FF_INTERNAL_FIELDS + + /** + * Internal structure members. + * The fields below this limit are internal for libavfilter's use + * and must in no way be accessed by applications. + */ + char reserved[0xF000]; + +#else /* FF_INTERNAL_FIELDS */ + + /** + * Queue of frames waiting to be filtered. + */ + FFFrameQueue fifo; + + /** + * If set, the source filter can not generate a frame as is. + * The goal is to avoid repeatedly calling the request_frame() method on + * the same link. + */ + int frame_blocked_in; + + /** + * Link input status. + * If not zero, all attempts of filter_frame will fail with the + * corresponding code. + */ + int status_in; + + /** + * Timestamp of the input status change. + */ + int64_t status_in_pts; + + /** + * Link output status. + * If not zero, all attempts of request_frame will fail with the + * corresponding code. + */ + int status_out; + +#endif /* FF_INTERNAL_FIELDS */ + +}; + +/** + * Link two filters together. + * + * @param src the source filter + * @param srcpad index of the output pad on the source filter + * @param dst the destination filter + * @param dstpad index of the input pad on the destination filter + * @return zero on success + */ +int avfilter_link(AVFilterContext *src, unsigned srcpad, + AVFilterContext *dst, unsigned dstpad); + +/** + * Free the link in *link, and set its pointer to NULL. + */ +void avfilter_link_free(AVFilterLink **link); + +/** + * Get the number of channels of a link. + */ +int avfilter_link_get_channels(AVFilterLink *link); + +/** + * Set the closed field of a link. + * @deprecated applications are not supposed to mess with links, they should + * close the sinks. + */ +attribute_deprecated +void avfilter_link_set_closed(AVFilterLink *link, int closed); + +/** + * Negotiate the media format, dimensions, etc of all inputs to a filter. + * + * @param filter the filter to negotiate the properties for its inputs + * @return zero on successful negotiation + */ +int avfilter_config_links(AVFilterContext *filter); + +#define AVFILTER_CMD_FLAG_ONE 1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically +#define AVFILTER_CMD_FLAG_FAST 2 ///< Only execute command when its fast (like a video out that supports contrast adjustment in hw) + +/** + * Make the filter instance process a command. + * It is recommended to use avfilter_graph_send_command(). + */ +int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** Initialize the filter system. Register all builtin filters. */ +void avfilter_register_all(void); + +#if FF_API_OLD_FILTER_REGISTER +/** Uninitialize the filter system. Unregister all filters. */ +attribute_deprecated +void avfilter_uninit(void); +#endif + +/** + * Register a filter. This is only needed if you plan to use + * avfilter_get_by_name later to lookup the AVFilter structure by name. A + * filter can still by instantiated with avfilter_graph_alloc_filter even if it + * is not registered. + * + * @param filter the filter to register + * @return 0 if the registration was successful, a negative value + * otherwise + */ +int avfilter_register(AVFilter *filter); + +/** + * Get a filter definition matching the given name. + * + * @param name the filter name to find + * @return the filter definition, if any matching one is registered. + * NULL if none found. + */ +#if !FF_API_NOCONST_GET_NAME +const +#endif +AVFilter *avfilter_get_by_name(const char *name); + +/** + * Iterate over all registered filters. + * @return If prev is non-NULL, next registered filter after prev or NULL if + * prev is the last filter. If prev is NULL, return the first registered filter. + */ +const AVFilter *avfilter_next(const AVFilter *prev); + +#if FF_API_OLD_FILTER_REGISTER +/** + * If filter is NULL, returns a pointer to the first registered filter pointer, + * if filter is non-NULL, returns the next pointer after filter. + * If the returned pointer points to NULL, the last registered filter + * was already reached. + * @deprecated use avfilter_next() + */ +attribute_deprecated +AVFilter **av_filter_next(AVFilter **filter); +#endif + +#if FF_API_AVFILTER_OPEN +/** + * Create a filter instance. + * + * @param filter_ctx put here a pointer to the created filter context + * on success, NULL on failure + * @param filter the filter to create an instance of + * @param inst_name Name to give to the new instance. Can be NULL for none. + * @return >= 0 in case of success, a negative error code otherwise + * @deprecated use avfilter_graph_alloc_filter() instead + */ +attribute_deprecated +int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); +#endif + + +#if FF_API_AVFILTER_INIT_FILTER +/** + * Initialize a filter. + * + * @param filter the filter to initialize + * @param args A string of parameters to use when initializing the filter. + * The format and meaning of this string varies by filter. + * @param opaque Any extra non-string data needed by the filter. The meaning + * of this parameter varies by filter. + * @return zero on success + */ +attribute_deprecated +int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); +#endif + +/** + * Initialize a filter with the supplied parameters. + * + * @param ctx uninitialized filter context to initialize + * @param args Options to initialize the filter with. This must be a + * ':'-separated list of options in the 'key=value' form. + * May be NULL if the options have been set directly using the + * AVOptions API or there are no options that need to be set. + * @return 0 on success, a negative AVERROR on failure + */ +int avfilter_init_str(AVFilterContext *ctx, const char *args); + +/** + * Initialize a filter with the supplied dictionary of options. + * + * @param ctx uninitialized filter context to initialize + * @param options An AVDictionary filled with options for this filter. On + * return this parameter will be destroyed and replaced with + * a dict containing options that were not found. This dictionary + * must be freed by the caller. + * May be NULL, then this function is equivalent to + * avfilter_init_str() with the second parameter set to NULL. + * @return 0 on success, a negative AVERROR on failure + * + * @note This function and avfilter_init_str() do essentially the same thing, + * the difference is in manner in which the options are passed. It is up to the + * calling code to choose whichever is more preferable. The two functions also + * behave differently when some of the provided options are not declared as + * supported by the filter. In such a case, avfilter_init_str() will fail, but + * this function will leave those extra options in the options AVDictionary and + * continue as usual. + */ +int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options); + +/** + * Free a filter context. This will also remove the filter from its + * filtergraph's list of filters. + * + * @param filter the filter to free + */ +void avfilter_free(AVFilterContext *filter); + +/** + * Insert a filter in the middle of an existing link. + * + * @param link the link into which the filter should be inserted + * @param filt the filter to be inserted + * @param filt_srcpad_idx the input pad on the filter to connect + * @param filt_dstpad_idx the output pad on the filter to connect + * @return zero on success + */ +int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, + unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); + +/** + * @return AVClass for AVFilterContext. + * + * @see av_opt_find(). + */ +const AVClass *avfilter_get_class(void); + +typedef struct AVFilterGraphInternal AVFilterGraphInternal; + +/** + * A function pointer passed to the @ref AVFilterGraph.execute callback to be + * executed multiple times, possibly in parallel. + * + * @param ctx the filter context the job belongs to + * @param arg an opaque parameter passed through from @ref + * AVFilterGraph.execute + * @param jobnr the index of the job being executed + * @param nb_jobs the total number of jobs + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_action_func)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); + +/** + * A function executing multiple jobs, possibly in parallel. + * + * @param ctx the filter context to which the jobs belong + * @param func the function to be called multiple times + * @param arg the argument to be passed to func + * @param ret a nb_jobs-sized array to be filled with return values from each + * invocation of func + * @param nb_jobs the number of jobs to execute + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_execute_func)(AVFilterContext *ctx, avfilter_action_func *func, + void *arg, int *ret, int nb_jobs); + +typedef struct AVFilterGraph { + const AVClass *av_class; + AVFilterContext **filters; + unsigned nb_filters; + + char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters +#if FF_API_LAVR_OPTS + attribute_deprecated char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters +#endif + + /** + * Type of multithreading allowed for filters in this graph. A combination + * of AVFILTER_THREAD_* flags. + * + * May be set by the caller at any point, the setting will apply to all + * filters initialized after that. The default is allowing everything. + * + * When a filter in this graph is initialized, this field is combined using + * bit AND with AVFilterContext.thread_type to get the final mask used for + * determining allowed threading types. I.e. a threading type needs to be + * set in both to be allowed. + */ + int thread_type; + + /** + * Maximum number of threads used by filters in this graph. May be set by + * the caller before adding any filters to the filtergraph. Zero (the + * default) means that the number of threads is determined automatically. + */ + int nb_threads; + + /** + * Opaque object for libavfilter internal use. + */ + AVFilterGraphInternal *internal; + + /** + * Opaque user data. May be set by the caller to an arbitrary value, e.g. to + * be used from callbacks like @ref AVFilterGraph.execute. + * Libavfilter will not touch this field in any way. + */ + void *opaque; + + /** + * This callback may be set by the caller immediately after allocating the + * graph and before adding any filters to it, to provide a custom + * multithreading implementation. + * + * If set, filters with slice threading capability will call this callback + * to execute multiple jobs in parallel. + * + * If this field is left unset, libavfilter will use its internal + * implementation, which may or may not be multithreaded depending on the + * platform and build options. + */ + avfilter_execute_func *execute; + + char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions + + /** + * Private fields + * + * The following fields are for internal use only. + * Their type, offset, number and semantic can change without notice. + */ + + AVFilterLink **sink_links; + int sink_links_count; + + unsigned disable_auto_convert; +} AVFilterGraph; + +/** + * Allocate a filter graph. + * + * @return the allocated filter graph on success or NULL. + */ +AVFilterGraph *avfilter_graph_alloc(void); + +/** + * Create a new filter instance in a filter graph. + * + * @param graph graph in which the new filter will be used + * @param filter the filter to create an instance of + * @param name Name to give to the new instance (will be copied to + * AVFilterContext.name). This may be used by the caller to identify + * different filters, libavfilter itself assigns no semantics to + * this parameter. May be NULL. + * + * @return the context of the newly created filter instance (note that it is + * also retrievable directly through AVFilterGraph.filters or with + * avfilter_graph_get_filter()) on success or NULL on failure. + */ +AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, + const AVFilter *filter, + const char *name); + +/** + * Get a filter instance identified by instance name from graph. + * + * @param graph filter graph to search through. + * @param name filter instance name (should be unique in the graph). + * @return the pointer to the found filter instance or NULL if it + * cannot be found. + */ +AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); + +#if FF_API_AVFILTER_OPEN +/** + * Add an existing filter instance to a filter graph. + * + * @param graphctx the filter graph + * @param filter the filter to be added + * + * @deprecated use avfilter_graph_alloc_filter() to allocate a filter in a + * filter graph + */ +attribute_deprecated +int avfilter_graph_add_filter(AVFilterGraph *graphctx, AVFilterContext *filter); +#endif + +/** + * Create and add a filter instance into an existing graph. + * The filter instance is created from the filter filt and inited + * with the parameters args and opaque. + * + * In case of success put in *filt_ctx the pointer to the created + * filter instance, otherwise set *filt_ctx to NULL. + * + * @param name the instance name to give to the created filter instance + * @param graph_ctx the filter graph + * @return a negative AVERROR error code in case of failure, a non + * negative value otherwise + */ +int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, + const char *name, const char *args, void *opaque, + AVFilterGraph *graph_ctx); + +/** + * Enable or disable automatic format conversion inside the graph. + * + * Note that format conversion can still happen inside explicitly inserted + * scale and aresample filters. + * + * @param flags any of the AVFILTER_AUTO_CONVERT_* constants + */ +void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags); + +enum { + AVFILTER_AUTO_CONVERT_ALL = 0, /**< all automatic conversions enabled */ + AVFILTER_AUTO_CONVERT_NONE = -1, /**< all automatic conversions disabled */ +}; + +/** + * Check validity and configure all the links and formats in the graph. + * + * @param graphctx the filter graph + * @param log_ctx context used for logging + * @return >= 0 in case of success, a negative AVERROR code otherwise + */ +int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx); + +/** + * Free a graph, destroy its links, and set *graph to NULL. + * If *graph is NULL, do nothing. + */ +void avfilter_graph_free(AVFilterGraph **graph); + +/** + * A linked-list of the inputs/outputs of the filter chain. + * + * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(), + * where it is used to communicate open (unlinked) inputs and outputs from and + * to the caller. + * This struct specifies, per each not connected pad contained in the graph, the + * filter context and the pad index required for establishing a link. + */ +typedef struct AVFilterInOut { + /** unique name for this input/output in the list */ + char *name; + + /** filter context associated to this input/output */ + AVFilterContext *filter_ctx; + + /** index of the filt_ctx pad to use for linking */ + int pad_idx; + + /** next input/input in the list, NULL if this is the last */ + struct AVFilterInOut *next; +} AVFilterInOut; + +/** + * Allocate a single AVFilterInOut entry. + * Must be freed with avfilter_inout_free(). + * @return allocated AVFilterInOut on success, NULL on failure. + */ +AVFilterInOut *avfilter_inout_alloc(void); + +/** + * Free the supplied list of AVFilterInOut and set *inout to NULL. + * If *inout is NULL, do nothing. + */ +void avfilter_inout_free(AVFilterInOut **inout); + +/** + * Add a graph described by a string to a graph. + * + * @note The caller must provide the lists of inputs and outputs, + * which therefore must be known before calling the function. + * + * @note The inputs parameter describes inputs of the already existing + * part of the graph; i.e. from the point of view of the newly created + * part, they are outputs. Similarly the outputs parameter describes + * outputs of the already existing filters, which are provided as + * inputs to the parsed filters. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs linked list to the inputs of the graph + * @param outputs linked list to the outputs of the graph + * @return zero on success, a negative AVERROR code on error + */ +int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, + AVFilterInOut *inputs, AVFilterInOut *outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * In the graph filters description, if the input label of the first + * filter is not specified, "in" is assumed; if the output label of + * the last filter is not specified, "out" is assumed. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. + * If non-NULL, *inputs is updated to contain the list of open inputs + * after the parsing, should be freed with avfilter_inout_free(). + * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. + * If non-NULL, *outputs is updated to contain the list of open outputs + * after the parsing, should be freed with avfilter_inout_free(). + * @return non negative on success, a negative AVERROR code on error + */ +int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, AVFilterInOut **outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * @param[in] graph the filter graph where to link the parsed graph context + * @param[in] filters string to be parsed + * @param[out] inputs a linked list of all free (unlinked) inputs of the + * parsed graph will be returned here. It is to be freed + * by the caller using avfilter_inout_free(). + * @param[out] outputs a linked list of all free (unlinked) outputs of the + * parsed graph will be returned here. It is to be freed by the + * caller using avfilter_inout_free(). + * @return zero on success, a negative AVERROR code on error + * + * @note This function returns the inputs and outputs that are left + * unlinked after parsing the graph and the caller then deals with + * them. + * @note This function makes no reference whatsoever to already + * existing parts of the graph and the inputs parameter will on return + * contain inputs of the newly parsed part of the graph. Analogously + * the outputs parameter will contain outputs of the newly created + * filters. + */ +int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, + AVFilterInOut **outputs); + +/** + * Send a command to one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to send, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ +int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Queue a command for one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to sent, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param ts time at which the command should be sent to the filter + * + * @note As this executes commands after this function returns, no return code + * from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported. + */ +int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts); + + +/** + * Dump a graph into a human-readable string representation. + * + * @param graph the graph to dump + * @param options formatting options; currently ignored + * @return a string, or NULL in case of memory allocation failure; + * the string must be freed using av_free + */ +char *avfilter_graph_dump(AVFilterGraph *graph, const char *options); + +/** + * Request a frame on the oldest sink link. + * + * If the request returns AVERROR_EOF, try the next. + * + * Note that this function is not meant to be the sole scheduling mechanism + * of a filtergraph, only a convenience function to help drain a filtergraph + * in a balanced way under normal circumstances. + * + * Also note that AVERROR_EOF does not mean that frames did not arrive on + * some of the sinks during the process. + * When there are multiple sink links, in case the requested link + * returns an EOF, this may cause a filter to flush pending frames + * which are sent to another sink link, although unrequested. + * + * @return the return value of ff_request_frame(), + * or AVERROR_EOF if all links returned AVERROR_EOF + */ +int avfilter_graph_request_oldest(AVFilterGraph *graph); + +/** + * @} + */ + +#endif /* AVFILTER_AVFILTER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfiltergraph.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfiltergraph.h new file mode 100644 index 0000000..b31d581 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/avfiltergraph.h @@ -0,0 +1,28 @@ +/* + * Filter graphs + * copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTERGRAPH_H +#define AVFILTER_AVFILTERGRAPH_H + +#include "avfilter.h" +#include "libavutil/log.h" + +#endif /* AVFILTER_AVFILTERGRAPH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersink.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersink.h new file mode 100644 index 0000000..21d6bb5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersink.h @@ -0,0 +1,165 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSINK_H +#define AVFILTER_BUFFERSINK_H + +/** + * @file + * @ingroup lavfi_buffersink + * memory buffer sink API for audio and video + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersink Buffer sink API + * @ingroup lavfi + * @{ + */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a buffersink or abuffersink filter context. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * @param flags a combination of AV_BUFFERSINK_FLAG_* flags + * + * @return >= 0 in for success, a negative AVERROR code for failure. + */ +int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); + +/** + * Tell av_buffersink_get_buffer_ref() to read video/samples buffer + * reference, but not remove it from the buffer. This is useful if you + * need only to read a video/samples buffer, without to fetch it. + */ +#define AV_BUFFERSINK_FLAG_PEEK 1 + +/** + * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. + * If a frame is already buffered, it is read (and removed from the buffer), + * but if no frame is present, return AVERROR(EAGAIN). + */ +#define AV_BUFFERSINK_FLAG_NO_REQUEST 2 + +/** + * Struct to use for initializing a buffersink context. + */ +typedef struct AVBufferSinkParams { + const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE +} AVBufferSinkParams; + +/** + * Create an AVBufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVBufferSinkParams *av_buffersink_params_alloc(void); + +/** + * Struct to use for initializing an abuffersink context. + */ +typedef struct AVABufferSinkParams { + const enum AVSampleFormat *sample_fmts; ///< list of allowed sample formats, terminated by AV_SAMPLE_FMT_NONE + const int64_t *channel_layouts; ///< list of allowed channel layouts, terminated by -1 + const int *channel_counts; ///< list of allowed channel counts, terminated by -1 + int all_channel_counts; ///< if not 0, accept any channel count or layout + int *sample_rates; ///< list of allowed sample rates, terminated by -1 +} AVABufferSinkParams; + +/** + * Create an AVABufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVABufferSinkParams *av_abuffersink_params_alloc(void); + +/** + * Set the frame size for an audio buffer sink. + * + * All calls to av_buffersink_get_buffer_ref will return a buffer with + * exactly the specified number of samples, or AVERROR(EAGAIN) if there is + * not enough. The last buffer at EOF will be padded with 0. + */ +void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); + +/** + * @defgroup lavfi_buffersink_accessors Buffer sink accessors + * Get the properties of the stream + * @{ + */ + +enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); +AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); +int av_buffersink_get_format (const AVFilterContext *ctx); + +AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); +int av_buffersink_get_w (const AVFilterContext *ctx); +int av_buffersink_get_h (const AVFilterContext *ctx); +AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); + +int av_buffersink_get_channels (const AVFilterContext *ctx); +uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); +int av_buffersink_get_sample_rate (const AVFilterContext *ctx); + +AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx); + +/** @} */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * + * @return + * - >= 0 if a frame was successfully returned. + * - AVERROR(EAGAIN) if no frames are available at this point; more + * input frames must be added to the filtergraph to get more output. + * - AVERROR_EOF if there will be no more output frames on this sink. + * - A different negative AVERROR code in other failure cases. + */ +int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Same as av_buffersink_get_frame(), but with the ability to specify the number + * of samples read. This function is less efficient than + * av_buffersink_get_frame(), because it copies the data around. + * + * @param ctx pointer to a context of the abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * frame will contain exactly nb_samples audio samples, except at + * the end of stream, when it can contain less than nb_samples. + * + * @return The return codes have the same meaning as for + * av_buffersink_get_samples(). + * + * @warning do not mix this function with av_buffersink_get_frame(). Use only one or + * the other with a single sink, not both. + */ +int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSINK_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersrc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersrc.h new file mode 100644 index 0000000..0652113 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/buffersrc.h @@ -0,0 +1,209 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSRC_H +#define AVFILTER_BUFFERSRC_H + +/** + * @file + * @ingroup lavfi_buffersrc + * Memory buffer source API. + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersrc Buffer source API + * @ingroup lavfi + * @{ + */ + +enum { + + /** + * Do not check for format changes. + */ + AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, + + /** + * Immediately push the frame to the output. + */ + AV_BUFFERSRC_FLAG_PUSH = 4, + + /** + * Keep a reference to the frame. + * If the frame if reference-counted, create a new reference; otherwise + * copy the frame data. + */ + AV_BUFFERSRC_FLAG_KEEP_REF = 8, + +}; + +/** + * Get the number of failed requests. + * + * A failed request is when the request_frame method is called while no + * frame is present in the buffer. + * The number is reset when a frame is added. + */ +unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); + +/** + * This structure contains the parameters describing the frames that will be + * passed to this filter. + * + * It should be allocated with av_buffersrc_parameters_alloc() and freed with + * av_free(). All the allocated fields in it remain owned by the caller. + */ +typedef struct AVBufferSrcParameters { + /** + * video: the pixel format, value corresponds to enum AVPixelFormat + * audio: the sample format, value corresponds to enum AVSampleFormat + */ + int format; + /** + * The timebase to be used for the timestamps on the input frames. + */ + AVRational time_base; + + /** + * Video only, the display dimensions of the input frames. + */ + int width, height; + + /** + * Video only, the sample (pixel) aspect ratio. + */ + AVRational sample_aspect_ratio; + + /** + * Video only, the frame rate of the input video. This field must only be + * set to a non-zero value if input stream has a known constant framerate + * and should be left at its initial value if the framerate is variable or + * unknown. + */ + AVRational frame_rate; + + /** + * Video with a hwaccel pixel format only. This should be a reference to an + * AVHWFramesContext instance describing the input frames. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only, the audio sampling rate in samples per secon. + */ + int sample_rate; + + /** + * Audio only, the audio channel layout + */ + uint64_t channel_layout; +} AVBufferSrcParameters; + +/** + * Allocate a new AVBufferSrcParameters instance. It should be freed by the + * caller with av_free(). + */ +AVBufferSrcParameters *av_buffersrc_parameters_alloc(void); + +/** + * Initialize the buffersrc or abuffersrc filter with the provided parameters. + * This function may be called multiple times, the later calls override the + * previous ones. Some of the parameters may also be set through AVOptions, then + * whatever method is used last takes precedence. + * + * @param ctx an instance of the buffersrc or abuffersrc filter + * @param param the stream parameters. The frames later passed to this filter + * must conform to those parameters. All the allocated fields in + * param remain owned by the caller, libavfilter will make internal + * copies or references when necessary. + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will make a new reference to it. Otherwise the frame data will be + * copied. + * + * @return 0 on success, a negative AVERROR on error + * + * This function is equivalent to av_buffersrc_add_frame_flags() with the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will take ownership of the reference(s) and reset the frame. + * Otherwise the frame data will be copied. If this function returns an error, + * the input frame is not touched. + * + * @return 0 on success, a negative AVERROR on error. + * + * @note the difference between this function and av_buffersrc_write_frame() is + * that av_buffersrc_write_frame() creates a new reference to the input frame, + * while this function takes ownership of the reference passed to it. + * + * This function is equivalent to av_buffersrc_add_frame_flags() without the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * By default, if the frame is reference-counted, this function will take + * ownership of the reference(s) and reset the frame. This can be controlled + * using the flags. + * + * If this function returns an error, the input frame is not touched. + * + * @param buffer_src pointer to a buffer source context + * @param frame a frame, or NULL to mark EOF + * @param flags a combination of AV_BUFFERSRC_FLAG_* + * @return >= 0 in case of success, a negative AVERROR code + * in case of failure + */ +av_warn_unused_result +int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, + AVFrame *frame, int flags); + +/** + * Close the buffer source after EOF. + * + * This is similar to passing NULL to av_buffersrc_add_frame_flags() + * except it takes the timestamp of the EOF, i.e. the timestamp of the end + * of the last frame. + */ +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/version.h new file mode 100644 index 0000000..3e67ad3 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavfilter/version.h @@ -0,0 +1,74 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFILTER_VERSION_H +#define AVFILTER_VERSION_H + +/** + * @file + * @ingroup lavfi + * Libavfilter version macros + */ + +#include "libavutil/version.h" + +#define LIBAVFILTER_VERSION_MAJOR 6 +#define LIBAVFILTER_VERSION_MINOR 107 +#define LIBAVFILTER_VERSION_MICRO 100 + +#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT + +#define LIBAVFILTER_IDENT "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_OLD_FILTER_OPTS +#define FF_API_OLD_FILTER_OPTS (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_OLD_FILTER_OPTS_ERROR +#define FF_API_OLD_FILTER_OPTS_ERROR (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_AVFILTER_OPEN +#define FF_API_AVFILTER_OPEN (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_AVFILTER_INIT_FILTER +#define FF_API_AVFILTER_INIT_FILTER (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_OLD_FILTER_REGISTER +#define FF_API_OLD_FILTER_REGISTER (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_NOCONST_GET_NAME +#define FF_API_NOCONST_GET_NAME (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_LAVR_OPTS +#define FF_API_LAVR_OPTS (LIBAVFILTER_VERSION_MAJOR < 7) +#endif + +#endif /* AVFILTER_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avformat.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avformat.h new file mode 100644 index 0000000..b0de66a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avformat.h @@ -0,0 +1,3008 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVFORMAT_AVFORMAT_H +#define AVFORMAT_AVFORMAT_H + +/** + * @file + * @ingroup libavf + * Main libavformat public API header + */ + +/** + * @defgroup libavf libavformat + * I/O and Muxing/Demuxing Library + * + * Libavformat (lavf) is a library for dealing with various media container + * formats. Its main two purposes are demuxing - i.e. splitting a media file + * into component streams, and the reverse process of muxing - writing supplied + * data in a specified container format. It also has an @ref lavf_io + * "I/O module" which supports a number of protocols for accessing the data (e.g. + * file, tcp, http and others). Before using lavf, you need to call + * av_register_all() to register all compiled muxers, demuxers and protocols. + * Unless you are absolutely sure you won't use libavformat's network + * capabilities, you should also call avformat_network_init(). + * + * A supported input format is described by an AVInputFormat struct, conversely + * an output format is described by AVOutputFormat. You can iterate over all + * registered input/output formats using the av_iformat_next() / + * av_oformat_next() functions. The protocols layer is not part of the public + * API, so you can only get the names of supported protocols with the + * avio_enum_protocols() function. + * + * Main lavf structure used for both muxing and demuxing is AVFormatContext, + * which exports all information about the file being read or written. As with + * most Libavformat structures, its size is not part of public ABI, so it cannot be + * allocated on stack or directly with av_malloc(). To create an + * AVFormatContext, use avformat_alloc_context() (some functions, like + * avformat_open_input() might do that for you). + * + * Most importantly an AVFormatContext contains: + * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat + * "output" format. It is either autodetected or set by user for input; + * always set by user for output. + * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all + * elementary streams stored in the file. AVStreams are typically referred to + * using their index in this array. + * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or + * set by user for input, always set by user for output (unless you are dealing + * with an AVFMT_NOFILE format). + * + * @section lavf_options Passing options to (de)muxers + * It is possible to configure lavf muxers and demuxers using the @ref avoptions + * mechanism. Generic (format-independent) libavformat options are provided by + * AVFormatContext, they can be examined from a user program by calling + * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass + * from avformat_get_class()). Private (format-specific) options are provided by + * AVFormatContext.priv_data if and only if AVInputFormat.priv_class / + * AVOutputFormat.priv_class of the corresponding format struct is non-NULL. + * Further options may be provided by the @ref AVFormatContext.pb "I/O context", + * if its AVClass is non-NULL, and the protocols layer. See the discussion on + * nesting in @ref avoptions documentation to learn how to access those. + * + * @section urls + * URL strings in libavformat are made of a scheme/protocol, a ':', and a + * scheme specific string. URLs without a scheme and ':' used for local files + * are supported but deprecated. "file:" should be used for local files. + * + * It is important that the scheme string is not taken from untrusted + * sources without checks. + * + * Note that some schemes/protocols are quite powerful, allowing access to + * both local and remote files, parts of them, concatenations of them, local + * audio and video devices and so on. + * + * @{ + * + * @defgroup lavf_decoding Demuxing + * @{ + * Demuxers read a media file and split it into chunks of data (@em packets). A + * @ref AVPacket "packet" contains one or more encoded frames which belongs to a + * single elementary stream. In the lavf API this process is represented by the + * avformat_open_input() function for opening a file, av_read_frame() for + * reading a single packet and finally avformat_close_input(), which does the + * cleanup. + * + * @section lavf_decoding_open Opening a media file + * The minimum information required to open a file is its URL, which + * is passed to avformat_open_input(), as in the following code: + * @code + * const char *url = "file:in.mp3"; + * AVFormatContext *s = NULL; + * int ret = avformat_open_input(&s, url, NULL, NULL); + * if (ret < 0) + * abort(); + * @endcode + * The above code attempts to allocate an AVFormatContext, open the + * specified file (autodetecting the format) and read the header, exporting the + * information stored there into s. Some formats do not have a header or do not + * store enough information there, so it is recommended that you call the + * avformat_find_stream_info() function which tries to read and decode a few + * frames to find missing information. + * + * In some cases you might want to preallocate an AVFormatContext yourself with + * avformat_alloc_context() and do some tweaking on it before passing it to + * avformat_open_input(). One such case is when you want to use custom functions + * for reading input data instead of lavf internal I/O layer. + * To do that, create your own AVIOContext with avio_alloc_context(), passing + * your reading callbacks to it. Then set the @em pb field of your + * AVFormatContext to newly created AVIOContext. + * + * Since the format of the opened file is in general not known until after + * avformat_open_input() has returned, it is not possible to set demuxer private + * options on a preallocated context. Instead, the options should be passed to + * avformat_open_input() wrapped in an AVDictionary: + * @code + * AVDictionary *options = NULL; + * av_dict_set(&options, "video_size", "640x480", 0); + * av_dict_set(&options, "pixel_format", "rgb24", 0); + * + * if (avformat_open_input(&s, url, NULL, &options) < 0) + * abort(); + * av_dict_free(&options); + * @endcode + * This code passes the private options 'video_size' and 'pixel_format' to the + * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it + * cannot know how to interpret raw video data otherwise. If the format turns + * out to be something different than raw video, those options will not be + * recognized by the demuxer and therefore will not be applied. Such unrecognized + * options are then returned in the options dictionary (recognized options are + * consumed). The calling program can handle such unrecognized options as it + * wishes, e.g. + * @code + * AVDictionaryEntry *e; + * if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { + * fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); + * abort(); + * } + * @endcode + * + * After you have finished reading the file, you must close it with + * avformat_close_input(). It will free everything associated with the file. + * + * @section lavf_decoding_read Reading from an opened file + * Reading data from an opened AVFormatContext is done by repeatedly calling + * av_read_frame() on it. Each call, if successful, will return an AVPacket + * containing encoded data for one AVStream, identified by + * AVPacket.stream_index. This packet may be passed straight into the libavcodec + * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the + * caller wishes to decode the data. + * + * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be + * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for + * pts/dts, 0 for duration) if the stream does not provide them. The timing + * information will be in AVStream.time_base units, i.e. it has to be + * multiplied by the timebase to convert them to seconds. + * + * If AVPacket.buf is set on the returned packet, then the packet is + * allocated dynamically and the user may keep it indefinitely. + * Otherwise, if AVPacket.buf is NULL, the packet data is backed by a + * static storage somewhere inside the demuxer and the packet is only valid + * until the next av_read_frame() call or closing the file. If the caller + * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy + * of it. + * In both cases, the packet must be freed with av_packet_unref() when it is no + * longer needed. + * + * @section lavf_decoding_seek Seeking + * @} + * + * @defgroup lavf_encoding Muxing + * @{ + * Muxers take encoded data in the form of @ref AVPacket "AVPackets" and write + * it into files or other output bytestreams in the specified container format. + * + * The main API functions for muxing are avformat_write_header() for writing the + * file header, av_write_frame() / av_interleaved_write_frame() for writing the + * packets and av_write_trailer() for finalizing the file. + * + * At the beginning of the muxing process, the caller must first call + * avformat_alloc_context() to create a muxing context. The caller then sets up + * the muxer by filling the various fields in this context: + * + * - The @ref AVFormatContext.oformat "oformat" field must be set to select the + * muxer that will be used. + * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb + * "pb" field must be set to an opened IO context, either returned from + * avio_open2() or a custom one. + * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must + * be created with the avformat_new_stream() function. The caller should fill + * the @ref AVStream.codecpar "stream codec parameters" information, such as the + * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id + * "id" and other parameters (e.g. width / height, the pixel or sample format, + * etc.) as known. The @ref AVStream.time_base "stream timebase" should + * be set to the timebase that the caller desires to use for this stream (note + * that the timebase actually used by the muxer can be different, as will be + * described later). + * - It is advised to manually initialize only the relevant fields in + * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during + * remuxing: there is no guarantee that the codec context values remain valid + * for both input and output format contexts. + * - The caller may fill in additional information, such as @ref + * AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream" + * metadata, @ref AVFormatContext.chapters "chapters", @ref + * AVFormatContext.programs "programs", etc. as described in the + * AVFormatContext documentation. Whether such information will actually be + * stored in the output depends on what the container format and the muxer + * support. + * + * When the muxing context is fully set up, the caller must call + * avformat_write_header() to initialize the muxer internals and write the file + * header. Whether anything actually is written to the IO context at this step + * depends on the muxer, but this function must always be called. Any muxer + * private options must be passed in the options parameter to this function. + * + * The data is then sent to the muxer by repeatedly calling av_write_frame() or + * av_interleaved_write_frame() (consult those functions' documentation for + * discussion on the difference between them; only one of them may be used with + * a single muxing context, they should not be mixed). Do note that the timing + * information on the packets sent to the muxer must be in the corresponding + * AVStream's timebase. That timebase is set by the muxer (in the + * avformat_write_header() step) and may be different from the timebase + * requested by the caller. + * + * Once all the data has been written, the caller must call av_write_trailer() + * to flush any buffered packets and finalize the output file, then close the IO + * context (if any) and finally free the muxing context with + * avformat_free_context(). + * @} + * + * @defgroup lavf_io I/O Read/Write + * @{ + * @section lavf_io_dirlist Directory listing + * The directory listing API makes it possible to list files on remote servers. + * + * Some of possible use cases: + * - an "open file" dialog to choose files from a remote location, + * - a recursive media finder providing a player with an ability to play all + * files from a given directory. + * + * @subsection lavf_io_dirlist_open Opening a directory + * At first, a directory needs to be opened by calling avio_open_dir() + * supplied with a URL and, optionally, ::AVDictionary containing + * protocol-specific parameters. The function returns zero or positive + * integer and allocates AVIODirContext on success. + * + * @code + * AVIODirContext *ctx = NULL; + * if (avio_open_dir(&ctx, "smb://example.com/some_dir", NULL) < 0) { + * fprintf(stderr, "Cannot open directory.\n"); + * abort(); + * } + * @endcode + * + * This code tries to open a sample directory using smb protocol without + * any additional parameters. + * + * @subsection lavf_io_dirlist_read Reading entries + * Each directory's entry (i.e. file, another directory, anything else + * within ::AVIODirEntryType) is represented by AVIODirEntry. + * Reading consecutive entries from an opened AVIODirContext is done by + * repeatedly calling avio_read_dir() on it. Each call returns zero or + * positive integer if successful. Reading can be stopped right after the + * NULL entry has been read -- it means there are no entries left to be + * read. The following code reads all entries from a directory associated + * with ctx and prints their names to standard output. + * @code + * AVIODirEntry *entry = NULL; + * for (;;) { + * if (avio_read_dir(ctx, &entry) < 0) { + * fprintf(stderr, "Cannot list directory.\n"); + * abort(); + * } + * if (!entry) + * break; + * printf("%s\n", entry->name); + * avio_free_directory_entry(&entry); + * } + * @endcode + * @} + * + * @defgroup lavf_codec Demuxers + * @{ + * @defgroup lavf_codec_native Native Demuxers + * @{ + * @} + * @defgroup lavf_codec_wrappers External library wrappers + * @{ + * @} + * @} + * @defgroup lavf_protos I/O Protocols + * @{ + * @} + * @defgroup lavf_internal Internal + * @{ + * @} + * @} + */ + +#include +#include /* FILE */ +#include "libavcodec/avcodec.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "avio.h" +#include "libavformat/version.h" + +struct AVFormatContext; + +struct AVDeviceInfoList; +struct AVDeviceCapabilitiesQuery; + +/** + * @defgroup metadata_api Public Metadata API + * @{ + * @ingroup libavf + * The metadata API allows libavformat to export metadata tags to a client + * application when demuxing. Conversely it allows a client application to + * set metadata when muxing. + * + * Metadata is exported or set as pairs of key/value strings in the 'metadata' + * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs + * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg, + * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata + * exported by demuxers isn't checked to be valid UTF-8 in most cases. + * + * Important concepts to keep in mind: + * - Keys are unique; there can never be 2 tags with the same key. This is + * also meant semantically, i.e., a demuxer should not knowingly produce + * several keys that are literally different but semantically identical. + * E.g., key=Author5, key=Author6. In this example, all authors must be + * placed in the same tag. + * - Metadata is flat, not hierarchical; there are no subtags. If you + * want to store, e.g., the email address of the child of producer Alice + * and actor Bob, that could have key=alice_and_bobs_childs_email_address. + * - Several modifiers can be applied to the tag name. This is done by + * appending a dash character ('-') and the modifier name in the order + * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. + * - language -- a tag whose value is localized for a particular language + * is appended with the ISO 639-2/B 3-letter language code. + * For example: Author-ger=Michael, Author-eng=Mike + * The original/default language is in the unqualified "Author" tag. + * A demuxer should set a default if it sets any translated tag. + * - sorting -- a modified version of a tag that should be used for + * sorting will have '-sort' appended. E.g. artist="The Beatles", + * artist-sort="Beatles, The". + * - Some protocols and demuxers support metadata updates. After a successful + * call to av_read_packet(), AVFormatContext.event_flags or AVStream.event_flags + * will be updated to indicate if metadata changed. In order to detect metadata + * changes on a stream, you need to loop through all streams in the AVFormatContext + * and check their individual event_flags. + * + * - Demuxers attempt to export metadata in a generic format, however tags + * with no generic equivalents are left as they are stored in the container. + * Follows a list of generic tag names: + * + @verbatim + album -- name of the set this work belongs to + album_artist -- main creator of the set/album, if different from artist. + e.g. "Various Artists" for compilation albums. + artist -- main creator of the work + comment -- any additional description of the file. + composer -- who composed the work, if different from artist. + copyright -- name of copyright holder. + creation_time-- date when the file was created, preferably in ISO 8601. + date -- date when the work was created, preferably in ISO 8601. + disc -- number of a subset, e.g. disc in a multi-disc collection. + encoder -- name/settings of the software/hardware that produced the file. + encoded_by -- person/group who created the file. + filename -- original name of the file. + genre -- . + language -- main language in which the work is performed, preferably + in ISO 639-2 format. Multiple languages can be specified by + separating them with commas. + performer -- artist who performed the work, if different from artist. + E.g for "Also sprach Zarathustra", artist would be "Richard + Strauss" and performer "London Philharmonic Orchestra". + publisher -- name of the label/publisher. + service_name -- name of the service in broadcasting (channel name). + service_provider -- name of the service provider in broadcasting. + title -- name of the work. + track -- number of this work in the set, can be in form current/total. + variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of + @endverbatim + * + * Look in the examples section for an application example how to use the Metadata API. + * + * @} + */ + +/* packet functions */ + + +/** + * Allocate and read the payload of a packet and initialize its + * fields with default values. + * + * @param s associated IO context + * @param pkt packet + * @param size desired payload size + * @return >0 (read size) if OK, AVERROR_xxx otherwise + */ +int av_get_packet(AVIOContext *s, AVPacket *pkt, int size); + + +/** + * Read data and append it to the current content of the AVPacket. + * If pkt->size is 0 this is identical to av_get_packet. + * Note that this uses av_grow_packet and thus involves a realloc + * which is inefficient. Thus this function should only be used + * when there is no reasonable way to know (an upper bound of) + * the final size. + * + * @param s associated IO context + * @param pkt packet + * @param size amount of data to read + * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data + * will not be lost even if an error occurs. + */ +int av_append_packet(AVIOContext *s, AVPacket *pkt, int size); + +#if FF_API_LAVF_FRAC +/*************************************************/ +/* fractional numbers for exact pts handling */ + +/** + * The exact value of the fractional number is: 'val + num / den'. + * num is assumed to be 0 <= num < den. + */ +typedef struct AVFrac { + int64_t val, num, den; +} AVFrac; +#endif + +/*************************************************/ +/* input/output formats */ + +struct AVCodecTag; + +/** + * This structure contains the data a format has to probe a file. + */ +typedef struct AVProbeData { + const char *filename; + unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ + int buf_size; /**< Size of buf except extra allocated bytes */ + const char *mime_type; /**< mime_type, when known. */ +} AVProbeData; + +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4) +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1) + +#define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension +#define AVPROBE_SCORE_MIME 75 ///< score for file mime type +#define AVPROBE_SCORE_MAX 100 ///< maximum score + +#define AVPROBE_PADDING_SIZE 32 ///< extra allocated bytes at the end of the probe buffer + +/// Demuxer will use avio_open, no opened file should be provided by the caller. +#define AVFMT_NOFILE 0x0001 +#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ +#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ +#if FF_API_LAVF_FMT_RAWPICTURE +#define AVFMT_RAWPICTURE 0x0020 /**< Format wants AVPicture structure for + raw picture data. @deprecated Not used anymore */ +#endif +#define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ +#define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ +#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ +#define AVFMT_TS_DISCONT 0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */ +#define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ +#define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ +#define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ +#define AVFMT_NOBINSEARCH 0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */ +#define AVFMT_NOGENSEARCH 0x4000 /**< Format does not allow to fall back on generic search */ +#define AVFMT_NO_BYTE_SEEK 0x8000 /**< Format does not allow seeking by bytes */ +#define AVFMT_ALLOW_FLUSH 0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */ +#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly + increasing timestamps, but they must + still be monotonic */ +#define AVFMT_TS_NEGATIVE 0x40000 /**< Format allows muxing negative + timestamps. If not set the timestamp + will be shifted in av_write_frame and + av_interleaved_write_frame so they + start from 0. + The user or muxer can override this through + AVFormatContext.avoid_negative_ts + */ + +#define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */ + +/** + * @addtogroup lavf_encoding + * @{ + */ +typedef struct AVOutputFormat { + const char *name; + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + const char *mime_type; + const char *extensions; /**< comma-separated filename extensions */ + /* output support */ + enum AVCodecID audio_codec; /**< default audio codec */ + enum AVCodecID video_codec; /**< default video codec */ + enum AVCodecID subtitle_codec; /**< default subtitle codec */ + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, + * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, + * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE + */ + int flags; + + /** + * List of supported codec_id-codec_tag pairs, ordered by "better + * choice first". The arrays are all terminated by AV_CODEC_ID_NONE. + */ + const struct AVCodecTag * const *codec_tag; + + + const AVClass *priv_class; ///< AVClass for the private context + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + struct AVOutputFormat *next; + /** + * size of private data so that it can be allocated in the wrapper + */ + int priv_data_size; + + int (*write_header)(struct AVFormatContext *); + /** + * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, + * pkt can be NULL in order to flush data buffered in the muxer. + * When flushing, return 0 if there still is more data to flush, + * or 1 if everything was flushed and there is no more buffered + * data. + */ + int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); + int (*write_trailer)(struct AVFormatContext *); + /** + * Currently only used to set pixel format if not YUV420P. + */ + int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, + AVPacket *in, int flush); + /** + * Test if the given codec can be stored in this container. + * + * @return 1 if the codec is supported, 0 if it is not. + * A negative number if unknown. + * MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC + */ + int (*query_codec)(enum AVCodecID id, int std_compliance); + + void (*get_output_timestamp)(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + /** + * Allows sending messages from application to device. + */ + int (*control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + + /** + * Write an uncoded AVFrame. + * + * See av_write_uncoded_frame() for details. + * + * The library will free *frame afterwards, but the muxer can prevent it + * by setting the pointer to NULL. + */ + int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index, + AVFrame **frame, unsigned flags); + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + enum AVCodecID data_codec; /**< default data codec */ + /** + * Initialize format. May allocate data here, and set any AVFormatContext or + * AVStream parameters that need to be set before packets are sent. + * This method must not write output. + * + * Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure + * + * Any allocations made here must be freed in deinit(). + */ + int (*init)(struct AVFormatContext *); + /** + * Deinitialize format. If present, this is called whenever the muxer is being + * destroyed, regardless of whether or not the header has been written. + * + * If a trailer is being written, this is called after write_trailer(). + * + * This is called if init() fails as well. + */ + void (*deinit)(struct AVFormatContext *); + /** + * Set up any necessary bitstream filtering and extract any extra data needed + * for the global header. + * Return 0 if more packets from this stream must be checked; 1 if not. + */ + int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); +} AVOutputFormat; +/** + * @} + */ + +/** + * @addtogroup lavf_decoding + * @{ + */ +typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ + const char *name; + + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, + * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. + */ + int flags; + + /** + * If extensions are defined, then no probe is done. You should + * usually not use extension format guessing because it is not + * reliable enough + */ + const char *extensions; + + const struct AVCodecTag * const *codec_tag; + + const AVClass *priv_class; ///< AVClass for the private context + + /** + * Comma-separated list of mime types. + * It is used check for matching mime types while probing. + * @see av_probe_input_format2 + */ + const char *mime_type; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + struct AVInputFormat *next; + + /** + * Raw demuxers store their codec ID here. + */ + int raw_codec_id; + + /** + * Size of private data so that it can be allocated in the wrapper. + */ + int priv_data_size; + + /** + * Tell if a given file has a chance of being parsed as this format. + * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes + * big so you do not have to check for that unless you need more. + */ + int (*read_probe)(AVProbeData *); + + /** + * Read the format header and initialize the AVFormatContext + * structure. Return 0 if OK. 'avformat_new_stream' should be + * called to create new streams. + */ + int (*read_header)(struct AVFormatContext *); + + /** + * Read one packet and put it in 'pkt'. pts and flags are also + * set. 'avformat_new_stream' can be called only if the flag + * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a + * background thread). + * @return 0 on success, < 0 on error. + * When returning an error, pkt must not have been allocated + * or must be freed before returning + */ + int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); + + /** + * Close the stream. The AVFormatContext and AVStreams are not + * freed by this function + */ + int (*read_close)(struct AVFormatContext *); + + /** + * Seek to a given timestamp relative to the frames in + * stream component stream_index. + * @param stream_index Must not be -1. + * @param flags Selects which direction should be preferred if no exact + * match is available. + * @return >= 0 on success (but not necessarily the new offset) + */ + int (*read_seek)(struct AVFormatContext *, + int stream_index, int64_t timestamp, int flags); + + /** + * Get the next timestamp in stream[stream_index].time_base units. + * @return the timestamp or AV_NOPTS_VALUE if an error occurred + */ + int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, + int64_t *pos, int64_t pos_limit); + + /** + * Start/resume playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_play)(struct AVFormatContext *); + + /** + * Pause playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_pause)(struct AVFormatContext *); + + /** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + */ + int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); +} AVInputFormat; +/** + * @} + */ + +enum AVStreamParseType { + AVSTREAM_PARSE_NONE, + AVSTREAM_PARSE_FULL, /**< full parsing and repack */ + AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ + AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ + AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ + AVSTREAM_PARSE_FULL_RAW=MKTAG(0,'R','A','W'), /**< full parsing and repack with timestamp and position generation by parser for raw + this assumes that each packet in the file contains no demuxer level headers and + just codec level data, otherwise position generation would fail */ +}; + +typedef struct AVIndexEntry { + int64_t pos; + int64_t timestamp; /**< + * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available + * when seeking to this entry. That means preferable PTS on keyframe based formats. + * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better + * is known + */ +#define AVINDEX_KEYFRAME 0x0001 +#define AVINDEX_DISCARD_FRAME 0x0002 /** + * Flag is used to indicate which frame should be discarded after decoding. + */ + int flags:2; + int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ +} AVIndexEntry; + +#define AV_DISPOSITION_DEFAULT 0x0001 +#define AV_DISPOSITION_DUB 0x0002 +#define AV_DISPOSITION_ORIGINAL 0x0004 +#define AV_DISPOSITION_COMMENT 0x0008 +#define AV_DISPOSITION_LYRICS 0x0010 +#define AV_DISPOSITION_KARAOKE 0x0020 + +/** + * Track should be used during playback by default. + * Useful for subtitle track that should be displayed + * even when user did not explicitly ask for subtitles. + */ +#define AV_DISPOSITION_FORCED 0x0040 +#define AV_DISPOSITION_HEARING_IMPAIRED 0x0080 /**< stream for hearing impaired audiences */ +#define AV_DISPOSITION_VISUAL_IMPAIRED 0x0100 /**< stream for visual impaired audiences */ +#define AV_DISPOSITION_CLEAN_EFFECTS 0x0200 /**< stream without voice */ +/** + * The stream is stored in the file as an attached picture/"cover art" (e.g. + * APIC frame in ID3v2). The first (usually only) packet associated with it + * will be returned among the first few packets read from the file unless + * seeking takes place. It can also be accessed at any time in + * AVStream.attached_pic. + */ +#define AV_DISPOSITION_ATTACHED_PIC 0x0400 +/** + * The stream is sparse, and contains thumbnail images, often corresponding + * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. + */ +#define AV_DISPOSITION_TIMED_THUMBNAILS 0x0800 + +typedef struct AVStreamInternal AVStreamInternal; + +/** + * To specify text track kind (different from subtitles default). + */ +#define AV_DISPOSITION_CAPTIONS 0x10000 +#define AV_DISPOSITION_DESCRIPTIONS 0x20000 +#define AV_DISPOSITION_METADATA 0x40000 + +/** + * Options for behavior on timestamp wrap detection. + */ +#define AV_PTS_WRAP_IGNORE 0 ///< ignore the wrap +#define AV_PTS_WRAP_ADD_OFFSET 1 ///< add the format specific offset on wrap detection +#define AV_PTS_WRAP_SUB_OFFSET -1 ///< subtract the format specific offset on wrap detection + +/** + * Stream structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVStream) must not be used outside libav*. + */ +typedef struct AVStream { + int index; /**< stream index in AVFormatContext */ + /** + * Format-specific stream ID. + * decoding: set by libavformat + * encoding: set by the user, replaced by libavformat if left unset + */ + int id; +#if FF_API_LAVF_AVCTX + /** + * @deprecated use the codecpar struct instead + */ + attribute_deprecated + AVCodecContext *codec; +#endif + void *priv_data; + +#if FF_API_LAVF_FRAC + /** + * @deprecated this field is unused + */ + attribute_deprecated + struct AVFrac pts; +#endif + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. + * + * decoding: set by libavformat + * encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the desired timebase. In + * avformat_write_header(), the muxer will overwrite this field + * with the timebase that will actually be used for the timestamps + * written into the file (which may or may not be related to the + * user-provided one, depending on the format). + */ + AVRational time_base; + + /** + * Decoding: pts of the first frame of the stream in presentation order, in stream time base. + * Only set this if you are absolutely 100% sure that the value you set + * it to really is the pts of the first frame. + * This may be undefined (AV_NOPTS_VALUE). + * @note The ASF header does NOT contain a correct start_time the ASF + * demuxer must NOT set this. + */ + int64_t start_time; + + /** + * Decoding: duration of the stream, in stream time base. + * If a source file does not specify a duration, but does specify + * a bitrate, this value will be estimated from bitrate and file size. + * + * Encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the estimated duration. + */ + int64_t duration; + + int64_t nb_frames; ///< number of frames in this stream if known or 0 + + int disposition; /**< AV_DISPOSITION_* bit field */ + + enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed. + + /** + * sample aspect ratio (0 if unknown) + * - encoding: Set by user. + * - decoding: Set by libavformat. + */ + AVRational sample_aspect_ratio; + + AVDictionary *metadata; + + /** + * Average framerate + * + * - demuxing: May be set by libavformat when creating the stream or in + * avformat_find_stream_info(). + * - muxing: May be set by the caller before avformat_write_header(). + */ + AVRational avg_frame_rate; + + /** + * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet + * will contain the attached picture. + * + * decoding: set by libavformat, must not be modified by the caller. + * encoding: unused + */ + AVPacket attached_pic; + + /** + * An array of side data that applies to the whole stream (i.e. the + * container does not allow it to change between packets). + * + * There may be no overlap between the side data in this array and side data + * in the packets. I.e. a given side data is either exported by the muxer + * (demuxing) / set by the caller (muxing) in this array, then it never + * appears in the packets, or the side data is exported / sent through + * the packets (always in the first packet where the value becomes known or + * changes), then it does not appear in this array. + * + * - demuxing: Set by libavformat when the stream is created. + * - muxing: May be set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + * + * @see av_format_inject_global_side_data() + */ + AVPacketSideData *side_data; + /** + * The number of elements in the AVStream.side_data array. + */ + int nb_side_data; + + /** + * Flags for the user to detect events happening on the stream. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVSTREAM_EVENT_FLAG_*. + */ + int event_flags; +#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * Internal note: be aware that physically removing these fields + * will break ABI. Replace removed fields with dummy fields, and + * add new fields to AVStreamInternal. + ***************************************************************** + */ + + /** + * Stream information used internally by avformat_find_stream_info() + */ +#define MAX_STD_TIMEBASES (30*12+30+3+6) + struct { + int64_t last_dts; + int64_t duration_gcd; + int duration_count; + int64_t rfps_duration_sum; + double (*duration_error)[2][MAX_STD_TIMEBASES]; + int64_t codec_info_duration; + int64_t codec_info_duration_fields; + + /** + * 0 -> decoder has not been searched for yet. + * >0 -> decoder found + * <0 -> decoder with codec_id == -found_decoder has not been found + */ + int found_decoder; + + int64_t last_duration; + + /** + * Those are used for average framerate estimation. + */ + int64_t fps_first_dts; + int fps_first_dts_idx; + int64_t fps_last_dts; + int fps_last_dts_idx; + + } *info; + + int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */ + + // Timestamp generation support: + /** + * Timestamp corresponding to the last dts sync point. + * + * Initialized when AVCodecParserContext.dts_sync_point >= 0 and + * a DTS is received from the underlying container. Otherwise set to + * AV_NOPTS_VALUE by default. + */ + int64_t first_dts; + int64_t cur_dts; + int64_t last_IP_pts; + int last_IP_duration; + + /** + * Number of packets to buffer for codec probing + */ + int probe_packets; + + /** + * Number of frames that have been demuxed during avformat_find_stream_info() + */ + int codec_info_nb_frames; + + /* av_read_frame() support */ + enum AVStreamParseType need_parsing; + struct AVCodecParserContext *parser; + + /** + * last packet in packet_buffer for this stream when muxing. + */ + struct AVPacketList *last_in_packet_buffer; + AVProbeData probe_data; +#define MAX_REORDER_DELAY 16 + int64_t pts_buffer[MAX_REORDER_DELAY+1]; + + AVIndexEntry *index_entries; /**< Only used if the format does not + support seeking natively. */ + int nb_index_entries; + unsigned int index_entries_allocated_size; + + /** + * Real base framerate of the stream. + * This is the lowest framerate with which all timestamps can be + * represented accurately (it is the least common multiple of all + * framerates in the stream). Note, this value is just a guess! + * For example, if the time base is 1/90000 and all frames have either + * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. + * + * Code outside avformat should access this field using: + * av_stream_get/set_r_frame_rate(stream) + */ + AVRational r_frame_rate; + + /** + * Stream Identifier + * This is the MPEG-TS stream identifier +1 + * 0 means unknown + */ + int stream_identifier; + + int64_t interleaver_chunk_size; + int64_t interleaver_chunk_duration; + + /** + * stream probing state + * -1 -> probing finished + * 0 -> no probing requested + * rest -> perform probing with request_probe being the minimum score to accept. + * NOT PART OF PUBLIC API + */ + int request_probe; + /** + * Indicates that everything up to the next keyframe + * should be discarded. + */ + int skip_to_keyframe; + + /** + * Number of samples to skip at the start of the frame decoded from the next packet. + */ + int skip_samples; + + /** + * If not 0, the number of samples that should be skipped from the start of + * the stream (the samples are removed from packets with pts==0, which also + * assumes negative timestamps do not happen). + * Intended for use with formats such as mp3 with ad-hoc gapless audio + * support. + */ + int64_t start_skip_samples; + + /** + * If not 0, the first audio sample that should be discarded from the stream. + * This is broken by design (needs global sample count), but can't be + * avoided for broken by design formats such as mp3 with ad-hoc gapless + * audio support. + */ + int64_t first_discard_sample; + + /** + * The sample after last sample that is intended to be discarded after + * first_discard_sample. Works on frame boundaries only. Used to prevent + * early EOF if the gapless info is broken (considered concatenated mp3s). + */ + int64_t last_discard_sample; + + /** + * Number of internally decoded frames, used internally in libavformat, do not access + * its lifetime differs from info which is why it is not in that structure. + */ + int nb_decoded_frames; + + /** + * Timestamp offset added to timestamps before muxing + * NOT PART OF PUBLIC API + */ + int64_t mux_ts_offset; + + /** + * Internal data to check for wrapping of the time stamp + */ + int64_t pts_wrap_reference; + + /** + * Options for behavior, when a wrap is detected. + * + * Defined by AV_PTS_WRAP_ values. + * + * If correction is enabled, there are two possibilities: + * If the first time stamp is near the wrap point, the wrap offset + * will be subtracted, which will create negative time stamps. + * Otherwise the offset will be added. + */ + int pts_wrap_behavior; + + /** + * Internal data to prevent doing update_initial_durations() twice + */ + int update_initial_durations_done; + + /** + * Internal data to generate dts from pts + */ + int64_t pts_reorder_error[MAX_REORDER_DELAY+1]; + uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1]; + + /** + * Internal data to analyze DTS and detect faulty mpeg streams + */ + int64_t last_dts_for_order_check; + uint8_t dts_ordered; + uint8_t dts_misordered; + + /** + * Internal data to inject global side data + */ + int inject_global_side_data; + + /***************************************************************** + * All fields above this line are not part of the public API. + * Fields below are part of the public API and ABI again. + ***************************************************************** + */ + + /** + * String containing paris of key and values describing recommended encoder configuration. + * Paris are separated by ','. + * Keys are separated from values by '='. + */ + char *recommended_encoder_configuration; + + /** + * display aspect ratio (0 if unknown) + * - encoding: unused + * - decoding: Set by libavformat to calculate sample_aspect_ratio internally + */ + AVRational display_aspect_ratio; + + struct FFFrac *priv_pts; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVStreamInternal *internal; + + /* + * Codec parameters associated with this stream. Allocated and freed by + * libavformat in avformat_new_stream() and avformat_free_context() + * respectively. + * + * - demuxing: filled by libavformat on stream creation or in + * avformat_find_stream_info() + * - muxing: filled by the caller before avformat_write_header() + */ + AVCodecParameters *codecpar; +} AVStream; + +AVRational av_stream_get_r_frame_rate(const AVStream *s); +void av_stream_set_r_frame_rate(AVStream *s, AVRational r); +struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); +char* av_stream_get_recommended_encoder_configuration(const AVStream *s); +void av_stream_set_recommended_encoder_configuration(AVStream *s, char *configuration); + +/** + * Returns the pts of the last muxed packet + its duration + * + * the retuned value is undefined when used with a demuxer. + */ +int64_t av_stream_get_end_pts(const AVStream *st); + +#define AV_PROGRAM_RUNNING 1 + +/** + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVProgram) must not be used outside libav*. + */ +typedef struct AVProgram { + int id; + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; + AVDictionary *metadata; + + int program_num; + int pmt_pid; + int pcr_pid; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int64_t start_time; + int64_t end_time; + + int64_t pts_wrap_reference; ///< reference dts for wrap detection + int pts_wrap_behavior; ///< behavior on wrap detection +} AVProgram; + +#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present + (streams are added dynamically) */ + +typedef struct AVChapter { + int id; ///< unique ID to identify the chapter + AVRational time_base; ///< time base in which the start/end timestamps are specified + int64_t start, end; ///< chapter start/end time in time_base units + AVDictionary *metadata; +} AVChapter; + + +/** + * Callback used by devices to communicate with application. + */ +typedef int (*av_format_control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + +typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * The duration of a video can be estimated through various ways, and this enum can be used + * to know how the duration was estimated. + */ +enum AVDurationEstimationMethod { + AVFMT_DURATION_FROM_PTS, ///< Duration accurately estimated from PTSes + AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration + AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate) +}; + +typedef struct AVFormatInternal AVFormatInternal; + +/** + * Format I/O context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVFormatContext) must not be used outside libav*, use + * avformat_alloc_context() to create an AVFormatContext. + * + * Fields can be accessed through AVOptions (av_opt*), + * the name string used matches the associated command line parameter name and + * can be found in libavformat/options_table.h. + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + */ +typedef struct AVFormatContext { + /** + * A class for logging and @ref avoptions. Set by avformat_alloc_context(). + * Exports (de)muxer private options if they exist. + */ + const AVClass *av_class; + + /** + * The input container format. + * + * Demuxing only, set by avformat_open_input(). + */ + struct AVInputFormat *iformat; + + /** + * The output container format. + * + * Muxing only, must be set by the caller before avformat_write_header(). + */ + struct AVOutputFormat *oformat; + + /** + * Format private data. This is an AVOptions-enabled struct + * if and only if iformat/oformat.priv_class is not NULL. + * + * - muxing: set by avformat_write_header() + * - demuxing: set by avformat_open_input() + */ + void *priv_data; + + /** + * I/O context. + * + * - demuxing: either set by the user before avformat_open_input() (then + * the user must close it manually) or set by avformat_open_input(). + * - muxing: set by the user before avformat_write_header(). The caller must + * take care of closing / freeing the IO context. + * + * Do NOT set this field if AVFMT_NOFILE flag is set in + * iformat/oformat.flags. In such a case, the (de)muxer will handle + * I/O in some other way and this field will be NULL. + */ + AVIOContext *pb; + + /* stream info */ + /** + * Flags signalling stream properties. A combination of AVFMTCTX_*. + * Set by libavformat. + */ + int ctx_flags; + + /** + * Number of elements in AVFormatContext.streams. + * + * Set by avformat_new_stream(), must not be modified by any other code. + */ + unsigned int nb_streams; + /** + * A list of all streams in the file. New streams are created with + * avformat_new_stream(). + * + * - demuxing: streams are created by libavformat in avformat_open_input(). + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also + * appear in av_read_frame(). + * - muxing: streams are created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStream **streams; + + /** + * input or output filename + * + * - demuxing: set by avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + */ + char filename[1024]; + + /** + * Position of the first frame of the component, in + * AV_TIME_BASE fractional seconds. NEVER set this value directly: + * It is deduced from the AVStream values. + * + * Demuxing only, set by libavformat. + */ + int64_t start_time; + + /** + * Duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also do not set any of them. This is deduced from the + * AVStream values if not set. + * + * Demuxing only, set by libavformat. + */ + int64_t duration; + + /** + * Total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ + int64_t bit_rate; + + unsigned int packet_size; + int max_delay; + + /** + * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*. + * Set by the user before avformat_open_input() / avformat_write_header(). + */ + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< Generate missing pts even if it requires parsing future frames. +#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index. +#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input. +#define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS +#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container +#define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled +#define AVFMT_FLAG_NOBUFFER 0x0040 ///< Do not buffer frames when possible +#define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it. +#define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted +#define AVFMT_FLAG_FLUSH_PACKETS 0x0200 ///< Flush the AVIOContext every packet. +/** + * When muxing, try to avoid writing any random/volatile data to the output. + * This includes any random IDs, real-time timestamps/dates, muxer version, etc. + * + * This flag is mainly intended for testing. + */ +#define AVFMT_FLAG_BITEXACT 0x0400 +#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Enable RTP MP4A-LATM payload +#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) +#define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted) +#if FF_API_LAVF_KEEPSIDE_FLAG +#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Don't merge side data but keep it separate. Deprecated, will be the default. +#endif +#define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Wait for packet data before writing a header, and add bitstream filters as requested by the muxer + + /** + * Maximum size of the data read from input for determining + * the input container format. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int64_t probesize; + + /** + * Maximum duration (in AV_TIME_BASE units) of the data read + * from input in avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + * Can be set to 0 to let avformat choose using a heuristic. + */ + int64_t max_analyze_duration; + + const uint8_t *key; + int keylen; + + unsigned int nb_programs; + AVProgram **programs; + + /** + * Forced video codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID video_codec_id; + + /** + * Forced audio codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID audio_codec_id; + + /** + * Forced subtitle codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID subtitle_codec_id; + + /** + * Maximum amount of memory in bytes to use for the index of each stream. + * If the index exceeds this size, entries will be discarded as + * needed to maintain a smaller size. This can lead to slower or less + * accurate seeking (depends on demuxer). + * Demuxers for which a full in-memory index is mandatory will ignore + * this. + * - muxing: unused + * - demuxing: set by user + */ + unsigned int max_index_size; + + /** + * Maximum amount of memory in bytes to use for buffering frames + * obtained from realtime capture devices. + */ + unsigned int max_picture_buffer; + + /** + * Number of chapters in AVChapter array. + * When muxing, chapters are normally written in the file header, + * so nb_chapters should normally be initialized before write_header + * is called. Some muxers (e.g. mov and mkv) can also write chapters + * in the trailer. To write chapters in the trailer, nb_chapters + * must be zero when write_header is called and non-zero when + * write_trailer is called. + * - muxing: set by user + * - demuxing: set by libavformat + */ + unsigned int nb_chapters; + AVChapter **chapters; + + /** + * Metadata that applies to the whole file. + * + * - demuxing: set by libavformat in avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * Freed by libavformat in avformat_free_context(). + */ + AVDictionary *metadata; + + /** + * Start time of the stream in real world time, in microseconds + * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the + * stream was captured at this real world time. + * - muxing: Set by the caller before avformat_write_header(). If set to + * either 0 or AV_NOPTS_VALUE, then the current wall-time will + * be used. + * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that + * the value may become known after some number of frames + * have been received. + */ + int64_t start_time_realtime; + + /** + * The number of frames used for determining the framerate in + * avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + */ + int fps_probe_size; + + /** + * Error recognition; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int error_recognition; + + /** + * Custom interrupt callbacks for the I/O layer. + * + * demuxing: set by the user before avformat_open_input(). + * muxing: set by the user before avformat_write_header() + * (mainly useful for AVFMT_NOFILE formats). The callback + * should also be passed to avio_open2() if it's used to + * open the file. + */ + AVIOInterruptCB interrupt_callback; + + /** + * Flags to enable debugging. + */ + int debug; +#define FF_FDEBUG_TS 0x0001 + + /** + * Maximum buffering duration for interleaving. + * + * To ensure all the streams are interleaved correctly, + * av_interleaved_write_frame() will wait until it has at least one packet + * for each stream before actually writing any packets to the output file. + * When some streams are "sparse" (i.e. there are large gaps between + * successive packets), this can result in excessive buffering. + * + * This field specifies the maximum difference between the timestamps of the + * first and the last packet in the muxing queue, above which libavformat + * will output a packet regardless of whether it has queued a packet for all + * the streams. + * + * Muxing only, set by the caller before avformat_write_header(). + */ + int64_t max_interleave_delta; + + /** + * Allow non-standard and experimental extension + * @see AVCodecContext.strict_std_compliance + */ + int strict_std_compliance; + + /** + * Flags for the user to detect events happening on the file. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVFMT_EVENT_FLAG_*. + */ + int event_flags; +#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * Maximum number of packets to read while waiting for the first timestamp. + * Decoding only. + */ + int max_ts_probe; + + /** + * Avoid negative timestamps during muxing. + * Any value of the AVFMT_AVOID_NEG_TS_* constants. + * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use) + * - muxing: Set by user + * - demuxing: unused + */ + int avoid_negative_ts; +#define AVFMT_AVOID_NEG_TS_AUTO -1 ///< Enabled when required by target format +#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative +#define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 ///< Shift timestamps so that they start at 0 + + /** + * Transport stream id. + * This will be moved into demuxer private options. Thus no API/ABI compatibility + */ + int ts_id; + + /** + * Audio preload in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int audio_preload; + + /** + * Max chunk time in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_duration; + + /** + * Max chunk size in bytes + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_size; + + /** + * forces the use of wallclock timestamps as pts/dts of packets + * This has undefined results in the presence of B frames. + * - encoding: unused + * - decoding: Set by user + */ + int use_wallclock_as_timestamps; + + /** + * avio flags, used to force AVIO_FLAG_DIRECT. + * - encoding: unused + * - decoding: Set by user + */ + int avio_flags; + + /** + * The duration field can be estimated through various ways, and this field can be used + * to know how the duration was estimated. + * - encoding: unused + * - decoding: Read by user + */ + enum AVDurationEstimationMethod duration_estimation_method; + + /** + * Skip initial bytes when opening stream + * - encoding: unused + * - decoding: Set by user + */ + int64_t skip_initial_bytes; + + /** + * Correct single timestamp overflows + * - encoding: unused + * - decoding: Set by user + */ + unsigned int correct_ts_overflow; + + /** + * Force seeking to any (also non key) frames. + * - encoding: unused + * - decoding: Set by user + */ + int seek2any; + + /** + * Flush the I/O context after each packet. + * - encoding: Set by user + * - decoding: unused + */ + int flush_packets; + + /** + * format probing score. + * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes + * the format. + * - encoding: unused + * - decoding: set by avformat, read by user + */ + int probe_score; + + /** + * number of bytes to read maximally to identify format. + * - encoding: unused + * - decoding: set by user + */ + int format_probesize; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * ',' separated list of allowed demuxers. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *format_whitelist; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVFormatInternal *internal; + + /** + * IO repositioned flag. + * This is set by avformat when the underlaying IO context read pointer + * is repositioned, for example when doing byte based seeking. + * Demuxers can use the flag to detect such changes. + */ + int io_repositioned; + + /** + * Forced video codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *video_codec; + + /** + * Forced audio codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *audio_codec; + + /** + * Forced subtitle codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *subtitle_codec; + + /** + * Forced data codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *data_codec; + + /** + * Number of bytes to be written as padding in a metadata header. + * Demuxing: Unused. + * Muxing: Set by user via av_format_set_metadata_header_padding. + */ + int metadata_header_padding; + + /** + * User data. + * This is a place for some private data of the user. + */ + void *opaque; + + /** + * Callback used by devices to communicate with application. + */ + av_format_control_message control_message_cb; + + /** + * Output timestamp offset, in microseconds. + * Muxing: set by user + */ + int64_t output_ts_offset; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - muxing: Set by user. + * - demuxing: Set by user. + */ + uint8_t *dump_separator; + + /** + * Forced Data codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID data_codec_id; + +#if FF_API_OLD_OPEN_CALLBACKS + /** + * Called to open further IO contexts when needed for demuxing. + * + * This can be set by the user application to perform security checks on + * the URLs before opening them. + * The function should behave like avio_open2(), AVFormatContext is provided + * as contextual information and to reach AVFormatContext.opaque. + * + * If NULL then some simple checks are used together with avio_open2(). + * + * Must not be accessed directly from outside avformat. + * @See av_format_set_open_cb() + * + * Demuxing: Set by user. + * + * @deprecated Use io_open and io_close. + */ + attribute_deprecated + int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); +#endif + + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_whitelist; + + /* + * A callback for opening new IO streams. + * + * Whenever a muxer or a demuxer needs to open an IO stream (typically from + * avformat_open_input() for demuxers, but for certain formats can happen at + * other times as well), it will call this callback to obtain an IO context. + * + * @param s the format context + * @param pb on success, the newly opened IO context should be returned here + * @param url the url to open + * @param flags a combination of AVIO_FLAG_* + * @param options a dictionary of additional options, with the same + * semantics as in avio_open2() + * @return 0 on success, a negative AVERROR code on failure + * + * @note Certain muxers and demuxers do nesting, i.e. they open one or more + * additional internal format contexts. Thus the AVFormatContext pointer + * passed to this callback may be different from the one facing the caller. + * It will, however, have the same 'opaque' field. + */ + int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, + int flags, AVDictionary **options); + + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + */ + void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); + + /** + * ',' separated list of disallowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_blacklist; + + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user + */ + int max_streams; +} AVFormatContext; + +/** + * Accessors for some AVFormatContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +int av_format_get_probe_score(const AVFormatContext *s); +AVCodec * av_format_get_video_codec(const AVFormatContext *s); +void av_format_set_video_codec(AVFormatContext *s, AVCodec *c); +AVCodec * av_format_get_audio_codec(const AVFormatContext *s); +void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c); +AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s); +void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c); +AVCodec * av_format_get_data_codec(const AVFormatContext *s); +void av_format_set_data_codec(AVFormatContext *s, AVCodec *c); +int av_format_get_metadata_header_padding(const AVFormatContext *s); +void av_format_set_metadata_header_padding(AVFormatContext *s, int c); +void * av_format_get_opaque(const AVFormatContext *s); +void av_format_set_opaque(AVFormatContext *s, void *opaque); +av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); +void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); +#if FF_API_OLD_OPEN_CALLBACKS +attribute_deprecated AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); +attribute_deprecated void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); +#endif + +/** + * This function will cause global side data to be injected in the next packet + * of each stream as well as after any subsequent seek. + */ +void av_format_inject_global_side_data(AVFormatContext *s); + +/** + * Returns the method used to set ctx->duration. + * + * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. + */ +enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); + +typedef struct AVPacketList { + AVPacket pkt; + struct AVPacketList *next; +} AVPacketList; + + +/** + * @defgroup lavf_core Core functions + * @ingroup libavf + * + * Functions for querying libavformat capabilities, allocating core structures, + * etc. + * @{ + */ + +/** + * Return the LIBAVFORMAT_VERSION_INT constant. + */ +unsigned avformat_version(void); + +/** + * Return the libavformat build-time configuration. + */ +const char *avformat_configuration(void); + +/** + * Return the libavformat license. + */ +const char *avformat_license(void); + +/** + * Initialize libavformat and register all the muxers, demuxers and + * protocols. If you do not call this function, then you can select + * exactly which formats you want to support. + * + * @see av_register_input_format() + * @see av_register_output_format() + */ +void av_register_all(void); + +void av_register_input_format(AVInputFormat *format); +void av_register_output_format(AVOutputFormat *format); + +/** + * Do global initialization of network components. This is optional, + * but recommended, since it avoids the overhead of implicitly + * doing the setup for each session. + * + * Calling this function will become mandatory if using network + * protocols at some major version bump. + */ +int avformat_network_init(void); + +/** + * Undo the initialization done by avformat_network_init. + */ +int avformat_network_deinit(void); + +/** + * If f is NULL, returns the first registered input format, + * if f is non-NULL, returns the next registered input format after f + * or NULL if f is the last one. + */ +AVInputFormat *av_iformat_next(const AVInputFormat *f); + +/** + * If f is NULL, returns the first registered output format, + * if f is non-NULL, returns the next registered output format after f + * or NULL if f is the last one. + */ +AVOutputFormat *av_oformat_next(const AVOutputFormat *f); + +/** + * Allocate an AVFormatContext. + * avformat_free_context() can be used to free the context and everything + * allocated by the framework within it. + */ +AVFormatContext *avformat_alloc_context(void); + +/** + * Free an AVFormatContext and all its streams. + * @param s context to free + */ +void avformat_free_context(AVFormatContext *s); + +/** + * Get the AVClass for AVFormatContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avformat_get_class(void); + +/** + * Add a new stream to a media file. + * + * When demuxing, it is called by the demuxer in read_header(). If the + * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also + * be called in read_packet(). + * + * When muxing, should be called by the user before avformat_write_header(). + * + * User is required to call avcodec_close() and avformat_free_context() to + * clean up the allocation by avformat_new_stream(). + * + * @param s media file handle + * @param c If non-NULL, the AVCodecContext corresponding to the new stream + * will be initialized to use this codec. This is needed for e.g. codec-specific + * defaults to be set, so codec should be provided if it is known. + * + * @return newly created stream or NULL on error. + */ +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); + +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * st. + * @param size side information size + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Allocate new information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t *av_stream_new_side_data(AVStream *stream, + enum AVPacketSideDataType type, int size); +/** + * Get side information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +#if FF_API_NOCONST_GET_SIDE_DATA +uint8_t *av_stream_get_side_data(AVStream *stream, + enum AVPacketSideDataType type, int *size); +#else +uint8_t *av_stream_get_side_data(const AVStream *stream, + enum AVPacketSideDataType type, int *size); +#endif + +AVProgram *av_new_program(AVFormatContext *s, int id); + +/** + * @} + */ + + +/** + * Allocate an AVFormatContext for an output format. + * avformat_free_context() can be used to free the context and + * everything allocated by the framework within it. + * + * @param *ctx is set to the created format context, or to NULL in + * case of failure + * @param oformat format to use for allocating the context, if NULL + * format_name and filename are used instead + * @param format_name the name of output format to use for allocating the + * context, if NULL filename is used instead + * @param filename the name of the filename to use for allocating the + * context, may be NULL + * @return >= 0 in case of success, a negative AVERROR code in case of + * failure + */ +int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, + const char *format_name, const char *filename); + +/** + * @addtogroup lavf_decoding + * @{ + */ + +/** + * Find AVInputFormat based on the short name of the input format. + */ +AVInputFormat *av_find_input_format(const char *short_name); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + */ +AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_max A probe score larger that this is required to accept a + * detection, the variable is set to the actual detection + * score afterwards. + * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended + * to retry with a larger probe buffer. + */ +AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max); + +/** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_ret The score of the best detection. + */ +AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret); + +/** + * Probe a bytestream to determine the input format. Each time a probe returns + * with a score that is too low, the probe buffer size is increased and another + * attempt is made. When the maximum probe size is reached, the input format + * with the highest score is returned. + * + * @param pb the bytestream to probe + * @param fmt the input format is put here + * @param url the url of the stream + * @param logctx the log context + * @param offset the offset within the bytestream to probe from + * @param max_probe_size the maximum probe buffer size (zero for default) + * @return the score in case of success, a negative value corresponding to an + * the maximal score is AVPROBE_SCORE_MAX + * AVERROR code otherwise + */ +int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Like av_probe_input_buffer2() but returns 0 on success + */ +int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Open an input stream and read the header. The codecs are not opened. + * The stream must be closed with avformat_close_input(). + * + * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). + * May be a pointer to NULL, in which case an AVFormatContext is allocated by this + * function and written into ps. + * Note that a user-supplied AVFormatContext will be freed on failure. + * @param url URL of the stream to open. + * @param fmt If non-NULL, this parameter forces a specific input format. + * Otherwise the format is autodetected. + * @param options A dictionary filled with AVFormatContext and demuxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return 0 on success, a negative AVERROR on failure. + * + * @note If you want to use custom IO, preallocate the format context and set its pb field. + */ +int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); + +attribute_deprecated +int av_demuxer_open(AVFormatContext *ic); + +/** + * Read packets of a media file to get stream information. This + * is useful for file formats with no headers such as MPEG. This + * function also computes the real framerate in case of MPEG-2 repeat + * frame mode. + * The logical file position is not changed by this function; + * examined packets may be buffered for later processing. + * + * @param ic media file handle + * @param options If non-NULL, an ic.nb_streams long array of pointers to + * dictionaries, where i-th member contains options for + * codec corresponding to i-th stream. + * On return each dictionary will be filled with options that were not found. + * @return >=0 if OK, AVERROR_xxx on error + * + * @note this function isn't guaranteed to open all the codecs, so + * options being non-empty at return is a perfectly normal behavior. + * + * @todo Let the user decide somehow what information is needed so that + * we do not waste time getting stuff the user does not need. + */ +int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); + +/** + * Find the programs which belong to a given stream. + * + * @param ic media file handle + * @param last the last found program, the search will start after this + * program, or from the beginning if it is NULL + * @param s stream index + * @return the next program which belongs to s, NULL if no program is found or + * the last program is not among the programs of ic. + */ +AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); + +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); + +/** + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + */ +int av_find_best_stream(AVFormatContext *ic, + enum AVMediaType type, + int wanted_stream_nb, + int related_stream, + AVCodec **decoder_ret, + int flags); + +/** + * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. + * + * If pkt->buf is NULL, then the packet is valid until the next + * av_read_frame() or until avformat_close_input(). Otherwise the packet + * is valid indefinitely. In both cases the packet must be freed with + * av_packet_unref when it is no longer needed. For video, the packet contains + * exactly one frame. For audio, it contains an integer number of frames if each + * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames + * have a variable size (e.g. MPEG audio), then it contains one frame. + * + * pkt->pts, pkt->dts and pkt->duration are always set to correct + * values in AVStream.time_base units (and guessed if the format cannot + * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format + * has B-frames, so it is better to rely on pkt->dts if you do not + * decompress the payload. + * + * @return 0 if OK, < 0 on error or end of file + */ +int av_read_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Seek to the keyframe at timestamp. + * 'timestamp' in 'stream_index'. + * + * @param s media file handle + * @param stream_index If stream_index is (-1), a default + * stream is selected, and timestamp is automatically converted + * from AV_TIME_BASE units to the stream specific time_base. + * @param timestamp Timestamp in AVStream.time_base units + * or, if no stream is specified, in AV_TIME_BASE units. + * @param flags flags which select direction and seeking mode + * @return >= 0 on success + */ +int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, + int flags); + +/** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + * + * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and + * are the file position (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames + * in the stream with stream_index (this may not be supported by all demuxers). + * Otherwise all timestamps are in units of the stream selected by stream_index + * or if stream_index is -1, in AV_TIME_BASE units. + * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as + * keyframes (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored. + * + * @param s media file handle + * @param stream_index index of the stream which is used as time base reference + * @param min_ts smallest acceptable timestamp + * @param ts target timestamp + * @param max_ts largest acceptable timestamp + * @param flags flags + * @return >=0 on success, error code otherwise + * + * @note This is part of the new seek API which is still under construction. + * Thus do not use this yet. It may change at any time, do not expect + * ABI compatibility yet! + */ +int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + +/** + * Discard all internally buffered data. This can be useful when dealing with + * discontinuities in the byte stream. Generally works only with formats that + * can resync. This includes headerless formats like MPEG-TS/TS but should also + * work with NUT, Ogg and in a limited way AVI for example. + * + * The set of streams, the detected duration, stream parameters and codecs do + * not change when calling this function. If you want a complete reset, it's + * better to open a new AVFormatContext. + * + * This does not flush the AVIOContext (s->pb). If necessary, call + * avio_flush(s->pb) before calling this function. + * + * @param s media file handle + * @return >=0 on success, error code otherwise + */ +int avformat_flush(AVFormatContext *s); + +/** + * Start playing a network-based stream (e.g. RTSP stream) at the + * current position. + */ +int av_read_play(AVFormatContext *s); + +/** + * Pause a network-based stream (e.g. RTSP stream). + * + * Use av_read_play() to resume it. + */ +int av_read_pause(AVFormatContext *s); + +/** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + */ +void avformat_close_input(AVFormatContext **s); +/** + * @} + */ + +#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward +#define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +#define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes +#define AVSEEK_FLAG_FRAME 8 ///< seeking based on frame number + +/** + * @addtogroup lavf_encoding + * @{ + */ + +#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header +#define AVSTREAM_INIT_IN_INIT_OUTPUT 1 ///< stream parameters initialized in avformat_init_output + +/** + * Allocate the stream private data and write the stream header to + * an output media file. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec had not already been fully initialized in avformat_init, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec had already been fully initialized in avformat_init, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. + */ +av_warn_unused_result +int avformat_write_header(AVFormatContext *s, AVDictionary **options); + +/** + * Allocate the stream private data and initialize the codec, but do not write the header. + * May optionally be used before avformat_write_header to initialize stream parameters + * before actually writing the header. + * If using this function, do not pass the same options to avformat_write_header. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec requires avformat_write_header to fully initialize, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec has been fully initialized, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. + */ +av_warn_unused_result +int avformat_init_output(AVFormatContext *s, AVDictionary **options); + +/** + * Write a packet to an output media file. + * + * This function passes the packet directly to the muxer, without any buffering + * or reordering. The caller is responsible for correctly interleaving the + * packets if the format requires it. Callers that want libavformat to handle + * the interleaving should call av_interleaved_write_frame() instead of this + * function. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. Note that unlike + * av_interleaved_write_frame(), this function does not take + * ownership of the packet passed to it (though some muxers may make + * an internal reference to the input packet). + *
+ * This parameter can be NULL (at any time, not just at the end), in + * order to immediately flush data buffered within the muxer, for + * muxers that buffer up data internally before writing it to the + * output. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets passed to this function must be strictly + * increasing when compared in their respective timebases (unless the + * output format is flagged with the AVFMT_TS_NONSTRICT, then they + * merely have to be nondecreasing). @ref AVPacket.duration + * "duration") should also be set if known. + * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush + * + * @see av_interleaved_write_frame() + */ +int av_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write a packet to an output media file ensuring correct interleaving. + * + * This function will buffer the packets internally as needed to make sure the + * packets in the output file are properly interleaved in the order of + * increasing dts. Callers doing their own interleaving should call + * av_write_frame() instead of this function. + * + * Using this function instead of av_write_frame() can give muxers advance + * knowledge of future packets, improving e.g. the behaviour of the mp4 + * muxer for VFR content in fragmenting mode. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. + *
+ * If the packet is reference-counted, this function will take + * ownership of this reference and unreference it later when it sees + * fit. + * The caller must not access the data through this reference after + * this function returns. If the packet is not reference-counted, + * libavformat will make a copy. + *
+ * This parameter can be NULL (at any time, not just at the end), to + * flush the interleaving queues. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets in one stream must be strictly + * increasing (unless the output format is flagged with the + * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing). + * @ref AVPacket.duration "duration") should also be set if known. + * + * @return 0 on success, a negative AVERROR on error. Libavformat will always + * take care of freeing the packet, even if this function fails. + * + * @see av_write_frame(), AVFormatContext.max_interleave_delta + */ +int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write an uncoded frame to an output media file. + * + * The frame must be correctly interleaved according to the container + * specification; if not, then av_interleaved_write_frame() must be used. + * + * See av_interleaved_write_frame() for details. + */ +int av_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Write an uncoded frame to an output media file. + * + * If the muxer supports it, this function makes it possible to write an AVFrame + * structure directly, without encoding it into a packet. + * It is mostly useful for devices and similar special muxers that use raw + * video or PCM data and will not serialize it into a byte stream. + * + * To test whether it is possible to use it with a given muxer and stream, + * use av_write_uncoded_frame_query(). + * + * The caller gives up ownership of the frame and must not access it + * afterwards. + * + * @return >=0 for success, a negative code on error + */ +int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Test whether a muxer supports uncoded frame. + * + * @return >=0 if an uncoded frame can be written to that muxer and stream, + * <0 if not + */ +int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index); + +/** + * Write the stream trailer to an output media file and free the + * file private data. + * + * May only be called after a successful call to avformat_write_header. + * + * @param s media file handle + * @return 0 if OK, AVERROR_xxx on error + */ +int av_write_trailer(AVFormatContext *s); + +/** + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if + * there is no match. + * + * @param short_name if non-NULL checks if short_name matches with the + * names of the registered formats + * @param filename if non-NULL checks if filename terminates with the + * extensions of the registered formats + * @param mime_type if non-NULL checks if mime_type matches with the + * MIME type of the registered formats + */ +AVOutputFormat *av_guess_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * Guess the codec ID based upon muxer and filename. + */ +enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, + const char *filename, const char *mime_type, + enum AVMediaType type); + +/** + * Get timing information for the data currently output. + * The exact meaning of "currently output" depends on the format. + * It is mostly relevant for devices that have an internal buffer and/or + * work in real time. + * @param s media file handle + * @param stream stream in the media file + * @param[out] dts DTS of the last packet output for the stream, in stream + * time_base units + * @param[out] wall absolute time when that packet whas output, + * in microsecond + * @return 0 if OK, AVERROR(ENOSYS) if the format does not support it + * Note: some formats or devices may not allow to measure dts and wall + * atomically. + */ +int av_get_output_timestamp(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + + +/** + * @} + */ + + +/** + * @defgroup lavf_misc Utility functions + * @ingroup libavf + * @{ + * + * Miscellaneous utility functions related to both muxing and demuxing + * (or neither). + */ + +/** + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump(FILE *f, const uint8_t *buf, int size); + +/** + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size); + +/** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st); + + +/** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload, + const AVStream *st); + +/** + * Get the AVCodecID for the given codec tag tag. + * If no codec id is found returns AV_CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param tag codec tag to match to a codec ID + */ +enum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); + +/** + * Get the codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec ID to match to a codec tag + */ +unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id); + +/** + * Get the codec tag for the given codec id. + * + * @param tags list of supported codec_id - codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec id that should be searched for in the list + * @param tag A pointer to the found tag + * @return 0 if id was not found in tags, > 0 if it was found + */ +int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id, + unsigned int *tag); + +int av_find_default_stream_index(AVFormatContext *s); + +/** + * Get the index for a specific timestamp. + * + * @param st stream that the timestamp belongs to + * @param timestamp timestamp to retrieve the index for + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise + * @return < 0 if no such timestamp could be found + */ +int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); + +/** + * Add an index entry into a sorted list. Update the entry if the list + * already contains it. + * + * @param timestamp timestamp in the time base of the given stream + */ +int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, + int size, int distance, int flags); + + +/** + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + */ +void av_url_split(char *proto, int proto_size, + char *authorization, int authorization_size, + char *hostname, int hostname_size, + int *port_ptr, + char *path, int path_size, + const char *url); + + +/** + * Print detailed information about the input or output format, such as + * duration, bitrate, streams, container, programs, metadata, side data, + * codec and time base. + * + * @param ic the context to analyze + * @param index index of the stream to dump information about + * @param url the URL to print, such as source or destination file + * @param is_output Select whether the specified context is an input(0) or output(1) + */ +void av_dump_format(AVFormatContext *ic, + int index, + const char *url, + int is_output); + + +#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d + +/** + * Return in 'buf' the path with '%d' replaced by a number. + * + * Also handles the '%0nd' format where 'n' is the total number + * of digits and '%%'. + * + * @param buf destination buffer + * @param buf_size destination buffer size + * @param path numbered sequence string + * @param number frame number + * @param flags AV_FRAME_FILENAME_FLAGS_* + * @return 0 if OK, -1 on format error + */ +int av_get_frame_filename2(char *buf, int buf_size, + const char *path, int number, int flags); + +int av_get_frame_filename(char *buf, int buf_size, + const char *path, int number); + +/** + * Check whether filename actually is a numbered sequence generator. + * + * @param filename possible numbered sequence string + * @return 1 if a valid numbered sequence string, 0 otherwise + */ +int av_filename_number_test(const char *filename); + +/** + * Generate an SDP for an RTP session. + * + * Note, this overwrites the id values of AVStreams in the muxer contexts + * for getting unique dynamic payload types. + * + * @param ac array of AVFormatContexts describing the RTP streams. If the + * array is composed by only one context, such context can contain + * multiple AVStreams (one AVStream per RTP stream). Otherwise, + * all the contexts in the array (an AVCodecContext per RTP stream) + * must contain only one AVStream. + * @param n_files number of AVCodecContexts contained in ac + * @param buf buffer where the SDP will be stored (must be allocated by + * the caller) + * @param size the size of the buffer + * @return 0 if OK, AVERROR_xxx on error + */ +int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size); + +/** + * Return a positive value if the given filename has one of the given + * extensions, 0 otherwise. + * + * @param filename file name to check against the given extensions + * @param extensions a comma-separated list of filename extensions + */ +int av_match_ext(const char *filename, const char *extensions); + +/** + * Test if the given container can store a codec. + * + * @param ofmt container to check for compatibility + * @param codec_id codec to potentially store in container + * @param std_compliance standards compliance level, one of FF_COMPLIANCE_* + * + * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. + * A negative number if this information is not available. + */ +int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id, + int std_compliance); + +/** + * @defgroup riff_fourcc RIFF FourCCs + * @{ + * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are + * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the + * following code: + * @code + * uint32_t tag = MKTAG('H', '2', '6', '4'); + * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; + * enum AVCodecID id = av_codec_get_id(table, tag); + * @endcode + */ +/** + * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_video_tags(void); +/** + * @return the table mapping RIFF FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_audio_tags(void); +/** + * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_video_tags(void); +/** + * @return the table mapping MOV FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_audio_tags(void); + +/** + * @} + */ + +/** + * Guess the sample aspect ratio of a frame, based on both the stream and the + * frame aspect ratio. + * + * Since the frame aspect ratio is set by the codec but the stream aspect ratio + * is set by the demuxer, these two may not be equal. This function tries to + * return the value that you should use if you would like to display the frame. + * + * Basic logic is to use the stream aspect ratio if it is set to something sane + * otherwise use the frame aspect ratio. This way a container setting, which is + * usually easy to modify can override the coded value in the frames. + * + * @param format the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame with the aspect ratio to be determined + * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea + */ +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame); + +/** + * Guess the frame rate, based on both the container and codec information. + * + * @param ctx the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame for which the frame rate should be determined, may be NULL + * @return the guessed (valid) frame rate, 0/1 if no idea + */ +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame); + +/** + * Check if the stream st contained in s is matched by the stream specifier + * spec. + * + * See the "stream specifiers" chapter in the documentation for the syntax + * of spec. + * + * @return >0 if st is matched by spec; + * 0 if st is not matched by spec; + * AVERROR code if spec is invalid + * + * @note A stream specifier can match several streams in the format. + */ +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, + const char *spec); + +int avformat_queue_attached_pictures(AVFormatContext *s); + +#if FF_API_OLD_BSF +/** + * Apply a list of bitstream filters to a packet. + * + * @param codec AVCodecContext, usually from an AVStream + * @param pkt the packet to apply filters to. If, on success, the returned + * packet has size == 0 and side_data_elems == 0, it indicates that + * the packet should be dropped + * @param bsfc a NULL-terminated list of filters to apply + * @return >=0 on success; + * AVERROR code on failure + */ +attribute_deprecated +int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt, + AVBitStreamFilterContext *bsfc); +#endif + +enum AVTimebaseSource { + AVFMT_TBCF_AUTO = -1, + AVFMT_TBCF_DECODER, + AVFMT_TBCF_DEMUXER, +#if FF_API_R_FRAME_RATE + AVFMT_TBCF_R_FRAMERATE, +#endif +}; + +/** + * Transfer internal timing information from one stream to another. + * + * This function is useful when doing stream copy. + * + * @param ofmt target output format for ost + * @param ost output stream which needs timings copy and adjustments + * @param ist reference input stream to copy timings from + * @param copy_tb define from where the stream codec timebase needs to be imported + */ +int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, + AVStream *ost, const AVStream *ist, + enum AVTimebaseSource copy_tb); + +/** + * Get the internal codec timebase from a stream. + * + * @param st input stream to extract the timebase from + */ +AVRational av_stream_get_codec_timebase(const AVStream *st); + +/** + * @} + */ + +#endif /* AVFORMAT_AVFORMAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avio.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avio.h new file mode 100644 index 0000000..f9c5972 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/avio.h @@ -0,0 +1,867 @@ +/* + * copyright (c) 2001 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 + */ +#ifndef AVFORMAT_AVIO_H +#define AVFORMAT_AVIO_H + +/** + * @file + * @ingroup lavf_io + * Buffered I/O operations + */ + +#include + +#include "libavutil/common.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "libavformat/version.h" + +/** + * Seeking works like for a local file. + */ +#define AVIO_SEEKABLE_NORMAL (1 << 0) + +/** + * Seeking by timestamp with avio_seek_time() is possible. + */ +#define AVIO_SEEKABLE_TIME (1 << 1) + +/** + * Callback for checking whether to abort blocking functions. + * AVERROR_EXIT is returned in this case by the interrupted + * function. During blocking operations, callback is called with + * opaque as parameter. If the callback returns 1, the + * blocking operation will be aborted. + * + * No members can be added to this struct without a major bump, if + * new elements have been added after this struct in AVFormatContext + * or AVIOContext. + */ +typedef struct AVIOInterruptCB { + int (*callback)(void*); + void *opaque; +} AVIOInterruptCB; + +/** + * Directory entry types. + */ +enum AVIODirEntryType { + AVIO_ENTRY_UNKNOWN, + AVIO_ENTRY_BLOCK_DEVICE, + AVIO_ENTRY_CHARACTER_DEVICE, + AVIO_ENTRY_DIRECTORY, + AVIO_ENTRY_NAMED_PIPE, + AVIO_ENTRY_SYMBOLIC_LINK, + AVIO_ENTRY_SOCKET, + AVIO_ENTRY_FILE, + AVIO_ENTRY_SERVER, + AVIO_ENTRY_SHARE, + AVIO_ENTRY_WORKGROUP, +}; + +/** + * Describes single entry of the directory. + * + * Only name and type fields are guaranteed be set. + * Rest of fields are protocol or/and platform dependent and might be unknown. + */ +typedef struct AVIODirEntry { + char *name; /**< Filename */ + int type; /**< Type of the entry */ + int utf8; /**< Set to 1 when name is encoded with UTF-8, 0 otherwise. + Name can be encoded with UTF-8 even though 0 is set. */ + int64_t size; /**< File size in bytes, -1 if unknown. */ + int64_t modification_timestamp; /**< Time of last modification in microseconds since unix + epoch, -1 if unknown. */ + int64_t access_timestamp; /**< Time of last access in microseconds since unix epoch, + -1 if unknown. */ + int64_t status_change_timestamp; /**< Time of last status change in microseconds since unix + epoch, -1 if unknown. */ + int64_t user_id; /**< User ID of owner, -1 if unknown. */ + int64_t group_id; /**< Group ID of owner, -1 if unknown. */ + int64_t filemode; /**< Unix file mode, -1 if unknown. */ +} AVIODirEntry; + +typedef struct AVIODirContext { + struct URLContext *url_context; +} AVIODirContext; + +/** + * Different data types that can be returned via the AVIO + * write_data_type callback. + */ +enum AVIODataMarkerType { + /** + * Header data; this needs to be present for the stream to be decodeable. + */ + AVIO_DATA_MARKER_HEADER, + /** + * A point in the output bytestream where a decoder can start decoding + * (i.e. a keyframe). A demuxer/decoder given the data flagged with + * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, + * should give decodeable results. + */ + AVIO_DATA_MARKER_SYNC_POINT, + /** + * A point in the output bytestream where a demuxer can start parsing + * (for non self synchronizing bytestream formats). That is, any + * non-keyframe packet start point. + */ + AVIO_DATA_MARKER_BOUNDARY_POINT, + /** + * This is any, unlabelled data. It can either be a muxer not marking + * any positions at all, it can be an actual boundary/sync point + * that the muxer chooses not to mark, or a later part of a packet/fragment + * that is cut into multiple write callbacks due to limited IO buffer size. + */ + AVIO_DATA_MARKER_UNKNOWN, + /** + * Trailer data, which doesn't contain actual content, but only for + * finalizing the output file. + */ + AVIO_DATA_MARKER_TRAILER, + /** + * A point in the output bytestream where the underlying AVIOContext might + * flush the buffer depending on latency or buffering requirements. Typically + * means the end of a packet. + */ + AVIO_DATA_MARKER_FLUSH_POINT, +}; + +/** + * Bytestream IO Context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVIOContext) must not be used outside libav*. + * + * @note None of the function pointers in AVIOContext should be called + * directly, they should only be set by the client application + * when implementing custom I/O. Normally these are set to the + * function pointers specified in avio_alloc_context() + */ +typedef struct AVIOContext { + /** + * A class for private options. + * + * If this AVIOContext is created by avio_open2(), av_class is set and + * passes the options down to protocols. + * + * If this AVIOContext is manually allocated, then av_class may be set by + * the caller. + * + * warning -- this field can be NULL, be sure to not pass this AVIOContext + * to any av_opt_* functions in that case. + */ + const AVClass *av_class; + + /* + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): + * + ********************************************************************************** + * READING + ********************************************************************************** + * + * | buffer_size | + * |---------------------------------------| + * | | + * + * buffer buf_ptr buf_end + * +---------------+-----------------------+ + * |/ / / / / / / /|/ / / / / / /| | + * read buffer: |/ / consumed / | to be read /| | + * |/ / / / / / / /|/ / / / / / /| | + * +---------------+-----------------------+ + * + * pos + * +-------------------------------------------+-----------------+ + * input file: | | | + * +-------------------------------------------+-----------------+ + * + * + ********************************************************************************** + * WRITING + ********************************************************************************** + * + * | buffer_size | + * |--------------------------------------| + * | | + * + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ + * buf_ptr can be in this + * due to a backward seek + * + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ + * + */ + unsigned char *buffer; /**< Start of the buffer. */ + int buffer_size; /**< Maximum buffer size */ + unsigned char *buf_ptr; /**< Current position in the buffer */ + unsigned char *buf_end; /**< End of the data, may be less than + buffer+buffer_size if the read function returned + less data than requested, e.g. for streams where + no more data has been received yet. */ + void *opaque; /**< A private pointer, passed to the read/write/seek/... + functions. */ + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); + int64_t (*seek)(void *opaque, int64_t offset, int whence); + int64_t pos; /**< position in the file of the current buffer */ + int must_flush; /**< unused */ + int eof_reached; /**< true if eof reached */ + int write_flag; /**< true if open for writing */ + int max_packet_size; + unsigned long checksum; + unsigned char *checksum_ptr; + unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); + int error; /**< contains the error code or 0 if no error happened */ + /** + * Pause or resume playback for network streaming protocols - e.g. MMS. + */ + int (*read_pause)(void *opaque, int pause); + /** + * Seek to a given timestamp in stream with the specified stream_index. + * Needed for some network streaming protocols which don't support seeking + * to byte position. + */ + int64_t (*read_seek)(void *opaque, int stream_index, + int64_t timestamp, int flags); + /** + * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. + */ + int seekable; + + /** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t maxsize; + + /** + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ + int direct; + + /** + * Bytes read statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t bytes_read; + + /** + * seek statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int seek_count; + + /** + * writeout statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int writeout_count; + + /** + * Original buffer size + * used internally after probing and ensure seekback to reset the buffer size + * This field is internal to libavformat and access from outside is not allowed. + */ + int orig_buffer_size; + + /** + * Threshold to favor readahead over seek. + * This is current internal only, do not use from outside. + */ + int short_seek_threshold; + + /** + * ',' separated list of allowed protocols. + */ + const char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + */ + const char *protocol_blacklist; + + /** + * A callback that is used instead of write_packet. + */ + int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); + /** + * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, + * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly + * small chunks of data returned from the callback). + */ + int ignore_boundary_point; + + /** + * Internal, not meant to be used from outside of AVIOContext. + */ + enum AVIODataMarkerType current_type; + int64_t last_time; + + /** + * A callback that is used instead of short_seek_threshold. + * This is current internal only, do not use from outside. + */ + int (*short_seek_get)(void *opaque); + + int64_t written; + + /** + * Maximum reached position before a backward seek in the write buffer, + * used keeping track of already written data for a later flush. + */ + unsigned char *buf_ptr_max; + + /** + * Try to buffer at least this amount of data before flushing it + */ + int min_packet_size; +} AVIOContext; + +/** + * Return the name of the protocol that will handle the passed URL. + * + * NULL is returned if no protocol could be found for the given URL. + * + * @return Name of the protocol or NULL. + */ +const char *avio_find_protocol_name(const char *url); + +/** + * Return AVIO_FLAG_* access flags corresponding to the access permissions + * of the resource in url, or a negative value corresponding to an + * AVERROR code in case of failure. The returned access flags are + * masked by the value in flags. + * + * @note This function is intrinsically unsafe, in the sense that the + * checked resource may change its existence or permission status from + * one call to another. Thus you should not trust the returned value, + * unless you are sure that no other processes are accessing the + * checked resource. + */ +int avio_check(const char *url, int flags); + +/** + * Move or rename a resource. + * + * @note url_src and url_dst should share the same protocol and authority. + * + * @param url_src url to resource to be moved + * @param url_dst new url to resource if the operation succeeded + * @return >=0 on success or negative on error. + */ +int avpriv_io_move(const char *url_src, const char *url_dst); + +/** + * Delete a resource. + * + * @param url resource to be deleted. + * @return >=0 on success or negative on error. + */ +int avpriv_io_delete(const char *url); + +/** + * Open directory for reading. + * + * @param s directory read context. Pointer to a NULL pointer must be passed. + * @param url directory to be listed. + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dictionary + * containing options that were not found. May be NULL. + * @return >=0 on success or negative on error. + */ +int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); + +/** + * Get next directory entry. + * + * Returned entry must be freed with avio_free_directory_entry(). In particular + * it may outlive AVIODirContext. + * + * @param s directory read context. + * @param[out] next next entry or NULL when no more entries. + * @return >=0 on success or negative on error. End of list is not considered an + * error. + */ +int avio_read_dir(AVIODirContext *s, AVIODirEntry **next); + +/** + * Close directory. + * + * @note Entries created using avio_read_dir() are not deleted and must be + * freeded with avio_free_directory_entry(). + * + * @param s directory read context. + * @return >=0 on success or negative on error. + */ +int avio_close_dir(AVIODirContext **s); + +/** + * Free entry allocated by avio_read_dir(). + * + * @param entry entry to be freed. + */ +void avio_free_directory_entry(AVIODirEntry **entry); + +/** + * Allocate and initialize an AVIOContext for buffered I/O. It must be later + * freed with avio_context_free(). + * + * @param buffer Memory block for input/output operations via AVIOContext. + * The buffer must be allocated with av_malloc() and friends. + * It may be freed and replaced with a new buffer by libavformat. + * AVIOContext.buffer holds the buffer currently in use, + * which must be later freed with av_free(). + * @param buffer_size The buffer size is very important for performance. + * For protocols with fixed blocksize it should be set to this blocksize. + * For others a typical size is a cache page, e.g. 4kb. + * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. + * @param opaque An opaque pointer to user-specific data. + * @param read_packet A function for refilling the buffer, may be NULL. + * @param write_packet A function for writing the buffer contents, may be NULL. + * The function may not change the input buffers content. + * @param seek A function for seeking to specified byte position, may be NULL. + * + * @return Allocated AVIOContext or NULL on failure. + */ +AVIOContext *avio_alloc_context( + unsigned char *buffer, + int buffer_size, + int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + int64_t (*seek)(void *opaque, int64_t offset, int whence)); + +/** + * Free the supplied IO context and everything associated with it. + * + * @param s Double pointer to the IO context. This function will write NULL + * into s. + */ +void avio_context_free(AVIOContext **s); + +void avio_w8(AVIOContext *s, int b); +void avio_write(AVIOContext *s, const unsigned char *buf, int size); +void avio_wl64(AVIOContext *s, uint64_t val); +void avio_wb64(AVIOContext *s, uint64_t val); +void avio_wl32(AVIOContext *s, unsigned int val); +void avio_wb32(AVIOContext *s, unsigned int val); +void avio_wl24(AVIOContext *s, unsigned int val); +void avio_wb24(AVIOContext *s, unsigned int val); +void avio_wl16(AVIOContext *s, unsigned int val); +void avio_wb16(AVIOContext *s, unsigned int val); + +/** + * Write a NULL-terminated string. + * @return number of bytes written. + */ +int avio_put_str(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16LE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16le(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16BE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16be(AVIOContext *s, const char *str); + +/** + * Mark the written bytestream as a specific type. + * + * Zero-length ranges are omitted from the output. + * + * @param time the stream time the current bytestream pos corresponds to + * (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not + * applicable + * @param type the kind of data written starting at the current pos + */ +void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); + +/** + * ORing this as the "whence" parameter to a seek function causes it to + * return the filesize without seeking anywhere. Supporting this is optional. + * If it is not supported then the seek function will return <0. + */ +#define AVSEEK_SIZE 0x10000 + +/** + * Passing this flag as the "whence" parameter to a seek function causes it to + * seek by any means (like reopening and linear reading) or other normally unreasonable + * means that can be extremely slow. + * This may be ignored by the seek code. + */ +#define AVSEEK_FORCE 0x20000 + +/** + * fseek() equivalent for AVIOContext. + * @return new position or AVERROR. + */ +int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); + +/** + * Skip given number of bytes forward + * @return new position or AVERROR. + */ +int64_t avio_skip(AVIOContext *s, int64_t offset); + +/** + * ftell() equivalent for AVIOContext. + * @return position or AVERROR. + */ +static av_always_inline int64_t avio_tell(AVIOContext *s) +{ + return avio_seek(s, 0, SEEK_CUR); +} + +/** + * Get the filesize. + * @return filesize or AVERROR + */ +int64_t avio_size(AVIOContext *s); + +/** + * feof() equivalent for AVIOContext. + * @return non zero if and only if end of file + */ +int avio_feof(AVIOContext *s); +#if FF_API_URL_FEOF +/** + * @deprecated use avio_feof() + */ +attribute_deprecated +int url_feof(AVIOContext *s); +#endif + +/** @warning Writes up to 4 KiB per call */ +int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Force flushing of buffered data. + * + * For write streams, force the buffered data to be immediately written to the output, + * without to wait to fill the internal buffer. + * + * For read streams, discard all currently buffered data, and advance the + * reported file position to that of the underlying stream. This does not + * read new data, and does not perform any seeks. + */ +void avio_flush(AVIOContext *s); + +/** + * Read size bytes from AVIOContext into buf. + * @return number of bytes read or AVERROR + */ +int avio_read(AVIOContext *s, unsigned char *buf, int size); + +/** + * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed + * to read fewer bytes than requested. The missing bytes can be read in the next + * call. This always tries to read at least 1 byte. + * Useful to reduce latency in certain cases. + * @return number of bytes read or AVERROR + */ +int avio_read_partial(AVIOContext *s, unsigned char *buf, int size); + +/** + * @name Functions for reading from AVIOContext + * @{ + * + * @note return 0 if EOF, so you cannot use it if EOF handling is + * necessary + */ +int avio_r8 (AVIOContext *s); +unsigned int avio_rl16(AVIOContext *s); +unsigned int avio_rl24(AVIOContext *s); +unsigned int avio_rl32(AVIOContext *s); +uint64_t avio_rl64(AVIOContext *s); +unsigned int avio_rb16(AVIOContext *s); +unsigned int avio_rb24(AVIOContext *s); +unsigned int avio_rb32(AVIOContext *s); +uint64_t avio_rb64(AVIOContext *s); +/** + * @} + */ + +/** + * Read a string from pb into buf. The reading will terminate when either + * a NULL character was encountered, maxlen bytes have been read, or nothing + * more can be read from pb. The result is guaranteed to be NULL-terminated, it + * will be truncated if buf is too small. + * Note that the string is not interpreted or validated in any way, it + * might get truncated in the middle of a sequence for multi-byte encodings. + * + * @return number of bytes read (is always <= maxlen). + * If reading ends on EOF or error, the return value will be one more than + * bytes actually read. + */ +int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); + +/** + * Read a UTF-16 string from pb and convert it to UTF-8. + * The reading will terminate when either a null or invalid character was + * encountered or maxlen bytes have been read. + * @return number of bytes read (is always <= maxlen) + */ +int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); +int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); + + +/** + * @name URL open modes + * The flags argument to avio_open must be one of the following + * constants, optionally ORed with other flags. + * @{ + */ +#define AVIO_FLAG_READ 1 /**< read-only */ +#define AVIO_FLAG_WRITE 2 /**< write-only */ +#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE) /**< read-write pseudo flag */ +/** + * @} + */ + +/** + * Use non-blocking mode. + * If this flag is set, operations on the context will return + * AVERROR(EAGAIN) if they can not be performed immediately. + * If this flag is not set, operations on the context will never return + * AVERROR(EAGAIN). + * Note that this flag does not affect the opening/connecting of the + * context. Connecting a protocol will always block if necessary (e.g. on + * network protocols) but never hang (e.g. on busy devices). + * Warning: non-blocking protocols is work-in-progress; this flag may be + * silently ignored. + */ +#define AVIO_FLAG_NONBLOCK 8 + +/** + * Use direct mode. + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ +#define AVIO_FLAG_DIRECT 0x8000 + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open(AVIOContext **s, const char *url, int flags); + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @param int_cb an interrupt callback to be used at the protocols level + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dict containing options + * that were not found. May be NULL. + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open2(AVIOContext **s, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * Close the resource accessed by the AVIOContext s and free it. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_closep + */ +int avio_close(AVIOContext *s); + +/** + * Close the resource accessed by the AVIOContext *s, free it + * and set the pointer pointing to it to NULL. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_close + */ +int avio_closep(AVIOContext **s); + + +/** + * Open a write only memory stream. + * + * @param s new IO context + * @return zero if no error. + */ +int avio_open_dyn_buf(AVIOContext **s); + +/** + * Return the written size and a pointer to the buffer. + * The AVIOContext stream is left intact. + * The buffer must NOT be freed. + * No padding is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Return the written size and a pointer to the buffer. The buffer + * must be freed with av_free(). + * Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Iterate through names of available protocols. + * + * @param opaque A private pointer representing current protocol. + * It must be a pointer to NULL on first iteration and will + * be updated by successive calls to avio_enum_protocols. + * @param output If set to 1, iterate over output protocols, + * otherwise over input protocols. + * + * @return A static string containing the name of current protocol or NULL + */ +const char *avio_enum_protocols(void **opaque, int output); + +/** + * Pause and resume playing - only meaningful if using a network streaming + * protocol (e.g. MMS). + * + * @param h IO context from which to call the read_pause function pointer + * @param pause 1 for pause, 0 for resume + */ +int avio_pause(AVIOContext *h, int pause); + +/** + * Seek to a given timestamp relative to some component stream. + * Only meaningful if using a network streaming protocol (e.g. MMS.). + * + * @param h IO context from which to call the seek function pointers + * @param stream_index The stream index that the timestamp is relative to. + * If stream_index is (-1) the timestamp should be in AV_TIME_BASE + * units from the beginning of the presentation. + * If a stream_index >= 0 is used and the protocol does not support + * seeking based on component streams, the call will fail. + * @param timestamp timestamp in AVStream.time_base units + * or if there is no stream specified then in AV_TIME_BASE units. + * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE + * and AVSEEK_FLAG_ANY. The protocol may silently ignore + * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will + * fail if used and not supported. + * @return >= 0 on success + * @see AVInputFormat::read_seek + */ +int64_t avio_seek_time(AVIOContext *h, int stream_index, + int64_t timestamp, int flags); + +/* Avoid a warning. The header can not be included because it breaks c++. */ +struct AVBPrint; + +/** + * Read contents of h into print buffer, up to max_size bytes, or up to EOF. + * + * @return 0 for success (max_size bytes read or EOF reached), negative error + * code otherwise + */ +int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); + +/** + * Accept and allocate a client context on a server context. + * @param s the server context + * @param c the client context, must be unallocated + * @return >= 0 on success or a negative value corresponding + * to an AVERROR on failure + */ +int avio_accept(AVIOContext *s, AVIOContext **c); + +/** + * Perform one step of the protocol handshake to accept a new client. + * This function must be called on a client returned by avio_accept() before + * using it as a read/write context. + * It is separate from avio_accept() because it may block. + * A step of the handshake is defined by places where the application may + * decide to change the proceedings. + * For example, on a protocol with a request header and a reply header, each + * one can constitute a step because the application may use the parameters + * from the request to change parameters in the reply; or each individual + * chunk of the request can constitute a step. + * If the handshake is already finished, avio_handshake() does nothing and + * returns 0 immediately. + * + * @param c the client context to perform the handshake on + * @return 0 on a complete and successful handshake + * > 0 if the handshake progressed, but is not complete + * < 0 for an AVERROR code + */ +int avio_handshake(AVIOContext *c); +#endif /* AVFORMAT_AVIO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/version.h new file mode 100644 index 0000000..878917d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavformat/version.h @@ -0,0 +1,105 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFORMAT_VERSION_H +#define AVFORMAT_VERSION_H + +/** + * @file + * @ingroup libavf + * Libavformat version macros + */ + +#include "libavutil/version.h" + +// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) +// Also please add any ticket numbers that you believe might be affected here +#define LIBAVFORMAT_VERSION_MAJOR 57 +#define LIBAVFORMAT_VERSION_MINOR 83 +#define LIBAVFORMAT_VERSION_MICRO 100 + +#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT + +#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + */ +#ifndef FF_API_LAVF_BITEXACT +#define FF_API_LAVF_BITEXACT (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_FRAC +#define FF_API_LAVF_FRAC (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_CODEC_TB +#define FF_API_LAVF_CODEC_TB (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_URL_FEOF +#define FF_API_URL_FEOF (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_FMT_RAWPICTURE +#define FF_API_LAVF_FMT_RAWPICTURE (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_COMPUTE_PKT_FIELDS2 +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_OLD_OPEN_CALLBACKS +#define FF_API_OLD_OPEN_CALLBACKS (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_AVCTX +#define FF_API_LAVF_AVCTX (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_NOCONST_GET_SIDE_DATA +#define FF_API_NOCONST_GET_SIDE_DATA (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_HTTP_USER_AGENT +#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_HLS_WRAP +#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_MERGE_SD +#define FF_API_LAVF_MERGE_SD (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_KEEPSIDE_FLAG +#define FF_API_LAVF_KEEPSIDE_FLAG (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_OLD_ROTATE_API +#define FF_API_OLD_ROTATE_API (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif + + +#ifndef FF_API_R_FRAME_RATE +#define FF_API_R_FRAME_RATE 1 +#endif +#endif /* AVFORMAT_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/adler32.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/adler32.h new file mode 100644 index 0000000..a1f035b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/adler32.h @@ -0,0 +1,60 @@ +/* + * copyright (c) 2006 Mans Rullgard + * + * 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 + * @ingroup lavu_adler32 + * Public header for Adler-32 hash function implementation. + */ + +#ifndef AVUTIL_ADLER32_H +#define AVUTIL_ADLER32_H + +#include +#include "attributes.h" + +/** + * @defgroup lavu_adler32 Adler-32 + * @ingroup lavu_hash + * Adler-32 hash function implementation. + * + * @{ + */ + +/** + * Calculate the Adler32 checksum of a buffer. + * + * Passing the return value to a subsequent av_adler32_update() call + * allows the checksum of multiple buffers to be calculated as though + * they were concatenated. + * + * @param adler initial checksum value + * @param buf pointer to input buffer + * @param len size of input buffer + * @return updated checksum + */ +unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, + unsigned int len) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_ADLER32_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes.h new file mode 100644 index 0000000..09efbda --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes.h @@ -0,0 +1,65 @@ +/* + * copyright (c) 2007 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AES_H +#define AVUTIL_AES_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_aes AES + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_aes_size; + +struct AVAES; + +/** + * Allocate an AVAES context. + */ +struct AVAES *av_aes_alloc(void); + +/** + * Initialize an AVAES context. + * @param key_bits 128, 192 or 256 + * @param decrypt 0 for encryption, 1 for decryption + */ +int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * @param count number of 16 byte blocks + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_AES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes_ctr.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes_ctr.h new file mode 100644 index 0000000..f596fa6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/aes_ctr.h @@ -0,0 +1,83 @@ +/* + * AES-CTR cipher + * Copyright (c) 2015 Eran Kornblau + * + * 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 + */ + +#ifndef AVUTIL_AES_CTR_H +#define AVUTIL_AES_CTR_H + +#include + +#include "attributes.h" +#include "version.h" + +#define AES_CTR_KEY_SIZE (16) +#define AES_CTR_IV_SIZE (8) + +struct AVAESCTR; + +/** + * Allocate an AVAESCTR context. + */ +struct AVAESCTR *av_aes_ctr_alloc(void); + +/** + * Initialize an AVAESCTR context. + * @param key encryption key, must have a length of AES_CTR_KEY_SIZE + */ +int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key); + +/** + * Release an AVAESCTR context. + */ +void av_aes_ctr_free(struct AVAESCTR *a); + +/** + * Process a buffer using a previously initialized context. + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param size the size of src and dst + */ +void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size); + +/** + * Get the current iv + */ +const uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a); + +/** + * Generate a random iv + */ +void av_aes_ctr_set_random_iv(struct AVAESCTR *a); + +/** + * Forcefully change the iv + */ +void av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Increment the top 64 bit of the iv (performed after each frame) + */ +void av_aes_ctr_increment_iv(struct AVAESCTR *a); + +/** + * @} + */ + +#endif /* AVUTIL_AES_CTR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/attributes.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/attributes.h new file mode 100644 index 0000000..54d1901 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/attributes.h @@ -0,0 +1,167 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * Macro definitions for various function/variable attributes + */ + +#ifndef AVUTIL_ATTRIBUTES_H +#define AVUTIL_ATTRIBUTES_H + +#ifdef __GNUC__ +# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) +# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) +#else +# define AV_GCC_VERSION_AT_LEAST(x,y) 0 +# define AV_GCC_VERSION_AT_MOST(x,y) 0 +#endif + +#ifndef av_always_inline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_always_inline __attribute__((always_inline)) inline +#elif defined(_MSC_VER) +# define av_always_inline __forceinline +#else +# define av_always_inline inline +#endif +#endif + +#ifndef av_extern_inline +#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) +# define av_extern_inline extern inline +#else +# define av_extern_inline inline +#endif +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,4) +# define av_warn_unused_result __attribute__((warn_unused_result)) +#else +# define av_warn_unused_result +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_noinline __attribute__((noinline)) +#elif defined(_MSC_VER) +# define av_noinline __declspec(noinline) +#else +# define av_noinline +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_pure __attribute__((pure)) +#else +# define av_pure +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,6) +# define av_const __attribute__((const)) +#else +# define av_const +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,3) +# define av_cold __attribute__((cold)) +#else +# define av_cold +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) +# define av_flatten __attribute__((flatten)) +#else +# define av_flatten +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_deprecated __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define attribute_deprecated __declspec(deprecated) +#else +# define attribute_deprecated +#endif + +/** + * Disable warnings about deprecated features + * This is useful for sections of code kept for backward compatibility and + * scheduled for removal. + */ +#ifndef AV_NOWARN_DEPRECATED +#if AV_GCC_VERSION_AT_LEAST(4,6) +# define AV_NOWARN_DEPRECATED(code) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ + code \ + _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +# define AV_NOWARN_DEPRECATED(code) \ + __pragma(warning(push)) \ + __pragma(warning(disable : 4996)) \ + code; \ + __pragma(warning(pop)) +#else +# define AV_NOWARN_DEPRECATED(code) code +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_unused __attribute__((unused)) +#else +# define av_unused +#endif + +/** + * Mark a variable as used and prevent the compiler from optimizing it + * away. This is useful for variables accessed only from inline + * assembler without the compiler being aware. + */ +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_used __attribute__((used)) +#else +# define av_used +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,3) +# define av_alias __attribute__((may_alias)) +#else +# define av_alias +#endif + +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) +# define av_uninit(x) x=x +#else +# define av_uninit(x) x +#endif + +#ifdef __GNUC__ +# define av_builtin_constant_p __builtin_constant_p +# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) +#else +# define av_builtin_constant_p(x) 0 +# define av_printf_format(fmtpos, attrpos) +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,5) +# define av_noreturn __attribute__((noreturn)) +#else +# define av_noreturn +#endif + +#endif /* AVUTIL_ATTRIBUTES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/audio_fifo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/audio_fifo.h new file mode 100644 index 0000000..d8a9194 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/audio_fifo.h @@ -0,0 +1,187 @@ +/* + * Audio FIFO + * Copyright (c) 2012 Justin Ruggles + * + * 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 + * Audio FIFO Buffer + */ + +#ifndef AVUTIL_AUDIO_FIFO_H +#define AVUTIL_AUDIO_FIFO_H + +#include "avutil.h" +#include "fifo.h" +#include "samplefmt.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_audiofifo Audio FIFO Buffer + * @{ + */ + +/** + * Context for an Audio FIFO Buffer. + * + * - Operates at the sample level rather than the byte level. + * - Supports multiple channels with either planar or packed sample format. + * - Automatic reallocation when writing to a full buffer. + */ +typedef struct AVAudioFifo AVAudioFifo; + +/** + * Free an AVAudioFifo. + * + * @param af AVAudioFifo to free + */ +void av_audio_fifo_free(AVAudioFifo *af); + +/** + * Allocate an AVAudioFifo. + * + * @param sample_fmt sample format + * @param channels number of channels + * @param nb_samples initial allocation size, in samples + * @return newly allocated AVAudioFifo, or NULL on error + */ +AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, + int nb_samples); + +/** + * Reallocate an AVAudioFifo. + * + * @param af AVAudioFifo to reallocate + * @param nb_samples new allocation size, in samples + * @return 0 if OK, or negative AVERROR code on failure + */ +av_warn_unused_result +int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); + +/** + * Write data to an AVAudioFifo. + * + * The AVAudioFifo will be reallocated automatically if the available space + * is less than nb_samples. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to write to + * @param data audio data plane pointers + * @param nb_samples number of samples to write + * @return number of samples actually written, or negative AVERROR + * code on failure. If successful, the number of samples + * actually written will always be nb_samples. + */ +int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @param offset offset from current read position + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset); + +/** + * Read data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to read + * @return number of samples actually read, or negative AVERROR code + * on failure. The number of samples actually read will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Drain data from an AVAudioFifo. + * + * Removes the data without reading it. + * + * @param af AVAudioFifo to drain + * @param nb_samples number of samples to drain + * @return 0 if OK, or negative AVERROR code on failure + */ +int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples); + +/** + * Reset the AVAudioFifo buffer. + * + * This empties all data in the buffer. + * + * @param af AVAudioFifo to reset + */ +void av_audio_fifo_reset(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for reading. + * + * @param af the AVAudioFifo to query + * @return number of samples available for reading + */ +int av_audio_fifo_size(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for writing. + * + * @param af the AVAudioFifo to query + * @return number of samples available for writing + */ +int av_audio_fifo_space(AVAudioFifo *af); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_AUDIO_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avassert.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avassert.h new file mode 100644 index 0000000..46f3fea --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avassert.h @@ -0,0 +1,75 @@ +/* + * copyright (c) 2010 Michael Niedermayer + * + * 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 + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_AVASSERT_H +#define AVUTIL_AVASSERT_H + +#include +#include "avutil.h" +#include "log.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do { \ + if (!(cond)) { \ + av_log(NULL, AV_LOG_PANIC, "Assertion %s failed at %s:%d\n", \ + AV_STRINGIFY(cond), __FILE__, __LINE__); \ + abort(); \ + } \ +} while (0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speed loss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert0(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert0(cond) +#define av_assert2_fpu() av_assert0_fpu() +#else +#define av_assert2(cond) ((void)0) +#define av_assert2_fpu() ((void)0) +#endif + +/** + * Assert that floating point opperations can be executed. + * + * This will av_assert0() that the cpu is not in MMX state on X86 + */ +void av_assert0_fpu(void); + +#endif /* AVUTIL_AVASSERT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avconfig.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avconfig.h new file mode 100644 index 0000000..f10aa61 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avconfig.h @@ -0,0 +1,6 @@ +/* Generated by ffconf */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +#define AV_HAVE_BIGENDIAN 0 +#define AV_HAVE_FAST_UNALIGNED 1 +#endif /* AVUTIL_AVCONFIG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avstring.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avstring.h new file mode 100644 index 0000000..04d2695 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avstring.h @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2007 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_AVSTRING_H +#define AVUTIL_AVSTRING_H + +#include +#include +#include "attributes.h" + +/** + * @addtogroup lavu_string + * @{ + */ + +/** + * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to + * the address of the first character in str after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_strstart(const char *str, const char *pfx, const char **ptr); + +/** + * Return non-zero if pfx is a prefix of str independent of case. If + * it is, *ptr is set to the address of the first character in str + * after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_stristart(const char *str, const char *pfx, const char **ptr); + +/** + * Locate the first case-independent occurrence in the string haystack + * of the string needle. A zero-length string needle is considered to + * match at the start of haystack. + * + * This function is a case-insensitive version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_stristr(const char *haystack, const char *needle); + +/** + * Locate the first occurrence of the string needle in the string haystack + * where not more than hay_length characters are searched. A zero-length + * string needle is considered to match at the start of haystack. + * + * This function is a length-limited version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @param hay_length length of string to search in + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_strnstr(const char *haystack, const char *needle, size_t hay_length); + +/** + * Copy the string src to dst, but no more than size - 1 bytes, and + * null-terminate dst. + * + * This function is the same as BSD strlcpy(). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the length of src + * + * @warning since the return value is the length of src, src absolutely + * _must_ be a properly 0-terminated string, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcpy(char *dst, const char *src, size_t size); + +/** + * Append the string src to the string dst, but to a total length of + * no more than size - 1 bytes, and null-terminate dst. + * + * This function is similar to BSD strlcat(), but differs when + * size <= strlen(dst). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the total length of src and dst + * + * @warning since the return value use the length of src and dst, these + * absolutely _must_ be a properly 0-terminated strings, otherwise this + * will read beyond the end of the buffer and possibly crash. + */ +size_t av_strlcat(char *dst, const char *src, size_t size); + +/** + * Append output to a string, according to a format. Never write out of + * the destination buffer, and always put a terminating 0 within + * the buffer. + * @param dst destination buffer (string to which the output is + * appended) + * @param size total size of the destination buffer + * @param fmt printf-compatible format string, specifying how the + * following parameters are used + * @return the length of the string that would have been generated + * if enough space had been available + */ +size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4); + +/** + * Get the count of continuous non zero chars starting from the beginning. + * + * @param len maximum number of characters to check in the string, that + * is the maximum value which is returned by the function + */ +static inline size_t av_strnlen(const char *s, size_t len) +{ + size_t i; + for (i = 0; i < len && s[i]; i++) + ; + return i; +} + +/** + * Print arguments following specified format into a large enough auto + * allocated buffer. It is similar to GNU asprintf(). + * @param fmt printf-compatible format string, specifying how the + * following parameters are used. + * @return the allocated string + * @note You have to free the string yourself with av_free(). + */ +char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); + +/** + * Convert a number to an av_malloced string. + */ +char *av_d2str(double d); + +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + +/** + * Split the string into several tokens which can be accessed by + * successive calls to av_strtok(). + * + * A token is defined as a sequence of characters not belonging to the + * set specified in delim. + * + * On the first call to av_strtok(), s should point to the string to + * parse, and the value of saveptr is ignored. In subsequent calls, s + * should be NULL, and saveptr should be unchanged since the previous + * call. + * + * This function is similar to strtok_r() defined in POSIX.1. + * + * @param s the string to parse, may be NULL + * @param delim 0-terminated list of token delimiters, must be non-NULL + * @param saveptr user-provided pointer which points to stored + * information necessary for av_strtok() to continue scanning the same + * string. saveptr is updated to point to the next character after the + * first delimiter found, or to NULL if the string was terminated + * @return the found token, or NULL when no token is found + */ +char *av_strtok(char *s, const char *delim, char **saveptr); + +/** + * Locale-independent conversion of ASCII isdigit. + */ +static inline av_const int av_isdigit(int c) +{ + return c >= '0' && c <= '9'; +} + +/** + * Locale-independent conversion of ASCII isgraph. + */ +static inline av_const int av_isgraph(int c) +{ + return c > 32 && c < 127; +} + +/** + * Locale-independent conversion of ASCII isspace. + */ +static inline av_const int av_isspace(int c) +{ + return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || + c == '\v'; +} + +/** + * Locale-independent conversion of ASCII characters to uppercase. + */ +static inline av_const int av_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII characters to lowercase. + */ +static inline av_const int av_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII isxdigit. + */ +static inline av_const int av_isxdigit(int c) +{ + c = av_tolower(c); + return av_isdigit(c) || (c >= 'a' && c <= 'f'); +} + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strcasecmp(const char *a, const char *b); + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strncasecmp(const char *a, const char *b, size_t n); + +/** + * Locale-independent strings replace. + * @note This means only ASCII-range characters are replace + */ +char *av_strireplace(const char *str, const char *from, const char *to); + +/** + * Thread safe basename. + * @param path the path, on DOS both \ and / are considered separators. + * @return pointer to the basename substring. + */ +const char *av_basename(const char *path); + +/** + * Thread safe dirname. + * @param path the path, on DOS both \ and / are considered separators. + * @return the path with the separator replaced by the string terminator or ".". + * @note the function may change the input string. + */ +const char *av_dirname(char *path); + +/** + * Match instances of a name in a comma-separated list of names. + * List entries are checked from the start to the end of the names list, + * the first match ends further processing. If an entry prefixed with '-' + * matches, then 0 is returned. The "ALL" list entry is considered to + * match all names. + * + * @param name Name to look for. + * @param names List of names. + * @return 1 on match, 0 otherwise. + */ +int av_match_name(const char *name, const char *names); + +/** + * Append path component to the existing path. + * Path separator '/' is placed between when needed. + * Resulting string have to be freed with av_free(). + * @param path base path + * @param component component to be appended + * @return new path or NULL on error. + */ +char *av_append_path_component(const char *path, const char *component); + +enum AVEscapeMode { + AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. + AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. + AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. +}; + +/** + * Consider spaces special and escape them even in the middle of the + * string. + * + * This is equivalent to adding the whitespace characters to the special + * characters lists, except it is guaranteed to use the exact same list + * of whitespace characters as the rest of libavutil. + */ +#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0) + +/** + * Escape only specified special characters. + * Without this flag, escape also any characters that may be considered + * special by av_get_token(), such as the single quote. + */ +#define AV_ESCAPE_FLAG_STRICT (1 << 1) + +/** + * Escape string in src, and put the escaped string in an allocated + * string in *dst, which must be freed with av_free(). + * + * @param dst pointer where an allocated string is put + * @param src string to escape, must be non-NULL + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_ macros + * @return the length of the allocated string, or a negative error code in case of error + * @see av_bprint_escape() + */ +av_warn_unused_result +int av_escape(char **dst, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES 1 ///< accept codepoints over 0x10FFFF +#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS 2 ///< accept non-characters - 0xFFFE and 0xFFFF +#define AV_UTF8_FLAG_ACCEPT_SURROGATES 4 ///< accept UTF-16 surrogates codes +#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML + +#define AV_UTF8_FLAG_ACCEPT_ALL \ + AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES + +/** + * Read and decode a single UTF-8 code point (character) from the + * buffer in *buf, and update *buf to point to the next byte to + * decode. + * + * In case of an invalid byte sequence, the pointer will be updated to + * the next byte after the invalid sequence and the function will + * return an error code. + * + * Depending on the specified flags, the function will also fail in + * case the decoded code point does not belong to a valid range. + * + * @note For speed-relevant code a carefully implemented use of + * GET_UTF8() may be preferred. + * + * @param codep pointer used to return the parsed code in case of success. + * The value in *codep is set even in case the range check fails. + * @param bufp pointer to the address the first byte of the sequence + * to decode, updated by the function to point to the + * byte next after the decoded sequence + * @param buf_end pointer to the end of the buffer, points to the next + * byte past the last in the buffer. This is used to + * avoid buffer overreads (in case of an unfinished + * UTF-8 sequence towards the end of the buffer). + * @param flags a collection of AV_UTF8_FLAG_* flags + * @return >= 0 in case a sequence was successfully read, a negative + * value in case of invalid sequence + */ +av_warn_unused_result +int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, + unsigned int flags); + +/** + * Check if a name is in a list. + * @returns 0 if not found, or the 1 based index where it has been found in the + * list. + */ +int av_match_list(const char *name, const char *list, char separator); + +/** + * @} + */ + +#endif /* AVUTIL_AVSTRING_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avutil.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avutil.h new file mode 100644 index 0000000..4d63315 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/avutil.h @@ -0,0 +1,365 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AVUTIL_H +#define AVUTIL_AVUTIL_H + +/** + * @file + * @ingroup lavu + * Convenience header that includes @ref lavu "libavutil"'s core. + */ + +/** + * @mainpage + * + * @section ffmpeg_intro Introduction + * + * This document describes the usage of the different libraries + * provided by FFmpeg. + * + * @li @ref libavc "libavcodec" encoding/decoding library + * @li @ref lavfi "libavfilter" graph-based frame editing library + * @li @ref libavf "libavformat" I/O and muxing/demuxing library + * @li @ref lavd "libavdevice" special devices muxing/demuxing library + * @li @ref lavu "libavutil" common utility library + * @li @ref lswr "libswresample" audio resampling, format conversion and mixing + * @li @ref lpp "libpostproc" post processing library + * @li @ref libsws "libswscale" color conversion and scaling library + * + * @section ffmpeg_versioning Versioning and compatibility + * + * Each of the FFmpeg libraries contains a version.h header, which defines a + * major, minor and micro version number with the + * LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version + * number is incremented with backward incompatible changes - e.g. removing + * parts of the public API, reordering public struct members, etc. The minor + * version number is incremented for backward compatible API changes or major + * new features - e.g. adding a new public function or a new decoder. The micro + * version number is incremented for smaller changes that a calling program + * might still want to check for - e.g. changing behavior in a previously + * unspecified situation. + * + * FFmpeg guarantees backward API and ABI compatibility for each library as long + * as its major version number is unchanged. This means that no public symbols + * will be removed or renamed. Types and names of the public struct members and + * values of public macros and enums will remain the same (unless they were + * explicitly declared as not part of the public API). Documented behavior will + * not change. + * + * In other words, any correct program that works with a given FFmpeg snapshot + * should work just as well without any changes with any later snapshot with the + * same major versions. This applies to both rebuilding the program against new + * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program + * links against. + * + * However, new public symbols may be added and new members may be appended to + * public structs whose size is not part of public ABI (most public structs in + * FFmpeg). New macros and enum values may be added. Behavior in undocumented + * situations may change slightly (and be documented). All those are accompanied + * by an entry in doc/APIchanges and incrementing either the minor or micro + * version number. + */ + +/** + * @defgroup lavu libavutil + * Common code shared across all FFmpeg libraries. + * + * @note + * libavutil is designed to be modular. In most cases, in order to use the + * functions provided by one component of libavutil you must explicitly include + * the specific header containing that feature. If you are only using + * media-related components, you could simply include libavutil/avutil.h, which + * brings in most of the "core" components. + * + * @{ + * + * @defgroup lavu_crypto Crypto and Hashing + * + * @{ + * @} + * + * @defgroup lavu_math Mathematics + * @{ + * + * @} + * + * @defgroup lavu_string String Manipulation + * + * @{ + * + * @} + * + * @defgroup lavu_mem Memory Management + * + * @{ + * + * @} + * + * @defgroup lavu_data Data Structures + * @{ + * + * @} + * + * @defgroup lavu_video Video related + * + * @{ + * + * @} + * + * @defgroup lavu_audio Audio related + * + * @{ + * + * @} + * + * @defgroup lavu_error Error Codes + * + * @{ + * + * @} + * + * @defgroup lavu_log Logging Facility + * + * @{ + * + * @} + * + * @defgroup lavu_misc Other + * + * @{ + * + * @defgroup preproc_misc Preprocessor String Macros + * + * @{ + * + * @} + * + * @defgroup version_utils Library Version Macros + * + * @{ + * + * @} + */ + + +/** + * @addtogroup lavu_ver + * @{ + */ + +/** + * Return the LIBAVUTIL_VERSION_INT constant. + */ +unsigned avutil_version(void); + +/** + * Return an informative version string. This usually is the actual release + * version number or a git commit description. This string has no fixed format + * and can change any time. It should never be parsed by code. + */ +const char *av_version_info(void); + +/** + * Return the libavutil build-time configuration. + */ +const char *avutil_configuration(void); + +/** + * Return the libavutil license. + */ +const char *avutil_license(void); + +/** + * @} + */ + +/** + * @addtogroup lavu_media Media Type + * @brief Media Type + */ + +enum AVMediaType { + AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA + AVMEDIA_TYPE_VIDEO, + AVMEDIA_TYPE_AUDIO, + AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous + AVMEDIA_TYPE_SUBTITLE, + AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse + AVMEDIA_TYPE_NB +}; + +/** + * Return a string describing the media_type enum, NULL if media_type + * is unknown. + */ +const char *av_get_media_type_string(enum AVMediaType media_type); + +/** + * @defgroup lavu_const Constants + * @{ + * + * @defgroup lavu_enc Encoding specific + * + * @note those definition should move to avcodec + * @{ + */ + +#define FF_LAMBDA_SHIFT 7 +#define FF_LAMBDA_SCALE (1< + +/** + * @defgroup lavu_base64 Base64 + * @ingroup lavu_crypto + * @{ + */ + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in)) + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Calculate the output size in bytes needed to decode a base64 string + * with length x to a data buffer. + */ +#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4) + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the out buffer (including the + * null terminator), must be at least AV_BASE64_SIZE(in_size) + * @param in input buffer containing the data to encode + * @param in_size size in bytes of the in buffer + * @return out or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes to a + * null-terminated string. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + + /** + * @} + */ + +#endif /* AVUTIL_BASE64_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/blowfish.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/blowfish.h new file mode 100644 index 0000000..9e289a4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/blowfish.h @@ -0,0 +1,82 @@ +/* + * Blowfish algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_BLOWFISH_H +#define AVUTIL_BLOWFISH_H + +#include + +/** + * @defgroup lavu_blowfish Blowfish + * @ingroup lavu_crypto + * @{ + */ + +#define AV_BF_ROUNDS 16 + +typedef struct AVBlowfish { + uint32_t p[AV_BF_ROUNDS + 2]; + uint32_t s[4][256]; +} AVBlowfish; + +/** + * Allocate an AVBlowfish context. + */ +AVBlowfish *av_blowfish_alloc(void); + +/** + * Initialize an AVBlowfish context. + * + * @param ctx an AVBlowfish context + * @param key a key + * @param key_len length of the key + */ +void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param xl left four bytes halves of input to be encrypted + * @param xr right four bytes halves of input to be encrypted + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_BLOWFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bprint.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bprint.h new file mode 100644 index 0000000..c09b1ac --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bprint.h @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2012 Nicolas George + * + * 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 + */ + +#ifndef AVUTIL_BPRINT_H +#define AVUTIL_BPRINT_H + +#include + +#include "attributes.h" +#include "avstring.h" + +/** + * Define a structure with extra padding to a fixed size + * This helps ensuring binary compatibility with future versions. + */ + +#define FF_PAD_STRUCTURE(name, size, ...) \ +struct ff_pad_helper_##name { __VA_ARGS__ }; \ +typedef struct name { \ + __VA_ARGS__ \ + char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \ +} name; + +/** + * Buffer to print data progressively + * + * The string buffer grows as necessary and is always 0-terminated. + * The content of the string is never accessed, and thus is + * encoding-agnostic and can even hold binary data. + * + * Small buffers are kept in the structure itself, and thus require no + * memory allocation at all (unless the contents of the buffer is needed + * after the structure goes out of scope). This is almost as lightweight as + * declaring a local "char buf[512]". + * + * The length of the string can go beyond the allocated size: the buffer is + * then truncated, but the functions still keep account of the actual total + * length. + * + * In other words, buf->len can be greater than buf->size and records the + * total length of what would have been to the buffer if there had been + * enough memory. + * + * Append operations do not need to be tested for failure: if a memory + * allocation fails, data stop being appended to the buffer, but the length + * is still updated. This situation can be tested with + * av_bprint_is_complete(). + * + * The size_max field determines several possible behaviours: + * + * size_max = -1 (= UINT_MAX) or any large value will let the buffer be + * reallocated as necessary, with an amortized linear cost. + * + * size_max = 0 prevents writing anything to the buffer: only the total + * length is computed. The write operations can then possibly be repeated in + * a buffer with exactly the necessary size + * (using size_init = size_max = len + 1). + * + * size_max = 1 is automatically replaced by the exact size available in the + * structure itself, thus ensuring no dynamic memory allocation. The + * internal buffer is large enough to hold a reasonable paragraph of text, + * such as the current paragraph. + */ + +FF_PAD_STRUCTURE(AVBPrint, 1024, + char *str; /**< string so far */ + unsigned len; /**< length so far */ + unsigned size; /**< allocated memory */ + unsigned size_max; /**< maximum allocated memory */ + char reserved_internal_buffer[1]; +) + +/** + * Convenience macros for special values for av_bprint_init() size_max + * parameter. + */ +#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1) +#define AV_BPRINT_SIZE_AUTOMATIC 1 +#define AV_BPRINT_SIZE_COUNT_ONLY 0 + +/** + * Init a print buffer. + * + * @param buf buffer to init + * @param size_init initial size (including the final 0) + * @param size_max maximum size; + * 0 means do not write anything, just count the length; + * 1 is replaced by the maximum value for automatic storage; + * any large value means that the internal buffer will be + * reallocated as needed up to that limit; -1 is converted to + * UINT_MAX, the largest limit possible. + * Check also AV_BPRINT_SIZE_* macros. + */ +void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max); + +/** + * Init a print buffer using a pre-existing buffer. + * + * The buffer will not be reallocated. + * + * @param buf buffer structure to init + * @param buffer byte buffer to use for the string data + * @param size size of buffer + */ +void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size); + +/** + * Append a formatted string to a print buffer. + */ +void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Append a formatted string to a print buffer. + */ +void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg); + +/** + * Append char c n times to a print buffer. + */ +void av_bprint_chars(AVBPrint *buf, char c, unsigned n); + +/** + * Append data to a print buffer. + * + * param buf bprint buffer to use + * param data pointer to data + * param size size of data + */ +void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size); + +struct tm; +/** + * Append a formatted date and time to a print buffer. + * + * param buf bprint buffer to use + * param fmt date and time format string, see strftime() + * param tm broken-down time structure to translate + * + * @note due to poor design of the standard strftime function, it may + * produce poor results if the format string expands to a very long text and + * the bprint buffer is near the limit stated by the size_max option. + */ +void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm); + +/** + * Allocate bytes in the buffer for external use. + * + * @param[in] buf buffer structure + * @param[in] size required size + * @param[out] mem pointer to the memory area + * @param[out] actual_size size of the memory area after allocation; + * can be larger or smaller than size + */ +void av_bprint_get_buffer(AVBPrint *buf, unsigned size, + unsigned char **mem, unsigned *actual_size); + +/** + * Reset the string to "" but keep internal allocated data. + */ +void av_bprint_clear(AVBPrint *buf); + +/** + * Test if the print buffer is complete (not truncated). + * + * It may have been truncated due to a memory allocation failure + * or the size_max limit (compare size and size_max if necessary). + */ +static inline int av_bprint_is_complete(const AVBPrint *buf) +{ + return buf->len < buf->size; +} + +/** + * Finalize a print buffer. + * + * The print buffer can no longer be used afterwards, + * but the len and size fields are still valid. + * + * @arg[out] ret_str if not NULL, used to return a permanent copy of the + * buffer contents, or NULL if memory allocation fails; + * if NULL, the buffer is discarded and freed + * @return 0 for success or error code (probably AVERROR(ENOMEM)) + */ +int av_bprint_finalize(AVBPrint *buf, char **ret_str); + +/** + * Escape the content in src and append it to dstbuf. + * + * @param dstbuf already inited destination bprint buffer + * @param src string containing the text to escape + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_* macros + */ +void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#endif /* AVUTIL_BPRINT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bswap.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bswap.h new file mode 100644 index 0000000..91cb795 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/bswap.h @@ -0,0 +1,109 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * byte swapping routines + */ + +#ifndef AVUTIL_BSWAP_H +#define AVUTIL_BSWAP_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_AARCH64 +# include "aarch64/bswap.h" +#elif ARCH_ARM +# include "arm/bswap.h" +#elif ARCH_AVR32 +# include "avr32/bswap.h" +#elif ARCH_SH4 +# include "sh4/bswap.h" +#elif ARCH_X86 +# include "x86/bswap.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + +#ifndef av_bswap16 +static av_always_inline av_const uint16_t av_bswap16(uint16_t x) +{ + x= (x>>8) | (x<<8); + return x; +} +#endif + +#ifndef av_bswap32 +static av_always_inline av_const uint32_t av_bswap32(uint32_t x) +{ + return AV_BSWAP32C(x); +} +#endif + +#ifndef av_bswap64 +static inline uint64_t av_const av_bswap64(uint64_t x) +{ + return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32); +} +#endif + +// be2ne ... big-endian to native-endian +// le2ne ... little-endian to native-endian + +#if AV_HAVE_BIGENDIAN +#define av_be2ne16(x) (x) +#define av_be2ne32(x) (x) +#define av_be2ne64(x) (x) +#define av_le2ne16(x) av_bswap16(x) +#define av_le2ne32(x) av_bswap32(x) +#define av_le2ne64(x) av_bswap64(x) +#define AV_BE2NEC(s, x) (x) +#define AV_LE2NEC(s, x) AV_BSWAPC(s, x) +#else +#define av_be2ne16(x) av_bswap16(x) +#define av_be2ne32(x) av_bswap32(x) +#define av_be2ne64(x) av_bswap64(x) +#define av_le2ne16(x) (x) +#define av_le2ne32(x) (x) +#define av_le2ne64(x) (x) +#define AV_BE2NEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2NEC(s, x) (x) +#endif + +#define AV_BE2NE16C(x) AV_BE2NEC(16, x) +#define AV_BE2NE32C(x) AV_BE2NEC(32, x) +#define AV_BE2NE64C(x) AV_BE2NEC(64, x) +#define AV_LE2NE16C(x) AV_LE2NEC(16, x) +#define AV_LE2NE32C(x) AV_LE2NEC(32, x) +#define AV_LE2NE64C(x) AV_LE2NEC(64, x) + +#endif /* AVUTIL_BSWAP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/buffer.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/buffer.h new file mode 100644 index 0000000..73b6bd0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/buffer.h @@ -0,0 +1,291 @@ +/* + * 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 + * @ingroup lavu_buffer + * refcounted data buffer API + */ + +#ifndef AVUTIL_BUFFER_H +#define AVUTIL_BUFFER_H + +#include + +/** + * @defgroup lavu_buffer AVBuffer + * @ingroup lavu_data + * + * @{ + * AVBuffer is an API for reference-counted data buffers. + * + * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer + * represents the data buffer itself; it is opaque and not meant to be accessed + * by the caller directly, but only through AVBufferRef. However, the caller may + * e.g. compare two AVBuffer pointers to check whether two different references + * are describing the same data buffer. AVBufferRef represents a single + * reference to an AVBuffer and it is the object that may be manipulated by the + * caller directly. + * + * There are two functions provided for creating a new AVBuffer with a single + * reference -- av_buffer_alloc() to just allocate a new buffer, and + * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing + * reference, additional references may be created with av_buffer_ref(). + * Use av_buffer_unref() to free a reference (this will automatically free the + * data once all the references are freed). + * + * The convention throughout this API and the rest of FFmpeg is such that the + * buffer is considered writable if there exists only one reference to it (and + * it has not been marked as read-only). The av_buffer_is_writable() function is + * provided to check whether this is true and av_buffer_make_writable() will + * automatically create a new writable buffer when necessary. + * Of course nothing prevents the calling code from violating this convention, + * however that is safe only when all the existing references are under its + * control. + * + * @note Referencing and unreferencing the buffers is thread-safe and thus + * may be done from multiple threads simultaneously without any need for + * additional locking. + * + * @note Two different references to the same buffer can point to different + * parts of the buffer (i.e. their AVBufferRef.data will not be equal). + */ + +/** + * A reference counted buffer type. It is opaque and is meant to be used through + * references (AVBufferRef). + */ +typedef struct AVBuffer AVBuffer; + +/** + * A reference to a data buffer. + * + * The size of this struct is not a part of the public ABI and it is not meant + * to be allocated directly. + */ +typedef struct AVBufferRef { + AVBuffer *buffer; + + /** + * The data buffer. It is considered writable if and only if + * this is the only reference to the buffer, in which case + * av_buffer_is_writable() returns 1. + */ + uint8_t *data; + /** + * Size of data in bytes. + */ + int size; +} AVBufferRef; + +/** + * Allocate an AVBuffer of the given size using av_malloc(). + * + * @return an AVBufferRef of given size or NULL when out of memory + */ +AVBufferRef *av_buffer_alloc(int size); + +/** + * Same as av_buffer_alloc(), except the returned buffer will be initialized + * to zero. + */ +AVBufferRef *av_buffer_allocz(int size); + +/** + * Always treat the buffer as read-only, even when it has only one + * reference. + */ +#define AV_BUFFER_FLAG_READONLY (1 << 0) + +/** + * Create an AVBuffer from an existing array. + * + * If this function is successful, data is owned by the AVBuffer. The caller may + * only access data through the returned AVBufferRef and references derived from + * it. + * If this function fails, data is left untouched. + * @param data data array + * @param size size of data in bytes + * @param free a callback for freeing this buffer's data + * @param opaque parameter to be got for processing or passed to free + * @param flags a combination of AV_BUFFER_FLAG_* + * + * @return an AVBufferRef referring to data on success, NULL on failure. + */ +AVBufferRef *av_buffer_create(uint8_t *data, int size, + void (*free)(void *opaque, uint8_t *data), + void *opaque, int flags); + +/** + * Default free callback, which calls av_free() on the buffer data. + * This function is meant to be passed to av_buffer_create(), not called + * directly. + */ +void av_buffer_default_free(void *opaque, uint8_t *data); + +/** + * Create a new reference to an AVBuffer. + * + * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on + * failure. + */ +AVBufferRef *av_buffer_ref(AVBufferRef *buf); + +/** + * Free a given reference and automatically free the buffer if there are no more + * references to it. + * + * @param buf the reference to be freed. The pointer is set to NULL on return. + */ +void av_buffer_unref(AVBufferRef **buf); + +/** + * @return 1 if the caller may write to the data referred to by buf (which is + * true if and only if buf is the only reference to the underlying AVBuffer). + * Return 0 otherwise. + * A positive answer is valid until av_buffer_ref() is called on buf. + */ +int av_buffer_is_writable(const AVBufferRef *buf); + +/** + * @return the opaque parameter set by av_buffer_create. + */ +void *av_buffer_get_opaque(const AVBufferRef *buf); + +int av_buffer_get_ref_count(const AVBufferRef *buf); + +/** + * Create a writable reference from a given buffer reference, avoiding data copy + * if possible. + * + * @param buf buffer reference to make writable. On success, buf is either left + * untouched, or it is unreferenced and a new writable AVBufferRef is + * written in its place. On failure, buf is left untouched. + * @return 0 on success, a negative AVERROR on failure. + */ +int av_buffer_make_writable(AVBufferRef **buf); + +/** + * Reallocate a given buffer. + * + * @param buf a buffer reference to reallocate. On success, buf will be + * unreferenced and a new reference with the required size will be + * written in its place. On failure buf will be left untouched. *buf + * may be NULL, then a new buffer is allocated. + * @param size required new buffer size. + * @return 0 on success, a negative AVERROR on failure. + * + * @note the buffer is actually reallocated with av_realloc() only if it was + * initially allocated through av_buffer_realloc(NULL) and there is only one + * reference to it (i.e. the one passed to this function). In all other cases + * a new buffer is allocated and the data is copied. + */ +int av_buffer_realloc(AVBufferRef **buf, int size); + +/** + * @} + */ + +/** + * @defgroup lavu_bufferpool AVBufferPool + * @ingroup lavu_data + * + * @{ + * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. + * + * Frequently allocating and freeing large buffers may be slow. AVBufferPool is + * meant to solve this in cases when the caller needs a set of buffers of the + * same size (the most obvious use case being buffers for raw video or audio + * frames). + * + * At the beginning, the user must call av_buffer_pool_init() to create the + * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to + * get a reference to a new buffer, similar to av_buffer_alloc(). This new + * reference works in all aspects the same way as the one created by + * av_buffer_alloc(). However, when the last reference to this buffer is + * unreferenced, it is returned to the pool instead of being freed and will be + * reused for subsequent av_buffer_pool_get() calls. + * + * When the caller is done with the pool and no longer needs to allocate any new + * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. + * Once all the buffers are released, it will automatically be freed. + * + * Allocating and releasing buffers with this API is thread-safe as long as + * either the default alloc callback is used, or the user-supplied one is + * thread-safe. + */ + +/** + * The buffer pool. This structure is opaque and not meant to be accessed + * directly. It is allocated with av_buffer_pool_init() and freed with + * av_buffer_pool_uninit(). + */ +typedef struct AVBufferPool AVBufferPool; + +/** + * Allocate and initialize a buffer pool. + * + * @param size size of each buffer in this pool + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. May be NULL, then the default allocator will be used + * (av_buffer_alloc()). + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); + +/** + * Allocate and initialize a buffer pool with a more complex allocator. + * + * @param size size of each buffer in this pool + * @param opaque arbitrary user data used by the allocator + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. + * @param pool_free a function that will be called immediately before the pool + * is freed. I.e. after av_buffer_pool_uninit() is called + * by the caller and all the frames are returned to the pool + * and freed. It is intended to uninitialize the user opaque + * data. + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init2(int size, void *opaque, + AVBufferRef* (*alloc)(void *opaque, int size), + void (*pool_free)(void *opaque)); + +/** + * Mark the pool as being available for freeing. It will actually be freed only + * once all the allocated buffers associated with the pool are released. Thus it + * is safe to call this function while some of the allocated buffers are still + * in use. + * + * @param pool pointer to the pool to be freed. It will be set to NULL. + */ +void av_buffer_pool_uninit(AVBufferPool **pool); + +/** + * Allocate a new AVBuffer, reusing an old buffer from the pool when available. + * This function may be called simultaneously from multiple threads. + * + * @return a reference to the new buffer on success, NULL on error. + */ +AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); + +/** + * @} + */ + +#endif /* AVUTIL_BUFFER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/camellia.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/camellia.h new file mode 100644 index 0000000..e674c9b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/camellia.h @@ -0,0 +1,70 @@ +/* + * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAMELLIA_H +#define AVUTIL_CAMELLIA_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAMELLIA algorithm + * @defgroup lavu_camellia CAMELLIA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_camellia_size; + +struct AVCAMELLIA; + +/** + * Allocate an AVCAMELLIA context + * To free the struct: av_free(ptr) + */ +struct AVCAMELLIA *av_camellia_alloc(void); + +/** + * Initialize an AVCAMELLIA context. + * + * @param ctx an AVCAMELLIA context + * @param key a key of 16, 24, 32 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 128, 192, 256 + */ +int av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAMELLIA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_CAMELLIA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cast5.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cast5.h new file mode 100644 index 0000000..ad5b347 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cast5.h @@ -0,0 +1,80 @@ +/* + * An implementation of the CAST128 algorithm as mentioned in RFC2144 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAST5_H +#define AVUTIL_CAST5_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAST5 algorithm + * @defgroup lavu_cast5 CAST5 + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_cast5_size; + +struct AVCAST5; + +/** + * Allocate an AVCAST5 context + * To free the struct: av_free(ptr) + */ +struct AVCAST5 *av_cast5_alloc(void); +/** + * Initialize an AVCAST5 context. + * + * @param ctx an AVCAST5 context + * @param key a key of 5,6,...16 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 40,48,...,128 + * @return 0 on success, less than 0 on failure + */ +int av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * @} + */ +#endif /* AVUTIL_CAST5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/channel_layout.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/channel_layout.h new file mode 100644 index 0000000..50bb8f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/channel_layout.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2006 Michael Niedermayer + * Copyright (c) 2008 Peter Ross + * + * 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 + */ + +#ifndef AVUTIL_CHANNEL_LAYOUT_H +#define AVUTIL_CHANNEL_LAYOUT_H + +#include + +/** + * @file + * audio channel layout utility functions + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup channel_masks Audio channel masks + * + * A channel layout is a 64-bits integer with a bit set for every channel. + * The number of bits set must be equal to the number of channels. + * The value 0 means that the channel layout is not known. + * @note this data structure is not powerful enough to handle channels + * combinations that have the same channel multiple times, such as + * dual-mono. + * + * @{ + */ +#define AV_CH_FRONT_LEFT 0x00000001 +#define AV_CH_FRONT_RIGHT 0x00000002 +#define AV_CH_FRONT_CENTER 0x00000004 +#define AV_CH_LOW_FREQUENCY 0x00000008 +#define AV_CH_BACK_LEFT 0x00000010 +#define AV_CH_BACK_RIGHT 0x00000020 +#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 +#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 +#define AV_CH_BACK_CENTER 0x00000100 +#define AV_CH_SIDE_LEFT 0x00000200 +#define AV_CH_SIDE_RIGHT 0x00000400 +#define AV_CH_TOP_CENTER 0x00000800 +#define AV_CH_TOP_FRONT_LEFT 0x00001000 +#define AV_CH_TOP_FRONT_CENTER 0x00002000 +#define AV_CH_TOP_FRONT_RIGHT 0x00004000 +#define AV_CH_TOP_BACK_LEFT 0x00008000 +#define AV_CH_TOP_BACK_CENTER 0x00010000 +#define AV_CH_TOP_BACK_RIGHT 0x00020000 +#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. +#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. +#define AV_CH_WIDE_LEFT 0x0000000080000000ULL +#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL +#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL +#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL +#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL + +/** Channel mask value used for AVCodecContext.request_channel_layout + to indicate that the user requests the channel order of the decoder output + to be the native codec channel order. */ +#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL + +/** + * @} + * @defgroup channel_mask_c Audio channel layouts + * @{ + * */ +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) +#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) + +enum AVMatrixEncoding { + AV_MATRIX_ENCODING_NONE, + AV_MATRIX_ENCODING_DOLBY, + AV_MATRIX_ENCODING_DPLII, + AV_MATRIX_ENCODING_DPLIIX, + AV_MATRIX_ENCODING_DPLIIZ, + AV_MATRIX_ENCODING_DOLBYEX, + AV_MATRIX_ENCODING_DOLBYHEADPHONE, + AV_MATRIX_ENCODING_NB +}; + +/** + * Return a channel layout id that matches name, or 0 if no match is found. + * + * name can be one or several of the following notations, + * separated by '+' or '|': + * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, + * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); + * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, + * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); + * - a number of channels, in decimal, followed by 'c', yielding + * the default channel layout for that number of channels (@see + * av_get_default_channel_layout); + * - a channel layout mask, in hexadecimal starting with "0x" (see the + * AV_CH_* macros). + * + * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" + */ +uint64_t av_get_channel_layout(const char *name); + +/** + * Return a channel layout and the number of channels based on the specified name. + * + * This function is similar to (@see av_get_channel_layout), but can also parse + * unknown channel layout specifications. + * + * @param[in] name channel layout specification string + * @param[out] channel_layout parsed channel layout (0 if unknown) + * @param[out] nb_channels number of channels + * + * @return 0 on success, AVERROR(EINVAL) if the parsing fails. + */ +int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels); + +/** + * Return a description of a channel layout. + * If nb_channels is <= 0, it is guessed from the channel_layout. + * + * @param buf put here the string containing the channel layout + * @param buf_size size in bytes of the buffer + */ +void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); + +struct AVBPrint; +/** + * Append a description of a channel layout to a bprint buffer. + */ +void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); + +/** + * Return the number of channels in the channel layout. + */ +int av_get_channel_layout_nb_channels(uint64_t channel_layout); + +/** + * Return default channel layout for a given number of channels. + */ +int64_t av_get_default_channel_layout(int nb_channels); + +/** + * Get the index of a channel in channel_layout. + * + * @param channel a channel layout describing exactly one channel which must be + * present in channel_layout. + * + * @return index of channel in channel_layout on success, a negative AVERROR + * on error. + */ +int av_get_channel_layout_channel_index(uint64_t channel_layout, + uint64_t channel); + +/** + * Get the channel with the given index in channel_layout. + */ +uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index); + +/** + * Get the name of a given channel. + * + * @return channel name on success, NULL on error. + */ +const char *av_get_channel_name(uint64_t channel); + +/** + * Get the description of a given channel. + * + * @param channel a channel layout with a single channel + * @return channel description on success, NULL on error + */ +const char *av_get_channel_description(uint64_t channel); + +/** + * Get the value and name of a standard channel layout. + * + * @param[in] index index in an internal list, starting at 0 + * @param[out] layout channel layout mask + * @param[out] name name of the layout + * @return 0 if the layout exists, + * <0 if index is beyond the limits + */ +int av_get_standard_channel_layout(unsigned index, uint64_t *layout, + const char **name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_CHANNEL_LAYOUT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/common.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/common.h new file mode 100644 index 0000000..58ead80 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/common.h @@ -0,0 +1,530 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * common internal and external API header + */ + +#ifndef AVUTIL_COMMON_H +#define AVUTIL_COMMON_H + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) +#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "attributes.h" +#include "macros.h" +#include "version.h" +#include "libavutil/avconfig.h" + +#if AV_HAVE_BIGENDIAN +# define AV_NE(be, le) (be) +#else +# define AV_NE(be, le) (le) +#endif + +//rounded division & shift +#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) +/* assume b>0 */ +#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) +/* Fast a/(1<=0 and b>=0 */ +#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ + : ((a) + (1<<(b)) - 1) >> (b)) +/* Backwards compat. */ +#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT + +#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) +#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) + +/** + * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they + * are not representable as absolute values of their type. This is the same + * as with *abs() + * @see FFNABS() + */ +#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) +#define FFSIGN(a) ((a) > 0 ? 1 : -1) + +/** + * Negative Absolute value. + * this works for all integers of all types. + * As with many macros, this evaluates its argument twice, it thus must not have + * a sideeffect, that is FFNABS(x++) has undefined behavior. + */ +#define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) + +/** + * Comparator. + * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 + * if x == y. This is useful for instance in a qsort comparator callback. + * Furthermore, compilers are able to optimize this to branchless code, and + * there is no risk of overflow with signed types. + * As with many macros, this evaluates its argument multiple times, it thus + * must not have a side-effect. + */ +#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) + +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) + +#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) + +/* misc math functions */ + +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +# include "intmath.h" +#endif + +/* Pull in unguarded fallback defines at the end of this file. */ +#include "common.h" + +#ifndef av_log2 +av_const int av_log2(unsigned v); +#endif + +#ifndef av_log2_16bit +av_const int av_log2_16bit(unsigned v); +#endif + +/** + * Clip a signed integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int av_clip_c(int a, int amin, int amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed 64bit integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed integer value into the 0-255 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint8_t av_clip_uint8_c(int a) +{ + if (a&(~0xFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -128,127 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int8_t av_clip_int8_c(int a) +{ + if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; + else return a; +} + +/** + * Clip a signed integer value into the 0-65535 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint16_t av_clip_uint16_c(int a) +{ + if (a&(~0xFFFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -32768,32767 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int16_t av_clip_int16_c(int a) +{ + if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; + else return a; +} + +/** + * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) +{ + if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); + else return (int32_t)a; +} + +/** + * Clip a signed integer into the -(2^p),(2^p-1) range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const int av_clip_intp2_c(int a, int p) +{ + if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) + return (a >> 31) ^ ((1 << p) - 1); + else + return a; +} + +/** + * Clip a signed integer to an unsigned power of two range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) +{ + if (a & ~((1<> 31 & ((1<= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a double value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** Compute ceil(log2(x)). + * @param x value used to compute ceil(log2(x)) + * @return computed ceiling of log2(x) + */ +static av_always_inline av_const int av_ceil_log2_c(int x) +{ + return av_log2((x - 1) << 1); +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount_c(uint32_t x) +{ + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount64_c(uint64_t x) +{ + return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); +} + +static av_always_inline av_const int av_parity_c(uint32_t v) +{ + return av_popcount(v) & 1; +} + +#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) +#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) + +/** + * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_BYTE Expression reading one byte from the input. + * Evaluated up to 7 times (4 for the currently + * assigned Unicode range). With a memory buffer + * input, this could be *ptr++. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + * + * @warning ERROR should not contain a loop control statement which + * could interact with the internal while loop, and should force an + * exit from the macro code (e.g. through a goto or a return) in order + * to prevent undefined results. + */ +#define GET_UTF8(val, GET_BYTE, ERROR)\ + val= (GET_BYTE);\ + {\ + uint32_t top = (val & 128) >> 1;\ + if ((val & 0xc0) == 0x80 || val >= 0xFE)\ + ERROR\ + while (val & top) {\ + int tmp= (GET_BYTE) - 128;\ + if(tmp>>6)\ + ERROR\ + val= (val<<6) + tmp;\ + top <<= 5;\ + }\ + val &= (top << 1) - 1;\ + } + +/** + * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_16BIT Expression returning two bytes of UTF-16 data converted + * to native byte order. Evaluated one or two times. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF16(val, GET_16BIT, ERROR)\ + val = GET_16BIT;\ + {\ + unsigned int hi = val - 0xD800;\ + if (hi < 0x800) {\ + val = GET_16BIT - 0xDC00;\ + if (val > 0x3FFU || hi > 0x3FFU)\ + ERROR\ + val += (hi<<10) + 0x10000;\ + }\ + }\ + +/** + * @def PUT_UTF8(val, tmp, PUT_BYTE) + * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint8_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_BYTE. + * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. + * It could be a function or a statement, and uses tmp as the input byte. + * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be + * executed up to 4 times for values in the valid UTF-8 range and up to + * 7 times in the general case, depending on the length of the converted + * Unicode character. + */ +#define PUT_UTF8(val, tmp, PUT_BYTE)\ + {\ + int bytes, shift;\ + uint32_t in = val;\ + if (in < 0x80) {\ + tmp = in;\ + PUT_BYTE\ + } else {\ + bytes = (av_log2(in) + 4) / 5;\ + shift = (bytes - 1) * 6;\ + tmp = (256 - (256 >> bytes)) | (in >> shift);\ + PUT_BYTE\ + while (shift >= 6) {\ + shift -= 6;\ + tmp = 0x80 | ((in >> shift) & 0x3f);\ + PUT_BYTE\ + }\ + }\ + } + +/** + * @def PUT_UTF16(val, tmp, PUT_16BIT) + * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint16_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_16BIT. + * @param PUT_16BIT writes the converted UTF-16 data to any proper destination + * in desired endianness. It could be a function or a statement, and uses tmp + * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" + * PUT_BYTE will be executed 1 or 2 times depending on input character. + */ +#define PUT_UTF16(val, tmp, PUT_16BIT)\ + {\ + uint32_t in = val;\ + if (in < 0x10000) {\ + tmp = in;\ + PUT_16BIT\ + } else {\ + tmp = 0xD800 | ((in - 0x10000) >> 10);\ + PUT_16BIT\ + tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ + PUT_16BIT\ + }\ + }\ + + + +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ + +#endif /* AVUTIL_COMMON_H */ + +/* + * The following definitions are outside the multiple inclusion guard + * to ensure they are immediately available in intmath.h. + */ + +#ifndef av_ceil_log2 +# define av_ceil_log2 av_ceil_log2_c +#endif +#ifndef av_clip +# define av_clip av_clip_c +#endif +#ifndef av_clip64 +# define av_clip64 av_clip64_c +#endif +#ifndef av_clip_uint8 +# define av_clip_uint8 av_clip_uint8_c +#endif +#ifndef av_clip_int8 +# define av_clip_int8 av_clip_int8_c +#endif +#ifndef av_clip_uint16 +# define av_clip_uint16 av_clip_uint16_c +#endif +#ifndef av_clip_int16 +# define av_clip_int16 av_clip_int16_c +#endif +#ifndef av_clipl_int32 +# define av_clipl_int32 av_clipl_int32_c +#endif +#ifndef av_clip_intp2 +# define av_clip_intp2 av_clip_intp2_c +#endif +#ifndef av_clip_uintp2 +# define av_clip_uintp2 av_clip_uintp2_c +#endif +#ifndef av_mod_uintp2 +# define av_mod_uintp2 av_mod_uintp2_c +#endif +#ifndef av_sat_add32 +# define av_sat_add32 av_sat_add32_c +#endif +#ifndef av_sat_dadd32 +# define av_sat_dadd32 av_sat_dadd32_c +#endif +#ifndef av_clipf +# define av_clipf av_clipf_c +#endif +#ifndef av_clipd +# define av_clipd av_clipd_c +#endif +#ifndef av_popcount +# define av_popcount av_popcount_c +#endif +#ifndef av_popcount64 +# define av_popcount64 av_popcount64_c +#endif +#ifndef av_parity +# define av_parity av_parity_c +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cpu.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cpu.h new file mode 100644 index 0000000..9e5d40a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/cpu.h @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2000, 2001, 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 + */ + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#include + +#include "attributes.h" + +#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX +#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions +#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster +#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower +#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions +#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer) +#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions +#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions +#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction +#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions +#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 +#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 + +#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard +#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 +#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07 + +#define AV_CPU_FLAG_ARMV5TE (1 << 0) +#define AV_CPU_FLAG_ARMV6 (1 << 1) +#define AV_CPU_FLAG_ARMV6T2 (1 << 2) +#define AV_CPU_FLAG_VFP (1 << 3) +#define AV_CPU_FLAG_VFPV3 (1 << 4) +#define AV_CPU_FLAG_NEON (1 << 5) +#define AV_CPU_FLAG_ARMV8 (1 << 6) +#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations +#define AV_CPU_FLAG_SETEND (1 <<16) + +/** + * Return the flags which specify extensions supported by the CPU. + * The returned value is affected by av_force_cpu_flags() if that was used + * before. So av_get_cpu_flags() can easily be used in an application to + * detect the enabled cpu flags. + */ +int av_get_cpu_flags(void); + +/** + * Disables cpu detection and forces the specified flags. + * -1 is a special case that disables forcing of specific flags. + */ +void av_force_cpu_flags(int flags); + +/** + * Set a mask on flags returned by av_get_cpu_flags(). + * This function is mainly useful for testing. + * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible + */ +attribute_deprecated void av_set_cpu_flags_mask(int mask); + +/** + * Parse CPU flags from a string. + * + * The returned flags contain the specified flags as well as related unspecified flags. + * + * This function exists only for compatibility with libav. + * Please use av_parse_cpu_caps() when possible. + * @return a combination of AV_CPU_* flags, negative on error. + */ +attribute_deprecated +int av_parse_cpu_flags(const char *s); + +/** + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. + * + * @return negative on error. + */ +int av_parse_cpu_caps(unsigned *flags, const char *s); + +/** + * @return the number of logical CPU cores present. + */ +int av_cpu_count(void); + +/** + * Get the maximum data alignment that may be required by FFmpeg. + * + * Note that this is affected by the build configuration and the CPU flags mask, + * so e.g. if the CPU supports AVX, but libavutil has been built with + * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through + * av_set_cpu_flags_mask(), then this function will behave as if AVX is not + * present. + */ +size_t av_cpu_max_align(void); + +#endif /* AVUTIL_CPU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/crc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/crc.h new file mode 100644 index 0000000..2a1b0d7 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/crc.h @@ -0,0 +1,103 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_crc32 + * Public header for CRC hash function implementation. + */ + +#ifndef AVUTIL_CRC_H +#define AVUTIL_CRC_H + +#include +#include +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_crc32 CRC + * @ingroup lavu_hash + * CRC (Cyclic Redundancy Check) hash function implementation. + * + * This module supports numerous CRC polynomials, in addition to the most + * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available + * polynomials. + * + * @{ + */ + +typedef uint32_t AVCRC; + +typedef enum { + AV_CRC_8_ATM, + AV_CRC_16_ANSI, + AV_CRC_16_CCITT, + AV_CRC_32_IEEE, + AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ + AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ +#if FF_API_CRC_BIG_TABLE + AV_CRC_24_IEEE = 12, +#else + AV_CRC_24_IEEE, +#endif /* FF_API_CRC_BIG_TABLE */ + AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ +}AVCRCId; + +/** + * Initialize a CRC table. + * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 + * @param le If 1, the lowest bit represents the coefficient for the highest + * exponent of the corresponding polynomial (both for poly and + * actual CRC). + * If 0, you must swap the CRC parameter and the result of av_crc + * if you need the standard representation (can be simplified in + * most cases to e.g. bswap16): + * av_bswap32(crc << (32-bits)) + * @param bits number of bits for the CRC + * @param poly generator polynomial without the x**bits coefficient, in the + * representation as specified by le + * @param ctx_size size of ctx in bytes + * @return <0 on failure + */ +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); + +/** + * Get an initialized standard CRC table. + * @param crc_id ID of a standard CRC + * @return a pointer to the CRC table or NULL on failure + */ +const AVCRC *av_crc_get_table(AVCRCId crc_id); + +/** + * Calculate the CRC of a block. + * @param crc CRC of previous blocks if any or initial value for CRC + * @return CRC updated with the data from the given block + * + * @see av_crc_init() "le" parameter + */ +uint32_t av_crc(const AVCRC *ctx, uint32_t crc, + const uint8_t *buffer, size_t length) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_CRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/des.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/des.h new file mode 100644 index 0000000..4cf11f5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/des.h @@ -0,0 +1,77 @@ +/* + * DES encryption/decryption + * Copyright (c) 2007 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_DES_H +#define AVUTIL_DES_H + +#include + +/** + * @defgroup lavu_des DES + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVDES { + uint64_t round_keys[3][16]; + int triple_des; +} AVDES; + +/** + * Allocate an AVDES context. + */ +AVDES *av_des_alloc(void); + +/** + * @brief Initializes an AVDES context. + * + * @param key_bits must be 64 or 192 + * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption + * @return zero on success, negative value otherwise + */ +int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + * @param iv initialization vector for CBC mode, if NULL then ECB will be used, + * must be 8-byte aligned + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @brief Calculates CBC-MAC using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + */ +void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); + +/** + * @} + */ + +#endif /* AVUTIL_DES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/dict.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/dict.h new file mode 100644 index 0000000..118f1f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/dict.h @@ -0,0 +1,200 @@ +/* + * 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 + * Public dictionary API. + * @deprecated + * AVDictionary is provided for compatibility with libav. It is both in + * implementation as well as API inefficient. It does not scale and is + * extremely slow with large dictionaries. + * It is recommended that new code uses our tree container from tree.c/h + * where applicable, which uses AVL trees to achieve O(log n) performance. + */ + +#ifndef AVUTIL_DICT_H +#define AVUTIL_DICT_H + +#include + +#include "version.h" + +/** + * @addtogroup lavu_dict AVDictionary + * @ingroup lavu_data + * + * @brief Simple key:value store + * + * @{ + * Dictionaries are used for storing key:value pairs. To create + * an AVDictionary, simply pass an address of a NULL pointer to + * av_dict_set(). NULL can be used as an empty dictionary wherever + * a pointer to an AVDictionary is required. + * Use av_dict_get() to retrieve an entry or iterate over all + * entries and finally av_dict_free() to free the dictionary + * and all its contents. + * + @code + AVDictionary *d = NULL; // "create" an empty dictionary + AVDictionaryEntry *t = NULL; + + av_dict_set(&d, "foo", "bar", 0); // add an entry + + char *k = av_strdup("key"); // if your strings are already allocated, + char *v = av_strdup("value"); // you can avoid copying them like this + av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); + + while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { + <....> // iterate over all entries in d + } + av_dict_free(&d); + @endcode + */ + +#define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */ +#define AV_DICT_IGNORE_SUFFIX 2 /**< Return first entry in a dictionary whose first part corresponds to the search key, + ignoring the suffix of the found key string. Only relevant in av_dict_get(). */ +#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries. +#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no + delimiter is added, the strings are simply concatenated. */ +#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ + +typedef struct AVDictionaryEntry { + char *key; + char *value; +} AVDictionaryEntry; + +typedef struct AVDictionary AVDictionary; + +/** + * Get a dictionary entry with matching key. + * + * The returned entry key or value must not be changed, or it will + * cause undefined behavior. + * + * To iterate through all the dictionary entries, you can set the matching key + * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. + * + * @param prev Set to the previous matching element to find the next. + * If set to NULL the first matching element is returned. + * @param key matching key + * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved + * @return found entry or NULL in case no matching entry was found in the dictionary + */ +AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, + const AVDictionaryEntry *prev, int flags); + +/** + * Get number of entries in dictionary. + * + * @param m dictionary + * @return number of entries in dictionary + */ +int av_dict_count(const AVDictionary *m); + +/** + * Set the given entry in *pm, overwriting an existing entry. + * + * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, + * these arguments will be freed on error. + * + * Warning: Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get. + * + * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL + * a dictionary struct is allocated and put in *pm. + * @param key entry key to add to *pm (will either be av_strduped or added as a new key depending on flags) + * @param value entry value to add to *pm (will be av_strduped or added as a new key depending on flags). + * Passing a NULL value will cause an existing entry to be deleted. + * @return >= 0 on success otherwise an error code <0 + */ +int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); + +/** + * Convenience wrapper for av_dict_set that converts the value to a string + * and stores it. + * + * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. + */ +int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); + +/** + * Parse the key/value pairs list and add the parsed entries to a dictionary. + * + * In case of failure, all the successfully set entries are stored in + * *pm. You may need to manually free the created dictionary. + * + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @param flags flags to use when adding to dictionary. + * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL + * are ignored since the key/value tokens will always + * be duplicated. + * @return 0 on success, negative AVERROR code on failure + */ +int av_dict_parse_string(AVDictionary **pm, const char *str, + const char *key_val_sep, const char *pairs_sep, + int flags); + +/** + * Copy entries from one AVDictionary struct into another. + * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, + * this function will allocate a struct for you and put it in *dst + * @param src pointer to source AVDictionary struct + * @param flags flags to use when setting entries in *dst + * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag + * @return 0 on success, negative AVERROR code on failure. If dst was allocated + * by this function, callers should free the associated memory. + */ +int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); + +/** + * Free all the memory allocated for an AVDictionary struct + * and all keys and values. + */ +void av_dict_free(AVDictionary **m); + +/** + * Get dictionary entries as a string. + * + * Create a string containing dictionary's entries. + * Such string may be passed back to av_dict_parse_string(). + * @note String is escaped with backslashes ('\'). + * + * @param[in] m dictionary + * @param[out] buffer Pointer to buffer that will be allocated with string containg entries. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_dict_get_string(const AVDictionary *m, char **buffer, + const char key_val_sep, const char pairs_sep); + +/** + * @} + */ + +#endif /* AVUTIL_DICT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/display.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/display.h new file mode 100644 index 0000000..515adad --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/display.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2014 Vittorio Giovara + * + * 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 + * Display matrix + */ + +#ifndef AVUTIL_DISPLAY_H +#define AVUTIL_DISPLAY_H + +#include +#include "common.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_display Display transformation matrix functions + * @{ + */ + +/** + * @addtogroup lavu_video_display + * The display transformation matrix specifies an affine transformation that + * should be applied to video frames for correct presentation. It is compatible + * with the matrices stored in the ISO/IEC 14496-12 container format. + * + * The data is a 3x3 matrix represented as a 9-element array: + * + * @code{.unparsed} + * | a b u | + * (a, b, u, c, d, v, x, y, w) -> | c d v | + * | x y w | + * @endcode + * + * All numbers are stored in native endianness, as 16.16 fixed-point values, + * except for u, v and w, which are stored as 2.30 fixed-point values. + * + * The transformation maps a point (p, q) in the source (pre-transformation) + * frame to the point (p', q') in the destination (post-transformation) frame as + * follows: + * + * @code{.unparsed} + * | a b u | + * (p, q, 1) . | c d v | = z * (p', q', 1) + * | x y w | + * @endcode + * + * The transformation can also be more explicitly written in components as + * follows: + * + * @code{.unparsed} + * p' = (a * p + c * q + x) / z; + * q' = (b * p + d * q + y) / z; + * z = u * p + v * q + w + * @endcode + */ + +/** + * Extract the rotation component of the transformation matrix. + * + * @param matrix the transformation matrix + * @return the angle (in degrees) by which the transformation rotates the frame + * counterclockwise. The angle will be in range [-180.0, 180.0], + * or NaN if the matrix is singular. + * + * @note floating point numbers are inherently inexact, so callers are + * recommended to round the return value to nearest integer before use. + */ +double av_display_rotation_get(const int32_t matrix[9]); + +/** + * Initialize a transformation matrix describing a pure counterclockwise + * rotation by the specified angle (in degrees). + * + * @param matrix an allocated transformation matrix (will be fully overwritten + * by this function) + * @param angle rotation angle in degrees. + */ +void av_display_rotation_set(int32_t matrix[9], double angle); + +/** + * Flip the input matrix horizontally and/or vertically. + * + * @param matrix an allocated transformation matrix + * @param hflip whether the matrix should be flipped horizontally + * @param vflip whether the matrix should be flipped vertically + */ +void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_DISPLAY_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/downmix_info.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/downmix_info.h new file mode 100644 index 0000000..221cf5b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/downmix_info.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2014 Tim Walker + * + * 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 + */ + +#ifndef AVUTIL_DOWNMIX_INFO_H +#define AVUTIL_DOWNMIX_INFO_H + +#include "frame.h" + +/** + * @file + * audio downmix medatata + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup downmix_info Audio downmix metadata + * @{ + */ + +/** + * Possible downmix types. + */ +enum AVDownmixType { + AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */ + AV_DOWNMIX_TYPE_LORO, /**< Lo/Ro 2-channel downmix (Stereo). */ + AV_DOWNMIX_TYPE_LTRT, /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */ + AV_DOWNMIX_TYPE_DPLII, /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */ + AV_DOWNMIX_TYPE_NB /**< Number of downmix types. Not part of ABI. */ +}; + +/** + * This structure describes optional metadata relevant to a downmix procedure. + * + * All fields are set by the decoder to the value indicated in the audio + * bitstream (if present), or to a "sane" default otherwise. + */ +typedef struct AVDownmixInfo { + /** + * Type of downmix preferred by the mastering engineer. + */ + enum AVDownmixType preferred_downmix_type; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during a regular downmix. + */ + double center_mix_level; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during an Lt/Rt compatible downmix. + */ + double center_mix_level_ltrt; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during a regular downmix. + */ + double surround_mix_level; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during an Lt/Rt compatible downmix. + */ + double surround_mix_level_ltrt; + + /** + * Absolute scale factor representing the level at which the LFE data is + * mixed into L/R channels during downmixing. + */ + double lfe_mix_level; +} AVDownmixInfo; + +/** + * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing. + * + * If the side data is absent, it is created and added to the frame. + * + * @param frame the frame for which the side data is to be obtained or created + * + * @return the AVDownmixInfo structure to be edited by the caller, or NULL if + * the structure cannot be allocated. + */ +AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame); + +/** + * @} + */ + +/** + * @} + */ + +#endif /* AVUTIL_DOWNMIX_INFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/error.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/error.h new file mode 100644 index 0000000..71df4da --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/error.h @@ -0,0 +1,126 @@ +/* + * 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 + * error code definitions + */ + +#ifndef AVUTIL_ERROR_H +#define AVUTIL_ERROR_H + +#include +#include + +/** + * @addtogroup lavu_error + * + * @{ + */ + + +/* error handling */ +#if EDOM > 0 +#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. +#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. +#else +/* Some platforms have E* and errno already negated. */ +#define AVERROR(e) (e) +#define AVUNERROR(e) (e) +#endif + +#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) + +#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found +#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2 +#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small +#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found +#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found +#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found +#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file +#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted +#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library +#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found +#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input +#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found +#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found +#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome +#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found + +#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< Stream not found +/** + * This is semantically identical to AVERROR_BUG + * it has been introduced in Libav after our AVERROR_BUG and with a modified value. + */ +#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ') +#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library +#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. +#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED) +#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED) +/* HTTP & RTSP errors */ +#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0') +#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1') +#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3') +#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4') +#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X') +#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X') + +#define AV_ERROR_MAX_STRING_SIZE 64 + +/** + * Put a description of the AVERROR code errnum in errbuf. + * In case of failure the global variable errno is set to indicate the + * error. Even in case of failure av_strerror() will print a generic + * error message indicating the errnum provided to errbuf. + * + * @param errnum error code to describe + * @param errbuf buffer to which description is written + * @param errbuf_size the size in bytes of errbuf + * @return 0 on success, a negative value if a description for errnum + * cannot be found + */ +int av_strerror(int errnum, char *errbuf, size_t errbuf_size); + +/** + * Fill the provided buffer with a string containing an error string + * corresponding to the AVERROR code errnum. + * + * @param errbuf a buffer + * @param errbuf_size size in bytes of errbuf + * @param errnum error code to describe + * @return the buffer in input, filled with the error description + * @see av_strerror() + */ +static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) +{ + av_strerror(errnum, errbuf, errbuf_size); + return errbuf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_err2str(errnum) \ + av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) + +/** + * @} + */ + +#endif /* AVUTIL_ERROR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/eval.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/eval.h new file mode 100644 index 0000000..dacd22b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/eval.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002 Michael Niedermayer + * + * 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 + * simple arithmetic expression evaluator + */ + +#ifndef AVUTIL_EVAL_H +#define AVUTIL_EVAL_H + +#include "avutil.h" + +typedef struct AVExpr AVExpr; + +/** + * Parse and evaluate an expression. + * Note, this is significantly slower than av_expr_eval(). + * + * @param res a pointer to a double where is put the result value of + * the expression, or NAN in case of error + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param const_values a zero terminated array of values for the identifiers from const_names + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse_and_eval(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * Parse an expression. + * + * @param expr a pointer where is put an AVExpr containing the parsed + * value in case of successful parsing, or NULL otherwise. + * The pointed to AVExpr must be freed with av_expr_free() by the user + * when it is not needed anymore. + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); + +/** + * Evaluate a previously parsed expression. + * + * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @return the value of the expression + */ +double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); + +/** + * Free a parsed expression previously created with av_expr_parse(). + */ +void av_expr_free(AVExpr *e); + +/** + * Parse the string in numstr and return its value as a double. If + * the string is empty, contains only whitespaces, or does not contain + * an initial substring that has the expected syntax for a + * floating-point number, no conversion is performed. In this case, + * returns a value of zero and the value returned in tail is the value + * of numstr. + * + * @param numstr a string representing a number, may contain one of + * the International System number postfixes, for example 'K', 'M', + * 'G'. If 'i' is appended after the postfix, powers of 2 are used + * instead of powers of 10. The 'B' postfix multiplies the value by + * 8, and can be appended after another postfix or used alone. This + * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. + * @param tail if non-NULL puts here the pointer to the char next + * after the last parsed character + */ +double av_strtod(const char *numstr, char **tail); + +#endif /* AVUTIL_EVAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ffversion.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ffversion.h new file mode 100644 index 0000000..ed47f05 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ffversion.h @@ -0,0 +1,5 @@ +/* Automatically generated by version.sh, do not manually edit! */ +#ifndef AVUTIL_FFVERSION_H +#define AVUTIL_FFVERSION_H +#define FFMPEG_VERSION "3.4.5" +#endif /* AVUTIL_FFVERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/fifo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/fifo.h new file mode 100644 index 0000000..dc7bc6f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/fifo.h @@ -0,0 +1,179 @@ +/* + * 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 + * a very simple circular buffer FIFO implementation + */ + +#ifndef AVUTIL_FIFO_H +#define AVUTIL_FIFO_H + +#include +#include "avutil.h" +#include "attributes.h" + +typedef struct AVFifoBuffer { + uint8_t *buffer; + uint8_t *rptr, *wptr, *end; + uint32_t rndx, wndx; +} AVFifoBuffer; + +/** + * Initialize an AVFifoBuffer. + * @param size of FIFO + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc(unsigned int size); + +/** + * Initialize an AVFifoBuffer. + * @param nmemb number of elements + * @param size size of the single element + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); + +/** + * Free an AVFifoBuffer. + * @param f AVFifoBuffer to free + */ +void av_fifo_free(AVFifoBuffer *f); + +/** + * Free an AVFifoBuffer and reset pointer to NULL. + * @param f AVFifoBuffer to free + */ +void av_fifo_freep(AVFifoBuffer **f); + +/** + * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. + * @param f AVFifoBuffer to reset + */ +void av_fifo_reset(AVFifoBuffer *f); + +/** + * Return the amount of data in bytes in the AVFifoBuffer, that is the + * amount of data you can read from it. + * @param f AVFifoBuffer to read from + * @return size + */ +int av_fifo_size(const AVFifoBuffer *f); + +/** + * Return the amount of space in bytes in the AVFifoBuffer, that is the + * amount of data you can write into it. + * @param f AVFifoBuffer to write into + * @return size + */ +int av_fifo_space(const AVFifoBuffer *f); + +/** + * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param offset offset from current read position + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from a user-supplied callback to an AVFifoBuffer. + * @param f AVFifoBuffer to write to + * @param src data source; non-const since it may be used as a + * modifiable context by the function defined in func + * @param size number of bytes to write + * @param func generic write function; the first parameter is src, + * the second is dest_buf, the third is dest_buf_size. + * func must return the number of bytes written to dest_buf, or <= 0 to + * indicate no more data available to write. + * If func is NULL, src is interpreted as a simple byte array for source data. + * @return the number of bytes written to the FIFO + */ +int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); + +/** + * Resize an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * + * @param f AVFifoBuffer to resize + * @param size new AVFifoBuffer size in bytes + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); + +/** + * Enlarge an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * The new fifo size may be larger than the requested size. + * + * @param f AVFifoBuffer to resize + * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); + +/** + * Read and discard the specified amount of data from an AVFifoBuffer. + * @param f AVFifoBuffer to read from + * @param size amount of data to read in bytes + */ +void av_fifo_drain(AVFifoBuffer *f, int size); + +/** + * Return a pointer to the data stored in a FIFO buffer at a certain offset. + * The FIFO buffer is not modified. + * + * @param f AVFifoBuffer to peek at, f must be non-NULL + * @param offs an offset in bytes, its absolute value must be less + * than the used buffer size or the returned pointer will + * point outside to the buffer data. + * The used buffer size can be checked with av_fifo_size(). + */ +static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) +{ + uint8_t *ptr = f->rptr + offs; + if (ptr >= f->end) + ptr = f->buffer + (ptr - f->end); + else if (ptr < f->buffer) + ptr = f->end - (f->buffer - ptr); + return ptr; +} + +#endif /* AVUTIL_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/file.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/file.h new file mode 100644 index 0000000..8666c7b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/file.h @@ -0,0 +1,69 @@ +/* + * 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 + */ + +#ifndef AVUTIL_FILE_H +#define AVUTIL_FILE_H + +#include + +#include "avutil.h" + +/** + * @file + * Misc file utilities. + */ + +/** + * Read the file with name filename, and put its content in a newly + * allocated buffer or map it with mmap() when available. + * In case of success set *bufptr to the read or mmapped buffer, and + * *size to the size in bytes of the buffer in *bufptr. + * The returned buffer must be released with av_file_unmap(). + * + * @param log_offset loglevel offset used for logging + * @param log_ctx context used for logging + * @return a non negative number in case of success, a negative value + * corresponding to an AVERROR error code in case of failure + */ +av_warn_unused_result +int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, + int log_offset, void *log_ctx); + +/** + * Unmap or free the buffer bufptr created by av_file_map(). + * + * @param size size in bytes of bufptr, must be the same as returned + * by av_file_map() + */ +void av_file_unmap(uint8_t *bufptr, size_t size); + +/** + * Wrapper to work around the lack of mkstemp() on mingw. + * Also, tries to create file in /tmp first, if possible. + * *prefix can be a character constant; *filename will be allocated internally. + * @return file descriptor of opened file (or negative value corresponding to an + * AVERROR code on error) + * and opened file name in **filename. + * @note On very old libcs it is necessary to set a secure umask before + * calling this, av_tempfile() can't call umask itself as it is used in + * libraries and could interfere with the calling application. + * @deprecated as fd numbers cannot be passed saftely between libs on some platforms + */ +int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); + +#endif /* AVUTIL_FILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/frame.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/frame.h new file mode 100644 index 0000000..abe4f4f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/frame.h @@ -0,0 +1,821 @@ +/* + * 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 + * @ingroup lavu_frame + * reference-counted frame API + */ + +#ifndef AVUTIL_FRAME_H +#define AVUTIL_FRAME_H + +#include +#include + +#include "avutil.h" +#include "buffer.h" +#include "dict.h" +#include "rational.h" +#include "samplefmt.h" +#include "pixfmt.h" +#include "version.h" + + +/** + * @defgroup lavu_frame AVFrame + * @ingroup lavu_data + * + * @{ + * AVFrame is an abstraction for reference-counted raw multimedia data. + */ + +enum AVFrameSideDataType { + /** + * The data is the AVPanScan struct defined in libavcodec. + */ + AV_FRAME_DATA_PANSCAN, + /** + * ATSC A53 Part 4 Closed Captions. + * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. + * The number of bytes of CC data is AVFrameSideData.size. + */ + AV_FRAME_DATA_A53_CC, + /** + * Stereoscopic 3d metadata. + * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. + */ + AV_FRAME_DATA_STEREO3D, + /** + * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. + */ + AV_FRAME_DATA_MATRIXENCODING, + /** + * Metadata relevant to a downmix procedure. + * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. + */ + AV_FRAME_DATA_DOWNMIX_INFO, + /** + * ReplayGain information in the form of the AVReplayGain struct. + */ + AV_FRAME_DATA_REPLAYGAIN, + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the frame for correct + * presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_FRAME_DATA_DISPLAYMATRIX, + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_FRAME_DATA_AFD, + /** + * Motion vectors exported by some codecs (on demand through the export_mvs + * flag set in the libavcodec AVCodecContext flags2 option). + * The data is the AVMotionVector struct defined in + * libavutil/motion_vector.h. + */ + AV_FRAME_DATA_MOTION_VECTORS, + /** + * Recommmends skipping the specified number of samples. This is exported + * only if the "skip_manual" AVOption is set in libavcodec. + * This has the same format as AV_PKT_DATA_SKIP_SAMPLES. + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_FRAME_DATA_SKIP_SAMPLES, + /** + * This side data must be associated with an audio frame and corresponds to + * enum AVAudioServiceType defined in avcodec.h. + */ + AV_FRAME_DATA_AUDIO_SERVICE_TYPE, + /** + * Mastering display metadata associated with a video frame. The payload is + * an AVMasteringDisplayMetadata type and contains information about the + * mastering display color volume. + */ + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + /** + * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. + * This is set on the first frame of a GOP that has a temporal reference of 0. + */ + AV_FRAME_DATA_GOP_TIMECODE, + + /** + * The data represents the AVSphericalMapping structure defined in + * libavutil/spherical.h. + */ + AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + + /** + * The data contains an ICC profile as an opaque octet buffer following the + * format described by ISO 15076-1 with an optional name defined in the + * metadata key entry "name". + */ + AV_FRAME_DATA_ICC_PROFILE, +}; + +enum AVActiveFormatDescription { + AV_AFD_SAME = 8, + AV_AFD_4_3 = 9, + AV_AFD_16_9 = 10, + AV_AFD_14_9 = 11, + AV_AFD_4_3_SP_14_9 = 13, + AV_AFD_16_9_SP_14_9 = 14, + AV_AFD_SP_4_3 = 15, +}; + + +/** + * Structure to hold side data for an AVFrame. + * + * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + */ +typedef struct AVFrameSideData { + enum AVFrameSideDataType type; + uint8_t *data; + int size; + AVDictionary *metadata; + AVBufferRef *buf; +} AVFrameSideData; + +/** + * This structure describes decoded (raw) audio or video data. + * + * AVFrame must be allocated using av_frame_alloc(). Note that this only + * allocates the AVFrame itself, the buffers for the data must be managed + * through other means (see below). + * AVFrame must be freed with av_frame_free(). + * + * AVFrame is typically allocated once and then reused multiple times to hold + * different data (e.g. a single AVFrame to hold frames received from a + * decoder). In such a case, av_frame_unref() will free any references held by + * the frame and reset it to its original clean state before it + * is reused again. + * + * The data described by an AVFrame is usually reference counted through the + * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / + * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at + * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, + * every single data plane must be contained in one of the buffers in + * AVFrame.buf or AVFrame.extended_buf. + * There may be a single buffer for all the data, or one separate buffer for + * each plane, or anything in between. + * + * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + * + * Fields can be accessed through AVOptions, the name string used, matches the + * C structure field name for fields accessible through AVOptions. The AVClass + * for AVFrame can be obtained from avcodec_get_frame_class() + */ +typedef struct AVFrame { +#define AV_NUM_DATA_POINTERS 8 + /** + * pointer to the picture/channel planes. + * This might be different from the first allocated byte + * + * Some decoders access areas outside 0,0 - width,height, please + * see avcodec_align_dimensions2(). Some filters and swscale can read + * up to 16 bytes beyond the planes, if these filters are to be used, + * then 16 extra bytes must be allocated. + * + * NOTE: Except for hwaccel formats, pointers not needed by the format + * MUST be set to NULL. + */ + uint8_t *data[AV_NUM_DATA_POINTERS]; + + /** + * For video, size in bytes of each picture line. + * For audio, size in bytes of each plane. + * + * For audio, only linesize[0] may be set. For planar audio, each channel + * plane must be the same size. + * + * For video the linesizes should be multiples of the CPUs alignment + * preference, this is 16 or 32 for modern desktop CPUs. + * Some code requires such alignment other code can be slower without + * correct alignment, for yet other it makes no difference. + * + * @note The linesize may be larger than the size of usable data -- there + * may be extra padding present for performance reasons. + */ + int linesize[AV_NUM_DATA_POINTERS]; + + /** + * pointers to the data planes/channels. + * + * For video, this should simply point to data[]. + * + * For planar audio, each channel has a separate data pointer, and + * linesize[0] contains the size of each channel buffer. + * For packed audio, there is just one data pointer, and linesize[0] + * contains the total size of the buffer for all channels. + * + * Note: Both data and extended_data should always be set in a valid frame, + * but for planar audio with more channels that can fit in data, + * extended_data must be used in order to access all channels. + */ + uint8_t **extended_data; + + /** + * @name Video dimensions + * Video frames only. The coded dimensions (in pixels) of the video frame, + * i.e. the size of the rectangle that contains some well-defined values. + * + * @note The part of the frame intended for display/presentation is further + * restricted by the @ref cropping "Cropping rectangle". + * @{ + */ + int width, height; + /** + * @} + */ + + /** + * number of audio samples (per channel) described by this frame + */ + int nb_samples; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum AVPixelFormat for video frames, + * enum AVSampleFormat for audio) + */ + int format; + + /** + * 1 -> keyframe, 0-> not + */ + int key_frame; + + /** + * Picture type of the frame. + */ + enum AVPictureType pict_type; + + /** + * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. + */ + AVRational sample_aspect_ratio; + + /** + * Presentation timestamp in time_base units (time when frame should be shown to user). + */ + int64_t pts; + +#if FF_API_PKT_PTS + /** + * PTS copied from the AVPacket that was decoded to produce this frame. + * @deprecated use the pts field instead + */ + attribute_deprecated + int64_t pkt_pts; +#endif + + /** + * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) + * This is also the Presentation time of this AVFrame calculated from + * only AVPacket.dts values without pts values. + */ + int64_t pkt_dts; + + /** + * picture number in bitstream order + */ + int coded_picture_number; + /** + * picture number in display order + */ + int display_picture_number; + + /** + * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) + */ + int quality; + + /** + * for some private data of the user + */ + void *opaque; + +#if FF_API_ERROR_FRAME + /** + * @deprecated unused + */ + attribute_deprecated + uint64_t error[AV_NUM_DATA_POINTERS]; +#endif + + /** + * When decoding, this signals how much the picture must be delayed. + * extra_delay = repeat_pict / (2*fps) + */ + int repeat_pict; + + /** + * The content of the picture is interlaced. + */ + int interlaced_frame; + + /** + * If the content is interlaced, is top field displayed first. + */ + int top_field_first; + + /** + * Tell user application that palette has changed from previous frame. + */ + int palette_has_changed; + + /** + * reordered opaque 64 bits (generally an integer or a double precision float + * PTS but can be anything). + * The user sets AVCodecContext.reordered_opaque to represent the input at + * that time, + * the decoder reorders values as needed and sets AVFrame.reordered_opaque + * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque + * @deprecated in favor of pkt_pts + */ + int64_t reordered_opaque; + + /** + * Sample rate of the audio data. + */ + int sample_rate; + + /** + * Channel layout of the audio data. + */ + uint64_t channel_layout; + + /** + * AVBuffer references backing the data for this frame. If all elements of + * this array are NULL, then this frame is not reference counted. This array + * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must + * also be non-NULL for all j < i. + * + * There may be at most one AVBuffer per data plane, so for video this array + * always contains all the references. For planar audio with more than + * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in + * this array. Then the extra AVBufferRef pointers are stored in the + * extended_buf array. + */ + AVBufferRef *buf[AV_NUM_DATA_POINTERS]; + + /** + * For planar audio which requires more than AV_NUM_DATA_POINTERS + * AVBufferRef pointers, this array will hold all the references which + * cannot fit into AVFrame.buf. + * + * Note that this is different from AVFrame.extended_data, which always + * contains all the pointers. This array only contains the extra pointers, + * which cannot fit into AVFrame.buf. + * + * This array is always allocated using av_malloc() by whoever constructs + * the frame. It is freed in av_frame_unref(). + */ + AVBufferRef **extended_buf; + /** + * Number of elements in extended_buf. + */ + int nb_extended_buf; + + AVFrameSideData **side_data; + int nb_side_data; + +/** + * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame + * Flags describing additional frame properties. + * + * @{ + */ + +/** + * The frame data may be corrupted, e.g. due to decoding errors. + */ +#define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark the frames which need to be decoded, but shouldn't be output. + */ +#define AV_FRAME_FLAG_DISCARD (1 << 2) +/** + * @} + */ + + /** + * Frame flags, a combination of @ref lavu_frame_flags + */ + int flags; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + enum AVColorPrimaries color_primaries; + + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + enum AVChromaLocation chroma_location; + + /** + * frame timestamp estimated using various heuristics, in stream time base + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int64_t best_effort_timestamp; + + /** + * reordered pos from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_pos; + + /** + * duration of the corresponding packet, expressed in + * AVStream->time_base units, 0 if unknown. + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_duration; + + /** + * metadata. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVDictionary *metadata; + + /** + * decode error flags of the frame, set to a combination of + * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there + * were errors during the decoding. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int decode_error_flags; +#define FF_DECODE_ERROR_INVALID_BITSTREAM 1 +#define FF_DECODE_ERROR_MISSING_REFERENCE 2 + + /** + * number of audio channels, only used for audio. + * - encoding: unused + * - decoding: Read by user. + */ + int channels; + + /** + * size of the corresponding packet containing the compressed + * frame. + * It is set to a negative value if unknown. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int pkt_size; + +#if FF_API_FRAME_QP + /** + * QP table + */ + attribute_deprecated + int8_t *qscale_table; + /** + * QP store stride + */ + attribute_deprecated + int qstride; + + attribute_deprecated + int qscale_type; + + AVBufferRef *qp_table_buf; +#endif + /** + * For hwaccel-format frames, this should be a reference to the + * AVHWFramesContext describing the frame. + */ + AVBufferRef *hw_frames_ctx; + + /** + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * @anchor cropping + * @name Cropping + * Video frames only. The number of pixels to discard from the the + * top/bottom/left/right border of the frame to obtain the sub-rectangle of + * the frame intended for presentation. + * @{ + */ + size_t crop_top; + size_t crop_bottom; + size_t crop_left; + size_t crop_right; + /** + * @} + */ +} AVFrame; + +/** + * Accessors for some AVFrame fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); +void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); +int64_t av_frame_get_pkt_duration (const AVFrame *frame); +void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); +int64_t av_frame_get_pkt_pos (const AVFrame *frame); +void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); +int64_t av_frame_get_channel_layout (const AVFrame *frame); +void av_frame_set_channel_layout (AVFrame *frame, int64_t val); +int av_frame_get_channels (const AVFrame *frame); +void av_frame_set_channels (AVFrame *frame, int val); +int av_frame_get_sample_rate (const AVFrame *frame); +void av_frame_set_sample_rate (AVFrame *frame, int val); +AVDictionary *av_frame_get_metadata (const AVFrame *frame); +void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); +int av_frame_get_decode_error_flags (const AVFrame *frame); +void av_frame_set_decode_error_flags (AVFrame *frame, int val); +int av_frame_get_pkt_size(const AVFrame *frame); +void av_frame_set_pkt_size(AVFrame *frame, int val); +AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame); +#if FF_API_FRAME_QP +int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); +int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); +#endif +enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); +void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); +enum AVColorRange av_frame_get_color_range(const AVFrame *frame); +void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); + +/** + * Get the name of a colorspace. + * @return a static string identifying the colorspace; can be NULL. + */ +const char *av_get_colorspace_name(enum AVColorSpace val); + +/** + * Allocate an AVFrame and set its fields to default values. The resulting + * struct must be freed using av_frame_free(). + * + * @return An AVFrame filled with default values or NULL on failure. + * + * @note this only allocates the AVFrame itself, not the data buffers. Those + * must be allocated through other means, e.g. with av_frame_get_buffer() or + * manually. + */ +AVFrame *av_frame_alloc(void); + +/** + * Free the frame and any dynamically allocated objects in it, + * e.g. extended_data. If the frame is reference counted, it will be + * unreferenced first. + * + * @param frame frame to be freed. The pointer will be set to NULL. + */ +void av_frame_free(AVFrame **frame); + +/** + * Set up a new reference to the data described by the source frame. + * + * Copy frame properties from src to dst and create a new reference for each + * AVBufferRef from src. + * + * If src is not reference counted, new buffers are allocated and the data is + * copied. + * + * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), + * or newly allocated with av_frame_alloc() before calling this + * function, or undefined behavior will occur. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_frame_ref(AVFrame *dst, const AVFrame *src); + +/** + * Create a new frame that references the same data as src. + * + * This is a shortcut for av_frame_alloc()+av_frame_ref(). + * + * @return newly created AVFrame on success, NULL on error. + */ +AVFrame *av_frame_clone(const AVFrame *src); + +/** + * Unreference all the buffers referenced by frame and reset the frame fields. + */ +void av_frame_unref(AVFrame *frame); + +/** + * Move everything contained in src to dst and reset src. + * + * @warning: dst is not unreferenced, but directly overwritten without reading + * or deallocating its contents. Call av_frame_unref(dst) manually + * before calling this function to ensure that no memory is leaked. + */ +void av_frame_move_ref(AVFrame *dst, AVFrame *src); + +/** + * Allocate new buffer(s) for audio or video data. + * + * The following fields must be set on frame before calling this function: + * - format (pixel format for video, sample format for audio) + * - width and height for video + * - nb_samples and channel_layout for audio + * + * This function will fill AVFrame.data and AVFrame.buf arrays and, if + * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. + * For planar formats, one buffer will be allocated for each plane. + * + * @warning: if frame already has been allocated, calling this function will + * leak memory. In addition, undefined behavior can occur in certain + * cases. + * + * @param frame frame in which to store the new buffers. + * @param align Required buffer size alignment. If equal to 0, alignment will be + * chosen automatically for the current CPU. It is highly + * recommended to pass 0 here unless you know what you are doing. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_frame_get_buffer(AVFrame *frame, int align); + +/** + * Check if the frame data is writable. + * + * @return A positive value if the frame data is writable (which is true if and + * only if each of the underlying buffers has only one reference, namely the one + * stored in this frame). Return 0 otherwise. + * + * If 1 is returned the answer is valid until av_buffer_ref() is called on any + * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). + * + * @see av_frame_make_writable(), av_buffer_is_writable() + */ +int av_frame_is_writable(AVFrame *frame); + +/** + * Ensure that the frame data is writable, avoiding data copy if possible. + * + * Do nothing if the frame is writable, allocate new buffers and copy the data + * if it is not. + * + * @return 0 on success, a negative AVERROR on error. + * + * @see av_frame_is_writable(), av_buffer_is_writable(), + * av_buffer_make_writable() + */ +int av_frame_make_writable(AVFrame *frame); + +/** + * Copy the frame data from src to dst. + * + * This function does not allocate anything, dst must be already initialized and + * allocated with the same parameters as src. + * + * This function only copies the frame data (i.e. the contents of the data / + * extended data arrays), not any other properties. + * + * @return >= 0 on success, a negative AVERROR on error. + */ +int av_frame_copy(AVFrame *dst, const AVFrame *src); + +/** + * Copy only "metadata" fields from src to dst. + * + * Metadata for the purpose of this function are those fields that do not affect + * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample + * aspect ratio (for video), but not width/height or channel layout. + * Side data is also copied. + */ +int av_frame_copy_props(AVFrame *dst, const AVFrame *src); + +/** + * Get the buffer reference a given data plane is stored in. + * + * @param plane index of the data plane of interest in frame->extended_data. + * + * @return the buffer reference that contains the plane or NULL if the input + * frame is not valid. + */ +AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); + +/** + * Add a new side data to a frame. + * + * @param frame a frame to which the side data should be added + * @param type type of the added side data + * @param size size of the side data + * + * @return newly added side data on success, NULL on error + */ +AVFrameSideData *av_frame_new_side_data(AVFrame *frame, + enum AVFrameSideDataType type, + int size); + +/** + * @return a pointer to the side data of a given type on success, NULL if there + * is no side data with such type in this frame. + */ +AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, + enum AVFrameSideDataType type); + +/** + * If side data of the supplied type exists in the frame, free it and remove it + * from the frame. + */ +void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); + + +/** + * Flags for frame cropping. + */ +enum { + /** + * Apply the maximum possible cropping, even if it requires setting the + * AVFrame.data[] entries to unaligned pointers. Passing unaligned data + * to FFmpeg API is generally not allowed, and causes undefined behavior + * (such as crashes). You can pass unaligned data only to FFmpeg APIs that + * are explicitly documented to accept it. Use this flag only if you + * absolutely know what you are doing. + */ + AV_FRAME_CROP_UNALIGNED = 1 << 0, +}; + +/** + * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ + * crop_bottom fields. If cropping is successful, the function will adjust the + * data pointers and the width/height fields, and set the crop fields to 0. + * + * In all cases, the cropping boundaries will be rounded to the inherent + * alignment of the pixel format. In some cases, such as for opaque hwaccel + * formats, the left/top cropping is ignored. The crop fields are set to 0 even + * if the cropping was rounded or ignored. + * + * @param frame the frame which should be cropped + * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. + * + * @return >= 0 on success, a negative AVERROR on error. If the cropping fields + * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. + */ +int av_frame_apply_cropping(AVFrame *frame, int flags); + +/** + * @return a string identifying the side data type + */ +const char *av_frame_side_data_name(enum AVFrameSideDataType type); + +/** + * @} + */ + +#endif /* AVUTIL_FRAME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hash.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hash.h new file mode 100644 index 0000000..a20b893 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hash.h @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_hash_generic + * Generic hashing API + */ + +#ifndef AVUTIL_HASH_H +#define AVUTIL_HASH_H + +#include + +/** + * @defgroup lavu_hash Hash Functions + * @ingroup lavu_crypto + * Hash functions useful in multimedia. + * + * Hash functions are widely used in multimedia, from error checking and + * concealment to internal regression testing. libavutil has efficient + * implementations of a variety of hash functions that may be useful for + * FFmpeg and other multimedia applications. + * + * @{ + * + * @defgroup lavu_hash_generic Generic Hashing API + * An abstraction layer for all hash functions supported by libavutil. + * + * If your application needs to support a wide range of different hash + * functions, then the Generic Hashing API is for you. It provides a generic, + * reusable API for @ref lavu_hash "all hash functions" implemented in libavutil. + * If you just need to use one particular hash function, use the @ref lavu_hash + * "individual hash" directly. + * + * @section Sample Code + * + * A basic template for using the Generic Hashing API follows: + * + * @code + * struct AVHashContext *ctx = NULL; + * const char *hash_name = NULL; + * uint8_t *output_buf = NULL; + * + * // Select from a string returned by av_hash_names() + * hash_name = ...; + * + * // Allocate a hash context + * ret = av_hash_alloc(&ctx, hash_name); + * if (ret < 0) + * return ret; + * + * // Initialize the hash context + * av_hash_init(ctx); + * + * // Update the hash context with data + * while (data_left) { + * av_hash_update(ctx, data, size); + * } + * + * // Now we have no more data, so it is time to finalize the hash and get the + * // output. But we need to first allocate an output buffer. Note that you can + * // use any memory allocation function, including malloc(), not just + * // av_malloc(). + * output_buf = av_malloc(av_hash_get_size(ctx)); + * if (!output_buf) + * return AVERROR(ENOMEM); + * + * // Finalize the hash context. + * // You can use any of the av_hash_final*() functions provided, for other + * // output formats. If you do so, be sure to adjust the memory allocation + * // above. See the function documentation below for the exact amount of extra + * // memory needed. + * av_hash_final(ctx, output_buffer); + * + * // Free the context + * av_hash_freep(&ctx); + * @endcode + * + * @section Hash Function-Specific Information + * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be + * used. + * + * If the Murmur3 hash is selected, the default seed will be used. See @ref + * lavu_murmur3_seedinfo "Murmur3" for more information. + * + * @{ + */ + +/** + * @example ffhash.c + * This example is a simple command line application that takes one or more + * arguments. It demonstrates a typical use of the hashing API with allocation, + * initialization, updating, and finalizing. + */ + +struct AVHashContext; + +/** + * Allocate a hash context for the algorithm specified by name. + * + * @return >= 0 for success, a negative error code for failure + * + * @note The context is not initialized after a call to this function; you must + * call av_hash_init() to do so. + */ +int av_hash_alloc(struct AVHashContext **ctx, const char *name); + +/** + * Get the names of available hash algorithms. + * + * This function can be used to enumerate the algorithms. + * + * @param[in] i Index of the hash algorithm, starting from 0 + * @return Pointer to a static string or `NULL` if `i` is out of range + */ +const char *av_hash_names(int i); + +/** + * Get the name of the algorithm corresponding to the given hash context. + */ +const char *av_hash_get_name(const struct AVHashContext *ctx); + +/** + * Maximum value that av_hash_get_size() will currently return. + * + * You can use this if you absolutely want or need to use static allocation for + * the output buffer and are fine with not supporting hashes newly added to + * libavutil without recompilation. + * + * @warning + * Adding new hashes with larger sizes, and increasing the macro while doing + * so, will not be considered an ABI change. To prevent your code from + * overflowing a buffer, either dynamically allocate the output buffer with + * av_hash_get_size(), or limit your use of the Hashing API to hashes that are + * already in FFmpeg during the time of compilation. + */ +#define AV_HASH_MAX_SIZE 64 + +/** + * Get the size of the resulting hash value in bytes. + * + * The maximum value this function will currently return is available as macro + * #AV_HASH_MAX_SIZE. + * + * @param[in] ctx Hash context + * @return Size of the hash value in bytes + */ +int av_hash_get_size(const struct AVHashContext *ctx); + +/** + * Initialize or reset a hash context. + * + * @param[in,out] ctx Hash context + */ +void av_hash_init(struct AVHashContext *ctx); + +/** + * Update a hash context with additional data. + * + * @param[in,out] ctx Hash context + * @param[in] src Data to be added to the hash context + * @param[in] len Size of the additional data + */ +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); + +/** + * Finalize a hash context and compute the actual hash value. + * + * The minimum size of `dst` buffer is given by av_hash_get_size() or + * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * + * @see av_hash_final_bin() provides an alternative API + */ +void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); + +/** + * Finalize a hash context and store the actual hash value in a buffer. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * If `size` is smaller than the hash size (given by av_hash_get_size()), the + * hash is truncated; if size is larger, the buffer is padded with 0. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Number of bytes to write to `dst` + */ +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the hexadecimal representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the + * value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the string will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the Base64 representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is + * the value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Free hash context and set hash context pointer to `NULL`. + * + * @param[in,out] ctx Pointer to hash context + */ +void av_hash_freep(struct AVHashContext **ctx); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_HASH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hmac.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hmac.h new file mode 100644 index 0000000..576a0a4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hmac.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2012 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 + */ + +#ifndef AVUTIL_HMAC_H +#define AVUTIL_HMAC_H + +#include + +#include "version.h" +/** + * @defgroup lavu_hmac HMAC + * @ingroup lavu_crypto + * @{ + */ + +enum AVHMACType { + AV_HMAC_MD5, + AV_HMAC_SHA1, + AV_HMAC_SHA224, + AV_HMAC_SHA256, + AV_HMAC_SHA384 = 12, + AV_HMAC_SHA512, +}; + +typedef struct AVHMAC AVHMAC; + +/** + * Allocate an AVHMAC context. + * @param type The hash function used for the HMAC. + */ +AVHMAC *av_hmac_alloc(enum AVHMACType type); + +/** + * Free an AVHMAC context. + * @param ctx The context to free, may be NULL + */ +void av_hmac_free(AVHMAC *ctx); + +/** + * Initialize an AVHMAC context with an authentication key. + * @param ctx The HMAC context + * @param key The authentication key + * @param keylen The length of the key, in bytes + */ +void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen); + +/** + * Hash data with the HMAC. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + */ +void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len); + +/** + * Finish hashing and output the HMAC digest. + * @param ctx The HMAC context + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen); + +/** + * Hash an array of data with a key. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + * @param key The authentication key + * @param keylen The length of the key, in bytes + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len, + const uint8_t *key, unsigned int keylen, + uint8_t *out, unsigned int outlen); + +/** + * @} + */ + +#endif /* AVUTIL_HMAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext.h new file mode 100644 index 0000000..03334e2 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext.h @@ -0,0 +1,582 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_H +#define AVUTIL_HWCONTEXT_H + +#include "buffer.h" +#include "frame.h" +#include "log.h" +#include "pixfmt.h" + +enum AVHWDeviceType { + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, + AV_HWDEVICE_TYPE_VIDEOTOOLBOX, + AV_HWDEVICE_TYPE_NONE, + AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_DRM, +}; + +typedef struct AVHWDeviceInternal AVHWDeviceInternal; + +/** + * This struct aggregates all the (hardware/vendor-specific) "high-level" state, + * i.e. state that is not tied to a concrete processing configuration. + * E.g., in an API that supports hardware-accelerated encoding and decoding, + * this struct will (if possible) wrap the state that is common to both encoding + * and decoding and from which specific instances of encoders or decoders can be + * derived. + * + * This struct is reference-counted with the AVBuffer mechanism. The + * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field + * points to the actual AVHWDeviceContext. Further objects derived from + * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with + * specific properties) will hold an internal reference to it. After all the + * references are released, the AVHWDeviceContext itself will be freed, + * optionally invoking a user-specified callback for uninitializing the hardware + * state. + */ +typedef struct AVHWDeviceContext { + /** + * A class for logging. Set by av_hwdevice_ctx_alloc(). + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWDeviceInternal *internal; + + /** + * This field identifies the underlying API used for hardware access. + * + * This field is set when this struct is allocated and never changed + * afterwards. + */ + enum AVHWDeviceType type; + + /** + * The format-specific data, allocated and freed by libavutil along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwcontext_*.h) and filled as described in the + * documentation before calling av_hwdevice_ctx_init(). + * + * After calling av_hwdevice_ctx_init() this struct should not be modified + * by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwdevice_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + * + * @note when other objects (e.g an AVHWFramesContext) are derived from this + * struct, this callback will be invoked after all such child objects + * are fully uninitialized and their respective destructors invoked. + */ + void (*free)(struct AVHWDeviceContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; +} AVHWDeviceContext; + +typedef struct AVHWFramesInternal AVHWFramesInternal; + +/** + * This struct describes a set or pool of "hardware" frames (i.e. those with + * data not located in normal system memory). All the frames in the pool are + * assumed to be allocated in the same way and interchangeable. + * + * This struct is reference-counted with the AVBuffer mechanism and tied to a + * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor + * yields a reference, whose data field points to the actual AVHWFramesContext + * struct. + */ +typedef struct AVHWFramesContext { + /** + * A class for logging. + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWFramesInternal *internal; + + /** + * A reference to the parent AVHWDeviceContext. This reference is owned and + * managed by the enclosing AVHWFramesContext, but the caller may derive + * additional references from it. + */ + AVBufferRef *device_ref; + + /** + * The parent AVHWDeviceContext. This is simply a pointer to + * device_ref->data provided for convenience. + * + * Set by libavutil in av_hwframe_ctx_init(). + */ + AVHWDeviceContext *device_ctx; + + /** + * The format-specific data, allocated and freed automatically along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwframe_*.h) and filled as described in the + * documentation before calling av_hwframe_ctx_init(). + * + * After any frames using this context are created, the contents of this + * struct should not be modified by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + */ + void (*free)(struct AVHWFramesContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; + + /** + * A pool from which the frames are allocated by av_hwframe_get_buffer(). + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * The buffers returned by calling av_buffer_pool_get() on this pool must + * have the properties described in the documentation in the corresponding hw + * type's header (hwcontext_*.h). The pool will be freed strictly before + * this struct's free() callback is invoked. + * + * This field may be NULL, then libavutil will attempt to allocate a pool + * internally. Note that certain device types enforce pools allocated at + * fixed size (frame count), which cannot be extended dynamically. In such a + * case, initial_pool_size must be set appropriately. + */ + AVBufferPool *pool; + + /** + * Initial size of the frame pool. If a device type does not support + * dynamically resizing the pool, then this is also the maximum pool size. + * + * May be set by the caller before calling av_hwframe_ctx_init(). Must be + * set if pool is NULL and the device type does not support dynamic pools. + */ + int initial_pool_size; + + /** + * The pixel format identifying the underlying HW surface type. + * + * Must be a hwaccel format, i.e. the corresponding descriptor must have the + * AV_PIX_FMT_FLAG_HWACCEL flag set. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + enum AVPixelFormat format; + + /** + * The pixel format identifying the actual data layout of the hardware + * frames. + * + * Must be set by the caller before calling av_hwframe_ctx_init(). + * + * @note when the underlying API does not provide the exact data layout, but + * only the colorspace/bit depth, this field should be set to the fully + * planar version of that format (e.g. for 8-bit 420 YUV it should be + * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). + */ + enum AVPixelFormat sw_format; + + /** + * The allocated dimensions of the frames in this pool. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + int width, height; +} AVHWFramesContext; + +/** + * Look up an AVHWDeviceType by name. + * + * @param name String name of the device type (case-insensitive). + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); + +/** Get the string name of an AVHWDeviceType. + * + * @param type Type from enum AVHWDeviceType. + * @return Pointer to a static string containing the name, or NULL if the type + * is not valid. + */ +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); + +/** + * Iterate over supported device types. + * + * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type + * returned by this function in subsequent iterations. + * @return The next usable device type from enum AVHWDeviceType, or + * AV_HWDEVICE_TYPE_NONE if there are no more. + */ +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); + +/** + * Allocate an AVHWDeviceContext for a given hardware type. + * + * @param type the type of the hardware device to allocate. + * @return a reference to the newly created AVHWDeviceContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); + +/** + * Finalize the device context before use. This function must be called after + * the context is filled with all the required information and before it is + * used in any way. + * + * @param ref a reference to the AVHWDeviceContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwdevice_ctx_init(AVBufferRef *ref); + +/** + * Open a device of the specified type and create an AVHWDeviceContext for it. + * + * This is a convenience function intended to cover the simple cases. Callers + * who need to fine-tune device creation/management should open the device + * manually and then wrap it in an AVHWDeviceContext using + * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). + * + * The returned context is already initialized and ready for use, the caller + * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of + * the created AVHWDeviceContext are set by this function and should not be + * touched by the caller. + * + * @param device_ctx On success, a reference to the newly-created device context + * will be written here. The reference is owned by the caller + * and must be released with av_buffer_unref() when no longer + * needed. On failure, NULL will be written to this pointer. + * @param type The type of the device to create. + * @param device A type-specific string identifying the device to open. + * @param opts A dictionary of additional (type-specific) options to use in + * opening the device. The dictionary remains owned by the caller. + * @param flags currently unused + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, + const char *device, AVDictionary *opts, int flags); + +/** + * Create a new device of the specified type from an existing device. + * + * If the source device is a device of the target type or was originally + * derived from such a device (possibly through one or more intermediate + * devices of other types), then this will return a reference to the + * existing device of the same type as is requested. + * + * Otherwise, it will attempt to derive a new device from the given source + * device. If direct derivation to the new type is not implemented, it will + * attempt the same derivation from each ancestor of the source device in + * turn looking for an implemented derivation method. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, int flags); + + +/** + * Allocate an AVHWFramesContext tied to a given device context. + * + * @param device_ctx a reference to a AVHWDeviceContext. This function will make + * a new reference for internal use, the one passed to the + * function remains owned by the caller. + * @return a reference to the newly created AVHWFramesContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); + +/** + * Finalize the context before use. This function must be called after the + * context is filled with all the required information and before it is attached + * to any frames. + * + * @param ref a reference to the AVHWFramesContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_ctx_init(AVBufferRef *ref); + +/** + * Allocate a new frame attached to the given AVHWFramesContext. + * + * @param hwframe_ctx a reference to an AVHWFramesContext + * @param frame an empty (freshly allocated or unreffed) frame to be filled with + * newly allocated buffers. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); + +/** + * Copy data to or from a hw surface. At least one of dst/src must have an + * AVHWFramesContext attached. + * + * If src has an AVHWFramesContext attached, then the format of dst (if set) + * must use one of the formats returned by av_hwframe_transfer_get_formats(src, + * AV_HWFRAME_TRANSFER_DIRECTION_FROM). + * If dst has an AVHWFramesContext attached, then the format of src must use one + * of the formats returned by av_hwframe_transfer_get_formats(dst, + * AV_HWFRAME_TRANSFER_DIRECTION_TO) + * + * dst may be "clean" (i.e. with data/buf pointers unset), in which case the + * data buffers will be allocated by this function using av_frame_get_buffer(). + * If dst->format is set, then this format will be used, otherwise (when + * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. + * + * The two frames must have matching allocated dimensions (i.e. equal to + * AVHWFramesContext.width/height), since not all device types support + * transferring a sub-rectangle of the whole surface. The display dimensions + * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but + * also have to be equal for both frames. When the display dimensions are + * smaller than the allocated dimensions, the content of the padding in the + * destination frame is unspecified. + * + * @param dst the destination frame. dst is not touched on failure. + * @param src the source frame. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR error code on failure. + */ +int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); + +enum AVHWFrameTransferDirection { + /** + * Transfer the data from the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_FROM, + + /** + * Transfer the data to the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_TO, +}; + +/** + * Get a list of possible source or target formats usable in + * av_hwframe_transfer_data(). + * + * @param hwframe_ctx the frame context to obtain the information for + * @param dir the direction of the transfer + * @param formats the pointer to the output format list will be written here. + * The list is terminated with AV_PIX_FMT_NONE and must be freed + * by the caller when no longer needed using av_free(). + * If this function returns successfully, the format list will + * have at least one item (not counting the terminator). + * On failure, the contents of this pointer are unspecified. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats, int flags); + + +/** + * This struct describes the constraints on hardware frames attached to + * a given device with a hardware-specific configuration. This is returned + * by av_hwdevice_get_hwframe_constraints() and must be freed by + * av_hwframe_constraints_free() after use. + */ +typedef struct AVHWFramesConstraints { + /** + * A list of possible values for format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. This member will always be filled. + */ + enum AVPixelFormat *valid_hw_formats; + + /** + * A list of possible values for sw_format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is + * not known. + */ + enum AVPixelFormat *valid_sw_formats; + + /** + * The minimum size of frames in this hw_frames_ctx. + * (Zero if not known.) + */ + int min_width; + int min_height; + + /** + * The maximum size of frames in this hw_frames_ctx. + * (INT_MAX if not known / no limit.) + */ + int max_width; + int max_height; +} AVHWFramesConstraints; + +/** + * Allocate a HW-specific configuration structure for a given HW device. + * After use, the user must free all members as required by the specific + * hardware structure being used, then free the structure itself with + * av_free(). + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @return The newly created HW-specific configuration structure on + * success or NULL on failure. + */ +void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); + +/** + * Get the constraints on HW frames given a device and the HW-specific + * configuration to be used with that device. If no HW-specific + * configuration is provided, returns the maximum possible capabilities + * of the device. + * + * @param ref a reference to the associated AVHWDeviceContext. + * @param hwconfig a filled HW-specific configuration structure, or NULL + * to return the maximum possible capabilities of the device. + * @return AVHWFramesConstraints structure describing the constraints + * on the device, or NULL if not available. + */ +AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, + const void *hwconfig); + +/** + * Free an AVHWFrameConstraints structure. + * + * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. + */ +void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); + + +/** + * Flags to apply to frame mappings. + */ +enum { + /** + * The mapping must be readable. + */ + AV_HWFRAME_MAP_READ = 1 << 0, + /** + * The mapping must be writeable. + */ + AV_HWFRAME_MAP_WRITE = 1 << 1, + /** + * The mapped frame will be overwritten completely in subsequent + * operations, so the current frame data need not be loaded. Any values + * which are not overwritten are unspecified. + */ + AV_HWFRAME_MAP_OVERWRITE = 1 << 2, + /** + * The mapping must be direct. That is, there must not be any copying in + * the map or unmap steps. Note that performance of direct mappings may + * be much lower than normal memory. + */ + AV_HWFRAME_MAP_DIRECT = 1 << 3, +}; + +/** + * Map a hardware frame. + * + * This has a number of different possible effects, depending on the format + * and origin of the src and dst frames. On input, src should be a usable + * frame with valid buffers and dst should be blank (typically as just created + * by av_frame_alloc()). src should have an associated hwframe context, and + * dst may optionally have a format and associated hwframe context. + * + * If src was created by mapping a frame from the hwframe context of dst, + * then this function undoes the mapping - dst is replaced by a reference to + * the frame that src was originally mapped from. + * + * If both src and dst have an associated hwframe context, then this function + * attempts to map the src frame from its hardware context to that of dst and + * then fill dst with appropriate data to be usable there. This will only be + * possible if the hwframe contexts and associated devices are compatible - + * given compatible devices, av_hwframe_ctx_create_derived() can be used to + * create a hwframe context for dst in which mapping should be possible. + * + * If src has a hwframe context but dst does not, then the src frame is + * mapped to normal memory and should thereafter be usable as a normal frame. + * If the format is set on dst, then the mapping will attempt to create dst + * with that format and fail if it is not possible. If format is unset (is + * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate + * format to use is (probably the sw_format of the src hwframe context). + * + * A return value of AVERROR(ENOSYS) indicates that the mapping is not + * possible with the given arguments and hwframe setup, while other return + * values indicate that it failed somehow. + * + * @param dst Destination frame, to contain the mapping. + * @param src Source frame, to be mapped. + * @param flags Some combination of AV_HWFRAME_MAP_* flags. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); + + +/** + * Create and initialise an AVHWFramesContext as a mapping of another existing + * AVHWFramesContext on a different device. + * + * av_hwframe_ctx_init() should not be called after this. + * + * @param derived_frame_ctx On success, a reference to the newly created + * AVHWFramesContext. + * @param derived_device_ctx A reference to the device to create the new + * AVHWFramesContext on. + * @param source_frame_ctx A reference to an existing AVHWFramesContext + * which will be mapped to the derived context. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, + enum AVPixelFormat format, + AVBufferRef *derived_device_ctx, + AVBufferRef *source_frame_ctx, + int flags); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_cuda.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_cuda.h new file mode 100644 index 0000000..12dae84 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_cuda.h @@ -0,0 +1,51 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_CUDA_H +#define AVUTIL_HWCONTEXT_CUDA_H + +#ifndef CUDA_VERSION +#include +#endif + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_CUDA. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CUdeviceptr. + */ + +typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal; + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; + AVCUDADeviceContextInternal *internal; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_d3d11va.h new file mode 100644 index 0000000..98db7ce --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_d3d11va.h @@ -0,0 +1,168 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_D3D11VA_H +#define AVUTIL_HWCONTEXT_D3D11VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA. + * + * The default pool implementation will be fixed-size if initial_pool_size is + * set (and allocate elements from an array texture). Otherwise it will allocate + * individual textures. Be aware that decoding requires a single array texture. + * + * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to + * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for + * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. + */ + +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVD3D11VADeviceContext { + /** + * Device used for texture creation and access. This can also be used to + * set the libavcodec decoding device. + * + * Must be set by the user. This is the only mandatory field - the other + * device context fields are set from this and are available for convenience. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11Device *device; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11DeviceContext *device_context; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoDevice *video_device; + + /** + * If unset, this will be set from the device_context field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoContext *video_context; + + /** + * Callbacks for locking. They protect accesses to device_context and + * video_context calls. They also protect access to the internal staging + * texture (for av_hwframe_transfer_data() calls). They do NOT protect + * access to hwcontext or decoder state in general. + * + * If unset on init, the hwcontext implementation will set them to use an + * internal mutex. + * + * The underlying lock must be recursive. lock_ctx is for free use by the + * locking implementation. + */ + void (*lock)(void *lock_ctx); + void (*unlock)(void *lock_ctx); + void *lock_ctx; +} AVD3D11VADeviceContext; + +/** + * D3D11 frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + * + * This has no use outside of custom allocation, and AVFrame AVBufferRef do not + * necessarily point to an instance of this struct. + */ +typedef struct AVD3D11FrameDescriptor { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + * + * Normally stored in AVFrame.data[0]. + */ + ID3D11Texture2D *texture; + + /** + * The index into the array texture element representing the frame, or 0 + * if the texture is not an array texture. + * + * Normally stored in AVFrame.data[1] (cast from intptr_t). + */ + intptr_t index; +} AVD3D11FrameDescriptor; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVD3D11VAFramesContext { + /** + * The canonical texture used for pool allocation. If this is set to NULL + * on init, the hwframes implementation will allocate and set an array + * texture if initial_pool_size > 0. + * + * The only situation when the API user should set this is: + * - the user wants to do manual pool allocation (setting + * AVHWFramesContext.pool), instead of letting AVHWFramesContext + * allocate the pool + * - of an array texture + * - and wants it to use it for decoding + * - this has to be done before calling av_hwframe_ctx_init() + * + * Deallocating the AVHWFramesContext will always release this interface, + * and it does not matter whether it was user-allocated. + * + * This is in particular used by the libavcodec D3D11VA hwaccel, which + * requires a single array texture. It will create ID3D11VideoDecoderOutputView + * objects for each array texture element on decoder initialization. + */ + ID3D11Texture2D *texture; + + /** + * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must + * at least set D3D11_BIND_DECODER if the frames context is to be used for + * video decoding. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT BindFlags; + + /** + * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT MiscFlags; +} AVD3D11VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_drm.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_drm.h new file mode 100644 index 0000000..2e22545 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_drm.h @@ -0,0 +1,166 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_DRM_H +#define AVUTIL_HWCONTEXT_DRM_H + +#include +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_DRM. + * + * Internal frame allocation is not currently supported - all frames + * must be allocated by the user. Thus AVHWFramesContext is always + * NULL, though this may change if support for frame allocation is + * added in future. + */ + +enum { + /** + * The maximum number of layers/planes in a DRM frame. + */ + AV_DRM_MAX_PLANES = 4 +}; + +/** + * DRM object descriptor. + * + * Describes a single DRM object, addressing it as a PRIME file + * descriptor. + */ +typedef struct AVDRMObjectDescriptor { + /** + * DRM PRIME fd for the object. + */ + int fd; + /** + * Total size of the object. + * + * (This includes any parts not which do not contain image data.) + */ + size_t size; + /** + * Format modifier applied to the object (DRM_FORMAT_MOD_*). + */ + uint64_t format_modifier; +} AVDRMObjectDescriptor; + +/** + * DRM plane descriptor. + * + * Describes a single plane of a layer, which is contained within + * a single object. + */ +typedef struct AVDRMPlaneDescriptor { + /** + * Index of the object containing this plane in the objects + * array of the enclosing frame descriptor. + */ + int object_index; + /** + * Offset within that object of this plane. + */ + ptrdiff_t offset; + /** + * Pitch (linesize) of this plane. + */ + ptrdiff_t pitch; +} AVDRMPlaneDescriptor; + +/** + * DRM layer descriptor. + * + * Describes a single layer within a frame. This has the structure + * defined by its format, and will contain one or more planes. + */ +typedef struct AVDRMLayerDescriptor { + /** + * Format of the layer (DRM_FORMAT_*). + */ + uint32_t format; + /** + * Number of planes in the layer. + * + * This must match the number of planes required by format. + */ + int nb_planes; + /** + * Array of planes in this layer. + */ + AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; +} AVDRMLayerDescriptor; + +/** + * DRM frame descriptor. + * + * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. + * It is also used by user-allocated frame pools - allocating in + * AVHWFramesContext.pool must return AVBufferRefs which contain + * an object of this type. + * + * The fields of this structure should be set such it can be + * imported directly by EGL using the EGL_EXT_image_dma_buf_import + * and EGL_EXT_image_dma_buf_import_modifiers extensions. + * (Note that the exact layout of a particular format may vary between + * platforms - we only specify that the same platform should be able + * to import it.) + * + * The total number of planes must not exceed AV_DRM_MAX_PLANES, and + * the order of the planes by increasing layer index followed by + * increasing plane index must be the same as the order which would + * be used for the data pointers in the equivalent software format. + */ +typedef struct AVDRMFrameDescriptor { + /** + * Number of DRM objects making up this frame. + */ + int nb_objects; + /** + * Array of objects making up the frame. + */ + AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; + /** + * Number of layers in the frame. + */ + int nb_layers; + /** + * Array of layers in the frame. + */ + AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; +} AVDRMFrameDescriptor; + +/** + * DRM device. + * + * Allocated as AVHWDeviceContext.hwctx. + */ +typedef struct AVDRMDeviceContext { + /** + * File descriptor of DRM device. + * + * This is used as the device to create frames on, and may also be + * used in some derivation and mapping operations. + * + * If no device is required, set to -1. + */ + int fd; +} AVDRMDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_DRM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_dxva2.h new file mode 100644 index 0000000..e1b79bc --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_dxva2.h @@ -0,0 +1,75 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_DXVA2_H +#define AVUTIL_HWCONTEXT_DXVA2_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_DXVA2. + * + * Only fixed-size pools are supported. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a pointer to IDirect3DSurface9. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVDXVA2DeviceContext { + IDirect3DDeviceManager9 *devmgr; +} AVDXVA2DeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVDXVA2FramesContext { + /** + * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or + * DXVA2_VideoDecoderRenderTarget). Must be set by the caller. + */ + DWORD surface_type; + + /** + * The surface pool. When an external pool is not provided by the caller, + * this will be managed (allocated and filled on init, freed on uninit) by + * libavutil. + */ + IDirect3DSurface9 **surfaces; + int nb_surfaces; + + /** + * Certain drivers require the decoder to be destroyed before the surfaces. + * To allow internally managed pools to work properly in such cases, this + * field is provided. + * + * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on + * it just before the internal surface pool is freed. + * + * This is for convenience only. Some code uses other methods to manage the + * decoder reference. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_qsv.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_qsv.h new file mode 100644 index 0000000..b98d611 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_qsv.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_QSV_H +#define AVUTIL_HWCONTEXT_QSV_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_QSV. + * + * This API does not support dynamic frame pools. AVHWFramesContext.pool must + * contain AVBufferRefs whose data pointer points to an mfxFrameSurface1 struct. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVQSVDeviceContext { + mfxSession session; +} AVQSVDeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVQSVFramesContext { + mfxFrameSurface1 *surfaces; + int nb_surfaces; + + /** + * A combination of MFX_MEMTYPE_* describing the frame pool. + */ + int frame_type; +} AVQSVFramesContext; + +#endif /* AVUTIL_HWCONTEXT_QSV_H */ + diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vaapi.h new file mode 100644 index 0000000..0b2e071 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vaapi.h @@ -0,0 +1,117 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VAAPI_H +#define AVUTIL_HWCONTEXT_VAAPI_H + +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VAAPI. + * + * Dynamic frame pools are supported, but note that any pool used as a render + * target is required to be of fixed size in order to be be usable as an + * argument to vaCreateContext(). + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a VASurfaceID. + */ + +enum { + /** + * The quirks field has been set by the user and should not be detected + * automatically by av_hwdevice_ctx_init(). + */ + AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), + + /** + * The driver does not support the VASurfaceAttribMemoryType attribute, + * so the surface allocation code will not try to use it. + */ + AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), + + /** + * The driver does not support surface attributes at all. + * The surface allocation code will never pass them to surface allocation, + * and the results of the vaQuerySurfaceAttributes() call will be faked. + */ + AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), +}; + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers, unless the + * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user + * may need to refer to this field when performing any later + * operations using VAAPI with the same VADisplay. + */ + unsigned int driver_quirks; +} AVVAAPIDeviceContext; + +/** + * VAAPI-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVVAAPIFramesContext { + /** + * Set by the user to apply surface attributes to all surfaces in + * the frame pool. If null, default settings are used. + */ + VASurfaceAttrib *attributes; + int nb_attributes; + /** + * The surfaces IDs of all surfaces in the pool after creation. + * Only valid if AVHWFramesContext.initial_pool_size was positive. + * These are intended to be used as the render_targets arguments to + * vaCreateContext(). + */ + VASurfaceID *surface_ids; + int nb_surfaces; +} AVVAAPIFramesContext; + +/** + * VAAPI hardware pipeline configuration details. + * + * Allocated with av_hwdevice_hwconfig_alloc(). + */ +typedef struct AVVAAPIHWConfig { + /** + * ID of a VAAPI pipeline configuration. + */ + VAConfigID config_id; +} AVVAAPIHWConfig; + +#endif /* AVUTIL_HWCONTEXT_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vdpau.h new file mode 100644 index 0000000..1b7ea1e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_vdpau.h @@ -0,0 +1,44 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VDPAU_H +#define AVUTIL_HWCONTEXT_VDPAU_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VDPAU. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a VdpVideoSurface. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVDPAUDeviceContext { + VdpDevice device; + VdpGetProcAddress *get_proc_address; +} AVVDPAUDeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_videotoolbox.h new file mode 100644 index 0000000..380918d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/hwcontext_videotoolbox.h @@ -0,0 +1,54 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H +#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H + +#include + +#include + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX. + * + * This API currently does not support frame allocation, as the raw VideoToolbox + * API does allocation, and FFmpeg itself never has the need to allocate frames. + * + * If the API user sets a custom pool, AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef. + * + * Currently AVHWDeviceContext.hwctx and AVHWFramesContext.hwctx are always + * NULL. + */ + +/** + * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. + * Returns AV_PIX_FMT_NONE if no known equivalent was found. + */ +enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); + +/** + * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format. + * Returns 0 if no known equivalent was found. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); + +#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/imgutils.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/imgutils.h new file mode 100644 index 0000000..5b790ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/imgutils.h @@ -0,0 +1,277 @@ +/* + * 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 + */ + +#ifndef AVUTIL_IMGUTILS_H +#define AVUTIL_IMGUTILS_H + +/** + * @file + * misc image utilities + * + * @addtogroup lavu_picture + * @{ + */ + +#include "avutil.h" +#include "pixdesc.h" +#include "rational.h" + +/** + * Compute the max pixel step for each plane of an image with a + * format described by pixdesc. + * + * The pixel step is the distance in bytes between the first byte of + * the group of bytes which describe a pixel component and the first + * byte of the successive group in the same plane for the same + * component. + * + * @param max_pixsteps an array which is filled with the max pixel step + * for each plane. Since a plane may contain different pixel + * components, the computed max_pixsteps[plane] is relative to the + * component in the plane with the max pixel step. + * @param max_pixstep_comps an array which is filled with the component + * for each plane which has the max pixel step. May be NULL. + */ +void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], + const AVPixFmtDescriptor *pixdesc); + +/** + * Compute the size of an image line with format pix_fmt and width + * width for the plane plane. + * + * @return the computed size in bytes + */ +int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane); + +/** + * Fill plane linesizes for an image with pixel format pix_fmt and + * width width. + * + * @param linesizes array to be filled with the linesize for each plane + * @return >= 0 in case of success, a negative error code otherwise + */ +int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width); + +/** + * Fill plane data pointers for an image with pixel format pix_fmt and + * height height. + * + * @param data pointers array to be filled with the pointer for each image plane + * @param ptr the pointer to a buffer which will contain the image + * @param linesizes the array containing the linesize for each + * plane, should be filled by av_image_fill_linesizes() + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, + uint8_t *ptr, const int linesizes[4]); + +/** + * Allocate an image with size w and h and pixel format pix_fmt, and + * fill pointers and linesizes accordingly. + * The allocated image buffer has to be freed by using + * av_freep(&pointers[0]). + * + * @param align the value to use for buffer size alignment + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum AVPixelFormat pix_fmt, int align); + +/** + * Copy image plane from src to dst. + * That is, copy "height" number of lines of "bytewidth" bytes each. + * The first byte of each successive line is separated by *_linesize + * bytes. + * + * bytewidth must be contained by both absolute values of dst_linesize + * and src_linesize, otherwise the function behavior is undefined. + * + * @param dst_linesize linesize for the image plane in dst + * @param src_linesize linesize for the image plane in src + */ +void av_image_copy_plane(uint8_t *dst, int dst_linesize, + const uint8_t *src, int src_linesize, + int bytewidth, int height); + +/** + * Copy image in src_data to dst_data. + * + * @param dst_linesizes linesizes for the image in dst_data + * @param src_linesizes linesizes for the image in src_data + */ +void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], + const uint8_t *src_data[4], const int src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy(). + * + * The data pointers and the linesizes must be aligned to the maximum required + * by the CPU architecture. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy(). + * @note On x86, the linesizes currently need to be aligned to the cacheline + * size (i.e. 64) to get improved performance. + */ +void av_image_copy_uc_from(uint8_t *dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t *src_data[4], const ptrdiff_t src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Setup the data pointers and linesizes based on the specified image + * parameters and the provided array. + * + * The fields of the given image are filled in by using the src + * address which points to the image data buffer. Depending on the + * specified pixel format, one or multiple image data pointers and + * line sizes will be set. If a planar format is specified, several + * pointers will be set pointing to the different picture planes and + * the line sizes of the different planes will be stored in the + * lines_sizes array. Call with src == NULL to get the required + * size for the src buffer. + * + * To allocate the buffer and fill in the dst_data and dst_linesize in + * one call, use av_image_alloc(). + * + * @param dst_data data pointers to be filled in + * @param dst_linesize linesizes for the image in dst_data to be filled in + * @param src buffer which will contain or contains the actual image data, can be NULL + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the value used in src for linesize alignment + * @return the size in bytes required for src, a negative error code + * in case of failure + */ +int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], + const uint8_t *src, + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Return the size in bytes of the amount of data required to store an + * image with the given parameters. + * + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the assumed linesize alignment + * @return the buffer size in bytes, a negative error code in case of failure + */ +int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Copy image data from an image into a buffer. + * + * av_image_get_buffer_size() can be used to compute the required size + * for the buffer to fill. + * + * @param dst a buffer into which picture data will be copied + * @param dst_size the size in bytes of dst + * @param src_data pointers containing the source image data + * @param src_linesize linesizes for the image in src_data + * @param pix_fmt the pixel format of the source image + * @param width the width of the source image in pixels + * @param height the height of the source image in pixels + * @param align the assumed linesize alignment for dst + * @return the number of bytes written to dst, or a negative value + * (error code) on error + */ +int av_image_copy_to_buffer(uint8_t *dst, int dst_size, + const uint8_t * const src_data[4], const int src_linesize[4], + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of the image can be addressed with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of a plane of an image with the specified pix_fmt can be addressed + * with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param max_pixels the maximum number of pixels the user wants to accept + * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown. + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx); + +/** + * Check if the given sample aspect ratio of an image is valid. + * + * It is considered invalid if the denominator is 0 or if applying the ratio + * to the image size would make the smaller dimension less than 1. If the + * sar numerator is 0, it is considered unknown and will return as valid. + * + * @param w width of the image + * @param h height of the image + * @param sar sample aspect ratio of the image + * @return 0 if valid, a negative AVERROR code otherwise + */ +int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); + +/** + * Overwrite the image data with black. This is suitable for filling a + * sub-rectangle of an image, meaning the padding between the right most pixel + * and the left most pixel on the next line will not be overwritten. For some + * formats, the image size might be rounded up due to inherent alignment. + * + * If the pixel format has alpha, the alpha is cleared to opaque. + * + * This can return an error if the pixel format is not supported. Normally, all + * non-hwaccel pixel formats should be supported. + * + * Passing NULL for dst_data is allowed. Then the function returns whether the + * operation would have succeeded. (It can return an error if the pix_fmt is + * not supported.) + * + * @param dst_data data pointers to destination image + * @param dst_linesize linesizes for the destination image + * @param pix_fmt the pixel format of the image + * @param range the color range of the image (important for colorspaces such as YUV) + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return 0 if the image data was cleared, a negative AVERROR code otherwise + */ +int av_image_fill_black(uint8_t *dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, enum AVColorRange range, + int width, int height); + +/** + * @} + */ + + +#endif /* AVUTIL_IMGUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intfloat.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intfloat.h new file mode 100644 index 0000000..fe3d7ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intfloat.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_INTFLOAT_H +#define AVUTIL_INTFLOAT_H + +#include +#include "attributes.h" + +union av_intfloat32 { + uint32_t i; + float f; +}; + +union av_intfloat64 { + uint64_t i; + double f; +}; + +/** + * Reinterpret a 32-bit integer as a float. + */ +static av_always_inline float av_int2float(uint32_t i) +{ + union av_intfloat32 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a float as a 32-bit integer. + */ +static av_always_inline uint32_t av_float2int(float f) +{ + union av_intfloat32 v; + v.f = f; + return v.i; +} + +/** + * Reinterpret a 64-bit integer as a double. + */ +static av_always_inline double av_int2double(uint64_t i) +{ + union av_intfloat64 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a double as a 64-bit integer. + */ +static av_always_inline uint64_t av_double2int(double f) +{ + union av_intfloat64 v; + v.f = f; + return v.i; +} + +#endif /* AVUTIL_INTFLOAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intreadwrite.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intreadwrite.h new file mode 100644 index 0000000..d54d4b9 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/intreadwrite.h @@ -0,0 +1,634 @@ +/* + * 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 + */ + +#ifndef AVUTIL_INTREADWRITE_H +#define AVUTIL_INTREADWRITE_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" +#include "bswap.h" + +typedef union { + uint64_t u64; + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8 [8]; + double f64; + float f32[2]; +} av_alias av_alias64; + +typedef union { + uint32_t u32; + uint16_t u16[2]; + uint8_t u8 [4]; + float f32; +} av_alias av_alias32; + +typedef union { + uint16_t u16; + uint8_t u8 [2]; +} av_alias av_alias16; + +/* + * Arch-specific headers can provide any combination of + * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. + * + * R/W means read/write, B/L/N means big/little/native endianness. + * The following macros require aligned access, compared to their + * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A. + * Incorrect usage may range from abysmal performance to crash + * depending on the platform. + * + * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U. + */ + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/intreadwrite.h" +#elif ARCH_AVR32 +# include "avr32/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" +#elif ARCH_PPC +# include "ppc/intreadwrite.h" +#elif ARCH_TOMI +# include "tomi/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +/* + * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. + */ + +#if AV_HAVE_BIGENDIAN + +# if defined(AV_RN16) && !defined(AV_RB16) +# define AV_RB16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RB16) +# define AV_RN16(p) AV_RB16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WB16) +# define AV_WB16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WB16) +# define AV_WN16(p, v) AV_WB16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RB24) +# define AV_RB24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RB24) +# define AV_RN24(p) AV_RB24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WB24) +# define AV_WB24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WB24) +# define AV_WN24(p, v) AV_WB24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RB32) +# define AV_RB32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RB32) +# define AV_RN32(p) AV_RB32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WB32) +# define AV_WB32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WB32) +# define AV_WN32(p, v) AV_WB32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RB48) +# define AV_RB48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RB48) +# define AV_RN48(p) AV_RB48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WB48) +# define AV_WB48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WB48) +# define AV_WN48(p, v) AV_WB48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RB64) +# define AV_RB64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RB64) +# define AV_RN64(p) AV_RB64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WB64) +# define AV_WB64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WB64) +# define AV_WN64(p, v) AV_WB64(p, v) +# endif + +#else /* AV_HAVE_BIGENDIAN */ + +# if defined(AV_RN16) && !defined(AV_RL16) +# define AV_RL16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RL16) +# define AV_RN16(p) AV_RL16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WL16) +# define AV_WL16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WL16) +# define AV_WN16(p, v) AV_WL16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RL24) +# define AV_RL24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RL24) +# define AV_RN24(p) AV_RL24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WL24) +# define AV_WL24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WL24) +# define AV_WN24(p, v) AV_WL24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RL32) +# define AV_RL32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RL32) +# define AV_RN32(p) AV_RL32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WL32) +# define AV_WL32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WL32) +# define AV_WN32(p, v) AV_WL32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RL48) +# define AV_RL48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RL48) +# define AV_RN48(p) AV_RL48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WL48) +# define AV_WL48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WL48) +# define AV_WN48(p, v) AV_WL48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RL64) +# define AV_RL64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RL64) +# define AV_RN64(p) AV_RL64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WL64) +# define AV_WL64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WL64) +# define AV_WN64(p, v) AV_WL64(p, v) +# endif + +#endif /* !AV_HAVE_BIGENDIAN */ + +/* + * Define AV_[RW]N helper macros to simplify definitions not provided + * by per-arch headers. + */ + +#if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__) + +union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; +union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; +union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; + +# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) +# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) + +#elif defined(__DECC) + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64)) && AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) +# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#else + +#ifndef AV_RB16 +# define AV_RB16(x) \ + ((((const uint8_t*)(x))[0] << 8) | \ + ((const uint8_t*)(x))[1]) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RL16 +# define AV_RL16(x) \ + ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RB32 +# define AV_RB32(x) \ + (((uint32_t)((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RL32 +# define AV_RL32(x) \ + (((uint32_t)((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RB64 +# define AV_RB64(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ + ((uint8_t*)(p))[5] = (d)>>16; \ + ((uint8_t*)(p))[4] = (d)>>24; \ + ((uint8_t*)(p))[3] = (d)>>32; \ + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; \ + } while(0) +#endif + +#ifndef AV_RL64 +# define AV_RL64(x) \ + (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; \ + } while(0) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RN(s, p) AV_RB##s(p) +# define AV_WN(s, p, v) AV_WB##s(p, v) +#else +# define AV_RN(s, p) AV_RL##s(p) +# define AV_WN(s, p, v) AV_WL##s(p, v) +#endif + +#endif /* HAVE_FAST_UNALIGNED */ + +#ifndef AV_RN16 +# define AV_RN16(p) AV_RN(16, p) +#endif + +#ifndef AV_RN32 +# define AV_RN32(p) AV_RN(32, p) +#endif + +#ifndef AV_RN64 +# define AV_RN64(p) AV_RN(64, p) +#endif + +#ifndef AV_WN16 +# define AV_WN16(p, v) AV_WN(16, p, v) +#endif + +#ifndef AV_WN32 +# define AV_WN32(p, v) AV_WN(32, p, v) +#endif + +#ifndef AV_WN64 +# define AV_WN64(p, v) AV_WN(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RB(s, p) AV_RN##s(p) +# define AV_WB(s, p, v) AV_WN##s(p, v) +# define AV_RL(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) +#else +# define AV_RB(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) +# define AV_RL(s, p) AV_RN##s(p) +# define AV_WL(s, p, v) AV_WN##s(p, v) +#endif + +#define AV_RB8(x) (((const uint8_t*)(x))[0]) +#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) + +#define AV_RL8(x) AV_RB8(x) +#define AV_WL8(p, d) AV_WB8(p, d) + +#ifndef AV_RB16 +# define AV_RB16(p) AV_RB(16, p) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, v) AV_WB(16, p, v) +#endif + +#ifndef AV_RL16 +# define AV_RL16(p) AV_RL(16, p) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, v) AV_WL(16, p, v) +#endif + +#ifndef AV_RB32 +# define AV_RB32(p) AV_RB(32, p) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, v) AV_WB(32, p, v) +#endif + +#ifndef AV_RL32 +# define AV_RL32(p) AV_RL(32, p) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, v) AV_WL(32, p, v) +#endif + +#ifndef AV_RB64 +# define AV_RB64(p) AV_RB(64, p) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, v) AV_WB(64, p, v) +#endif + +#ifndef AV_RL64 +# define AV_RL64(p) AV_RL(64, p) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, v) AV_WL(64, p, v) +#endif + +#ifndef AV_RB24 +# define AV_RB24(x) \ + ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[2]) +#endif +#ifndef AV_WB24 +# define AV_WB24(p, d) do { \ + ((uint8_t*)(p))[2] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[0] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RL24 +# define AV_RL24(x) \ + ((((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL24 +# define AV_WL24(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RB48 +# define AV_RB48(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 8) | \ + (uint64_t)((const uint8_t*)(x))[5]) +#endif +#ifndef AV_WB48 +# define AV_WB48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[5] = (d); \ + ((uint8_t*)(p))[4] = (d)>>8; \ + ((uint8_t*)(p))[3] = (d)>>16; \ + ((uint8_t*)(p))[2] = (d)>>24; \ + ((uint8_t*)(p))[1] = (d)>>32; \ + ((uint8_t*)(p))[0] = (d)>>40; \ + } while(0) +#endif + +#ifndef AV_RL48 +# define AV_RL48(x) \ + (((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL48 +# define AV_WL48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + } while(0) +#endif + +/* + * The AV_[RW]NA macros access naturally aligned data + * in a type-safe way. + */ + +#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s) +#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#ifndef AV_RN16A +# define AV_RN16A(p) AV_RNA(16, p) +#endif + +#ifndef AV_RN32A +# define AV_RN32A(p) AV_RNA(32, p) +#endif + +#ifndef AV_RN64A +# define AV_RN64A(p) AV_RNA(64, p) +#endif + +#ifndef AV_WN16A +# define AV_WN16A(p, v) AV_WNA(16, p, v) +#endif + +#ifndef AV_WN32A +# define AV_WN32A(p, v) AV_WNA(32, p, v) +#endif + +#ifndef AV_WN64A +# define AV_WN64A(p, v) AV_WNA(64, p, v) +#endif + +/* + * The AV_COPYxxU macros are suitable for copying data to/from unaligned + * memory locations. + */ + +#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); + +#ifndef AV_COPY16U +# define AV_COPY16U(d, s) AV_COPYU(16, d, s) +#endif + +#ifndef AV_COPY32U +# define AV_COPY32U(d, s) AV_COPYU(32, d, s) +#endif + +#ifndef AV_COPY64U +# define AV_COPY64U(d, s) AV_COPYU(64, d, s) +#endif + +#ifndef AV_COPY128U +# define AV_COPY128U(d, s) \ + do { \ + AV_COPY64U(d, s); \ + AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \ + } while(0) +#endif + +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) \ + (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) + +#ifndef AV_COPY16 +# define AV_COPY16(d, s) AV_COPY(16, d, s) +#endif + +#ifndef AV_COPY32 +# define AV_COPY32(d, s) AV_COPY(32, d, s) +#endif + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) + +#ifndef AV_ZERO16 +# define AV_ZERO16(d) AV_ZERO(16, d) +#endif + +#ifndef AV_ZERO32 +# define AV_ZERO32(d) AV_ZERO(32, d) +#endif + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + +#endif /* AVUTIL_INTREADWRITE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lfg.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lfg.h new file mode 100644 index 0000000..03f779a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lfg.h @@ -0,0 +1,71 @@ +/* + * Lagged Fibonacci PRNG + * Copyright (c) 2008 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LFG_H +#define AVUTIL_LFG_H + +#include + +typedef struct AVLFG { + unsigned int state[64]; + int index; +} AVLFG; + +void av_lfg_init(AVLFG *c, unsigned int seed); + +/** + * Seed the state of the ALFG using binary data. + * + * Return value: 0 on success, negative value (AVERROR) on failure. + */ +int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); + +/** + * Get the next random unsigned 32-bit number using an ALFG. + * + * Please also consider a simple LCG like state= state*1664525+1013904223, + * it may be good enough and faster for your specific use case. + */ +static inline unsigned int av_lfg_get(AVLFG *c){ + c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + return c->state[c->index++ & 63]; +} + +/** + * Get the next random unsigned 32-bit number using a MLFG. + * + * Please also consider av_lfg_get() above, it is faster. + */ +static inline unsigned int av_mlfg_get(AVLFG *c){ + unsigned int a= c->state[(c->index-55) & 63]; + unsigned int b= c->state[(c->index-24) & 63]; + return c->state[c->index++ & 63] = 2*a*b+a+b; +} + +/** + * Get the next two numbers generated by a Box-Muller Gaussian + * generator using the random numbers issued by lfg. + * + * @param out array where the two generated numbers are placed + */ +void av_bmg_get(AVLFG *lfg, double out[2]); + +#endif /* AVUTIL_LFG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/log.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/log.h new file mode 100644 index 0000000..f0a5738 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/log.h @@ -0,0 +1,376 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LOG_H +#define AVUTIL_LOG_H + +#include +#include "avutil.h" +#include "attributes.h" +#include "version.h" + +typedef enum { + AV_CLASS_CATEGORY_NA = 0, + AV_CLASS_CATEGORY_INPUT, + AV_CLASS_CATEGORY_OUTPUT, + AV_CLASS_CATEGORY_MUXER, + AV_CLASS_CATEGORY_DEMUXER, + AV_CLASS_CATEGORY_ENCODER, + AV_CLASS_CATEGORY_DECODER, + AV_CLASS_CATEGORY_FILTER, + AV_CLASS_CATEGORY_BITSTREAM_FILTER, + AV_CLASS_CATEGORY_SWSCALER, + AV_CLASS_CATEGORY_SWRESAMPLER, + AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, + AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT, + AV_CLASS_CATEGORY_NB ///< not part of ABI/API +}AVClassCategory; + +#define AV_IS_INPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) + +#define AV_IS_OUTPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) + +struct AVOptionRanges; + +/** + * Describe the class of an AVClass context structure. That is an + * arbitrary struct of which the first field is a pointer to an + * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). + */ +typedef struct AVClass { + /** + * The name of the class; usually it is the same name as the + * context structure type to which the AVClass is associated. + */ + const char* class_name; + + /** + * A pointer to a function which returns the name of a context + * instance ctx associated with the class. + */ + const char* (*item_name)(void* ctx); + + /** + * a pointer to the first option specified in the class if any or NULL + * + * @see av_set_default_options() + */ + const struct AVOption *option; + + /** + * LIBAVUTIL_VERSION with which this structure was created. + * This is used to allow fields to be added without requiring major + * version bumps everywhere. + */ + + int version; + + /** + * Offset in the structure where log_level_offset is stored. + * 0 means there is no such variable + */ + int log_level_offset_offset; + + /** + * Offset in the structure where a pointer to the parent context for + * logging is stored. For example a decoder could pass its AVCodecContext + * to eval as such a parent context, which an av_log() implementation + * could then leverage to display the parent context. + * The offset can be NULL. + */ + int parent_log_context_offset; + + /** + * Return next AVOptions-enabled child or NULL + */ + void* (*child_next)(void *obj, void *prev); + + /** + * Return an AVClass corresponding to the next potential + * AVOptions-enabled child. + * + * The difference between child_next and this is that + * child_next iterates over _already existing_ objects, while + * child_class_next iterates over _all possible_ children. + */ + const struct AVClass* (*child_class_next)(const struct AVClass *prev); + + /** + * Category used for visualization (like color) + * This is only set if the category is equal for all objects using this class. + * available since version (51 << 16 | 56 << 8 | 100) + */ + AVClassCategory category; + + /** + * Callback to return the category. + * available since version (51 << 16 | 59 << 8 | 100) + */ + AVClassCategory (*get_category)(void* ctx); + + /** + * Callback to return the supported/allowed ranges. + * available since version (52.12) + */ + int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); +} AVClass; + +/** + * @addtogroup lavu_log + * + * @{ + * + * @defgroup lavu_log_constants Logging Constants + * + * @{ + */ + +/** + * Print no output. + */ +#define AV_LOG_QUIET -8 + +/** + * Something went really wrong and we will crash now. + */ +#define AV_LOG_PANIC 0 + +/** + * Something went wrong and recovery is not possible. + * For example, no header was found for a format which depends + * on headers or an illegal combination of parameters is used. + */ +#define AV_LOG_FATAL 8 + +/** + * Something went wrong and cannot losslessly be recovered. + * However, not all future data is affected. + */ +#define AV_LOG_ERROR 16 + +/** + * Something somehow does not look correct. This may or may not + * lead to problems. An example would be the use of '-vstrict -2'. + */ +#define AV_LOG_WARNING 24 + +/** + * Standard information. + */ +#define AV_LOG_INFO 32 + +/** + * Detailed information. + */ +#define AV_LOG_VERBOSE 40 + +/** + * Stuff which is only useful for libav* developers. + */ +#define AV_LOG_DEBUG 48 + +/** + * Extremely verbose debugging, useful for libav* development. + */ +#define AV_LOG_TRACE 56 + +#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) + +/** + * @} + */ + +/** + * Sets additional colors for extended debugging sessions. + * @code + av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); + @endcode + * Requires 256color terminal support. Uses outside debugging is not + * recommended. + */ +#define AV_LOG_C(x) ((x) << 8) + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct or NULL if general log. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + */ +void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); + + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_vlog(void *avcl, int level, const char *fmt, va_list vl); + +/** + * Get the current log level + * + * @see lavu_log_constants + * + * @return Current log level + */ +int av_log_get_level(void); + +/** + * Set the log level + * + * @see lavu_log_constants + * + * @param level Logging level + */ +void av_log_set_level(int level); + +/** + * Set the logging callback + * + * @note The callback must be thread safe, even if the application does not use + * threads itself as some codecs are multithreaded. + * + * @see av_log_default_callback + * + * @param callback A logging function with a compatible signature. + */ +void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); + +/** + * Default logging callback + * + * It prints the message to stderr, optionally colorizing it. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_log_default_callback(void *avcl, int level, const char *fmt, + va_list vl); + +/** + * Return the context name + * + * @param ctx The AVClass context + * + * @return The AVClass class_name + */ +const char* av_default_item_name(void* ctx); +AVClassCategory av_default_get_category(void *ptr); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line + * @param line_size size of the buffer + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + */ +void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occurred, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +#if FF_API_DLOG +/** + * av_dlog macros + * @deprecated unused + * Useful to print debug messages that shouldn't get compiled in normally. + */ + +#ifdef DEBUG +# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__) +#else +# define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0) +#endif +#endif /* FF_API_DLOG */ + +/** + * Skip repeated messages, this requires the user app to use av_log() instead of + * (f)printf as the 2 would otherwise interfere and lead to + * "Last message repeated x times" messages below (f)printf messages with some + * bad luck. + * Also to receive the last, "last repeated" line if any, the user app must + * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end + */ +#define AV_LOG_SKIP_REPEATED 1 + +/** + * Include the log severity in messages originating from codecs. + * + * Results in messages such as: + * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts + */ +#define AV_LOG_PRINT_LEVEL 2 + +void av_log_set_flags(int arg); +int av_log_get_flags(void); + +/** + * @} + */ + +#endif /* AVUTIL_LOG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lzo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lzo.h new file mode 100644 index 0000000..c034039 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/lzo.h @@ -0,0 +1,66 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_LZO_H +#define AVUTIL_LZO_H + +/** + * @defgroup lavu_lzo LZO + * @ingroup lavu_crypto + * + * @{ + */ + +#include + +/** @name Error flags returned by av_lzo1x_decode + * @{ */ +/// end of the input buffer reached before decoding finished +#define AV_LZO_INPUT_DEPLETED 1 +/// decoded data did not fit into output buffer +#define AV_LZO_OUTPUT_FULL 2 +/// a reference to previously decoded data was wrong +#define AV_LZO_INVALID_BACKPTR 4 +/// a non-specific error in the compressed bitstream +#define AV_LZO_ERROR 8 +/** @} */ + +#define AV_LZO_INPUT_PADDING 8 +#define AV_LZO_OUTPUT_PADDING 12 + +/** + * @brief Decodes LZO 1x compressed data. + * @param out output buffer + * @param outlen size of output buffer, number of bytes left are returned here + * @param in input buffer + * @param inlen size of input buffer, number of bytes left are returned here + * @return 0 on success, otherwise a combination of the error flags above + * + * Make sure all buffers are appropriately padded, in must provide + * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. + */ +int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +/** + * @} + */ + +#endif /* AVUTIL_LZO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/macros.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/macros.h new file mode 100644 index 0000000..2007ee5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/macros.h @@ -0,0 +1,50 @@ +/* + * 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 + * @ingroup lavu + * Utility Preprocessor macros + */ + +#ifndef AVUTIL_MACROS_H +#define AVUTIL_MACROS_H + +/** + * @addtogroup preproc_misc Preprocessor String Macros + * + * String manipulation macros + * + * @{ + */ + +#define AV_STRINGIFY(s) AV_TOSTRING(s) +#define AV_TOSTRING(s) #s + +#define AV_GLUE(a, b) a ## b +#define AV_JOIN(a, b) AV_GLUE(a, b) + +/** + * @} + */ + +#define AV_PRAGMA(s) _Pragma(#s) + +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +#endif /* AVUTIL_MACROS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mastering_display_metadata.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mastering_display_metadata.h new file mode 100644 index 0000000..847b0b6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mastering_display_metadata.h @@ -0,0 +1,128 @@ +/** + * Copyright (c) 2016 Neil Birkbeck + * + * 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 + */ + +#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H +#define AVUTIL_MASTERING_DISPLAY_METADATA_H + +#include "frame.h" +#include "rational.h" + + +/** + * Mastering display metadata capable of representing the color volume of + * the display used to master the content (SMPTE 2086:2014). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_mastering_display_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVMasteringDisplayMetadata { + /** + * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). + */ + AVRational display_primaries[3][2]; + + /** + * CIE 1931 xy chromaticity coords of white point. + */ + AVRational white_point[2]; + + /** + * Min luminance of mastering display (cd/m^2). + */ + AVRational min_luminance; + + /** + * Max luminance of mastering display (cd/m^2). + */ + AVRational max_luminance; + + /** + * Flag indicating whether the display primaries (and white point) are set. + */ + int has_primaries; + + /** + * Flag indicating whether the luminance (min_ and max_) have been set. + */ + int has_luminance; + +} AVMasteringDisplayMetadata; + +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); + +/** + * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVMasteringDisplayMetadata structure to be filled by caller. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); + +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mathematics.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mathematics.h new file mode 100644 index 0000000..5490180 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mathematics.h @@ -0,0 +1,242 @@ +/* + * copyright (c) 2005-2012 Michael Niedermayer + * + * 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 + * @addtogroup lavu_math + * Mathematical utilities for working with timestamp and time base. + */ + +#ifndef AVUTIL_MATHEMATICS_H +#define AVUTIL_MATHEMATICS_H + +#include +#include +#include "attributes.h" +#include "rational.h" +#include "intfloat.h" + +#ifndef M_E +#define M_E 2.7182818284590452354 /* e */ +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 /* log_e 2 */ +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 /* log_e 10 */ +#endif +#ifndef M_LOG2_10 +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ +#endif +#ifndef M_PHI +#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#ifndef NAN +#define NAN av_int2float(0x7fc00000) +#endif +#ifndef INFINITY +#define INFINITY av_int2float(0x7f800000) +#endif + +/** + * @addtogroup lavu_math + * + * @{ + */ + +/** + * Rounding methods. + */ +enum AVRounding { + AV_ROUND_ZERO = 0, ///< Round toward zero. + AV_ROUND_INF = 1, ///< Round away from zero. + AV_ROUND_DOWN = 2, ///< Round toward -infinity. + AV_ROUND_UP = 3, ///< Round toward +infinity. + AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. + /** + * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through + * unchanged, avoiding special cases for #AV_NOPTS_VALUE. + * + * Unlike other values of the enumeration AVRounding, this value is a + * bitmask that must be used in conjunction with another value of the + * enumeration through a bitwise OR, in order to set behavior for normal + * cases. + * + * @code{.c} + * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling 3: + * // Calculating 3 * 1 / 2 + * // 3 / 2 is rounded up to 2 + * // => 2 + * + * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling AV_NOPTS_VALUE: + * // AV_NOPTS_VALUE == INT64_MIN + * // AV_NOPTS_VALUE is passed through + * // => AV_NOPTS_VALUE + * @endcode + */ + AV_ROUND_PASS_MINMAX = 8192, +}; + +/** + * Compute the greatest common divisor of two integer operands. + * + * @param a,b Operands + * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; + * if a == 0 and b == 0, returns 0. + */ +int64_t av_const av_gcd(int64_t a, int64_t b); + +/** + * Rescale a 64-bit integer with rounding to nearest. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow. + * + * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; + +/** + * Rescale a 64-bit integer with specified rounding. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow, and does not support different rounding methods. + * + * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() + */ +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers with specified rounding. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q() + */ +int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, + enum AVRounding rnd) av_const; + +/** + * Compare two timestamps each in its own time base. + * + * @return One of the following values: + * - -1 if `ts_a` is before `ts_b` + * - 1 if `ts_a` is after `ts_b` + * - 0 if they represent the same position + * + * @warning + * The result of the function is undefined if one of the timestamps is outside + * the `int64_t` range when represented in the other's timebase. + */ +int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); + +/** + * Compare the remainders of two integer operands divided by a common divisor. + * + * In other words, compare the least significant `log2(mod)` bits of integers + * `a` and `b`. + * + * @code{.c} + * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) + * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) + * @endcode + * + * @param a,b Operands + * @param mod Divisor; must be a power of 2 + * @return + * - a negative value if `a % mod < b % mod` + * - a positive value if `a % mod > b % mod` + * - zero if `a % mod == b % mod` + */ +int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); + +/** + * Rescale a timestamp while preserving known durations. + * + * This function is designed to be called per audio packet to scale the input + * timestamp to a different time base. Compared to a simple av_rescale_q() + * call, this function is robust against possible inconsistent frame durations. + * + * The `last` parameter is a state variable that must be preserved for all + * subsequent calls for the same stream. For the first call, `*last` should be + * initialized to #AV_NOPTS_VALUE. + * + * @param[in] in_tb Input time base + * @param[in] in_ts Input timestamp + * @param[in] fs_tb Duration time base; typically this is finer-grained + * (greater) than `in_tb` and `out_tb` + * @param[in] duration Duration till the next call to this function (i.e. + * duration of the current packet/frame) + * @param[in,out] last Pointer to a timestamp expressed in terms of + * `fs_tb`, acting as a state variable + * @param[in] out_tb Output timebase + * @return Timestamp expressed in terms of `out_tb` + * + * @note In the context of this function, "duration" is in term of samples, not + * seconds. + */ +int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); + +/** + * Add a value to a timestamp. + * + * This function guarantees that when the same value is repeatly added that + * no accumulation of rounding errors occurs. + * + * @param[in] ts Input timestamp + * @param[in] ts_tb Input timestamp time base + * @param[in] inc Value to be added + * @param[in] inc_tb Time base of `inc` + */ +int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); + + +/** + * @} + */ + +#endif /* AVUTIL_MATHEMATICS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/md5.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/md5.h new file mode 100644 index 0000000..ca72ccb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/md5.h @@ -0,0 +1,98 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_md5 + * Public header for MD5 hash function implementation. + */ + +#ifndef AVUTIL_MD5_H +#define AVUTIL_MD5_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_md5 MD5 + * @ingroup lavu_hash + * MD5 hash function implementation. + * + * @{ + */ + +extern const int av_md5_size; + +struct AVMD5; + +/** + * Allocate an AVMD5 context. + */ +struct AVMD5 *av_md5_alloc(void); + +/** + * Initialize MD5 hashing. + * + * @param ctx pointer to the function context (of size av_md5_size) + */ +void av_md5_init(struct AVMD5 *ctx); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param src input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, int len); +#else +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param ctx hash function context + * @param dst buffer where output digest value is stored + */ +void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); + +/** + * Hash an array of data. + * + * @param dst The output buffer to write the digest into + * @param src The data to hash + * @param len The length of the data, in bytes + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len); +#else +void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len); +#endif + +/** + * @} + */ + +#endif /* AVUTIL_MD5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mem.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mem.h new file mode 100644 index 0000000..527cd03 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/mem.h @@ -0,0 +1,699 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_mem + * Memory handling functions + */ + +#ifndef AVUTIL_MEM_H +#define AVUTIL_MEM_H + +#include +#include + +#include "attributes.h" +#include "error.h" +#include "avutil.h" + +/** + * @addtogroup lavu_mem + * Utilities for manipulating memory. + * + * FFmpeg has several applications of memory that are not required of a typical + * program. For example, the computing-heavy components like video decoding and + * encoding can be sped up significantly through the use of aligned memory. + * + * However, for each of FFmpeg's applications of memory, there might not be a + * recognized or standardized API for that specific use. Memory alignment, for + * instance, varies wildly depending on operating systems, architectures, and + * compilers. Hence, this component of @ref libavutil is created to make + * dealing with memory consistently possible on all platforms. + * + * @{ + * + * @defgroup lavu_mem_macros Alignment Macros + * Helper macros for declaring aligned variables. + * @{ + */ + +/** + * @def DECLARE_ALIGNED(n,t,v) + * Declare a variable that is aligned in memory. + * + * @code{.c} + * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; + * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; + * + * // The default-alignment equivalent would be + * uint16_t aligned_int = 42; + * uint8_t aligned_array[128]; + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_CONST(n,t,v) + * Declare a static constant aligned variable appropriate for use in inline + * assembly code. + * + * @code{.c} + * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +#if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v +#elif defined(__TI_COMPILER_VERSION__) + #define DECLARE_ALIGNED(n,t,v) \ + AV_PRAGMA(DATA_ALIGN(v,n)) \ + t __attribute__((aligned(n))) v + #define DECLARE_ASM_CONST(n,t,v) \ + AV_PRAGMA(DATA_ALIGN(v,n)) \ + static const t __attribute__((aligned(n))) v +#elif defined(__DJGPP__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v +#elif defined(__GNUC__) || defined(__clang__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v +#elif defined(_MSC_VER) + #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v +#else + #define DECLARE_ALIGNED(n,t,v) t v + #define DECLARE_ASM_CONST(n,t,v) static const t v +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_attrs Function Attributes + * Function attributes applicable to memory handling functions. + * + * These function attributes can help compilers emit more useful warnings, or + * generate better code. + * @{ + */ + +/** + * @def av_malloc_attrib + * Function attribute denoting a malloc-like function. + * + * @see Function attribute `malloc` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(3,1) + #define av_malloc_attrib __attribute__((__malloc__)) +#else + #define av_malloc_attrib +#endif + +/** + * @def av_alloc_size(...) + * Function attribute used on a function that allocates memory, whose size is + * given by the specified parameter(s). + * + * @code{.c} + * void *av_malloc(size_t size) av_alloc_size(1); + * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); + * @endcode + * + * @param ... One or two parameter indexes, separated by a comma + * + * @see Function attribute `alloc_size` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(4,3) + #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) +#else + #define av_alloc_size(...) +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_funcs Heap Management + * Functions responsible for allocating, freeing, and copying memory. + * + * All memory allocation functions have a built-in upper limit of `INT_MAX` + * bytes. This may be changed with av_max_alloc(), although exercise extreme + * caution when doing so. + * + * @{ + */ + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU). + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_mallocz() + */ +void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU) and zero all the bytes of the + * block. + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if it cannot be allocated + * @see av_malloc() + */ +void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block for an array with av_malloc(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of element + * @param size Size of a single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_malloc() + */ +av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size) +{ + if (!size || nmemb >= INT_MAX / size) + return NULL; + return av_malloc(nmemb * size); +} + +/** + * Allocate a memory block for an array with av_mallocz(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of elements + * @param size Size of the single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * + * @see av_mallocz() + * @see av_malloc_array() + */ +av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size) +{ + if (!size || nmemb >= INT_MAX / size) + return NULL; + return av_mallocz(nmemb * size); +} + +/** + * Non-inlined equivalent of av_mallocz_array(). + * + * Created for symmetry with the calloc() C function. + */ +void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; + +/** + * Allocate, reallocate, or free a block of memory. + * + * If `ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param size Size in bytes of the memory block to be allocated or + * reallocated + * + * @return Pointer to a newly-reallocated block or `NULL` if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be + * correctly aligned. + * @see av_fast_realloc() + * @see av_reallocp() + */ +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); + +/** + * Allocate, reallocate, or free a block of memory through a pointer to a + * pointer. + * + * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already allocated + * with av_realloc(), or a pointer to `NULL`. The pointer + * is updated on success, or freed on failure. + * @param[in] size Size in bytes for the memory block to be allocated or + * reallocated + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); + +/** + * Allocate, reallocate, or free a block of memory. + * + * This function does the same thing as av_realloc(), except: + * - It takes two size arguments and allocates `nelem * elsize` bytes, + * after checking the result of the multiplication for integer overflow. + * - It frees the input block in case of failure, thus avoiding the memory + * leak with the classic + * @code{.c} + * buf = realloc(buf); + * if (!buf) + * return -1; + * @endcode + * pattern. + */ +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); + +/** + * Allocate, reallocate, or free an array. + * + * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. If + * `nmemb` is zero, free the memory block pointed to by `ptr`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param nmemb Number of elements in the array + * @param size Size of the single element of the array + * + * @return Pointer to a newly-reallocated block or NULL if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + * @see av_reallocp_array() + */ +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Allocate, reallocate, or free an array through a pointer to a pointer. + * + * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. If `nmemb` is + * zero, free the memory block pointed to by `*ptr`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already + * allocated with av_realloc(), or a pointer to `NULL`. + * The pointer is updated on success, or freed on failure. + * @param[in] nmemb Number of elements + * @param[in] size Size of the single element + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the given buffer if it is not large enough, otherwise do nothing. + * + * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. + * + * If the given buffer is not large enough, and reallocation fails, `NULL` is + * returned and `*size` is set to 0, but the original buffer is not changed or + * freed. + * + * A typical use pattern follows: + * + * @code{.c} + * uint8_t *buf = ...; + * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); + * if (!new_buf) { + * // Allocation failed; clean up original buffer + * av_freep(&buf); + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Already allocated buffer, or `NULL` + * @param[in,out] size Pointer to current size of buffer `ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `ptr` + * @return `ptr` if the buffer is large enough, a pointer to newly reallocated + * buffer if the buffer was not large enough, or `NULL` in case of + * error + * @see av_realloc() + * @see av_fast_malloc() + */ +void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate a buffer, reusing the given one if large enough. + * + * Contrary to av_fast_realloc(), the current buffer contents might not be + * preserved and on error the old buffer is freed, thus no special handling to + * avoid memleaks is necessary. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @code{.c} + * uint8_t *buf = ...; + * av_fast_malloc(&buf, ¤t_size, size_needed); + * if (!buf) { + * // Allocation failed; buf already freed + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `*ptr` + * @see av_realloc() + * @see av_fast_mallocz() + */ +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate and clear a buffer, reusing the given one if large enough. + * + * Like av_fast_malloc(), but all newly allocated space is initially cleared. + * Reused buffer is not cleared. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `*ptr` + * @see av_fast_malloc() + */ +void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family. + * + * @param ptr Pointer to the memory block which should be freed. + * + * @note `ptr = NULL` is explicitly allowed. + * @note It is recommended that you use av_freep() instead, to prevent leaving + * behind dangling pointers. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family, and set the pointer pointing to it to `NULL`. + * + * @code{.c} + * uint8_t *buf = av_malloc(16); + * av_free(buf); + * // buf now contains a dangling pointer to freed memory, and accidental + * // dereference of buf will result in a use-after-free, which may be a + * // security risk. + * + * uint8_t *buf = av_malloc(16); + * av_freep(&buf); + * // buf is now NULL, and accidental dereference will only result in a + * // NULL-pointer dereference. + * @endcode + * + * @param ptr Pointer to the pointer to the memory block which should be freed + * @note `*ptr = NULL` is safe and leads to no action. + * @see av_free() + */ +void av_freep(void *ptr); + +/** + * Duplicate a string. + * + * @param s String to be duplicated + * @return Pointer to a newly-allocated string containing a + * copy of `s` or `NULL` if the string cannot be allocated + * @see av_strndup() + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Duplicate a substring of a string. + * + * @param s String to be duplicated + * @param len Maximum length of the resulting string (not counting the + * terminating byte) + * @return Pointer to a newly-allocated string containing a + * substring of `s` or `NULL` if the string cannot be allocated + */ +char *av_strndup(const char *s, size_t len) av_malloc_attrib; + +/** + * Duplicate a buffer with av_malloc(). + * + * @param p Buffer to be duplicated + * @param size Size in bytes of the buffer copied + * @return Pointer to a newly allocated buffer containing a + * copy of `p` or `NULL` if the buffer cannot be allocated + */ +void *av_memdup(const void *p, size_t size); + +/** + * Overlapping memcpy() implementation. + * + * @param dst Destination buffer + * @param back Number of bytes back to start copying (i.e. the initial size of + * the overlapping window); must be > 0 + * @param cnt Number of bytes to copy; must be >= 0 + * + * @note `cnt > back` is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of `back`. + */ +void av_memcpy_backptr(uint8_t *dst, int back, int cnt); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_dynarray Dynamic Array + * + * Utilities to make an array grow when needed. + * + * Sometimes, the programmer would want to have an array that can grow when + * needed. The libavutil dynamic array utilities fill that need. + * + * libavutil supports two systems of appending elements onto a dynamically + * allocated array, the first one storing the pointer to the value in the + * array, and the second storing the value directly. In both systems, the + * caller is responsible for maintaining a variable containing the length of + * the array, as well as freeing of the array after use. + * + * The first system stores pointers to values in a block of dynamically + * allocated memory. Since only pointers are stored, the function does not need + * to know the size of the type. Both av_dynarray_add() and + * av_dynarray_add_nofree() implement this system. + * + * @code + * type **array = NULL; //< an array of pointers to values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * av_dynarray_add(&array, &nb, &to_be_added); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * av_dynarray_add(&array, &nb, &to_be_added2); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // &to_be_added == array[0] + * // &to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * The second system stores the value directly in a block of memory. As a + * result, the function has to know the size of the type. av_dynarray2_add() + * implements this mechanism. + * + * @code + * type *array = NULL; //< an array of values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); + * if (!addr) + * return AVERROR(ENOMEM); + * memcpy(addr, &to_be_added, sizeof(to_be_added)); + * + * // Shortcut of the above. + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), + * (const void *)&to_be_added2); + * if (!addr) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // to_be_added == array[0] + * // to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * @{ + */ + +/** + * Add the pointer to an element to a dynamic array. + * + * The array to grow is supposed to be an array of pointers to + * structures, and the element to add must be a pointer to an already + * allocated structure. + * + * The array is reallocated when its size reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem Element to add + * @see av_dynarray_add_nofree(), av_dynarray2_add() + */ +void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element to a dynamic array. + * + * Function has the same functionality as av_dynarray_add(), + * but it doesn't free memory on fails. It returns error code + * instead and leave current buffer untouched. + * + * @return >=0 on success, negative otherwise + * @see av_dynarray_add(), av_dynarray2_add() + */ +av_warn_unused_result +int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element of size `elem_size` to a dynamic array. + * + * The array is reallocated when its number of elements reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem_size Size in bytes of an element in the array + * @param[in] elem_data Pointer to the data of the element to add. If + * `NULL`, the space of the newly added element is + * allocated but left uninitialized. + * + * @return Pointer to the data of the element to copy in the newly allocated + * space + * @see av_dynarray_add(), av_dynarray_add_nofree() + */ +void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, + const uint8_t *elem_data); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_misc Miscellaneous Functions + * + * Other functions related to memory allocation. + * + * @{ + */ + +/** + * Multiply two `size_t` values checking for overflow. + * + * @param[in] a,b Operands of multiplication + * @param[out] r Pointer to the result of the operation + * @return 0 on success, AVERROR(EINVAL) on overflow + */ +static inline int av_size_mult(size_t a, size_t b, size_t *r) +{ + size_t t = a * b; + /* Hack inspired from glibc: don't try the division if nelem and elsize + * are both less than sqrt(SIZE_MAX). */ + if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) + return AVERROR(EINVAL); + *r = t; + return 0; +} + +/** + * Set the maximum size that may be allocated in one block. + * + * The value specified with this function is effective for all libavutil's @ref + * lavu_mem_funcs "heap management functions." + * + * By default, the max value is defined as `INT_MAX`. + * + * @param max Value to be set as the new maximum size + * + * @warning Exercise extreme caution when using this function. Don't touch + * this if you do not understand the full consequence of doing so. + */ +void av_max_alloc(size_t max); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_MEM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/motion_vector.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/motion_vector.h new file mode 100644 index 0000000..ec29556 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/motion_vector.h @@ -0,0 +1,57 @@ +/* + * 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 + */ + +#ifndef AVUTIL_MOTION_VECTOR_H +#define AVUTIL_MOTION_VECTOR_H + +#include + +typedef struct AVMotionVector { + /** + * Where the current macroblock comes from; negative value when it comes + * from the past, positive value when it comes from the future. + * XXX: set exact relative ref frame reference instead of a +/- 1 "direction". + */ + int32_t source; + /** + * Width and height of the block. + */ + uint8_t w, h; + /** + * Absolute source position. Can be outside the frame area. + */ + int16_t src_x, src_y; + /** + * Absolute destination position. Can be outside the frame area. + */ + int16_t dst_x, dst_y; + /** + * Extra flag information. + * Currently unused. + */ + uint64_t flags; + /** + * Motion vector + * src_x = dst_x + motion_x / motion_scale + * src_y = dst_y + motion_y / motion_scale + */ + int32_t motion_x, motion_y; + uint16_t motion_scale; +} AVMotionVector; + +#endif /* AVUTIL_MOTION_VECTOR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/murmur3.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/murmur3.h new file mode 100644 index 0000000..6a1694c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/murmur3.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_murmur3 + * Public header for MurmurHash3 hash function implementation. + */ + +#ifndef AVUTIL_MURMUR3_H +#define AVUTIL_MURMUR3_H + +#include + +/** + * @defgroup lavu_murmur3 Murmur3 + * @ingroup lavu_hash + * MurmurHash3 hash function implementation. + * + * MurmurHash3 is a non-cryptographic hash function, of which three + * incompatible versions were created by its inventor Austin Appleby: + * + * - 32-bit output + * - 128-bit output for 32-bit platforms + * - 128-bit output for 64-bit platforms + * + * FFmpeg only implements the last variant: 128-bit output designed for 64-bit + * platforms. Even though the hash function was designed for 64-bit platforms, + * the function in reality works on 32-bit systems too, only with reduced + * performance. + * + * @anchor lavu_murmur3_seedinfo + * By design, MurmurHash3 requires a seed to operate. In response to this, + * libavutil provides two functions for hash initiation, one that requires a + * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer + * as the seed, and therefore does not (av_murmur3_init()). + * + * To make hashes comparable, you should provide the same seed for all calls to + * this hash function -- if you are supplying one yourself, that is. + * + * @{ + */ + +/** + * Allocate an AVMurMur3 hash context. + * + * @return Uninitialized hash context or `NULL` in case of error + */ +struct AVMurMur3 *av_murmur3_alloc(void); + +/** + * Initialize or reinitialize an AVMurMur3 hash context with a seed. + * + * @param[out] c Hash context + * @param[in] seed Random seed + * + * @see av_murmur3_init() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed); + +/** + * Initialize or reinitialize an AVMurMur3 hash context. + * + * Equivalent to av_murmur3_init_seeded() with a built-in seed. + * + * @param[out] c Hash context + * + * @see av_murmur3_init_seeded() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init(struct AVMurMur3 *c); + +/** + * Update hash context with new data. + * + * @param[out] c Hash context + * @param[in] src Input data to update hash with + * @param[in] len Number of bytes to read from `src` + */ +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len); + +/** + * Finish hashing and output digest value. + * + * @param[in,out] c Hash context + * @param[out] dst Buffer where output digest value is stored + */ +void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]); + +/** + * @} + */ + +#endif /* AVUTIL_MURMUR3_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/opt.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/opt.h new file mode 100644 index 0000000..0d89379 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/opt.h @@ -0,0 +1,866 @@ +/* + * AVOptions + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_OPT_H +#define AVUTIL_OPT_H + +/** + * @file + * AVOptions + */ + +#include "rational.h" +#include "avutil.h" +#include "dict.h" +#include "log.h" +#include "pixfmt.h" +#include "samplefmt.h" +#include "version.h" + +/** + * @defgroup avoptions AVOptions + * @ingroup lavu_data + * @{ + * AVOptions provide a generic system to declare options on arbitrary structs + * ("objects"). An option can have a help text, a type and a range of possible + * values. Options may then be enumerated, read and written to. + * + * @section avoptions_implement Implementing AVOptions + * This section describes how to add AVOptions capabilities to a struct. + * + * All AVOptions-related information is stored in an AVClass. Therefore + * the first member of the struct should be a pointer to an AVClass describing it. + * The option field of the AVClass must be set to a NULL-terminated static array + * of AVOptions. Each AVOption must have a non-empty name, a type, a default + * value and for number-type AVOptions also a range of allowed values. It must + * also declare an offset in bytes from the start of the struct, where the field + * associated with this AVOption is located. Other fields in the AVOption struct + * should also be set when applicable, but are not required. + * + * The following example illustrates an AVOptions-enabled struct: + * @code + * typedef struct test_struct { + * const AVClass *class; + * int int_opt; + * char *str_opt; + * uint8_t *bin_opt; + * int bin_len; + * } test_struct; + * + * static const AVOption test_options[] = { + * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt), + * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX }, + * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt), + * AV_OPT_TYPE_STRING }, + * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt), + * AV_OPT_TYPE_BINARY }, + * { NULL }, + * }; + * + * static const AVClass test_class = { + * .class_name = "test class", + * .item_name = av_default_item_name, + * .option = test_options, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * @endcode + * + * Next, when allocating your struct, you must ensure that the AVClass pointer + * is set to the correct value. Then, av_opt_set_defaults() can be called to + * initialize defaults. After that the struct is ready to be used with the + * AVOptions API. + * + * When cleaning up, you may use the av_opt_free() function to automatically + * free all the allocated string and binary options. + * + * Continuing with the above example: + * + * @code + * test_struct *alloc_test_struct(void) + * { + * test_struct *ret = av_mallocz(sizeof(*ret)); + * ret->class = &test_class; + * av_opt_set_defaults(ret); + * return ret; + * } + * void free_test_struct(test_struct **foo) + * { + * av_opt_free(*foo); + * av_freep(foo); + * } + * @endcode + * + * @subsection avoptions_implement_nesting Nesting + * It may happen that an AVOptions-enabled struct contains another + * AVOptions-enabled struct as a member (e.g. AVCodecContext in + * libavcodec exports generic options, while its priv_data field exports + * codec-specific options). In such a case, it is possible to set up the + * parent struct to export a child's options. To do that, simply + * implement AVClass.child_next() and AVClass.child_class_next() in the + * parent struct's AVClass. + * Assuming that the test_struct from above now also contains a + * child_struct field: + * + * @code + * typedef struct child_struct { + * AVClass *class; + * int flags_opt; + * } child_struct; + * static const AVOption child_opts[] = { + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX }, + * { NULL }, + * }; + * static const AVClass child_class = { + * .class_name = "child class", + * .item_name = av_default_item_name, + * .option = child_opts, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * + * void *child_next(void *obj, void *prev) + * { + * test_struct *t = obj; + * if (!prev && t->child_struct) + * return t->child_struct; + * return NULL + * } + * const AVClass child_class_next(const AVClass *prev) + * { + * return prev ? NULL : &child_class; + * } + * @endcode + * Putting child_next() and child_class_next() as defined above into + * test_class will now make child_struct's options accessible through + * test_struct (again, proper setup as described above needs to be done on + * child_struct right after it is created). + * + * From the above example it might not be clear why both child_next() + * and child_class_next() are needed. The distinction is that child_next() + * iterates over actually existing objects, while child_class_next() + * iterates over all possible child classes. E.g. if an AVCodecContext + * was initialized to use a codec which has private options, then its + * child_next() will return AVCodecContext.priv_data and finish + * iterating. OTOH child_class_next() on AVCodecContext.av_class will + * iterate over all available codecs with private options. + * + * @subsection avoptions_implement_named_constants Named constants + * It is possible to create named constants for options. Simply set the unit + * field of the option the constants should apply to a string and + * create the constants themselves as options of type AV_OPT_TYPE_CONST + * with their unit field set to the same string. + * Their default_val field should contain the value of the named + * constant. + * For example, to add some named constants for the test_flags option + * above, put the following into the child_opts array: + * @code + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" }, + * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" }, + * @endcode + * + * @section avoptions_use Using AVOptions + * This section deals with accessing options in an AVOptions-enabled struct. + * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or + * AVFormatContext in libavformat. + * + * @subsection avoptions_use_examine Examining AVOptions + * The basic functions for examining options are av_opt_next(), which iterates + * over all options defined for one object, and av_opt_find(), which searches + * for an option with the given name. + * + * The situation is more complicated with nesting. An AVOptions-enabled struct + * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag + * to av_opt_find() will make the function search children recursively. + * + * For enumerating there are basically two cases. The first is when you want to + * get all options that may potentially exist on the struct and its children + * (e.g. when constructing documentation). In that case you should call + * av_opt_child_class_next() recursively on the parent struct's AVClass. The + * second case is when you have an already initialized struct with all its + * children and you want to get all options that can be actually written or read + * from it. In that case you should call av_opt_child_next() recursively (and + * av_opt_next() on each result). + * + * @subsection avoptions_use_get_set Reading and writing AVOptions + * When setting options, you often have a string read directly from the + * user. In such a case, simply passing it to av_opt_set() is enough. For + * non-string type options, av_opt_set() will parse the string according to the + * option type. + * + * Similarly av_opt_get() will read any option type and convert it to a string + * which will be returned. Do not forget that the string is allocated, so you + * have to free it with av_free(). + * + * In some cases it may be more convenient to put all options into an + * AVDictionary and call av_opt_set_dict() on it. A specific case of this + * are the format/codec open functions in lavf/lavc which take a dictionary + * filled with option as a parameter. This makes it possible to set some options + * that cannot be set otherwise, since e.g. the input file format is not known + * before the file is actually opened. + */ + +enum AVOptionType{ + AV_OPT_TYPE_FLAGS, + AV_OPT_TYPE_INT, + AV_OPT_TYPE_INT64, + AV_OPT_TYPE_DOUBLE, + AV_OPT_TYPE_FLOAT, + AV_OPT_TYPE_STRING, + AV_OPT_TYPE_RATIONAL, + AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length + AV_OPT_TYPE_DICT, + AV_OPT_TYPE_UINT64, + AV_OPT_TYPE_CONST = 128, + AV_OPT_TYPE_IMAGE_SIZE = MKBETAG('S','I','Z','E'), ///< offset must point to two consecutive integers + AV_OPT_TYPE_PIXEL_FMT = MKBETAG('P','F','M','T'), + AV_OPT_TYPE_SAMPLE_FMT = MKBETAG('S','F','M','T'), + AV_OPT_TYPE_VIDEO_RATE = MKBETAG('V','R','A','T'), ///< offset must point to AVRational + AV_OPT_TYPE_DURATION = MKBETAG('D','U','R',' '), + AV_OPT_TYPE_COLOR = MKBETAG('C','O','L','R'), + AV_OPT_TYPE_CHANNEL_LAYOUT = MKBETAG('C','H','L','A'), + AV_OPT_TYPE_BOOL = MKBETAG('B','O','O','L'), +}; + +/** + * AVOption + */ +typedef struct AVOption { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + union { + int64_t i64; + double dbl; + const char *str; + /* TODO those are unused now */ + AVRational q; + } default_val; + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#if FF_API_OPT_TYPE_METADATA +#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ... +#endif +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +/** + * The option is intended for exporting values to the caller. + */ +#define AV_OPT_FLAG_EXPORT 64 +/** + * The option may not be set through the AVOptions API, only read. + * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. + */ +#define AV_OPT_FLAG_READONLY 128 +#define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering +//FIXME think about enc-audio, ... style flags + + /** + * The logical unit to which the option belongs. Non-constant + * options and corresponding named constants share the same + * unit. May be NULL. + */ + const char *unit; +} AVOption; + +/** + * A single allowed range of values, or a single allowed value. + */ +typedef struct AVOptionRange { + const char *str; + /** + * Value range. + * For string ranges this represents the min/max length. + * For dimensions this represents the min/max pixel count or width/height in multi-component case. + */ + double value_min, value_max; + /** + * Value's component range. + * For string this represents the unicode range for chars, 0-127 limits to ASCII. + */ + double component_min, component_max; + /** + * Range flag. + * If set to 1 the struct encodes a range, if set to 0 a single value. + */ + int is_range; +} AVOptionRange; + +/** + * List of AVOptionRange structs. + */ +typedef struct AVOptionRanges { + /** + * Array of option ranges. + * + * Most of option types use just one component. + * Following describes multi-component option types: + * + * AV_OPT_TYPE_IMAGE_SIZE: + * component index 0: range of pixel count (width * height). + * component index 1: range of width. + * component index 2: range of height. + * + * @note To obtain multi-component version of this structure, user must + * provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or + * av_opt_query_ranges_default function. + * + * Multi-component range can be read as in following example: + * + * @code + * int range_index, component_index; + * AVOptionRanges *ranges; + * AVOptionRange *range[3]; //may require more than 3 in the future. + * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE); + * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) { + * for (component_index = 0; component_index < ranges->nb_components; component_index++) + * range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index]; + * //do something with range here. + * } + * av_opt_freep_ranges(&ranges); + * @endcode + */ + AVOptionRange **range; + /** + * Number of ranges per component. + */ + int nb_ranges; + /** + * Number of componentes. + */ + int nb_components; +} AVOptionRanges; + +/** + * Show the obj options. + * + * @param req_flags requested flags for the options to show. Show only the + * options for which it is opt->flags & req_flags. + * @param rej_flags rejected flags for the options to show. Show only the + * options for which it is !(opt->flags & req_flags). + * @param av_log_obj log context to use for showing the options + */ +int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); + +/** + * Set the values of all AVOption fields to their default values. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + */ +void av_opt_set_defaults(void *s); + +/** + * Set the values of all AVOption fields to their default values. Only these + * AVOption fields for which (opt->flags & mask) == flags will have their + * default applied to s. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + * @param mask combination of AV_OPT_FLAG_* + * @param flags combination of AV_OPT_FLAG_* + */ +void av_opt_set_defaults2(void *s, int mask, int flags); + +/** + * Parse the key/value pairs list in opts. For each key/value pair + * found, stores the value in the field in ctx that is named like the + * key. ctx must be an AVClass context, storing is done using + * AVOptions. + * + * @param opts options string to parse, may be NULL + * @param key_val_sep a 0-terminated list of characters used to + * separate key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @return the number of successfully set key/value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_opt_set() if a key/value pair + * cannot be set + */ +int av_set_options_string(void *ctx, const char *opts, + const char *key_val_sep, const char *pairs_sep); + +/** + * Parse the key-value pairs list in opts. For each key=value pair found, + * set the value of the corresponding option in ctx. + * + * @param ctx the AVClass object to set options on + * @param opts the options string, key-value pairs separated by a + * delimiter + * @param shorthand a NULL-terminated array of options names for shorthand + * notation: if the first field in opts has no key part, + * the key is taken from the first element of shorthand; + * then again for the second, etc., until either opts is + * finished, shorthand is finished or a named option is + * found; after that, all options must be named + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @return the number of successfully set key=value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_set_string3() if a key/value pair + * cannot be set + * + * Options names must use only the following characters: a-z A-Z 0-9 - . / _ + * Separators must use characters distinct from option names and from each + * other. + */ +int av_opt_set_from_string(void *ctx, const char *opts, + const char *const *shorthand, + const char *key_val_sep, const char *pairs_sep); +/** + * Free all allocated objects in obj. + */ +void av_opt_free(void *obj); + +/** + * Check whether a particular flag is set in a flags field. + * + * @param field_name the name of the flag field option + * @param flag_name the name of the flag to check + * @return non-zero if the flag is set, zero if the flag isn't set, + * isn't of the right type, or the flags field doesn't exist. + */ +int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict(void *obj, struct AVDictionary **options); + + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags); + +/** + * Extract a key-value pair from the beginning of a string. + * + * @param ropts pointer to the options string, will be updated to + * point to the rest of the string (one of the pairs_sep + * or the final NUL) + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @param flags flags; see the AV_OPT_FLAG_* values below + * @param rkey parsed key; must be freed using av_free() + * @param rval parsed value; must be freed using av_free() + * + * @return >=0 for success, or a negative value corresponding to an + * AVERROR code in case of error; in particular: + * AVERROR(EINVAL) if no key is present + * + */ +int av_opt_get_key_value(const char **ropts, + const char *key_val_sep, const char *pairs_sep, + unsigned flags, + char **rkey, char **rval); + +enum { + + /** + * Accept to parse a value without a key; the key will then be returned + * as NULL. + */ + AV_OPT_FLAG_IMPLICIT_KEY = 1, +}; + +/** + * @defgroup opt_eval_funcs Evaluating option strings + * @{ + * This group of functions can be used to evaluate option strings + * and get numbers out of them. They do the same thing as av_opt_set(), + * except the result is written into the caller-supplied pointer. + * + * @param obj a struct whose first element is a pointer to AVClass. + * @param o an option for which the string is to be evaluated. + * @param val string to be evaluated. + * @param *_out value of the string will be written here. + * + * @return 0 on success, a negative number on failure. + */ +int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out); +int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out); +int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out); +int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out); +int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out); +int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out); +/** + * @} + */ + +#define AV_OPT_SEARCH_CHILDREN (1 << 0) /**< Search in possible children of the + given object first. */ +/** + * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass + * instead of a required pointer to a struct containing AVClass. This is + * useful for searching for options without needing to allocate the corresponding + * object. + */ +#define AV_OPT_SEARCH_FAKE_OBJ (1 << 1) + +/** + * In av_opt_get, return NULL if the option has a pointer type and is set to NULL, + * rather than returning an empty string. + */ +#define AV_OPT_ALLOW_NULL (1 << 2) + +/** + * Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than + * one component for certain option types. + * @see AVOptionRanges for details. + */ +#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12) + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return A pointer to the option found, or NULL if no option + * was found. + * + * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable + * directly with av_opt_set(). Use special calls which take an options + * AVDictionary (e.g. avformat_open_input()) to set options found with this + * flag. + */ +const AVOption *av_opt_find(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags); + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * @param[out] target_obj if non-NULL, an object to which the option belongs will be + * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present + * in search_flags. This parameter is ignored if search_flags contain + * AV_OPT_SEARCH_FAKE_OBJ. + * + * @return A pointer to the option found, or NULL if no option + * was found. + */ +const AVOption *av_opt_find2(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags, void **target_obj); + +/** + * Iterate over all AVOptions belonging to obj. + * + * @param obj an AVOptions-enabled struct or a double pointer to an + * AVClass describing it. + * @param prev result of the previous call to av_opt_next() on this object + * or NULL + * @return next AVOption or NULL + */ +const AVOption *av_opt_next(const void *obj, const AVOption *prev); + +/** + * Iterate over AVOptions-enabled children of obj. + * + * @param prev result of a previous call to this function or NULL + * @return next AVOptions-enabled child or NULL + */ +void *av_opt_child_next(void *obj, void *prev); + +/** + * Iterate over potential AVOptions-enabled children of parent. + * + * @param prev result of a previous call to this function or NULL + * @return AVClass corresponding to next potential child or NULL + */ +const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev); + +/** + * @defgroup opt_set_funcs Option setting functions + * @{ + * Those functions set the field of obj with the given name to value. + * + * @param[in] obj A struct whose first element is a pointer to an AVClass. + * @param[in] name the name of the field to set + * @param[in] val The value to set. In case of av_opt_set() if the field is not + * of a string type, then the given string is parsed. + * SI postfixes and some named scalars are supported. + * If the field is of a numeric type, it has to be a numeric or named + * scalar. Behavior with more than one scalar and +- infix operators + * is undefined. + * If the field is of a flags type, it has to be a sequence of numeric + * scalars or named flags separated by '+' or '-'. Prefixing a flag + * with '+' causes it to be set without affecting the other flags; + * similarly, '-' unsets a flag. + * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be set on a child of obj. + * + * @return 0 if the value has been set, or an AVERROR code in case of + * error: + * AVERROR_OPTION_NOT_FOUND if no matching option exists + * AVERROR(ERANGE) if the value is out of range + * AVERROR(EINVAL) if the value is not valid + */ +int av_opt_set (void *obj, const char *name, const char *val, int search_flags); +int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); +int av_opt_set_double (void *obj, const char *name, double val, int search_flags); +int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); +int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags); +int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags); +int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags); +int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags); +/** + * @note Any old dictionary present is discarded and replaced with a copy of the new one. The + * caller still owns val is and responsible for freeing it. + */ +int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags); + +/** + * Set a binary option to an integer list. + * + * @param obj AVClass object to set options on + * @param name name of the binary option + * @param val pointer to an integer list (must have the correct type with + * regard to the contents of the list) + * @param term list terminator (usually 0 or -1) + * @param flags search flags + */ +#define av_opt_set_int_list(obj, name, val, term, flags) \ + (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \ + AVERROR(EINVAL) : \ + av_opt_set_bin(obj, name, (const uint8_t *)(val), \ + av_int_list_length(val, term) * sizeof(*(val)), flags)) + +/** + * @} + */ + +/** + * @defgroup opt_get_funcs Option getting functions + * @{ + * Those functions get a value of the option with the given name from an object. + * + * @param[in] obj a struct whose first element is a pointer to an AVClass. + * @param[in] name name of the option to get. + * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be found in a child of obj. + * @param[out] out_val value of the option will be written here + * @return >=0 on success, a negative error code otherwise + */ +/** + * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller + * + * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the option has + * AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will be set + * to NULL instead of an allocated empty string. + */ +int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val); +int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val); +int av_opt_get_double (void *obj, const char *name, int search_flags, double *out_val); +int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out); +int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt); +int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt); +int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *ch_layout); +/** + * @param[out] out_val The returned dictionary is a copy of the actual value and must + * be freed with av_dict_free() by the caller + */ +int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); +/** + * @} + */ +/** + * Gets a pointer to the requested field in a struct. + * This function allows accessing a struct even when its fields are moved or + * renamed since the application making the access has been compiled, + * + * @returns a pointer to the field, it can be cast to the correct type and read + * or written to. + */ +void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name); + +/** + * Free an AVOptionRanges struct and set it to NULL. + */ +void av_opt_freep_ranges(AVOptionRanges **ranges); + +/** + * Get a list of allowed ranges for the given option. + * + * The returned list may depend on other fields in obj like for example profile. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_freep_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Copy options from src object into dest object. + * + * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object. + * Original memory allocated for such options is freed unless both src and dest options points to the same memory. + * + * @param dest Object to copy from + * @param src Object to copy into + * @return 0 on success, negative on error + */ +int av_opt_copy(void *dest, const void *src); + +/** + * Get a default list of allowed ranges for the given option. + * + * This list is constructed without using the AVClass.query_ranges() callback + * and can be used as fallback from within the callback. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_free_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Check if given option is set to its default value. + * + * Options o must belong to the obj. This function must not be called to check child's options state. + * @see av_opt_is_set_to_default_by_name(). + * + * @param obj AVClass object to check option on + * @param o option to be checked + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default(void *obj, const AVOption *o); + +/** + * Check if given option is set to its default value. + * + * @param obj AVClass object to check option on + * @param name option name + * @param search_flags combination of AV_OPT_SEARCH_* + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags); + + +#define AV_OPT_SERIALIZE_SKIP_DEFAULTS 0x00000001 ///< Serialize options that are not set to default values only. +#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT 0x00000002 ///< Serialize options that exactly match opt_flags only. + +/** + * Serialize object's options. + * + * Create a string containing object's serialized options. + * Such string may be passed back to av_opt_set_from_string() in order to restore option values. + * A key/value or pairs separator occurring in the serialized value or + * name string are escaped through the av_escape() function. + * + * @param[in] obj AVClass object to serialize + * @param[in] opt_flags serialize options with all the specified flags set (AV_OPT_FLAG) + * @param[in] flags combination of AV_OPT_SERIALIZE_* flags + * @param[out] buffer Pointer to buffer that will be allocated with string containg serialized options. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, + const char key_val_sep, const char pairs_sep); +/** + * @} + */ + +#endif /* AVUTIL_OPT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/parseutils.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/parseutils.h new file mode 100644 index 0000000..e66d24b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/parseutils.h @@ -0,0 +1,193 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PARSEUTILS_H +#define AVUTIL_PARSEUTILS_H + +#include + +#include "rational.h" + +/** + * @file + * misc parsing utilities + */ + +/** + * Parse str and store the parsed ratio in q. + * + * Note that a ratio with infinite (1/0) or negative value is + * considered valid, so you should check on the returned value if you + * want to exclude those values. + * + * The undefined value can be expressed using the "0:0" string. + * + * @param[in,out] q pointer to the AVRational which will contain the ratio + * @param[in] str the string to parse: it has to be a string in the format + * num:den, a float number or an expression + * @param[in] max the maximum allowed numerator and denominator + * @param[in] log_offset log level offset which is applied to the log + * level of log_ctx + * @param[in] log_ctx parent logging context + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_ratio(AVRational *q, const char *str, int max, + int log_offset, void *log_ctx); + +#define av_parse_ratio_quiet(rate, str, max) \ + av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL) + +/** + * Parse str and put in width_ptr and height_ptr the detected values. + * + * @param[in,out] width_ptr pointer to the variable which will contain the detected + * width value + * @param[in,out] height_ptr pointer to the variable which will contain the detected + * height value + * @param[in] str the string to parse: it has to be a string in the format + * width x height or a valid video size abbreviation. + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str); + +/** + * Parse str and store the detected values in *rate. + * + * @param[in,out] rate pointer to the AVRational which will contain the detected + * frame rate + * @param[in] str the string to parse: it has to be a string in the format + * rate_num / rate_den, a float number or a valid video rate abbreviation + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_rate(AVRational *rate, const char *str); + +/** + * Put the RGBA values that correspond to color_string in rgba_color. + * + * @param color_string a string specifying a color. It can be the name of + * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, + * possibly followed by "@" and a string representing the alpha + * component. + * The alpha component may be a string composed by "0x" followed by an + * hexadecimal number or a decimal number between 0.0 and 1.0, which + * represents the opacity value (0x00/0.0 means completely transparent, + * 0xff/1.0 completely opaque). + * If the alpha component is not specified then 0xff is assumed. + * The string "random" will result in a random color. + * @param slen length of the initial part of color_string containing the + * color. It can be set to -1 if color_string is a null terminated string + * containing nothing else than the color. + * @return >= 0 in case of success, a negative value in case of + * failure (for example if color_string cannot be parsed). + */ +int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, + void *log_ctx); + +/** + * Get the name of a color from the internal table of hard-coded named + * colors. + * + * This function is meant to enumerate the color names recognized by + * av_parse_color(). + * + * @param color_idx index of the requested color, starting from 0 + * @param rgbp if not NULL, will point to a 3-elements array with the color value in RGB + * @return the color name string or NULL if color_idx is not in the array + */ +const char *av_get_known_color_name(int color_idx, const uint8_t **rgb); + +/** + * Parse timestr and return in *time a corresponding number of + * microseconds. + * + * @param timeval puts here the number of microseconds corresponding + * to the string in timestr. If the string represents a duration, it + * is the number of microseconds contained in the time interval. If + * the string is a date, is the number of microseconds since 1st of + * January, 1970 up to the time of the parsed date. If timestr cannot + * be successfully parsed, set *time to INT64_MIN. + + * @param timestr a string representing a date or a duration. + * - If a date the syntax is: + * @code + * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m...]]]}|{HHMMSS[.m...]]]}}[Z] + * now + * @endcode + * If the value is "now" it takes the current time. + * Time is local time unless Z is appended, in which case it is + * interpreted as UTC. + * If the year-month-day part is not specified it takes the current + * year-month-day. + * - If a duration the syntax is: + * @code + * [-][HH:]MM:SS[.m...] + * [-]S+[.m...] + * @endcode + * @param duration flag which tells how to interpret timestr, if not + * zero timestr is interpreted as a duration, otherwise as a date + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_parse_time(int64_t *timeval, const char *timestr, int duration); + +/** + * Attempt to find a specific tag in a URL. + * + * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. + * Return 1 if found. + */ +int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); + +/** + * Simplified version of strptime + * + * Parse the input string p according to the format string fmt and + * store its results in the structure dt. + * This implementation supports only a subset of the formats supported + * by the standard strptime(). + * + * The supported input field descriptors are listed below. + * - %H: the hour as a decimal number, using a 24-hour clock, in the + * range '00' through '23' + * - %J: hours as a decimal number, in the range '0' through INT_MAX + * - %M: the minute as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %S: the second as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %Y: the year as a decimal number, using the Gregorian calendar + * - %m: the month as a decimal number, in the range '1' through '12' + * - %d: the day of the month as a decimal number, in the range '1' + * through '31' + * - %T: alias for '%H:%M:%S' + * - %%: a literal '%' + * + * @return a pointer to the first character not processed in this function + * call. In case the input string contains more characters than + * required by the format string the return value points right after + * the last consumed input character. In case the whole input string + * is consumed the return value points to the null byte at the end of + * the string. On failure NULL is returned. + */ +char *av_small_strptime(const char *p, const char *fmt, struct tm *dt); + +/** + * Convert the decomposed UTC time in tm to a time_t value. + */ +time_t av_timegm(struct tm *tm); + +#endif /* AVUTIL_PARSEUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixdesc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixdesc.h new file mode 100644 index 0000000..fc3737c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixdesc.h @@ -0,0 +1,430 @@ +/* + * pixel format descriptor + * Copyright (c) 2009 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_PIXDESC_H +#define AVUTIL_PIXDESC_H + +#include + +#include "attributes.h" +#include "pixfmt.h" +#include "version.h" + +typedef struct AVComponentDescriptor { + /** + * Which of the 4 planes contains the component. + */ + int plane; + + /** + * Number of elements between 2 horizontally consecutive pixels. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int step; + + /** + * Number of elements before the component of the first pixel. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int offset; + + /** + * Number of least significant bits that must be shifted away + * to get the value. + */ + int shift; + + /** + * Number of bits in the component. + */ + int depth; + +#if FF_API_PLUS1_MINUS1 + /** deprecated, use step instead */ + attribute_deprecated int step_minus1; + + /** deprecated, use depth instead */ + attribute_deprecated int depth_minus1; + + /** deprecated, use offset instead */ + attribute_deprecated int offset_plus1; +#endif +} AVComponentDescriptor; + +/** + * Descriptor that unambiguously describes how the bits of a pixel are + * stored in the up to 4 data planes of an image. It also stores the + * subsampling factors and number of components. + * + * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV + * and all the YUV variants) AVPixFmtDescriptor just stores how values + * are stored not what these values represent. + */ +typedef struct AVPixFmtDescriptor { + const char *name; + uint8_t nb_components; ///< The number of components each pixel has, (1-4) + + /** + * Amount to shift the luma width right to find the chroma width. + * For YV12 this is 1 for example. + * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_w; + + /** + * Amount to shift the luma height right to find the chroma height. + * For YV12 this is 1 for example. + * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_h; + + /** + * Combination of AV_PIX_FMT_FLAG_... flags. + */ + uint64_t flags; + + /** + * Parameters that describe how pixels are packed. + * If the format has 1 or 2 components, then luma is 0. + * If the format has 3 or 4 components: + * if the RGB flag is set then 0 is red, 1 is green and 2 is blue; + * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V. + * + * If present, the Alpha channel is always the last component. + */ + AVComponentDescriptor comp[4]; + + /** + * Alternative comma-separated names. + */ + const char *alias; +} AVPixFmtDescriptor; + +/** + * Pixel format is big-endian. + */ +#define AV_PIX_FMT_FLAG_BE (1 << 0) +/** + * Pixel format has a palette in data[1], values are indexes in this palette. + */ +#define AV_PIX_FMT_FLAG_PAL (1 << 1) +/** + * All values of a component are bit-wise packed end to end. + */ +#define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2) +/** + * Pixel format is an HW accelerated format. + */ +#define AV_PIX_FMT_FLAG_HWACCEL (1 << 3) +/** + * At least one pixel component is not in the first data plane. + */ +#define AV_PIX_FMT_FLAG_PLANAR (1 << 4) +/** + * The pixel format contains RGB-like data (as opposed to YUV/grayscale). + */ +#define AV_PIX_FMT_FLAG_RGB (1 << 5) + +/** + * The pixel format is "pseudo-paletted". This means that it contains a + * fixed palette in the 2nd plane but the palette is fixed/constant for each + * PIX_FMT. This allows interpreting the data as if it was PAL8, which can + * in some cases be simpler. Or the data can be interpreted purely based on + * the pixel format without using the palette. + * An example of a pseudo-paletted format is AV_PIX_FMT_GRAY8 + */ +#define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6) + +/** + * The pixel format has an alpha channel. This is set on all formats that + * support alpha in some way. The exception is AV_PIX_FMT_PAL8, which can + * carry alpha as part of the palette. Details are explained in the + * AVPixelFormat enum, and are also encoded in the corresponding + * AVPixFmtDescriptor. + * + * The alpha is always straight, never pre-multiplied. + * + * If a codec or a filter does not support alpha, it should set all alpha to + * opaque, or use the equivalent pixel formats without alpha component, e.g. + * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA. + */ +#define AV_PIX_FMT_FLAG_ALPHA (1 << 7) + +/** + * The pixel format is following a Bayer pattern + */ +#define AV_PIX_FMT_FLAG_BAYER (1 << 8) + +/** + * The pixel format contains IEEE-754 floating point values. Precision (double, + * single, or half) should be determined by the pixel size (64, 32, or 16 bits). + */ +#define AV_PIX_FMT_FLAG_FLOAT (1 << 9) + +/** + * Return the number of bits per pixel used by the pixel format + * described by pixdesc. Note that this is not the same as the number + * of bits per sample. + * + * The returned number of bits refers to the number of bits actually + * used for storing the pixel information, that is padding bits are + * not counted. + */ +int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * Return the number of bits per pixel for the pixel format + * described by pixdesc, including any padding or unused bits. + */ +int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * @return a pixel format descriptor for provided pixel format or NULL if + * this pixel format is unknown. + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt); + +/** + * Iterate over all pixel format descriptors known to libavutil. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev); + +/** + * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc + * is not a valid pointer to a pixel format descriptor. + */ +enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); + +/** + * Utility function to access log2_chroma_w log2_chroma_h from + * the pixel format AVPixFmtDescriptor. + * + * See av_get_chroma_sub_sample() for a function that asserts a + * valid pixel format instead of returning an error code. + * Its recommended that you use avcodec_get_chroma_sub_sample unless + * you do check the return code! + * + * @param[in] pix_fmt the pixel format + * @param[out] h_shift store log2_chroma_w (horizontal/width shift) + * @param[out] v_shift store log2_chroma_h (vertical/height shift) + * + * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format + */ +int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, + int *h_shift, int *v_shift); + +/** + * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a + * valid pixel format. + */ +int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); + +/** + * @return the name for provided color range or NULL if unknown. + */ +const char *av_color_range_name(enum AVColorRange range); + +/** + * @return the AVColorRange value for name or an AVError if not found. + */ +int av_color_range_from_name(const char *name); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the AVColorPrimaries value for name or an AVError if not found. + */ +int av_color_primaries_from_name(const char *name); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the AVColorTransferCharacteristic value for name or an AVError if not found. + */ +int av_color_transfer_from_name(const char *name); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the AVColorSpace value for name or an AVError if not found. + */ +int av_color_space_from_name(const char *name); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * @return the AVChromaLocation value for name or an AVError if not found. + */ +int av_chroma_location_from_name(const char *name); + +/** + * Return the pixel format corresponding to name. + * + * If there is no pixel format with name name, then looks for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first looks for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. + */ +enum AVPixelFormat av_get_pix_fmt(const char *name); + +/** + * Return the short name for a pixel format, NULL in case pix_fmt is + * unknown. + * + * @see av_get_pix_fmt(), av_get_pix_fmt_string() + */ +const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); + +/** + * Print in buf the string corresponding to the pixel format with + * number pix_fmt, or a header if pix_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param pix_fmt the number of the pixel format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + */ +char *av_get_pix_fmt_string(char *buf, int buf_size, + enum AVPixelFormat pix_fmt); + +/** + * Read a line from an image, and write the values of the + * pixel format component c to dst. + * + * @param data the array containing the pointers to the planes of the image + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to read + * @param y the vertical coordinate of the first pixel to read + * @param w the width of the line to read, that is the number of + * values to write to dst + * @param read_pal_component if not zero and the format is a paletted + * format writes the values corresponding to the palette + * component c in data[1] to dst, rather than the palette indexes in + * data[0]. The behavior is undefined if the format is not paletted. + */ +void av_read_image_line(uint16_t *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component); + +/** + * Write the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + */ +void av_write_image_line(const uint16_t *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w); + +/** + * Utility function to swap the endianness of a pixel format. + * + * @param[in] pix_fmt the pixel format + * + * @return pixel format with swapped endianness if it exists, + * otherwise AV_PIX_FMT_NONE + */ +enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt); + +#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */ +#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */ +#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */ +#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */ +#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */ +#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */ + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, + enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +#endif /* AVUTIL_PIXDESC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixelutils.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixelutils.h new file mode 100644 index 0000000..a8dbc15 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/pixelutils.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PIXELUTILS_H +#define AVUTIL_PIXELUTILS_H + +#include +#include +#include "common.h" + +/** + * Sum of abs(src1[x] - src2[x]) + */ +typedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, + const uint8_t *src2, ptrdiff_t stride2); + +/** + * Get a potentially optimized pointer to a Sum-of-absolute-differences + * function (see the av_pixelutils_sad_fn prototype). + * + * @param w_bits 1< + * + * 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 + */ + +#ifndef AVUTIL_PIXFMT_H +#define AVUTIL_PIXFMT_H + +/** + * @file + * pixel format definitions + */ + +#include "libavutil/avconfig.h" +#include "version.h" + +#define AVPALETTE_SIZE 1024 +#define AVPALETTE_COUNT 256 + +/** + * Pixel format. + * + * @note + * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA + * color is put together as: + * (A << 24) | (R << 16) | (G << 8) | B + * This is stored as BGRA on little-endian CPU architectures and ARGB on + * big-endian CPUs. + * + * @note + * If the resolution is not a multiple of the chroma subsampling factor + * then the chroma plane resolution must be rounded up. + * + * @par + * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized + * image data is stored in AVFrame.data[0]. The palette is transported in + * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is + * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is + * also endian-specific). Note also that the individual RGB32 palette + * components stored in AVFrame.data[1] should be in the range 0..255. + * This is important as many custom PAL8 video codecs that were designed + * to run on the IBM VGA graphics adapter use 6-bit palette components. + * + * @par + * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like + * for pal8. This palette is filled in automatically by the function + * allocating the picture. + */ +enum AVPixelFormat { + AV_PIX_FMT_NONE = -1, + AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) + AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... + AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... + AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) + AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) + AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) + AV_PIX_FMT_GRAY8, ///< Y , 8bpp + AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_PAL8, ///< 8 bits with AV_PIX_FMT_RGB32 palette + AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range + AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range + AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range +#if FF_API_XVMC + AV_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing + AV_PIX_FMT_XVMC_MPEG2_IDCT, + AV_PIX_FMT_XVMC = AV_PIX_FMT_XVMC_MPEG2_IDCT, +#endif /* FF_API_XVMC */ + AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 + AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) + AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) + AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) + AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) + AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped + + AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... + AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... + AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... + AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... + + AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian + AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian + AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) + AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range + AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) +#if FF_API_VDPAU + AV_PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers +#endif + AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian + + AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian + AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian + AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined + + AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian + AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian + AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined + +#if FF_API_VAAPI + /** @name Deprecated pixel formats */ + /**@{*/ + AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers + AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers + AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID + /**@}*/ + AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD, +#else + /** + * Hardware acceleration through VA-API, data[3] contains a + * VASurfaceID. + */ + AV_PIX_FMT_VAAPI, +#endif + + AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian +#if FF_API_VDPAU + AV_PIX_FMT_VDPAU_MPEG4, ///< MPEG-4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers +#endif + AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer + + AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha + + AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + + AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian + + /** + * The following 12 formats have the disadvantage of needing 1 format for each bit depth. + * Notice that each 9/10 bits sample is stored in 16 bits with extra padding. + * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. + */ + AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_VDA_VLD, ///< hardware decoding through VDA + AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp + AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP + AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian + AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian + AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian + AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian + AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian + AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) + AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) + AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian + AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian + AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + + AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface + + AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + + AV_PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + AV_PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + + AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + + AV_PIX_FMT_VDA, ///< HW acceleration through VDA, data[3] contains a CVPixelBufferRef + + AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) + AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (little-endian) + + AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp + AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian + AV_PIX_FMT_GBRAP16LE, ///< planar GBRA 4:4:4:4 64bpp, little-endian + /** + * HW acceleration through QSV, data[3] contains a pointer to the + * mfxFrameSurface1 structure. + */ + AV_PIX_FMT_QSV, + /** + * HW acceleration though MMAL, data[3] contains a pointer to the + * MMAL_BUFFER_HEADER_T structure. + */ + AV_PIX_FMT_MMAL, + + AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + + AV_PIX_FMT_0RGB=0x123+4,///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined + AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined + AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined + AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined + + AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big-endian + AV_PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little-endian + AV_PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big-endian + AV_PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little-endian + AV_PIX_FMT_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range + + AV_PIX_FMT_BAYER_BGGR8, ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_RGGB8, ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GBRG8, ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GRBG8, ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */ +#if !FF_API_XVMC + AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing +#endif /* !FF_API_XVMC */ + AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + + AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox + + AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian + + AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian + + AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian + AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian + + AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec + + AV_PIX_FMT_GRAY12BE, ///< Y , 12bpp, big-endian + AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian + AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian + AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian + + AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian + AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian + + /** + * Hardware surfaces for Direct3D11. + * + * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 + * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. + * + * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the + * texture array index of the frame as intptr_t if the ID3D11Texture2D is + * an array texture (or always 0 if it's a normal texture). + */ + AV_PIX_FMT_D3D11, + + AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian + AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian + + AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian + AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian + AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian + AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + + /** + * DRM-managed buffers exposed through PRIME buffer sharing. + * + * data[0] points to an AVDRMFrameDescriptor. + */ + AV_PIX_FMT_DRM_PRIME, + + AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions +}; + +#if AV_HAVE_BIGENDIAN +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be +#else +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le +#endif + +#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA) +#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR) +#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA) +#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB) +#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) +#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) + +#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) +#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) +#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) +#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) +#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) +#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) +#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE) +#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE) +#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE) +#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE) +#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE) +#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE) +#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE) +#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE) +#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE) + +#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE) +#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE) +#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE) +#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE) +#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE) +#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE) +#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE) +#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE) +#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE) +#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE) +#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE) +#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE) +#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE) +#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE) +#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE) +#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE) +#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE) + +#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE) +#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE) +#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) +#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) +#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) +#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) +#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) +#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) + +#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) +#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE) +#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) +#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) + +#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) +#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) + +#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) +#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) +#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) +#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) +#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) +#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) +#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) +#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) +#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) + +#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) +#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) +#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) +#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) +#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) + +/** + * Chromaticity coordinates of the source primaries. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. + */ +enum AVColorPrimaries { + AVCOL_PRI_RESERVED0 = 0, + AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + AVCOL_PRI_UNSPECIFIED = 2, + AVCOL_PRI_RESERVED = 3, + AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above + AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C + AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 + AVCOL_PRI_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + AVCOL_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors + AVCOL_PRI_NB ///< Not part of ABI +}; + +/** + * Color Transfer Characteristic. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. + */ +enum AVColorTransferCharacteristic { + AVCOL_TRC_RESERVED0 = 0, + AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED = 2, + AVCOL_TRC_RESERVED = 3, + AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC + AVCOL_TRC_SMPTE240M = 7, + AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics" + AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" + AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" + AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 + AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut + AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) + AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10-bit system + AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12-bit system + AVCOL_TRC_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, + AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI +}; + +/** + * YUV colorspace type. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. + */ +enum AVColorSpace { + AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) + AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + AVCOL_SPC_UNSPECIFIED = 2, + AVCOL_SPC_RESERVED = 3, + AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_SPC_SMPTE240M = 7, ///< functionally identical to above + AVCOL_SPC_YCGCO = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, + AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system + AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system + AVCOL_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + AVCOL_SPC_NB ///< Not part of ABI +}; + +/** + * MPEG vs JPEG YUV range. + */ +enum AVColorRange { + AVCOL_RANGE_UNSPECIFIED = 0, + AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges + AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges + AVCOL_RANGE_NB ///< Not part of ABI +}; + +/** + * Location of chroma samples. + * + * Illustration showing the location of the first (top left) chroma sample of the + * image, the left shows only luma, the right + * shows the location of the chroma sample, the 2 could be imagined to overlay + * each other but are drawn separately due to limitations of ASCII + * + * 1st 2nd 1st 2nd horizontal luma sample positions + * v v v v + * ______ ______ + *1st luma line > |X X ... |3 4 X ... X are luma samples, + * | |1 2 1-6 are possible chroma positions + *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position + */ +enum AVChromaLocation { + AVCHROMA_LOC_UNSPECIFIED = 0, + AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 + AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 + AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 + AVCHROMA_LOC_TOP = 4, + AVCHROMA_LOC_BOTTOMLEFT = 5, + AVCHROMA_LOC_BOTTOM = 6, + AVCHROMA_LOC_NB ///< Not part of ABI +}; + +#endif /* AVUTIL_PIXFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/random_seed.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/random_seed.h new file mode 100644 index 0000000..0462a04 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/random_seed.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009 Baptiste Coudurier + * + * 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 + */ + +#ifndef AVUTIL_RANDOM_SEED_H +#define AVUTIL_RANDOM_SEED_H + +#include +/** + * @addtogroup lavu_crypto + * @{ + */ + +/** + * Get a seed to use in conjunction with random functions. + * This function tries to provide a good seed at a best effort bases. + * Its possible to call this function multiple times if more bits are needed. + * It can be quite slow, which is why it should only be used as seed for a faster + * PRNG. The quality of the seed depends on the platform. + */ +uint32_t av_get_random_seed(void); + +/** + * @} + */ + +#endif /* AVUTIL_RANDOM_SEED_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rational.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rational.h new file mode 100644 index 0000000..5c6b67b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rational.h @@ -0,0 +1,214 @@ +/* + * rational numbers + * Copyright (c) 2003 Michael Niedermayer + * + * 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 + * @ingroup lavu_math_rational + * Utilties for rational number calculation. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_RATIONAL_H +#define AVUTIL_RATIONAL_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_math_rational AVRational + * @ingroup lavu_math + * Rational number calculation. + * + * While rational numbers can be expressed as floating-point numbers, the + * conversion process is a lossy one, so are floating-point operations. On the + * other hand, the nature of FFmpeg demands highly accurate calculation of + * timestamps. This set of rational number utilities serves as a generic + * interface for manipulating rational numbers as pairs of numerators and + * denominators. + * + * Many of the functions that operate on AVRational's have the suffix `_q`, in + * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * rational numbers. + * + * @{ + */ + +/** + * Rational number (pair of numerator and denominator). + */ +typedef struct AVRational{ + int num; ///< Numerator + int den; ///< Denominator +} AVRational; + +/** + * Create an AVRational. + * + * Useful for compilers that do not support compound literals. + * + * @note The return value is not reduced. + * @see av_reduce() + */ +static inline AVRational av_make_q(int num, int den) +{ + AVRational r = { num, den }; + return r; +} + +/** + * Compare two rationals. + * + * @param a First rational + * @param b Second rational + * + * @return One of the following values: + * - 0 if `a == b` + * - 1 if `a > b` + * - -1 if `a < b` + * - `INT_MIN` if one of the values is of the form `0 / 0` + */ +static inline int av_cmp_q(AVRational a, AVRational b){ + const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; + + if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1; + else if(b.den && a.den) return 0; + else if(a.num && b.num) return (a.num>>31) - (b.num>>31); + else return INT_MIN; +} + +/** + * Convert an AVRational to a `double`. + * @param a AVRational to convert + * @return `a` in floating-point form + * @see av_d2q() + */ +static inline double av_q2d(AVRational a){ + return a.num / (double) a.den; +} + +/** + * Reduce a fraction. + * + * This is useful for framerate calculations. + * + * @param[out] dst_num Destination numerator + * @param[out] dst_den Destination denominator + * @param[in] num Source numerator + * @param[in] den Source denominator + * @param[in] max Maximum allowed values for `dst_num` & `dst_den` + * @return 1 if the operation is exact, 0 otherwise + */ +int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); + +/** + * Multiply two rationals. + * @param b First rational + * @param c Second rational + * @return b*c + */ +AVRational av_mul_q(AVRational b, AVRational c) av_const; + +/** + * Divide one rational by another. + * @param b First rational + * @param c Second rational + * @return b/c + */ +AVRational av_div_q(AVRational b, AVRational c) av_const; + +/** + * Add two rationals. + * @param b First rational + * @param c Second rational + * @return b+c + */ +AVRational av_add_q(AVRational b, AVRational c) av_const; + +/** + * Subtract one rational from another. + * @param b First rational + * @param c Second rational + * @return b-c + */ +AVRational av_sub_q(AVRational b, AVRational c) av_const; + +/** + * Invert a rational. + * @param q value + * @return 1 / q + */ +static av_always_inline AVRational av_inv_q(AVRational q) +{ + AVRational r = { q.den, q.num }; + return r; +} + +/** + * Convert a double precision floating point number to a rational. + * + * In case of infinity, the returned value is expressed as `{1, 0}` or + * `{-1, 0}` depending on the sign. + * + * @param d `double` to convert + * @param max Maximum allowed numerator and denominator + * @return `d` in AVRational form + * @see av_q2d() + */ +AVRational av_d2q(double d, int max) av_const; + +/** + * Find which of the two rationals is closer to another rational. + * + * @param q Rational to be compared against + * @param q1,q2 Rationals to be tested + * @return One of the following values: + * - 1 if `q1` is nearer to `q` than `q2` + * - -1 if `q2` is nearer to `q` than `q1` + * - 0 if they have the same distance + */ +int av_nearer_q(AVRational q, AVRational q1, AVRational q2); + +/** + * Find the value in a list of rationals nearest a given reference rational. + * + * @param q Reference rational + * @param q_list Array of rationals terminated by `{0, 0}` + * @return Index of the nearest value found in the array + */ +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); + +/** + * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point + * format. + * + * @param q Rational to be converted + * @return Equivalent floating-point value, expressed as an unsigned 32-bit + * integer. + * @note The returned value is platform-indepedant. + */ +uint32_t av_q2intfloat(AVRational q); + +/** + * @} + */ + +#endif /* AVUTIL_RATIONAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rc4.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rc4.h new file mode 100644 index 0000000..029cd2a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/rc4.h @@ -0,0 +1,66 @@ +/* + * RC4 encryption/decryption/pseudo-random number generator + * + * 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 + */ + +#ifndef AVUTIL_RC4_H +#define AVUTIL_RC4_H + +#include + +/** + * @defgroup lavu_rc4 RC4 + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVRC4 { + uint8_t state[256]; + int x, y; +} AVRC4; + +/** + * Allocate an AVRC4 context. + */ +AVRC4 *av_rc4_alloc(void); + +/** + * @brief Initializes an AVRC4 context. + * + * @param key_bits must be a multiple of 8 + * @param decrypt 0 for encryption, 1 for decryption, currently has no effect + * @return zero on success, negative value otherwise + */ +int av_rc4_init(struct AVRC4 *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the RC4 algorithm. + * + * @param count number of bytes + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst, may be NULL + * @param iv not (yet) used for RC4, should be NULL + * @param decrypt 0 for encryption, 1 for decryption, not (yet) used + */ +void av_rc4_crypt(struct AVRC4 *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_RC4_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/replaygain.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/replaygain.h new file mode 100644 index 0000000..b49bf1a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/replaygain.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVUTIL_REPLAYGAIN_H +#define AVUTIL_REPLAYGAIN_H + +#include + +/** + * ReplayGain information (see + * http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification). + * The size of this struct is a part of the public ABI. + */ +typedef struct AVReplayGain { + /** + * Track replay gain in microbels (divide by 100000 to get the value in dB). + * Should be set to INT32_MIN when unknown. + */ + int32_t track_gain; + /** + * Peak track amplitude, with 100000 representing full scale (but values + * may overflow). 0 when unknown. + */ + uint32_t track_peak; + /** + * Same as track_gain, but for the whole album. + */ + int32_t album_gain; + /** + * Same as track_peak, but for the whole album, + */ + uint32_t album_peak; +} AVReplayGain; + +#endif /* AVUTIL_REPLAYGAIN_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ripemd.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ripemd.h new file mode 100644 index 0000000..6d6bb32 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/ripemd.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_ripemd + * Public header for RIPEMD hash function implementation. + */ + +#ifndef AVUTIL_RIPEMD_H +#define AVUTIL_RIPEMD_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_ripemd RIPEMD + * @ingroup lavu_hash + * RIPEMD hash function implementation. + * + * @{ + */ + +extern const int av_ripemd_size; + +struct AVRIPEMD; + +/** + * Allocate an AVRIPEMD context. + */ +struct AVRIPEMD *av_ripemd_alloc(void); + +/** + * Initialize RIPEMD hashing. + * + * @param context pointer to the function context (of size av_ripemd_size) + * @param bits number of bits in digest (128, 160, 256 or 320 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_ripemd_init(struct AVRIPEMD* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, unsigned int len); + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_ripemd_final(struct AVRIPEMD* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_RIPEMD_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/samplefmt.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/samplefmt.h new file mode 100644 index 0000000..8cd43ae --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/samplefmt.h @@ -0,0 +1,272 @@ +/* + * 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 + */ + +#ifndef AVUTIL_SAMPLEFMT_H +#define AVUTIL_SAMPLEFMT_H + +#include + +#include "avutil.h" +#include "attributes.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_sampfmts Audio sample formats + * + * Audio sample format enumeration and related convenience functions. + * @{ + */ + +/** + * Audio sample formats + * + * - The data described by the sample format is always in native-endian order. + * Sample values can be expressed by native C types, hence the lack of a signed + * 24-bit sample format even though it is a common raw audio data format. + * + * - The floating-point formats are based on full volume being in the range + * [-1.0, 1.0]. Any values outside this range are beyond full volume level. + * + * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg + * (such as AVFrame in libavcodec) is as follows: + * + * @par + * For planar sample formats, each audio channel is in a separate data plane, + * and linesize is the buffer size, in bytes, for a single plane. All data + * planes must be the same size. For packed sample formats, only the first data + * plane is used, and samples for each channel are interleaved. In this case, + * linesize is the buffer size, in bytes, for the 1 plane. + * + */ +enum AVSampleFormat { + AV_SAMPLE_FMT_NONE = -1, + AV_SAMPLE_FMT_U8, ///< unsigned 8 bits + AV_SAMPLE_FMT_S16, ///< signed 16 bits + AV_SAMPLE_FMT_S32, ///< signed 32 bits + AV_SAMPLE_FMT_FLT, ///< float + AV_SAMPLE_FMT_DBL, ///< double + + AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar + AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar + AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar + AV_SAMPLE_FMT_FLTP, ///< float, planar + AV_SAMPLE_FMT_DBLP, ///< double, planar + AV_SAMPLE_FMT_S64, ///< signed 64 bits + AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar + + AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically +}; + +/** + * Return the name of sample_fmt, or NULL if sample_fmt is not + * recognized. + */ +const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); + +/** + * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE + * on error. + */ +enum AVSampleFormat av_get_sample_fmt(const char *name); + +/** + * Return the planar<->packed alternative form of the given sample format, or + * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the + * requested planar/packed format, the format returned is the same as the + * input. + */ +enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); + +/** + * Get the packed alternative form of the given sample format. + * + * If the passed sample_fmt is already in packed format, the format returned is + * the same as the input. + * + * @return the packed alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Get the planar alternative form of the given sample format. + * + * If the passed sample_fmt is already in planar format, the format returned is + * the same as the input. + * + * @return the planar alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Generate a string corresponding to the sample format with + * sample_fmt, or a header if sample_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param sample_fmt the number of the sample format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + * @return the pointer to the filled buffer or NULL if sample_fmt is + * unknown or in case of other errors + */ +char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); + +/** + * Return number of bytes per sample. + * + * @param sample_fmt the sample format + * @return number of bytes per sample or zero if unknown for the given + * sample format + */ +int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); + +/** + * Check if the sample format is planar. + * + * @param sample_fmt the sample format to inspect + * @return 1 if the sample format is planar, 0 if it is interleaved + */ +int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); + +/** + * Get the required buffer size for the given audio parameters. + * + * @param[out] linesize calculated linesize, may be NULL + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return required buffer size, or negative error code on failure + */ +int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * @} + * + * @defgroup lavu_sampmanip Samples manipulation + * + * Functions that manipulate audio samples + * @{ + */ + +/** + * Fill plane data pointers and linesize for samples with sample + * format sample_fmt. + * + * The audio_data array is filled with the pointers to the samples data planes: + * for planar, set the start point of each channel's data within the buffer, + * for packed, set the start point of the entire buffer only. + * + * The value pointed to by linesize is set to the aligned size of each + * channel's data buffer for planar layout, or to the aligned size of the + * buffer for all channels for packed layout. + * + * The buffer in buf must be big enough to contain all the samples + * (use av_samples_get_buffer_size() to compute its minimum size), + * otherwise the audio_data pointers will point to invalid data. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize calculated linesize, may be NULL + * @param buf the pointer to a buffer containing the samples + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return minimum size in bytes required for the buffer in case + * of success at the next bump + */ +int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, + const uint8_t *buf, + int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a samples buffer for nb_samples samples, and fill data pointers and + * linesize accordingly. + * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) + * Allocated data will be initialized to silence. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize aligned size for audio buffer(s), may be NULL + * @param nb_channels number of audio channels + * @param nb_samples number of samples per channel + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return the size of the allocated buffer in case of success at the next bump + * @see av_samples_fill_arrays() + * @see av_samples_alloc_array_and_samples() + */ +int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a data pointers array, samples buffer for nb_samples + * samples, and fill data pointers and linesize accordingly. + * + * This is the same as av_samples_alloc(), but also allocates the data + * pointers array. + * + * @see av_samples_alloc() + */ +int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Copy samples from src to dst. + * + * @param dst destination array of pointers to data planes + * @param src source array of pointers to data planes + * @param dst_offset offset in samples at which the data will be written to dst + * @param src_offset offset in samples at which the data will be read from src + * @param nb_samples number of samples to be copied + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, + int src_offset, int nb_samples, int nb_channels, + enum AVSampleFormat sample_fmt); + +/** + * Fill an audio buffer with silence. + * + * @param audio_data array of pointers to data planes + * @param offset offset in samples at which to start filling + * @param nb_samples number of samples to fill + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, + int nb_channels, enum AVSampleFormat sample_fmt); + +/** + * @} + * @} + */ +#endif /* AVUTIL_SAMPLEFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha.h new file mode 100644 index 0000000..c0180e5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * + * 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 + * @ingroup lavu_sha + * Public header for SHA-1 & SHA-256 hash function implementations. + */ + +#ifndef AVUTIL_SHA_H +#define AVUTIL_SHA_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha SHA + * @ingroup lavu_hash + * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA hash functions: + * + * - SHA-1: 160 bits + * - SHA-224: 224 bits, as a variant of SHA-2 + * - SHA-256: 256 bits, as a variant of SHA-2 + * + * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512. + * + * @{ + */ + +extern const int av_sha_size; + +struct AVSHA; + +/** + * Allocate an AVSHA context. + */ +struct AVSHA *av_sha_alloc(void); + +/** + * Initialize SHA-1 or SHA-2 hashing. + * + * @param context pointer to the function context (of size av_sha_size) + * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha_init(struct AVSHA* context, int bits); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, unsigned int len); +#else +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha_final(struct AVSHA* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha512.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha512.h new file mode 100644 index 0000000..bef714b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/sha512.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_sha512 + * Public header for SHA-512 implementation. + */ + +#ifndef AVUTIL_SHA512_H +#define AVUTIL_SHA512_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha512 SHA-512 + * @ingroup lavu_hash + * SHA-512 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA-2 hash functions: + * + * - SHA-512/224: 224 bits + * - SHA-512/256: 256 bits + * - SHA-384: 384 bits + * - SHA-512: 512 bits + * + * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha. + * + * @{ + */ + +extern const int av_sha512_size; + +struct AVSHA512; + +/** + * Allocate an AVSHA512 context. + */ +struct AVSHA512 *av_sha512_alloc(void); + +/** + * Initialize SHA-2 512 hashing. + * + * @param context pointer to the function context (of size av_sha512_size) + * @param bits number of bits in digest (224, 256, 384 or 512 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha512_init(struct AVSHA512* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, unsigned int len); +#else +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha512_final(struct AVSHA512* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA512_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/spherical.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/spherical.h new file mode 100644 index 0000000..cef759c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/spherical.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016 Vittorio Giovara + * + * 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 + * Spherical video + */ + +#ifndef AVUTIL_SPHERICAL_H +#define AVUTIL_SPHERICAL_H + +#include +#include + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_spherical Spherical video mapping + * @{ + */ + +/** + * @addtogroup lavu_video_spherical + * A spherical video file contains surfaces that need to be mapped onto a + * sphere. Depending on how the frame was converted, a different distortion + * transformation or surface recomposition function needs to be applied before + * the video should be mapped and displayed. + */ + +/** + * Projection of the video surface(s) on a sphere. + */ +enum AVSphericalProjection { + /** + * Video represents a sphere mapped on a flat surface using + * equirectangular projection. + */ + AV_SPHERICAL_EQUIRECTANGULAR, + + /** + * Video frame is split into 6 faces of a cube, and arranged on a + * 3x2 layout. Faces are oriented upwards for the front, left, right, + * and back faces. The up face is oriented so the top of the face is + * forwards and the down face is oriented so the top of the face is + * to the back. + */ + AV_SPHERICAL_CUBEMAP, + + /** + * Video represents a portion of a sphere mapped on a flat surface + * using equirectangular projection. The @ref bounding fields indicate + * the position of the current video in a larger surface. + */ + AV_SPHERICAL_EQUIRECTANGULAR_TILE, +}; + +/** + * This structure describes how to handle spherical videos, outlining + * information about projection, initial layout, and any other view modifier. + * + * @note The struct must be allocated with av_spherical_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVSphericalMapping { + /** + * Projection type. + */ + enum AVSphericalProjection projection; + + /** + * @name Initial orientation + * @{ + * There fields describe additional rotations applied to the sphere after + * the video frame is mapped onto it. The sphere is rotated around the + * viewer, who remains stationary. The order of transformation is always + * yaw, followed by pitch, and finally by roll. + * + * The coordinate system matches the one defined in OpenGL, where the + * forward vector (z) is coming out of screen, and it is equivalent to + * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll). + * + * A positive yaw rotates the portion of the sphere in front of the viewer + * toward their right. A positive pitch rotates the portion of the sphere + * in front of the viewer upwards. A positive roll tilts the portion of + * the sphere in front of the viewer to the viewer's right. + * + * These values are exported as 16.16 fixed point. + * + * See this equirectangular projection as example: + * + * @code{.unparsed} + * Yaw + * -180 0 180 + * 90 +-------------+-------------+ 180 + * | | | up + * P | | | y| forward + * i | ^ | | /z + * t 0 +-------------X-------------+ 0 Roll | / + * c | | | | / + * h | | | 0|/_____right + * | | | x + * -90 +-------------+-------------+ -180 + * + * X - the default camera center + * ^ - the default up vector + * @endcode + */ + int32_t yaw; ///< Rotation around the up vector [-180, 180]. + int32_t pitch; ///< Rotation around the right vector [-90, 90]. + int32_t roll; ///< Rotation around the forward vector [-180, 180]. + /** + * @} + */ + + /** + * @name Bounding rectangle + * @anchor bounding + * @{ + * These fields indicate the location of the current tile, and where + * it should be mapped relative to the original surface. They are + * exported as 0.32 fixed point, and can be converted to classic + * pixel values with av_spherical_bounds(). + * + * @code{.unparsed} + * +----------------+----------+ + * | |bound_top | + * | +--------+ | + * | bound_left |tile | | + * +<---------->| |<--->+bound_right + * | +--------+ | + * | | | + * | bound_bottom| | + * +----------------+----------+ + * @endcode + * + * If needed, the original video surface dimensions can be derived + * by adding the current stream or frame size to the related bounds, + * like in the following example: + * + * @code{c} + * original_width = tile->width + bound_left + bound_right; + * original_height = tile->height + bound_top + bound_bottom; + * @endcode + * + * @note These values are valid only for the tiled equirectangular + * projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE), + * and should be ignored in all other cases. + */ + uint32_t bound_left; ///< Distance from the left edge + uint32_t bound_top; ///< Distance from the top edge + uint32_t bound_right; ///< Distance from the right edge + uint32_t bound_bottom; ///< Distance from the bottom edge + /** + * @} + */ + + /** + * Number of pixels to pad from the edge of each cube face. + * + * @note This value is valid for only for the cubemap projection type + * (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other + * cases. + */ + uint32_t padding; +} AVSphericalMapping; + +/** + * Allocate a AVSphericalVideo structure and initialize its fields to default + * values. + * + * @return the newly allocated struct or NULL on failure + */ +AVSphericalMapping *av_spherical_alloc(size_t *size); + +/** + * Convert the @ref bounding fields from an AVSphericalVideo + * from 0.32 fixed point to pixels. + * + * @param map The AVSphericalVideo map to read bound values from. + * @param width Width of the current frame or stream. + * @param height Height of the current frame or stream. + * @param left Pixels from the left edge. + * @param top Pixels from the top edge. + * @param right Pixels from the right edge. + * @param bottom Pixels from the bottom edge. + */ +void av_spherical_tile_bounds(const AVSphericalMapping *map, + size_t width, size_t height, + size_t *left, size_t *top, + size_t *right, size_t *bottom); + +/** + * Provide a human-readable name of a given AVSphericalProjection. + * + * @param projection The input AVSphericalProjection. + * + * @return The name of the AVSphericalProjection, or "unknown". + */ +const char *av_spherical_projection_name(enum AVSphericalProjection projection); + +/** + * Get the AVSphericalProjection form a human-readable name. + * + * @param name The input string. + * + * @return The AVSphericalProjection value, or -1 if not found. + */ +int av_spherical_from_name(const char *name); +/** + * @} + * @} + */ + +#endif /* AVUTIL_SPHERICAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/stereo3d.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/stereo3d.h new file mode 100644 index 0000000..54f4c4c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/stereo3d.h @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2013 Vittorio Giovara + * + * 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 + * Stereoscopic video + */ + +#ifndef AVUTIL_STEREO3D_H +#define AVUTIL_STEREO3D_H + +#include + +#include "frame.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_stereo3d Stereo3D types and functions + * @{ + */ + +/** + * @addtogroup lavu_video_stereo3d + * A stereoscopic video file consists in multiple views embedded in a single + * frame, usually describing two views of a scene. This file describes all + * possible codec-independent view arrangements. + * */ + +/** + * List of possible 3D Types + */ +enum AVStereo3DType { + /** + * Video is not stereoscopic (and metadata has to be there). + */ + AV_STEREO3D_2D, + + /** + * Views are next to each other. + * + * @code{.unparsed} + * LLLLRRRR + * LLLLRRRR + * LLLLRRRR + * ... + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE, + + /** + * Views are on top of each other. + * + * @code{.unparsed} + * LLLLLLLL + * LLLLLLLL + * RRRRRRRR + * RRRRRRRR + * @endcode + */ + AV_STEREO3D_TOPBOTTOM, + + /** + * Views are alternated temporally. + * + * @code{.unparsed} + * frame0 frame1 frame2 ... + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * ... ... ... + * @endcode + */ + AV_STEREO3D_FRAMESEQUENCE, + + /** + * Views are packed in a checkerboard-like structure per pixel. + * + * @code{.unparsed} + * LRLRLRLR + * RLRLRLRL + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_CHECKERBOARD, + + /** + * Views are next to each other, but when upscaling + * apply a checkerboard pattern. + * + * @code{.unparsed} + * LLLLRRRR L L L L R R R R + * LLLLRRRR => L L L L R R R R + * LLLLRRRR L L L L R R R R + * LLLLRRRR L L L L R R R R + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE_QUINCUNX, + + /** + * Views are packed per line, as if interlaced. + * + * @code{.unparsed} + * LLLLLLLL + * RRRRRRRR + * LLLLLLLL + * ... + * @endcode + */ + AV_STEREO3D_LINES, + + /** + * Views are packed per column. + * + * @code{.unparsed} + * LRLRLRLR + * LRLRLRLR + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_COLUMNS, +}; + + +/** + * Inverted views, Right/Bottom represents the left view. + */ +#define AV_STEREO3D_FLAG_INVERT (1 << 0) + +/** + * Stereo 3D type: this structure describes how two videos are packed + * within a single video surface, with additional information as needed. + * + * @note The struct must be allocated with av_stereo3d_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVStereo3D { + /** + * How views are packed within the video. + */ + enum AVStereo3DType type; + + /** + * Additional information about the frame packing. + */ + int flags; +} AVStereo3D; + +/** + * Allocate an AVStereo3D structure and set its fields to default values. + * The resulting struct can be freed using av_freep(). + * + * @return An AVStereo3D filled with default values or NULL on failure. + */ +AVStereo3D *av_stereo3d_alloc(void); + +/** + * Allocate a complete AVFrameSideData and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVStereo3D structure to be filled by caller. + */ +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); + +/** + * Provide a human-readable name of a given stereo3d type. + * + * @param type The input stereo3d type value. + * + * @return The name of the stereo3d value, or "unknown". + */ +const char *av_stereo3d_type_name(unsigned int type); + +/** + * Get the AVStereo3DType form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DType value, or -1 if not found. + */ +int av_stereo3d_from_name(const char *name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_STEREO3D_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tea.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tea.h new file mode 100644 index 0000000..dd929bd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tea.h @@ -0,0 +1,71 @@ +/* + * A 32-bit implementation of the TEA algorithm + * Copyright (c) 2015 Vesselin Bontchev + * + * 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 + */ + +#ifndef AVUTIL_TEA_H +#define AVUTIL_TEA_H + +#include + +/** + * @file + * @brief Public header for libavutil TEA algorithm + * @defgroup lavu_tea TEA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_tea_size; + +struct AVTEA; + +/** + * Allocate an AVTEA context + * To free the struct: av_free(ptr) + */ +struct AVTEA *av_tea_alloc(void); + +/** + * Initialize an AVTEA context. + * + * @param ctx an AVTEA context + * @param key a key of 16 bytes used for encryption/decryption + * @param rounds the number of rounds in TEA (64 is the "standard") + */ +void av_tea_init(struct AVTEA *ctx, const uint8_t key[16], int rounds); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_tea_crypt(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_TEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/threadmessage.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/threadmessage.h new file mode 100644 index 0000000..8480a0a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/threadmessage.h @@ -0,0 +1,107 @@ +/* + * 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 + */ + +#ifndef AVUTIL_THREADMESSAGE_H +#define AVUTIL_THREADMESSAGE_H + +typedef struct AVThreadMessageQueue AVThreadMessageQueue; + +typedef enum AVThreadMessageFlags { + + /** + * Perform non-blocking operation. + * If this flag is set, send and recv operations are non-blocking and + * return AVERROR(EAGAIN) immediately if they can not proceed. + */ + AV_THREAD_MESSAGE_NONBLOCK = 1, + +} AVThreadMessageFlags; + +/** + * Allocate a new message queue. + * + * @param mq pointer to the message queue + * @param nelem maximum number of elements in the queue + * @param elsize size of each element in the queue + * @return >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if + * lavu was built without thread support + */ +int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, + unsigned nelem, + unsigned elsize); + +/** + * Free a message queue. + * + * The message queue must no longer be in use by another thread. + */ +void av_thread_message_queue_free(AVThreadMessageQueue **mq); + +/** + * Send a message on the queue. + */ +int av_thread_message_queue_send(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Receive a message from the queue. + */ +int av_thread_message_queue_recv(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Set the sending error code. + * + * If the error code is set to non-zero, av_thread_message_queue_send() will + * return it immediately. Conventional values, such as AVERROR_EOF or + * AVERROR(EAGAIN), can be used to cause the sending thread to stop or + * suspend its operation. + */ +void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, + int err); + +/** + * Set the receiving error code. + * + * If the error code is set to non-zero, av_thread_message_queue_recv() will + * return it immediately when there are no longer available messages. + * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used + * to cause the receiving thread to stop or suspend its operation. + */ +void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, + int err); + +/** + * Set the optional free message callback function which will be called if an + * operation is removing messages from the queue. + */ +void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, + void (*free_func)(void *msg)); + +/** + * Flush the message queue + * + * This function is mostly equivalent to reading and free-ing every message + * except that it will be done in a single operation (no lock/unlock between + * reads). + */ +void av_thread_message_flush(AVThreadMessageQueue *mq); + +#endif /* AVUTIL_THREADMESSAGE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/time.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/time.h new file mode 100644 index 0000000..dc169b0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/time.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2000-2003 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 + */ + +#ifndef AVUTIL_TIME_H +#define AVUTIL_TIME_H + +#include + +/** + * Get the current time in microseconds. + */ +int64_t av_gettime(void); + +/** + * Get the current time in microseconds since some unspecified starting point. + * On platforms that support it, the time comes from a monotonic clock + * This property makes this time source ideal for measuring relative time. + * The returned values may not be monotonic on platforms where a monotonic + * clock is not available. + */ +int64_t av_gettime_relative(void); + +/** + * Indicates with a boolean result if the av_gettime_relative() time source + * is monotonic. + */ +int av_gettime_relative_is_monotonic(void); + +/** + * Sleep for a period of time. Although the duration is expressed in + * microseconds, the actual delay may be rounded to the precision of the + * system timer. + * + * @param usec Number of microseconds to sleep. + * @return zero on success or (negative) error code. + */ +int av_usleep(unsigned usec); + +#endif /* AVUTIL_TIME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timecode.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timecode.h new file mode 100644 index 0000000..37c1361 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timecode.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier + * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch + * + * 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 + * Timecode helpers header + */ + +#ifndef AVUTIL_TIMECODE_H +#define AVUTIL_TIMECODE_H + +#include +#include "rational.h" + +#define AV_TIMECODE_STR_SIZE 23 + +enum AVTimecodeFlag { + AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame + AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours + AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed +}; + +typedef struct { + int start; ///< timecode frame start (first base frame number) + uint32_t flags; ///< flags such as drop frame, +24 hours support, ... + AVRational rate; ///< frame rate in rational form + unsigned fps; ///< frame per second; must be consistent with the rate field +} AVTimecode; + +/** + * Adjust frame number for NTSC drop frame time code. + * + * @param framenum frame number to adjust + * @param fps frame per second, 30 or 60 + * @return adjusted frame number + * @warning adjustment is only valid in NTSC 29.97 and 59.94 + */ +int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); + +/** + * Convert frame number to SMPTE 12M binary representation. + * + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the SMPTE binary representation + * + * @note Frame number adjustment is automatically done in case of drop timecode, + * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). + * @note The frame number is relative to tc->start. + * @note Color frame (CF), binary group flags (BGF) and biphase mark polarity + * correction (PC) bits are set to zero. + */ +uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); + +/** + * Load timecode string in buf. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the buf parameter + * + * @note Timecode representation can be a negative timecode and have more than + * 24 hours, but will only be honored if the flags are correctly set. + * @note The frame number is relative to tc->start. + */ +char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum); + +/** + * Get the timecode string from the SMPTE timecode format. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tcsmpte the 32-bit SMPTE timecode + * @param prevent_df prevent the use of a drop flag when it is known the DF bit + * is arbitrary + * @return the buf parameter + */ +char *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df); + +/** + * Get the timecode string from the 25-bit timecode format (MPEG GOP format). + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc25bit the 25-bits timecode + * @return the buf parameter + */ +char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit); + +/** + * Init a timecode struct with the passed parameters. + * + * @param log_ctx a pointer to an arbitrary struct of which the first field + * is a pointer to an AVClass struct (used for av_log) + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param flags miscellaneous flags such as drop frame, +24 hours, ... + * (see AVTimecodeFlag) + * @param frame_start the first frame number + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); + +/** + * Parse timecode representation (hh:mm:ss[:;.]ff). + * + * @param log_ctx a pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct (used for av_log). + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param str timecode string which will determine the frame start + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); + +/** + * Check if the timecode feature is available for the given frame rate + * + * @return 0 if supported, <0 otherwise + */ +int av_timecode_check_frame_rate(AVRational rate); + +#endif /* AVUTIL_TIMECODE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timestamp.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timestamp.h new file mode 100644 index 0000000..e082f01 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/timestamp.h @@ -0,0 +1,78 @@ +/* + * 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 + * timestamp utils, mostly useful for debugging/logging purposes + */ + +#ifndef AVUTIL_TIMESTAMP_H +#define AVUTIL_TIMESTAMP_H + +#include "common.h" + +#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) +#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS +#endif + +#define AV_TS_MAX_STRING_SIZE 32 + +/** + * Fill the provided buffer with a string containing a timestamp + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @return the buffer in input + */ +static inline char *av_ts_make_string(char *buf, int64_t ts) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) + +/** + * Fill the provided buffer with a string containing a timestamp time + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @param tb the timebase of the timestamp + * @return the buffer in input + */ +static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb) + +#endif /* AVUTIL_TIMESTAMP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tree.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tree.h new file mode 100644 index 0000000..d5e0aeb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/tree.h @@ -0,0 +1,138 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * A tree container. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_TREE_H +#define AVUTIL_TREE_H + +#include "attributes.h" +#include "version.h" + +/** + * @addtogroup lavu_tree AVTree + * @ingroup lavu_data + * + * Low-complexity tree container + * + * Insertion, removal, finding equal, largest which is smaller than and + * smallest which is larger than, all have O(log n) worst-case complexity. + * @{ + */ + + +struct AVTreeNode; +extern const int av_tree_node_size; + +/** + * Allocate an AVTreeNode. + */ +struct AVTreeNode *av_tree_node_alloc(void); + +/** + * Find an element. + * @param root a pointer to the root node of the tree + * @param next If next is not NULL, then next[0] will contain the previous + * element and next[1] the next element. If either does not exist, + * then the corresponding entry in next is unchanged. + * @param cmp compare function used to compare elements in the tree, + * API identical to that of Standard C's qsort + * It is guaranteed that the first and only the first argument to cmp() + * will be the key parameter to av_tree_find(), thus it could if the + * user wants, be a different type (like an opaque context). + * @return An element with cmp(key, elem) == 0 or NULL if no such element + * exists in the tree. + */ +void *av_tree_find(const struct AVTreeNode *root, void *key, + int (*cmp)(const void *key, const void *b), void *next[2]); + +/** + * Insert or remove an element. + * + * If *next is NULL, then the supplied element will be removed if it exists. + * If *next is non-NULL, then the supplied element will be inserted, unless + * it already exists in the tree. + * + * @param rootp A pointer to a pointer to the root node of the tree; note that + * the root node can change during insertions, this is required + * to keep the tree balanced. + * @param key pointer to the element key to insert in the tree + * @param next Used to allocate and free AVTreeNodes. For insertion the user + * must set it to an allocated and zeroed object of at least + * av_tree_node_size bytes size. av_tree_insert() will set it to + * NULL if it has been consumed. + * For deleting elements *next is set to NULL by the user and + * av_tree_insert() will set it to the AVTreeNode which was + * used for the removed element. + * This allows the use of flat arrays, which have + * lower overhead compared to many malloced elements. + * You might want to define a function like: + * @code + * void *tree_insert(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b), + * AVTreeNode **next) + * { + * if (!*next) + * *next = av_mallocz(av_tree_node_size); + * return av_tree_insert(rootp, key, cmp, next); + * } + * void *tree_remove(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b, AVTreeNode **next)) + * { + * av_freep(next); + * return av_tree_insert(rootp, key, cmp, next); + * } + * @endcode + * @param cmp compare function used to compare elements in the tree, API identical + * to that of Standard C's qsort + * @return If no insertion happened, the found element; if an insertion or + * removal happened, then either key or NULL will be returned. + * Which one it is depends on the tree state and the implementation. You + * should make no assumptions that it's one or the other in the code. + */ +void *av_tree_insert(struct AVTreeNode **rootp, void *key, + int (*cmp)(const void *key, const void *b), + struct AVTreeNode **next); + +void av_tree_destroy(struct AVTreeNode *t); + +/** + * Apply enu(opaque, &elem) to all the elements in the tree in a given range. + * + * @param cmp a comparison function that returns < 0 for an element below the + * range, > 0 for an element above the range and == 0 for an + * element inside the range + * + * @note The cmp function should use the same ordering used to construct the + * tree. + */ +void av_tree_enumerate(struct AVTreeNode *t, void *opaque, + int (*cmp)(void *opaque, void *elem), + int (*enu)(void *opaque, void *elem)); + +/** + * @} + */ + +#endif /* AVUTIL_TREE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/twofish.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/twofish.h new file mode 100644 index 0000000..813cfec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/twofish.h @@ -0,0 +1,70 @@ +/* + * An implementation of the TwoFish algorithm + * Copyright (c) 2015 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_TWOFISH_H +#define AVUTIL_TWOFISH_H + +#include + + +/** + * @file + * @brief Public header for libavutil TWOFISH algorithm + * @defgroup lavu_twofish TWOFISH + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_twofish_size; + +struct AVTWOFISH; + +/** + * Allocate an AVTWOFISH context + * To free the struct: av_free(ptr) + */ +struct AVTWOFISH *av_twofish_alloc(void); + +/** + * Initialize an AVTWOFISH context. + * + * @param ctx an AVTWOFISH context + * @param key a key of size ranging from 1 to 32 bytes used for encryption/decryption + * @param key_bits number of keybits: 128, 192, 256 If less than the required, padded with zeroes to nearest valid value; return value is 0 if key_bits is 128/192/256, -1 if less than 0, 1 otherwise + */ +int av_twofish_init(struct AVTWOFISH *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVTWOFISH context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_twofish_crypt(struct AVTWOFISH *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_TWOFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/version.h new file mode 100644 index 0000000..f594dc0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/version.h @@ -0,0 +1,149 @@ +/* + * copyright (c) 2003 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 + * @ingroup lavu + * Libavutil version macros + */ + +#ifndef AVUTIL_VERSION_H +#define AVUTIL_VERSION_H + +#include "macros.h" + +/** + * @addtogroup version_utils + * + * Useful to check and match library version in order to maintain + * backward compatibility. + * + * The FFmpeg libraries follow a versioning sheme very similar to + * Semantic Versioning (http://semver.org/) + * The difference is that the component called PATCH is called MICRO in FFmpeg + * and its value is reset to 100 instead of 0 to keep it above or equal to 100. + * Also we do not increase MICRO for every bugfix or change in git master. + * + * Prior to FFmpeg 3.2 point releases did not change any lib version number to + * avoid aliassing different git master checkouts. + * Starting with FFmpeg 3.2, the released library versions will occupy + * a separate MAJOR.MINOR that is not used on the master development branch. + * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 + * for the release and master will continue at 55.12.100 after it. Each new + * point release will then bump the MICRO improving the usefulness of the lib + * versions. + * + * @{ + */ + +#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c)) +#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c +#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) + +/** + * Extract version components from the full ::AV_VERSION_INT int as returned + * by functions like ::avformat_version() and ::avcodec_version() + */ +#define AV_VERSION_MAJOR(a) ((a) >> 16) +#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) +#define AV_VERSION_MICRO(a) ((a) & 0xFF) + +/** + * @} + */ + +/** + * @defgroup lavu_ver Version and Build diagnostics + * + * Macros and function useful to check at compiletime and at runtime + * which version of libavutil is in use. + * + * @{ + */ + + +#define LIBAVUTIL_VERSION_MAJOR 55 +#define LIBAVUTIL_VERSION_MINOR 78 +#define LIBAVUTIL_VERSION_MICRO 100 + +#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT + +#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) + +/** + * @defgroup lavu_depr_guards Deprecation Guards + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + * @{ + */ + +#ifndef FF_API_VDPAU +#define FF_API_VDPAU (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_XVMC +#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_OPT_TYPE_METADATA +#define FF_API_OPT_TYPE_METADATA (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_DLOG +#define FF_API_DLOG (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_VAAPI +#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_FRAME_QP +#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_PLUS1_MINUS1 +#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_ERROR_FRAME +#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_CRC_BIG_TABLE +#define FF_API_CRC_BIG_TABLE (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_PKT_PTS +#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_CRYPTO_SIZE_T +#define FF_API_CRYPTO_SIZE_T (LIBAVUTIL_VERSION_MAJOR < 56) +#endif + + +/** + * @} + * @} + */ + +#endif /* AVUTIL_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/xtea.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/xtea.h new file mode 100644 index 0000000..735427c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libavutil/xtea.h @@ -0,0 +1,94 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_XTEA_H +#define AVUTIL_XTEA_H + +#include + +/** + * @file + * @brief Public header for libavutil XTEA algorithm + * @defgroup lavu_xtea XTEA + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVXTEA { + uint32_t key[16]; +} AVXTEA; + +/** + * Allocate an AVXTEA context. + */ +AVXTEA *av_xtea_alloc(void); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as big endian 32 bit numbers + */ +void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as little endian 32 bit numbers + */ +void av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in big endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in little endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_XTEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/postprocess.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/postprocess.h new file mode 100644 index 0000000..d180686 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/postprocess.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 + */ + +#ifndef POSTPROC_POSTPROCESS_H +#define POSTPROC_POSTPROCESS_H + +/** + * @file + * @ingroup lpp + * external API header + */ + +/** + * @defgroup lpp libpostproc + * Video postprocessing library. + * + * @{ + */ + +#include "libpostproc/version.h" + +/** + * Return the LIBPOSTPROC_VERSION_INT constant. + */ +unsigned postproc_version(void); + +/** + * Return the libpostproc build-time configuration. + */ +const char *postproc_configuration(void); + +/** + * Return the libpostproc license. + */ +const char *postproc_license(void); + +#define PP_QUALITY_MAX 6 + +#if FF_API_QP_TYPE +#define QP_STORE_T int8_t //deprecated +#endif + +#include + +typedef void pp_context; +typedef void pp_mode; + +#if LIBPOSTPROC_VERSION_INT < (52<<16) +typedef pp_context pp_context_t; +typedef pp_mode pp_mode_t; +extern const char *const pp_help; ///< a simple help text +#else +extern const char pp_help[]; ///< a simple help text +#endif + +void pp_postprocess(const uint8_t * src[3], const int srcStride[3], + uint8_t * dst[3], const int dstStride[3], + int horizontalSize, int verticalSize, + const int8_t *QP_store, int QP_stride, + pp_mode *mode, pp_context *ppContext, int pict_type); + + +/** + * Return a pp_mode or NULL if an error occurred. + * + * @param name the string after "-pp" on the command line + * @param quality a number from 0 to PP_QUALITY_MAX + */ +pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality); +void pp_free_mode(pp_mode *mode); + +pp_context *pp_get_context(int width, int height, int flags); +void pp_free_context(pp_context *ppContext); + +#define PP_CPU_CAPS_MMX 0x80000000 +#define PP_CPU_CAPS_MMX2 0x20000000 +#define PP_CPU_CAPS_3DNOW 0x40000000 +#define PP_CPU_CAPS_ALTIVEC 0x10000000 +#define PP_CPU_CAPS_AUTO 0x00080000 + +#define PP_FORMAT 0x00000008 +#define PP_FORMAT_420 (0x00000011|PP_FORMAT) +#define PP_FORMAT_422 (0x00000001|PP_FORMAT) +#define PP_FORMAT_411 (0x00000002|PP_FORMAT) +#define PP_FORMAT_444 (0x00000000|PP_FORMAT) +#define PP_FORMAT_440 (0x00000010|PP_FORMAT) + +#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale + +/** + * @} + */ + +#endif /* POSTPROC_POSTPROCESS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/version.h new file mode 100644 index 0000000..e8f0abe --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libpostproc/version.h @@ -0,0 +1,49 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef POSTPROC_VERSION_H +#define POSTPROC_VERSION_H + +/** + * @file + * Libpostproc version macros + */ + +#include "libavutil/avutil.h" + +#define LIBPOSTPROC_VERSION_MAJOR 54 +#define LIBPOSTPROC_VERSION_MINOR 7 +#define LIBPOSTPROC_VERSION_MICRO 100 + +#define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_VERSION AV_VERSION(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_BUILD LIBPOSTPROC_VERSION_INT + +#define LIBPOSTPROC_IDENT "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) + +#ifndef FF_API_QP_TYPE +#define FF_API_QP_TYPE (LIBPOSTPROC_VERSION_MAJOR < 55) +#endif + +#endif /* POSTPROC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/swresample.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/swresample.h new file mode 100644 index 0000000..c7b84fb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/swresample.h @@ -0,0 +1,579 @@ +/* + * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_SWRESAMPLE_H +#define SWRESAMPLE_SWRESAMPLE_H + +/** + * @file + * @ingroup lswr + * libswresample public header + */ + +/** + * @defgroup lswr libswresample + * @{ + * + * Audio resampling, sample format conversion and mixing library. + * + * Interaction with lswr is done through SwrContext, which is + * allocated with swr_alloc() or swr_alloc_set_opts(). It is opaque, so all parameters + * must be set with the @ref avoptions API. + * + * The first thing you will need to do in order to use lswr is to allocate + * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts(). If you + * are using the former, you must set options through the @ref avoptions API. + * The latter function provides the same feature, but it allows you to set some + * common options in the same statement. + * + * For example the following code will setup conversion from planar float sample + * format to interleaved signed 16-bit integer, downsampling from 48kHz to + * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing + * matrix). This is using the swr_alloc() function. + * @code + * SwrContext *swr = swr_alloc(); + * av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); + * av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + * av_opt_set_int(swr, "in_sample_rate", 48000, 0); + * av_opt_set_int(swr, "out_sample_rate", 44100, 0); + * av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); + * av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + * @endcode + * + * The same job can be done using swr_alloc_set_opts() as well: + * @code + * SwrContext *swr = swr_alloc_set_opts(NULL, // we're allocating a new context + * AV_CH_LAYOUT_STEREO, // out_ch_layout + * AV_SAMPLE_FMT_S16, // out_sample_fmt + * 44100, // out_sample_rate + * AV_CH_LAYOUT_5POINT1, // in_ch_layout + * AV_SAMPLE_FMT_FLTP, // in_sample_fmt + * 48000, // in_sample_rate + * 0, // log_offset + * NULL); // log_ctx + * @endcode + * + * Once all values have been set, it must be initialized with swr_init(). If + * you need to change the conversion parameters, you can change the parameters + * using @ref AVOptions, as described above in the first example; or by using + * swr_alloc_set_opts(), but with the first argument the allocated context. + * You must then call swr_init() again. + * + * The conversion itself is done by repeatedly calling swr_convert(). + * Note that the samples may get buffered in swr if you provide insufficient + * output space or if sample rate conversion is done, which requires "future" + * samples. Samples that do not require future input can be retrieved at any + * time by using swr_convert() (in_count can be set to 0). + * At the end of conversion the resampling buffer can be flushed by calling + * swr_convert() with NULL in and 0 in_count. + * + * The samples used in the conversion process can be managed with the libavutil + * @ref lavu_sampmanip "samples manipulation" API, including av_samples_alloc() + * function used in the following example. + * + * The delay between input and output, can at any time be found by using + * swr_get_delay(). + * + * The following code demonstrates the conversion loop assuming the parameters + * from above and caller-defined functions get_input() and handle_output(): + * @code + * uint8_t **input; + * int in_samples; + * + * while (get_input(&input, &in_samples)) { + * uint8_t *output; + * int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) + + * in_samples, 44100, 48000, AV_ROUND_UP); + * av_samples_alloc(&output, NULL, 2, out_samples, + * AV_SAMPLE_FMT_S16, 0); + * out_samples = swr_convert(swr, &output, out_samples, + * input, in_samples); + * handle_output(output, out_samples); + * av_freep(&output); + * } + * @endcode + * + * When the conversion is finished, the conversion + * context and everything associated with it must be freed with swr_free(). + * A swr_close() function is also available, but it exists mainly for + * compatibility with libavresample, and is not required to be called. + * + * There will be no memory leak if the data is not completely flushed before + * swr_free(). + */ + +#include +#include "libavutil/channel_layout.h" +#include "libavutil/frame.h" +#include "libavutil/samplefmt.h" + +#include "libswresample/version.h" + +/** + * @name Option constants + * These constants are used for the @ref avoptions interface for lswr. + * @{ + * + */ + +#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate +//TODO use int resample ? +//long term TODO can we enable this dynamically? + +/** Dithering algorithms */ +enum SwrDitherType { + SWR_DITHER_NONE = 0, + SWR_DITHER_RECTANGULAR, + SWR_DITHER_TRIANGULAR, + SWR_DITHER_TRIANGULAR_HIGHPASS, + + SWR_DITHER_NS = 64, ///< not part of API/ABI + SWR_DITHER_NS_LIPSHITZ, + SWR_DITHER_NS_F_WEIGHTED, + SWR_DITHER_NS_MODIFIED_E_WEIGHTED, + SWR_DITHER_NS_IMPROVED_E_WEIGHTED, + SWR_DITHER_NS_SHIBATA, + SWR_DITHER_NS_LOW_SHIBATA, + SWR_DITHER_NS_HIGH_SHIBATA, + SWR_DITHER_NB, ///< not part of API/ABI +}; + +/** Resampling Engines */ +enum SwrEngine { + SWR_ENGINE_SWR, /**< SW Resampler */ + SWR_ENGINE_SOXR, /**< SoX Resampler */ + SWR_ENGINE_NB, ///< not part of API/ABI +}; + +/** Resampling Filter Types */ +enum SwrFilterType { + SWR_FILTER_TYPE_CUBIC, /**< Cubic */ + SWR_FILTER_TYPE_BLACKMAN_NUTTALL, /**< Blackman Nuttall windowed sinc */ + SWR_FILTER_TYPE_KAISER, /**< Kaiser windowed sinc */ +}; + +/** + * @} + */ + +/** + * The libswresample context. Unlike libavcodec and libavformat, this structure + * is opaque. This means that if you would like to set options, you must use + * the @ref avoptions API and cannot directly set values to members of the + * structure. + */ +typedef struct SwrContext SwrContext; + +/** + * Get the AVClass for SwrContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + * @return the AVClass of SwrContext + */ +const AVClass *swr_get_class(void); + +/** + * @name SwrContext constructor functions + * @{ + */ + +/** + * Allocate SwrContext. + * + * If you use this function you will need to set the parameters (manually or + * with swr_alloc_set_opts()) before calling swr_init(). + * + * @see swr_alloc_set_opts(), swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc(void); + +/** + * Initialize context after user parameters have been set. + * @note The context must be configured using the AVOption API. + * + * @see av_opt_set_int() + * @see av_opt_set_dict() + * + * @param[in,out] s Swr context to initialize + * @return AVERROR error code in case of failure. + */ +int swr_init(struct SwrContext *s); + +/** + * Check whether an swr context has been initialized or not. + * + * @param[in] s Swr context to check + * @see swr_init() + * @return positive if it has been initialized, 0 if not initialized + */ +int swr_is_initialized(struct SwrContext *s); + +/** + * Allocate SwrContext if needed and set/reset common parameters. + * + * This function does not require s to be allocated with swr_alloc(). On the + * other hand, swr_alloc() can use swr_alloc_set_opts() to set the parameters + * on the allocated context. + * + * @param s existing Swr context if available, or NULL if not + * @param out_ch_layout output channel layout (AV_CH_LAYOUT_*) + * @param out_sample_fmt output sample format (AV_SAMPLE_FMT_*). + * @param out_sample_rate output sample rate (frequency in Hz) + * @param in_ch_layout input channel layout (AV_CH_LAYOUT_*) + * @param in_sample_fmt input sample format (AV_SAMPLE_FMT_*). + * @param in_sample_rate input sample rate (frequency in Hz) + * @param log_offset logging level offset + * @param log_ctx parent logging context, can be NULL + * + * @see swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, + int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, + int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, + int log_offset, void *log_ctx); + +/** + * @} + * + * @name SwrContext destructor functions + * @{ + */ + +/** + * Free the given SwrContext and set the pointer to NULL. + * + * @param[in] s a pointer to a pointer to Swr context + */ +void swr_free(struct SwrContext **s); + +/** + * Closes the context so that swr_is_initialized() returns 0. + * + * The context can be brought back to life by running swr_init(), + * swr_init() can also be used without swr_close(). + * This function is mainly provided for simplifying the usecase + * where one tries to support libavresample and libswresample. + * + * @param[in,out] s Swr context to be closed + */ +void swr_close(struct SwrContext *s); + +/** + * @} + * + * @name Core conversion functions + * @{ + */ + +/** Convert audio. + * + * in and in_count can be set to 0 to flush the last few samples out at the + * end. + * + * If more input is provided than output space, then the input will be buffered. + * You can avoid this buffering by using swr_get_out_samples() to retrieve an + * upper bound on the required number of output samples for the given number of + * input samples. Conversion will run directly without copying whenever possible. + * + * @param s allocated Swr context, with parameters set + * @param out output buffers, only the first one need be set in case of packed audio + * @param out_count amount of space available for output in samples per channel + * @param in input buffers, only the first one need to be set in case of packed audio + * @param in_count number of input samples available in one channel + * + * @return number of samples output per channel, negative value on error + */ +int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, + const uint8_t **in , int in_count); + +/** + * Convert the next timestamp from input to output + * timestamps are in 1/(in_sample_rate * out_sample_rate) units. + * + * @note There are 2 slightly differently behaving modes. + * @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX) + * in this case timestamps will be passed through with delays compensated + * @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX) + * in this case the output timestamps will match output sample numbers. + * See ffmpeg-resampler(1) for the two modes of compensation. + * + * @param s[in] initialized Swr context + * @param pts[in] timestamp for the next input sample, INT64_MIN if unknown + * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are + * function used internally for timestamp compensation. + * @return the output timestamp for the next output sample + */ +int64_t swr_next_pts(struct SwrContext *s, int64_t pts); + +/** + * @} + * + * @name Low-level option setting functions + * These functons provide a means to set low-level options that is not possible + * with the AVOption API. + * @{ + */ + +/** + * Activate resampling compensation ("soft" compensation). This function is + * internally called when needed in swr_next_pts(). + * + * @param[in,out] s allocated Swr context. If it is not initialized, + * or SWR_FLAG_RESAMPLE is not set, swr_init() is + * called with the flag set. + * @param[in] sample_delta delta in PTS per sample + * @param[in] compensation_distance number of samples to compensate for + * @return >= 0 on success, AVERROR error codes if: + * @li @c s is NULL, + * @li @c compensation_distance is less than 0, + * @li @c compensation_distance is 0 but sample_delta is not, + * @li compensation unsupported by resampler, or + * @li swr_init() fails when called. + */ +int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance); + +/** + * Set a customized input channel mapping. + * + * @param[in,out] s allocated Swr context, not yet initialized + * @param[in] channel_map customized input channel mapping (array of channel + * indexes, -1 for a muted channel) + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); + +/** + * Generate a channel mixing matrix. + * + * This function is the one used internally by libswresample for building the + * default mixing matrix. It is made public just as a utility function for + * building custom matrices. + * + * @param in_layout input channel layout + * @param out_layout output channel layout + * @param center_mix_level mix level for the center channel + * @param surround_mix_level mix level for the surround channel(s) + * @param lfe_mix_level mix level for the low-frequency effects channel + * @param rematrix_maxval if 1.0, coefficients will be normalized to prevent + * overflow. if INT_MAX, coefficients will not be + * normalized. + * @param[out] matrix mixing coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o. + * @param stride distance between adjacent input channels in the + * matrix array + * @param matrix_encoding matrixed stereo downmix mode (e.g. dplii) + * @param log_ctx parent logging context, can be NULL + * @return 0 on success, negative AVERROR code on failure + */ +int swr_build_matrix(uint64_t in_layout, uint64_t out_layout, + double center_mix_level, double surround_mix_level, + double lfe_mix_level, double rematrix_maxval, + double rematrix_volume, double *matrix, + int stride, enum AVMatrixEncoding matrix_encoding, + void *log_ctx); + +/** + * Set a customized remix matrix. + * + * @param s allocated Swr context, not yet initialized + * @param matrix remix coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o + * @param stride offset between lines of the matrix + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride); + +/** + * @} + * + * @name Sample handling functions + * @{ + */ + +/** + * Drops the specified number of output samples. + * + * This function, along with swr_inject_silence(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_drop_output(struct SwrContext *s, int count); + +/** + * Injects the specified number of silence samples. + * + * This function, along with swr_drop_output(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_inject_silence(struct SwrContext *s, int count); + +/** + * Gets the delay the next input sample will experience relative to the next output sample. + * + * Swresample can buffer data if more input has been provided than available + * output space, also converting between sample rates needs a delay. + * This function returns the sum of all such delays. + * The exact delay is not necessarily an integer value in either input or + * output sample rate. Especially when downsampling by a large value, the + * output sample rate may be a poor choice to represent the delay, similarly + * for upsampling and the input sample rate. + * + * @param s swr context + * @param base timebase in which the returned delay will be: + * @li if it's set to 1 the returned delay is in seconds + * @li if it's set to 1000 the returned delay is in milliseconds + * @li if it's set to the input sample rate then the returned + * delay is in input samples + * @li if it's set to the output sample rate then the returned + * delay is in output samples + * @li if it's the least common multiple of in_sample_rate and + * out_sample_rate then an exact rounding-free delay will be + * returned + * @returns the delay in 1 / @c base units. + */ +int64_t swr_get_delay(struct SwrContext *s, int64_t base); + +/** + * Find an upper bound on the number of samples that the next swr_convert + * call will output, if called with in_samples of input samples. This + * depends on the internal state, and anything changing the internal state + * (like further swr_convert() calls) will may change the number of samples + * swr_get_out_samples() returns for the same number of input samples. + * + * @param in_samples number of input samples. + * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts() + * or swr_set_compensation() invalidates this limit + * @note it is recommended to pass the correct available buffer size + * to all functions like swr_convert() even if swr_get_out_samples() + * indicates that less would be used. + * @returns an upper bound on the number of samples that the next swr_convert + * will output or a negative value to indicate an error + */ +int swr_get_out_samples(struct SwrContext *s, int in_samples); + +/** + * @} + * + * @name Configuration accessors + * @{ + */ + +/** + * Return the @ref LIBSWRESAMPLE_VERSION_INT constant. + * + * This is useful to check if the build-time libswresample has the same version + * as the run-time one. + * + * @returns the unsigned int-typed version + */ +unsigned swresample_version(void); + +/** + * Return the swr build-time configuration. + * + * @returns the build-time @c ./configure flags + */ +const char *swresample_configuration(void); + +/** + * Return the swr license. + * + * @returns the license of libswresample, determined at build-time + */ +const char *swresample_license(void); + +/** + * @} + * + * @name AVFrame based API + * @{ + */ + +/** + * Convert the samples in the input AVFrame and write them to the output AVFrame. + * + * Input and output AVFrames must have channel_layout, sample_rate and format set. + * + * If the output AVFrame does not have the data pointers allocated the nb_samples + * field will be set using av_frame_get_buffer() + * is called to allocate the frame. + * + * The output AVFrame can be NULL or have fewer allocated samples than required. + * In this case, any remaining samples not written to the output will be added + * to an internal FIFO buffer, to be returned at the next call to this function + * or to swr_convert(). + * + * If converting sample rate, there may be data remaining in the internal + * resampling delay buffer. swr_get_delay() tells the number of + * remaining samples. To get this data as output, call this function or + * swr_convert() with NULL input. + * + * If the SwrContext configuration does not match the output and + * input AVFrame settings the conversion does not take place and depending on + * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED + * or the result of a bitwise-OR of them is returned. + * + * @see swr_delay() + * @see swr_convert() + * @see swr_get_delay() + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure or nonmatching + * configuration. + */ +int swr_convert_frame(SwrContext *swr, + AVFrame *output, const AVFrame *input); + +/** + * Configure or reconfigure the SwrContext using the information + * provided by the AVFrames. + * + * The original resampling context is reset even on failure. + * The function calls swr_close() internally if the context is open. + * + * @see swr_close(); + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure. + */ +int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in); + +/** + * @} + * @} + */ + +#endif /* SWRESAMPLE_SWRESAMPLE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/version.h new file mode 100644 index 0000000..6a66173 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswresample/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_VERSION_H +#define SWRESAMPLE_VERSION_H + +/** + * @file + * Libswresample version macros + */ + +#include "libavutil/avutil.h" + +#define LIBSWRESAMPLE_VERSION_MAJOR 2 +#define LIBSWRESAMPLE_VERSION_MINOR 9 +#define LIBSWRESAMPLE_VERSION_MICRO 100 + +#define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_VERSION AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_BUILD LIBSWRESAMPLE_VERSION_INT + +#define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) + +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/swscale.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/swscale.h new file mode 100644 index 0000000..7713f51 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/swscale.h @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2001-2011 Michael Niedermayer + * + * 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 + */ + +#ifndef SWSCALE_SWSCALE_H +#define SWSCALE_SWSCALE_H + +/** + * @file + * @ingroup libsws + * external API header + */ + +#include + +#include "libavutil/avutil.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "version.h" + +/** + * @defgroup libsws libswscale + * Color conversion and scaling library. + * + * @{ + * + * Return the LIBSWSCALE_VERSION_INT constant. + */ +unsigned swscale_version(void); + +/** + * Return the libswscale build-time configuration. + */ +const char *swscale_configuration(void); + +/** + * Return the libswscale license. + */ +const char *swscale_license(void); + +/* values for the flags, the stuff on the command line is different */ +#define SWS_FAST_BILINEAR 1 +#define SWS_BILINEAR 2 +#define SWS_BICUBIC 4 +#define SWS_X 8 +#define SWS_POINT 0x10 +#define SWS_AREA 0x20 +#define SWS_BICUBLIN 0x40 +#define SWS_GAUSS 0x80 +#define SWS_SINC 0x100 +#define SWS_LANCZOS 0x200 +#define SWS_SPLINE 0x400 + +#define SWS_SRC_V_CHR_DROP_MASK 0x30000 +#define SWS_SRC_V_CHR_DROP_SHIFT 16 + +#define SWS_PARAM_DEFAULT 123456 + +#define SWS_PRINT_INFO 0x1000 + +//the following 3 flags are not completely implemented +//internal chrominance subsampling info +#define SWS_FULL_CHR_H_INT 0x2000 +//input subsampling info +#define SWS_FULL_CHR_H_INP 0x4000 +#define SWS_DIRECT_BGR 0x8000 +#define SWS_ACCURATE_RND 0x40000 +#define SWS_BITEXACT 0x80000 +#define SWS_ERROR_DIFFUSION 0x800000 + +#define SWS_MAX_REDUCE_CUTOFF 0.002 + +#define SWS_CS_ITU709 1 +#define SWS_CS_FCC 4 +#define SWS_CS_ITU601 5 +#define SWS_CS_ITU624 5 +#define SWS_CS_SMPTE170M 5 +#define SWS_CS_SMPTE240M 7 +#define SWS_CS_DEFAULT 5 +#define SWS_CS_BT2020 9 + +/** + * Return a pointer to yuv<->rgb coefficients for the given colorspace + * suitable for sws_setColorspaceDetails(). + * + * @param colorspace One of the SWS_CS_* macros. If invalid, + * SWS_CS_DEFAULT is used. + */ +const int *sws_getCoefficients(int colorspace); + +// when used for filters they must have an odd number of elements +// coeffs cannot be shared between vectors +typedef struct SwsVector { + double *coeff; ///< pointer to the list of coefficients + int length; ///< number of coefficients in the vector +} SwsVector; + +// vectors can be shared +typedef struct SwsFilter { + SwsVector *lumH; + SwsVector *lumV; + SwsVector *chrH; + SwsVector *chrV; +} SwsFilter; + +struct SwsContext; + +/** + * Return a positive value if pix_fmt is a supported input format, 0 + * otherwise. + */ +int sws_isSupportedInput(enum AVPixelFormat pix_fmt); + +/** + * Return a positive value if pix_fmt is a supported output format, 0 + * otherwise. + */ +int sws_isSupportedOutput(enum AVPixelFormat pix_fmt); + +/** + * @param[in] pix_fmt the pixel format + * @return a positive value if an endianness conversion for pix_fmt is + * supported, 0 otherwise. + */ +int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt); + +/** + * Allocate an empty SwsContext. This must be filled and passed to + * sws_init_context(). For filling see AVOptions, options.c and + * sws_setColorspaceDetails(). + */ +struct SwsContext *sws_alloc_context(void); + +/** + * Initialize the swscaler context sws_context. + * + * @return zero or positive value on success, a negative value on + * error + */ +av_warn_unused_result +int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter); + +/** + * Free the swscaler context swsContext. + * If swsContext is NULL, then does nothing. + */ +void sws_freeContext(struct SwsContext *swsContext); + +/** + * Allocate and return an SwsContext. You need it to perform + * scaling/conversion operations using sws_scale(). + * + * @param srcW the width of the source image + * @param srcH the height of the source image + * @param srcFormat the source image format + * @param dstW the width of the destination image + * @param dstH the height of the destination image + * @param dstFormat the destination image format + * @param flags specify which algorithm and options to use for rescaling + * @param param extra parameters to tune the used scaler + * For SWS_BICUBIC param[0] and [1] tune the shape of the basis + * function, param[0] tunes f(1) and param[1] f´(1) + * For SWS_GAUSS param[0] tunes the exponent and thus cutoff + * frequency + * For SWS_LANCZOS param[0] tunes the width of the window function + * @return a pointer to an allocated context, or NULL in case of error + * @note this function is to be removed after a saner alternative is + * written + */ +struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Scale the image slice in srcSlice and put the resulting scaled + * slice in the image in dst. A slice is a sequence of consecutive + * rows in an image. + * + * Slices have to be provided in sequential order, either in + * top-bottom or bottom-top order. If slices are provided in + * non-sequential order the behavior of the function is undefined. + * + * @param c the scaling context previously created with + * sws_getContext() + * @param srcSlice the array containing the pointers to the planes of + * the source slice + * @param srcStride the array containing the strides for each plane of + * the source image + * @param srcSliceY the position in the source image of the slice to + * process, that is the number (counted starting from + * zero) in the image of the first row of the slice + * @param srcSliceH the height of the source slice, that is the number + * of rows in the slice + * @param dst the array containing the pointers to the planes of + * the destination image + * @param dstStride the array containing the strides for each plane of + * the destination image + * @return the height of the output slice + */ +int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], + const int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *const dst[], const int dstStride[]); + +/** + * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) + * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) + * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x] + * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x] + * @param brightness 16.16 fixed point brightness correction + * @param contrast 16.16 fixed point contrast correction + * @param saturation 16.16 fixed point saturation correction + * @return -1 if not supported + */ +int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], + int srcRange, const int table[4], int dstRange, + int brightness, int contrast, int saturation); + +/** + * @return -1 if not supported + */ +int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, + int *srcRange, int **table, int *dstRange, + int *brightness, int *contrast, int *saturation); + +/** + * Allocate and return an uninitialized vector with length coefficients. + */ +SwsVector *sws_allocVec(int length); + +/** + * Return a normalized Gaussian curve used to filter stuff + * quality = 3 is high quality, lower is lower quality. + */ +SwsVector *sws_getGaussianVec(double variance, double quality); + +/** + * Scale all the coefficients of a by the scalar value. + */ +void sws_scaleVec(SwsVector *a, double scalar); + +/** + * Scale all the coefficients of a so that their sum equals height. + */ +void sws_normalizeVec(SwsVector *a, double height); + +#if FF_API_SWS_VECTOR +attribute_deprecated SwsVector *sws_getConstVec(double c, int length); +attribute_deprecated SwsVector *sws_getIdentityVec(void); +attribute_deprecated void sws_convVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_addVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_subVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_shiftVec(SwsVector *a, int shift); +attribute_deprecated SwsVector *sws_cloneVec(SwsVector *a); +attribute_deprecated void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); +#endif + +void sws_freeVec(SwsVector *a); + +SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, + float lumaSharpen, float chromaSharpen, + float chromaHShift, float chromaVShift, + int verbose); +void sws_freeFilter(SwsFilter *filter); + +/** + * Check if context can be reused, otherwise reallocate a new one. + * + * If context is NULL, just calls sws_getContext() to get a new + * context. Otherwise, checks if the parameters are the ones already + * saved in context. If that is the case, returns the current + * context. Otherwise, frees context and gets a new context with + * the new parameters. + * + * Be warned that srcFilter and dstFilter are not checked, they + * are assumed to remain the same. + */ +struct SwsContext *sws_getCachedContext(struct SwsContext *context, + int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 32 bits. + * + * The output frame will have the same packed format as the palette. + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 24 bits. + * + * With the palette format "ABCD", the destination frame ends up with the format "ABC". + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Get the AVClass for swsContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *sws_get_class(void); + +/** + * @} + */ + +#endif /* SWSCALE_SWSCALE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/version.h new file mode 100644 index 0000000..474e93b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/libswscale/version.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef SWSCALE_VERSION_H +#define SWSCALE_VERSION_H + +/** + * @file + * swscale version macros + */ + +#include "libavutil/version.h" + +#define LIBSWSCALE_VERSION_MAJOR 4 +#define LIBSWSCALE_VERSION_MINOR 8 +#define LIBSWSCALE_VERSION_MICRO 100 + +#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_VERSION AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_BUILD LIBSWSCALE_VERSION_INT + +#define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_SWS_VECTOR +#define FF_API_SWS_VECTOR (LIBSWSCALE_VERSION_MAJOR < 6) +#endif + +#endif /* SWSCALE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxdefs.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxdefs.h new file mode 100644 index 0000000..c2cb52a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxdefs.h @@ -0,0 +1,112 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxdefs.h + +\* ****************************************************************************** */ +#ifndef __MFXDEFS_H__ +#define __MFXDEFS_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if defined( _WIN32 ) || defined ( _WIN64 ) + #define __INT64 __int64 + #define __UINT64 unsigned __int64 +#else + #define __INT64 long long + #define __UINT64 unsigned long long +#endif + +#define MFX_INFINITE 0xFFFFFFFF + +typedef unsigned char mfxU8; +typedef char mfxI8; +typedef short mfxI16; +typedef unsigned short mfxU16; +typedef unsigned int mfxU32; +typedef int mfxI32; +#if defined( _WIN32 ) || defined ( _WIN64 ) +typedef unsigned long mfxUL32; +typedef long mfxL32; +#else +typedef unsigned int mfxUL32; +typedef int mfxL32; +#endif +typedef float mfxF32; +typedef double mfxF64; +typedef __UINT64 mfxU64; +typedef __INT64 mfxI64; +typedef void* mfxHDL; +typedef mfxHDL mfxMemId; +typedef void* mfxThreadTask; + +typedef struct { + mfxI16 x; + mfxI16 y; +} mfxI16Pair; + +typedef struct { + mfxHDL first; + mfxHDL second; +} mfxHDLPair; + + +/*********************************************************************************\ +Error message +\*********************************************************************************/ +typedef enum +{ + /* no error */ + MFX_ERR_NONE = 0, /* no error */ + + /* reserved for unexpected errors */ + MFX_ERR_UNKNOWN = -1, /* unknown error. */ + + /* error codes <0 */ + MFX_ERR_NULL_PTR = -2, /* null pointer */ + MFX_ERR_UNSUPPORTED = -3, /* undeveloped feature */ + MFX_ERR_MEMORY_ALLOC = -4, /* failed to allocate memory */ + MFX_ERR_NOT_ENOUGH_BUFFER = -5, /* insufficient buffer at input/output */ + MFX_ERR_INVALID_HANDLE = -6, /* invalid handle */ + MFX_ERR_LOCK_MEMORY = -7, /* failed to lock the memory block */ + MFX_ERR_NOT_INITIALIZED = -8, /* member function called before initialization */ + MFX_ERR_NOT_FOUND = -9, /* the specified object is not found */ + MFX_ERR_MORE_DATA = -10, /* expect more data at input */ + MFX_ERR_MORE_SURFACE = -11, /* expect more surface at output */ + MFX_ERR_ABORTED = -12, /* operation aborted */ + MFX_ERR_DEVICE_LOST = -13, /* lose the HW acceleration device */ + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM = -14, /* incompatible video parameters */ + MFX_ERR_INVALID_VIDEO_PARAM = -15, /* invalid video parameters */ + MFX_ERR_UNDEFINED_BEHAVIOR = -16, /* undefined behavior */ + MFX_ERR_DEVICE_FAILED = -17, /* device operation failure */ + MFX_ERR_MORE_BITSTREAM = -18, /* expect more bitstream buffers at output */ + + /* warnings >0 */ + MFX_WRN_IN_EXECUTION = 1, /* the previous asynchrous operation is in execution */ + MFX_WRN_DEVICE_BUSY = 2, /* the HW acceleration device is busy */ + MFX_WRN_VIDEO_PARAM_CHANGED = 3, /* the video parameters are changed during decoding */ + MFX_WRN_PARTIAL_ACCELERATION = 4, /* SW is used */ + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM = 5, /* incompatible video parameters */ + MFX_WRN_VALUE_NOT_CHANGED = 6, /* the value is saturated based on its valid range */ + MFX_WRN_OUT_OF_RANGE = 7, /* the value is out of valid range */ + + /* threading statuses */ + MFX_TASK_DONE = MFX_ERR_NONE, /* task has been completed */ + MFX_TASK_WORKING = 8, /* there is some more work to do */ + MFX_TASK_BUSY = 9 /* task is waiting for resources */ + +} mfxStatus; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MFXDEFS_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxjpeg.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxjpeg.h new file mode 100644 index 0000000..5b8ab27 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxjpeg.h @@ -0,0 +1,45 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxjpeg.h + +*******************************************************************************/ +#ifndef __MFX_JPEG_H__ +#define __MFX_JPEG_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* CodecId */ +enum { + MFX_CODEC_JPEG = MFX_MAKEFOURCC('J','P','E','G') +}; + +/* CodecProfile, CodecLevel */ +enum +{ + MFX_PROFILE_JPEG_BASELINE = 1 +}; + +enum +{ + MFX_ROTATION_0 = 0, + MFX_ROTATION_90 = 1, + MFX_ROTATION_180 = 2, + MFX_ROTATION_270 = 3 +}; + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif // __MFX_JPEG_H__ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxmvc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxmvc.h new file mode 100644 index 0000000..af74465 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxmvc.h @@ -0,0 +1,91 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxmvc.h + +*******************************************************************************/ +#ifndef __MFXMVC_H__ +#define __MFXMVC_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* CodecProfile, CodecLevel */ +enum { + /* MVC profiles */ + MFX_PROFILE_AVC_MULTIVIEW_HIGH =118, + MFX_PROFILE_AVC_STEREO_HIGH =128 +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_MVC_SEQ_DESC = MFX_MAKEFOURCC('M','V','C','D'), + MFX_EXTBUFF_MVC_TARGET_VIEWS = MFX_MAKEFOURCC('M','V','C','T') +}; + +typedef struct { + mfxU16 ViewId; + + mfxU16 NumAnchorRefsL0; + mfxU16 NumAnchorRefsL1; + mfxU16 AnchorRefL0[16]; + mfxU16 AnchorRefL1[16]; + + mfxU16 NumNonAnchorRefsL0; + mfxU16 NumNonAnchorRefsL1; + mfxU16 NonAnchorRefL0[16]; + mfxU16 NonAnchorRefL1[16]; +} mfxMVCViewDependency; + +typedef struct { + mfxU16 TemporalId; /* operation point temporal ID */ + mfxU16 LevelIdc; + + mfxU16 NumViews; /* total number of views, including "depend on" views */ + mfxU16 NumTargetViews; /* number of the output views for the current operation point */ + mfxU16 *TargetViewId; /* array of target view ID, it points to mfxExtMVCSeqDesc::ViewId, set by SDK */ +} mfxMVCOperationPoint; + +typedef struct { + mfxExtBuffer Header; + + mfxU32 NumView; /* number of view in the stream, set by SDK */ + mfxU32 NumViewAlloc; /* number of allocated elements, set by application */ + mfxMVCViewDependency *View; /* view ID and list of views used as reference for this view, allocated by application */ + + mfxU32 NumViewId; /* num of views IDs, to simplify copying, set by SDK */ + mfxU32 NumViewIdAlloc; /* number of allocated elements, set by application */ + mfxU16 *ViewId; /* allocated by application */ + + mfxU32 NumOP; /* number of operation points in OP array, set by SDK */ + mfxU32 NumOPAlloc; /* number of allocated elements in OP array, set by application */ + mfxMVCOperationPoint *OP; /* allocated by application */ + + mfxU16 NumRefsTotal; /* total number of reference frames in the sequence */ + mfxU32 Reserved[16]; + +} mfxExtMVCSeqDesc; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 TemporalId; + mfxU32 NumView; /* number of view to decode */ + mfxU16 ViewId[1024]; +} mfxExtMVCTargetViews ; + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin++.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin++.h new file mode 100644 index 0000000..b62c9b9 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin++.h @@ -0,0 +1,55 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2011 Intel Corporation. All Rights Reserved. + + +File Name: mfxplugin++.h + +\* ****************************************************************************** */ + +#ifndef __MFXPLUGINPLUSPLUS_H +#define __MFXPLUGINPLUSPLUS_H + +#include "mfxvideo.h" +#include "mfxplugin.h" + +class MFXPlugin +{ +public: + virtual mfxStatus mfxPluginInit(mfxCoreInterface *core) = 0; + virtual mfxStatus mfxPluginClose() = 0; + virtual mfxStatus mfxGetPluginParam(mfxPluginParam *par) = 0; + virtual mfxStatus mfxSubmit(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) = 0; + virtual mfxStatus mfxExecute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a) = 0; + virtual mfxStatus mfxFreeResources(mfxThreadTask task, mfxStatus sts) = 0; +}; + +/* Class adapter between "C" structure mfxPlugin and C++ interface MFXPlugin */ +class MFXPluginAdapter : public mfxPlugin +{ +public: + MFXPluginAdapter(MFXPlugin *pPlugin) + { + pthis = pPlugin; + PluginInit = MFXPluginAdapter::_PluginInit; + PluginClose = MFXPluginAdapter::_PluginClose; + GetPluginParam = MFXPluginAdapter::_GetPluginParam; + Submit = MFXPluginAdapter::_Submit; + Execute = MFXPluginAdapter::_Execute; + FreeResources = MFXPluginAdapter::_FreeResources; + } + +private: + static mfxStatus _PluginInit(mfxHDL pthis, mfxCoreInterface *core) { return ((MFXPlugin*)pthis)->mfxPluginInit(core); } + static mfxStatus _PluginClose(mfxHDL pthis) { return ((MFXPlugin*)pthis)->mfxPluginClose(); } + static mfxStatus _GetPluginParam(mfxHDL pthis, mfxPluginParam *par) { return ((MFXPlugin*)pthis)->mfxGetPluginParam(par); } + static mfxStatus _Submit(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) { return ((MFXPlugin*)pthis)->mfxSubmit(in, in_num, out, out_num, task); } + static mfxStatus _Execute(mfxHDL pthis, mfxThreadTask task, mfxU32 thread_id, mfxU32 call_count) { return ((MFXPlugin*)pthis)->mfxExecute(task, thread_id, call_count); } + static mfxStatus _FreeResources(mfxHDL pthis, mfxThreadTask task, mfxStatus sts) { return ((MFXPlugin*)pthis)->mfxFreeResources(task, sts); } +}; + +#endif // __MFXPLUGINPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin.h new file mode 100644 index 0000000..bfb7547 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxplugin.h @@ -0,0 +1,90 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2011 Intel Corporation. All Rights Reserved. + +File Name: mfxplugin.h + +*******************************************************************************/ +#ifndef __MFXPLUGIN_H__ +#define __MFXPLUGIN_H__ +#include "mfxvideo.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +typedef enum { + MFX_THREADPOLICY_SERIAL = 0, + MFX_THREADPOLICY_PARALLEL = 1 +} mfxThreadPolicy; + +typedef struct mfxPluginParam { + mfxU32 reserved[14]; + mfxThreadPolicy ThreadPolicy; + mfxU32 MaxThreadNum; +} mfxPluginParam; + +typedef struct mfxCoreParam{ + mfxU32 reserved[13]; + mfxIMPL Impl; + mfxVersion Version; + mfxU32 NumWorkingThread; +} mfxCoreParam; + +typedef struct mfxCoreInterface { + mfxHDL pthis; + + mfxHDL reserved1[2]; + mfxFrameAllocator FrameAllocator; + mfxBufferAllocator reserved3; + + mfxStatus (MFX_CDECL *GetCoreParam)(mfxHDL pthis, mfxCoreParam *par); + mfxStatus (MFX_CDECL *GetHandle) (mfxHDL pthis, mfxHandleType type, mfxHDL *handle); + mfxStatus (MFX_CDECL *IncreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *DecreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *CopyFrame) (mfxHDL pthis, mfxFrameSurface1 *dst, mfxFrameSurface1 *src); + mfxStatus (MFX_CDECL *CopyBuffer)(mfxHDL pthis, mfxU8 *dst, mfxU32 size, mfxFrameSurface1 *src); + + mfxStatus (MFX_CDECL *MapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + mfxStatus (MFX_CDECL *UnmapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + + mfxStatus (MFX_CDECL *GetRealSurface)(mfxHDL pthis, mfxFrameSurface1 *op_surf, mfxFrameSurface1 **surf); + mfxStatus (MFX_CDECL *GetOpaqueSurface)(mfxHDL pthis, mfxFrameSurface1 *surf, mfxFrameSurface1 **op_surf); + + mfxHDL reserved4[4]; +} mfxCoreInterface; + +typedef struct mfxPlugin{ + mfxHDL pthis; + + mfxStatus (MFX_CDECL *PluginInit) (mfxHDL pthis, mfxCoreInterface *core); + mfxStatus (MFX_CDECL *PluginClose) (mfxHDL pthis); + + mfxStatus (MFX_CDECL *GetPluginParam)(mfxHDL pthis, mfxPluginParam *par); + + mfxStatus (MFX_CDECL *Submit)(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task); + mfxStatus (MFX_CDECL *Execute)(mfxHDL pthis, mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); + mfxStatus (MFX_CDECL *FreeResources)(mfxHDL pthis, mfxThreadTask task, mfxStatus sts); + + mfxHDL reserved[9]; +} mfxPlugin; + + + +mfxStatus MFX_CDECL MFXVideoUSER_Register(mfxSession session, mfxU32 type, const mfxPlugin *par); +mfxStatus MFX_CDECL MFXVideoUSER_Unregister(mfxSession session, mfxU32 type); + +mfxStatus MFX_CDECL MFXVideoUSER_ProcessFrameAsync(mfxSession session, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif /* __MFXPLUGIN_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxstructures.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxstructures.h new file mode 100644 index 0000000..13e362b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxstructures.h @@ -0,0 +1,763 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxstructures.h + +*******************************************************************************/ +#ifndef __MFXSTRUCTURES_H__ +#define __MFXSTRUCTURES_H__ +#include "mfxdefs.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" { +#endif + +#define MFX_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24)) + +/* Extended Configuration Header Structure */ +typedef struct { + mfxU32 BufferId; + mfxU32 BufferSz; +} mfxExtBuffer; + +/* Frame ID for SVC and MVC */ +typedef struct { + mfxU16 TemporalId; + mfxU16 PriorityId; + union { + struct { + mfxU16 DependencyId; + mfxU16 QualityId; + }; + struct { + mfxU16 ViewId; + }; + }; +} mfxFrameId; + +/* Frame Info */ +typedef struct { + mfxU32 reserved[6]; + mfxFrameId FrameId; + + mfxU32 FourCC; + mfxU16 Width; + mfxU16 Height; + + mfxU16 CropX; + mfxU16 CropY; + mfxU16 CropW; + mfxU16 CropH; + + mfxU32 FrameRateExtN; + mfxU32 FrameRateExtD; + mfxU16 reserved3; + + mfxU16 AspectRatioW; + mfxU16 AspectRatioH; + + mfxU16 PicStruct; + mfxU16 ChromaFormat; + mfxU16 reserved2; +} mfxFrameInfo; + +/* FourCC */ +enum { + MFX_FOURCC_NV12 = MFX_MAKEFOURCC('N','V','1','2'), /* Native Format */ + MFX_FOURCC_YV12 = MFX_MAKEFOURCC('Y','V','1','2'), + MFX_FOURCC_YUY2 = MFX_MAKEFOURCC('Y','U','Y','2'), + MFX_FOURCC_RGB3 = MFX_MAKEFOURCC('R','G','B','3'), /* RGB24 */ + MFX_FOURCC_RGB4 = MFX_MAKEFOURCC('R','G','B','4'), /* RGB32 */ + MFX_FOURCC_P8 = 41 /* D3DFMT_P8 */ +}; + +/* PicStruct */ +enum { + MFX_PICSTRUCT_UNKNOWN =0x00, + MFX_PICSTRUCT_PROGRESSIVE =0x01, + MFX_PICSTRUCT_FIELD_TFF =0x02, + MFX_PICSTRUCT_FIELD_BFF =0x04, + + MFX_PICSTRUCT_FIELD_REPEATED=0x10, /* first field repeated, pic_struct=5 or 6 in H.264 */ + MFX_PICSTRUCT_FRAME_DOUBLING=0x20, /* pic_struct=7 in H.264 */ + MFX_PICSTRUCT_FRAME_TRIPLING=0x40 /* pic_struct=8 in H.264 */ +}; + +/* ColorFormat */ +enum { + MFX_CHROMAFORMAT_MONOCHROME =0, + MFX_CHROMAFORMAT_YUV420 =1, + MFX_CHROMAFORMAT_YUV422 =2, + MFX_CHROMAFORMAT_YUV444 =3, + MFX_CHROMAFORMAT_YUV400 = MFX_CHROMAFORMAT_MONOCHROME, + MFX_CHROMAFORMAT_YUV411 = 4, + MFX_CHROMAFORMAT_YUV422H = MFX_CHROMAFORMAT_YUV422, + MFX_CHROMAFORMAT_YUV422V = 5 + +}; + +enum { + MFX_TIMESTAMP_UNKNOWN = -1 +}; + +enum { + MFX_FRAMEORDER_UNKNOWN = -1 +}; + +/* DataFlag in mfxFrameData */ +enum { + MFX_FRAMEDATA_ORIGINAL_TIMESTAMP = 0x0001 +}; + +/* Corrupted in mfxFrameData */ +enum { + MFX_CORRUPTION_MINOR = 0x0001, + MFX_CORRUPTION_MAJOR = 0x0002, + MFX_CORRUPTION_REFERENCE_FRAME = 0x0010, + MFX_CORRUPTION_REFERENCE_LIST = 0x0020 +}; + +/* Frame Data Info */ +typedef struct { + mfxU32 reserved[8]; + + mfxU64 TimeStamp; + mfxU32 FrameOrder; + mfxU16 Locked; + mfxU16 Pitch; + + /* color planes */ + union { + mfxU8 *Y; + mfxU8 *R; + }; + union { + mfxU8 *UV; /* for UV merged formats */ + mfxU8 *VU; /* for VU merged formats */ + mfxU8 *CbCr; /* for CbCr merged formats */ + mfxU8 *CrCb; /* for CrCb merged formats */ + mfxU8 *Cb; + mfxU8 *U; + mfxU8 *G; + }; + union { + mfxU8 *Cr; + mfxU8 *V; + mfxU8 *B; + }; + mfxU8 *A; + mfxMemId MemId; + + /* Additional Flags */ + mfxU16 Corrupted; + mfxU16 DataFlag; +} mfxFrameData; + +/* Frame Surface */ +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxFrameData Data; +} mfxFrameSurface1; + +enum { + MFX_TIMESTAMPCALC_UNKNOWN = 0, + MFX_TIMESTAMPCALC_TELECINE = 1, +}; + +/* Transcoding Info */ +typedef struct { + mfxU32 reserved[7]; + + mfxU16 reserved4; + mfxU16 BRCParamMultiplier; + + mfxFrameInfo FrameInfo; + mfxU32 CodecId; + mfxU16 CodecProfile; + mfxU16 CodecLevel; + mfxU16 NumThread; + + union { + struct { /* MPEG-2/H.264 Encoding Options */ + mfxU16 TargetUsage; + + mfxU16 GopPicSize; + mfxU16 GopRefDist; + mfxU16 GopOptFlag; + mfxU16 IdrInterval; + + mfxU16 RateControlMethod; + union { + mfxU16 InitialDelayInKB; + mfxU16 QPI; + mfxU16 Accuracy; + }; + mfxU16 BufferSizeInKB; + union { + mfxU16 TargetKbps; + mfxU16 QPP; + }; + union { + mfxU16 MaxKbps; + mfxU16 QPB; + mfxU16 Convergence; + }; + + mfxU16 NumSlice; + mfxU16 NumRefFrame; + mfxU16 EncodedOrder; + }; + struct { /* H.264, MPEG-2 and VC-1 Decoding Options */ + mfxU16 DecodedOrder; + mfxU16 ExtendedPicStruct; + mfxU16 TimeStampCalc; + mfxU16 reserved2[10]; + }; + struct { /* JPEG Decoding Options */ + mfxU16 JPEGChromaFormat; + mfxU16 Rotation; + mfxU16 reserved3[11]; + }; + }; +} mfxInfoMFX; + +typedef struct { + mfxU32 reserved[8]; + mfxFrameInfo In; + mfxFrameInfo Out; +} mfxInfoVPP; + +typedef struct { + mfxU32 reserved[3]; + mfxU16 reserved3; + mfxU16 AsyncDepth; + + union { + mfxInfoMFX mfx; + mfxInfoVPP vpp; + }; + mfxU16 Protected; + mfxU16 IOPattern; + mfxExtBuffer** ExtParam; + mfxU16 NumExtParam; + mfxU16 reserved2; +} mfxVideoParam; + +/* IOPattern */ +enum { + MFX_IOPATTERN_IN_VIDEO_MEMORY = 0x01, + MFX_IOPATTERN_IN_SYSTEM_MEMORY = 0x02, + MFX_IOPATTERN_IN_OPAQUE_MEMORY = 0x04, + MFX_IOPATTERN_OUT_VIDEO_MEMORY = 0x10, + MFX_IOPATTERN_OUT_SYSTEM_MEMORY = 0x20, + MFX_IOPATTERN_OUT_OPAQUE_MEMORY = 0x40 +}; + +/* CodecId */ +enum { + MFX_CODEC_AVC =MFX_MAKEFOURCC('A','V','C',' '), + MFX_CODEC_MPEG2 =MFX_MAKEFOURCC('M','P','G','2'), + MFX_CODEC_VC1 =MFX_MAKEFOURCC('V','C','1',' ') +}; + +/* CodecProfile, CodecLevel */ +enum { + MFX_PROFILE_UNKNOWN =0, + MFX_LEVEL_UNKNOWN =0, + + /* AVC Profiles & Levels */ + MFX_PROFILE_AVC_CONSTRAINT_SET0 = (0x100 << 0), + MFX_PROFILE_AVC_CONSTRAINT_SET1 = (0x100 << 1), + MFX_PROFILE_AVC_CONSTRAINT_SET2 = (0x100 << 2), + MFX_PROFILE_AVC_CONSTRAINT_SET3 = (0x100 << 3), + MFX_PROFILE_AVC_CONSTRAINT_SET4 = (0x100 << 4), + MFX_PROFILE_AVC_CONSTRAINT_SET5 = (0x100 << 5), + + MFX_PROFILE_AVC_BASELINE =66, + MFX_PROFILE_AVC_MAIN =77, + MFX_PROFILE_AVC_EXTENDED =88, + MFX_PROFILE_AVC_HIGH =100, + MFX_PROFILE_AVC_CONSTRAINED_BASELINE =MFX_PROFILE_AVC_BASELINE + MFX_PROFILE_AVC_CONSTRAINT_SET1, + MFX_PROFILE_AVC_CONSTRAINED_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4 + + MFX_PROFILE_AVC_CONSTRAINT_SET5, + MFX_PROFILE_AVC_PROGRESSIVE_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4, + + MFX_LEVEL_AVC_1 =10, + MFX_LEVEL_AVC_1b =9, + MFX_LEVEL_AVC_11 =11, + MFX_LEVEL_AVC_12 =12, + MFX_LEVEL_AVC_13 =13, + MFX_LEVEL_AVC_2 =20, + MFX_LEVEL_AVC_21 =21, + MFX_LEVEL_AVC_22 =22, + MFX_LEVEL_AVC_3 =30, + MFX_LEVEL_AVC_31 =31, + MFX_LEVEL_AVC_32 =32, + MFX_LEVEL_AVC_4 =40, + MFX_LEVEL_AVC_41 =41, + MFX_LEVEL_AVC_42 =42, + MFX_LEVEL_AVC_5 =50, + MFX_LEVEL_AVC_51 =51, + + /* MPEG-2 Profiles & Levels */ + MFX_PROFILE_MPEG2_SIMPLE =0x50, + MFX_PROFILE_MPEG2_MAIN =0x40, + MFX_PROFILE_MPEG2_HIGH =0x10, + + MFX_LEVEL_MPEG2_LOW =0xA, + MFX_LEVEL_MPEG2_MAIN =0x8, + MFX_LEVEL_MPEG2_HIGH =0x4, + MFX_LEVEL_MPEG2_HIGH1440 =0x6, + + /* VC1 Profiles & Levels */ + MFX_PROFILE_VC1_SIMPLE =(0+1), + MFX_PROFILE_VC1_MAIN =(4+1), + MFX_PROFILE_VC1_ADVANCED =(12+1), + + /* VC1 levels for simple & main profiles */ + MFX_LEVEL_VC1_LOW =(0+1), + MFX_LEVEL_VC1_MEDIAN =(2+1), + MFX_LEVEL_VC1_HIGH =(4+1), + + /* VC1 levels for the advanced profile */ + MFX_LEVEL_VC1_0 =(0x00+1), + MFX_LEVEL_VC1_1 =(0x01+1), + MFX_LEVEL_VC1_2 =(0x02+1), + MFX_LEVEL_VC1_3 =(0x03+1), + MFX_LEVEL_VC1_4 =(0x04+1) +}; + +/* GopOptFlag */ +enum { + MFX_GOP_CLOSED =1, + MFX_GOP_STRICT =2 +}; + +/* TargetUsages: from 1 to 7 inclusive */ +enum { + MFX_TARGETUSAGE_UNKNOWN =0, + MFX_TARGETUSAGE_BEST_QUALITY =1, + MFX_TARGETUSAGE_BALANCED =4, + MFX_TARGETUSAGE_BEST_SPEED =7 +}; + +/* RateControlMethod */ +enum { + MFX_RATECONTROL_CBR =1, + MFX_RATECONTROL_VBR =2, + MFX_RATECONTROL_CQP =3, + MFX_RATECONTROL_AVBR =4 +}; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved1; + mfxU16 RateDistortionOpt; /* tri-state option */ + mfxU16 MECostType; + mfxU16 MESearchType; + mfxI16Pair MVSearchWindow; + mfxU16 EndOfSequence; /* tri-state option */ + mfxU16 FramePicture; /* tri-state option */ + + union { + struct { /* AVC */ + mfxU16 CAVLC; /* tri-state option */ + mfxU16 reserved2[3]; + mfxU16 ViewOutput; /* tri-state option */ + mfxU16 NalHrdConformance; /* tri-state option */ + mfxU16 SingleSeiNalUnit; /* tri-state option */ + mfxU16 VuiVclHrdParameters; /* tri-state option */ + + mfxU16 RefPicListReordering; /* tri-state option */ + mfxU16 ResetRefList; /* tri-state option */ + mfxU16 RefPicMarkRep; /* tri-state option */ + mfxU16 FieldOutput; /* tri-state option */ + + mfxU16 IntraPredBlockSize; + mfxU16 InterPredBlockSize; + mfxU16 MVPrecision; + mfxU16 MaxDecFrameBuffering; + + mfxU16 AUDelimiter; /* tri-state option */ + mfxU16 EndOfStream; /* tri-state option */ + mfxU16 PicTimingSEI; /* tri-state option */ + mfxU16 VuiNalHrdParameters; /* tri-state option */ + }; + }; +} mfxExtCodingOption; + +/* IntraPredBlockSize/InterPredBlockSize */ +enum { + MFX_BLOCKSIZE_UNKNOWN = 0, + MFX_BLOCKSIZE_MIN_16X16 = 1, /* 16x16 */ + MFX_BLOCKSIZE_MIN_8X8 = 2, /* 16x16, 8x8 */ + MFX_BLOCKSIZE_MIN_4X4 = 3 /* 16x16, 8x8, 4x4 */ +}; + +/* MVPrecision */ +enum { + MFX_MVPRECISION_UNKNOWN = 0, + MFX_MVPRECISION_INTEGER = (1 << 0), + MFX_MVPRECISION_HALFPEL = (1 << 1), + MFX_MVPRECISION_QUARTERPEL = (1 << 2) +}; + +enum { + MFX_CODINGOPTION_UNKNOWN =0, + MFX_CODINGOPTION_ON =0x10, + MFX_CODINGOPTION_OFF =0x20 +}; + +typedef struct _mfxEncryptedData mfxEncryptedData; + +typedef struct { + union { + mfxEncryptedData* EncryptedData; + mfxU32 reserved[8]; + }; + mfxU64 TimeStamp; + mfxU8* Data; + mfxU32 DataOffset; + mfxU32 DataLength; + mfxU32 MaxLength; + + mfxU16 PicStruct; + mfxU16 FrameType; + mfxU16 DataFlag; + mfxU16 reserved2; +} mfxBitstream; + +/* Data Flag */ +enum { + MFX_BITSTREAM_COMPLETE_FRAME = 0x0001 /* the bitstream contains a complete frame or field pair of data */ +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_CODING_OPTION = MFX_MAKEFOURCC('C','D','O','P'), + MFX_EXTBUFF_CODING_OPTION_SPSPPS= MFX_MAKEFOURCC('C','O','S','P'), + MFX_EXTBUFF_VPP_DONOTUSE = MFX_MAKEFOURCC('N','U','S','E'), + MFX_EXTBUFF_VPP_AUXDATA = MFX_MAKEFOURCC('A','U','X','D'), + MFX_EXTBUFF_VPP_DENOISE = MFX_MAKEFOURCC('D','N','I','S'), + MFX_EXTBUFF_VPP_SCENE_ANALYSIS = MFX_MAKEFOURCC('S','C','L','Y'), + MFX_EXTBUFF_VPP_SCENE_CHANGE = MFX_EXTBUFF_VPP_SCENE_ANALYSIS, + MFX_EXTBUFF_VPP_PROCAMP = MFX_MAKEFOURCC('P','A','M','P'), + MFX_EXTBUFF_VPP_DETAIL = MFX_MAKEFOURCC('D','E','T',' '), + MFX_EXTBUFF_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','S','I','N'), + MFX_EXTBUFF_VPP_DOUSE = MFX_MAKEFOURCC('D','U','S','E'), + MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION = MFX_MAKEFOURCC('O','P','Q','S'), + MFX_EXTBUFF_AVC_REFLIST_CTRL = MFX_MAKEFOURCC('R','L','S','T'), + MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION = MFX_MAKEFOURCC('F','R','C',' '), + MFX_EXTBUFF_PICTURE_TIMING_SEI = MFX_MAKEFOURCC('P','T','S','E'), + MFX_EXTBUFF_AVC_TEMPORAL_LAYERS = MFX_MAKEFOURCC('A','T','M','L') +}; + +/* VPP Conf: Do not use certain algorithms */ +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32* AlgList; +} mfxExtVPPDoNotUse; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DenoiseFactor; +} mfxExtVPPDenoise; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DetailFactor; +} mfxExtVPPDetail; + +typedef struct { + mfxExtBuffer Header; + mfxF64 Brightness; + mfxF64 Contrast; + mfxF64 Hue; + mfxF64 Saturation; +} mfxExtVPPProcAmp; + +/* statistics collected for decode, encode and vpp */ +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU64 NumBit; + mfxU32 NumCachedFrame; +} mfxEncodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumSkippedFrame; + mfxU32 NumError; + mfxU32 NumCachedFrame; +} mfxDecodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumCachedFrame; +} mfxVPPStat; + +typedef struct { + mfxExtBuffer Header; + mfxU32 SpatialComplexity; + mfxU32 TemporalComplexity; + mfxU16 SceneChangeRate; + mfxU16 RepeatedFrame; +} mfxExtVppAuxData; + +typedef struct { + mfxU32 reserved[4]; + mfxU8 *Data; /* buffer pointer */ + mfxU32 NumBit; /* number of bits */ + mfxU16 Type; /* SEI message type in H.264 or user data start_code in MPEG-2 */ + mfxU16 BufSize; /* payload buffer size in bytes */ +} mfxPayload; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[5]; + mfxU16 reserved1; + + mfxU16 QP; /* per frame QP */ + + mfxU16 FrameType; + mfxU16 NumExtParam; + mfxU16 NumPayload; /* MPEG-2 user data or H.264 SEI message(s) */ + mfxU16 reserved2; + + mfxExtBuffer **ExtParam; + mfxPayload **Payload; /* for field pair, first field uses even payloads and second field uses odd payloads */ +} mfxEncodeCtrl; + +/* Buffer Memory Types */ +enum { + /* Buffer types */ + MFX_MEMTYPE_PERSISTENT_MEMORY =0x0002 +}; + +/* Frame Memory Types */ +#define MFX_MEMTYPE_BASE(x) (0xf0ff & (x)) + +enum { + MFX_MEMTYPE_DXVA2_DECODER_TARGET =0x0010, + MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET =0x0020, + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = MFX_MEMTYPE_DXVA2_DECODER_TARGET, + MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET, + MFX_MEMTYPE_SYSTEM_MEMORY =0x0040, + + MFX_MEMTYPE_FROM_ENCODE = 0x0100, + MFX_MEMTYPE_FROM_DECODE = 0x0200, + MFX_MEMTYPE_FROM_VPPIN = 0x0400, + MFX_MEMTYPE_FROM_VPPOUT = 0x0800, + + MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, + MFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, + MFX_MEMTYPE_OPAQUE_FRAME = 0x0004 +}; + +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxU16 Type; /* decoder or processor render targets */ + mfxU16 NumFrameMin; + mfxU16 NumFrameSuggested; + mfxU16 reserved2; +} mfxFrameAllocRequest; + +typedef struct { + mfxU32 reserved[4]; + mfxMemId *mids; /* the array allocated by application */ + mfxU16 NumFrameActual; + mfxU16 reserved2; +} mfxFrameAllocResponse; + +/* FrameType */ +enum { + MFX_FRAMETYPE_UNKNOWN =0x0000, + + MFX_FRAMETYPE_I =0x0001, + MFX_FRAMETYPE_P =0x0002, + MFX_FRAMETYPE_B =0x0004, + MFX_FRAMETYPE_S =0x0008, + + MFX_FRAMETYPE_REF =0x0040, + MFX_FRAMETYPE_IDR =0x0080, + + MFX_FRAMETYPE_xI =0x0100, + MFX_FRAMETYPE_xP =0x0200, + MFX_FRAMETYPE_xB =0x0400, + MFX_FRAMETYPE_xS =0x0800, + + MFX_FRAMETYPE_xREF =0x4000, + MFX_FRAMETYPE_xIDR =0x8000 +}; + +typedef enum { + MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 =1, /* IDirect3DDeviceManager9 */ + MFX_HANDLE_D3D9_DEVICE_MANAGER = MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9, + MFX_HANDLE_D3D11_DEVICE_AND_CONTEXT = 2, + MFX_HANDLE_D3D11_DEVICE = 3, + MFX_HANDLE_VA_DISPLAY = 4 +} mfxHandleType; + +typedef enum { + MFX_SKIPMODE_NOSKIP=0, + MFX_SKIPMODE_MORE=1, + MFX_SKIPMODE_LESS=2 +} mfxSkipMode; + +/* Library initialization and deinitialization */ +typedef mfxI32 mfxIMPL; +#define MFX_IMPL_BASETYPE(x) (0x00ff & (x)) + +enum { + MFX_IMPL_AUTO = 0x0000, /* Auto Selection/In or Not Supported/Out */ + MFX_IMPL_SOFTWARE = 0x0001, /* Pure Software Implementation */ + MFX_IMPL_HARDWARE = 0x0002, /* Hardware Accelerated Implementation (default device) */ + MFX_IMPL_AUTO_ANY = 0x0003, /* Auto selection of any hardware/software implementation */ + MFX_IMPL_HARDWARE_ANY = 0x0004, /* Auto selection of any hardware implementation */ + MFX_IMPL_HARDWARE2 = 0x0005, /* Hardware accelerated implementation (2nd device) */ + MFX_IMPL_HARDWARE3 = 0x0006, /* Hardware accelerated implementation (3rd device) */ + MFX_IMPL_HARDWARE4 = 0x0007, /* Hardware accelerated implementation (4th device) */ + + MFX_IMPL_VIA_ANY = 0x0100, + MFX_IMPL_VIA_D3D9 = 0x0200, + MFX_IMPL_VIA_D3D11 = 0x0300, + + MFX_IMPL_UNSUPPORTED = 0x0000 /* One of the MFXQueryIMPL returns */ +}; + +/* Version Info */ +typedef union { + struct { + mfxU16 Minor; + mfxU16 Major; + }; + mfxU32 Version; +} mfxVersion; + +typedef struct { + mfxExtBuffer Header; + mfxU8 *SPSBuffer; + mfxU8 *PPSBuffer; + mfxU16 SPSBufSize; + mfxU16 PPSBufSize; + mfxU16 SPSId; + mfxU16 PPSId; +} mfxExtCodingOptionSPSPPS; + +/* session priority */ +typedef enum +{ + MFX_PRIORITY_LOW = 0, + MFX_PRIORITY_NORMAL = 1, + MFX_PRIORITY_HIGH = 2 + +} mfxPriority; + +typedef struct { + mfxExtBuffer Header; + mfxU16 VideoFormat; + mfxU16 VideoFullRange; + mfxU16 ColourDescriptionPresent; + mfxU16 ColourPrimaries; + mfxU16 TransferCharacteristics; + mfxU16 MatrixCoefficients; +} mfxExtVideoSignalInfo; + +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32 *AlgList; +} mfxExtVPPDoUse; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[2]; + struct { + mfxFrameSurface1 **Surfaces; + mfxU32 reserved2[5]; + mfxU16 Type; + mfxU16 NumSurface; + } In, Out; +} mfxExtOpaqueSurfaceAlloc; + +typedef struct { + mfxExtBuffer Header; + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + + struct { + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 ViewId; + mfxU32 reserved[2]; + } PreferredRefList[32], RejectedRefList[16], LongTermRefList[16]; + + mfxU32 reserved[8]; +} mfxExtAVCRefListCtrl; + +enum { + MFX_FRCALGM_PRESERVE_TIMESTAMP = 1, + MFX_FRCALGM_DISTRIBUTED_TIMESTAMP = 2 +}; + +typedef struct { + mfxExtBuffer Header; + mfxU16 Algorithm; + mfxU16 reserved; + mfxU32 reserved2[15]; +} mfxExtVPPFrameRateConversion; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[14]; + + struct { + mfxU16 ClockTimestampFlag; + mfxU16 CtType; + mfxU16 NuitFieldBasedFlag; + mfxU16 CountingType; + mfxU16 FullTimestampFlag; + mfxU16 DiscontinuityFlag; + mfxU16 CntDroppedFlag; + mfxU16 NFrames; + mfxU16 SecondsFlag; + mfxU16 MinutesFlag; + mfxU16 HoursFlag; + mfxU16 SecondsValue; + mfxU16 MinutesValue; + mfxU16 HoursValue; + mfxU32 TimeOffset; + } TimeStamp[3]; +} mfxExtPictureTimingSEI; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[4]; + mfxU16 reserved2; + mfxU16 BaseLayerPID; + + struct { + mfxU16 Scale; + mfxU16 reserved[3]; + }Layer[8]; +} mfxExtAvcTemporalLayers; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo++.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo++.h new file mode 100644 index 0000000..e513b62 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo++.h @@ -0,0 +1,127 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2010 Intel Corporation. All Rights Reserved. + + +File Name: mfxvideo++.h + +\* ****************************************************************************** */ + +#ifndef __MFXVIDEOPLUSPLUS_H +#define __MFXVIDEOPLUSPLUS_H + +#include "mfxvideo.h" + +class MFXVideoSession +{ +public: + MFXVideoSession(void) { m_session = (mfxSession) 0; } + virtual ~MFXVideoSession(void) { Close(); } + + mfxStatus Init(mfxIMPL impl, mfxVersion *ver) { return MFXInit(impl, ver, &m_session); } + mfxStatus Close(void) + { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); m_session = (mfxSession) 0; + return mfxRes; + } + + mfxStatus QueryIMPL(mfxIMPL *impl) { return MFXQueryIMPL(m_session, impl); } + mfxStatus QueryVersion(mfxVersion *version) { return MFXQueryVersion(m_session, version); } + + mfxStatus JoinSession(mfxSession child_session) { return MFXJoinSession(m_session, child_session);} + mfxStatus DisjoinSession( ) { return MFXDisjoinSession(m_session);} + mfxStatus CloneSession( mfxSession *clone) { return MFXCloneSession(m_session, clone);} + mfxStatus SetPriority( mfxPriority priority) { return MFXSetPriority(m_session, priority);} + mfxStatus GetPriority( mfxPriority *priority) { return MFXGetPriority(m_session, priority);} + + mfxStatus SetBufferAllocator(mfxBufferAllocator *allocator) { return MFXVideoCORE_SetBufferAllocator(m_session, allocator); } + mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) { return MFXVideoCORE_SetFrameAllocator(m_session, allocator); } + mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) { return MFXVideoCORE_SetHandle(m_session, type, hdl); } + mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) { return MFXVideoCORE_GetHandle(m_session, type, hdl); } + + mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) { return MFXVideoCORE_SyncOperation(m_session, syncp, wait); } + + operator mfxSession (void) { return m_session; } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoENCODE +{ +public: + + MFXVideoENCODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoENCODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENCODE_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENCODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoENCODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoENCODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoENCODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoENCODE_GetVideoParam(m_session, par); } + mfxStatus GetEncodeStat(mfxEncodeStat *stat) { return MFXVideoENCODE_GetEncodeStat(m_session, stat); } + + mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) { return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE +{ +public: + + MFXVideoDECODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoDECODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoDECODE_Query(m_session, in, out); } + mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { return MFXVideoDECODE_DecodeHeader(m_session, bs, par); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoDECODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoDECODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoDECODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoDECODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoDECODE_GetVideoParam(m_session, par); } + + mfxStatus GetDecodeStat(mfxDecodeStat *stat) { return MFXVideoDECODE_GetDecodeStat(m_session, stat); } + mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) {return MFXVideoDECODE_GetPayload(m_session, ts, payload); } + mfxStatus SetSkipMode(mfxSkipMode mode) { return MFXVideoDECODE_SetSkipMode(m_session, mode); } + mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) { return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoVPP +{ +public: + + MFXVideoVPP(mfxSession session) { m_session = session; } + virtual ~MFXVideoVPP(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoVPP_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request[2]) { return MFXVideoVPP_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoVPP_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoVPP_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoVPP_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoVPP_GetVideoParam(m_session, par); } + mfxStatus GetVPPStat(mfxVPPStat *stat) { return MFXVideoVPP_GetVPPStat(m_session, stat); } + mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) { return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif // __MFXVIDEOPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo.h new file mode 100644 index 0000000..641dc7a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include/mfx/mfxvideo.h @@ -0,0 +1,117 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxvideo.h + +\* ****************************************************************************** */ +#ifndef __MFXVIDEO_H__ +#define __MFXVIDEO_H__ +#include "mfxstructures.h" + +/* This is the external include file for the Intel(R) Media Sofware Development Kit product */ +#define MFX_VERSION_MAJOR 1 +#define MFX_VERSION_MINOR 4 + +#ifdef _WIN32 + #define MFX_CDECL __cdecl + #define MFX_STDCALL __stdcall +#else + #define MFX_CDECL + #define MFX_STDCALL +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* MFXVideoCORE */ +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxU32 nbytes, mfxU16 type, mfxMemId *mid); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxU8 **ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxMemId mid); +} mfxBufferAllocator; + +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *GetHDL) (mfxHDL pthis, mfxMemId mid, mfxHDL *handle); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxFrameAllocResponse *response); +} mfxFrameAllocator; + +/* Global Functions */ +typedef struct _mfxSession *mfxSession; +mfxStatus MFX_CDECL MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session); +mfxStatus MFX_CDECL MFXClose(mfxSession session); + +mfxStatus MFX_CDECL MFXQueryIMPL(mfxSession session, mfxIMPL *impl); +mfxStatus MFX_CDECL MFXQueryVersion(mfxSession session, mfxVersion *version); + +mfxStatus MFX_CDECL MFXJoinSession(mfxSession session, mfxSession child); +mfxStatus MFX_CDECL MFXDisjoinSession(mfxSession session); +mfxStatus MFX_CDECL MFXCloneSession(mfxSession session, mfxSession *clone); +mfxStatus MFX_CDECL MFXSetPriority(mfxSession session, mfxPriority priority); +mfxStatus MFX_CDECL MFXGetPriority(mfxSession session, mfxPriority *priority); + +/* VideoCORE */ +mfxStatus MFX_CDECL MFXVideoCORE_SetBufferAllocator(mfxSession session, mfxBufferAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetFrameAllocator(mfxSession session, mfxFrameAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetHandle(mfxSession session, mfxHandleType type, mfxHDL hdl); +mfxStatus MFX_CDECL MFXVideoCORE_GetHandle(mfxSession session, mfxHandleType type, mfxHDL *hdl); + +typedef struct _mfxSyncPoint *mfxSyncPoint; +mfxStatus MFX_CDECL MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); + +/* VideoENCODE */ +mfxStatus MFX_CDECL MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoENCODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_GetEncodeStat(mfxSession session, mfxEncodeStat *stat); +mfxStatus MFX_CDECL MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp); + +/* VideoDECODE */ +mfxStatus MFX_CDECL MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoDECODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_GetDecodeStat(mfxSession session, mfxDecodeStat *stat); +mfxStatus MFX_CDECL MFXVideoDECODE_SetSkipMode(mfxSession session, mfxSkipMode mode); +mfxStatus MFX_CDECL MFXVideoDECODE_GetPayload(mfxSession session, mfxU64 *ts, mfxPayload *payload); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); + +/* VideoVPP */ +mfxStatus MFX_CDECL MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); +mfxStatus MFX_CDECL MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoVPP_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_GetVPPStat(mfxSession session, mfxVPPStat *stat); +mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avcodec.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avcodec.h new file mode 100644 index 0000000..18c3e3e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avcodec.h @@ -0,0 +1,6425 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVCODEC_AVCODEC_H +#define AVCODEC_AVCODEC_H + +/** + * @file + * @ingroup libavc + * Libavcodec external API header + */ + +#include +#include "libavutil/samplefmt.h" +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/cpu.h" +#include "libavutil/channel_layout.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "version.h" + +/** + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * + * @{ + * + * @defgroup lavc_decoding Decoding + * @{ + * @} + * + * @defgroup lavc_encoding Encoding + * @{ + * @} + * + * @defgroup lavc_codec Codecs + * @{ + * @defgroup lavc_codec_native Native Codecs + * @{ + * @} + * @defgroup lavc_codec_wrappers External library wrappers + * @{ + * @} + * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge + * @{ + * @} + * @} + * @defgroup lavc_internal Internal + * @{ + * @} + * @} + */ + +/** + * @ingroup libavc + * @defgroup lavc_encdec send/receive encoding and decoding API overview + * @{ + * + * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ + * avcodec_receive_packet() functions provide an encode/decode API, which + * decouples input and output. + * + * The API is very similar for encoding/decoding and audio/video, and works as + * follows: + * - Set up and open the AVCodecContext as usual. + * - Send valid input: + * - For decoding, call avcodec_send_packet() to give the decoder raw + * compressed data in an AVPacket. + * - For encoding, call avcodec_send_frame() to give the encoder an AVFrame + * containing uncompressed audio or video. + * In both cases, it is recommended that AVPackets and AVFrames are + * refcounted, or libavcodec might have to copy the input data. (libavformat + * always returns refcounted AVPackets, and av_frame_get_buffer() allocates + * refcounted AVFrames.) + * - Receive output in a loop. Periodically call one of the avcodec_receive_*() + * functions and process their output: + * - For decoding, call avcodec_receive_frame(). On success, it will return + * an AVFrame containing uncompressed audio or video data. + * - For encoding, call avcodec_receive_packet(). On success, it will return + * an AVPacket with a compressed frame. + * Repeat this call until it returns AVERROR(EAGAIN) or an error. The + * AVERROR(EAGAIN) return value means that new input data is required to + * return new output. In this case, continue with sending input. For each + * input frame/packet, the codec will typically return 1 output frame/packet, + * but it can also be 0 or more than 1. + * + * At the beginning of decoding or encoding, the codec might accept multiple + * input frames/packets without returning a frame, until its internal buffers + * are filled. This situation is handled transparently if you follow the steps + * outlined above. + * + * In theory, sending input can result in EAGAIN - this should happen only if + * not all output was received. You can use this to structure alternative decode + * or encode loops other than the one suggested above. For example, you could + * try sending new input on each iteration, and try to receive output if that + * returns EAGAIN. + * + * End of stream situations. These require "flushing" (aka draining) the codec, + * as the codec might buffer multiple frames or packets internally for + * performance or out of necessity (consider B-frames). + * This is handled as follows: + * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) + * or avcodec_send_frame() (encoding) functions. This will enter draining + * mode. + * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() + * (encoding) in a loop until AVERROR_EOF is returned. The functions will + * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. + * - Before decoding can be resumed again, the codec has to be reset with + * avcodec_flush_buffers(). + * + * Using the API as outlined above is highly recommended. But it is also + * possible to call functions outside of this rigid schema. For example, you can + * call avcodec_send_packet() repeatedly without calling + * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed + * until the codec's internal buffer has been filled up (which is typically of + * size 1 per output frame, after initial input), and then reject input with + * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to + * read at least some output. + * + * Not all codecs will follow a rigid and predictable dataflow; the only + * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on + * one end implies that a receive/send call on the other end will succeed, or + * at least will not fail with AVERROR(EAGAIN). In general, no codec will + * permit unlimited buffering of input or output. + * + * This API replaces the following legacy functions: + * - avcodec_decode_video2() and avcodec_decode_audio4(): + * Use avcodec_send_packet() to feed input to the decoder, then use + * avcodec_receive_frame() to receive decoded frames after each packet. + * Unlike with the old video decoding API, multiple frames might result from + * a packet. For audio, splitting the input packet into frames by partially + * decoding packets becomes transparent to the API user. You never need to + * feed an AVPacket to the API twice (unless it is rejected with AVERROR(EAGAIN) - then + * no data was read from the packet). + * Additionally, sending a flush/draining packet is required only once. + * - avcodec_encode_video2()/avcodec_encode_audio2(): + * Use avcodec_send_frame() to feed input to the encoder, then use + * avcodec_receive_packet() to receive encoded packets. + * Providing user-allocated buffers for avcodec_receive_packet() is not + * possible. + * - The new API does not handle subtitles yet. + * + * Mixing new and old function calls on the same AVCodecContext is not allowed, + * and will result in undefined behavior. + * + * Some codecs might require using the new API; using the old API will return + * an error when calling it. All codecs support the new API. + * + * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This + * would be an invalid state, which could put the codec user into an endless + * loop. The API has no concept of time either: it cannot happen that trying to + * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second + * later accepts the packet (with no other receive/flush API calls involved). + * The API is a strict state machine, and the passage of time is not supposed + * to influence it. Some timing-dependent behavior might still be deemed + * acceptable in certain cases. But it must never result in both send/receive + * returning EAGAIN at the same time at any point. It must also absolutely be + * avoided that the current state is "unstable" and can "flip-flop" between + * the send/receive APIs allowing progress. For example, it's not allowed that + * the codec randomly decides that it actually wants to consume a packet now + * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an + * avcodec_send_packet() call. + * @} + */ + +/** + * @defgroup lavc_core Core functions/structures. + * @ingroup libavc + * + * Basic definitions, functions for querying libavcodec capabilities, + * allocating core structures, etc. + * @{ + */ + + +/** + * Identify the syntax and semantics of the bitstream. + * The principle is roughly: + * Two decoders with the same ID can decode the same streams. + * Two encoders with the same ID can encode compatible streams. + * There may be slight deviations from the principle due to implementation + * details. + * + * If you add a codec ID to this list, add it so that + * 1. no value of an existing codec ID changes (that would break ABI), + * 2. it is as close as possible to similar codecs + * + * After adding new codec IDs, do not forget to add an entry to the codec + * descriptor list and bump libavcodec minor version. + */ +enum AVCodecID { + AV_CODEC_ID_NONE, + + /* video codecs */ + AV_CODEC_ID_MPEG1VIDEO, + AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding +#if FF_API_XVMC + AV_CODEC_ID_MPEG2VIDEO_XVMC, +#endif /* FF_API_XVMC */ + AV_CODEC_ID_H261, + AV_CODEC_ID_H263, + AV_CODEC_ID_RV10, + AV_CODEC_ID_RV20, + AV_CODEC_ID_MJPEG, + AV_CODEC_ID_MJPEGB, + AV_CODEC_ID_LJPEG, + AV_CODEC_ID_SP5X, + AV_CODEC_ID_JPEGLS, + AV_CODEC_ID_MPEG4, + AV_CODEC_ID_RAWVIDEO, + AV_CODEC_ID_MSMPEG4V1, + AV_CODEC_ID_MSMPEG4V2, + AV_CODEC_ID_MSMPEG4V3, + AV_CODEC_ID_WMV1, + AV_CODEC_ID_WMV2, + AV_CODEC_ID_H263P, + AV_CODEC_ID_H263I, + AV_CODEC_ID_FLV1, + AV_CODEC_ID_SVQ1, + AV_CODEC_ID_SVQ3, + AV_CODEC_ID_DVVIDEO, + AV_CODEC_ID_HUFFYUV, + AV_CODEC_ID_CYUV, + AV_CODEC_ID_H264, + AV_CODEC_ID_INDEO3, + AV_CODEC_ID_VP3, + AV_CODEC_ID_THEORA, + AV_CODEC_ID_ASV1, + AV_CODEC_ID_ASV2, + AV_CODEC_ID_FFV1, + AV_CODEC_ID_4XM, + AV_CODEC_ID_VCR1, + AV_CODEC_ID_CLJR, + AV_CODEC_ID_MDEC, + AV_CODEC_ID_ROQ, + AV_CODEC_ID_INTERPLAY_VIDEO, + AV_CODEC_ID_XAN_WC3, + AV_CODEC_ID_XAN_WC4, + AV_CODEC_ID_RPZA, + AV_CODEC_ID_CINEPAK, + AV_CODEC_ID_WS_VQA, + AV_CODEC_ID_MSRLE, + AV_CODEC_ID_MSVIDEO1, + AV_CODEC_ID_IDCIN, + AV_CODEC_ID_8BPS, + AV_CODEC_ID_SMC, + AV_CODEC_ID_FLIC, + AV_CODEC_ID_TRUEMOTION1, + AV_CODEC_ID_VMDVIDEO, + AV_CODEC_ID_MSZH, + AV_CODEC_ID_ZLIB, + AV_CODEC_ID_QTRLE, + AV_CODEC_ID_TSCC, + AV_CODEC_ID_ULTI, + AV_CODEC_ID_QDRAW, + AV_CODEC_ID_VIXL, + AV_CODEC_ID_QPEG, + AV_CODEC_ID_PNG, + AV_CODEC_ID_PPM, + AV_CODEC_ID_PBM, + AV_CODEC_ID_PGM, + AV_CODEC_ID_PGMYUV, + AV_CODEC_ID_PAM, + AV_CODEC_ID_FFVHUFF, + AV_CODEC_ID_RV30, + AV_CODEC_ID_RV40, + AV_CODEC_ID_VC1, + AV_CODEC_ID_WMV3, + AV_CODEC_ID_LOCO, + AV_CODEC_ID_WNV1, + AV_CODEC_ID_AASC, + AV_CODEC_ID_INDEO2, + AV_CODEC_ID_FRAPS, + AV_CODEC_ID_TRUEMOTION2, + AV_CODEC_ID_BMP, + AV_CODEC_ID_CSCD, + AV_CODEC_ID_MMVIDEO, + AV_CODEC_ID_ZMBV, + AV_CODEC_ID_AVS, + AV_CODEC_ID_SMACKVIDEO, + AV_CODEC_ID_NUV, + AV_CODEC_ID_KMVC, + AV_CODEC_ID_FLASHSV, + AV_CODEC_ID_CAVS, + AV_CODEC_ID_JPEG2000, + AV_CODEC_ID_VMNC, + AV_CODEC_ID_VP5, + AV_CODEC_ID_VP6, + AV_CODEC_ID_VP6F, + AV_CODEC_ID_TARGA, + AV_CODEC_ID_DSICINVIDEO, + AV_CODEC_ID_TIERTEXSEQVIDEO, + AV_CODEC_ID_TIFF, + AV_CODEC_ID_GIF, + AV_CODEC_ID_DXA, + AV_CODEC_ID_DNXHD, + AV_CODEC_ID_THP, + AV_CODEC_ID_SGI, + AV_CODEC_ID_C93, + AV_CODEC_ID_BETHSOFTVID, + AV_CODEC_ID_PTX, + AV_CODEC_ID_TXD, + AV_CODEC_ID_VP6A, + AV_CODEC_ID_AMV, + AV_CODEC_ID_VB, + AV_CODEC_ID_PCX, + AV_CODEC_ID_SUNRAST, + AV_CODEC_ID_INDEO4, + AV_CODEC_ID_INDEO5, + AV_CODEC_ID_MIMIC, + AV_CODEC_ID_RL2, + AV_CODEC_ID_ESCAPE124, + AV_CODEC_ID_DIRAC, + AV_CODEC_ID_BFI, + AV_CODEC_ID_CMV, + AV_CODEC_ID_MOTIONPIXELS, + AV_CODEC_ID_TGV, + AV_CODEC_ID_TGQ, + AV_CODEC_ID_TQI, + AV_CODEC_ID_AURA, + AV_CODEC_ID_AURA2, + AV_CODEC_ID_V210X, + AV_CODEC_ID_TMV, + AV_CODEC_ID_V210, + AV_CODEC_ID_DPX, + AV_CODEC_ID_MAD, + AV_CODEC_ID_FRWU, + AV_CODEC_ID_FLASHSV2, + AV_CODEC_ID_CDGRAPHICS, + AV_CODEC_ID_R210, + AV_CODEC_ID_ANM, + AV_CODEC_ID_BINKVIDEO, + AV_CODEC_ID_IFF_ILBM, +#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM + AV_CODEC_ID_KGV1, + AV_CODEC_ID_YOP, + AV_CODEC_ID_VP8, + AV_CODEC_ID_PICTOR, + AV_CODEC_ID_ANSI, + AV_CODEC_ID_A64_MULTI, + AV_CODEC_ID_A64_MULTI5, + AV_CODEC_ID_R10K, + AV_CODEC_ID_MXPEG, + AV_CODEC_ID_LAGARITH, + AV_CODEC_ID_PRORES, + AV_CODEC_ID_JV, + AV_CODEC_ID_DFA, + AV_CODEC_ID_WMV3IMAGE, + AV_CODEC_ID_VC1IMAGE, + AV_CODEC_ID_UTVIDEO, + AV_CODEC_ID_BMV_VIDEO, + AV_CODEC_ID_VBLE, + AV_CODEC_ID_DXTORY, + AV_CODEC_ID_V410, + AV_CODEC_ID_XWD, + AV_CODEC_ID_CDXL, + AV_CODEC_ID_XBM, + AV_CODEC_ID_ZEROCODEC, + AV_CODEC_ID_MSS1, + AV_CODEC_ID_MSA1, + AV_CODEC_ID_TSCC2, + AV_CODEC_ID_MTS2, + AV_CODEC_ID_CLLC, + AV_CODEC_ID_MSS2, + AV_CODEC_ID_VP9, + AV_CODEC_ID_AIC, + AV_CODEC_ID_ESCAPE130, + AV_CODEC_ID_G2M, + AV_CODEC_ID_WEBP, + AV_CODEC_ID_HNM4_VIDEO, + AV_CODEC_ID_HEVC, +#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC + AV_CODEC_ID_FIC, + AV_CODEC_ID_ALIAS_PIX, + AV_CODEC_ID_BRENDER_PIX, + AV_CODEC_ID_PAF_VIDEO, + AV_CODEC_ID_EXR, + AV_CODEC_ID_VP7, + AV_CODEC_ID_SANM, + AV_CODEC_ID_SGIRLE, + AV_CODEC_ID_MVC1, + AV_CODEC_ID_MVC2, + AV_CODEC_ID_HQX, + AV_CODEC_ID_TDSC, + AV_CODEC_ID_HQ_HQA, + AV_CODEC_ID_HAP, + AV_CODEC_ID_DDS, + AV_CODEC_ID_DXV, + AV_CODEC_ID_SCREENPRESSO, + AV_CODEC_ID_RSCC, + + AV_CODEC_ID_Y41P = 0x8000, + AV_CODEC_ID_AVRP, + AV_CODEC_ID_012V, + AV_CODEC_ID_AVUI, + AV_CODEC_ID_AYUV, + AV_CODEC_ID_TARGA_Y216, + AV_CODEC_ID_V308, + AV_CODEC_ID_V408, + AV_CODEC_ID_YUV4, + AV_CODEC_ID_AVRN, + AV_CODEC_ID_CPIA, + AV_CODEC_ID_XFACE, + AV_CODEC_ID_SNOW, + AV_CODEC_ID_SMVJPEG, + AV_CODEC_ID_APNG, + AV_CODEC_ID_DAALA, + AV_CODEC_ID_CFHD, + AV_CODEC_ID_TRUEMOTION2RT, + AV_CODEC_ID_M101, + AV_CODEC_ID_MAGICYUV, + AV_CODEC_ID_SHEERVIDEO, + AV_CODEC_ID_YLC, + AV_CODEC_ID_PSD, + AV_CODEC_ID_PIXLET, + AV_CODEC_ID_SPEEDHQ, + AV_CODEC_ID_FMVC, + AV_CODEC_ID_SCPR, + AV_CODEC_ID_CLEARVIDEO, + AV_CODEC_ID_XPM, + AV_CODEC_ID_AV1, + AV_CODEC_ID_BITPACKED, + AV_CODEC_ID_MSCC, + AV_CODEC_ID_SRGC, + AV_CODEC_ID_SVG, + AV_CODEC_ID_GDV, + AV_CODEC_ID_FITS, + + /* various PCM "codecs" */ + AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs + AV_CODEC_ID_PCM_S16LE = 0x10000, + AV_CODEC_ID_PCM_S16BE, + AV_CODEC_ID_PCM_U16LE, + AV_CODEC_ID_PCM_U16BE, + AV_CODEC_ID_PCM_S8, + AV_CODEC_ID_PCM_U8, + AV_CODEC_ID_PCM_MULAW, + AV_CODEC_ID_PCM_ALAW, + AV_CODEC_ID_PCM_S32LE, + AV_CODEC_ID_PCM_S32BE, + AV_CODEC_ID_PCM_U32LE, + AV_CODEC_ID_PCM_U32BE, + AV_CODEC_ID_PCM_S24LE, + AV_CODEC_ID_PCM_S24BE, + AV_CODEC_ID_PCM_U24LE, + AV_CODEC_ID_PCM_U24BE, + AV_CODEC_ID_PCM_S24DAUD, + AV_CODEC_ID_PCM_ZORK, + AV_CODEC_ID_PCM_S16LE_PLANAR, + AV_CODEC_ID_PCM_DVD, + AV_CODEC_ID_PCM_F32BE, + AV_CODEC_ID_PCM_F32LE, + AV_CODEC_ID_PCM_F64BE, + AV_CODEC_ID_PCM_F64LE, + AV_CODEC_ID_PCM_BLURAY, + AV_CODEC_ID_PCM_LXF, + AV_CODEC_ID_S302M, + AV_CODEC_ID_PCM_S8_PLANAR, + AV_CODEC_ID_PCM_S24LE_PLANAR, + AV_CODEC_ID_PCM_S32LE_PLANAR, + AV_CODEC_ID_PCM_S16BE_PLANAR, + + AV_CODEC_ID_PCM_S64LE = 0x10800, + AV_CODEC_ID_PCM_S64BE, + AV_CODEC_ID_PCM_F16LE, + AV_CODEC_ID_PCM_F24LE, + + /* various ADPCM codecs */ + AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, + AV_CODEC_ID_ADPCM_IMA_WAV, + AV_CODEC_ID_ADPCM_IMA_DK3, + AV_CODEC_ID_ADPCM_IMA_DK4, + AV_CODEC_ID_ADPCM_IMA_WS, + AV_CODEC_ID_ADPCM_IMA_SMJPEG, + AV_CODEC_ID_ADPCM_MS, + AV_CODEC_ID_ADPCM_4XM, + AV_CODEC_ID_ADPCM_XA, + AV_CODEC_ID_ADPCM_ADX, + AV_CODEC_ID_ADPCM_EA, + AV_CODEC_ID_ADPCM_G726, + AV_CODEC_ID_ADPCM_CT, + AV_CODEC_ID_ADPCM_SWF, + AV_CODEC_ID_ADPCM_YAMAHA, + AV_CODEC_ID_ADPCM_SBPRO_4, + AV_CODEC_ID_ADPCM_SBPRO_3, + AV_CODEC_ID_ADPCM_SBPRO_2, + AV_CODEC_ID_ADPCM_THP, + AV_CODEC_ID_ADPCM_IMA_AMV, + AV_CODEC_ID_ADPCM_EA_R1, + AV_CODEC_ID_ADPCM_EA_R3, + AV_CODEC_ID_ADPCM_EA_R2, + AV_CODEC_ID_ADPCM_IMA_EA_SEAD, + AV_CODEC_ID_ADPCM_IMA_EA_EACS, + AV_CODEC_ID_ADPCM_EA_XAS, + AV_CODEC_ID_ADPCM_EA_MAXIS_XA, + AV_CODEC_ID_ADPCM_IMA_ISS, + AV_CODEC_ID_ADPCM_G722, + AV_CODEC_ID_ADPCM_IMA_APC, + AV_CODEC_ID_ADPCM_VIMA, +#if FF_API_VIMA_DECODER + AV_CODEC_ID_VIMA = AV_CODEC_ID_ADPCM_VIMA, +#endif + + AV_CODEC_ID_ADPCM_AFC = 0x11800, + AV_CODEC_ID_ADPCM_IMA_OKI, + AV_CODEC_ID_ADPCM_DTK, + AV_CODEC_ID_ADPCM_IMA_RAD, + AV_CODEC_ID_ADPCM_G726LE, + AV_CODEC_ID_ADPCM_THP_LE, + AV_CODEC_ID_ADPCM_PSX, + AV_CODEC_ID_ADPCM_AICA, + AV_CODEC_ID_ADPCM_IMA_DAT4, + AV_CODEC_ID_ADPCM_MTAF, + + /* AMR */ + AV_CODEC_ID_AMR_NB = 0x12000, + AV_CODEC_ID_AMR_WB, + + /* RealAudio codecs*/ + AV_CODEC_ID_RA_144 = 0x13000, + AV_CODEC_ID_RA_288, + + /* various DPCM codecs */ + AV_CODEC_ID_ROQ_DPCM = 0x14000, + AV_CODEC_ID_INTERPLAY_DPCM, + AV_CODEC_ID_XAN_DPCM, + AV_CODEC_ID_SOL_DPCM, + + AV_CODEC_ID_SDX2_DPCM = 0x14800, + AV_CODEC_ID_GREMLIN_DPCM, + + /* audio codecs */ + AV_CODEC_ID_MP2 = 0x15000, + AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 + AV_CODEC_ID_AAC, + AV_CODEC_ID_AC3, + AV_CODEC_ID_DTS, + AV_CODEC_ID_VORBIS, + AV_CODEC_ID_DVAUDIO, + AV_CODEC_ID_WMAV1, + AV_CODEC_ID_WMAV2, + AV_CODEC_ID_MACE3, + AV_CODEC_ID_MACE6, + AV_CODEC_ID_VMDAUDIO, + AV_CODEC_ID_FLAC, + AV_CODEC_ID_MP3ADU, + AV_CODEC_ID_MP3ON4, + AV_CODEC_ID_SHORTEN, + AV_CODEC_ID_ALAC, + AV_CODEC_ID_WESTWOOD_SND1, + AV_CODEC_ID_GSM, ///< as in Berlin toast format + AV_CODEC_ID_QDM2, + AV_CODEC_ID_COOK, + AV_CODEC_ID_TRUESPEECH, + AV_CODEC_ID_TTA, + AV_CODEC_ID_SMACKAUDIO, + AV_CODEC_ID_QCELP, + AV_CODEC_ID_WAVPACK, + AV_CODEC_ID_DSICINAUDIO, + AV_CODEC_ID_IMC, + AV_CODEC_ID_MUSEPACK7, + AV_CODEC_ID_MLP, + AV_CODEC_ID_GSM_MS, /* as found in WAV */ + AV_CODEC_ID_ATRAC3, +#if FF_API_VOXWARE + AV_CODEC_ID_VOXWARE, +#endif + AV_CODEC_ID_APE, + AV_CODEC_ID_NELLYMOSER, + AV_CODEC_ID_MUSEPACK8, + AV_CODEC_ID_SPEEX, + AV_CODEC_ID_WMAVOICE, + AV_CODEC_ID_WMAPRO, + AV_CODEC_ID_WMALOSSLESS, + AV_CODEC_ID_ATRAC3P, + AV_CODEC_ID_EAC3, + AV_CODEC_ID_SIPR, + AV_CODEC_ID_MP1, + AV_CODEC_ID_TWINVQ, + AV_CODEC_ID_TRUEHD, + AV_CODEC_ID_MP4ALS, + AV_CODEC_ID_ATRAC1, + AV_CODEC_ID_BINKAUDIO_RDFT, + AV_CODEC_ID_BINKAUDIO_DCT, + AV_CODEC_ID_AAC_LATM, + AV_CODEC_ID_QDMC, + AV_CODEC_ID_CELT, + AV_CODEC_ID_G723_1, + AV_CODEC_ID_G729, + AV_CODEC_ID_8SVX_EXP, + AV_CODEC_ID_8SVX_FIB, + AV_CODEC_ID_BMV_AUDIO, + AV_CODEC_ID_RALF, + AV_CODEC_ID_IAC, + AV_CODEC_ID_ILBC, + AV_CODEC_ID_OPUS, + AV_CODEC_ID_COMFORT_NOISE, + AV_CODEC_ID_TAK, + AV_CODEC_ID_METASOUND, + AV_CODEC_ID_PAF_AUDIO, + AV_CODEC_ID_ON2AVC, + AV_CODEC_ID_DSS_SP, + + AV_CODEC_ID_FFWAVESYNTH = 0x15800, + AV_CODEC_ID_SONIC, + AV_CODEC_ID_SONIC_LS, + AV_CODEC_ID_EVRC, + AV_CODEC_ID_SMV, + AV_CODEC_ID_DSD_LSBF, + AV_CODEC_ID_DSD_MSBF, + AV_CODEC_ID_DSD_LSBF_PLANAR, + AV_CODEC_ID_DSD_MSBF_PLANAR, + AV_CODEC_ID_4GV, + AV_CODEC_ID_INTERPLAY_ACM, + AV_CODEC_ID_XMA1, + AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, + AV_CODEC_ID_ATRAC3AL, + AV_CODEC_ID_ATRAC3PAL, + AV_CODEC_ID_DOLBY_E, + + /* subtitle codecs */ + AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. + AV_CODEC_ID_DVD_SUBTITLE = 0x17000, + AV_CODEC_ID_DVB_SUBTITLE, + AV_CODEC_ID_TEXT, ///< raw UTF-8 text + AV_CODEC_ID_XSUB, + AV_CODEC_ID_SSA, + AV_CODEC_ID_MOV_TEXT, + AV_CODEC_ID_HDMV_PGS_SUBTITLE, + AV_CODEC_ID_DVB_TELETEXT, + AV_CODEC_ID_SRT, + + AV_CODEC_ID_MICRODVD = 0x17800, + AV_CODEC_ID_EIA_608, + AV_CODEC_ID_JACOSUB, + AV_CODEC_ID_SAMI, + AV_CODEC_ID_REALTEXT, + AV_CODEC_ID_STL, + AV_CODEC_ID_SUBVIEWER1, + AV_CODEC_ID_SUBVIEWER, + AV_CODEC_ID_SUBRIP, + AV_CODEC_ID_WEBVTT, + AV_CODEC_ID_MPL2, + AV_CODEC_ID_VPLAYER, + AV_CODEC_ID_PJS, + AV_CODEC_ID_ASS, + AV_CODEC_ID_HDMV_TEXT_SUBTITLE, + + /* other specific kind of codecs (generally used for attachments) */ + AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. + AV_CODEC_ID_TTF = 0x18000, + + AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. + AV_CODEC_ID_BINTEXT = 0x18800, + AV_CODEC_ID_XBIN, + AV_CODEC_ID_IDF, + AV_CODEC_ID_OTF, + AV_CODEC_ID_SMPTE_KLV, + AV_CODEC_ID_DVD_NAV, + AV_CODEC_ID_TIMED_ID3, + AV_CODEC_ID_BIN_DATA, + + + AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it + + AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS + * stream (only used by libavformat) */ + AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems + * stream (only used by libavformat) */ + AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. + AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket +}; + +/** + * This struct describes the properties of a single codec described by an + * AVCodecID. + * @see avcodec_descriptor_get() + */ +typedef struct AVCodecDescriptor { + enum AVCodecID id; + enum AVMediaType type; + /** + * Name of the codec described by this descriptor. It is non-empty and + * unique for each codec descriptor. It should contain alphanumeric + * characters and '_' only. + */ + const char *name; + /** + * A more descriptive name for this codec. May be NULL. + */ + const char *long_name; + /** + * Codec properties, a combination of AV_CODEC_PROP_* flags. + */ + int props; + /** + * MIME type(s) associated with the codec. + * May be NULL; if not, a NULL-terminated array of MIME types. + * The first item is always non-NULL and is the preferred MIME type. + */ + const char *const *mime_types; + /** + * If non-NULL, an array of profiles recognized for this codec. + * Terminated with FF_PROFILE_UNKNOWN. + */ + const struct AVProfile *profiles; +} AVCodecDescriptor; + +/** + * Codec uses only intra compression. + * Video and audio codecs only. + */ +#define AV_CODEC_PROP_INTRA_ONLY (1 << 0) +/** + * Codec supports lossy compression. Audio and video codecs only. + * @note a codec may support both lossy and lossless + * compression modes + */ +#define AV_CODEC_PROP_LOSSY (1 << 1) +/** + * Codec supports lossless compression. Audio and video codecs only. + */ +#define AV_CODEC_PROP_LOSSLESS (1 << 2) +/** + * Codec supports frame reordering. That is, the coded order (the order in which + * the encoded packets are output by the encoders / stored / input to the + * decoders) may be different from the presentation order of the corresponding + * frames. + * + * For codecs that do not have this property set, PTS and DTS should always be + * equal. + */ +#define AV_CODEC_PROP_REORDER (1 << 3) +/** + * Subtitle codec is bitmap based + * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. + */ +#define AV_CODEC_PROP_BITMAP_SUB (1 << 16) +/** + * Subtitle codec is text based. + * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field. + */ +#define AV_CODEC_PROP_TEXT_SUB (1 << 17) + +/** + * @ingroup lavc_decoding + * Required number of additionally allocated bytes at the end of the input bitstream for decoding. + * This is mainly needed because some optimized bitstream readers read + * 32 or 64 bit at once and could read over the end.
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged + * MPEG bitstreams could cause overread and segfault. + */ +#define AV_INPUT_BUFFER_PADDING_SIZE 32 + +/** + * @ingroup lavc_encoding + * minimum encoding buffer size + * Used to avoid some checks during header writing. + */ +#define AV_INPUT_BUFFER_MIN_SIZE 16384 + +#if FF_API_WITHOUT_PREFIX +/** + * @deprecated use AV_INPUT_BUFFER_PADDING_SIZE instead + */ +#define FF_INPUT_BUFFER_PADDING_SIZE 32 + +/** + * @deprecated use AV_INPUT_BUFFER_MIN_SIZE instead + */ +#define FF_MIN_BUFFER_SIZE 16384 +#endif /* FF_API_WITHOUT_PREFIX */ + +/** + * @ingroup lavc_encoding + * motion estimation type. + * @deprecated use codec private option instead + */ +#if FF_API_MOTION_EST +enum Motion_Est_ID { + ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed + ME_FULL, + ME_LOG, + ME_PHODS, + ME_EPZS, ///< enhanced predictive zonal search + ME_X1, ///< reserved for experiments + ME_HEX, ///< hexagon based search + ME_UMH, ///< uneven multi-hexagon search + ME_TESA, ///< transformed exhaustive search algorithm + ME_ITER=50, ///< iterative search +}; +#endif + +/** + * @ingroup lavc_decoding + */ +enum AVDiscard{ + /* We leave some space between them for extensions (drop some + * keyframes for intra-only or drop just some bidir frames). */ + AVDISCARD_NONE =-16, ///< discard nothing + AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi + AVDISCARD_NONREF = 8, ///< discard all non reference + AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames + AVDISCARD_NONINTRA= 24, ///< discard all non intra frames + AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes + AVDISCARD_ALL = 48, ///< discard all +}; + +enum AVAudioServiceType { + AV_AUDIO_SERVICE_TYPE_MAIN = 0, + AV_AUDIO_SERVICE_TYPE_EFFECTS = 1, + AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2, + AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3, + AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4, + AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5, + AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6, + AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7, + AV_AUDIO_SERVICE_TYPE_KARAOKE = 8, + AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI +}; + +/** + * @ingroup lavc_encoding + */ +typedef struct RcOverride{ + int start_frame; + int end_frame; + int qscale; // If this is 0 then quality_factor will be used instead. + float quality_factor; +} RcOverride; + +#if FF_API_MAX_BFRAMES +/** + * @deprecated there is no libavcodec-wide limit on the number of B-frames + */ +#define FF_MAX_B_FRAMES 16 +#endif + +/* encoding support + These flags can be passed in AVCodecContext.flags before initialization. + Note: Not everything is supported yet. +*/ + +/** + * Allow decoders to produce frames with data planes that are not aligned + * to CPU requirements (e.g. due to cropping). + */ +#define AV_CODEC_FLAG_UNALIGNED (1 << 0) +/** + * Use fixed qscale. + */ +#define AV_CODEC_FLAG_QSCALE (1 << 1) +/** + * 4 MV per MB allowed / advanced prediction for H.263. + */ +#define AV_CODEC_FLAG_4MV (1 << 2) +/** + * Output even those frames that might be corrupted. + */ +#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3) +/** + * Use qpel MC. + */ +#define AV_CODEC_FLAG_QPEL (1 << 4) +/** + * Use internal 2pass ratecontrol in first pass mode. + */ +#define AV_CODEC_FLAG_PASS1 (1 << 9) +/** + * Use internal 2pass ratecontrol in second pass mode. + */ +#define AV_CODEC_FLAG_PASS2 (1 << 10) +/** + * loop filter. + */ +#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11) +/** + * Only decode/encode grayscale. + */ +#define AV_CODEC_FLAG_GRAY (1 << 13) +/** + * error[?] variables will be set during encoding. + */ +#define AV_CODEC_FLAG_PSNR (1 << 15) +/** + * Input bitstream might be truncated at a random location + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG_TRUNCATED (1 << 16) +/** + * Use interlaced DCT. + */ +#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18) +/** + * Force low delay. + */ +#define AV_CODEC_FLAG_LOW_DELAY (1 << 19) +/** + * Place global headers in extradata instead of every keyframe. + */ +#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) +/** + * Use only bitexact stuff (except (I)DCT). + */ +#define AV_CODEC_FLAG_BITEXACT (1 << 23) +/* Fx : Flag for H.263+ extra options */ +/** + * H.263 advanced intra coding / MPEG-4 AC prediction + */ +#define AV_CODEC_FLAG_AC_PRED (1 << 24) +/** + * interlaced motion estimation + */ +#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) +#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) + +/** + * Allow non spec compliant speedup tricks. + */ +#define AV_CODEC_FLAG2_FAST (1 << 0) +/** + * Skip bitstream encoding. + */ +#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2) +/** + * Place global headers at every keyframe instead of in extradata. + */ +#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3) + +/** + * timecode is in drop frame format. DEPRECATED!!!! + */ +#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13) + +/** + * Input bitstream might be truncated at a packet boundaries + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG2_CHUNKS (1 << 15) +/** + * Discard cropping information from SPS. + */ +#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16) + +/** + * Show all frames before the first keyframe + */ +#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) +/** + * Export motion vectors through frame side data + */ +#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) +/** + * Do not skip samples and export skip information as frame side data + */ +#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) +/** + * Do not reset ASS ReadOrder field on flush (subtitles decoding) + */ +#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +/** + * Decoder can use draw_horiz_band callback. + */ +#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0) +/** + * Codec uses get_buffer() for allocating buffers and supports custom allocators. + * If not set, it might not use get_buffer() at all or use operations that + * assume the buffer was allocated by avcodec_default_get_buffer. + */ +#define AV_CODEC_CAP_DR1 (1 << 1) +#define AV_CODEC_CAP_TRUNCATED (1 << 3) +/** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + */ +#define AV_CODEC_CAP_DELAY (1 << 5) +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) + +#if FF_API_CAP_VDPAU +/** + * Codec can export data for HW decoding (VDPAU). + */ +#define AV_CODEC_CAP_HWACCEL_VDPAU (1 << 7) +#endif + +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carrying such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define AV_CODEC_CAP_SUBFRAMES (1 << 8) +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9) +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10) +/** + * Codec supports frame-level multithreading. + */ +#define AV_CODEC_CAP_FRAME_THREADS (1 << 12) +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define AV_CODEC_CAP_SLICE_THREADS (1 << 13) +/** + * Codec supports changed parameters at any point. + */ +#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14) +/** + * Codec supports avctx->thread_count == 0 (auto). + */ +#define AV_CODEC_CAP_AUTO_THREADS (1 << 15) +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) +/** + * Decoder is not a preferred choice for probing. + * This indicates that the decoder is not a good choice for probing. + * It could for example be an expensive to spin up hardware decoder, + * or it could simply not provide a lot of useful information about + * the stream. + * A decoder marked with this flag should only be used as last resort + * choice for probing. + */ +#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) +/** + * Codec is intra only. + */ +#define AV_CODEC_CAP_INTRA_ONLY 0x40000000 +/** + * Codec is lossless. + */ +#define AV_CODEC_CAP_LOSSLESS 0x80000000 + + +#if FF_API_WITHOUT_PREFIX +/** + * Allow decoders to produce frames with data planes that are not aligned + * to CPU requirements (e.g. due to cropping). + */ +#define CODEC_FLAG_UNALIGNED AV_CODEC_FLAG_UNALIGNED +#define CODEC_FLAG_QSCALE AV_CODEC_FLAG_QSCALE +#define CODEC_FLAG_4MV AV_CODEC_FLAG_4MV +#define CODEC_FLAG_OUTPUT_CORRUPT AV_CODEC_FLAG_OUTPUT_CORRUPT +#define CODEC_FLAG_QPEL AV_CODEC_FLAG_QPEL +#if FF_API_GMC +/** + * @deprecated use the "gmc" private option of the libxvid encoder + */ +#define CODEC_FLAG_GMC 0x0020 ///< Use GMC. +#endif +#if FF_API_MV0 +/** + * @deprecated use the flag "mv0" in the "mpv_flags" private option of the + * mpegvideo encoders + */ +#define CODEC_FLAG_MV0 0x0040 +#endif +#if FF_API_INPUT_PRESERVED +/** + * @deprecated passing reference-counted frames to the encoders replaces this + * flag + */ +#define CODEC_FLAG_INPUT_PRESERVED 0x0100 +#endif +#define CODEC_FLAG_PASS1 AV_CODEC_FLAG_PASS1 +#define CODEC_FLAG_PASS2 AV_CODEC_FLAG_PASS2 +#define CODEC_FLAG_GRAY AV_CODEC_FLAG_GRAY +#if FF_API_EMU_EDGE +/** + * @deprecated edges are not used/required anymore. I.e. this flag is now always + * set. + */ +#define CODEC_FLAG_EMU_EDGE 0x4000 +#endif +#define CODEC_FLAG_PSNR AV_CODEC_FLAG_PSNR +#define CODEC_FLAG_TRUNCATED AV_CODEC_FLAG_TRUNCATED + +#if FF_API_NORMALIZE_AQP +/** + * @deprecated use the flag "naq" in the "mpv_flags" private option of the + * mpegvideo encoders + */ +#define CODEC_FLAG_NORMALIZE_AQP 0x00020000 +#endif +#define CODEC_FLAG_INTERLACED_DCT AV_CODEC_FLAG_INTERLACED_DCT +#define CODEC_FLAG_LOW_DELAY AV_CODEC_FLAG_LOW_DELAY +#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER +#define CODEC_FLAG_BITEXACT AV_CODEC_FLAG_BITEXACT +#define CODEC_FLAG_AC_PRED AV_CODEC_FLAG_AC_PRED +#define CODEC_FLAG_LOOP_FILTER AV_CODEC_FLAG_LOOP_FILTER +#define CODEC_FLAG_INTERLACED_ME AV_CODEC_FLAG_INTERLACED_ME +#define CODEC_FLAG_CLOSED_GOP AV_CODEC_FLAG_CLOSED_GOP +#define CODEC_FLAG2_FAST AV_CODEC_FLAG2_FAST +#define CODEC_FLAG2_NO_OUTPUT AV_CODEC_FLAG2_NO_OUTPUT +#define CODEC_FLAG2_LOCAL_HEADER AV_CODEC_FLAG2_LOCAL_HEADER +#define CODEC_FLAG2_DROP_FRAME_TIMECODE AV_CODEC_FLAG2_DROP_FRAME_TIMECODE +#define CODEC_FLAG2_IGNORE_CROP AV_CODEC_FLAG2_IGNORE_CROP + +#define CODEC_FLAG2_CHUNKS AV_CODEC_FLAG2_CHUNKS +#define CODEC_FLAG2_SHOW_ALL AV_CODEC_FLAG2_SHOW_ALL +#define CODEC_FLAG2_EXPORT_MVS AV_CODEC_FLAG2_EXPORT_MVS +#define CODEC_FLAG2_SKIP_MANUAL AV_CODEC_FLAG2_SKIP_MANUAL + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +#define CODEC_CAP_DRAW_HORIZ_BAND AV_CODEC_CAP_DRAW_HORIZ_BAND ///< Decoder can use draw_horiz_band callback. +/** + * Codec uses get_buffer() for allocating buffers and supports custom allocators. + * If not set, it might not use get_buffer() at all or use operations that + * assume the buffer was allocated by avcodec_default_get_buffer. + */ +#define CODEC_CAP_DR1 AV_CODEC_CAP_DR1 +#define CODEC_CAP_TRUNCATED AV_CODEC_CAP_TRUNCATED +#if FF_API_XVMC +/* Codec can export data for HW decoding. This flag indicates that + * the codec would call get_format() with list that might contain HW accelerated + * pixel formats (XvMC, VDPAU, VAAPI, etc). The application can pick any of them + * including raw image format. + * The application can use the passed context to determine bitstream version, + * chroma format, resolution etc. + */ +#define CODEC_CAP_HWACCEL 0x0010 +#endif /* FF_API_XVMC */ +/** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + */ +#define CODEC_CAP_DELAY AV_CODEC_CAP_DELAY +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define CODEC_CAP_SMALL_LAST_FRAME AV_CODEC_CAP_SMALL_LAST_FRAME +#if FF_API_CAP_VDPAU +/** + * Codec can export data for HW decoding (VDPAU). + */ +#define CODEC_CAP_HWACCEL_VDPAU AV_CODEC_CAP_HWACCEL_VDPAU +#endif +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carrying such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define CODEC_CAP_SUBFRAMES AV_CODEC_CAP_SUBFRAMES +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define CODEC_CAP_EXPERIMENTAL AV_CODEC_CAP_EXPERIMENTAL +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define CODEC_CAP_CHANNEL_CONF AV_CODEC_CAP_CHANNEL_CONF +#if FF_API_NEG_LINESIZES +/** + * @deprecated no codecs use this capability + */ +#define CODEC_CAP_NEG_LINESIZES 0x0800 +#endif +/** + * Codec supports frame-level multithreading. + */ +#define CODEC_CAP_FRAME_THREADS AV_CODEC_CAP_FRAME_THREADS +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define CODEC_CAP_SLICE_THREADS AV_CODEC_CAP_SLICE_THREADS +/** + * Codec supports changed parameters at any point. + */ +#define CODEC_CAP_PARAM_CHANGE AV_CODEC_CAP_PARAM_CHANGE +/** + * Codec supports avctx->thread_count == 0 (auto). + */ +#define CODEC_CAP_AUTO_THREADS AV_CODEC_CAP_AUTO_THREADS +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define CODEC_CAP_VARIABLE_FRAME_SIZE AV_CODEC_CAP_VARIABLE_FRAME_SIZE +/** + * Codec is intra only. + */ +#define CODEC_CAP_INTRA_ONLY AV_CODEC_CAP_INTRA_ONLY +/** + * Codec is lossless. + */ +#define CODEC_CAP_LOSSLESS AV_CODEC_CAP_LOSSLESS + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 +#endif /* FF_API_WITHOUT_PREFIX */ + +#if FF_API_MB_TYPE +//The following defines may change, don't expect compatibility if you use them. +#define MB_TYPE_INTRA4x4 0x0001 +#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific +#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific +#define MB_TYPE_16x16 0x0008 +#define MB_TYPE_16x8 0x0010 +#define MB_TYPE_8x16 0x0020 +#define MB_TYPE_8x8 0x0040 +#define MB_TYPE_INTERLACED 0x0080 +#define MB_TYPE_DIRECT2 0x0100 //FIXME +#define MB_TYPE_ACPRED 0x0200 +#define MB_TYPE_GMC 0x0400 +#define MB_TYPE_SKIP 0x0800 +#define MB_TYPE_P0L0 0x1000 +#define MB_TYPE_P1L0 0x2000 +#define MB_TYPE_P0L1 0x4000 +#define MB_TYPE_P1L1 0x8000 +#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0) +#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1) +#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1) +#define MB_TYPE_QUANT 0x00010000 +#define MB_TYPE_CBP 0x00020000 +// Note bits 24-31 are reserved for codec specific use (H.264 ref0, MPEG-1 0mv, ...) +#endif + +/** + * Pan Scan area. + * This specifies the area which should be displayed. + * Note there may be multiple such areas for one frame. + */ +typedef struct AVPanScan{ + /** + * id + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int id; + + /** + * width and height in 1/16 pel + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int width; + int height; + + /** + * position of the top left corner in 1/16 pel for up to 3 fields/frames + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int16_t position[3][2]; +}AVPanScan; + +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int max_bitrate; + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int min_bitrate; + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ + int avg_bitrate; + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; + +#if FF_API_QSCALE_TYPE +#define FF_QSCALE_TYPE_MPEG1 0 +#define FF_QSCALE_TYPE_MPEG2 1 +#define FF_QSCALE_TYPE_H264 2 +#define FF_QSCALE_TYPE_VP56 3 +#endif + +/** + * The decoder will keep a reference to the frame and may reuse it later. + */ +#define AV_GET_BUFFER_FLAG_REF (1 << 0) + +/** + * @defgroup lavc_packet AVPacket + * + * Types and functions for working with AVPacket. + * @{ + */ +enum AVPacketSideDataType { + /** + * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE + * bytes worth of palette. This side data signals that a new palette is + * present. + */ + AV_PKT_DATA_PALETTE, + + /** + * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format + * that the extradata buffer was changed and the receiving side should + * act upon it appropriately. The new extradata is embedded in the side + * data buffer and should be immediately used for processing the current + * frame or packet. + */ + AV_PKT_DATA_NEW_EXTRADATA, + + /** + * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: + * @code + * u32le param_flags + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) + * s32le channel_count + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) + * u64le channel_layout + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) + * s32le sample_rate + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) + * s32le width + * s32le height + * @endcode + */ + AV_PKT_DATA_PARAM_CHANGE, + + /** + * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of + * structures with info about macroblocks relevant to splitting the + * packet into smaller packets on macroblock edges (e.g. as for RFC 2190). + * That is, it does not necessarily contain info about all macroblocks, + * as long as the distance between macroblocks in the info is smaller + * than the target payload size. + * Each MB info structure is 12 bytes, and is laid out as follows: + * @code + * u32le bit offset from the start of the packet + * u8 current quantizer at the start of the macroblock + * u8 GOB number + * u16le macroblock address within the GOB + * u8 horizontal MV predictor + * u8 vertical MV predictor + * u8 horizontal MV predictor for block number 3 + * u8 vertical MV predictor for block number 3 + * @endcode + */ + AV_PKT_DATA_H263_MB_INFO, + + /** + * This side data should be associated with an audio stream and contains + * ReplayGain information in form of the AVReplayGain struct. + */ + AV_PKT_DATA_REPLAYGAIN, + + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the decoded video frames for + * correct presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_PKT_DATA_DISPLAYMATRIX, + + /** + * This side data should be associated with a video stream and contains + * Stereoscopic 3D information in form of the AVStereo3D struct. + */ + AV_PKT_DATA_STEREO3D, + + /** + * This side data should be associated with an audio stream and corresponds + * to enum AVAudioServiceType. + */ + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + + /** + * This side data contains quality related information from the encoder. + * @code + * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). + * u8 picture type + * u8 error count + * u16 reserved + * u64le[error count] sum of squared differences between encoder in and output + * @endcode + */ + AV_PKT_DATA_QUALITY_STATS, + + /** + * This side data contains an integer value representing the stream index + * of a "fallback" track. A fallback track indicates an alternate + * track to use when the current track can not be decoded for some reason. + * e.g. no decoder available for codec. + */ + AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, + + /** + * Recommmends skipping the specified number of samples + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_PKT_DATA_SKIP_SAMPLES=70, + + /** + * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that + * the packet may contain "dual mono" audio specific to Japanese DTV + * and if it is true, recommends only the selected channel to be used. + * @code + * u8 selected channels (0=mail/left, 1=sub/right, 2=both) + * @endcode + */ + AV_PKT_DATA_JP_DUALMONO, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. + */ + AV_PKT_DATA_STRINGS_METADATA, + + /** + * Subtitle event position + * @code + * u32le x1 + * u32le y1 + * u32le x2 + * u32le y2 + * @endcode + */ + AV_PKT_DATA_SUBTITLE_POSITION, + + /** + * Data found in BlockAdditional element of matroska container. There is + * no end marker for the data, so it is required to rely on the side data + * size to recognize the end. 8 byte id (as found in BlockAddId) followed + * by data. + */ + AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, + + /** + * The optional first identifier line of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_IDENTIFIER, + + /** + * The optional settings (rendering instructions) that immediately + * follow the timestamp specifier of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_SETTINGS, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. This + * side data includes updated metadata which appeared in the stream. + */ + AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID, this is required to pass the stream ID + * information from the demuxer to the corresponding muxer. + */ + AV_PKT_DATA_MPEGTS_STREAM_ID, + + /** + * Mastering display metadata (based on SMPTE-2086:2014). This metadata + * should be associated with a video stream and contains data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This metadata should be + * associated with a video stream and contains data in the form of the + * AVContentLightMetadata struct. + */ + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + + /** + * ATSC A53 Part 4 Closed Captions. This metadata should be associated with + * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. + * The number of bytes of CC data is AVPacketSideData.size. + */ + AV_PKT_DATA_A53_CC, + + /** + * The number of side data elements (in fact a bit more than it). + * This is not part of the public API/ABI in the sense that it may + * change when new side data types are added. + * This must stay the last enum value. + * If its value becomes huge, some code using it + * needs to be updated as it assumes it to be smaller than other limits. + */ + AV_PKT_DATA_NB +}; + +#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED + +typedef struct AVPacketSideData { + uint8_t *data; + int size; + enum AVPacketSideDataType type; +} AVPacketSideData; + +/** + * This structure stores compressed data. It is typically exported by demuxers + * and then passed as input to decoders, or received as output from encoders and + * then passed to muxers. + * + * For video, it should typically contain one compressed frame. For audio it may + * contain several compressed frames. Encoders are allowed to output empty + * packets, with no compressed data, containing only side data + * (e.g. to update some stream parameters at the end of encoding). + * + * AVPacket is one of the few structs in FFmpeg, whose size is a part of public + * ABI. Thus it may be allocated on stack and no new fields can be added to it + * without libavcodec and libavformat major bump. + * + * The semantics of data ownership depends on the buf field. + * If it is set, the packet data is dynamically allocated and is + * valid indefinitely until a call to av_packet_unref() reduces the + * reference count to 0. + * + * If the buf field is not set av_packet_ref() would make a copy instead + * of increasing the reference count. + * + * The side data is always allocated with av_malloc(), copied by + * av_packet_ref() and freed by av_packet_unref(). + * + * @see av_packet_ref + * @see av_packet_unref + */ +typedef struct AVPacket { + /** + * A reference to the reference-counted buffer where the packet data is + * stored. + * May be NULL, then the packet data is not reference-counted. + */ + AVBufferRef *buf; + /** + * Presentation timestamp in AVStream->time_base units; the time at which + * the decompressed packet will be presented to the user. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + * pts MUST be larger or equal to dts as presentation cannot happen before + * decompression, unless one wants to view hex dumps. Some formats misuse + * the terms dts and pts/cts to mean something different. Such timestamps + * must be converted to true pts/dts before they are stored in AVPacket. + */ + int64_t pts; + /** + * Decompression timestamp in AVStream->time_base units; the time at which + * the packet is decompressed. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + */ + int64_t dts; + uint8_t *data; + int size; + int stream_index; + /** + * A combination of AV_PKT_FLAG values + */ + int flags; + /** + * Additional packet data that can be provided by the container. + * Packet can contain several types of side information. + */ + AVPacketSideData *side_data; + int side_data_elems; + + /** + * Duration of this packet in AVStream->time_base units, 0 if unknown. + * Equals next_pts - this_pts in presentation order. + */ + int64_t duration; + + int64_t pos; ///< byte position in stream, -1 if unknown + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated Same as the duration field, but as int64_t. This was required + * for Matroska subtitles, whose duration values could overflow when the + * duration field was still an int. + */ + attribute_deprecated + int64_t convergence_duration; +#endif +} AVPacket; +#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe +#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * Flag is used to discard packets which are required to maintain valid + * decoder state but are not required for output and should be dropped + * after decoding. + **/ +#define AV_PKT_FLAG_DISCARD 0x0004 +/** + * The packet comes from a trusted source. + * + * Otherwise-unsafe constructs such as arbitrary pointers to data + * outside the packet may be followed. + */ +#define AV_PKT_FLAG_TRUSTED 0x0008 + +enum AVSideDataParamChangeFlags { + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, + AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, + AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, +}; +/** + * @} + */ + +struct AVCodecInternal; + +enum AVFieldOrder { + AV_FIELD_UNKNOWN, + AV_FIELD_PROGRESSIVE, + AV_FIELD_TT, //< Top coded_first, top displayed first + AV_FIELD_BB, //< Bottom coded first, bottom displayed first + AV_FIELD_TB, //< Top coded first, bottom displayed first + AV_FIELD_BT, //< Bottom coded first, top displayed first +}; + +/** + * main external API structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * applications. + * The name string for AVOptions options matches the associated command line + * parameter name and can be found in libavcodec/options_table.h + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + * sizeof(AVCodecContext) must not be used outside libav*. + */ +typedef struct AVCodecContext { + /** + * information on struct for av_log + * - set by avcodec_alloc_context3 + */ + const AVClass *av_class; + int log_level_offset; + + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + const struct AVCodec *codec; +#if FF_API_CODEC_NAME + /** + * @deprecated this field is not used for anything in libavcodec + */ + attribute_deprecated + char codec_name[32]; +#endif + enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ + + /** + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * A demuxer should set this to what is stored in the field used to identify the codec. + * If there are multiple such fields in a container then the demuxer should choose the one + * which maximizes the information about the used codec. + * If the codec tag field in a container is larger than 32 bits then the demuxer should + * remap the longer ID to 32 bits with a table or other structure. Alternatively a new + * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated + * first. + * - encoding: Set by user, if not then the default based on codec_id will be used. + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int codec_tag; + +#if FF_API_STREAM_CODEC_TAG + /** + * @deprecated this field is unused + */ + attribute_deprecated + unsigned int stream_codec_tag; +#endif + + void *priv_data; + + /** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + */ + struct AVCodecInternal *internal; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + + /** + * the average bitrate + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: Set by user, may be overwritten by libavcodec + * if this info is available in the stream + */ + int64_t bit_rate; + + /** + * number of bits the bitstream is allowed to diverge from the reference. + * the reference can be CBR (for CBR pass1) or VBR (for pass2) + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: unused + */ + int bit_rate_tolerance; + + /** + * Global quality for codecs which cannot change it per frame. + * This should be proportional to MPEG-1/2/4 qscale. + * - encoding: Set by user. + * - decoding: unused + */ + int global_quality; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + + /** + * AV_CODEC_FLAG_*. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags; + + /** + * AV_CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags2; + + /** + * some codecs need / can use extradata like Huffman tables. + * MJPEG: Huffman tables + * rv10: additional flags + * MPEG-4: global headers (they can be in the bitstream or here) + * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger + * than extradata_size to avoid problems if it is read with the bitstream reader. + * The bytewise contents of extradata must not depend on the architecture or CPU endianness. + * - encoding: Set/allocated/freed by libavcodec. + * - decoding: Set/allocated/freed by user. + */ + uint8_t *extradata; + int extradata_size; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identically 1. + * This often, but not always is the inverse of the frame rate or field rate + * for video. 1/time_base is not the average frame rate if the frame rate is not + * constant. + * + * Like containers, elementary streams also can store timestamps, 1/time_base + * is the unit in which these timestamps are specified. + * As example of such codec time base see ISO/IEC 14496-2:2001(E) + * vop_time_increment_resolution and fixed_vop_rate + * (fixed_vop_rate == 0 implies that it is different from the framerate) + * + * - encoding: MUST be set by user. + * - decoding: the use of this field for decoding is deprecated. + * Use framerate instead. + */ + AVRational time_base; + + /** + * For some codecs, the time base is closer to the field rate than the frame rate. + * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration + * if no telecine is used ... + * + * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. + */ + int ticks_per_frame; + + /** + * Codec delay. + * + * Encoding: Number of frames delay there will be from the encoder input to + * the decoder output. (we assume the decoder matches the spec) + * Decoding: Number of frames delay in addition to what a standard decoder + * as specified in the spec would produce. + * + * Video: + * Number of frames the decoded output will be delayed relative to the + * encoded input. + * + * Audio: + * For encoding, this field is unused (see initial_padding). + * + * For decoding, this is the number of samples the decoder needs to + * output before the decoder's output is valid. When seeking, you should + * start decoding this many samples prior to your desired seek point. + * + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int delay; + + + /* video only */ + /** + * picture width / height. + * + * @note Those fields may not match the values of the last + * AVFrame output by avcodec_decode_video2 due frame + * reordering. + * + * - encoding: MUST be set by user. + * - decoding: May be set by the user before opening the decoder if known e.g. + * from the container. Some decoders will require the dimensions + * to be set by the caller. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int width, height; + + /** + * Bitstream width / height, may be different from width/height e.g. when + * the decoded frame is cropped before being output or lowres is enabled. + * + * @note Those field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: unused + * - decoding: May be set by the user before opening the decoder if known + * e.g. from the container. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int coded_width, coded_height; + +#if FF_API_ASPECT_EXTENDED +#define FF_ASPECT_EXTENDED 15 +#endif + + /** + * the number of pictures in a group of pictures, or 0 for intra_only + * - encoding: Set by user. + * - decoding: unused + */ + int gop_size; + + /** + * Pixel format, see AV_PIX_FMT_xxx. + * May be set by the demuxer if known from headers. + * May be overridden by the decoder if it knows better. + * + * @note This field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: Set by user. + * - decoding: Set by user if known, overridden by libavcodec while + * parsing the data. + */ + enum AVPixelFormat pix_fmt; + +#if FF_API_MOTION_EST + /** + * This option does nothing + * @deprecated use codec private options instead + */ + attribute_deprecated int me_method; +#endif + + /** + * If non NULL, 'draw_horiz_band' is called by the libavcodec + * decoder to draw a horizontal band. It improves cache usage. Not + * all codecs can do that. You must check the codec capabilities + * beforehand. + * When multithreading is used, it may be called from multiple threads + * at the same time; threads might draw different parts of the same AVFrame, + * or multiple AVFrames, and there is no guarantee that slices will be drawn + * in order. + * The function is also used by hardware acceleration APIs. + * It is called at least once during frame decoding to pass + * the data needed for hardware render. + * In that mode instead of pixel data, AVFrame points to + * a structure specific to the acceleration API. The application + * reads the structure and can change some fields to indicate progress + * or mark state. + * - encoding: unused + * - decoding: Set by user. + * @param height the height of the slice + * @param y the y position of the slice + * @param type 1->top field, 2->bottom field, 3->frame + * @param offset offset into the AVFrame.data from which the slice should be read + */ + void (*draw_horiz_band)(struct AVCodecContext *s, + const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], + int y, int type, int height); + + /** + * callback to negotiate the pixelFormat + * @param fmt is the list of formats which are supported by the codec, + * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. + * The first is always the native one. + * @note The callback may be called again immediately if initialization for + * the selected (hardware-accelerated) pixel format failed. + * @warning Behavior is undefined if the callback returns a value not + * in the fmt list of formats. + * @return the chosen format + * - encoding: unused + * - decoding: Set by user, if not set the native format will be chosen. + */ + enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + + /** + * maximum number of B-frames between non-B-frames + * Note: The output will be delayed by max_b_frames+1 relative to the input. + * - encoding: Set by user. + * - decoding: unused + */ + int max_b_frames; + + /** + * qscale factor between IP and B-frames + * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_factor; + +#if FF_API_RC_STRATEGY + /** @deprecated use codec private option instead */ + attribute_deprecated int rc_strategy; +#define FF_RC_STRATEGY_XVID 1 +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_frame_strategy; +#endif + + /** + * qscale offset between IP and B-frames + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_offset; + + /** + * Size of the frame reordering buffer in the decoder. + * For MPEG-2 it is 1 IPB or 0 low delay IP. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int has_b_frames; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int mpeg_quant; +#endif + + /** + * qscale factor between P- and I-frames + * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_factor; + + /** + * qscale offset between P and I-frames + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_offset; + + /** + * luminance masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float lumi_masking; + + /** + * temporary complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float temporal_cplx_masking; + + /** + * spatial complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float spatial_cplx_masking; + + /** + * p block masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float p_masking; + + /** + * darkness masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float dark_masking; + + /** + * slice count + * - encoding: Set by libavcodec. + * - decoding: Set by user (or 0). + */ + int slice_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int prediction_method; +#define FF_PRED_LEFT 0 +#define FF_PRED_PLANE 1 +#define FF_PRED_MEDIAN 2 +#endif + + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + + /** + * sample aspect ratio (0 if unknown) + * That is the width of a pixel divided by the height of the pixel. + * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVRational sample_aspect_ratio; + + /** + * motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_cmp; + /** + * subpixel motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_sub_cmp; + /** + * macroblock comparison function (not supported yet) + * - encoding: Set by user. + * - decoding: unused + */ + int mb_cmp; + /** + * interlaced DCT comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int ildct_cmp; +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_MEDIAN_SAD 15 +#define FF_CMP_CHROMA 256 + + /** + * ME diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int dia_size; + + /** + * amount of previous MV predictors (2a+1 x 2a+1 square) + * - encoding: Set by user. + * - decoding: unused + */ + int last_predictor_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int pre_me; +#endif + + /** + * motion estimation prepass comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_pre_cmp; + + /** + * ME prepass diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int pre_dia_size; + + /** + * subpel ME quality + * - encoding: Set by user. + * - decoding: unused + */ + int me_subpel_quality; + +#if FF_API_AFD + /** + * DTG active format information (additional aspect ratio + * information only used in DVB MPEG-2 transport streams) + * 0 if not set. + * + * - encoding: unused + * - decoding: Set by decoder. + * @deprecated Deprecated in favor of AVSideData + */ + attribute_deprecated int dtg_active_format; +#define FF_DTG_AFD_SAME 8 +#define FF_DTG_AFD_4_3 9 +#define FF_DTG_AFD_16_9 10 +#define FF_DTG_AFD_14_9 11 +#define FF_DTG_AFD_4_3_SP_14_9 13 +#define FF_DTG_AFD_16_9_SP_14_9 14 +#define FF_DTG_AFD_SP_4_3 15 +#endif /* FF_API_AFD */ + + /** + * maximum motion estimation search range in subpel units + * If 0 then no limit. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_range; + +#if FF_API_QUANT_BIAS + /** + * @deprecated use encoder private option instead + */ + attribute_deprecated int intra_quant_bias; +#define FF_DEFAULT_QUANT_BIAS 999999 + + /** + * @deprecated use encoder private option instead + */ + attribute_deprecated int inter_quant_bias; +#endif + + /** + * slice flags + * - encoding: unused + * - decoding: Set by user. + */ + int slice_flags; +#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) +#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) + +#if FF_API_XVMC + /** + * XVideo Motion Acceleration + * - encoding: forbidden + * - decoding: set by decoder + * @deprecated XvMC doesn't need it anymore. + */ + attribute_deprecated int xvmc_acceleration; +#endif /* FF_API_XVMC */ + + /** + * macroblock decision mode + * - encoding: Set by user. + * - decoding: unused + */ + int mb_decision; +#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp +#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits +#define FF_MB_DECISION_RD 2 ///< rate distortion + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: Set by libavcodec. + */ + uint16_t *intra_matrix; + + /** + * custom inter quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: Set by libavcodec. + */ + uint16_t *inter_matrix; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int scenechange_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int noise_reduction; +#endif + +#if FF_API_MPV_OPT + /** + * @deprecated this field is unused + */ + attribute_deprecated + int me_threshold; + + /** + * @deprecated this field is unused + */ + attribute_deprecated + int mb_threshold; +#endif + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: Set by libavcodec + */ + int intra_dc_precision; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + float border_masking; +#endif + + /** + * minimum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + +#if FF_API_PRIVATE_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int me_penalty_compensation; +#endif + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int brd_scale; +#endif + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int chromaoffset; +#endif + +#if FF_API_UNUSED_MEMBERS + /** + * Multiplied by qscale for each frame and added to scene_change_score. + * - encoding: Set by user. + * - decoding: unused + */ + attribute_deprecated int scenechange_factor; +#endif + + /** + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + int mv0_threshold; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_sensitivity; +#endif + + /** + * Chromaticity coordinates of the source primaries. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorPrimaries color_primaries; + + /** + * Color Transfer Characteristic. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by user. + */ + enum AVFieldOrder field_order; + + /* audio only */ + int sample_rate; ///< samples per second + int channels; ///< number of audio channels + + /** + * audio sample format + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< sample format + + /* The following data should not be initialized. */ + /** + * Number of samples per channel in an audio frame. + * + * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame + * except the last must contain exactly frame_size samples per channel. + * May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the + * frame size is not restricted. + * - decoding: may be set by some decoders to indicate constant frame size + */ + int frame_size; + + /** + * Frame counter, set by libavcodec. + * + * - decoding: total number of frames returned from the decoder so far. + * - encoding: total number of frames passed to the encoder so far. + * + * @note the counter is not incremented if encoding/decoding resulted in + * an error. + */ + int frame_number; + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + + /** + * Audio channel layout. + * - encoding: set by user. + * - decoding: set by user, may be overwritten by libavcodec. + */ + uint64_t channel_layout; + + /** + * Request decoder to use this channel layout if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + */ + uint64_t request_channel_layout; + + /** + * Type of service that the audio stream conveys. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVAudioServiceType audio_service_type; + + /** + * desired sample format + * - encoding: Not used. + * - decoding: Set by user. + * Decoder will decode to this format if it can. + */ + enum AVSampleFormat request_sample_fmt; + + /** + * This callback is called at the beginning of each frame to get data + * buffer(s) for it. There may be one contiguous buffer for all the data or + * there may be a buffer per each data plane or anything in between. What + * this means is, you may set however many entries in buf[] you feel necessary. + * Each buffer must be reference-counted using the AVBuffer API (see description + * of buf[] below). + * + * The following fields will be set in the frame before this callback is + * called: + * - format + * - width, height (video only) + * - sample_rate, channel_layout, nb_samples (audio only) + * Their values may differ from the corresponding values in + * AVCodecContext. This callback must use the frame values, not the codec + * context values, to calculate the required buffer size. + * + * This callback must fill the following fields in the frame: + * - data[] + * - linesize[] + * - extended_data: + * * if the data is planar audio with more than 8 channels, then this + * callback must allocate and fill extended_data to contain all pointers + * to all data planes. data[] must hold as many pointers as it can. + * extended_data must be allocated with av_malloc() and will be freed in + * av_frame_unref(). + * * otherwise extended_data must point to data + * - buf[] must contain one or more pointers to AVBufferRef structures. Each of + * the frame's data and extended_data pointers must be contained in these. That + * is, one AVBufferRef for each allocated chunk of memory, not necessarily one + * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), + * and av_buffer_ref(). + * - extended_buf and nb_extended_buf must be allocated with av_malloc() by + * this callback and filled with the extra buffers if there are more + * buffers than buf[] can hold. extended_buf will be freed in + * av_frame_unref(). + * + * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call + * avcodec_default_get_buffer2() instead of providing buffers allocated by + * some other means. + * + * Each data plane must be aligned to the maximum required by the target + * CPU. + * + * @see avcodec_default_get_buffer2() + * + * Video: + * + * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused + * (read and/or written to if it is writable) later by libavcodec. + * + * avcodec_align_dimensions2() should be used to find the required width and + * height, as they normally need to be rounded up to the next multiple of 16. + * + * Some decoders do not support linesizes changing between frames. + * + * If frame multithreading is used and thread_safe_callbacks is set, + * this callback may be called from a different thread, but not from more + * than one at once. Does not need to be reentrant. + * + * @see avcodec_align_dimensions2() + * + * Audio: + * + * Decoders request a buffer of a particular size by setting + * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, + * however, utilize only part of the buffer by setting AVFrame.nb_samples + * to a smaller value in the output frame. + * + * As a convenience, av_samples_get_buffer_size() and + * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() + * functions to find the required data size and to fill data pointers and + * linesize. In AVFrame.linesize, only linesize[0] may be set for audio + * since all planes must be the same size. + * + * @see av_samples_get_buffer_size(), av_samples_fill_arrays() + * + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); + + /** + * If non-zero, the decoded audio and video frames returned from + * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted + * and are valid indefinitely. The caller must free them with + * av_frame_unref() when they are not needed anymore. + * Otherwise, the decoded frames must not be freed by the caller and are + * only valid until the next decode call. + * + * This is always automatically enabled if avcodec_receive_frame() is used. + * + * - encoding: unused + * - decoding: set by the caller before avcodec_open2(). + */ + attribute_deprecated + int refcounted_frames; + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + float rc_qsquish; + + attribute_deprecated + float rc_qmod_amp; + attribute_deprecated + int rc_qmod_freq; +#endif + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + int rc_override_count; + RcOverride *rc_override; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + const char *rc_eq; +#endif + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: Set by user, may be overwritten by libavcodec. + */ + int64_t rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int64_t rc_min_rate; + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + float rc_buffer_aggressivity; + + attribute_deprecated + float rc_initial_cplx; +#endif + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + +#if FF_API_CODER_TYPE +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 +#define FF_CODER_TYPE_RAW 2 +#define FF_CODER_TYPE_RLE 3 +#if FF_API_UNUSED_MEMBERS +#define FF_CODER_TYPE_DEFLATE 4 +#endif /* FF_API_UNUSED_MEMBERS */ + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int coder_type; +#endif /* FF_API_CODER_TYPE */ + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int context_model; +#endif + +#if FF_API_MPV_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int lmin; + + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int lmax; +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_factor; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_exp; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_cmp; +#endif /* FF_API_PRIVATE_OPT */ + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int min_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int max_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int64_t timecode_frame_start; +#endif + +#if FF_API_RTP_CALLBACK + /** + * @deprecated unused + */ + /* The RTP callback: This function is called */ + /* every time the encoder has a packet to send. */ + /* It depends on the encoder if the data starts */ + /* with a Start Code (it should). H.263 does. */ + /* mb_nb contains the number of macroblocks */ + /* encoded in the RTP payload. */ + attribute_deprecated + void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int rtp_payload_size; /* The size of the RTP payload: the coder will */ + /* do its best to deliver a chunk with size */ + /* below rtp_payload_size, the chunk will start */ + /* with a start code on some codecs like H.263. */ + /* This doesn't take account of any particular */ + /* headers inside the transmitted RTP payload. */ +#endif + +#if FF_API_STAT_BITS + /* statistics, used for 2-pass encoding */ + attribute_deprecated + int mv_bits; + attribute_deprecated + int header_bits; + attribute_deprecated + int i_tex_bits; + attribute_deprecated + int p_tex_bits; + attribute_deprecated + int i_count; + attribute_deprecated + int p_count; + attribute_deprecated + int skip_count; + attribute_deprecated + int misc_bits; + + /** @deprecated this field is unused */ + attribute_deprecated + int frame_bits; +#endif + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + int workaround_bugs; +#define FF_BUG_AUTODETECT 1 ///< autodetection +#if FF_API_OLD_MSMPEG4 +#define FF_BUG_OLD_MSMPEG4 2 +#endif +#define FF_BUG_XVID_ILACE 4 +#define FF_BUG_UMP4 8 +#define FF_BUG_NO_PADDING 16 +#define FF_BUG_AMV 32 +#if FF_API_AC_VLC +#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default. +#endif +#define FF_BUG_QPEL_CHROMA 64 +#define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 +#define FF_BUG_HPEL_CHROMA 2048 +#define FF_BUG_DC_CLIP 4096 +#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. +#define FF_BUG_TRUNCATED 16384 +#define FF_BUG_IEDGE 32768 + + /** + * strictly follow the standard (MPEG-4, ...). + * - encoding: Set by user. + * - decoding: Set by user. + * Setting this to STRICT or higher means the encoder and decoder will + * generally do stupid things, whereas setting it to unofficial or lower + * will mean the encoder might produce output that is not supported by all + * spec-compliant decoders. Decoders don't differentiate between normal, + * unofficial and experimental (that is, they always try to decode things + * when they can) unless they are explicitly asked to behave stupidly + * (=strictly conform to the specs) + */ + int strict_std_compliance; +#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. +#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. +#define FF_COMPLIANCE_NORMAL 0 +#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions +#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + + /** + * error concealment flags + * - encoding: unused + * - decoding: Set by user. + */ + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 +#define FF_EC_FAVOR_INTER 256 + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug; +#define FF_DEBUG_PICT_INFO 1 +#define FF_DEBUG_RC 2 +#define FF_DEBUG_BITSTREAM 4 +#define FF_DEBUG_MB_TYPE 8 +#define FF_DEBUG_QP 16 +#if FF_API_DEBUG_MV +/** + * @deprecated this option does nothing + */ +#define FF_DEBUG_MV 32 +#endif +#define FF_DEBUG_DCT_COEFF 0x00000040 +#define FF_DEBUG_SKIP 0x00000080 +#define FF_DEBUG_STARTCODE 0x00000100 +#if FF_API_UNUSED_MEMBERS +#define FF_DEBUG_PTS 0x00000200 +#endif /* FF_API_UNUSED_MEMBERS */ +#define FF_DEBUG_ER 0x00000400 +#define FF_DEBUG_MMCO 0x00000800 +#define FF_DEBUG_BUGS 0x00001000 +#if FF_API_DEBUG_MV +#define FF_DEBUG_VIS_QP 0x00002000 +#define FF_DEBUG_VIS_MB_TYPE 0x00004000 +#endif +#define FF_DEBUG_BUFFERS 0x00008000 +#define FF_DEBUG_THREADS 0x00010000 +#define FF_DEBUG_GREEN_MD 0x00800000 +#define FF_DEBUG_NOMC 0x01000000 + +#if FF_API_DEBUG_MV + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 // visualize forward predicted MVs of P-frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 // visualize forward predicted MVs of B-frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames +#endif + + /** + * Error recognition; may misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + */ + int err_recognition; + +/** + * Verify checksums embedded in the bitstream (could be of either encoded or + * decoded data, depending on the codec) and print an error message on mismatch. + * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the + * decoder returning an error. + */ +#define AV_EF_CRCCHECK (1<<0) +#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations +#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length +#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection + +#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue +#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors +#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors +#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder should not do as an error + + + /** + * opaque 64-bit number (generally a PTS) that will be reordered and + * output in AVFrame.reordered_opaque + * - encoding: unused + * - decoding: Set by user. + */ + int64_t reordered_opaque; + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + struct AVHWAccel *hwaccel; + + /** + * Hardware accelerator context. + * For some hardware accelerators, a global context needs to be + * provided by the user. In that case, this holds display-dependent + * data FFmpeg cannot instantiate itself. Please refer to the + * FFmpeg HW accelerator documentation to know how to fill this + * is. e.g. for VA API, this is a struct vaapi_context. + * - encoding: unused + * - decoding: Set by user + */ + void *hwaccel_context; + + /** + * error + * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. + * - decoding: unused + */ + uint64_t error[AV_NUM_DATA_POINTERS]; + + /** + * DCT algorithm, see FF_DCT_* below + * - encoding: Set by user. + * - decoding: unused + */ + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 + + /** + * IDCT algorithm, see FF_IDCT_* below. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#if FF_API_ARCH_SH4 +#define FF_IDCT_SH4 9 +#endif +#define FF_IDCT_SIMPLEARM 10 +#if FF_API_UNUSED_MEMBERS +#define FF_IDCT_IPP 13 +#endif /* FF_API_UNUSED_MEMBERS */ +#define FF_IDCT_XVID 14 +#if FF_API_IDCT_XVIDMMX +#define FF_IDCT_XVIDMMX 14 +#endif /* FF_API_IDCT_XVIDMMX */ +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#if FF_API_ARCH_SPARC +#define FF_IDCT_SIMPLEVIS 18 +#endif +#define FF_IDCT_FAAN 20 +#define FF_IDCT_SIMPLENEON 22 +#if FF_API_ARCH_ALPHA +#define FF_IDCT_SIMPLEALPHA 23 +#endif +#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */ +#define FF_IDCT_SIMPLEAUTO 128 + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + +#if FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + +#if FF_API_CODED_FRAME + /** + * the picture in the bitstream + * - encoding: Set by libavcodec. + * - decoding: unused + * + * @deprecated use the quality factor packet side data instead + */ + attribute_deprecated AVFrame *coded_frame; +#endif + + /** + * thread count + * is used to decide how many independent tasks should be passed to execute() + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_count; + + /** + * Which multithreading methods to use. + * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, + * so clients which cannot provide future frames should not use it. + * + * - encoding: Set by user, otherwise the default is used. + * - decoding: Set by user, otherwise the default is used. + */ + int thread_type; +#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once +#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once + + /** + * Which multithreading methods are in use by the codec. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int active_thread_type; + + /** + * Set by the client if its custom get_buffer() callback can be called + * synchronously from another thread, which allows faster multithreaded decoding. + * draw_horiz_band() will be called from other threads regardless of this setting. + * Ignored if the default get_buffer() is used. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_safe_callbacks; + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * @param count the number of things to execute + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. + * @param c context passed also to func + * @param count the number of things to execute + * @param arg2 argument passed unchanged to func + * @param ret return values of executed functions, must have space for "count" values. May be NULL. + * @param func function that will be called count times, with jobnr from 0 to count-1. + * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no + * two instances of func executing at the same time will have the same threadnr. + * @return always 0 currently, but code should handle a future improvement where when any call to func + * returns < 0 no further calls to func may be done and < 0 is returned. + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + + /** + * noise vs. sse weight for the nsse comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int nsse_weight; + + /** + * profile + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int profile; +#define FF_PROFILE_UNKNOWN -99 +#define FF_PROFILE_RESERVED -100 + +#define FF_PROFILE_AAC_MAIN 0 +#define FF_PROFILE_AAC_LOW 1 +#define FF_PROFILE_AAC_SSR 2 +#define FF_PROFILE_AAC_LTP 3 +#define FF_PROFILE_AAC_HE 4 +#define FF_PROFILE_AAC_HE_V2 28 +#define FF_PROFILE_AAC_LD 22 +#define FF_PROFILE_AAC_ELD 38 +#define FF_PROFILE_MPEG2_AAC_LOW 128 +#define FF_PROFILE_MPEG2_AAC_HE 131 + +#define FF_PROFILE_DNXHD 0 +#define FF_PROFILE_DNXHR_LB 1 +#define FF_PROFILE_DNXHR_SQ 2 +#define FF_PROFILE_DNXHR_HQ 3 +#define FF_PROFILE_DNXHR_HQX 4 +#define FF_PROFILE_DNXHR_444 5 + +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 +#define FF_PROFILE_DTS_EXPRESS 70 + +#define FF_PROFILE_MPEG2_422 0 +#define FF_PROFILE_MPEG2_HIGH 1 +#define FF_PROFILE_MPEG2_SS 2 +#define FF_PROFILE_MPEG2_SNR_SCALABLE 3 +#define FF_PROFILE_MPEG2_MAIN 4 +#define FF_PROFILE_MPEG2_SIMPLE 5 + +#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag +#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag + +#define FF_PROFILE_H264_BASELINE 66 +#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED) +#define FF_PROFILE_H264_MAIN 77 +#define FF_PROFILE_H264_EXTENDED 88 +#define FF_PROFILE_H264_HIGH 100 +#define FF_PROFILE_H264_HIGH_10 110 +#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 +#define FF_PROFILE_H264_HIGH_422 122 +#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_STEREO_HIGH 128 +#define FF_PROFILE_H264_HIGH_444 144 +#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 +#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_CAVLC_444 44 + +#define FF_PROFILE_VC1_SIMPLE 0 +#define FF_PROFILE_VC1_MAIN 1 +#define FF_PROFILE_VC1_COMPLEX 2 +#define FF_PROFILE_VC1_ADVANCED 3 + +#define FF_PROFILE_MPEG4_SIMPLE 0 +#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1 +#define FF_PROFILE_MPEG4_CORE 2 +#define FF_PROFILE_MPEG4_MAIN 3 +#define FF_PROFILE_MPEG4_N_BIT 4 +#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5 +#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 +#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 +#define FF_PROFILE_MPEG4_HYBRID 8 +#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 +#define FF_PROFILE_MPEG4_CORE_SCALABLE 10 +#define FF_PROFILE_MPEG4_ADVANCED_CODING 11 +#define FF_PROFILE_MPEG4_ADVANCED_CORE 12 +#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 +#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 +#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 + +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 +#define FF_PROFILE_JPEG2000_DCINEMA_2K 3 +#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 + +#define FF_PROFILE_VP9_0 0 +#define FF_PROFILE_VP9_1 1 +#define FF_PROFILE_VP9_2 2 +#define FF_PROFILE_VP9_3 3 + +#define FF_PROFILE_HEVC_MAIN 1 +#define FF_PROFILE_HEVC_MAIN_10 2 +#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define FF_PROFILE_HEVC_REXT 4 + + /** + * level + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int level; +#define FF_LEVEL_UNKNOWN -99 + + /** + * Skip loop filtering for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_loop_filter; + + /** + * Skip IDCT/dequantization for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_idct; + + /** + * Skip decoding for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_frame; + + /** + * Header containing style information for text subtitles. + * For SUBTITLE_ASS subtitle type, it should contain the whole ASS + * [Script Info] and [V4+ Styles] section, plus the [Events] line and + * the Format line following. It shouldn't include any Dialogue line. + * - encoding: Set/allocated/freed by user (before avcodec_open2()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; + +#if FF_API_ERROR_RATE + /** + * @deprecated use the 'error_rate' private AVOption of the mpegvideo + * encoders + */ + attribute_deprecated + int error_rate; +#endif + +#if FF_API_VBV_DELAY + /** + * VBV delay coded in the last frame (in periods of a 27 MHz clock). + * Used for compliant TS muxing. + * - encoding: Set by libavcodec. + * - decoding: unused. + * @deprecated this value is now exported as a part of + * AV_PKT_DATA_CPB_PROPERTIES packet side data + */ + attribute_deprecated + uint64_t vbv_delay; +#endif + +#if FF_API_SIDEDATA_ONLY_PKT + /** + * Encoding only and set by default. Allow encoders to output packets + * that do not contain any encoded data, only side data. + * + * Some encoders need to output such packets, e.g. to update some stream + * parameters at the end of encoding. + * + * @deprecated this field disables the default behaviour and + * it is kept only for compatibility. + */ + attribute_deprecated + int side_data_only_packets; +#endif + + /** + * Audio only. The number of "priming" samples (padding) inserted by the + * encoder at the beginning of the audio. I.e. this number of leading + * decoded samples must be discarded by the caller to get the original audio + * without leading padding. + * + * - decoding: unused + * - encoding: Set by libavcodec. The timestamps on the output packets are + * adjusted by the encoder so that they always refer to the + * first sample of the data actually contained in the packet, + * including any added padding. E.g. if the timebase is + * 1/samplerate and the timestamp of the first input sample is + * 0, the timestamp of the first output packet will be + * -initial_padding. + */ + int initial_padding; + + /** + * - decoding: For codecs that store a framerate value in the compressed + * bitstream, the decoder may export it here. { 0, 1} when + * unknown. + * - encoding: May be used to signal the framerate of CFR content to an + * encoder. + */ + AVRational framerate; + + /** + * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. + * - encoding: unused. + * - decoding: Set by libavcodec before calling get_format() + */ + enum AVPixelFormat sw_pix_fmt; + + /** + * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. + * - encoding unused. + * - decoding set by user. + */ + AVRational pkt_timebase; + + /** + * AVCodecDescriptor + * - encoding: unused. + * - decoding: set by libavcodec. + */ + const AVCodecDescriptor *codec_descriptor; + +#if !FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + + /** + * Current statistics for PTS correction. + * - decoding: maintained and used by libavcodec, not intended to be used by user apps + * - encoding: unused + */ + int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far + int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far + int64_t pts_correction_last_pts; /// PTS of the last frame + int64_t pts_correction_last_dts; /// DTS of the last frame + + /** + * Character encoding of the input subtitles file. + * - decoding: set by user + * - encoding: unused + */ + char *sub_charenc; + + /** + * Subtitles character encoding mode. Formats or codecs might be adjusting + * this setting (if they are doing the conversion themselves for instance). + * - decoding: set by libavcodec + * - encoding: unused + */ + int sub_charenc_mode; +#define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) +#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself +#define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv + + /** + * Skip processing alpha if supported by codec. + * Note that if the format uses pre-multiplied alpha (common with VP6, + * and recommended due to better video quality/compression) + * the image will look as if alpha-blended onto a black background. + * However for formats that do not use pre-multiplied alpha + * there might be serious artefacts (though e.g. libswscale currently + * assumes pre-multiplied alpha anyway). + * + * - decoding: set by user + * - encoding: unused + */ + int skip_alpha; + + /** + * Number of samples to skip after a discontinuity + * - decoding: unused + * - encoding: set by libavcodec + */ + int seek_preroll; + +#if !FF_API_DEBUG_MV + /** + * debug motion vectors + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames +#endif + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: unused. + */ + uint16_t *chroma_intra_matrix; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - encoding: Set by user. + * - decoding: Set by user. + */ + uint8_t *dump_separator; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * Properties of the stream that gets decoded + * - encoding: unused + * - decoding: set by libavcodec + */ + unsigned properties; +#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 +#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 + + /** + * Additional data associated with the entire coded stream. + * + * - decoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). + */ + AVPacketSideData *coded_side_data; + int nb_coded_side_data; + + /** + * A reference to the AVHWFramesContext describing the input (for encoding) + * or output (decoding) frames. The reference is set by the caller and + * afterwards owned (and freed) by libavcodec - it should never be read by + * the caller after being set. + * + * - decoding: This field should be set by the caller from the get_format() + * callback. The previous reference (if any) will always be + * unreffed by libavcodec before the get_format() call. + * + * If the default get_buffer2() is used with a hwaccel pixel + * format, then this AVHWFramesContext will be used for + * allocating the frame buffers. + * + * - encoding: For hardware encoders configured to use a hwaccel pixel + * format, this field should be set by the caller to a reference + * to the AVHWFramesContext describing input frames. + * AVHWFramesContext.format must be equal to + * AVCodecContext.pix_fmt. + * + * This field should be set before avcodec_open2() is called. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Control the form of AVSubtitle.rects[N]->ass + * - decoding: set by user + * - encoding: unused + */ + int sub_text_format; +#define FF_SUB_TEXT_FMT_ASS 0 +#if FF_API_ASS_TIMING +#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1 +#endif + + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + * + * - decoding: unused + * - encoding: unused + */ + int trailing_padding; + + /** + * The number of pixels per image to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + int64_t max_pixels; + + /** + * A reference to the AVHWDeviceContext describing the device which will + * be used by a hardware encoder/decoder. The reference is set by the + * caller and afterwards owned (and freed) by libavcodec. + * + * This should be used if either the codec device does not require + * hardware frames or any that are used are to be allocated internally by + * libavcodec. If the user wishes to supply any of the frames used as + * encoder input or decoder output then hw_frames_ctx should be used + * instead. When hw_frames_ctx is set in get_format() for a decoder, this + * field will be ignored while decoding the associated stream segment, but + * may again be used on a following one after another get_format() call. + * + * For both encoders and decoders this field should be set before + * avcodec_open2() is called and must not be written to thereafter. + * + * Note that some decoders may require this field to be set initially in + * order to support hw_frames_ctx at all - in that case, all frames + * contexts used must be created on the same device. + */ + AVBufferRef *hw_device_ctx; + + /** + * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated + * decoding (if active). + * - encoding: unused + * - decoding: Set by user (either before avcodec_open2(), or in the + * AVCodecContext.get_format callback) + */ + int hwaccel_flags; + + /** + * Video decoding only. Certain video codecs support cropping, meaning that + * only a sub-rectangle of the decoded frame is intended for display. This + * option controls how cropping is handled by libavcodec. + * + * When set to 1 (the default), libavcodec will apply cropping internally. + * I.e. it will modify the output frame width/height fields and offset the + * data pointers (only by as much as possible while preserving alignment, or + * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that + * the frames output by the decoder refer only to the cropped area. The + * crop_* fields of the output frames will be zero. + * + * When set to 0, the width/height fields of the output frames will be set + * to the coded dimensions and the crop_* fields will describe the cropping + * rectangle. Applying the cropping is left to the caller. + * + * @warning When hardware acceleration with opaque output frames is used, + * libavcodec is unable to apply cropping from the top/left border. + * + * @note when this option is set to zero, the width/height fields of the + * AVCodecContext and output AVFrames have different meanings. The codec + * context fields store display dimensions (with the coded dimensions in + * coded_width/height), while the frame fields store the coded dimensions + * (with the display dimensions being determined by the crop_* fields). + */ + int apply_cropping; +} AVCodecContext; + +AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); +void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); + +const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); +void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); + +unsigned av_codec_get_codec_properties(const AVCodecContext *avctx); + +int av_codec_get_lowres(const AVCodecContext *avctx); +void av_codec_set_lowres(AVCodecContext *avctx, int val); + +int av_codec_get_seek_preroll(const AVCodecContext *avctx); +void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); + +uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx); +void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val); + +/** + * AVProfile. + */ +typedef struct AVProfile { + int profile; + const char *name; ///< short name for the profile +} AVProfile; + +typedef struct AVCodecDefault AVCodecDefault; + +struct AVSubtitle; + +/** + * AVCodec. + */ +typedef struct AVCodec { + /** + * Name of the codec implementation. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + * This is the primary way to find a codec from the user perspective. + */ + const char *name; + /** + * Descriptive name for the codec, meant to be more human readable than name. + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *long_name; + enum AVMediaType type; + enum AVCodecID id; + /** + * Codec capabilities. + * see AV_CODEC_CAP_* + */ + int capabilities; + const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} + const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 + const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 + const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 + const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder + const AVClass *priv_class; ///< AVClass for the private context + const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int priv_data_size; + struct AVCodec *next; + /** + * @name Frame-level threading support functions + * @{ + */ + /** + * If defined, called on thread contexts when they are created. + * If the codec allocates writable tables in init(), re-allocate them here. + * priv_data will be set to a copy of the original. + */ + int (*init_thread_copy)(AVCodecContext *); + /** + * Copy necessary context variables from a previous thread context to the current one. + * If not defined, the next thread will start automatically; otherwise, the codec + * must call ff_thread_finish_setup(). + * + * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. + */ + int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); + /** @} */ + + /** + * Private codec-specific defaults. + */ + const AVCodecDefault *defaults; + + /** + * Initialize codec static data, called from avcodec_register(). + */ + void (*init_static_data)(struct AVCodec *codec); + + int (*init)(AVCodecContext *); + int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, + const struct AVSubtitle *sub); + /** + * Encode data to an AVPacket. + * + * @param avctx codec context + * @param avpkt output AVPacket (may contain a user-provided buffer) + * @param[in] frame AVFrame containing the raw data to be encoded + * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a + * non-empty packet was returned in avpkt. + * @return 0 on success, negative error code on failure + */ + int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, + int *got_packet_ptr); + int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); + int (*close)(AVCodecContext *); + /** + * Encode API with decoupled packet/frame dataflow. The API is the + * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except + * that: + * - never called if the codec is closed or the wrong type, + * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent, + * - only one drain frame is ever passed down, + */ + int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); + int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); + + /** + * Decode API with decoupled packet/frame dataflow. This function is called + * to get one output frame. It should call ff_decode_get_packet() to obtain + * input data. + */ + int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); + /** + * Flush buffers. + * Will be called when seeking + */ + void (*flush)(AVCodecContext *); + /** + * Internal codec capabilities. + * See FF_CODEC_CAP_* in internal.h + */ + int caps_internal; + + /** + * Decoding only, a comma-separated list of bitstream filters to apply to + * packets before decoding. + */ + const char *bsfs; +} AVCodec; + +int av_codec_get_max_lowres(const AVCodec *codec); + +struct MpegEncContext; + +/** + * @defgroup lavc_hwaccel AVHWAccel + * @{ + */ +typedef struct AVHWAccel { + /** + * Name of the hardware accelerated codec. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + */ + const char *name; + + /** + * Type of codec implemented by the hardware accelerator. + * + * See AVMEDIA_TYPE_xxx + */ + enum AVMediaType type; + + /** + * Codec implemented by the hardware accelerator. + * + * See AV_CODEC_ID_xxx + */ + enum AVCodecID id; + + /** + * Supported pixel format. + * + * Only hardware accelerated formats are supported here. + */ + enum AVPixelFormat pix_fmt; + + /** + * Hardware accelerated codec capabilities. + * see AV_HWACCEL_CODEC_CAP_* + */ + int capabilities; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + struct AVHWAccel *next; + + /** + * Allocate a custom buffer + */ + int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame); + + /** + * Called at the beginning of each frame or field picture. + * + * Meaningful frame information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * Note that buf can be NULL along with buf_size set to 0. + * Otherwise, this means the whole frame is available at this point. + * + * @param avctx the codec context + * @param buf the frame data buffer base + * @param buf_size the size of the frame in bytes + * @return zero if successful, a negative value otherwise + */ + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for each slice. + * + * Meaningful slice information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * The only exception is XvMC, that works on MB level. + * + * @param avctx the codec context + * @param buf the slice data buffer base + * @param buf_size the size of the slice in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Called at the end of each frame or field picture. + * + * The whole picture is parsed at this point and can now be sent + * to the hardware accelerator. This function is mandatory. + * + * @param avctx the codec context + * @return zero if successful, a negative value otherwise + */ + int (*end_frame)(AVCodecContext *avctx); + + /** + * Size of per-frame hardware accelerator private data. + * + * Private data is allocated with av_mallocz() before + * AVCodecContext.get_buffer() and deallocated after + * AVCodecContext.release_buffer(). + */ + int frame_priv_data_size; + + /** + * Called for every Macroblock in a slice. + * + * XvMC uses it to replace the ff_mpv_reconstruct_mb(). + * Instead of decoding to raw picture, MB parameters are + * stored in an array provided by the video driver. + * + * @param s the mpeg context + */ + void (*decode_mb)(struct MpegEncContext *s); + + /** + * Initialize the hwaccel private data. + * + * This will be called from ff_get_format(), after hwaccel and + * hwaccel_context are set and the hwaccel private data in AVCodecInternal + * is allocated. + */ + int (*init)(AVCodecContext *avctx); + + /** + * Uninitialize the hwaccel private data. + * + * This will be called from get_format() or avcodec_close(), after hwaccel + * and hwaccel_context are already uninitialized. + */ + int (*uninit)(AVCodecContext *avctx); + + /** + * Size of the private data to allocate in + * AVCodecInternal.hwaccel_priv_data. + */ + int priv_data_size; + + /** + * Internal hwaccel capabilities. + */ + int caps_internal; +} AVHWAccel; + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 + +/** + * Hardware acceleration should be used for decoding even if the codec level + * used is unknown or higher than the maximum supported level reported by the + * hardware driver. + * + * It's generally a good idea to pass this flag unless you have a specific + * reason not to, as hardware tends to under-report supported levels. + */ +#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0) + +/** + * Hardware acceleration can output YUV pixel formats with a different chroma + * sampling than 4:2:0 and/or other than 8 bits per component. + */ +#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) + +/** + * Hardware acceleration should still be attempted for decoding when the + * codec profile does not match the reported capabilities of the hardware. + * + * For example, this can be used to try to decode baseline profile H.264 + * streams in hardware - it will often succeed, because many streams marked + * as baseline profile actually conform to constrained baseline profile. + * + * @warning If the stream is actually not supported then the behaviour is + * undefined, and may include returning entirely incorrect output + * while indicating success. + */ +#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @defgroup lavc_picture AVPicture + * + * Functions for working with AVPicture + * @{ + */ + +/** + * Picture data structure. + * + * Up to four components can be stored into it, the last component is + * alpha. + * @deprecated use AVFrame or imgutils functions instead + */ +typedef struct AVPicture { + attribute_deprecated + uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes + attribute_deprecated + int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line +} AVPicture; + +/** + * @} + */ +#endif + +enum AVSubtitleType { + SUBTITLE_NONE, + + SUBTITLE_BITMAP, ///< A bitmap, pict will be set + + /** + * Plain text, the text field must be set by the decoder and is + * authoritative. ass and pict fields may contain approximations. + */ + SUBTITLE_TEXT, + + /** + * Formatted text, the ass field must be set by the decoder and is + * authoritative. pict and text fields may contain approximations. + */ + SUBTITLE_ASS, +}; + +#define AV_SUBTITLE_FLAG_FORCED 0x00000001 + +typedef struct AVSubtitleRect { + int x; ///< top left corner of pict, undefined when pict is not set + int y; ///< top left corner of pict, undefined when pict is not set + int w; ///< width of pict, undefined when pict is not set + int h; ///< height of pict, undefined when pict is not set + int nb_colors; ///< number of colors in pict, undefined when pict is not set + +#if FF_API_AVPICTURE + /** + * @deprecated unused + */ + attribute_deprecated + AVPicture pict; +#endif + /** + * data+linesize for the bitmap of this subtitle. + * Can be set for text/ass as well once they are rendered. + */ + uint8_t *data[4]; + int linesize[4]; + + enum AVSubtitleType type; + + char *text; ///< 0 terminated plain UTF-8 text + + /** + * 0 terminated ASS/SSA compatible event line. + * The presentation of this is unaffected by the other values in this + * struct. + */ + char *ass; + + int flags; +} AVSubtitleRect; + +typedef struct AVSubtitle { + uint16_t format; /* 0 = graphics */ + uint32_t start_display_time; /* relative to packet pts, in ms */ + uint32_t end_display_time; /* relative to packet pts, in ms */ + unsigned num_rects; + AVSubtitleRect **rects; + int64_t pts; ///< Same as packet pts, in AV_TIME_BASE +} AVSubtitle; + +/** + * This struct describes the properties of an encoded stream. + * + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must + * be allocated with avcodec_parameters_alloc() and freed with + * avcodec_parameters_free(). + */ +typedef struct AVCodecParameters { + /** + * General type of the encoded data. + */ + enum AVMediaType codec_type; + /** + * Specific type of the encoded data (the codec used). + */ + enum AVCodecID codec_id; + /** + * Additional information about the codec (corresponds to the AVI FOURCC). + */ + uint32_t codec_tag; + + /** + * Extra binary data needed for initializing the decoder, codec-dependent. + * + * Must be allocated with av_malloc() and will be freed by + * avcodec_parameters_free(). The allocated size of extradata must be at + * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding + * bytes zeroed. + */ + uint8_t *extradata; + /** + * Size of the extradata content in bytes. + */ + int extradata_size; + + /** + * - video: the pixel format, the value corresponds to enum AVPixelFormat. + * - audio: the sample format, the value corresponds to enum AVSampleFormat. + */ + int format; + + /** + * The average bitrate of the encoded data (in bits per second). + */ + int64_t bit_rate; + + /** + * The number of bits per sample in the codedwords. + * + * This is basically the bitrate per sample. It is mandatory for a bunch of + * formats to actually decode them. It's the number of bits for one sample in + * the actual coded bitstream. + * + * This could be for example 4 for ADPCM + * For PCM formats this matches bits_per_raw_sample + * Can be 0 + */ + int bits_per_coded_sample; + + /** + * This is the number of valid bits in each output sample. If the + * sample format has more bits, the least significant bits are additional + * padding bits, which are always 0. Use right shifts to reduce the sample + * to its actual size. For example, audio formats with 24 bit samples will + * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. + * To get the original sample use "(int32_t)sample >> 8"." + * + * For ADPCM this might be 12 or 16 or similar + * Can be 0 + */ + int bits_per_raw_sample; + + /** + * Codec-specific bitstream restrictions that the stream conforms to. + */ + int profile; + int level; + + /** + * Video only. The dimensions of the video frame in pixels. + */ + int width; + int height; + + /** + * Video only. The aspect ratio (width / height) which a single pixel + * should have when displayed. + * + * When the aspect ratio is unknown / undefined, the numerator should be + * set to 0 (the denominator may have any value). + */ + AVRational sample_aspect_ratio; + + /** + * Video only. The order of the fields in interlaced video. + */ + enum AVFieldOrder field_order; + + /** + * Video only. Additional colorspace characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + enum AVChromaLocation chroma_location; + + /** + * Video only. Number of delayed frames. + */ + int video_delay; + + /** + * Audio only. The channel layout bitmask. May be 0 if the channel layout is + * unknown or unspecified, otherwise the number of bits set must be equal to + * the channels field. + */ + uint64_t channel_layout; + /** + * Audio only. The number of audio channels. + */ + int channels; + /** + * Audio only. The number of audio samples per second. + */ + int sample_rate; + /** + * Audio only. The number of bytes per coded audio frame, required by some + * formats. + * + * Corresponds to nBlockAlign in WAVEFORMATEX. + */ + int block_align; + /** + * Audio only. Audio frame size, if known. Required by some formats to be static. + */ + int frame_size; + + /** + * Audio only. The amount of padding (in samples) inserted by the encoder at + * the beginning of the audio. I.e. this number of leading decoded samples + * must be discarded by the caller to get the original audio without leading + * padding. + */ + int initial_padding; + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + */ + int trailing_padding; + /** + * Audio only. Number of samples to skip after a discontinuity. + */ + int seek_preroll; +} AVCodecParameters; + +/** + * If c is NULL, returns the first registered codec, + * if c is non-NULL, returns the next registered codec after c, + * or NULL if c is the last one. + */ +AVCodec *av_codec_next(const AVCodec *c); + +/** + * Return the LIBAVCODEC_VERSION_INT constant. + */ +unsigned avcodec_version(void); + +/** + * Return the libavcodec build-time configuration. + */ +const char *avcodec_configuration(void); + +/** + * Return the libavcodec license. + */ +const char *avcodec_license(void); + +/** + * Register the codec codec and initialize libavcodec. + * + * @warning either this function or avcodec_register_all() must be called + * before any other libavcodec functions. + * + * @see avcodec_register_all() + */ +void avcodec_register(AVCodec *codec); + +/** + * Register all the codecs, parsers and bitstream filters which were enabled at + * configuration time. If you do not call this function you can select exactly + * which formats you want to support, by using the individual registration + * functions. + * + * @see avcodec_register + * @see av_register_codec_parser + * @see av_register_bitstream_filter + */ +void avcodec_register_all(void); + +/** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct should be freed with avcodec_free_context(). + * + * @param codec if non-NULL, allocate private data and initialize defaults + * for the given codec. It is illegal to then call avcodec_open2() + * with a different codec. + * If NULL, then the codec-specific defaults won't be initialized, + * which may result in suboptimal default settings (this is + * important mainly for encoders, e.g. libx264). + * + * @return An AVCodecContext filled with default values or NULL on failure. + */ +AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); + +/** + * Free the codec context and everything associated with it and write NULL to + * the provided pointer. + */ +void avcodec_free_context(AVCodecContext **avctx); + +#if FF_API_GET_CONTEXT_DEFAULTS +/** + * @deprecated This function should not be used, as closing and opening a codec + * context multiple time is not supported. A new codec context should be + * allocated for each new use. + */ +int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); +#endif + +/** + * Get the AVClass for AVCodecContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_class(void); + +#if FF_API_COPY_CONTEXT +/** + * Get the AVClass for AVFrame. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_frame_class(void); + +/** + * Get the AVClass for AVSubtitleRect. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_subtitle_rect_class(void); + +/** + * Copy the settings of the source AVCodecContext into the destination + * AVCodecContext. The resulting destination codec context will be + * unopened, i.e. you are required to call avcodec_open2() before you + * can use this AVCodecContext to decode/encode video/audio data. + * + * @param dest target codec context, should be initialized with + * avcodec_alloc_context3(NULL), but otherwise uninitialized + * @param src source codec context + * @return AVERROR() on error (e.g. memory allocation error), 0 on success + * + * @deprecated The semantics of this function are ill-defined and it should not + * be used. If you need to transfer the stream parameters from one codec context + * to another, use an intermediate AVCodecParameters instance and the + * avcodec_parameters_from_context() / avcodec_parameters_to_context() + * functions. + */ +attribute_deprecated +int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); +#endif + +/** + * Allocate a new AVCodecParameters and set its fields to default values + * (unknown/invalid/0). The returned struct must be freed with + * avcodec_parameters_free(). + */ +AVCodecParameters *avcodec_parameters_alloc(void); + +/** + * Free an AVCodecParameters instance and everything associated with it and + * write NULL to the supplied pointer. + */ +void avcodec_parameters_free(AVCodecParameters **par); + +/** + * Copy the contents of src to dst. Any allocated fields in dst are freed and + * replaced with newly allocated duplicates of the corresponding fields in src. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); + +/** + * Fill the parameters struct based on the values from the supplied codec + * context. Any allocated fields in par are freed and replaced with duplicates + * of the corresponding fields in codec. + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int avcodec_parameters_from_context(AVCodecParameters *par, + const AVCodecContext *codec); + +/** + * Fill the codec context based on the values from the supplied codec + * parameters. Any allocated fields in codec that have a corresponding field in + * par are freed and replaced with duplicates of the corresponding field in par. + * Fields in codec that do not have a counterpart in par are not touched. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_to_context(AVCodecContext *codec, + const AVCodecParameters *par); + +/** + * Initialize the AVCodecContext to use the given AVCodec. Prior to using this + * function the context has to be allocated with avcodec_alloc_context3(). + * + * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), + * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for + * retrieving a codec. + * + * @warning This function is not thread safe! + * + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). + * + * @code + * avcodec_register_all(); + * av_dict_set(&opts, "b", "2.5M", 0); + * codec = avcodec_find_decoder(AV_CODEC_ID_H264); + * if (!codec) + * exit(1); + * + * context = avcodec_alloc_context3(codec); + * + * if (avcodec_open2(context, codec, opts) < 0) + * exit(1); + * @endcode + * + * @param avctx The context to initialize. + * @param codec The codec to open this context for. If a non-NULL codec has been + * previously passed to avcodec_alloc_context3() or + * for this context, then this parameter MUST be either NULL or + * equal to the previously passed codec. + * @param options A dictionary filled with AVCodecContext and codec-private options. + * On return this object will be filled with options that were not found. + * + * @return zero on success, a negative value on error + * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), + * av_dict_set(), av_opt_find(). + */ +int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); + +/** + * Close a given AVCodecContext and free all the data associated with it + * (but not the AVCodecContext itself). + * + * Calling this function on an AVCodecContext that hasn't been opened will free + * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL + * codec. Subsequent calls will do nothing. + * + * @note Do not use this function. Use avcodec_free_context() to destroy a + * codec context (either open or closed). Opening and closing a codec context + * multiple times is not supported anymore -- use multiple codec contexts + * instead. + */ +int avcodec_close(AVCodecContext *avctx); + +/** + * Free all allocated data in the given subtitle struct. + * + * @param sub AVSubtitle to free. + */ +void avsubtitle_free(AVSubtitle *sub); + +/** + * @} + */ + +/** + * @addtogroup lavc_packet + * @{ + */ + +/** + * Allocate an AVPacket and set its fields to default values. The resulting + * struct must be freed using av_packet_free(). + * + * @return An AVPacket filled with default values or NULL on failure. + * + * @note this only allocates the AVPacket itself, not the data buffers. Those + * must be allocated through other means such as av_new_packet. + * + * @see av_new_packet + */ +AVPacket *av_packet_alloc(void); + +/** + * Create a new packet that references the same data as src. + * + * This is a shortcut for av_packet_alloc()+av_packet_ref(). + * + * @return newly created AVPacket on success, NULL on error. + * + * @see av_packet_alloc + * @see av_packet_ref + */ +AVPacket *av_packet_clone(const AVPacket *src); + +/** + * Free the packet, if the packet is reference counted, it will be + * unreferenced first. + * + * @param pkt packet to be freed. The pointer will be set to NULL. + * @note passing NULL is a no-op. + */ +void av_packet_free(AVPacket **pkt); + +/** + * Initialize optional fields of a packet with default values. + * + * Note, this does not touch the data and size members, which have to be + * initialized separately. + * + * @param pkt packet + */ +void av_init_packet(AVPacket *pkt); + +/** + * Allocate the payload of a packet and initialize its fields with + * default values. + * + * @param pkt packet + * @param size wanted payload size + * @return 0 if OK, AVERROR_xxx otherwise + */ +int av_new_packet(AVPacket *pkt, int size); + +/** + * Reduce packet size, correctly zeroing padding + * + * @param pkt packet + * @param size new size + */ +void av_shrink_packet(AVPacket *pkt, int size); + +/** + * Increase packet size, correctly zeroing padding + * + * @param pkt packet + * @param grow_by number of bytes by which to increase the size of the packet + */ +int av_grow_packet(AVPacket *pkt, int grow_by); + +/** + * Initialize a reference-counted packet from av_malloc()ed data. + * + * @param pkt packet to be initialized. This function will set the data, size, + * buf and destruct fields, all others are left untouched. + * @param data Data allocated by av_malloc() to be used as packet data. If this + * function returns successfully, the data is owned by the underlying AVBuffer. + * The caller may not access the data through other means. + * @param size size of data in bytes, without the padding. I.e. the full buffer + * size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); + +#if FF_API_AVPACKET_OLD_API +/** + * @warning This is a hack - the packet memory allocation stuff is broken. The + * packet is allocated if it was not really allocated. + * + * @deprecated Use av_packet_ref + */ +attribute_deprecated +int av_dup_packet(AVPacket *pkt); +/** + * Copy packet, including contents + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_ref + */ +attribute_deprecated +int av_copy_packet(AVPacket *dst, const AVPacket *src); + +/** + * Copy packet side data + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_copy_props + */ +attribute_deprecated +int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); + +/** + * Free a packet. + * + * @deprecated Use av_packet_unref + * + * @param pkt packet to free + */ +attribute_deprecated +void av_free_packet(AVPacket *pkt); +#endif +/** + * Allocate new information of a packet. + * + * @param pkt packet + * @param type side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Wrap an existing array as a packet side data. + * + * @param pkt packet + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * pkt. + * @param size side information size + * @return a non-negative number on success, a negative AVERROR code on + * failure. On failure, the packet is unchanged and the data remains + * owned by the caller. + */ +int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Shrink the already allocated side data buffer + * + * @param pkt packet + * @param type side information type + * @param size new side information size + * @return 0 on success, < 0 on failure + */ +int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Get side information from packet. + * + * @param pkt packet + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, + int *size); + +#if FF_API_MERGE_SD_API +attribute_deprecated +int av_packet_merge_side_data(AVPacket *pkt); + +attribute_deprecated +int av_packet_split_side_data(AVPacket *pkt); +#endif + +const char *av_packet_side_data_name(enum AVPacketSideDataType type); + +/** + * Pack a dictionary for use in side_data. + * + * @param dict The dictionary to pack. + * @param size pointer to store the size of the returned data + * @return pointer to data if successful, NULL otherwise + */ +uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size); +/** + * Unpack a dictionary from side_data. + * + * @param data data from side_data + * @param size size of the data + * @param dict the metadata storage dictionary + * @return 0 on success, < 0 on failure + */ +int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict); + + +/** + * Convenience function to free all the side data stored. + * All the other fields stay untouched. + * + * @param pkt packet + */ +void av_packet_free_side_data(AVPacket *pkt); + +/** + * Setup a new reference to the data described by a given packet + * + * If src is reference-counted, setup dst as a new reference to the + * buffer in src. Otherwise allocate a new buffer in dst and copy the + * data from src into it. + * + * All the other fields are copied from src. + * + * @see av_packet_unref + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_packet_ref(AVPacket *dst, const AVPacket *src); + +/** + * Wipe the packet. + * + * Unreference the buffer referenced by the packet and reset the + * remaining packet fields to their default values. + * + * @param pkt The packet to be unreferenced. + */ +void av_packet_unref(AVPacket *pkt); + +/** + * Move every field in src to dst and reset src. + * + * @see av_packet_unref + * + * @param src Source packet, will be reset + * @param dst Destination packet + */ +void av_packet_move_ref(AVPacket *dst, AVPacket *src); + +/** + * Copy only "properties" fields from src to dst. + * + * Properties for the purpose of this function are all the fields + * beside those related to the packet data (buf, data, size) + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success AVERROR on failure. + */ +int av_packet_copy_props(AVPacket *dst, const AVPacket *src); + +/** + * Convert valid timing fields (timestamps / durations) in a packet from one + * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be + * ignored. + * + * @param pkt packet on which the conversion will be performed + * @param tb_src source timebase, in which the timing fields in pkt are + * expressed + * @param tb_dst destination timebase, to which the timing fields will be + * converted + */ +void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); + +/** + * @} + */ + +/** + * @addtogroup lavc_decoding + * @{ + */ + +/** + * Find a registered decoder with a matching codec ID. + * + * @param id AVCodecID of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder(enum AVCodecID id); + +/** + * Find a registered decoder with the specified name. + * + * @param name name of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder_by_name(const char *name); + +/** + * The default callback for AVCodecContext.get_buffer2(). It is made public so + * it can be called by custom get_buffer2() implementations for decoders without + * AV_CODEC_CAP_DR1 set. + */ +int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); + +#if FF_API_EMU_EDGE +/** + * Return the amount of padding in pixels which the get_buffer callback must + * provide around the edge of the image for codecs which do not have the + * CODEC_FLAG_EMU_EDGE flag. + * + * @return Required padding in pixels. + * + * @deprecated CODEC_FLAG_EMU_EDGE is deprecated, so this function is no longer + * needed + */ +attribute_deprecated +unsigned avcodec_get_edge_width(void); +#endif + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you do not use any horizontal + * padding. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you also ensure that all + * line sizes are a multiple of the respective linesize_align[i]. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, + int linesize_align[AV_NUM_DATA_POINTERS]); + +/** + * Converts AVChromaLocation to swscale x/y chroma position. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos); + +/** + * Converts swscale x/y chroma position to AVChromaLocation. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); + +/** + * Decode the audio frame of size avpkt->size from avpkt->data into frame. + * + * Some decoders may support multiple frames in a single AVPacket. Such + * decoders would then just decode the first frame and the return value would be + * less than the packet size. In this case, avcodec_decode_audio4 has to be + * called again with an AVPacket containing the remaining data in order to + * decode the second frame, etc... Even if no frames are returned, the packet + * needs to be fed to the decoder with remaining data until it is completely + * consumed or an error occurs. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning samples. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no samples will be returned. + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] frame The AVFrame in which to store decoded audio samples. + * The decoder will allocate a buffer for the decoded frame by + * calling the AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is + * non-zero. Note that this field being set to zero + * does not mean that an error has occurred. For + * decoders with AV_CODEC_CAP_DELAY set, no given decode + * call is guaranteed to produce a frame. + * @param[in] avpkt The input AVPacket containing the input buffer. + * At least avpkt->data and avpkt->size should be set. Some + * decoders might also require additional fields to be set. + * @return A negative error code is returned if an error occurred during + * decoding, otherwise the number of bytes consumed from the input + * AVPacket is returned. + * +* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, + int *got_frame_ptr, const AVPacket *avpkt); + +/** + * Decode the video frame of size avpkt->size from avpkt->data into picture. + * Some decoders may support multiple frames in a single AVPacket, such + * decoders would then just decode the first frame. + * + * @warning The input buffer must be AV_INPUT_BUFFER_PADDING_SIZE larger than + * the actual read bytes because some optimized bitstream readers read 32 or 64 + * bits at once and could read over the end. + * + * @warning The end of the input buffer buf should be set to 0 to ensure that + * no overreading happens for damaged MPEG streams. + * + * @note Codecs which have the AV_CODEC_CAP_DELAY capability set have a delay + * between input and output, these need to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to return the remaining frames. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] picture The AVFrame in which the decoded video frame will be stored. + * Use av_frame_alloc() to get an AVFrame. The codec will + * allocate memory for the actual bitmap by calling the + * AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * + * @param[in] avpkt The input AVPacket containing the input buffer. + * You can create such packet with av_init_packet() and by then setting + * data and size, some decoders might in addition need other fields like + * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least + * fields possible. + * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame could be decompressed. + * + * @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, + int *got_picture_ptr, + const AVPacket *avpkt); + +/** + * Decode a subtitle message. + * Return a negative value on error, otherwise return the number of bytes used. + * If no subtitle could be decompressed, got_sub_ptr is zero. + * Otherwise, the subtitle is stored in *sub. + * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for + * simplicity, because the performance difference is expect to be negligible + * and reusing a get_buffer written for video codecs would probably perform badly + * due to a potentially very different allocation pattern. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning subtitles. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored, + * must be freed with avsubtitle_free if *got_sub_ptr is set. + * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. + * @param[in] avpkt The input AVPacket containing the input buffer. + */ +int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, + int *got_sub_ptr, + AVPacket *avpkt); + +/** + * Supply raw packet data as input to a decoder. + * + * Internally, this call will copy relevant AVCodecContext fields, which can + * influence decoding per-packet, and apply them when the packet is actually + * decoded. (For example AVCodecContext.skip_frame, which might direct the + * decoder to drop the frame contained by the packet sent with this function.) + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @warning Do not mix this API with the legacy API (like avcodec_decode_video2()) + * on the same AVCodecContext. It will return unexpected results now + * or in future libavcodec versions. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx codec context + * @param[in] avpkt The input AVPacket. Usually, this will be a single video + * frame, or several complete audio frames. + * Ownership of the packet remains with the caller, and the + * decoder will not write to the packet. The decoder may create + * a reference to the packet data (or copy it if the packet is + * not reference-counted). + * Unlike with older APIs, the packet is always fully consumed, + * and if it contains multiple frames (e.g. some audio codecs), + * will require you to call avcodec_receive_frame() multiple + * times afterwards before you can send a new packet. + * It can be NULL (or an AVPacket with data set to NULL and + * size set to 0); in this case, it is considered a flush + * packet, which signals the end of the stream. Sending the + * first flush packet will return success. Subsequent ones are + * unnecessary and will return AVERROR_EOF. If the decoder + * still has frames buffered, it will return them after sending + * a flush packet. + * + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_frame() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the decoder has been flushed, and no new packets can + * be sent to it (also returned if more than 1 flush + * packet is sent) + * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); + +/** + * Return decoded output data from a decoder. + * + * @param avctx codec context + * @param frame This will be set to a reference-counted video or audio + * frame (depending on the decoder type) allocated by the + * decoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * + * @return + * 0: success, a frame was returned + * AVERROR(EAGAIN): output is not available in this state - user must try + * to send new input + * AVERROR_EOF: the decoder has been fully flushed, and there will be + * no more output frames + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other negative values: legitimate decoding errors + */ +int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); + +/** + * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() + * to retrieve buffered output packets. + * + * @param avctx codec context + * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. + * Ownership of the frame remains with the caller, and the + * encoder will not write to the frame. The encoder may create + * a reference to the frame data (or copy it if the frame is + * not reference-counted). + * It can be NULL, in which case it is considered a flush + * packet. This signals the end of the stream. If the encoder + * still has packets buffered, it will return them after this + * call. Once flushing mode has been entered, additional flush + * packets are ignored, and sending frames will return + * AVERROR_EOF. + * + * For audio: + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_packet() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the encoder has been flushed, and no new frames can + * be sent to it + * AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a + * decoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); + +/** + * Read encoded data from the encoder. + * + * @param avctx codec context + * @param avpkt This will be set to a reference-counted packet allocated by the + * encoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): output is not available in the current state - user + * must try to send input + * AVERROR_EOF: the encoder has been fully flushed, and there will be + * no more output packets + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other errors: legitimate decoding errors + */ +int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); + + +/** + * @defgroup lavc_parsing Frame parsing + * @{ + */ + +enum AVPictureStructure { + AV_PICTURE_STRUCTURE_UNKNOWN, //< unknown + AV_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field + AV_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field + AV_PICTURE_STRUCTURE_FRAME, //< coded as frame +}; + +typedef struct AVCodecParserContext { + void *priv_data; + struct AVCodecParser *parser; + int64_t frame_offset; /* offset of the current frame */ + int64_t cur_offset; /* current offset + (incremented by each av_parser_parse()) */ + int64_t next_frame_offset; /* offset of the next frame */ + /* video info */ + int pict_type; /* XXX: Put it back in AVCodecContext. */ + /** + * This field is used for proper frame duration computation in lavf. + * It signals, how much longer the frame duration of the current frame + * is compared to normal frame duration. + * + * frame_duration = (1 + repeat_pict) * time_base + * + * It is used by codecs like H.264 to display telecined material. + */ + int repeat_pict; /* XXX: Put it back in AVCodecContext. */ + int64_t pts; /* pts of the current frame */ + int64_t dts; /* dts of the current frame */ + + /* private data */ + int64_t last_pts; + int64_t last_dts; + int fetch_timestamp; + +#define AV_PARSER_PTS_NB 4 + int cur_frame_start_index; + int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_pts[AV_PARSER_PTS_NB]; + int64_t cur_frame_dts[AV_PARSER_PTS_NB]; + + int flags; +#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 +#define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 +#define PARSER_FLAG_USE_CODEC_TS 0x1000 + + int64_t offset; ///< byte offset from starting packet start + int64_t cur_frame_end[AV_PARSER_PTS_NB]; + + /** + * Set by parser to 1 for key frames and 0 for non-key frames. + * It is initialized to -1, so if the parser doesn't set this flag, + * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames + * will be used. + */ + int key_frame; + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated unused + */ + attribute_deprecated + int64_t convergence_duration; +#endif + + // Timestamp generation support: + /** + * Synchronization point for start of timestamp generation. + * + * Set to >0 for sync point, 0 for no sync point and <0 for undefined + * (default). + * + * For example, this corresponds to presence of H.264 buffering period + * SEI message. + */ + int dts_sync_point; + + /** + * Offset of the current timestamp against last timestamp sync point in + * units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain a valid timestamp offset. + * + * Note that the timestamp of sync point has usually a nonzero + * dts_ref_dts_delta, which refers to the previous sync point. Offset of + * the next frame after timestamp sync point will be usually 1. + * + * For example, this corresponds to H.264 cpb_removal_delay. + */ + int dts_ref_dts_delta; + + /** + * Presentation delay of current frame in units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain valid non-negative timestamp delta (presentation time of a frame + * must not lie in the past). + * + * This delay represents the difference between decoding and presentation + * time of the frame. + * + * For example, this corresponds to H.264 dpb_output_delay. + */ + int pts_dts_delta; + + /** + * Position of the packet in file. + * + * Analogous to cur_frame_pts/dts + */ + int64_t cur_frame_pos[AV_PARSER_PTS_NB]; + + /** + * Byte position of currently parsed frame in stream. + */ + int64_t pos; + + /** + * Previous frame byte position. + */ + int64_t last_pos; + + /** + * Duration of the current frame. + * For audio, this is in units of 1 / AVCodecContext.sample_rate. + * For all other types, this is in units of AVCodecContext.time_base. + */ + int duration; + + enum AVFieldOrder field_order; + + /** + * Indicate whether a picture is coded as a frame, top field or bottom field. + * + * For example, H.264 field_pic_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag + * equal to 1 and bottom_field_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_TOP_FIELD. + */ + enum AVPictureStructure picture_structure; + + /** + * Picture number incremented in presentation or output order. + * This field may be reinitialized at the first picture of a new sequence. + * + * For example, this corresponds to H.264 PicOrderCnt. + */ + int output_picture_number; + + /** + * Dimensions of the decoded video intended for presentation. + */ + int width; + int height; + + /** + * Dimensions of the coded video. + */ + int coded_width; + int coded_height; + + /** + * The format of the coded data, corresponds to enum AVPixelFormat for video + * and for enum AVSampleFormat for audio. + * + * Note that a decoder can have considerable freedom in how exactly it + * decodes the data, so the format reported here might be different from the + * one returned by a decoder. + */ + int format; +} AVCodecParserContext; + +typedef struct AVCodecParser { + int codec_ids[5]; /* several codec IDs are permitted */ + int priv_data_size; + int (*parser_init)(AVCodecParserContext *s); + /* This callback never returns an error, a negative value means that + * the frame start was in a previous packet. */ + int (*parser_parse)(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size); + void (*parser_close)(AVCodecParserContext *s); + int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); + struct AVCodecParser *next; +} AVCodecParser; + +AVCodecParser *av_parser_next(const AVCodecParser *c); + +void av_register_codec_parser(AVCodecParser *parser); +AVCodecParserContext *av_parser_init(int codec_id); + +/** + * Parse a packet. + * + * @param s parser context. + * @param avctx codec context. + * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. + * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. + * @param buf input buffer. + * @param buf_size buffer size in bytes without the padding. I.e. the full buffer + size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. + To signal EOF, this should be 0 (so that the last frame + can be output). + * @param pts input presentation timestamp. + * @param dts input decoding timestamp. + * @param pos input byte position in stream. + * @return the number of bytes of the input bitstream used. + * + * Example: + * @code + * while(in_len){ + * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, + * in_data, in_len, + * pts, dts, pos); + * in_data += len; + * in_len -= len; + * + * if(size) + * decode_frame(data, size); + * } + * @endcode + */ +int av_parser_parse2(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts, + int64_t pos); + +/** + * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed + * @deprecated use AVBitStreamFilter + */ +int av_parser_change(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +void av_parser_close(AVCodecParserContext *s); + +/** + * @} + * @} + */ + +/** + * @addtogroup lavc_encoding + * @{ + */ + +/** + * Find a registered encoder with a matching codec ID. + * + * @param id AVCodecID of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder(enum AVCodecID id); + +/** + * Find a registered encoder with the specified name. + * + * @param name name of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder_by_name(const char *name); + +/** + * Encode a frame of audio. + * + * Takes input samples from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay, split, and combine input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. If avpkt->data and + * avpkt->size are set, avpkt->destruct must also be set. All + * other AVPacket fields will be reset by the encoder using + * av_init_packet(). If avpkt->data is NULL, the encoder will + * allocate it. The encoder will set avpkt->size to the size + * of the output packet. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw audio data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +/** + * Encode a frame of video. + * + * Takes input raw video data from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay and reorder input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. All other AVPacket fields + * will be reset by the encoder using av_init_packet(). If + * avpkt->data is NULL, the encoder will allocate it. + * The encoder will set avpkt->size to the size of the + * output packet. The returned data (if any) belongs to the + * caller, he is responsible for freeing it. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw video data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVSubtitle *sub); + + +/** + * @} + */ + +#if FF_API_AVCODEC_RESAMPLE +/** + * @defgroup lavc_resample Audio resampling + * @ingroup libavc + * @deprecated use libswresample instead + * + * @{ + */ +struct ReSampleContext; +struct AVResampleContext; + +typedef struct ReSampleContext ReSampleContext; + +/** + * Initialize audio resampling context. + * + * @param output_channels number of output channels + * @param input_channels number of input channels + * @param output_rate output sample rate + * @param input_rate input sample rate + * @param sample_fmt_out requested output sample format + * @param sample_fmt_in input sample format + * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency + * @param log2_phase_count log2 of the number of entries in the polyphase filterbank + * @param linear if 1 then the used FIR filter will be linearly interpolated + between the 2 closest, if 0 the closest will be used + * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate + * @return allocated ReSampleContext, NULL if error occurred + */ +attribute_deprecated +ReSampleContext *av_audio_resample_init(int output_channels, int input_channels, + int output_rate, int input_rate, + enum AVSampleFormat sample_fmt_out, + enum AVSampleFormat sample_fmt_in, + int filter_length, int log2_phase_count, + int linear, double cutoff); + +attribute_deprecated +int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples); + +/** + * Free resample context. + * + * @param s a non-NULL pointer to a resample context previously + * created with av_audio_resample_init() + */ +attribute_deprecated +void audio_resample_close(ReSampleContext *s); + + +/** + * Initialize an audio resampler. + * Note, if either rate is not an integer then simply scale both rates up so they are. + * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq + * @param log2_phase_count log2 of the number of entries in the polyphase filterbank + * @param linear If 1 then the used FIR filter will be linearly interpolated + between the 2 closest, if 0 the closest will be used + * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate + */ +attribute_deprecated +struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff); + +/** + * Resample an array of samples using a previously configured context. + * @param src an array of unconsumed samples + * @param consumed the number of samples of src which have been consumed are returned here + * @param src_size the number of unconsumed samples available + * @param dst_size the amount of space in samples available in dst + * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context. + * @return the number of samples written in dst or -1 if an error occurred + */ +attribute_deprecated +int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx); + + +/** + * Compensate samplerate/timestamp drift. The compensation is done by changing + * the resampler parameters, so no audible clicks or similar distortions occur + * @param compensation_distance distance in output samples over which the compensation should be performed + * @param sample_delta number of output samples which should be output less + * + * example: av_resample_compensate(c, 10, 500) + * here instead of 510 samples only 500 samples would be output + * + * note, due to rounding the actual compensation might be slightly different, + * especially if the compensation_distance is large and the in_rate used during init is small + */ +attribute_deprecated +void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance); +attribute_deprecated +void av_resample_close(struct AVResampleContext *c); + +/** + * @} + */ +#endif + +#if FF_API_AVPICTURE +/** + * @addtogroup lavc_picture + * @{ + */ + +/** + * @deprecated unused + */ +attribute_deprecated +int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +void avpicture_free(AVPicture *picture); + +/** + * @deprecated use av_image_fill_arrays() instead. + */ +attribute_deprecated +int avpicture_fill(AVPicture *picture, const uint8_t *ptr, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated use av_image_copy_to_buffer() instead. + */ +attribute_deprecated +int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt, + int width, int height, + unsigned char *dest, int dest_size); + +/** + * @deprecated use av_image_get_buffer_size() instead. + */ +attribute_deprecated +int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated av_image_copy() instead. + */ +attribute_deprecated +void av_picture_copy(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_crop(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int top_band, int left_band); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt, + int padtop, int padbottom, int padleft, int padright, int *color); + +/** + * @} + */ +#endif + +/** + * @defgroup lavc_misc Utility functions + * @ingroup libavc + * + * Miscellaneous utility functions related to both encoding and decoding + * (or neither). + * @{ + */ + +/** + * @defgroup lavc_misc_pixfmt Pixel formats + * + * Functions for working with pixel formats. + * @{ + */ + +#if FF_API_GETCHROMA +/** + * @deprecated Use av_pix_fmt_get_chroma_sub_sample + */ + +attribute_deprecated +void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); +#endif + +/** + * Return a value representing the fourCC code associated to the + * pixel format pix_fmt, or 0 if no associated fourCC code can be + * found. + */ +unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt); + +/** + * @deprecated see av_get_pix_fmt_loss() + */ +int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Find the best pixel format to convert to given a certain source pixel + * format. When converting from one pixel format to another, information loss + * may occur. For example, when converting from RGB24 to GRAY, the color + * information will be lost. Similarly, other losses occur when converting from + * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of + * the given pixel formats should be used to suffer the least amount of loss. + * The pixel formats from which it chooses one, are determined by the + * pix_fmt_list parameter. + * + * + * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. + * @return The best pixel format to convert to or -1 if none was found. + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, + enum AVPixelFormat src_pix_fmt, + int has_alpha, int *loss_ptr); + +/** + * @deprecated see av_find_best_pix_fmt_of_2() + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +attribute_deprecated +enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + +/** + * @} + */ + +#if FF_API_SET_DIMENSIONS +/** + * @deprecated this function is not supposed to be used from outside of lavc + */ +attribute_deprecated +void avcodec_set_dimensions(AVCodecContext *s, int width, int height); +#endif + +#if FF_API_TAG_STRING +/** + * Put a string representing the codec tag codec_tag in buf. + * + * @param buf buffer to place codec tag in + * @param buf_size size in bytes of buf + * @param codec_tag codec tag to assign + * @return the length of the string that would have been generated if + * enough space had been available, excluding the trailing null + * + * @deprecated see av_fourcc_make_string() and av_fourcc2str(). + */ +attribute_deprecated +size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); +#endif + +void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); + +/** + * Return a name for the specified profile, if available. + * + * @param codec the codec that is searched for the given profile + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + */ +const char *av_get_profile_name(const AVCodec *codec, int profile); + +/** + * Return a name for the specified profile, if available. + * + * @param codec_id the ID of the codec to which the requested profile belongs + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + * + * @note unlike av_get_profile_name(), which searches a list of profiles + * supported by a specific decoder or encoder implementation, this + * function searches the list of profiles from the AVCodecDescriptor + */ +const char *avcodec_profile_name(enum AVCodecID codec_id, int profile); + +int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); +int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); +//FIXME func typedef + +/** + * Fill AVFrame audio data and linesize pointers. + * + * The buffer buf must be a preallocated buffer with a size big enough + * to contain the specified samples amount. The filled AVFrame data + * pointers will point to this buffer. + * + * AVFrame extended_data channel pointers are allocated if necessary for + * planar audio. + * + * @param frame the AVFrame + * frame->nb_samples must be set prior to calling the + * function. This function fills in frame->data, + * frame->extended_data, frame->linesize[0]. + * @param nb_channels channel count + * @param sample_fmt sample format + * @param buf buffer to use for frame data + * @param buf_size size of buffer + * @param align plane size sample alignment (0 = default) + * @return >=0 on success, negative error code on failure + * @todo return the size in bytes required to store the samples in + * case of success, at the next libavutil bump + */ +int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, + enum AVSampleFormat sample_fmt, const uint8_t *buf, + int buf_size, int align); + +/** + * Reset the internal decoder state / flush internal buffers. Should be called + * e.g. when seeking or when switching to a different stream. + * + * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0), + * this invalidates the frames previously returned from the decoder. When + * refcounted frames are used, the decoder just releases any references it might + * keep internally, but the caller's reference remains valid. + */ +void avcodec_flush_buffers(AVCodecContext *avctx); + +/** + * Return codec bits per sample. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return the PCM codec associated with a sample format. + * @param be endianness, 0 for little, 1 for big, + * -1 (or anything else) for native + * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE + */ +enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be); + +/** + * Return codec bits per sample. + * Only return non-zero if the bits per sample is exactly correct, not an + * approximation. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_exact_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return audio frame duration. + * + * @param avctx codec context + * @param frame_bytes size of the frame, or 0 if unknown + * @return frame duration, in samples, if known. 0 if not able to + * determine. + */ +int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); + +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); + +#if FF_API_OLD_BSF +typedef struct AVBitStreamFilterContext { + void *priv_data; + const struct AVBitStreamFilter *filter; + AVCodecParserContext *parser; + struct AVBitStreamFilterContext *next; + /** + * Internal default arguments, used if NULL is passed to av_bitstream_filter_filter(). + * Not for access by library users. + */ + char *args; +} AVBitStreamFilterContext; +#endif + +typedef struct AVBSFInternal AVBSFInternal; + +/** + * The bitstream filter state. + * + * This struct must be allocated with av_bsf_alloc() and freed with + * av_bsf_free(). + * + * The fields in the struct will only be changed (by the caller or by the + * filter) as described in their documentation, and are to be considered + * immutable otherwise. + */ +typedef struct AVBSFContext { + /** + * A class for logging and AVOptions + */ + const AVClass *av_class; + + /** + * The bitstream filter this context is an instance of. + */ + const struct AVBitStreamFilter *filter; + + /** + * Opaque libavcodec internal data. Must not be touched by the caller in any + * way. + */ + AVBSFInternal *internal; + + /** + * Opaque filter-specific private data. If filter->priv_class is non-NULL, + * this is an AVOptions-enabled struct. + */ + void *priv_data; + + /** + * Parameters of the input stream. This field is allocated in + * av_bsf_alloc(), it needs to be filled by the caller before + * av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. This field is allocated in + * av_bsf_alloc(), it is set by the filter in av_bsf_init(). + */ + AVCodecParameters *par_out; + + /** + * The timebase used for the timestamps of the input packets. Set by the + * caller before av_bsf_init(). + */ + AVRational time_base_in; + + /** + * The timebase used for the timestamps of the output packets. Set by the + * filter in av_bsf_init(). + */ + AVRational time_base_out; +} AVBSFContext; + +typedef struct AVBitStreamFilter { + const char *name; + + /** + * A list of codec ids supported by the filter, terminated by + * AV_CODEC_ID_NONE. + * May be NULL, in that case the bitstream filter works with any codec id. + */ + const enum AVCodecID *codec_ids; + + /** + * A class for the private data, used to declare bitstream filter private + * AVOptions. This field is NULL for bitstream filters that do not declare + * any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavcodec generic + * code to this class. + */ + const AVClass *priv_class; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + int priv_data_size; + int (*init)(AVBSFContext *ctx); + int (*filter)(AVBSFContext *ctx, AVPacket *pkt); + void (*close)(AVBSFContext *ctx); +} AVBitStreamFilter; + +#if FF_API_OLD_BSF +/** + * Register a bitstream filter. + * + * The filter will be accessible to the application code through + * av_bitstream_filter_next() or can be directly initialized with + * av_bitstream_filter_init(). + * + * @see avcodec_register_all() + */ +attribute_deprecated +void av_register_bitstream_filter(AVBitStreamFilter *bsf); + +/** + * Create and initialize a bitstream filter context given a bitstream + * filter name. + * + * The returned context must be freed with av_bitstream_filter_close(). + * + * @param name the name of the bitstream filter + * @return a bitstream filter context if a matching filter was found + * and successfully initialized, NULL otherwise + */ +attribute_deprecated +AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); + +/** + * Filter bitstream. + * + * This function filters the buffer buf with size buf_size, and places the + * filtered buffer in the buffer pointed to by poutbuf. + * + * The output buffer must be freed by the caller. + * + * @param bsfc bitstream filter context created by av_bitstream_filter_init() + * @param avctx AVCodecContext accessed by the filter, may be NULL. + * If specified, this must point to the encoder context of the + * output stream the packet is sent to. + * @param args arguments which specify the filter configuration, may be NULL + * @param poutbuf pointer which is updated to point to the filtered buffer + * @param poutbuf_size pointer which is updated to the filtered buffer size in bytes + * @param buf buffer containing the data to filter + * @param buf_size size in bytes of buf + * @param keyframe set to non-zero if the buffer to filter corresponds to a key-frame packet data + * @return >= 0 in case of success, or a negative error code in case of failure + * + * If the return value is positive, an output buffer is allocated and + * is available in *poutbuf, and is distinct from the input buffer. + * + * If the return value is 0, the output buffer is not allocated and + * should be considered identical to the input buffer, or in case + * *poutbuf was set it points to the input buffer (not necessarily to + * its starting address). A special case is if *poutbuf was set to NULL and + * *poutbuf_size was set to 0, which indicates the packet should be dropped. + */ +attribute_deprecated +int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, + AVCodecContext *avctx, const char *args, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); + +/** + * Release bitstream filter context. + * + * @param bsf the bitstream filter context created with + * av_bitstream_filter_init(), can be NULL + */ +attribute_deprecated +void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); + +/** + * If f is NULL, return the first registered bitstream filter, + * if f is non-NULL, return the next registered bitstream filter + * after f, or NULL if f is the last one. + * + * This function can be used to iterate over all registered bitstream + * filters. + */ +attribute_deprecated +AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +#endif + +/** + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. + */ +const AVBitStreamFilter *av_bsf_get_by_name(const char *name); + +/** + * Iterate over all registered bitstream filters. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered bitstream filter or NULL when the iteration is + * finished + */ +const AVBitStreamFilter *av_bsf_next(void **opaque); + +/** + * Allocate a context for a given bitstream filter. The caller must fill in the + * context parameters as described in the documentation and then call + * av_bsf_init() before sending any data to the filter. + * + * @param filter the filter for which to allocate an instance. + * @param ctx a pointer into which the pointer to the newly-allocated context + * will be written. It must be freed with av_bsf_free() after the + * filtering is done. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); + +/** + * Prepare the filter for use, after all the parameters and options have been + * set. + */ +int av_bsf_init(AVBSFContext *ctx); + +/** + * Submit a packet for filtering. + * + * After sending each packet, the filter must be completely drained by calling + * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or + * AVERROR_EOF. + * + * @param pkt the packet to filter. The bitstream filter will take ownership of + * the packet and reset the contents of pkt. pkt is not touched if an error occurs. + * This parameter may be NULL, which signals the end of the stream (i.e. no more + * packets will be sent). That will cause the filter to output any packets it + * may have buffered internally. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Retrieve a filtered packet. + * + * @param[out] pkt this struct will be filled with the contents of the filtered + * packet. It is owned by the caller and must be freed using + * av_packet_unref() when it is no longer needed. + * This parameter should be "clean" (i.e. freshly allocated + * with av_packet_alloc() or unreffed with av_packet_unref()) + * when this function is called. If this function returns + * successfully, the contents of pkt will be completely + * overwritten by the returned data. On failure, pkt is not + * touched. + * + * @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the + * filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there + * will be no further output from the filter. Another negative AVERROR value if + * an error occurs. + * + * @note one input packet may result in several output packets, so after sending + * a packet with av_bsf_send_packet(), this function needs to be called + * repeatedly until it stops returning 0. It is also possible for a filter to + * output fewer packets than were sent to it, so this function may return + * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. + */ +int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Free a bitstream filter context and everything associated with it; write NULL + * into the supplied pointer. + */ +void av_bsf_free(AVBSFContext **ctx); + +/** + * Get the AVClass for AVBSFContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_bsf_get_class(void); + +/** + * Structure for chain/list of bitstream filters. + * Empty list can be allocated by av_bsf_list_alloc(). + */ +typedef struct AVBSFList AVBSFList; + +/** + * Allocate empty list of bitstream filters. + * The list must be later freed by av_bsf_list_free() + * or finalized by av_bsf_list_finalize(). + * + * @return Pointer to @ref AVBSFList on success, NULL in case of failure + */ +AVBSFList *av_bsf_list_alloc(void); + +/** + * Free list of bitstream filters. + * + * @param lst Pointer to pointer returned by av_bsf_list_alloc() + */ +void av_bsf_list_free(AVBSFList **lst); + +/** + * Append bitstream filter to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf Filter context to be appended + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); + +/** + * Construct new bitstream filter context given it's name and options + * and append it to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf_name Name of the bitstream filter + * @param options Options for the bitstream filter, can be set to NULL + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); +/** + * Finalize list of bitstream filters. + * + * This function will transform @ref AVBSFList to single @ref AVBSFContext, + * so the whole chain of bitstream filters can be treated as single filter + * freshly allocated by av_bsf_alloc(). + * If the call is successful, @ref AVBSFList structure is freed and lst + * will be set to NULL. In case of failure, caller is responsible for + * freeing the structure by av_bsf_list_free() + * + * @param lst Filter list structure to be transformed + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); + +/** + * Parse string describing list of bitstream filters and create single + * @ref AVBSFContext describing the whole chain of bitstream filters. + * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly + * allocated by av_bsf_alloc(). + * + * @param str String describing chain of bitstream filters in format + * `bsf1[=opt1=val1:opt2=val2][,bsf2]` + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); + +/** + * Get null/pass-through bitstream filter. + * + * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter + * + * @return + */ +int av_bsf_get_null_filter(AVBSFContext **bsf); + +/* memory */ + +/** + * Same behaviour av_fast_malloc but the buffer has additional + * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. + * + * In addition the whole buffer will initially and after resizes + * be 0-initialized so that no uninitialized data will ever appear. + */ +void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Same behaviour av_fast_padded_malloc except that buffer will always + * be 0-initialized after call. + */ +void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Encode extradata length to a buffer. Used by xiph codecs. + * + * @param s buffer to write to; must be at least (v/255+1) bytes long + * @param v size of extradata in bytes + * @return number of bytes written to the buffer. + */ +unsigned int av_xiphlacing(unsigned char *s, unsigned int v); + +#if FF_API_MISSING_SAMPLE +/** + * Log a generic warning message about a missing feature. This function is + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) + * only, and would normally not be used by applications. + * @param[in] avc a pointer to an arbitrary struct of which the first field is + * a pointer to an AVClass struct + * @param[in] feature string containing the name of the missing feature + * @param[in] want_sample indicates if samples are wanted which exhibit this feature. + * If want_sample is non-zero, additional verbiage will be added to the log + * message which tells the user how to report samples to the development + * mailing list. + * @deprecated Use avpriv_report_missing_feature() instead. + */ +attribute_deprecated +void av_log_missing_feature(void *avc, const char *feature, int want_sample); + +/** + * Log a generic warning message asking for a sample. This function is + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.) + * only, and would normally not be used by applications. + * @param[in] avc a pointer to an arbitrary struct of which the first field is + * a pointer to an AVClass struct + * @param[in] msg string containing an optional message, or NULL if no message + * @deprecated Use avpriv_request_sample() instead. + */ +attribute_deprecated +void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3); +#endif /* FF_API_MISSING_SAMPLE */ + +/** + * Register the hardware accelerator hwaccel. + */ +void av_register_hwaccel(AVHWAccel *hwaccel); + +/** + * If hwaccel is NULL, returns the first registered hardware accelerator, + * if hwaccel is non-NULL, returns the next registered hardware accelerator + * after hwaccel, or NULL if hwaccel is the last one. + */ +AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); + + +/** + * Lock operation used by lockmgr + */ +enum AVLockOp { + AV_LOCK_CREATE, ///< Create a mutex + AV_LOCK_OBTAIN, ///< Lock the mutex + AV_LOCK_RELEASE, ///< Unlock the mutex + AV_LOCK_DESTROY, ///< Free mutex resources +}; + +/** + * Register a user provided lock manager supporting the operations + * specified by AVLockOp. The "mutex" argument to the function points + * to a (void *) where the lockmgr should store/get a pointer to a user + * allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the + * value left by the last call for all other ops. If the lock manager is + * unable to perform the op then it should leave the mutex in the same + * state as when it was called and return a non-zero value. However, + * when called with AV_LOCK_DESTROY the mutex will always be assumed to + * have been successfully destroyed. If av_lockmgr_register succeeds + * it will return a non-negative value, if it fails it will return a + * negative value and destroy all mutex and unregister all callbacks. + * av_lockmgr_register is not thread-safe, it must be called from a + * single thread before any calls which make use of locking are used. + * + * @param cb User defined callback. av_lockmgr_register invokes calls + * to this callback and the previously registered callback. + * The callback will be used to create more than one mutex + * each of which must be backed by its own underlying locking + * mechanism (i.e. do not use a single static object to + * implement your lock manager). If cb is set to NULL the + * lockmgr will be unregistered. + */ +int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); + +/** + * Get the type of the given codec. + */ +enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); + +/** + * Get the name of a codec. + * @return a static string identifying the codec; never NULL + */ +const char *avcodec_get_name(enum AVCodecID id); + +/** + * @return a positive value if s is open (i.e. avcodec_open2() was called on it + * with no corresponding avcodec_close()), 0 otherwise. + */ +int avcodec_is_open(AVCodecContext *s); + +/** + * @return a non-zero number if codec is an encoder, zero otherwise + */ +int av_codec_is_encoder(const AVCodec *codec); + +/** + * @return a non-zero number if codec is a decoder, zero otherwise + */ +int av_codec_is_decoder(const AVCodec *codec); + +/** + * @return descriptor for given codec ID or NULL if no descriptor exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id); + +/** + * Iterate over all codec descriptors known to libavcodec. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); + +/** + * @return codec descriptor with the given name or NULL if no such descriptor + * exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); + +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + +/** + * @} + */ + +#endif /* AVCODEC_AVCODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avdct.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avdct.h new file mode 100644 index 0000000..272422e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avdct.h @@ -0,0 +1,84 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVDCT_H +#define AVCODEC_AVDCT_H + +#include "libavutil/opt.h" + +/** + * AVDCT context. + * @note function pointers can be NULL if the specific features have been + * disabled at build time. + */ +typedef struct AVDCT { + const AVClass *av_class; + + void (*idct)(int16_t *block /* align 16 */); + + /** + * IDCT input permutation. + * Several optimized IDCTs need a permutated input (relative to the + * normal order of the reference IDCT). + * This permutation must be performed before the idct_put/add. + * Note, normally this can be merged with the zigzag/alternate scan
+ * An example to avoid confusion: + * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...) + * - (x -> reference DCT -> reference IDCT -> x) + * - (x -> reference DCT -> simple_mmx_perm = idct_permutation + * -> simple_idct_mmx -> x) + * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant + * -> simple_idct_mmx -> ...) + */ + uint8_t idct_permutation[64]; + + void (*fdct)(int16_t *block /* align 16 */); + + + /** + * DCT algorithm. + * must use AVOptions to set this field. + */ + int dct_algo; + + /** + * IDCT algorithm. + * must use AVOptions to set this field. + */ + int idct_algo; + + void (*get_pixels)(int16_t *block /* align 16 */, + const uint8_t *pixels /* align 8 */, + ptrdiff_t line_size); + + int bits_per_sample; +} AVDCT; + +/** + * Allocates a AVDCT context. + * This needs to be initialized with avcodec_dct_init() after optionally + * configuring it with AVOptions. + * + * To free it use av_free() + */ +AVDCT *avcodec_dct_alloc(void); +int avcodec_dct_init(AVDCT *); + +const AVClass *avcodec_dct_get_class(void); + +#endif /* AVCODEC_AVDCT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avfft.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avfft.h new file mode 100644 index 0000000..0c0f9b8 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/avfft.h @@ -0,0 +1,118 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVFFT_H +#define AVCODEC_AVFFT_H + +/** + * @file + * @ingroup lavc_fft + * FFT functions + */ + +/** + * @defgroup lavc_fft FFT functions + * @ingroup lavc_misc + * + * @{ + */ + +typedef float FFTSample; + +typedef struct FFTComplex { + FFTSample re, im; +} FFTComplex; + +typedef struct FFTContext FFTContext; + +/** + * Set up a complex FFT. + * @param nbits log2 of the length of the input array + * @param inverse if 0 perform the forward transform, if 1 perform the inverse + */ +FFTContext *av_fft_init(int nbits, int inverse); + +/** + * Do the permutation needed BEFORE calling ff_fft_calc(). + */ +void av_fft_permute(FFTContext *s, FFTComplex *z); + +/** + * Do a complex FFT with the parameters defined in av_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ +void av_fft_calc(FFTContext *s, FFTComplex *z); + +void av_fft_end(FFTContext *s); + +FFTContext *av_mdct_init(int nbits, int inverse, double scale); +void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_end(FFTContext *s); + +/* Real Discrete Fourier Transform */ + +enum RDFTransformType { + DFT_R2C, + IDFT_C2R, + IDFT_R2C, + DFT_C2R, +}; + +typedef struct RDFTContext RDFTContext; + +/** + * Set up a real FFT. + * @param nbits log2 of the length of the input array + * @param trans the type of transform + */ +RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +void av_rdft_calc(RDFTContext *s, FFTSample *data); +void av_rdft_end(RDFTContext *s); + +/* Discrete Cosine Transform */ + +typedef struct DCTContext DCTContext; + +enum DCTTransformType { + DCT_II = 0, + DCT_III, + DCT_I, + DST_I, +}; + +/** + * Set up DCT. + * + * @param nbits size of the input array: + * (1 << nbits) for DCT-II, DCT-III and DST-I + * (1 << nbits) + 1 for DCT-I + * @param type the type of transform + * + * @note the first element of the input of DST-I is ignored + */ +DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +void av_dct_calc(DCTContext *s, FFTSample *data); +void av_dct_end (DCTContext *s); + +/** + * @} + */ + +#endif /* AVCODEC_AVFFT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/d3d11va.h new file mode 100644 index 0000000..6816b6c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/d3d11va.h @@ -0,0 +1,112 @@ +/* + * Direct3D11 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * copyright (c) 2015 Steve Lhomme + * + * 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 + */ + +#ifndef AVCODEC_D3D11VA_H +#define AVCODEC_D3D11VA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_d3d11va + * Public libavcodec D3D11VA header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the Direct3D11 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + * + * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. + */ +typedef struct AVD3D11VAContext { + /** + * D3D11 decoder object + */ + ID3D11VideoDecoder *decoder; + + /** + * D3D11 VideoContext + */ + ID3D11VideoContext *video_context; + + /** + * D3D11 configuration used to create the decoder + */ + D3D11_VIDEO_DECODER_CONFIG *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + ID3D11VideoDecoderOutputView **surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; + + /** + * Mutex to access video_context + */ + HANDLE context_mutex; +} AVD3D11VAContext; + +/** + * Allocate an AVD3D11VAContext. + * + * @return Newly-allocated AVD3D11VAContext or NULL on failure. + */ +AVD3D11VAContext *av_d3d11va_alloc_context(void); + +/** + * @} + */ + +#endif /* AVCODEC_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dirac.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dirac.h new file mode 100644 index 0000000..e6d9d34 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dirac.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007 Marco Gerards + * Copyright (C) 2009 David Conrad + * Copyright (C) 2011 Jordi Ortiz + * + * 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 + */ + +#ifndef AVCODEC_DIRAC_H +#define AVCODEC_DIRAC_H + +/** + * @file + * Interface to Dirac Decoder/Encoder + * @author Marco Gerards + * @author David Conrad + * @author Jordi Ortiz + */ + +#include "avcodec.h" + +/** + * The spec limits the number of wavelet decompositions to 4 for both + * level 1 (VC-2) and 128 (long-gop default). + * 5 decompositions is the maximum before >16-bit buffers are needed. + * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting + * the others to 4 decompositions (or 3 for the fidelity filter). + * + * We use this instead of MAX_DECOMPOSITIONS to save some memory. + */ +#define MAX_DWT_LEVELS 5 + +/** + * Parse code values: + * + * Dirac Specification -> + * 9.6.1 Table 9.1 + * + * VC-2 Specification -> + * 10.4.1 Table 10.1 + */ + +enum DiracParseCodes { + DIRAC_PCODE_SEQ_HEADER = 0x00, + DIRAC_PCODE_END_SEQ = 0x10, + DIRAC_PCODE_AUX = 0x20, + DIRAC_PCODE_PAD = 0x30, + DIRAC_PCODE_PICTURE_CODED = 0x08, + DIRAC_PCODE_PICTURE_RAW = 0x48, + DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8, + DIRAC_PCODE_PICTURE_HQ = 0xE8, + DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A, + DIRAC_PCODE_INTER_NOREF_CO2 = 0x09, + DIRAC_PCODE_INTER_REF_CO1 = 0x0D, + DIRAC_PCODE_INTER_REF_CO2 = 0x0E, + DIRAC_PCODE_INTRA_REF_CO = 0x0C, + DIRAC_PCODE_INTRA_REF_RAW = 0x4C, + DIRAC_PCODE_INTRA_REF_PICT = 0xCC, + DIRAC_PCODE_MAGIC = 0x42424344, +}; + +typedef struct DiracVersionInfo { + int major; + int minor; +} DiracVersionInfo; + +typedef struct AVDiracSeqHeader { + unsigned width; + unsigned height; + uint8_t chroma_format; ///< 0: 444 1: 422 2: 420 + + uint8_t interlaced; + uint8_t top_field_first; + + uint8_t frame_rate_index; ///< index into dirac_frame_rate[] + uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[] + + uint16_t clean_width; + uint16_t clean_height; + uint16_t clean_left_offset; + uint16_t clean_right_offset; + + uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[] + uint8_t color_spec_index; ///< index into dirac_color_spec_presets[] + + int profile; + int level; + + AVRational framerate; + AVRational sample_aspect_ratio; + + enum AVPixelFormat pix_fmt; + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; + + DiracVersionInfo version; + int bit_depth; +} AVDiracSeqHeader; + +/** + * Parse a Dirac sequence header. + * + * @param dsh this function will allocate and fill an AVDiracSeqHeader struct + * and write it into this pointer. The caller must free it with + * av_free(). + * @param buf the data buffer + * @param buf_size the size of the data buffer in bytes + * @param log_ctx if non-NULL, this function will log errors here + * @return 0 on success, a negative AVERROR code on failure + */ +int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh, + const uint8_t *buf, size_t buf_size, + void *log_ctx); + +#endif /* AVCODEC_DIRAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dv_profile.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dv_profile.h new file mode 100644 index 0000000..9380a66 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dv_profile.h @@ -0,0 +1,83 @@ +/* + * 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 + */ + +#ifndef AVCODEC_DV_PROFILE_H +#define AVCODEC_DV_PROFILE_H + +#include + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "avcodec.h" + +/* minimum number of bytes to read from a DV stream in order to + * determine the profile */ +#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */ + + +/* + * AVDVProfile is used to express the differences between various + * DV flavors. For now it's primarily used for differentiating + * 525/60 and 625/50, but the plans are to use it for various + * DV specs as well (e.g. SMPTE314M vs. IEC 61834). + */ +typedef struct AVDVProfile { + int dsf; /* value of the dsf in the DV header */ + int video_stype; /* stype for VAUX source pack */ + int frame_size; /* total size of one frame in bytes */ + int difseg_size; /* number of DIF segments per DIF channel */ + int n_difchan; /* number of DIF channels per frame */ + AVRational time_base; /* 1/framerate */ + int ltc_divisor; /* FPS from the LTS standpoint */ + int height; /* picture height in pixels */ + int width; /* picture width in pixels */ + AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ + enum AVPixelFormat pix_fmt; /* picture pixel format */ + int bpm; /* blocks per macroblock */ + const uint8_t *block_sizes; /* AC block sizes, in bits */ + int audio_stride; /* size of audio_shuffle table */ + int audio_min_samples[3]; /* min amount of audio samples */ + /* for 48kHz, 44.1kHz and 32kHz */ + int audio_samples_dist[5]; /* how many samples are supposed to be */ + /* in each frame in a 5 frames window */ + const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ +} AVDVProfile; + +/** + * Get a DV profile for the provided compressed frame. + * + * @param sys the profile used for the previous frame, may be NULL + * @param frame the compressed data buffer + * @param buf_size size of the buffer in bytes + * @return the DV profile for the supplied data or NULL on failure + */ +const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, + const uint8_t *frame, unsigned buf_size); + +/** + * Get a DV profile for the provided stream parameters. + */ +const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt); + +/** + * Get a DV profile for the provided stream parameters. + * The frame rate is used as a best-effort parameter. + */ +const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate); + +#endif /* AVCODEC_DV_PROFILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dxva2.h new file mode 100644 index 0000000..22c9399 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/dxva2.h @@ -0,0 +1,93 @@ +/* + * DXVA2 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * + * 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 + */ + +#ifndef AVCODEC_DXVA2_H +#define AVCODEC_DXVA2_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_dxva2 + * Public libavcodec DXVA2 header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_dxva2 DXVA2 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the DXVA2 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct dxva_context { + /** + * DXVA2 decoder object + */ + IDirectXVideoDecoder *decoder; + + /** + * DXVA2 configuration used to create the decoder + */ + const DXVA2_ConfigPictureDecode *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + LPDIRECT3DSURFACE9 *surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; +}; + +/** + * @} + */ + +#endif /* AVCODEC_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/jni.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/jni.h new file mode 100644 index 0000000..dd99e92 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/jni.h @@ -0,0 +1,46 @@ +/* + * JNI public API functions + * + * Copyright (c) 2015-2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_JNI_H +#define AVCODEC_JNI_H + +/* + * Manually set a Java virtual machine which will be used to retrieve the JNI + * environment. Once a Java VM is set it cannot be changed afterwards, meaning + * you can call multiple times av_jni_set_java_vm with the same Java VM pointer + * however it will error out if you try to set a different Java VM. + * + * @param vm Java virtual machine + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_java_vm(void *vm, void *log_ctx); + +/* + * Get the Java virtual machine which has been set with av_jni_set_java_vm. + * + * @param vm Java virtual machine + * @return a pointer to the Java virtual machine + */ +void *av_jni_get_java_vm(void *log_ctx); + +#endif /* AVCODEC_JNI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/mediacodec.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/mediacodec.h new file mode 100644 index 0000000..5606d24 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/mediacodec.h @@ -0,0 +1,88 @@ +/* + * Android MediaCodec public API + * + * Copyright (c) 2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_MEDIACODEC_H +#define AVCODEC_MEDIACODEC_H + +#include "libavcodec/avcodec.h" + +/** + * This structure holds a reference to a android/view/Surface object that will + * be used as output by the decoder. + * + */ +typedef struct AVMediaCodecContext { + + /** + * android/view/Surface object reference. + */ + void *surface; + +} AVMediaCodecContext; + +/** + * Allocate and initialize a MediaCodec context. + * + * When decoding with MediaCodec is finished, the caller must free the + * MediaCodec context with av_mediacodec_default_free. + * + * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise + */ +AVMediaCodecContext *av_mediacodec_alloc_context(void); + +/** + * Convenience function that sets up the MediaCodec context. + * + * @param avctx codec context + * @param ctx MediaCodec context to initialize + * @param surface reference to an android/view/Surface + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface); + +/** + * This function must be called to free the MediaCodec context initialized with + * av_mediacodec_default_init(). + * + * @param avctx codec context + */ +void av_mediacodec_default_free(AVCodecContext *avctx); + +/** + * Opaque structure representing a MediaCodec buffer to render. + */ +typedef struct MediaCodecBuffer AVMediaCodecBuffer; + +/** + * Release a MediaCodec buffer and render it to the surface that is associated + * with the decoder. This function should only be called once on a given + * buffer, once released the underlying buffer returns to the codec, thus + * subsequent calls to this function will have no effect. + * + * @param buffer the buffer to render + * @param render 1 to release and render the buffer to the surface or 0 to + * discard the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/qsv.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/qsv.h new file mode 100644 index 0000000..b77158e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/qsv.h @@ -0,0 +1,107 @@ +/* + * Intel MediaSDK QSV public API + * + * 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 + */ + +#ifndef AVCODEC_QSV_H +#define AVCODEC_QSV_H + +#include + +#include "libavutil/buffer.h" + +/** + * This struct is used for communicating QSV parameters between libavcodec and + * the caller. It is managed by the caller and must be assigned to + * AVCodecContext.hwaccel_context. + * - decoding: hwaccel_context must be set on return from the get_format() + * callback + * - encoding: hwaccel_context must be set before avcodec_open2() + */ +typedef struct AVQSVContext { + /** + * If non-NULL, the session to use for encoding or decoding. + * Otherwise, libavcodec will try to create an internal session. + */ + mfxSession session; + + /** + * The IO pattern to use. + */ + int iopattern; + + /** + * Extra buffers to pass to encoder or decoder initialization. + */ + mfxExtBuffer **ext_buffers; + int nb_ext_buffers; + + /** + * Encoding only. If this field is set to non-zero by the caller, libavcodec + * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to + * the encoder initialization. This only makes sense if iopattern is also + * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. + * + * The number of allocated opaque surfaces will be the sum of the number + * required by the encoder and the user-provided value nb_opaque_surfaces. + * The array of the opaque surfaces will be exported to the caller through + * the opaque_surfaces field. + */ + int opaque_alloc; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. Before + * calling avcodec_open2(), the caller should set this field to the number + * of extra opaque surfaces to allocate beyond what is required by the + * encoder. + * + * On return from avcodec_open2(), this field will be set by libavcodec to + * the total number of allocated opaque surfaces. + */ + int nb_opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be used by libavcodec to export the + * array of the allocated opaque surfaces to the caller, so they can be + * passed to other parts of the pipeline. + * + * The buffer reference exported here is owned and managed by libavcodec, + * the callers should make their own reference with av_buffer_ref() and free + * it with av_buffer_unref() when it is no longer needed. + * + * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. + */ + AVBufferRef *opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be set to the surface type used in + * the opaque allocation request. + */ + int opaque_alloc_type; +} AVQSVContext; + +/** + * Allocate a new context. + * + * It must be freed by the caller with av_free(). + */ +AVQSVContext *av_qsv_alloc_context(void); + +#endif /* AVCODEC_QSV_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vaapi.h new file mode 100644 index 0000000..bb28455 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vaapi.h @@ -0,0 +1,195 @@ +/* + * Video Acceleration API (shared data between FFmpeg and the video player) + * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 + * + * Copyright (C) 2008-2009 Splitted-Desktop Systems + * + * 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 + */ + +#ifndef AVCODEC_VAAPI_H +#define AVCODEC_VAAPI_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vaapi + * Public libavcodec VA API header. + */ + +#include +#include "libavutil/attributes.h" +#include "version.h" + +#if FF_API_STRUCT_VAAPI_CONTEXT + +/** + * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding + * @ingroup lavc_codec_hwaccel + * @{ + */ + +/** + * This structure is used to share data between the FFmpeg library and + * the client video application. + * This shall be zero-allocated and available as + * AVCodecContext.hwaccel_context. All user members can be set once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * Deprecated: use AVCodecContext.hw_frames_ctx instead. + */ +struct attribute_deprecated vaapi_context { + /** + * Window system dependent data + * + * - encoding: unused + * - decoding: Set by user + */ + void *display; + + /** + * Configuration ID + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t config_id; + + /** + * Context ID (video decode pipeline) + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t context_id; + +#if FF_API_VAAPI_CONTEXT + /** + * VAPictureParameterBuffer ID + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t pic_param_buf_id; + + /** + * VAIQMatrixBuffer ID + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t iq_matrix_buf_id; + + /** + * VABitPlaneBuffer ID (for VC-1 decoding) + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t bitplane_buf_id; + + /** + * Slice parameter/data buffer IDs + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t *slice_buf_ids; + + /** + * Number of effective slice buffer IDs to send to the HW + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int n_slice_buf_ids; + + /** + * Size of pre-allocated slice_buf_ids + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_buf_ids_alloc; + + /** + * Pointer to VASliceParameterBuffers + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + void *slice_params; + + /** + * Size of a VASliceParameterBuffer element + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_param_size; + + /** + * Size of pre-allocated slice_params + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_params_alloc; + + /** + * Number of slices currently filled in + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + unsigned int slice_count; + + /** + * Pointer to slice data buffer base + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + const uint8_t *slice_data; + + /** + * Current size of slice data + * + * - encoding: unused + * - decoding: Set by libavcodec + */ + attribute_deprecated + uint32_t slice_data_size; +#endif +}; + +/* @} */ + +#endif /* FF_API_STRUCT_VAAPI_CONTEXT */ + +#endif /* AVCODEC_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vda.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vda.h new file mode 100644 index 0000000..bde14e3 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vda.h @@ -0,0 +1,230 @@ +/* + * VDA HW acceleration + * + * copyright (c) 2011 Sebastien Zwickert + * + * 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 + */ + +#ifndef AVCODEC_VDA_H +#define AVCODEC_VDA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vda + * Public libavcodec VDA header. + */ + +#include "libavcodec/avcodec.h" + +#include + +// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes +// http://openradar.appspot.com/8026390 +#undef __GNUC_STDC_INLINE__ + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/version.h" + +// extra flags not defined in VDADecoder.h +enum { + kVDADecodeInfo_Asynchronous = 1UL << 0, + kVDADecodeInfo_FrameDropped = 1UL << 1 +}; + +/** + * @defgroup lavc_codec_hwaccel_vda VDA + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +/** + * This structure is used to provide the necessary configurations and data + * to the VDA FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct vda_context { + /** + * VDA decoder object. + * + * - encoding: unused + * - decoding: Set/Unset by libavcodec. + */ + VDADecoder decoder; + + /** + * The Core Video pixel buffer that contains the current image data. + * + * encoding: unused + * decoding: Set by libavcodec. Unset by user. + */ + CVPixelBufferRef cv_buffer; + + /** + * Use the hardware decoder in synchronous mode. + * + * encoding: unused + * decoding: Set by user. + */ + int use_sync_decoding; + + /** + * The frame width. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + int width; + + /** + * The frame height. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + int height; + + /** + * The frame format. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + int format; + + /** + * The pixel format for output image buffers. + * + * - encoding: unused + * - decoding: Set/Unset by user. + */ + OSType cv_pix_fmt_type; + + /** + * unused + */ + uint8_t *priv_bitstream; + + /** + * unused + */ + int priv_bitstream_size; + + /** + * unused + */ + int priv_allocated_size; + + /** + * Use av_buffer to manage buffer. + * When the flag is set, the CVPixelBuffers returned by the decoder will + * be released automatically, so you have to retain them if necessary. + * Not setting this flag may cause memory leak. + * + * encoding: unused + * decoding: Set by user. + */ + int use_ref_buffer; +}; + +/** Create the video decoder. */ +int ff_vda_create_decoder(struct vda_context *vda_ctx, + uint8_t *extradata, + int extradata_size); + +/** Destroy the video decoder. */ +int ff_vda_destroy_decoder(struct vda_context *vda_ctx); + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing VDA decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_vda_alloc_context() and freed with av_free(). + */ +typedef struct AVVDAContext { + /** + * VDA decoder object. Created and freed by the caller. + */ + VDADecoder decoder; + + /** + * The output callback that must be passed to VDADecoderCreate. + * Set by av_vda_alloc_context(). + */ + VDADecoderOutputCallback output_callback; + + /** + * CVPixelBuffer Format Type that VDA will use for decoded frames; set by + * the caller. + */ + OSType cv_pix_fmt_type; +} AVVDAContext; + +/** + * Allocate and initialize a VDA context. + * + * This function should be called from the get_format() callback when the caller + * selects the AV_PIX_FMT_VDA format. The caller must then create the decoder + * object (using the output callback provided by libavcodec) that will be used + * for VDA-accelerated decoding. + * + * When decoding with VDA is finished, the caller must destroy the decoder + * object and free the VDA context using av_free(). + * + * @return the newly allocated context or NULL on failure + */ +AVVDAContext *av_vda_alloc_context(void); + +/** + * This is a convenience function that creates and sets up the VDA context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_vda_default_init(AVCodecContext *avctx); + +/** + * This is a convenience function that creates and sets up the VDA context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * @param vdactx the VDA context to use + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_vda_default_init2(AVCodecContext *avctx, AVVDAContext *vdactx); + +/** + * This function must be called to free the VDA context initialized with + * av_vda_default_init(). + * + * @param avctx the corresponding codec context + */ +void av_vda_default_free(AVCodecContext *avctx); + +/** + * @} + */ + +#endif /* AVCODEC_VDA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vdpau.h new file mode 100644 index 0000000..855d387 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vdpau.h @@ -0,0 +1,253 @@ +/* + * The Video Decode and Presentation API for UNIX (VDPAU) is used for + * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. + * + * Copyright (C) 2008 NVIDIA + * + * 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 + */ + +#ifndef AVCODEC_VDPAU_H +#define AVCODEC_VDPAU_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vdpau + * Public libavcodec VDPAU header. + */ + + +/** + * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer + * @ingroup lavc_codec_hwaccel + * + * VDPAU hardware acceleration has two modules + * - VDPAU decoding + * - VDPAU presentation + * + * The VDPAU decoding module parses all headers using FFmpeg + * parsing mechanisms and uses VDPAU for the actual decoding. + * + * As per the current implementation, the actual decoding + * and rendering (API calls) are done as part of the VDPAU + * presentation (vo_vdpau.c) module. + * + * @{ + */ + +#include + +#include "libavutil/avconfig.h" +#include "libavutil/attributes.h" + +#include "avcodec.h" +#include "version.h" + +#if FF_API_BUFS_VDPAU +union AVVDPAUPictureInfo { + VdpPictureInfoH264 h264; + VdpPictureInfoMPEG1Or2 mpeg; + VdpPictureInfoVC1 vc1; + VdpPictureInfoMPEG4Part2 mpeg4; +}; +#endif + +struct AVCodecContext; +struct AVFrame; + +typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, + const VdpPictureInfo *, uint32_t, + const VdpBitstreamBuffer *); + +/** + * This structure is used to share data between the libavcodec library and + * the client video application. + * The user shall allocate the structure via the av_alloc_vdpau_hwaccel + * function and make it available as + * AVCodecContext.hwaccel_context. Members can be set by the user once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * The size of this structure is not a part of the public ABI and must not + * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an + * AVVDPAUContext. + */ +typedef struct AVVDPAUContext { + /** + * VDPAU decoder handle + * + * Set by user. + */ + VdpDecoder decoder; + + /** + * VDPAU decoder render callback + * + * Set by the user. + */ + VdpDecoderRender *render; + +#if FF_API_BUFS_VDPAU + /** + * VDPAU picture information + * + * Set by libavcodec. + */ + attribute_deprecated + union AVVDPAUPictureInfo info; + + /** + * Allocated size of the bitstream_buffers table. + * + * Set by libavcodec. + */ + attribute_deprecated + int bitstream_buffers_allocated; + + /** + * Useful bitstream buffers in the bitstream buffers table. + * + * Set by libavcodec. + */ + attribute_deprecated + int bitstream_buffers_used; + + /** + * Table of bitstream buffers. + * The user is responsible for freeing this buffer using av_freep(). + * + * Set by libavcodec. + */ + attribute_deprecated + VdpBitstreamBuffer *bitstream_buffers; +#endif + AVVDPAU_Render2 render2; +} AVVDPAUContext; + +/** + * @brief allocation function for AVVDPAUContext + * + * Allows extending the struct without breaking API/ABI + */ +AVVDPAUContext *av_alloc_vdpaucontext(void); + +AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); +void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); + +/** + * Associate a VDPAU device with a codec context for hardware acceleration. + * This function is meant to be called from the get_format() codec callback, + * or earlier. It can also be called after avcodec_flush_buffers() to change + * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent + * display preemption). + * + * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes + * successfully. + * + * @param avctx decoding context whose get_format() callback is invoked + * @param device VDPAU device handle to use for hardware acceleration + * @param get_proc_address VDPAU device driver + * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags + * + * @return 0 on success, an AVERROR code on failure. + */ +int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, + VdpGetProcAddress *get_proc_address, unsigned flags); + +/** + * Gets the parameters to create an adequate VDPAU video surface for the codec + * context using VDPAU hardware decoding acceleration. + * + * @note Behavior is undefined if the context was not successfully bound to a + * VDPAU device using av_vdpau_bind_context(). + * + * @param avctx the codec context being used for decoding the stream + * @param type storage space for the VDPAU video surface chroma type + * (or NULL to ignore) + * @param width storage space for the VDPAU video surface pixel width + * (or NULL to ignore) + * @param height storage space for the VDPAU video surface pixel height + * (or NULL to ignore) + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, + uint32_t *width, uint32_t *height); + +/** + * Allocate an AVVDPAUContext. + * + * @return Newly-allocated AVVDPAUContext or NULL on failure. + */ +AVVDPAUContext *av_vdpau_alloc_context(void); + +#if FF_API_VDPAU_PROFILE +/** + * Get a decoder profile that should be used for initializing a VDPAU decoder. + * Should be called from the AVCodecContext.get_format() callback. + * + * @deprecated Use av_vdpau_bind_context() instead. + * + * @param avctx the codec context being used for decoding the stream + * @param profile a pointer into which the result will be written on success. + * The contents of profile are undefined if this function returns + * an error. + * + * @return 0 on success (non-negative), a negative AVERROR on failure. + */ +attribute_deprecated +int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile); +#endif + +#if FF_API_CAP_VDPAU +/** @brief The videoSurface is used for rendering. */ +#define FF_VDPAU_STATE_USED_FOR_RENDER 1 + +/** + * @brief The videoSurface is needed for reference/prediction. + * The codec manipulates this. + */ +#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2 + +/** + * @brief This structure is used as a callback between the FFmpeg + * decoder (vd_) and presentation (vo_) module. + * This is used for defining a video frame containing surface, + * picture parameter, bitstream information etc which are passed + * between the FFmpeg decoder and its clients. + */ +struct vdpau_render_state { + VdpVideoSurface surface; ///< Used as rendered surface, never changed. + + int state; ///< Holds FF_VDPAU_STATE_* values. + + /** picture parameter information for all supported codecs */ + union AVVDPAUPictureInfo info; + + /** Describe size/location of the compressed video data. + Set to 0 when freeing bitstream_buffers. */ + int bitstream_buffers_allocated; + int bitstream_buffers_used; + /** The user is responsible for freeing this buffer using av_freep(). */ + VdpBitstreamBuffer *bitstream_buffers; +}; +#endif + +/* @}*/ + +#endif /* AVCODEC_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/version.h new file mode 100644 index 0000000..10d9ac4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/version.h @@ -0,0 +1,243 @@ +/* + * 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 + */ + +#ifndef AVCODEC_VERSION_H +#define AVCODEC_VERSION_H + +/** + * @file + * @ingroup libavc + * Libavcodec version macros. + */ + +#include "libavutil/version.h" + +#define LIBAVCODEC_VERSION_MAJOR 57 +#define LIBAVCODEC_VERSION_MINOR 107 +#define LIBAVCODEC_VERSION_MICRO 100 + +#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT + +#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + */ + +#ifndef FF_API_VIMA_DECODER +#define FF_API_VIMA_DECODER (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AUDIO_CONVERT +#define FF_API_AUDIO_CONVERT (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AVCODEC_RESAMPLE +#define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT +#endif +#ifndef FF_API_MISSING_SAMPLE +#define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LOWRES +#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_CAP_VDPAU +#define FF_API_CAP_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_BUFS_VDPAU +#define FF_API_BUFS_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_VOXWARE +#define FF_API_VOXWARE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_SET_DIMENSIONS +#define FF_API_SET_DIMENSIONS (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_DEBUG_MV +#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AC_VLC +#define FF_API_AC_VLC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_OLD_MSMPEG4 +#define FF_API_OLD_MSMPEG4 (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ASPECT_EXTENDED +#define FF_API_ASPECT_EXTENDED (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ARCH_ALPHA +#define FF_API_ARCH_ALPHA (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_XVMC +#define FF_API_XVMC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ERROR_RATE +#define FF_API_ERROR_RATE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_QSCALE_TYPE +#define FF_API_QSCALE_TYPE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MB_TYPE +#define FF_API_MB_TYPE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MAX_BFRAMES +#define FF_API_MAX_BFRAMES (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_NEG_LINESIZES +#define FF_API_NEG_LINESIZES (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_EMU_EDGE +#define FF_API_EMU_EDGE (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ARCH_SH4 +#define FF_API_ARCH_SH4 (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_ARCH_SPARC +#define FF_API_ARCH_SPARC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_UNUSED_MEMBERS +#define FF_API_UNUSED_MEMBERS (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_IDCT_XVIDMMX +#define FF_API_IDCT_XVIDMMX (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_INPUT_PRESERVED +#define FF_API_INPUT_PRESERVED (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_NORMALIZE_AQP +#define FF_API_NORMALIZE_AQP (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_GMC +#define FF_API_GMC (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MV0 +#define FF_API_MV0 (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_CODEC_NAME +#define FF_API_CODEC_NAME (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AFD +#define FF_API_AFD (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_VISMV +/* XXX: don't forget to drop the -vismv documentation */ +#define FF_API_VISMV (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AUDIOENC_DELAY +#define FF_API_AUDIOENC_DELAY (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_VAAPI_CONTEXT +#define FF_API_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_MERGE_SD +#define FF_API_MERGE_SD (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AVCTX_TIMEBASE +#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MPV_OPT +#define FF_API_MPV_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STREAM_CODEC_TAG +#define FF_API_STREAM_CODEC_TAG (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_QUANT_BIAS +#define FF_API_QUANT_BIAS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_RC_STRATEGY +#define FF_API_RC_STRATEGY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODED_FRAME +#define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MOTION_EST +#define FF_API_MOTION_EST (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_WITHOUT_PREFIX +#define FF_API_WITHOUT_PREFIX (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_SIDEDATA_ONLY_PKT +#define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VDPAU_PROFILE +#define FF_API_VDPAU_PROFILE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CONVERGENCE_DURATION +#define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPICTURE +#define FF_API_AVPICTURE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPACKET_OLD_API +#define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_RTP_CALLBACK +#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VBV_DELAY +#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODER_TYPE +#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STAT_BITS +#define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_PRIVATE_OPT +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_ASS_TIMING +#define FF_API_ASS_TIMING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_BSF +#define FF_API_OLD_BSF (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_COPY_CONTEXT +#define FF_API_COPY_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GET_CONTEXT_DEFAULTS +#define FF_API_GET_CONTEXT_DEFAULTS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NVENC_OLD_NAME +#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STRUCT_VAAPI_CONTEXT +#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MERGE_SD_API +#define FF_API_MERGE_SD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_TAG_STRING +#define FF_API_TAG_STRING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GETCHROMA +#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 59) +#endif + + +#endif /* AVCODEC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/videotoolbox.h new file mode 100644 index 0000000..af2db0d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/videotoolbox.h @@ -0,0 +1,127 @@ +/* + * Videotoolbox hardware acceleration + * + * copyright (c) 2012 Sebastien Zwickert + * + * 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 + */ + +#ifndef AVCODEC_VIDEOTOOLBOX_H +#define AVCODEC_VIDEOTOOLBOX_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_videotoolbox + * Public libavcodec Videotoolbox header. + */ + +#include + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/avcodec.h" + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing Videotoolbox decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_videotoolbox_alloc_context() and freed with av_free(). + */ +typedef struct AVVideotoolboxContext { + /** + * Videotoolbox decompression session object. + * Created and freed the caller. + */ + VTDecompressionSessionRef session; + + /** + * The output callback that must be passed to the session. + * Set by av_videottoolbox_default_init() + */ + VTDecompressionOutputCallback output_callback; + + /** + * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames. + * set by the caller. If this is set to 0, then no specific format is + * requested from the decoder, and its native format is output. + */ + OSType cv_pix_fmt_type; + + /** + * CoreMedia Format Description that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + CMVideoFormatDescriptionRef cm_fmt_desc; + + /** + * CoreMedia codec type that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + int cm_codec_type; +} AVVideotoolboxContext; + +/** + * Allocate and initialize a Videotoolbox context. + * + * This function should be called from the get_format() callback when the caller + * selects the AV_PIX_FMT_VIDETOOLBOX format. The caller must then create + * the decoder object (using the output callback provided by libavcodec) that + * will be used for Videotoolbox-accelerated decoding. + * + * When decoding with Videotoolbox is finished, the caller must destroy the decoder + * object and free the Videotoolbox context using av_free(). + * + * @return the newly allocated context or NULL on failure + */ +AVVideotoolboxContext *av_videotoolbox_alloc_context(void); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init(AVCodecContext *avctx); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * @param vtctx the Videotoolbox context to use + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx); + +/** + * This function must be called to free the Videotoolbox context initialized with + * av_videotoolbox_default_init(). + * + * @param avctx the corresponding codec context + */ +void av_videotoolbox_default_free(AVCodecContext *avctx); + +/** + * @} + */ + +#endif /* AVCODEC_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vorbis_parser.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vorbis_parser.h new file mode 100644 index 0000000..789932a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/vorbis_parser.h @@ -0,0 +1,74 @@ +/* + * 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 + * A public API for Vorbis parsing + * + * Determines the duration for each packet. + */ + +#ifndef AVCODEC_VORBIS_PARSER_H +#define AVCODEC_VORBIS_PARSER_H + +#include + +typedef struct AVVorbisParseContext AVVorbisParseContext; + +/** + * Allocate and initialize the Vorbis parser using headers in the extradata. + */ +AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata, + int extradata_size); + +/** + * Free the parser and everything associated with it. + */ +void av_vorbis_parse_free(AVVorbisParseContext **s); + +#define VORBIS_FLAG_HEADER 0x00000001 +#define VORBIS_FLAG_COMMENT 0x00000002 +#define VORBIS_FLAG_SETUP 0x00000004 + +/** + * Get the duration for a Vorbis packet. + * + * If @p flags is @c NULL, + * special frames are considered invalid. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + * @param flags flags for special frames + */ +int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size, int *flags); + +/** + * Get the duration for a Vorbis packet. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + */ +int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size); + +void av_vorbis_parse_reset(AVVorbisParseContext *s); + +#endif /* AVCODEC_VORBIS_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/xvmc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/xvmc.h new file mode 100644 index 0000000..465ee78 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavcodec/xvmc.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2003 Ivan Kalvachev + * + * 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 + */ + +#ifndef AVCODEC_XVMC_H +#define AVCODEC_XVMC_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_xvmc + * Public libavcodec XvMC header. + */ + +#include + +#include "libavutil/attributes.h" +#include "version.h" +#include "avcodec.h" + +/** + * @defgroup lavc_codec_hwaccel_xvmc XvMC + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct + the number is 1337 speak for the letters IDCT MCo (motion compensation) */ + +struct attribute_deprecated xvmc_pix_fmt { + /** The field contains the special constant value AV_XVMC_ID. + It is used as a test that the application correctly uses the API, + and that there is no corruption caused by pixel routines. + - application - set during initialization + - libavcodec - unchanged + */ + int xvmc_id; + + /** Pointer to the block array allocated by XvMCCreateBlocks(). + The array has to be freed by XvMCDestroyBlocks(). + Each group of 64 values represents one data block of differential + pixel information (in MoCo mode) or coefficients for IDCT. + - application - set the pointer during initialization + - libavcodec - fills coefficients/pixel data into the array + */ + short* data_blocks; + + /** Pointer to the macroblock description array allocated by + XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). + - application - set the pointer during initialization + - libavcodec - fills description data into the array + */ + XvMCMacroBlock* mv_blocks; + + /** Number of macroblock descriptions that can be stored in the mv_blocks + array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_mv_blocks; + + /** Number of blocks that can be stored at once in the data_blocks array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_data_blocks; + + /** Indicate that the hardware would interpret data_blocks as IDCT + coefficients and perform IDCT on them. + - application - set during initialization + - libavcodec - unchanged + */ + int idct; + + /** In MoCo mode it indicates that intra macroblocks are assumed to be in + unsigned format; same as the XVMC_INTRA_UNSIGNED flag. + - application - set during initialization + - libavcodec - unchanged + */ + int unsigned_intra; + + /** Pointer to the surface allocated by XvMCCreateSurface(). + It has to be freed by XvMCDestroySurface() on application exit. + It identifies the frame and its state on the video hardware. + - application - set during initialization + - libavcodec - unchanged + */ + XvMCSurface* p_surface; + +/** Set by the decoder before calling ff_draw_horiz_band(), + needed by the XvMCRenderSurface function. */ +//@{ + /** Pointer to the surface used as past reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_past_surface; + + /** Pointer to the surface used as future reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_future_surface; + + /** top/bottom field or frame + - application - unchanged + - libavcodec - set + */ + unsigned int picture_structure; + + /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence + - application - unchanged + - libavcodec - set + */ + unsigned int flags; +//}@ + + /** Number of macroblock descriptions in the mv_blocks array + that have already been passed to the hardware. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may increment it + with filled_mb_block_num or zero both. + - libavcodec - unchanged + */ + int start_mv_blocks_num; + + /** Number of new macroblock descriptions in the mv_blocks array (after + start_mv_blocks_num) that are filled by libavcodec and have to be + passed to the hardware. + - application - zeroes it on get_buffer() or after successful + ff_draw_horiz_band(). + - libavcodec - increment with one of each stored MB + */ + int filled_mv_blocks_num; + + /** Number of the next free data block; one data block consists of + 64 short values in the data_blocks array. + All blocks before this one have already been claimed by placing their + position into the corresponding block description structure field, + that are part of the mv_blocks array. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may zero it together + with start_mb_blocks_num. + - libavcodec - each decoded macroblock increases it by the number + of coded blocks it contains. + */ + int next_free_data_block_num; +}; + +/** + * @} + */ + +#endif /* AVCODEC_XVMC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/avdevice.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/avdevice.h new file mode 100644 index 0000000..ee94624 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/avdevice.h @@ -0,0 +1,514 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_AVDEVICE_H +#define AVDEVICE_AVDEVICE_H + +#include "version.h" + +/** + * @file + * @ingroup lavd + * Main libavdevice API header + */ + +/** + * @defgroup lavd libavdevice + * Special devices muxing/demuxing library. + * + * Libavdevice is a complementary library to @ref libavf "libavformat". It + * provides various "special" platform-specific muxers and demuxers, e.g. for + * grabbing devices, audio capture and playback etc. As a consequence, the + * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own + * I/O functions). The filename passed to avformat_open_input() often does not + * refer to an actually existing file, but has some special device-specific + * meaning - e.g. for xcbgrab it is the display name. + * + * To use libavdevice, simply call avdevice_register_all() to register all + * compiled muxers and demuxers. They all use standard libavformat API. + * + * @{ + */ + +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/dict.h" +#include "libavformat/avformat.h" + +/** + * Return the LIBAVDEVICE_VERSION_INT constant. + */ +unsigned avdevice_version(void); + +/** + * Return the libavdevice build-time configuration. + */ +const char *avdevice_configuration(void); + +/** + * Return the libavdevice license. + */ +const char *avdevice_license(void); + +/** + * Initialize libavdevice and register all the input and output devices. + */ +void avdevice_register_all(void); + +/** + * Audio input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_audio_device_next(AVInputFormat *d); + +/** + * Video input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_video_device_next(AVInputFormat *d); + +/** + * Audio output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); + +/** + * Video output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); + +typedef struct AVDeviceRect { + int x; /**< x coordinate of top left corner */ + int y; /**< y coordinate of top left corner */ + int width; /**< width */ + int height; /**< height */ +} AVDeviceRect; + +/** + * Message types used by avdevice_app_to_dev_control_message(). + */ +enum AVAppToDevMessageType { + /** + * Dummy message. + */ + AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), + + /** + * Window size change message. + * + * Message is sent to the device every time the application changes the size + * of the window device renders to. + * Message should also be sent right after window is created. + * + * data: AVDeviceRect: new window size. + */ + AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), + + /** + * Repaint request message. + * + * Message is sent to the device when window has to be repainted. + * + * data: AVDeviceRect: area required to be repainted. + * NULL: whole area is required to be repainted. + */ + AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), + + /** + * Request pause/play. + * + * Application requests pause/unpause playback. + * Mostly usable with devices that have internal buffer. + * By default devices are not paused. + * + * data: NULL + */ + AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '), + AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'), + AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), + + /** + * Volume control message. + * + * Set volume level. It may be device-dependent if volume + * is changed per stream or system wide. Per stream volume + * change is expected when possible. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), + + /** + * Mute control messages. + * + * Change mute state. It may be device-dependent if mute status + * is changed per stream or system wide. Per stream mute status + * change is expected when possible. + * + * data: NULL. + */ + AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'), + AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'), + AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), + + /** + * Get volume/mute messages. + * + * Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or + * AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively. + * + * data: NULL. + */ + AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), + AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'), +}; + +/** + * Message types used by avdevice_dev_to_app_control_message(). + */ +enum AVDevToAppMessageType { + /** + * Dummy message. + */ + AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), + + /** + * Create window buffer message. + * + * Device requests to create a window buffer. Exact meaning is device- + * and application-dependent. Message is sent before rendering first + * frame and all one-shot initializations should be done here. + * Application is allowed to ignore preferred window buffer size. + * + * @note: Application is obligated to inform about window buffer size + * with AV_APP_TO_DEV_WINDOW_SIZE message. + * + * data: AVDeviceRect: preferred size of the window buffer. + * NULL: no preferred size of the window buffer. + */ + AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), + + /** + * Prepare window buffer message. + * + * Device requests to prepare a window buffer for rendering. + * Exact meaning is device- and application-dependent. + * Message is sent before rendering of each frame. + * + * data: NULL. + */ + AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'), + + /** + * Display window buffer message. + * + * Device requests to display a window buffer. + * Message is sent when new frame is ready to be displayed. + * Usually buffers need to be swapped in handler of this message. + * + * data: NULL. + */ + AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), + + /** + * Destroy window buffer message. + * + * Device requests to destroy a window buffer. + * Message is sent when device is about to be destroyed and window + * buffer is not required anymore. + * + * data: NULL. + */ + AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), + + /** + * Buffer fullness status messages. + * + * Device signals buffer overflow/underflow. + * + * data: NULL. + */ + AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), + AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), + + /** + * Buffer readable/writable. + * + * Device informs that buffer is readable/writable. + * When possible, device informs how many bytes can be read/write. + * + * @warning Device may not inform when number of bytes than can be read/write changes. + * + * data: int64_t: amount of bytes available to read/write. + * NULL: amount of bytes available to read/write is not known. + */ + AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), + AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), + + /** + * Mute state change message. + * + * Device informs that mute state has changed. + * + * data: int: 0 for not muted state, non-zero for muted state. + */ + AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), + + /** + * Volume level change message. + * + * Device informs that volume level has changed. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'), +}; + +/** + * Send control message from application to device. + * + * @param s device context. + * @param type message type. + * @param data message data. Exact type depends on message type. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when device doesn't implement handler of the message. + */ +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, + enum AVAppToDevMessageType type, + void *data, size_t data_size); + +/** + * Send control message from device to application. + * + * @param s device context. + * @param type message type. + * @param data message data. Can be NULL. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when application doesn't implement handler of the message. + */ +int avdevice_dev_to_app_control_message(struct AVFormatContext *s, + enum AVDevToAppMessageType type, + void *data, size_t data_size); + +/** + * Following API allows user to probe device capabilities (supported codecs, + * pixel formats, sample formats, resolutions, channel counts, etc). + * It is build on top op AVOption API. + * Queried capabilities make it possible to set up converters of video or audio + * parameters that fit to the device. + * + * List of capabilities that can be queried: + * - Capabilities valid for both audio and video devices: + * - codec: supported audio/video codecs. + * type: AV_OPT_TYPE_INT (AVCodecID value) + * - Capabilities valid for audio devices: + * - sample_format: supported sample formats. + * type: AV_OPT_TYPE_INT (AVSampleFormat value) + * - sample_rate: supported sample rates. + * type: AV_OPT_TYPE_INT + * - channels: supported number of channels. + * type: AV_OPT_TYPE_INT + * - channel_layout: supported channel layouts. + * type: AV_OPT_TYPE_INT64 + * - Capabilities valid for video devices: + * - pixel_format: supported pixel formats. + * type: AV_OPT_TYPE_INT (AVPixelFormat value) + * - window_size: supported window sizes (describes size of the window size presented to the user). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - frame_size: supported frame sizes (describes size of provided video frames). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - fps: supported fps values + * type: AV_OPT_TYPE_RATIONAL + * + * Value of the capability may be set by user using av_opt_set() function + * and AVDeviceCapabilitiesQuery object. Following queries will + * limit results to the values matching already set capabilities. + * For example, setting a codec may impact number of formats or fps values + * returned during next query. Setting invalid value may limit results to zero. + * + * Example of the usage basing on opengl output device: + * + * @code + * AVFormatContext *oc = NULL; + * AVDeviceCapabilitiesQuery *caps = NULL; + * AVOptionRanges *ranges; + * int ret; + * + * if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0) + * goto fail; + * if (avdevice_capabilities_create(&caps, oc, NULL) < 0) + * goto fail; + * + * //query codecs + * if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick codec here and set it + * av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0); + * + * //query format + * if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick format here and set it + * av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0); + * + * //query and set more capabilities + * + * fail: + * //clean up code + * avdevice_capabilities_free(&query, oc); + * avformat_free_context(oc); + * @endcode + */ + +/** + * Structure describes device capabilities. + * + * It is used by devices in conjunction with av_device_capabilities AVOption table + * to implement capabilities probing API based on AVOption API. Should not be used directly. + */ +typedef struct AVDeviceCapabilitiesQuery { + const AVClass *av_class; + AVFormatContext *device_context; + enum AVCodecID codec; + enum AVSampleFormat sample_format; + enum AVPixelFormat pixel_format; + int sample_rate; + int channels; + int64_t channel_layout; + int window_width; + int window_height; + int frame_width; + int frame_height; + AVRational fps; +} AVDeviceCapabilitiesQuery; + +/** + * AVOption table used by devices to implement device capabilities API. Should not be used by a user. + */ +extern const AVOption av_device_capabilities[]; + +/** + * Initialize capabilities probing API based on AVOption API. + * + * avdevice_capabilities_free() must be called when query capabilities API is + * not used anymore. + * + * @param[out] caps Device capabilities data. Pointer to a NULL pointer must be passed. + * @param s Context of the device. + * @param device_options An AVDictionary filled with device-private options. + * On return this parameter will be destroyed and replaced with a dict + * containing options that were not found. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * + * @return >= 0 on success, negative otherwise. + */ +int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, + AVDictionary **device_options); + +/** + * Free resources created by avdevice_capabilities_create() + * + * @param caps Device capabilities data to be freed. + * @param s Context of the device. + */ +void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); + +/** + * Structure describes basic parameters of the device. + */ +typedef struct AVDeviceInfo { + char *device_name; /**< device name, format depends on device */ + char *device_description; /**< human friendly name */ +} AVDeviceInfo; + +/** + * List of devices. + */ +typedef struct AVDeviceInfoList { + AVDeviceInfo **devices; /**< list of autodetected devices */ + int nb_devices; /**< number of autodetected devices */ + int default_device; /**< index of default device or -1 if no default */ +} AVDeviceInfoList; + +/** + * List devices. + * + * Returns available device names and their parameters. + * + * @note: Some devices may accept system-dependent device names that cannot be + * autodetected. The list returned by this function cannot be assumed to + * be always completed. + * + * @param s device context. + * @param[out] device_list list of autodetected devices. + * @return count of autodetected devices, negative on error. + */ +int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list); + +/** + * Convenient function to free result of avdevice_list_devices(). + * + * @param devices device list to be freed. + */ +void avdevice_free_list_devices(AVDeviceInfoList **device_list); + +/** + * List devices. + * + * Returns available device names and their parameters. + * These are convinient wrappers for avdevice_list_devices(). + * Device context is allocated and deallocated internally. + * + * @param device device format. May be NULL if device name is set. + * @param device_name device name. May be NULL if device format is set. + * @param device_options An AVDictionary filled with device-private options. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * @param[out] device_list list of autodetected devices + * @return count of autodetected devices, negative on error. + * @note device argument takes precedence over device_name when both are set. + */ +int avdevice_list_input_sources(struct AVInputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); +int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); + +/** + * @} + */ + +#endif /* AVDEVICE_AVDEVICE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/version.h new file mode 100644 index 0000000..9d90087 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavdevice/version.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_VERSION_H +#define AVDEVICE_VERSION_H + +/** + * @file + * @ingroup lavd + * Libavdevice version macros + */ + +#include "libavutil/version.h" + +#define LIBAVDEVICE_VERSION_MAJOR 57 +#define LIBAVDEVICE_VERSION_MINOR 10 +#define LIBAVDEVICE_VERSION_MICRO 100 + +#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT + +#define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* AVDEVICE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfilter.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfilter.h new file mode 100644 index 0000000..73a723d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfilter.h @@ -0,0 +1,1197 @@ +/* + * filter layer + * Copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTER_H +#define AVFILTER_AVFILTER_H + +/** + * @file + * @ingroup lavfi + * Main libavfilter public API header + */ + +/** + * @defgroup lavfi libavfilter + * Graph-based frame editing library. + * + * @{ + */ + +#include + +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/samplefmt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "libavfilter/version.h" + +/** + * Return the LIBAVFILTER_VERSION_INT constant. + */ +unsigned avfilter_version(void); + +/** + * Return the libavfilter build-time configuration. + */ +const char *avfilter_configuration(void); + +/** + * Return the libavfilter license. + */ +const char *avfilter_license(void); + +typedef struct AVFilterContext AVFilterContext; +typedef struct AVFilterLink AVFilterLink; +typedef struct AVFilterPad AVFilterPad; +typedef struct AVFilterFormats AVFilterFormats; + +/** + * Get the number of elements in a NULL-terminated array of AVFilterPads (e.g. + * AVFilter.inputs/outputs). + */ +int avfilter_pad_count(const AVFilterPad *pads); + +/** + * Get the name of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array it; is the caller's + * responsibility to ensure the index is valid + * + * @return name of the pad_idx'th pad in pads + */ +const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx); + +/** + * Get the type of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array; it is the caller's + * responsibility to ensure the index is valid + * + * @return type of the pad_idx'th pad in pads + */ +enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx); + +/** + * The number of the filter inputs is not determined just by AVFilter.inputs. + * The filter might add additional inputs during initialization depending on the + * options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_INPUTS (1 << 0) +/** + * The number of the filter outputs is not determined just by AVFilter.outputs. + * The filter might add additional outputs during initialization depending on + * the options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_OUTPUTS (1 << 1) +/** + * The filter supports multithreading by splitting frames into multiple parts + * and processing them concurrently. + */ +#define AVFILTER_FLAG_SLICE_THREADS (1 << 2) +/** + * Some filters support a generic "enable" expression option that can be used + * to enable or disable a filter in the timeline. Filters supporting this + * option have this flag set. When the enable expression is false, the default + * no-op filter_frame() function is called in place of the filter_frame() + * callback defined on each input pad, thus the frame is passed unchanged to + * the next filters. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC (1 << 16) +/** + * Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will + * have its filter_frame() callback(s) called as usual even when the enable + * expression is false. The filter will disable filtering within the + * filter_frame() callback(s) itself, for example executing code depending on + * the AVFilterContext->is_disabled value. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL (1 << 17) +/** + * Handy mask to test whether the filter supports or no the timeline feature + * (internally or generically). + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL) + +/** + * Filter definition. This defines the pads a filter contains, and all the + * callback functions used to interact with the filter. + */ +typedef struct AVFilter { + /** + * Filter name. Must be non-NULL and unique among filters. + */ + const char *name; + + /** + * A description of the filter. May be NULL. + * + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *description; + + /** + * List of inputs, terminated by a zeroed element. + * + * NULL if there are no (static) inputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in + * this list. + */ + const AVFilterPad *inputs; + /** + * List of outputs, terminated by a zeroed element. + * + * NULL if there are no (static) outputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in + * this list. + */ + const AVFilterPad *outputs; + + /** + * A class for the private data, used to declare filter private AVOptions. + * This field is NULL for filters that do not declare any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavfilter generic + * code to this class. + */ + const AVClass *priv_class; + + /** + * A combination of AVFILTER_FLAG_* + */ + int flags; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Filter pre-initialization function + * + * This callback will be called immediately after the filter context is + * allocated, to allow allocating and initing sub-objects. + * + * If this callback is not NULL, the uninit callback will be called on + * allocation failure. + * + * @return 0 on success, + * AVERROR code on failure (but the code will be + * dropped and treated as ENOMEM by the calling code) + */ + int (*preinit)(AVFilterContext *ctx); + + /** + * Filter initialization function. + * + * This callback will be called only once during the filter lifetime, after + * all the options have been set, but before links between filters are + * established and format negotiation is done. + * + * Basic filter initialization should be done here. Filters with dynamic + * inputs and/or outputs should create those inputs/outputs here based on + * provided options. No more changes to this filter's inputs/outputs can be + * done after this callback. + * + * This callback must not assume that the filter links exist or frame + * parameters are known. + * + * @ref AVFilter.uninit "uninit" is guaranteed to be called even if + * initialization fails, so this callback does not have to clean up on + * failure. + * + * @return 0 on success, a negative AVERROR on failure + */ + int (*init)(AVFilterContext *ctx); + + /** + * Should be set instead of @ref AVFilter.init "init" by the filters that + * want to pass a dictionary of AVOptions to nested contexts that are + * allocated during init. + * + * On return, the options dict should be freed and replaced with one that + * contains all the options which could not be processed by this filter (or + * with NULL if all the options were processed). + * + * Otherwise the semantics is the same as for @ref AVFilter.init "init". + */ + int (*init_dict)(AVFilterContext *ctx, AVDictionary **options); + + /** + * Filter uninitialization function. + * + * Called only once right before the filter is freed. Should deallocate any + * memory held by the filter, release any buffer references, etc. It does + * not need to deallocate the AVFilterContext.priv memory itself. + * + * This callback may be called even if @ref AVFilter.init "init" was not + * called or failed, so it must be prepared to handle such a situation. + */ + void (*uninit)(AVFilterContext *ctx); + + /** + * Query formats supported by the filter on its inputs and outputs. + * + * This callback is called after the filter is initialized (so the inputs + * and outputs are fixed), shortly before the format negotiation. This + * callback may be called more than once. + * + * This callback must set AVFilterLink.out_formats on every input link and + * AVFilterLink.in_formats on every output link to a list of pixel/sample + * formats that the filter supports on that link. For audio links, this + * filter must also set @ref AVFilterLink.in_samplerates "in_samplerates" / + * @ref AVFilterLink.out_samplerates "out_samplerates" and + * @ref AVFilterLink.in_channel_layouts "in_channel_layouts" / + * @ref AVFilterLink.out_channel_layouts "out_channel_layouts" analogously. + * + * This callback may be NULL for filters with one input, in which case + * libavfilter assumes that it supports all input formats and preserves + * them on output. + * + * @return zero on success, a negative value corresponding to an + * AVERROR code otherwise + */ + int (*query_formats)(AVFilterContext *); + + int priv_size; ///< size of private data to allocate for the filter + + int flags_internal; ///< Additional flags for avfilter internal use only. + + /** + * Used by the filter registration system. Must not be touched by any other + * code. + */ + struct AVFilter *next; + + /** + * Make the filter instance process a command. + * + * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. + * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be + * time consuming then a filter should treat it like an unsupported command + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ + int (*process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags); + + /** + * Filter initialization function, alternative to the init() + * callback. Args contains the user-supplied parameters, opaque is + * used for providing binary data. + */ + int (*init_opaque)(AVFilterContext *ctx, void *opaque); + + /** + * Filter activation function. + * + * Called when any processing is needed from the filter, instead of any + * filter_frame and request_frame on pads. + * + * The function must examine inlinks and outlinks and perform a single + * step of processing. If there is nothing to do, the function must do + * nothing and not return an error. If more steps are or may be + * possible, it must use ff_filter_set_ready() to schedule another + * activation. + */ + int (*activate)(AVFilterContext *ctx); +} AVFilter; + +/** + * Process multiple parts of the frame concurrently. + */ +#define AVFILTER_THREAD_SLICE (1 << 0) + +typedef struct AVFilterInternal AVFilterInternal; + +/** An instance of a filter */ +struct AVFilterContext { + const AVClass *av_class; ///< needed for av_log() and filters common options + + const AVFilter *filter; ///< the AVFilter of which this is an instance + + char *name; ///< name of this filter instance + + AVFilterPad *input_pads; ///< array of input pads + AVFilterLink **inputs; ///< array of pointers to input links + unsigned nb_inputs; ///< number of input pads + + AVFilterPad *output_pads; ///< array of output pads + AVFilterLink **outputs; ///< array of pointers to output links + unsigned nb_outputs; ///< number of output pads + + void *priv; ///< private data for use by the filter + + struct AVFilterGraph *graph; ///< filtergraph this filter belongs to + + /** + * Type of multithreading being allowed/used. A combination of + * AVFILTER_THREAD_* flags. + * + * May be set by the caller before initializing the filter to forbid some + * or all kinds of multithreading for this filter. The default is allowing + * everything. + * + * When the filter is initialized, this field is combined using bit AND with + * AVFilterGraph.thread_type to get the final mask used for determining + * allowed threading types. I.e. a threading type needs to be set in both + * to be allowed. + * + * After the filter is initialized, libavfilter sets this field to the + * threading type that is actually used (0 for no multithreading). + */ + int thread_type; + + /** + * An opaque struct for libavfilter internal use. + */ + AVFilterInternal *internal; + + struct AVFilterCommand *command_queue; + + char *enable_str; ///< enable expression string + void *enable; ///< parsed expression (AVExpr*) + double *var_values; ///< variable values for the enable expression + int is_disabled; ///< the enabled state from the last expression evaluation + + /** + * For filters which will create hardware frames, sets the device the + * filter should create them in. All other filters will ignore this field: + * in particular, a filter which consumes or processes hardware frames will + * instead use the hw_frames_ctx field in AVFilterLink to carry the + * hardware context information. + */ + AVBufferRef *hw_device_ctx; + + /** + * Max number of threads allowed in this filter instance. + * If <= 0, its value is ignored. + * Overrides global number of threads set per filter graph. + */ + int nb_threads; + + /** + * Ready status of the filter. + * A non-0 value means that the filter needs activating; + * a higher value suggests a more urgent activation. + */ + unsigned ready; +}; + +/** + * A link between two filters. This contains pointers to the source and + * destination filters between which this link exists, and the indexes of + * the pads involved. In addition, this link also contains the parameters + * which have been negotiated and agreed upon between the filter, such as + * image dimensions, format, etc. + * + * Applications must not normally access the link structure directly. + * Use the buffersrc and buffersink API instead. + * In the future, access to the header may be reserved for filters + * implementation. + */ +struct AVFilterLink { + AVFilterContext *src; ///< source filter + AVFilterPad *srcpad; ///< output pad on the source filter + + AVFilterContext *dst; ///< dest filter + AVFilterPad *dstpad; ///< input pad on the dest filter + + enum AVMediaType type; ///< filter media type + + /* These parameters apply only to video */ + int w; ///< agreed upon image width + int h; ///< agreed upon image height + AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio + /* These parameters apply only to audio */ + uint64_t channel_layout; ///< channel layout of current buffer (see libavutil/channel_layout.h) + int sample_rate; ///< samples per second + + int format; ///< agreed upon media format + + /** + * Define the time base used by the PTS of the frames/samples + * which will pass through this link. + * During the configuration stage, each filter is supposed to + * change only the output timebase, while the timebase of the + * input link is assumed to be an unchangeable property. + */ + AVRational time_base; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + /** + * Lists of formats and channel layouts supported by the input and output + * filters respectively. These lists are used for negotiating the format + * to actually be used, which will be loaded into the format and + * channel_layout members, above, when chosen. + * + */ + AVFilterFormats *in_formats; + AVFilterFormats *out_formats; + + /** + * Lists of channel layouts and sample rates used for automatic + * negotiation. + */ + AVFilterFormats *in_samplerates; + AVFilterFormats *out_samplerates; + struct AVFilterChannelLayouts *in_channel_layouts; + struct AVFilterChannelLayouts *out_channel_layouts; + + /** + * Audio only, the destination filter sets this to a non-zero value to + * request that buffers with the given number of samples should be sent to + * it. AVFilterPad.needs_fifo must also be set on the corresponding input + * pad. + * Last buffer before EOF will be padded with silence. + */ + int request_samples; + + /** stage of the initialization of the link properties (dimensions, etc) */ + enum { + AVLINK_UNINIT = 0, ///< not started + AVLINK_STARTINIT, ///< started, but incomplete + AVLINK_INIT ///< complete + } init_state; + + /** + * Graph the filter belongs to. + */ + struct AVFilterGraph *graph; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in link time_base units. + */ + int64_t current_pts; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in AV_TIME_BASE units. + */ + int64_t current_pts_us; + + /** + * Index in the age array. + */ + int age_index; + + /** + * Frame rate of the stream on the link, or 1/0 if unknown or variable; + * if left to 0/0, will be automatically copied from the first input + * of the source filter if it exists. + * + * Sources should set it to the best estimation of the real frame rate. + * If the source frame rate is unknown or variable, set this to 1/0. + * Filters should update it if necessary depending on their function. + * Sinks can use it to set a default output frame rate. + * It is similar to the r_frame_rate field in AVStream. + */ + AVRational frame_rate; + + /** + * Buffer partially filled with samples to achieve a fixed/minimum size. + */ + AVFrame *partial_buf; + + /** + * Size of the partial buffer to allocate. + * Must be between min_samples and max_samples. + */ + int partial_buf_size; + + /** + * Minimum number of samples to filter at once. If filter_frame() is + * called with fewer samples, it will accumulate them in partial_buf. + * This field and the related ones must not be changed after filtering + * has started. + * If 0, all related fields are ignored. + */ + int min_samples; + + /** + * Maximum number of samples to filter at once. If filter_frame() is + * called with more samples, it will split them. + */ + int max_samples; + + /** + * Number of channels. + */ + int channels; + + /** + * Link processing flags. + */ + unsigned flags; + + /** + * Number of past frames sent through the link. + */ + int64_t frame_count_in, frame_count_out; + + /** + * A pointer to a FFFramePool struct. + */ + void *frame_pool; + + /** + * True if a frame is currently wanted on the output of this filter. + * Set when ff_request_frame() is called by the output, + * cleared when a frame is filtered. + */ + int frame_wanted_out; + + /** + * For hwaccel pixel formats, this should be a reference to the + * AVHWFramesContext describing the frames. + */ + AVBufferRef *hw_frames_ctx; + +#ifndef FF_INTERNAL_FIELDS + + /** + * Internal structure members. + * The fields below this limit are internal for libavfilter's use + * and must in no way be accessed by applications. + */ + char reserved[0xF000]; + +#else /* FF_INTERNAL_FIELDS */ + + /** + * Queue of frames waiting to be filtered. + */ + FFFrameQueue fifo; + + /** + * If set, the source filter can not generate a frame as is. + * The goal is to avoid repeatedly calling the request_frame() method on + * the same link. + */ + int frame_blocked_in; + + /** + * Link input status. + * If not zero, all attempts of filter_frame will fail with the + * corresponding code. + */ + int status_in; + + /** + * Timestamp of the input status change. + */ + int64_t status_in_pts; + + /** + * Link output status. + * If not zero, all attempts of request_frame will fail with the + * corresponding code. + */ + int status_out; + +#endif /* FF_INTERNAL_FIELDS */ + +}; + +/** + * Link two filters together. + * + * @param src the source filter + * @param srcpad index of the output pad on the source filter + * @param dst the destination filter + * @param dstpad index of the input pad on the destination filter + * @return zero on success + */ +int avfilter_link(AVFilterContext *src, unsigned srcpad, + AVFilterContext *dst, unsigned dstpad); + +/** + * Free the link in *link, and set its pointer to NULL. + */ +void avfilter_link_free(AVFilterLink **link); + +/** + * Get the number of channels of a link. + */ +int avfilter_link_get_channels(AVFilterLink *link); + +/** + * Set the closed field of a link. + * @deprecated applications are not supposed to mess with links, they should + * close the sinks. + */ +attribute_deprecated +void avfilter_link_set_closed(AVFilterLink *link, int closed); + +/** + * Negotiate the media format, dimensions, etc of all inputs to a filter. + * + * @param filter the filter to negotiate the properties for its inputs + * @return zero on successful negotiation + */ +int avfilter_config_links(AVFilterContext *filter); + +#define AVFILTER_CMD_FLAG_ONE 1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically +#define AVFILTER_CMD_FLAG_FAST 2 ///< Only execute command when its fast (like a video out that supports contrast adjustment in hw) + +/** + * Make the filter instance process a command. + * It is recommended to use avfilter_graph_send_command(). + */ +int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** Initialize the filter system. Register all builtin filters. */ +void avfilter_register_all(void); + +#if FF_API_OLD_FILTER_REGISTER +/** Uninitialize the filter system. Unregister all filters. */ +attribute_deprecated +void avfilter_uninit(void); +#endif + +/** + * Register a filter. This is only needed if you plan to use + * avfilter_get_by_name later to lookup the AVFilter structure by name. A + * filter can still by instantiated with avfilter_graph_alloc_filter even if it + * is not registered. + * + * @param filter the filter to register + * @return 0 if the registration was successful, a negative value + * otherwise + */ +int avfilter_register(AVFilter *filter); + +/** + * Get a filter definition matching the given name. + * + * @param name the filter name to find + * @return the filter definition, if any matching one is registered. + * NULL if none found. + */ +#if !FF_API_NOCONST_GET_NAME +const +#endif +AVFilter *avfilter_get_by_name(const char *name); + +/** + * Iterate over all registered filters. + * @return If prev is non-NULL, next registered filter after prev or NULL if + * prev is the last filter. If prev is NULL, return the first registered filter. + */ +const AVFilter *avfilter_next(const AVFilter *prev); + +#if FF_API_OLD_FILTER_REGISTER +/** + * If filter is NULL, returns a pointer to the first registered filter pointer, + * if filter is non-NULL, returns the next pointer after filter. + * If the returned pointer points to NULL, the last registered filter + * was already reached. + * @deprecated use avfilter_next() + */ +attribute_deprecated +AVFilter **av_filter_next(AVFilter **filter); +#endif + +#if FF_API_AVFILTER_OPEN +/** + * Create a filter instance. + * + * @param filter_ctx put here a pointer to the created filter context + * on success, NULL on failure + * @param filter the filter to create an instance of + * @param inst_name Name to give to the new instance. Can be NULL for none. + * @return >= 0 in case of success, a negative error code otherwise + * @deprecated use avfilter_graph_alloc_filter() instead + */ +attribute_deprecated +int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); +#endif + + +#if FF_API_AVFILTER_INIT_FILTER +/** + * Initialize a filter. + * + * @param filter the filter to initialize + * @param args A string of parameters to use when initializing the filter. + * The format and meaning of this string varies by filter. + * @param opaque Any extra non-string data needed by the filter. The meaning + * of this parameter varies by filter. + * @return zero on success + */ +attribute_deprecated +int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); +#endif + +/** + * Initialize a filter with the supplied parameters. + * + * @param ctx uninitialized filter context to initialize + * @param args Options to initialize the filter with. This must be a + * ':'-separated list of options in the 'key=value' form. + * May be NULL if the options have been set directly using the + * AVOptions API or there are no options that need to be set. + * @return 0 on success, a negative AVERROR on failure + */ +int avfilter_init_str(AVFilterContext *ctx, const char *args); + +/** + * Initialize a filter with the supplied dictionary of options. + * + * @param ctx uninitialized filter context to initialize + * @param options An AVDictionary filled with options for this filter. On + * return this parameter will be destroyed and replaced with + * a dict containing options that were not found. This dictionary + * must be freed by the caller. + * May be NULL, then this function is equivalent to + * avfilter_init_str() with the second parameter set to NULL. + * @return 0 on success, a negative AVERROR on failure + * + * @note This function and avfilter_init_str() do essentially the same thing, + * the difference is in manner in which the options are passed. It is up to the + * calling code to choose whichever is more preferable. The two functions also + * behave differently when some of the provided options are not declared as + * supported by the filter. In such a case, avfilter_init_str() will fail, but + * this function will leave those extra options in the options AVDictionary and + * continue as usual. + */ +int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options); + +/** + * Free a filter context. This will also remove the filter from its + * filtergraph's list of filters. + * + * @param filter the filter to free + */ +void avfilter_free(AVFilterContext *filter); + +/** + * Insert a filter in the middle of an existing link. + * + * @param link the link into which the filter should be inserted + * @param filt the filter to be inserted + * @param filt_srcpad_idx the input pad on the filter to connect + * @param filt_dstpad_idx the output pad on the filter to connect + * @return zero on success + */ +int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, + unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); + +/** + * @return AVClass for AVFilterContext. + * + * @see av_opt_find(). + */ +const AVClass *avfilter_get_class(void); + +typedef struct AVFilterGraphInternal AVFilterGraphInternal; + +/** + * A function pointer passed to the @ref AVFilterGraph.execute callback to be + * executed multiple times, possibly in parallel. + * + * @param ctx the filter context the job belongs to + * @param arg an opaque parameter passed through from @ref + * AVFilterGraph.execute + * @param jobnr the index of the job being executed + * @param nb_jobs the total number of jobs + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_action_func)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); + +/** + * A function executing multiple jobs, possibly in parallel. + * + * @param ctx the filter context to which the jobs belong + * @param func the function to be called multiple times + * @param arg the argument to be passed to func + * @param ret a nb_jobs-sized array to be filled with return values from each + * invocation of func + * @param nb_jobs the number of jobs to execute + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_execute_func)(AVFilterContext *ctx, avfilter_action_func *func, + void *arg, int *ret, int nb_jobs); + +typedef struct AVFilterGraph { + const AVClass *av_class; + AVFilterContext **filters; + unsigned nb_filters; + + char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters +#if FF_API_LAVR_OPTS + attribute_deprecated char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters +#endif + + /** + * Type of multithreading allowed for filters in this graph. A combination + * of AVFILTER_THREAD_* flags. + * + * May be set by the caller at any point, the setting will apply to all + * filters initialized after that. The default is allowing everything. + * + * When a filter in this graph is initialized, this field is combined using + * bit AND with AVFilterContext.thread_type to get the final mask used for + * determining allowed threading types. I.e. a threading type needs to be + * set in both to be allowed. + */ + int thread_type; + + /** + * Maximum number of threads used by filters in this graph. May be set by + * the caller before adding any filters to the filtergraph. Zero (the + * default) means that the number of threads is determined automatically. + */ + int nb_threads; + + /** + * Opaque object for libavfilter internal use. + */ + AVFilterGraphInternal *internal; + + /** + * Opaque user data. May be set by the caller to an arbitrary value, e.g. to + * be used from callbacks like @ref AVFilterGraph.execute. + * Libavfilter will not touch this field in any way. + */ + void *opaque; + + /** + * This callback may be set by the caller immediately after allocating the + * graph and before adding any filters to it, to provide a custom + * multithreading implementation. + * + * If set, filters with slice threading capability will call this callback + * to execute multiple jobs in parallel. + * + * If this field is left unset, libavfilter will use its internal + * implementation, which may or may not be multithreaded depending on the + * platform and build options. + */ + avfilter_execute_func *execute; + + char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions + + /** + * Private fields + * + * The following fields are for internal use only. + * Their type, offset, number and semantic can change without notice. + */ + + AVFilterLink **sink_links; + int sink_links_count; + + unsigned disable_auto_convert; +} AVFilterGraph; + +/** + * Allocate a filter graph. + * + * @return the allocated filter graph on success or NULL. + */ +AVFilterGraph *avfilter_graph_alloc(void); + +/** + * Create a new filter instance in a filter graph. + * + * @param graph graph in which the new filter will be used + * @param filter the filter to create an instance of + * @param name Name to give to the new instance (will be copied to + * AVFilterContext.name). This may be used by the caller to identify + * different filters, libavfilter itself assigns no semantics to + * this parameter. May be NULL. + * + * @return the context of the newly created filter instance (note that it is + * also retrievable directly through AVFilterGraph.filters or with + * avfilter_graph_get_filter()) on success or NULL on failure. + */ +AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, + const AVFilter *filter, + const char *name); + +/** + * Get a filter instance identified by instance name from graph. + * + * @param graph filter graph to search through. + * @param name filter instance name (should be unique in the graph). + * @return the pointer to the found filter instance or NULL if it + * cannot be found. + */ +AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); + +#if FF_API_AVFILTER_OPEN +/** + * Add an existing filter instance to a filter graph. + * + * @param graphctx the filter graph + * @param filter the filter to be added + * + * @deprecated use avfilter_graph_alloc_filter() to allocate a filter in a + * filter graph + */ +attribute_deprecated +int avfilter_graph_add_filter(AVFilterGraph *graphctx, AVFilterContext *filter); +#endif + +/** + * Create and add a filter instance into an existing graph. + * The filter instance is created from the filter filt and inited + * with the parameters args and opaque. + * + * In case of success put in *filt_ctx the pointer to the created + * filter instance, otherwise set *filt_ctx to NULL. + * + * @param name the instance name to give to the created filter instance + * @param graph_ctx the filter graph + * @return a negative AVERROR error code in case of failure, a non + * negative value otherwise + */ +int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, + const char *name, const char *args, void *opaque, + AVFilterGraph *graph_ctx); + +/** + * Enable or disable automatic format conversion inside the graph. + * + * Note that format conversion can still happen inside explicitly inserted + * scale and aresample filters. + * + * @param flags any of the AVFILTER_AUTO_CONVERT_* constants + */ +void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags); + +enum { + AVFILTER_AUTO_CONVERT_ALL = 0, /**< all automatic conversions enabled */ + AVFILTER_AUTO_CONVERT_NONE = -1, /**< all automatic conversions disabled */ +}; + +/** + * Check validity and configure all the links and formats in the graph. + * + * @param graphctx the filter graph + * @param log_ctx context used for logging + * @return >= 0 in case of success, a negative AVERROR code otherwise + */ +int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx); + +/** + * Free a graph, destroy its links, and set *graph to NULL. + * If *graph is NULL, do nothing. + */ +void avfilter_graph_free(AVFilterGraph **graph); + +/** + * A linked-list of the inputs/outputs of the filter chain. + * + * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(), + * where it is used to communicate open (unlinked) inputs and outputs from and + * to the caller. + * This struct specifies, per each not connected pad contained in the graph, the + * filter context and the pad index required for establishing a link. + */ +typedef struct AVFilterInOut { + /** unique name for this input/output in the list */ + char *name; + + /** filter context associated to this input/output */ + AVFilterContext *filter_ctx; + + /** index of the filt_ctx pad to use for linking */ + int pad_idx; + + /** next input/input in the list, NULL if this is the last */ + struct AVFilterInOut *next; +} AVFilterInOut; + +/** + * Allocate a single AVFilterInOut entry. + * Must be freed with avfilter_inout_free(). + * @return allocated AVFilterInOut on success, NULL on failure. + */ +AVFilterInOut *avfilter_inout_alloc(void); + +/** + * Free the supplied list of AVFilterInOut and set *inout to NULL. + * If *inout is NULL, do nothing. + */ +void avfilter_inout_free(AVFilterInOut **inout); + +/** + * Add a graph described by a string to a graph. + * + * @note The caller must provide the lists of inputs and outputs, + * which therefore must be known before calling the function. + * + * @note The inputs parameter describes inputs of the already existing + * part of the graph; i.e. from the point of view of the newly created + * part, they are outputs. Similarly the outputs parameter describes + * outputs of the already existing filters, which are provided as + * inputs to the parsed filters. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs linked list to the inputs of the graph + * @param outputs linked list to the outputs of the graph + * @return zero on success, a negative AVERROR code on error + */ +int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, + AVFilterInOut *inputs, AVFilterInOut *outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * In the graph filters description, if the input label of the first + * filter is not specified, "in" is assumed; if the output label of + * the last filter is not specified, "out" is assumed. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. + * If non-NULL, *inputs is updated to contain the list of open inputs + * after the parsing, should be freed with avfilter_inout_free(). + * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. + * If non-NULL, *outputs is updated to contain the list of open outputs + * after the parsing, should be freed with avfilter_inout_free(). + * @return non negative on success, a negative AVERROR code on error + */ +int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, AVFilterInOut **outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * @param[in] graph the filter graph where to link the parsed graph context + * @param[in] filters string to be parsed + * @param[out] inputs a linked list of all free (unlinked) inputs of the + * parsed graph will be returned here. It is to be freed + * by the caller using avfilter_inout_free(). + * @param[out] outputs a linked list of all free (unlinked) outputs of the + * parsed graph will be returned here. It is to be freed by the + * caller using avfilter_inout_free(). + * @return zero on success, a negative AVERROR code on error + * + * @note This function returns the inputs and outputs that are left + * unlinked after parsing the graph and the caller then deals with + * them. + * @note This function makes no reference whatsoever to already + * existing parts of the graph and the inputs parameter will on return + * contain inputs of the newly parsed part of the graph. Analogously + * the outputs parameter will contain outputs of the newly created + * filters. + */ +int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, + AVFilterInOut **outputs); + +/** + * Send a command to one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to send, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ +int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Queue a command for one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to sent, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param ts time at which the command should be sent to the filter + * + * @note As this executes commands after this function returns, no return code + * from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported. + */ +int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts); + + +/** + * Dump a graph into a human-readable string representation. + * + * @param graph the graph to dump + * @param options formatting options; currently ignored + * @return a string, or NULL in case of memory allocation failure; + * the string must be freed using av_free + */ +char *avfilter_graph_dump(AVFilterGraph *graph, const char *options); + +/** + * Request a frame on the oldest sink link. + * + * If the request returns AVERROR_EOF, try the next. + * + * Note that this function is not meant to be the sole scheduling mechanism + * of a filtergraph, only a convenience function to help drain a filtergraph + * in a balanced way under normal circumstances. + * + * Also note that AVERROR_EOF does not mean that frames did not arrive on + * some of the sinks during the process. + * When there are multiple sink links, in case the requested link + * returns an EOF, this may cause a filter to flush pending frames + * which are sent to another sink link, although unrequested. + * + * @return the return value of ff_request_frame(), + * or AVERROR_EOF if all links returned AVERROR_EOF + */ +int avfilter_graph_request_oldest(AVFilterGraph *graph); + +/** + * @} + */ + +#endif /* AVFILTER_AVFILTER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfiltergraph.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfiltergraph.h new file mode 100644 index 0000000..b31d581 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/avfiltergraph.h @@ -0,0 +1,28 @@ +/* + * Filter graphs + * copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTERGRAPH_H +#define AVFILTER_AVFILTERGRAPH_H + +#include "avfilter.h" +#include "libavutil/log.h" + +#endif /* AVFILTER_AVFILTERGRAPH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersink.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersink.h new file mode 100644 index 0000000..21d6bb5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersink.h @@ -0,0 +1,165 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSINK_H +#define AVFILTER_BUFFERSINK_H + +/** + * @file + * @ingroup lavfi_buffersink + * memory buffer sink API for audio and video + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersink Buffer sink API + * @ingroup lavfi + * @{ + */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a buffersink or abuffersink filter context. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * @param flags a combination of AV_BUFFERSINK_FLAG_* flags + * + * @return >= 0 in for success, a negative AVERROR code for failure. + */ +int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); + +/** + * Tell av_buffersink_get_buffer_ref() to read video/samples buffer + * reference, but not remove it from the buffer. This is useful if you + * need only to read a video/samples buffer, without to fetch it. + */ +#define AV_BUFFERSINK_FLAG_PEEK 1 + +/** + * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. + * If a frame is already buffered, it is read (and removed from the buffer), + * but if no frame is present, return AVERROR(EAGAIN). + */ +#define AV_BUFFERSINK_FLAG_NO_REQUEST 2 + +/** + * Struct to use for initializing a buffersink context. + */ +typedef struct AVBufferSinkParams { + const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE +} AVBufferSinkParams; + +/** + * Create an AVBufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVBufferSinkParams *av_buffersink_params_alloc(void); + +/** + * Struct to use for initializing an abuffersink context. + */ +typedef struct AVABufferSinkParams { + const enum AVSampleFormat *sample_fmts; ///< list of allowed sample formats, terminated by AV_SAMPLE_FMT_NONE + const int64_t *channel_layouts; ///< list of allowed channel layouts, terminated by -1 + const int *channel_counts; ///< list of allowed channel counts, terminated by -1 + int all_channel_counts; ///< if not 0, accept any channel count or layout + int *sample_rates; ///< list of allowed sample rates, terminated by -1 +} AVABufferSinkParams; + +/** + * Create an AVABufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVABufferSinkParams *av_abuffersink_params_alloc(void); + +/** + * Set the frame size for an audio buffer sink. + * + * All calls to av_buffersink_get_buffer_ref will return a buffer with + * exactly the specified number of samples, or AVERROR(EAGAIN) if there is + * not enough. The last buffer at EOF will be padded with 0. + */ +void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); + +/** + * @defgroup lavfi_buffersink_accessors Buffer sink accessors + * Get the properties of the stream + * @{ + */ + +enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); +AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); +int av_buffersink_get_format (const AVFilterContext *ctx); + +AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); +int av_buffersink_get_w (const AVFilterContext *ctx); +int av_buffersink_get_h (const AVFilterContext *ctx); +AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); + +int av_buffersink_get_channels (const AVFilterContext *ctx); +uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); +int av_buffersink_get_sample_rate (const AVFilterContext *ctx); + +AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx); + +/** @} */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * + * @return + * - >= 0 if a frame was successfully returned. + * - AVERROR(EAGAIN) if no frames are available at this point; more + * input frames must be added to the filtergraph to get more output. + * - AVERROR_EOF if there will be no more output frames on this sink. + * - A different negative AVERROR code in other failure cases. + */ +int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Same as av_buffersink_get_frame(), but with the ability to specify the number + * of samples read. This function is less efficient than + * av_buffersink_get_frame(), because it copies the data around. + * + * @param ctx pointer to a context of the abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * frame will contain exactly nb_samples audio samples, except at + * the end of stream, when it can contain less than nb_samples. + * + * @return The return codes have the same meaning as for + * av_buffersink_get_samples(). + * + * @warning do not mix this function with av_buffersink_get_frame(). Use only one or + * the other with a single sink, not both. + */ +int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSINK_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersrc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersrc.h new file mode 100644 index 0000000..0652113 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/buffersrc.h @@ -0,0 +1,209 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSRC_H +#define AVFILTER_BUFFERSRC_H + +/** + * @file + * @ingroup lavfi_buffersrc + * Memory buffer source API. + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersrc Buffer source API + * @ingroup lavfi + * @{ + */ + +enum { + + /** + * Do not check for format changes. + */ + AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, + + /** + * Immediately push the frame to the output. + */ + AV_BUFFERSRC_FLAG_PUSH = 4, + + /** + * Keep a reference to the frame. + * If the frame if reference-counted, create a new reference; otherwise + * copy the frame data. + */ + AV_BUFFERSRC_FLAG_KEEP_REF = 8, + +}; + +/** + * Get the number of failed requests. + * + * A failed request is when the request_frame method is called while no + * frame is present in the buffer. + * The number is reset when a frame is added. + */ +unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); + +/** + * This structure contains the parameters describing the frames that will be + * passed to this filter. + * + * It should be allocated with av_buffersrc_parameters_alloc() and freed with + * av_free(). All the allocated fields in it remain owned by the caller. + */ +typedef struct AVBufferSrcParameters { + /** + * video: the pixel format, value corresponds to enum AVPixelFormat + * audio: the sample format, value corresponds to enum AVSampleFormat + */ + int format; + /** + * The timebase to be used for the timestamps on the input frames. + */ + AVRational time_base; + + /** + * Video only, the display dimensions of the input frames. + */ + int width, height; + + /** + * Video only, the sample (pixel) aspect ratio. + */ + AVRational sample_aspect_ratio; + + /** + * Video only, the frame rate of the input video. This field must only be + * set to a non-zero value if input stream has a known constant framerate + * and should be left at its initial value if the framerate is variable or + * unknown. + */ + AVRational frame_rate; + + /** + * Video with a hwaccel pixel format only. This should be a reference to an + * AVHWFramesContext instance describing the input frames. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only, the audio sampling rate in samples per secon. + */ + int sample_rate; + + /** + * Audio only, the audio channel layout + */ + uint64_t channel_layout; +} AVBufferSrcParameters; + +/** + * Allocate a new AVBufferSrcParameters instance. It should be freed by the + * caller with av_free(). + */ +AVBufferSrcParameters *av_buffersrc_parameters_alloc(void); + +/** + * Initialize the buffersrc or abuffersrc filter with the provided parameters. + * This function may be called multiple times, the later calls override the + * previous ones. Some of the parameters may also be set through AVOptions, then + * whatever method is used last takes precedence. + * + * @param ctx an instance of the buffersrc or abuffersrc filter + * @param param the stream parameters. The frames later passed to this filter + * must conform to those parameters. All the allocated fields in + * param remain owned by the caller, libavfilter will make internal + * copies or references when necessary. + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will make a new reference to it. Otherwise the frame data will be + * copied. + * + * @return 0 on success, a negative AVERROR on error + * + * This function is equivalent to av_buffersrc_add_frame_flags() with the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will take ownership of the reference(s) and reset the frame. + * Otherwise the frame data will be copied. If this function returns an error, + * the input frame is not touched. + * + * @return 0 on success, a negative AVERROR on error. + * + * @note the difference between this function and av_buffersrc_write_frame() is + * that av_buffersrc_write_frame() creates a new reference to the input frame, + * while this function takes ownership of the reference passed to it. + * + * This function is equivalent to av_buffersrc_add_frame_flags() without the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * By default, if the frame is reference-counted, this function will take + * ownership of the reference(s) and reset the frame. This can be controlled + * using the flags. + * + * If this function returns an error, the input frame is not touched. + * + * @param buffer_src pointer to a buffer source context + * @param frame a frame, or NULL to mark EOF + * @param flags a combination of AV_BUFFERSRC_FLAG_* + * @return >= 0 in case of success, a negative AVERROR code + * in case of failure + */ +av_warn_unused_result +int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, + AVFrame *frame, int flags); + +/** + * Close the buffer source after EOF. + * + * This is similar to passing NULL to av_buffersrc_add_frame_flags() + * except it takes the timestamp of the EOF, i.e. the timestamp of the end + * of the last frame. + */ +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/version.h new file mode 100644 index 0000000..3e67ad3 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavfilter/version.h @@ -0,0 +1,74 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFILTER_VERSION_H +#define AVFILTER_VERSION_H + +/** + * @file + * @ingroup lavfi + * Libavfilter version macros + */ + +#include "libavutil/version.h" + +#define LIBAVFILTER_VERSION_MAJOR 6 +#define LIBAVFILTER_VERSION_MINOR 107 +#define LIBAVFILTER_VERSION_MICRO 100 + +#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT + +#define LIBAVFILTER_IDENT "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_OLD_FILTER_OPTS +#define FF_API_OLD_FILTER_OPTS (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_OLD_FILTER_OPTS_ERROR +#define FF_API_OLD_FILTER_OPTS_ERROR (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_AVFILTER_OPEN +#define FF_API_AVFILTER_OPEN (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_AVFILTER_INIT_FILTER +#define FF_API_AVFILTER_INIT_FILTER (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_OLD_FILTER_REGISTER +#define FF_API_OLD_FILTER_REGISTER (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_NOCONST_GET_NAME +#define FF_API_NOCONST_GET_NAME (LIBAVFILTER_VERSION_MAJOR < 7) +#endif +#ifndef FF_API_LAVR_OPTS +#define FF_API_LAVR_OPTS (LIBAVFILTER_VERSION_MAJOR < 7) +#endif + +#endif /* AVFILTER_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avformat.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avformat.h new file mode 100644 index 0000000..b0de66a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avformat.h @@ -0,0 +1,3008 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVFORMAT_AVFORMAT_H +#define AVFORMAT_AVFORMAT_H + +/** + * @file + * @ingroup libavf + * Main libavformat public API header + */ + +/** + * @defgroup libavf libavformat + * I/O and Muxing/Demuxing Library + * + * Libavformat (lavf) is a library for dealing with various media container + * formats. Its main two purposes are demuxing - i.e. splitting a media file + * into component streams, and the reverse process of muxing - writing supplied + * data in a specified container format. It also has an @ref lavf_io + * "I/O module" which supports a number of protocols for accessing the data (e.g. + * file, tcp, http and others). Before using lavf, you need to call + * av_register_all() to register all compiled muxers, demuxers and protocols. + * Unless you are absolutely sure you won't use libavformat's network + * capabilities, you should also call avformat_network_init(). + * + * A supported input format is described by an AVInputFormat struct, conversely + * an output format is described by AVOutputFormat. You can iterate over all + * registered input/output formats using the av_iformat_next() / + * av_oformat_next() functions. The protocols layer is not part of the public + * API, so you can only get the names of supported protocols with the + * avio_enum_protocols() function. + * + * Main lavf structure used for both muxing and demuxing is AVFormatContext, + * which exports all information about the file being read or written. As with + * most Libavformat structures, its size is not part of public ABI, so it cannot be + * allocated on stack or directly with av_malloc(). To create an + * AVFormatContext, use avformat_alloc_context() (some functions, like + * avformat_open_input() might do that for you). + * + * Most importantly an AVFormatContext contains: + * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat + * "output" format. It is either autodetected or set by user for input; + * always set by user for output. + * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all + * elementary streams stored in the file. AVStreams are typically referred to + * using their index in this array. + * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or + * set by user for input, always set by user for output (unless you are dealing + * with an AVFMT_NOFILE format). + * + * @section lavf_options Passing options to (de)muxers + * It is possible to configure lavf muxers and demuxers using the @ref avoptions + * mechanism. Generic (format-independent) libavformat options are provided by + * AVFormatContext, they can be examined from a user program by calling + * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass + * from avformat_get_class()). Private (format-specific) options are provided by + * AVFormatContext.priv_data if and only if AVInputFormat.priv_class / + * AVOutputFormat.priv_class of the corresponding format struct is non-NULL. + * Further options may be provided by the @ref AVFormatContext.pb "I/O context", + * if its AVClass is non-NULL, and the protocols layer. See the discussion on + * nesting in @ref avoptions documentation to learn how to access those. + * + * @section urls + * URL strings in libavformat are made of a scheme/protocol, a ':', and a + * scheme specific string. URLs without a scheme and ':' used for local files + * are supported but deprecated. "file:" should be used for local files. + * + * It is important that the scheme string is not taken from untrusted + * sources without checks. + * + * Note that some schemes/protocols are quite powerful, allowing access to + * both local and remote files, parts of them, concatenations of them, local + * audio and video devices and so on. + * + * @{ + * + * @defgroup lavf_decoding Demuxing + * @{ + * Demuxers read a media file and split it into chunks of data (@em packets). A + * @ref AVPacket "packet" contains one or more encoded frames which belongs to a + * single elementary stream. In the lavf API this process is represented by the + * avformat_open_input() function for opening a file, av_read_frame() for + * reading a single packet and finally avformat_close_input(), which does the + * cleanup. + * + * @section lavf_decoding_open Opening a media file + * The minimum information required to open a file is its URL, which + * is passed to avformat_open_input(), as in the following code: + * @code + * const char *url = "file:in.mp3"; + * AVFormatContext *s = NULL; + * int ret = avformat_open_input(&s, url, NULL, NULL); + * if (ret < 0) + * abort(); + * @endcode + * The above code attempts to allocate an AVFormatContext, open the + * specified file (autodetecting the format) and read the header, exporting the + * information stored there into s. Some formats do not have a header or do not + * store enough information there, so it is recommended that you call the + * avformat_find_stream_info() function which tries to read and decode a few + * frames to find missing information. + * + * In some cases you might want to preallocate an AVFormatContext yourself with + * avformat_alloc_context() and do some tweaking on it before passing it to + * avformat_open_input(). One such case is when you want to use custom functions + * for reading input data instead of lavf internal I/O layer. + * To do that, create your own AVIOContext with avio_alloc_context(), passing + * your reading callbacks to it. Then set the @em pb field of your + * AVFormatContext to newly created AVIOContext. + * + * Since the format of the opened file is in general not known until after + * avformat_open_input() has returned, it is not possible to set demuxer private + * options on a preallocated context. Instead, the options should be passed to + * avformat_open_input() wrapped in an AVDictionary: + * @code + * AVDictionary *options = NULL; + * av_dict_set(&options, "video_size", "640x480", 0); + * av_dict_set(&options, "pixel_format", "rgb24", 0); + * + * if (avformat_open_input(&s, url, NULL, &options) < 0) + * abort(); + * av_dict_free(&options); + * @endcode + * This code passes the private options 'video_size' and 'pixel_format' to the + * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it + * cannot know how to interpret raw video data otherwise. If the format turns + * out to be something different than raw video, those options will not be + * recognized by the demuxer and therefore will not be applied. Such unrecognized + * options are then returned in the options dictionary (recognized options are + * consumed). The calling program can handle such unrecognized options as it + * wishes, e.g. + * @code + * AVDictionaryEntry *e; + * if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { + * fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); + * abort(); + * } + * @endcode + * + * After you have finished reading the file, you must close it with + * avformat_close_input(). It will free everything associated with the file. + * + * @section lavf_decoding_read Reading from an opened file + * Reading data from an opened AVFormatContext is done by repeatedly calling + * av_read_frame() on it. Each call, if successful, will return an AVPacket + * containing encoded data for one AVStream, identified by + * AVPacket.stream_index. This packet may be passed straight into the libavcodec + * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the + * caller wishes to decode the data. + * + * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be + * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for + * pts/dts, 0 for duration) if the stream does not provide them. The timing + * information will be in AVStream.time_base units, i.e. it has to be + * multiplied by the timebase to convert them to seconds. + * + * If AVPacket.buf is set on the returned packet, then the packet is + * allocated dynamically and the user may keep it indefinitely. + * Otherwise, if AVPacket.buf is NULL, the packet data is backed by a + * static storage somewhere inside the demuxer and the packet is only valid + * until the next av_read_frame() call or closing the file. If the caller + * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy + * of it. + * In both cases, the packet must be freed with av_packet_unref() when it is no + * longer needed. + * + * @section lavf_decoding_seek Seeking + * @} + * + * @defgroup lavf_encoding Muxing + * @{ + * Muxers take encoded data in the form of @ref AVPacket "AVPackets" and write + * it into files or other output bytestreams in the specified container format. + * + * The main API functions for muxing are avformat_write_header() for writing the + * file header, av_write_frame() / av_interleaved_write_frame() for writing the + * packets and av_write_trailer() for finalizing the file. + * + * At the beginning of the muxing process, the caller must first call + * avformat_alloc_context() to create a muxing context. The caller then sets up + * the muxer by filling the various fields in this context: + * + * - The @ref AVFormatContext.oformat "oformat" field must be set to select the + * muxer that will be used. + * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb + * "pb" field must be set to an opened IO context, either returned from + * avio_open2() or a custom one. + * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must + * be created with the avformat_new_stream() function. The caller should fill + * the @ref AVStream.codecpar "stream codec parameters" information, such as the + * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id + * "id" and other parameters (e.g. width / height, the pixel or sample format, + * etc.) as known. The @ref AVStream.time_base "stream timebase" should + * be set to the timebase that the caller desires to use for this stream (note + * that the timebase actually used by the muxer can be different, as will be + * described later). + * - It is advised to manually initialize only the relevant fields in + * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during + * remuxing: there is no guarantee that the codec context values remain valid + * for both input and output format contexts. + * - The caller may fill in additional information, such as @ref + * AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream" + * metadata, @ref AVFormatContext.chapters "chapters", @ref + * AVFormatContext.programs "programs", etc. as described in the + * AVFormatContext documentation. Whether such information will actually be + * stored in the output depends on what the container format and the muxer + * support. + * + * When the muxing context is fully set up, the caller must call + * avformat_write_header() to initialize the muxer internals and write the file + * header. Whether anything actually is written to the IO context at this step + * depends on the muxer, but this function must always be called. Any muxer + * private options must be passed in the options parameter to this function. + * + * The data is then sent to the muxer by repeatedly calling av_write_frame() or + * av_interleaved_write_frame() (consult those functions' documentation for + * discussion on the difference between them; only one of them may be used with + * a single muxing context, they should not be mixed). Do note that the timing + * information on the packets sent to the muxer must be in the corresponding + * AVStream's timebase. That timebase is set by the muxer (in the + * avformat_write_header() step) and may be different from the timebase + * requested by the caller. + * + * Once all the data has been written, the caller must call av_write_trailer() + * to flush any buffered packets and finalize the output file, then close the IO + * context (if any) and finally free the muxing context with + * avformat_free_context(). + * @} + * + * @defgroup lavf_io I/O Read/Write + * @{ + * @section lavf_io_dirlist Directory listing + * The directory listing API makes it possible to list files on remote servers. + * + * Some of possible use cases: + * - an "open file" dialog to choose files from a remote location, + * - a recursive media finder providing a player with an ability to play all + * files from a given directory. + * + * @subsection lavf_io_dirlist_open Opening a directory + * At first, a directory needs to be opened by calling avio_open_dir() + * supplied with a URL and, optionally, ::AVDictionary containing + * protocol-specific parameters. The function returns zero or positive + * integer and allocates AVIODirContext on success. + * + * @code + * AVIODirContext *ctx = NULL; + * if (avio_open_dir(&ctx, "smb://example.com/some_dir", NULL) < 0) { + * fprintf(stderr, "Cannot open directory.\n"); + * abort(); + * } + * @endcode + * + * This code tries to open a sample directory using smb protocol without + * any additional parameters. + * + * @subsection lavf_io_dirlist_read Reading entries + * Each directory's entry (i.e. file, another directory, anything else + * within ::AVIODirEntryType) is represented by AVIODirEntry. + * Reading consecutive entries from an opened AVIODirContext is done by + * repeatedly calling avio_read_dir() on it. Each call returns zero or + * positive integer if successful. Reading can be stopped right after the + * NULL entry has been read -- it means there are no entries left to be + * read. The following code reads all entries from a directory associated + * with ctx and prints their names to standard output. + * @code + * AVIODirEntry *entry = NULL; + * for (;;) { + * if (avio_read_dir(ctx, &entry) < 0) { + * fprintf(stderr, "Cannot list directory.\n"); + * abort(); + * } + * if (!entry) + * break; + * printf("%s\n", entry->name); + * avio_free_directory_entry(&entry); + * } + * @endcode + * @} + * + * @defgroup lavf_codec Demuxers + * @{ + * @defgroup lavf_codec_native Native Demuxers + * @{ + * @} + * @defgroup lavf_codec_wrappers External library wrappers + * @{ + * @} + * @} + * @defgroup lavf_protos I/O Protocols + * @{ + * @} + * @defgroup lavf_internal Internal + * @{ + * @} + * @} + */ + +#include +#include /* FILE */ +#include "libavcodec/avcodec.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "avio.h" +#include "libavformat/version.h" + +struct AVFormatContext; + +struct AVDeviceInfoList; +struct AVDeviceCapabilitiesQuery; + +/** + * @defgroup metadata_api Public Metadata API + * @{ + * @ingroup libavf + * The metadata API allows libavformat to export metadata tags to a client + * application when demuxing. Conversely it allows a client application to + * set metadata when muxing. + * + * Metadata is exported or set as pairs of key/value strings in the 'metadata' + * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs + * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg, + * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata + * exported by demuxers isn't checked to be valid UTF-8 in most cases. + * + * Important concepts to keep in mind: + * - Keys are unique; there can never be 2 tags with the same key. This is + * also meant semantically, i.e., a demuxer should not knowingly produce + * several keys that are literally different but semantically identical. + * E.g., key=Author5, key=Author6. In this example, all authors must be + * placed in the same tag. + * - Metadata is flat, not hierarchical; there are no subtags. If you + * want to store, e.g., the email address of the child of producer Alice + * and actor Bob, that could have key=alice_and_bobs_childs_email_address. + * - Several modifiers can be applied to the tag name. This is done by + * appending a dash character ('-') and the modifier name in the order + * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. + * - language -- a tag whose value is localized for a particular language + * is appended with the ISO 639-2/B 3-letter language code. + * For example: Author-ger=Michael, Author-eng=Mike + * The original/default language is in the unqualified "Author" tag. + * A demuxer should set a default if it sets any translated tag. + * - sorting -- a modified version of a tag that should be used for + * sorting will have '-sort' appended. E.g. artist="The Beatles", + * artist-sort="Beatles, The". + * - Some protocols and demuxers support metadata updates. After a successful + * call to av_read_packet(), AVFormatContext.event_flags or AVStream.event_flags + * will be updated to indicate if metadata changed. In order to detect metadata + * changes on a stream, you need to loop through all streams in the AVFormatContext + * and check their individual event_flags. + * + * - Demuxers attempt to export metadata in a generic format, however tags + * with no generic equivalents are left as they are stored in the container. + * Follows a list of generic tag names: + * + @verbatim + album -- name of the set this work belongs to + album_artist -- main creator of the set/album, if different from artist. + e.g. "Various Artists" for compilation albums. + artist -- main creator of the work + comment -- any additional description of the file. + composer -- who composed the work, if different from artist. + copyright -- name of copyright holder. + creation_time-- date when the file was created, preferably in ISO 8601. + date -- date when the work was created, preferably in ISO 8601. + disc -- number of a subset, e.g. disc in a multi-disc collection. + encoder -- name/settings of the software/hardware that produced the file. + encoded_by -- person/group who created the file. + filename -- original name of the file. + genre -- . + language -- main language in which the work is performed, preferably + in ISO 639-2 format. Multiple languages can be specified by + separating them with commas. + performer -- artist who performed the work, if different from artist. + E.g for "Also sprach Zarathustra", artist would be "Richard + Strauss" and performer "London Philharmonic Orchestra". + publisher -- name of the label/publisher. + service_name -- name of the service in broadcasting (channel name). + service_provider -- name of the service provider in broadcasting. + title -- name of the work. + track -- number of this work in the set, can be in form current/total. + variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of + @endverbatim + * + * Look in the examples section for an application example how to use the Metadata API. + * + * @} + */ + +/* packet functions */ + + +/** + * Allocate and read the payload of a packet and initialize its + * fields with default values. + * + * @param s associated IO context + * @param pkt packet + * @param size desired payload size + * @return >0 (read size) if OK, AVERROR_xxx otherwise + */ +int av_get_packet(AVIOContext *s, AVPacket *pkt, int size); + + +/** + * Read data and append it to the current content of the AVPacket. + * If pkt->size is 0 this is identical to av_get_packet. + * Note that this uses av_grow_packet and thus involves a realloc + * which is inefficient. Thus this function should only be used + * when there is no reasonable way to know (an upper bound of) + * the final size. + * + * @param s associated IO context + * @param pkt packet + * @param size amount of data to read + * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data + * will not be lost even if an error occurs. + */ +int av_append_packet(AVIOContext *s, AVPacket *pkt, int size); + +#if FF_API_LAVF_FRAC +/*************************************************/ +/* fractional numbers for exact pts handling */ + +/** + * The exact value of the fractional number is: 'val + num / den'. + * num is assumed to be 0 <= num < den. + */ +typedef struct AVFrac { + int64_t val, num, den; +} AVFrac; +#endif + +/*************************************************/ +/* input/output formats */ + +struct AVCodecTag; + +/** + * This structure contains the data a format has to probe a file. + */ +typedef struct AVProbeData { + const char *filename; + unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ + int buf_size; /**< Size of buf except extra allocated bytes */ + const char *mime_type; /**< mime_type, when known. */ +} AVProbeData; + +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4) +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1) + +#define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension +#define AVPROBE_SCORE_MIME 75 ///< score for file mime type +#define AVPROBE_SCORE_MAX 100 ///< maximum score + +#define AVPROBE_PADDING_SIZE 32 ///< extra allocated bytes at the end of the probe buffer + +/// Demuxer will use avio_open, no opened file should be provided by the caller. +#define AVFMT_NOFILE 0x0001 +#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ +#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ +#if FF_API_LAVF_FMT_RAWPICTURE +#define AVFMT_RAWPICTURE 0x0020 /**< Format wants AVPicture structure for + raw picture data. @deprecated Not used anymore */ +#endif +#define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ +#define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ +#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ +#define AVFMT_TS_DISCONT 0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */ +#define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ +#define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ +#define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ +#define AVFMT_NOBINSEARCH 0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */ +#define AVFMT_NOGENSEARCH 0x4000 /**< Format does not allow to fall back on generic search */ +#define AVFMT_NO_BYTE_SEEK 0x8000 /**< Format does not allow seeking by bytes */ +#define AVFMT_ALLOW_FLUSH 0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */ +#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly + increasing timestamps, but they must + still be monotonic */ +#define AVFMT_TS_NEGATIVE 0x40000 /**< Format allows muxing negative + timestamps. If not set the timestamp + will be shifted in av_write_frame and + av_interleaved_write_frame so they + start from 0. + The user or muxer can override this through + AVFormatContext.avoid_negative_ts + */ + +#define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */ + +/** + * @addtogroup lavf_encoding + * @{ + */ +typedef struct AVOutputFormat { + const char *name; + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + const char *mime_type; + const char *extensions; /**< comma-separated filename extensions */ + /* output support */ + enum AVCodecID audio_codec; /**< default audio codec */ + enum AVCodecID video_codec; /**< default video codec */ + enum AVCodecID subtitle_codec; /**< default subtitle codec */ + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, + * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, + * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE + */ + int flags; + + /** + * List of supported codec_id-codec_tag pairs, ordered by "better + * choice first". The arrays are all terminated by AV_CODEC_ID_NONE. + */ + const struct AVCodecTag * const *codec_tag; + + + const AVClass *priv_class; ///< AVClass for the private context + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + struct AVOutputFormat *next; + /** + * size of private data so that it can be allocated in the wrapper + */ + int priv_data_size; + + int (*write_header)(struct AVFormatContext *); + /** + * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, + * pkt can be NULL in order to flush data buffered in the muxer. + * When flushing, return 0 if there still is more data to flush, + * or 1 if everything was flushed and there is no more buffered + * data. + */ + int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); + int (*write_trailer)(struct AVFormatContext *); + /** + * Currently only used to set pixel format if not YUV420P. + */ + int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, + AVPacket *in, int flush); + /** + * Test if the given codec can be stored in this container. + * + * @return 1 if the codec is supported, 0 if it is not. + * A negative number if unknown. + * MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC + */ + int (*query_codec)(enum AVCodecID id, int std_compliance); + + void (*get_output_timestamp)(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + /** + * Allows sending messages from application to device. + */ + int (*control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + + /** + * Write an uncoded AVFrame. + * + * See av_write_uncoded_frame() for details. + * + * The library will free *frame afterwards, but the muxer can prevent it + * by setting the pointer to NULL. + */ + int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index, + AVFrame **frame, unsigned flags); + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + enum AVCodecID data_codec; /**< default data codec */ + /** + * Initialize format. May allocate data here, and set any AVFormatContext or + * AVStream parameters that need to be set before packets are sent. + * This method must not write output. + * + * Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure + * + * Any allocations made here must be freed in deinit(). + */ + int (*init)(struct AVFormatContext *); + /** + * Deinitialize format. If present, this is called whenever the muxer is being + * destroyed, regardless of whether or not the header has been written. + * + * If a trailer is being written, this is called after write_trailer(). + * + * This is called if init() fails as well. + */ + void (*deinit)(struct AVFormatContext *); + /** + * Set up any necessary bitstream filtering and extract any extra data needed + * for the global header. + * Return 0 if more packets from this stream must be checked; 1 if not. + */ + int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); +} AVOutputFormat; +/** + * @} + */ + +/** + * @addtogroup lavf_decoding + * @{ + */ +typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ + const char *name; + + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, + * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. + */ + int flags; + + /** + * If extensions are defined, then no probe is done. You should + * usually not use extension format guessing because it is not + * reliable enough + */ + const char *extensions; + + const struct AVCodecTag * const *codec_tag; + + const AVClass *priv_class; ///< AVClass for the private context + + /** + * Comma-separated list of mime types. + * It is used check for matching mime types while probing. + * @see av_probe_input_format2 + */ + const char *mime_type; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + struct AVInputFormat *next; + + /** + * Raw demuxers store their codec ID here. + */ + int raw_codec_id; + + /** + * Size of private data so that it can be allocated in the wrapper. + */ + int priv_data_size; + + /** + * Tell if a given file has a chance of being parsed as this format. + * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes + * big so you do not have to check for that unless you need more. + */ + int (*read_probe)(AVProbeData *); + + /** + * Read the format header and initialize the AVFormatContext + * structure. Return 0 if OK. 'avformat_new_stream' should be + * called to create new streams. + */ + int (*read_header)(struct AVFormatContext *); + + /** + * Read one packet and put it in 'pkt'. pts and flags are also + * set. 'avformat_new_stream' can be called only if the flag + * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a + * background thread). + * @return 0 on success, < 0 on error. + * When returning an error, pkt must not have been allocated + * or must be freed before returning + */ + int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); + + /** + * Close the stream. The AVFormatContext and AVStreams are not + * freed by this function + */ + int (*read_close)(struct AVFormatContext *); + + /** + * Seek to a given timestamp relative to the frames in + * stream component stream_index. + * @param stream_index Must not be -1. + * @param flags Selects which direction should be preferred if no exact + * match is available. + * @return >= 0 on success (but not necessarily the new offset) + */ + int (*read_seek)(struct AVFormatContext *, + int stream_index, int64_t timestamp, int flags); + + /** + * Get the next timestamp in stream[stream_index].time_base units. + * @return the timestamp or AV_NOPTS_VALUE if an error occurred + */ + int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, + int64_t *pos, int64_t pos_limit); + + /** + * Start/resume playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_play)(struct AVFormatContext *); + + /** + * Pause playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_pause)(struct AVFormatContext *); + + /** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + */ + int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); +} AVInputFormat; +/** + * @} + */ + +enum AVStreamParseType { + AVSTREAM_PARSE_NONE, + AVSTREAM_PARSE_FULL, /**< full parsing and repack */ + AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ + AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ + AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ + AVSTREAM_PARSE_FULL_RAW=MKTAG(0,'R','A','W'), /**< full parsing and repack with timestamp and position generation by parser for raw + this assumes that each packet in the file contains no demuxer level headers and + just codec level data, otherwise position generation would fail */ +}; + +typedef struct AVIndexEntry { + int64_t pos; + int64_t timestamp; /**< + * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available + * when seeking to this entry. That means preferable PTS on keyframe based formats. + * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better + * is known + */ +#define AVINDEX_KEYFRAME 0x0001 +#define AVINDEX_DISCARD_FRAME 0x0002 /** + * Flag is used to indicate which frame should be discarded after decoding. + */ + int flags:2; + int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ +} AVIndexEntry; + +#define AV_DISPOSITION_DEFAULT 0x0001 +#define AV_DISPOSITION_DUB 0x0002 +#define AV_DISPOSITION_ORIGINAL 0x0004 +#define AV_DISPOSITION_COMMENT 0x0008 +#define AV_DISPOSITION_LYRICS 0x0010 +#define AV_DISPOSITION_KARAOKE 0x0020 + +/** + * Track should be used during playback by default. + * Useful for subtitle track that should be displayed + * even when user did not explicitly ask for subtitles. + */ +#define AV_DISPOSITION_FORCED 0x0040 +#define AV_DISPOSITION_HEARING_IMPAIRED 0x0080 /**< stream for hearing impaired audiences */ +#define AV_DISPOSITION_VISUAL_IMPAIRED 0x0100 /**< stream for visual impaired audiences */ +#define AV_DISPOSITION_CLEAN_EFFECTS 0x0200 /**< stream without voice */ +/** + * The stream is stored in the file as an attached picture/"cover art" (e.g. + * APIC frame in ID3v2). The first (usually only) packet associated with it + * will be returned among the first few packets read from the file unless + * seeking takes place. It can also be accessed at any time in + * AVStream.attached_pic. + */ +#define AV_DISPOSITION_ATTACHED_PIC 0x0400 +/** + * The stream is sparse, and contains thumbnail images, often corresponding + * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. + */ +#define AV_DISPOSITION_TIMED_THUMBNAILS 0x0800 + +typedef struct AVStreamInternal AVStreamInternal; + +/** + * To specify text track kind (different from subtitles default). + */ +#define AV_DISPOSITION_CAPTIONS 0x10000 +#define AV_DISPOSITION_DESCRIPTIONS 0x20000 +#define AV_DISPOSITION_METADATA 0x40000 + +/** + * Options for behavior on timestamp wrap detection. + */ +#define AV_PTS_WRAP_IGNORE 0 ///< ignore the wrap +#define AV_PTS_WRAP_ADD_OFFSET 1 ///< add the format specific offset on wrap detection +#define AV_PTS_WRAP_SUB_OFFSET -1 ///< subtract the format specific offset on wrap detection + +/** + * Stream structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVStream) must not be used outside libav*. + */ +typedef struct AVStream { + int index; /**< stream index in AVFormatContext */ + /** + * Format-specific stream ID. + * decoding: set by libavformat + * encoding: set by the user, replaced by libavformat if left unset + */ + int id; +#if FF_API_LAVF_AVCTX + /** + * @deprecated use the codecpar struct instead + */ + attribute_deprecated + AVCodecContext *codec; +#endif + void *priv_data; + +#if FF_API_LAVF_FRAC + /** + * @deprecated this field is unused + */ + attribute_deprecated + struct AVFrac pts; +#endif + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. + * + * decoding: set by libavformat + * encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the desired timebase. In + * avformat_write_header(), the muxer will overwrite this field + * with the timebase that will actually be used for the timestamps + * written into the file (which may or may not be related to the + * user-provided one, depending on the format). + */ + AVRational time_base; + + /** + * Decoding: pts of the first frame of the stream in presentation order, in stream time base. + * Only set this if you are absolutely 100% sure that the value you set + * it to really is the pts of the first frame. + * This may be undefined (AV_NOPTS_VALUE). + * @note The ASF header does NOT contain a correct start_time the ASF + * demuxer must NOT set this. + */ + int64_t start_time; + + /** + * Decoding: duration of the stream, in stream time base. + * If a source file does not specify a duration, but does specify + * a bitrate, this value will be estimated from bitrate and file size. + * + * Encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the estimated duration. + */ + int64_t duration; + + int64_t nb_frames; ///< number of frames in this stream if known or 0 + + int disposition; /**< AV_DISPOSITION_* bit field */ + + enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed. + + /** + * sample aspect ratio (0 if unknown) + * - encoding: Set by user. + * - decoding: Set by libavformat. + */ + AVRational sample_aspect_ratio; + + AVDictionary *metadata; + + /** + * Average framerate + * + * - demuxing: May be set by libavformat when creating the stream or in + * avformat_find_stream_info(). + * - muxing: May be set by the caller before avformat_write_header(). + */ + AVRational avg_frame_rate; + + /** + * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet + * will contain the attached picture. + * + * decoding: set by libavformat, must not be modified by the caller. + * encoding: unused + */ + AVPacket attached_pic; + + /** + * An array of side data that applies to the whole stream (i.e. the + * container does not allow it to change between packets). + * + * There may be no overlap between the side data in this array and side data + * in the packets. I.e. a given side data is either exported by the muxer + * (demuxing) / set by the caller (muxing) in this array, then it never + * appears in the packets, or the side data is exported / sent through + * the packets (always in the first packet where the value becomes known or + * changes), then it does not appear in this array. + * + * - demuxing: Set by libavformat when the stream is created. + * - muxing: May be set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + * + * @see av_format_inject_global_side_data() + */ + AVPacketSideData *side_data; + /** + * The number of elements in the AVStream.side_data array. + */ + int nb_side_data; + + /** + * Flags for the user to detect events happening on the stream. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVSTREAM_EVENT_FLAG_*. + */ + int event_flags; +#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * Internal note: be aware that physically removing these fields + * will break ABI. Replace removed fields with dummy fields, and + * add new fields to AVStreamInternal. + ***************************************************************** + */ + + /** + * Stream information used internally by avformat_find_stream_info() + */ +#define MAX_STD_TIMEBASES (30*12+30+3+6) + struct { + int64_t last_dts; + int64_t duration_gcd; + int duration_count; + int64_t rfps_duration_sum; + double (*duration_error)[2][MAX_STD_TIMEBASES]; + int64_t codec_info_duration; + int64_t codec_info_duration_fields; + + /** + * 0 -> decoder has not been searched for yet. + * >0 -> decoder found + * <0 -> decoder with codec_id == -found_decoder has not been found + */ + int found_decoder; + + int64_t last_duration; + + /** + * Those are used for average framerate estimation. + */ + int64_t fps_first_dts; + int fps_first_dts_idx; + int64_t fps_last_dts; + int fps_last_dts_idx; + + } *info; + + int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */ + + // Timestamp generation support: + /** + * Timestamp corresponding to the last dts sync point. + * + * Initialized when AVCodecParserContext.dts_sync_point >= 0 and + * a DTS is received from the underlying container. Otherwise set to + * AV_NOPTS_VALUE by default. + */ + int64_t first_dts; + int64_t cur_dts; + int64_t last_IP_pts; + int last_IP_duration; + + /** + * Number of packets to buffer for codec probing + */ + int probe_packets; + + /** + * Number of frames that have been demuxed during avformat_find_stream_info() + */ + int codec_info_nb_frames; + + /* av_read_frame() support */ + enum AVStreamParseType need_parsing; + struct AVCodecParserContext *parser; + + /** + * last packet in packet_buffer for this stream when muxing. + */ + struct AVPacketList *last_in_packet_buffer; + AVProbeData probe_data; +#define MAX_REORDER_DELAY 16 + int64_t pts_buffer[MAX_REORDER_DELAY+1]; + + AVIndexEntry *index_entries; /**< Only used if the format does not + support seeking natively. */ + int nb_index_entries; + unsigned int index_entries_allocated_size; + + /** + * Real base framerate of the stream. + * This is the lowest framerate with which all timestamps can be + * represented accurately (it is the least common multiple of all + * framerates in the stream). Note, this value is just a guess! + * For example, if the time base is 1/90000 and all frames have either + * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. + * + * Code outside avformat should access this field using: + * av_stream_get/set_r_frame_rate(stream) + */ + AVRational r_frame_rate; + + /** + * Stream Identifier + * This is the MPEG-TS stream identifier +1 + * 0 means unknown + */ + int stream_identifier; + + int64_t interleaver_chunk_size; + int64_t interleaver_chunk_duration; + + /** + * stream probing state + * -1 -> probing finished + * 0 -> no probing requested + * rest -> perform probing with request_probe being the minimum score to accept. + * NOT PART OF PUBLIC API + */ + int request_probe; + /** + * Indicates that everything up to the next keyframe + * should be discarded. + */ + int skip_to_keyframe; + + /** + * Number of samples to skip at the start of the frame decoded from the next packet. + */ + int skip_samples; + + /** + * If not 0, the number of samples that should be skipped from the start of + * the stream (the samples are removed from packets with pts==0, which also + * assumes negative timestamps do not happen). + * Intended for use with formats such as mp3 with ad-hoc gapless audio + * support. + */ + int64_t start_skip_samples; + + /** + * If not 0, the first audio sample that should be discarded from the stream. + * This is broken by design (needs global sample count), but can't be + * avoided for broken by design formats such as mp3 with ad-hoc gapless + * audio support. + */ + int64_t first_discard_sample; + + /** + * The sample after last sample that is intended to be discarded after + * first_discard_sample. Works on frame boundaries only. Used to prevent + * early EOF if the gapless info is broken (considered concatenated mp3s). + */ + int64_t last_discard_sample; + + /** + * Number of internally decoded frames, used internally in libavformat, do not access + * its lifetime differs from info which is why it is not in that structure. + */ + int nb_decoded_frames; + + /** + * Timestamp offset added to timestamps before muxing + * NOT PART OF PUBLIC API + */ + int64_t mux_ts_offset; + + /** + * Internal data to check for wrapping of the time stamp + */ + int64_t pts_wrap_reference; + + /** + * Options for behavior, when a wrap is detected. + * + * Defined by AV_PTS_WRAP_ values. + * + * If correction is enabled, there are two possibilities: + * If the first time stamp is near the wrap point, the wrap offset + * will be subtracted, which will create negative time stamps. + * Otherwise the offset will be added. + */ + int pts_wrap_behavior; + + /** + * Internal data to prevent doing update_initial_durations() twice + */ + int update_initial_durations_done; + + /** + * Internal data to generate dts from pts + */ + int64_t pts_reorder_error[MAX_REORDER_DELAY+1]; + uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1]; + + /** + * Internal data to analyze DTS and detect faulty mpeg streams + */ + int64_t last_dts_for_order_check; + uint8_t dts_ordered; + uint8_t dts_misordered; + + /** + * Internal data to inject global side data + */ + int inject_global_side_data; + + /***************************************************************** + * All fields above this line are not part of the public API. + * Fields below are part of the public API and ABI again. + ***************************************************************** + */ + + /** + * String containing paris of key and values describing recommended encoder configuration. + * Paris are separated by ','. + * Keys are separated from values by '='. + */ + char *recommended_encoder_configuration; + + /** + * display aspect ratio (0 if unknown) + * - encoding: unused + * - decoding: Set by libavformat to calculate sample_aspect_ratio internally + */ + AVRational display_aspect_ratio; + + struct FFFrac *priv_pts; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVStreamInternal *internal; + + /* + * Codec parameters associated with this stream. Allocated and freed by + * libavformat in avformat_new_stream() and avformat_free_context() + * respectively. + * + * - demuxing: filled by libavformat on stream creation or in + * avformat_find_stream_info() + * - muxing: filled by the caller before avformat_write_header() + */ + AVCodecParameters *codecpar; +} AVStream; + +AVRational av_stream_get_r_frame_rate(const AVStream *s); +void av_stream_set_r_frame_rate(AVStream *s, AVRational r); +struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); +char* av_stream_get_recommended_encoder_configuration(const AVStream *s); +void av_stream_set_recommended_encoder_configuration(AVStream *s, char *configuration); + +/** + * Returns the pts of the last muxed packet + its duration + * + * the retuned value is undefined when used with a demuxer. + */ +int64_t av_stream_get_end_pts(const AVStream *st); + +#define AV_PROGRAM_RUNNING 1 + +/** + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVProgram) must not be used outside libav*. + */ +typedef struct AVProgram { + int id; + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; + AVDictionary *metadata; + + int program_num; + int pmt_pid; + int pcr_pid; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int64_t start_time; + int64_t end_time; + + int64_t pts_wrap_reference; ///< reference dts for wrap detection + int pts_wrap_behavior; ///< behavior on wrap detection +} AVProgram; + +#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present + (streams are added dynamically) */ + +typedef struct AVChapter { + int id; ///< unique ID to identify the chapter + AVRational time_base; ///< time base in which the start/end timestamps are specified + int64_t start, end; ///< chapter start/end time in time_base units + AVDictionary *metadata; +} AVChapter; + + +/** + * Callback used by devices to communicate with application. + */ +typedef int (*av_format_control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + +typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * The duration of a video can be estimated through various ways, and this enum can be used + * to know how the duration was estimated. + */ +enum AVDurationEstimationMethod { + AVFMT_DURATION_FROM_PTS, ///< Duration accurately estimated from PTSes + AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration + AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate) +}; + +typedef struct AVFormatInternal AVFormatInternal; + +/** + * Format I/O context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVFormatContext) must not be used outside libav*, use + * avformat_alloc_context() to create an AVFormatContext. + * + * Fields can be accessed through AVOptions (av_opt*), + * the name string used matches the associated command line parameter name and + * can be found in libavformat/options_table.h. + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + */ +typedef struct AVFormatContext { + /** + * A class for logging and @ref avoptions. Set by avformat_alloc_context(). + * Exports (de)muxer private options if they exist. + */ + const AVClass *av_class; + + /** + * The input container format. + * + * Demuxing only, set by avformat_open_input(). + */ + struct AVInputFormat *iformat; + + /** + * The output container format. + * + * Muxing only, must be set by the caller before avformat_write_header(). + */ + struct AVOutputFormat *oformat; + + /** + * Format private data. This is an AVOptions-enabled struct + * if and only if iformat/oformat.priv_class is not NULL. + * + * - muxing: set by avformat_write_header() + * - demuxing: set by avformat_open_input() + */ + void *priv_data; + + /** + * I/O context. + * + * - demuxing: either set by the user before avformat_open_input() (then + * the user must close it manually) or set by avformat_open_input(). + * - muxing: set by the user before avformat_write_header(). The caller must + * take care of closing / freeing the IO context. + * + * Do NOT set this field if AVFMT_NOFILE flag is set in + * iformat/oformat.flags. In such a case, the (de)muxer will handle + * I/O in some other way and this field will be NULL. + */ + AVIOContext *pb; + + /* stream info */ + /** + * Flags signalling stream properties. A combination of AVFMTCTX_*. + * Set by libavformat. + */ + int ctx_flags; + + /** + * Number of elements in AVFormatContext.streams. + * + * Set by avformat_new_stream(), must not be modified by any other code. + */ + unsigned int nb_streams; + /** + * A list of all streams in the file. New streams are created with + * avformat_new_stream(). + * + * - demuxing: streams are created by libavformat in avformat_open_input(). + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also + * appear in av_read_frame(). + * - muxing: streams are created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStream **streams; + + /** + * input or output filename + * + * - demuxing: set by avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + */ + char filename[1024]; + + /** + * Position of the first frame of the component, in + * AV_TIME_BASE fractional seconds. NEVER set this value directly: + * It is deduced from the AVStream values. + * + * Demuxing only, set by libavformat. + */ + int64_t start_time; + + /** + * Duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also do not set any of them. This is deduced from the + * AVStream values if not set. + * + * Demuxing only, set by libavformat. + */ + int64_t duration; + + /** + * Total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ + int64_t bit_rate; + + unsigned int packet_size; + int max_delay; + + /** + * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*. + * Set by the user before avformat_open_input() / avformat_write_header(). + */ + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< Generate missing pts even if it requires parsing future frames. +#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index. +#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input. +#define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS +#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container +#define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled +#define AVFMT_FLAG_NOBUFFER 0x0040 ///< Do not buffer frames when possible +#define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it. +#define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted +#define AVFMT_FLAG_FLUSH_PACKETS 0x0200 ///< Flush the AVIOContext every packet. +/** + * When muxing, try to avoid writing any random/volatile data to the output. + * This includes any random IDs, real-time timestamps/dates, muxer version, etc. + * + * This flag is mainly intended for testing. + */ +#define AVFMT_FLAG_BITEXACT 0x0400 +#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Enable RTP MP4A-LATM payload +#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) +#define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted) +#if FF_API_LAVF_KEEPSIDE_FLAG +#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Don't merge side data but keep it separate. Deprecated, will be the default. +#endif +#define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Wait for packet data before writing a header, and add bitstream filters as requested by the muxer + + /** + * Maximum size of the data read from input for determining + * the input container format. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int64_t probesize; + + /** + * Maximum duration (in AV_TIME_BASE units) of the data read + * from input in avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + * Can be set to 0 to let avformat choose using a heuristic. + */ + int64_t max_analyze_duration; + + const uint8_t *key; + int keylen; + + unsigned int nb_programs; + AVProgram **programs; + + /** + * Forced video codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID video_codec_id; + + /** + * Forced audio codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID audio_codec_id; + + /** + * Forced subtitle codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID subtitle_codec_id; + + /** + * Maximum amount of memory in bytes to use for the index of each stream. + * If the index exceeds this size, entries will be discarded as + * needed to maintain a smaller size. This can lead to slower or less + * accurate seeking (depends on demuxer). + * Demuxers for which a full in-memory index is mandatory will ignore + * this. + * - muxing: unused + * - demuxing: set by user + */ + unsigned int max_index_size; + + /** + * Maximum amount of memory in bytes to use for buffering frames + * obtained from realtime capture devices. + */ + unsigned int max_picture_buffer; + + /** + * Number of chapters in AVChapter array. + * When muxing, chapters are normally written in the file header, + * so nb_chapters should normally be initialized before write_header + * is called. Some muxers (e.g. mov and mkv) can also write chapters + * in the trailer. To write chapters in the trailer, nb_chapters + * must be zero when write_header is called and non-zero when + * write_trailer is called. + * - muxing: set by user + * - demuxing: set by libavformat + */ + unsigned int nb_chapters; + AVChapter **chapters; + + /** + * Metadata that applies to the whole file. + * + * - demuxing: set by libavformat in avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * Freed by libavformat in avformat_free_context(). + */ + AVDictionary *metadata; + + /** + * Start time of the stream in real world time, in microseconds + * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the + * stream was captured at this real world time. + * - muxing: Set by the caller before avformat_write_header(). If set to + * either 0 or AV_NOPTS_VALUE, then the current wall-time will + * be used. + * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that + * the value may become known after some number of frames + * have been received. + */ + int64_t start_time_realtime; + + /** + * The number of frames used for determining the framerate in + * avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + */ + int fps_probe_size; + + /** + * Error recognition; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int error_recognition; + + /** + * Custom interrupt callbacks for the I/O layer. + * + * demuxing: set by the user before avformat_open_input(). + * muxing: set by the user before avformat_write_header() + * (mainly useful for AVFMT_NOFILE formats). The callback + * should also be passed to avio_open2() if it's used to + * open the file. + */ + AVIOInterruptCB interrupt_callback; + + /** + * Flags to enable debugging. + */ + int debug; +#define FF_FDEBUG_TS 0x0001 + + /** + * Maximum buffering duration for interleaving. + * + * To ensure all the streams are interleaved correctly, + * av_interleaved_write_frame() will wait until it has at least one packet + * for each stream before actually writing any packets to the output file. + * When some streams are "sparse" (i.e. there are large gaps between + * successive packets), this can result in excessive buffering. + * + * This field specifies the maximum difference between the timestamps of the + * first and the last packet in the muxing queue, above which libavformat + * will output a packet regardless of whether it has queued a packet for all + * the streams. + * + * Muxing only, set by the caller before avformat_write_header(). + */ + int64_t max_interleave_delta; + + /** + * Allow non-standard and experimental extension + * @see AVCodecContext.strict_std_compliance + */ + int strict_std_compliance; + + /** + * Flags for the user to detect events happening on the file. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVFMT_EVENT_FLAG_*. + */ + int event_flags; +#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * Maximum number of packets to read while waiting for the first timestamp. + * Decoding only. + */ + int max_ts_probe; + + /** + * Avoid negative timestamps during muxing. + * Any value of the AVFMT_AVOID_NEG_TS_* constants. + * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use) + * - muxing: Set by user + * - demuxing: unused + */ + int avoid_negative_ts; +#define AVFMT_AVOID_NEG_TS_AUTO -1 ///< Enabled when required by target format +#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative +#define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 ///< Shift timestamps so that they start at 0 + + /** + * Transport stream id. + * This will be moved into demuxer private options. Thus no API/ABI compatibility + */ + int ts_id; + + /** + * Audio preload in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int audio_preload; + + /** + * Max chunk time in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_duration; + + /** + * Max chunk size in bytes + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_size; + + /** + * forces the use of wallclock timestamps as pts/dts of packets + * This has undefined results in the presence of B frames. + * - encoding: unused + * - decoding: Set by user + */ + int use_wallclock_as_timestamps; + + /** + * avio flags, used to force AVIO_FLAG_DIRECT. + * - encoding: unused + * - decoding: Set by user + */ + int avio_flags; + + /** + * The duration field can be estimated through various ways, and this field can be used + * to know how the duration was estimated. + * - encoding: unused + * - decoding: Read by user + */ + enum AVDurationEstimationMethod duration_estimation_method; + + /** + * Skip initial bytes when opening stream + * - encoding: unused + * - decoding: Set by user + */ + int64_t skip_initial_bytes; + + /** + * Correct single timestamp overflows + * - encoding: unused + * - decoding: Set by user + */ + unsigned int correct_ts_overflow; + + /** + * Force seeking to any (also non key) frames. + * - encoding: unused + * - decoding: Set by user + */ + int seek2any; + + /** + * Flush the I/O context after each packet. + * - encoding: Set by user + * - decoding: unused + */ + int flush_packets; + + /** + * format probing score. + * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes + * the format. + * - encoding: unused + * - decoding: set by avformat, read by user + */ + int probe_score; + + /** + * number of bytes to read maximally to identify format. + * - encoding: unused + * - decoding: set by user + */ + int format_probesize; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * ',' separated list of allowed demuxers. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *format_whitelist; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVFormatInternal *internal; + + /** + * IO repositioned flag. + * This is set by avformat when the underlaying IO context read pointer + * is repositioned, for example when doing byte based seeking. + * Demuxers can use the flag to detect such changes. + */ + int io_repositioned; + + /** + * Forced video codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *video_codec; + + /** + * Forced audio codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *audio_codec; + + /** + * Forced subtitle codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *subtitle_codec; + + /** + * Forced data codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *data_codec; + + /** + * Number of bytes to be written as padding in a metadata header. + * Demuxing: Unused. + * Muxing: Set by user via av_format_set_metadata_header_padding. + */ + int metadata_header_padding; + + /** + * User data. + * This is a place for some private data of the user. + */ + void *opaque; + + /** + * Callback used by devices to communicate with application. + */ + av_format_control_message control_message_cb; + + /** + * Output timestamp offset, in microseconds. + * Muxing: set by user + */ + int64_t output_ts_offset; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - muxing: Set by user. + * - demuxing: Set by user. + */ + uint8_t *dump_separator; + + /** + * Forced Data codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID data_codec_id; + +#if FF_API_OLD_OPEN_CALLBACKS + /** + * Called to open further IO contexts when needed for demuxing. + * + * This can be set by the user application to perform security checks on + * the URLs before opening them. + * The function should behave like avio_open2(), AVFormatContext is provided + * as contextual information and to reach AVFormatContext.opaque. + * + * If NULL then some simple checks are used together with avio_open2(). + * + * Must not be accessed directly from outside avformat. + * @See av_format_set_open_cb() + * + * Demuxing: Set by user. + * + * @deprecated Use io_open and io_close. + */ + attribute_deprecated + int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); +#endif + + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_whitelist; + + /* + * A callback for opening new IO streams. + * + * Whenever a muxer or a demuxer needs to open an IO stream (typically from + * avformat_open_input() for demuxers, but for certain formats can happen at + * other times as well), it will call this callback to obtain an IO context. + * + * @param s the format context + * @param pb on success, the newly opened IO context should be returned here + * @param url the url to open + * @param flags a combination of AVIO_FLAG_* + * @param options a dictionary of additional options, with the same + * semantics as in avio_open2() + * @return 0 on success, a negative AVERROR code on failure + * + * @note Certain muxers and demuxers do nesting, i.e. they open one or more + * additional internal format contexts. Thus the AVFormatContext pointer + * passed to this callback may be different from the one facing the caller. + * It will, however, have the same 'opaque' field. + */ + int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, + int flags, AVDictionary **options); + + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + */ + void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); + + /** + * ',' separated list of disallowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_blacklist; + + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user + */ + int max_streams; +} AVFormatContext; + +/** + * Accessors for some AVFormatContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +int av_format_get_probe_score(const AVFormatContext *s); +AVCodec * av_format_get_video_codec(const AVFormatContext *s); +void av_format_set_video_codec(AVFormatContext *s, AVCodec *c); +AVCodec * av_format_get_audio_codec(const AVFormatContext *s); +void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c); +AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s); +void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c); +AVCodec * av_format_get_data_codec(const AVFormatContext *s); +void av_format_set_data_codec(AVFormatContext *s, AVCodec *c); +int av_format_get_metadata_header_padding(const AVFormatContext *s); +void av_format_set_metadata_header_padding(AVFormatContext *s, int c); +void * av_format_get_opaque(const AVFormatContext *s); +void av_format_set_opaque(AVFormatContext *s, void *opaque); +av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); +void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); +#if FF_API_OLD_OPEN_CALLBACKS +attribute_deprecated AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); +attribute_deprecated void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); +#endif + +/** + * This function will cause global side data to be injected in the next packet + * of each stream as well as after any subsequent seek. + */ +void av_format_inject_global_side_data(AVFormatContext *s); + +/** + * Returns the method used to set ctx->duration. + * + * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. + */ +enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); + +typedef struct AVPacketList { + AVPacket pkt; + struct AVPacketList *next; +} AVPacketList; + + +/** + * @defgroup lavf_core Core functions + * @ingroup libavf + * + * Functions for querying libavformat capabilities, allocating core structures, + * etc. + * @{ + */ + +/** + * Return the LIBAVFORMAT_VERSION_INT constant. + */ +unsigned avformat_version(void); + +/** + * Return the libavformat build-time configuration. + */ +const char *avformat_configuration(void); + +/** + * Return the libavformat license. + */ +const char *avformat_license(void); + +/** + * Initialize libavformat and register all the muxers, demuxers and + * protocols. If you do not call this function, then you can select + * exactly which formats you want to support. + * + * @see av_register_input_format() + * @see av_register_output_format() + */ +void av_register_all(void); + +void av_register_input_format(AVInputFormat *format); +void av_register_output_format(AVOutputFormat *format); + +/** + * Do global initialization of network components. This is optional, + * but recommended, since it avoids the overhead of implicitly + * doing the setup for each session. + * + * Calling this function will become mandatory if using network + * protocols at some major version bump. + */ +int avformat_network_init(void); + +/** + * Undo the initialization done by avformat_network_init. + */ +int avformat_network_deinit(void); + +/** + * If f is NULL, returns the first registered input format, + * if f is non-NULL, returns the next registered input format after f + * or NULL if f is the last one. + */ +AVInputFormat *av_iformat_next(const AVInputFormat *f); + +/** + * If f is NULL, returns the first registered output format, + * if f is non-NULL, returns the next registered output format after f + * or NULL if f is the last one. + */ +AVOutputFormat *av_oformat_next(const AVOutputFormat *f); + +/** + * Allocate an AVFormatContext. + * avformat_free_context() can be used to free the context and everything + * allocated by the framework within it. + */ +AVFormatContext *avformat_alloc_context(void); + +/** + * Free an AVFormatContext and all its streams. + * @param s context to free + */ +void avformat_free_context(AVFormatContext *s); + +/** + * Get the AVClass for AVFormatContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avformat_get_class(void); + +/** + * Add a new stream to a media file. + * + * When demuxing, it is called by the demuxer in read_header(). If the + * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also + * be called in read_packet(). + * + * When muxing, should be called by the user before avformat_write_header(). + * + * User is required to call avcodec_close() and avformat_free_context() to + * clean up the allocation by avformat_new_stream(). + * + * @param s media file handle + * @param c If non-NULL, the AVCodecContext corresponding to the new stream + * will be initialized to use this codec. This is needed for e.g. codec-specific + * defaults to be set, so codec should be provided if it is known. + * + * @return newly created stream or NULL on error. + */ +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); + +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * st. + * @param size side information size + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Allocate new information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t *av_stream_new_side_data(AVStream *stream, + enum AVPacketSideDataType type, int size); +/** + * Get side information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +#if FF_API_NOCONST_GET_SIDE_DATA +uint8_t *av_stream_get_side_data(AVStream *stream, + enum AVPacketSideDataType type, int *size); +#else +uint8_t *av_stream_get_side_data(const AVStream *stream, + enum AVPacketSideDataType type, int *size); +#endif + +AVProgram *av_new_program(AVFormatContext *s, int id); + +/** + * @} + */ + + +/** + * Allocate an AVFormatContext for an output format. + * avformat_free_context() can be used to free the context and + * everything allocated by the framework within it. + * + * @param *ctx is set to the created format context, or to NULL in + * case of failure + * @param oformat format to use for allocating the context, if NULL + * format_name and filename are used instead + * @param format_name the name of output format to use for allocating the + * context, if NULL filename is used instead + * @param filename the name of the filename to use for allocating the + * context, may be NULL + * @return >= 0 in case of success, a negative AVERROR code in case of + * failure + */ +int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, + const char *format_name, const char *filename); + +/** + * @addtogroup lavf_decoding + * @{ + */ + +/** + * Find AVInputFormat based on the short name of the input format. + */ +AVInputFormat *av_find_input_format(const char *short_name); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + */ +AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_max A probe score larger that this is required to accept a + * detection, the variable is set to the actual detection + * score afterwards. + * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended + * to retry with a larger probe buffer. + */ +AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max); + +/** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_ret The score of the best detection. + */ +AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret); + +/** + * Probe a bytestream to determine the input format. Each time a probe returns + * with a score that is too low, the probe buffer size is increased and another + * attempt is made. When the maximum probe size is reached, the input format + * with the highest score is returned. + * + * @param pb the bytestream to probe + * @param fmt the input format is put here + * @param url the url of the stream + * @param logctx the log context + * @param offset the offset within the bytestream to probe from + * @param max_probe_size the maximum probe buffer size (zero for default) + * @return the score in case of success, a negative value corresponding to an + * the maximal score is AVPROBE_SCORE_MAX + * AVERROR code otherwise + */ +int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Like av_probe_input_buffer2() but returns 0 on success + */ +int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Open an input stream and read the header. The codecs are not opened. + * The stream must be closed with avformat_close_input(). + * + * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). + * May be a pointer to NULL, in which case an AVFormatContext is allocated by this + * function and written into ps. + * Note that a user-supplied AVFormatContext will be freed on failure. + * @param url URL of the stream to open. + * @param fmt If non-NULL, this parameter forces a specific input format. + * Otherwise the format is autodetected. + * @param options A dictionary filled with AVFormatContext and demuxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return 0 on success, a negative AVERROR on failure. + * + * @note If you want to use custom IO, preallocate the format context and set its pb field. + */ +int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); + +attribute_deprecated +int av_demuxer_open(AVFormatContext *ic); + +/** + * Read packets of a media file to get stream information. This + * is useful for file formats with no headers such as MPEG. This + * function also computes the real framerate in case of MPEG-2 repeat + * frame mode. + * The logical file position is not changed by this function; + * examined packets may be buffered for later processing. + * + * @param ic media file handle + * @param options If non-NULL, an ic.nb_streams long array of pointers to + * dictionaries, where i-th member contains options for + * codec corresponding to i-th stream. + * On return each dictionary will be filled with options that were not found. + * @return >=0 if OK, AVERROR_xxx on error + * + * @note this function isn't guaranteed to open all the codecs, so + * options being non-empty at return is a perfectly normal behavior. + * + * @todo Let the user decide somehow what information is needed so that + * we do not waste time getting stuff the user does not need. + */ +int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); + +/** + * Find the programs which belong to a given stream. + * + * @param ic media file handle + * @param last the last found program, the search will start after this + * program, or from the beginning if it is NULL + * @param s stream index + * @return the next program which belongs to s, NULL if no program is found or + * the last program is not among the programs of ic. + */ +AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); + +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); + +/** + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + */ +int av_find_best_stream(AVFormatContext *ic, + enum AVMediaType type, + int wanted_stream_nb, + int related_stream, + AVCodec **decoder_ret, + int flags); + +/** + * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. + * + * If pkt->buf is NULL, then the packet is valid until the next + * av_read_frame() or until avformat_close_input(). Otherwise the packet + * is valid indefinitely. In both cases the packet must be freed with + * av_packet_unref when it is no longer needed. For video, the packet contains + * exactly one frame. For audio, it contains an integer number of frames if each + * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames + * have a variable size (e.g. MPEG audio), then it contains one frame. + * + * pkt->pts, pkt->dts and pkt->duration are always set to correct + * values in AVStream.time_base units (and guessed if the format cannot + * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format + * has B-frames, so it is better to rely on pkt->dts if you do not + * decompress the payload. + * + * @return 0 if OK, < 0 on error or end of file + */ +int av_read_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Seek to the keyframe at timestamp. + * 'timestamp' in 'stream_index'. + * + * @param s media file handle + * @param stream_index If stream_index is (-1), a default + * stream is selected, and timestamp is automatically converted + * from AV_TIME_BASE units to the stream specific time_base. + * @param timestamp Timestamp in AVStream.time_base units + * or, if no stream is specified, in AV_TIME_BASE units. + * @param flags flags which select direction and seeking mode + * @return >= 0 on success + */ +int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, + int flags); + +/** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + * + * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and + * are the file position (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames + * in the stream with stream_index (this may not be supported by all demuxers). + * Otherwise all timestamps are in units of the stream selected by stream_index + * or if stream_index is -1, in AV_TIME_BASE units. + * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as + * keyframes (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored. + * + * @param s media file handle + * @param stream_index index of the stream which is used as time base reference + * @param min_ts smallest acceptable timestamp + * @param ts target timestamp + * @param max_ts largest acceptable timestamp + * @param flags flags + * @return >=0 on success, error code otherwise + * + * @note This is part of the new seek API which is still under construction. + * Thus do not use this yet. It may change at any time, do not expect + * ABI compatibility yet! + */ +int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + +/** + * Discard all internally buffered data. This can be useful when dealing with + * discontinuities in the byte stream. Generally works only with formats that + * can resync. This includes headerless formats like MPEG-TS/TS but should also + * work with NUT, Ogg and in a limited way AVI for example. + * + * The set of streams, the detected duration, stream parameters and codecs do + * not change when calling this function. If you want a complete reset, it's + * better to open a new AVFormatContext. + * + * This does not flush the AVIOContext (s->pb). If necessary, call + * avio_flush(s->pb) before calling this function. + * + * @param s media file handle + * @return >=0 on success, error code otherwise + */ +int avformat_flush(AVFormatContext *s); + +/** + * Start playing a network-based stream (e.g. RTSP stream) at the + * current position. + */ +int av_read_play(AVFormatContext *s); + +/** + * Pause a network-based stream (e.g. RTSP stream). + * + * Use av_read_play() to resume it. + */ +int av_read_pause(AVFormatContext *s); + +/** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + */ +void avformat_close_input(AVFormatContext **s); +/** + * @} + */ + +#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward +#define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +#define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes +#define AVSEEK_FLAG_FRAME 8 ///< seeking based on frame number + +/** + * @addtogroup lavf_encoding + * @{ + */ + +#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header +#define AVSTREAM_INIT_IN_INIT_OUTPUT 1 ///< stream parameters initialized in avformat_init_output + +/** + * Allocate the stream private data and write the stream header to + * an output media file. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec had not already been fully initialized in avformat_init, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec had already been fully initialized in avformat_init, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. + */ +av_warn_unused_result +int avformat_write_header(AVFormatContext *s, AVDictionary **options); + +/** + * Allocate the stream private data and initialize the codec, but do not write the header. + * May optionally be used before avformat_write_header to initialize stream parameters + * before actually writing the header. + * If using this function, do not pass the same options to avformat_write_header. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec requires avformat_write_header to fully initialize, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec has been fully initialized, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. + */ +av_warn_unused_result +int avformat_init_output(AVFormatContext *s, AVDictionary **options); + +/** + * Write a packet to an output media file. + * + * This function passes the packet directly to the muxer, without any buffering + * or reordering. The caller is responsible for correctly interleaving the + * packets if the format requires it. Callers that want libavformat to handle + * the interleaving should call av_interleaved_write_frame() instead of this + * function. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. Note that unlike + * av_interleaved_write_frame(), this function does not take + * ownership of the packet passed to it (though some muxers may make + * an internal reference to the input packet). + *
+ * This parameter can be NULL (at any time, not just at the end), in + * order to immediately flush data buffered within the muxer, for + * muxers that buffer up data internally before writing it to the + * output. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets passed to this function must be strictly + * increasing when compared in their respective timebases (unless the + * output format is flagged with the AVFMT_TS_NONSTRICT, then they + * merely have to be nondecreasing). @ref AVPacket.duration + * "duration") should also be set if known. + * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush + * + * @see av_interleaved_write_frame() + */ +int av_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write a packet to an output media file ensuring correct interleaving. + * + * This function will buffer the packets internally as needed to make sure the + * packets in the output file are properly interleaved in the order of + * increasing dts. Callers doing their own interleaving should call + * av_write_frame() instead of this function. + * + * Using this function instead of av_write_frame() can give muxers advance + * knowledge of future packets, improving e.g. the behaviour of the mp4 + * muxer for VFR content in fragmenting mode. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. + *
+ * If the packet is reference-counted, this function will take + * ownership of this reference and unreference it later when it sees + * fit. + * The caller must not access the data through this reference after + * this function returns. If the packet is not reference-counted, + * libavformat will make a copy. + *
+ * This parameter can be NULL (at any time, not just at the end), to + * flush the interleaving queues. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets in one stream must be strictly + * increasing (unless the output format is flagged with the + * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing). + * @ref AVPacket.duration "duration") should also be set if known. + * + * @return 0 on success, a negative AVERROR on error. Libavformat will always + * take care of freeing the packet, even if this function fails. + * + * @see av_write_frame(), AVFormatContext.max_interleave_delta + */ +int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write an uncoded frame to an output media file. + * + * The frame must be correctly interleaved according to the container + * specification; if not, then av_interleaved_write_frame() must be used. + * + * See av_interleaved_write_frame() for details. + */ +int av_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Write an uncoded frame to an output media file. + * + * If the muxer supports it, this function makes it possible to write an AVFrame + * structure directly, without encoding it into a packet. + * It is mostly useful for devices and similar special muxers that use raw + * video or PCM data and will not serialize it into a byte stream. + * + * To test whether it is possible to use it with a given muxer and stream, + * use av_write_uncoded_frame_query(). + * + * The caller gives up ownership of the frame and must not access it + * afterwards. + * + * @return >=0 for success, a negative code on error + */ +int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Test whether a muxer supports uncoded frame. + * + * @return >=0 if an uncoded frame can be written to that muxer and stream, + * <0 if not + */ +int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index); + +/** + * Write the stream trailer to an output media file and free the + * file private data. + * + * May only be called after a successful call to avformat_write_header. + * + * @param s media file handle + * @return 0 if OK, AVERROR_xxx on error + */ +int av_write_trailer(AVFormatContext *s); + +/** + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if + * there is no match. + * + * @param short_name if non-NULL checks if short_name matches with the + * names of the registered formats + * @param filename if non-NULL checks if filename terminates with the + * extensions of the registered formats + * @param mime_type if non-NULL checks if mime_type matches with the + * MIME type of the registered formats + */ +AVOutputFormat *av_guess_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * Guess the codec ID based upon muxer and filename. + */ +enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, + const char *filename, const char *mime_type, + enum AVMediaType type); + +/** + * Get timing information for the data currently output. + * The exact meaning of "currently output" depends on the format. + * It is mostly relevant for devices that have an internal buffer and/or + * work in real time. + * @param s media file handle + * @param stream stream in the media file + * @param[out] dts DTS of the last packet output for the stream, in stream + * time_base units + * @param[out] wall absolute time when that packet whas output, + * in microsecond + * @return 0 if OK, AVERROR(ENOSYS) if the format does not support it + * Note: some formats or devices may not allow to measure dts and wall + * atomically. + */ +int av_get_output_timestamp(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + + +/** + * @} + */ + + +/** + * @defgroup lavf_misc Utility functions + * @ingroup libavf + * @{ + * + * Miscellaneous utility functions related to both muxing and demuxing + * (or neither). + */ + +/** + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump(FILE *f, const uint8_t *buf, int size); + +/** + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size); + +/** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st); + + +/** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload, + const AVStream *st); + +/** + * Get the AVCodecID for the given codec tag tag. + * If no codec id is found returns AV_CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param tag codec tag to match to a codec ID + */ +enum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); + +/** + * Get the codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec ID to match to a codec tag + */ +unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id); + +/** + * Get the codec tag for the given codec id. + * + * @param tags list of supported codec_id - codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec id that should be searched for in the list + * @param tag A pointer to the found tag + * @return 0 if id was not found in tags, > 0 if it was found + */ +int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id, + unsigned int *tag); + +int av_find_default_stream_index(AVFormatContext *s); + +/** + * Get the index for a specific timestamp. + * + * @param st stream that the timestamp belongs to + * @param timestamp timestamp to retrieve the index for + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise + * @return < 0 if no such timestamp could be found + */ +int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); + +/** + * Add an index entry into a sorted list. Update the entry if the list + * already contains it. + * + * @param timestamp timestamp in the time base of the given stream + */ +int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, + int size, int distance, int flags); + + +/** + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + */ +void av_url_split(char *proto, int proto_size, + char *authorization, int authorization_size, + char *hostname, int hostname_size, + int *port_ptr, + char *path, int path_size, + const char *url); + + +/** + * Print detailed information about the input or output format, such as + * duration, bitrate, streams, container, programs, metadata, side data, + * codec and time base. + * + * @param ic the context to analyze + * @param index index of the stream to dump information about + * @param url the URL to print, such as source or destination file + * @param is_output Select whether the specified context is an input(0) or output(1) + */ +void av_dump_format(AVFormatContext *ic, + int index, + const char *url, + int is_output); + + +#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d + +/** + * Return in 'buf' the path with '%d' replaced by a number. + * + * Also handles the '%0nd' format where 'n' is the total number + * of digits and '%%'. + * + * @param buf destination buffer + * @param buf_size destination buffer size + * @param path numbered sequence string + * @param number frame number + * @param flags AV_FRAME_FILENAME_FLAGS_* + * @return 0 if OK, -1 on format error + */ +int av_get_frame_filename2(char *buf, int buf_size, + const char *path, int number, int flags); + +int av_get_frame_filename(char *buf, int buf_size, + const char *path, int number); + +/** + * Check whether filename actually is a numbered sequence generator. + * + * @param filename possible numbered sequence string + * @return 1 if a valid numbered sequence string, 0 otherwise + */ +int av_filename_number_test(const char *filename); + +/** + * Generate an SDP for an RTP session. + * + * Note, this overwrites the id values of AVStreams in the muxer contexts + * for getting unique dynamic payload types. + * + * @param ac array of AVFormatContexts describing the RTP streams. If the + * array is composed by only one context, such context can contain + * multiple AVStreams (one AVStream per RTP stream). Otherwise, + * all the contexts in the array (an AVCodecContext per RTP stream) + * must contain only one AVStream. + * @param n_files number of AVCodecContexts contained in ac + * @param buf buffer where the SDP will be stored (must be allocated by + * the caller) + * @param size the size of the buffer + * @return 0 if OK, AVERROR_xxx on error + */ +int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size); + +/** + * Return a positive value if the given filename has one of the given + * extensions, 0 otherwise. + * + * @param filename file name to check against the given extensions + * @param extensions a comma-separated list of filename extensions + */ +int av_match_ext(const char *filename, const char *extensions); + +/** + * Test if the given container can store a codec. + * + * @param ofmt container to check for compatibility + * @param codec_id codec to potentially store in container + * @param std_compliance standards compliance level, one of FF_COMPLIANCE_* + * + * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. + * A negative number if this information is not available. + */ +int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id, + int std_compliance); + +/** + * @defgroup riff_fourcc RIFF FourCCs + * @{ + * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are + * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the + * following code: + * @code + * uint32_t tag = MKTAG('H', '2', '6', '4'); + * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; + * enum AVCodecID id = av_codec_get_id(table, tag); + * @endcode + */ +/** + * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_video_tags(void); +/** + * @return the table mapping RIFF FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_audio_tags(void); +/** + * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_video_tags(void); +/** + * @return the table mapping MOV FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_audio_tags(void); + +/** + * @} + */ + +/** + * Guess the sample aspect ratio of a frame, based on both the stream and the + * frame aspect ratio. + * + * Since the frame aspect ratio is set by the codec but the stream aspect ratio + * is set by the demuxer, these two may not be equal. This function tries to + * return the value that you should use if you would like to display the frame. + * + * Basic logic is to use the stream aspect ratio if it is set to something sane + * otherwise use the frame aspect ratio. This way a container setting, which is + * usually easy to modify can override the coded value in the frames. + * + * @param format the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame with the aspect ratio to be determined + * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea + */ +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame); + +/** + * Guess the frame rate, based on both the container and codec information. + * + * @param ctx the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame for which the frame rate should be determined, may be NULL + * @return the guessed (valid) frame rate, 0/1 if no idea + */ +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame); + +/** + * Check if the stream st contained in s is matched by the stream specifier + * spec. + * + * See the "stream specifiers" chapter in the documentation for the syntax + * of spec. + * + * @return >0 if st is matched by spec; + * 0 if st is not matched by spec; + * AVERROR code if spec is invalid + * + * @note A stream specifier can match several streams in the format. + */ +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, + const char *spec); + +int avformat_queue_attached_pictures(AVFormatContext *s); + +#if FF_API_OLD_BSF +/** + * Apply a list of bitstream filters to a packet. + * + * @param codec AVCodecContext, usually from an AVStream + * @param pkt the packet to apply filters to. If, on success, the returned + * packet has size == 0 and side_data_elems == 0, it indicates that + * the packet should be dropped + * @param bsfc a NULL-terminated list of filters to apply + * @return >=0 on success; + * AVERROR code on failure + */ +attribute_deprecated +int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt, + AVBitStreamFilterContext *bsfc); +#endif + +enum AVTimebaseSource { + AVFMT_TBCF_AUTO = -1, + AVFMT_TBCF_DECODER, + AVFMT_TBCF_DEMUXER, +#if FF_API_R_FRAME_RATE + AVFMT_TBCF_R_FRAMERATE, +#endif +}; + +/** + * Transfer internal timing information from one stream to another. + * + * This function is useful when doing stream copy. + * + * @param ofmt target output format for ost + * @param ost output stream which needs timings copy and adjustments + * @param ist reference input stream to copy timings from + * @param copy_tb define from where the stream codec timebase needs to be imported + */ +int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, + AVStream *ost, const AVStream *ist, + enum AVTimebaseSource copy_tb); + +/** + * Get the internal codec timebase from a stream. + * + * @param st input stream to extract the timebase from + */ +AVRational av_stream_get_codec_timebase(const AVStream *st); + +/** + * @} + */ + +#endif /* AVFORMAT_AVFORMAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avio.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avio.h new file mode 100644 index 0000000..f9c5972 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/avio.h @@ -0,0 +1,867 @@ +/* + * copyright (c) 2001 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 + */ +#ifndef AVFORMAT_AVIO_H +#define AVFORMAT_AVIO_H + +/** + * @file + * @ingroup lavf_io + * Buffered I/O operations + */ + +#include + +#include "libavutil/common.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "libavformat/version.h" + +/** + * Seeking works like for a local file. + */ +#define AVIO_SEEKABLE_NORMAL (1 << 0) + +/** + * Seeking by timestamp with avio_seek_time() is possible. + */ +#define AVIO_SEEKABLE_TIME (1 << 1) + +/** + * Callback for checking whether to abort blocking functions. + * AVERROR_EXIT is returned in this case by the interrupted + * function. During blocking operations, callback is called with + * opaque as parameter. If the callback returns 1, the + * blocking operation will be aborted. + * + * No members can be added to this struct without a major bump, if + * new elements have been added after this struct in AVFormatContext + * or AVIOContext. + */ +typedef struct AVIOInterruptCB { + int (*callback)(void*); + void *opaque; +} AVIOInterruptCB; + +/** + * Directory entry types. + */ +enum AVIODirEntryType { + AVIO_ENTRY_UNKNOWN, + AVIO_ENTRY_BLOCK_DEVICE, + AVIO_ENTRY_CHARACTER_DEVICE, + AVIO_ENTRY_DIRECTORY, + AVIO_ENTRY_NAMED_PIPE, + AVIO_ENTRY_SYMBOLIC_LINK, + AVIO_ENTRY_SOCKET, + AVIO_ENTRY_FILE, + AVIO_ENTRY_SERVER, + AVIO_ENTRY_SHARE, + AVIO_ENTRY_WORKGROUP, +}; + +/** + * Describes single entry of the directory. + * + * Only name and type fields are guaranteed be set. + * Rest of fields are protocol or/and platform dependent and might be unknown. + */ +typedef struct AVIODirEntry { + char *name; /**< Filename */ + int type; /**< Type of the entry */ + int utf8; /**< Set to 1 when name is encoded with UTF-8, 0 otherwise. + Name can be encoded with UTF-8 even though 0 is set. */ + int64_t size; /**< File size in bytes, -1 if unknown. */ + int64_t modification_timestamp; /**< Time of last modification in microseconds since unix + epoch, -1 if unknown. */ + int64_t access_timestamp; /**< Time of last access in microseconds since unix epoch, + -1 if unknown. */ + int64_t status_change_timestamp; /**< Time of last status change in microseconds since unix + epoch, -1 if unknown. */ + int64_t user_id; /**< User ID of owner, -1 if unknown. */ + int64_t group_id; /**< Group ID of owner, -1 if unknown. */ + int64_t filemode; /**< Unix file mode, -1 if unknown. */ +} AVIODirEntry; + +typedef struct AVIODirContext { + struct URLContext *url_context; +} AVIODirContext; + +/** + * Different data types that can be returned via the AVIO + * write_data_type callback. + */ +enum AVIODataMarkerType { + /** + * Header data; this needs to be present for the stream to be decodeable. + */ + AVIO_DATA_MARKER_HEADER, + /** + * A point in the output bytestream where a decoder can start decoding + * (i.e. a keyframe). A demuxer/decoder given the data flagged with + * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, + * should give decodeable results. + */ + AVIO_DATA_MARKER_SYNC_POINT, + /** + * A point in the output bytestream where a demuxer can start parsing + * (for non self synchronizing bytestream formats). That is, any + * non-keyframe packet start point. + */ + AVIO_DATA_MARKER_BOUNDARY_POINT, + /** + * This is any, unlabelled data. It can either be a muxer not marking + * any positions at all, it can be an actual boundary/sync point + * that the muxer chooses not to mark, or a later part of a packet/fragment + * that is cut into multiple write callbacks due to limited IO buffer size. + */ + AVIO_DATA_MARKER_UNKNOWN, + /** + * Trailer data, which doesn't contain actual content, but only for + * finalizing the output file. + */ + AVIO_DATA_MARKER_TRAILER, + /** + * A point in the output bytestream where the underlying AVIOContext might + * flush the buffer depending on latency or buffering requirements. Typically + * means the end of a packet. + */ + AVIO_DATA_MARKER_FLUSH_POINT, +}; + +/** + * Bytestream IO Context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVIOContext) must not be used outside libav*. + * + * @note None of the function pointers in AVIOContext should be called + * directly, they should only be set by the client application + * when implementing custom I/O. Normally these are set to the + * function pointers specified in avio_alloc_context() + */ +typedef struct AVIOContext { + /** + * A class for private options. + * + * If this AVIOContext is created by avio_open2(), av_class is set and + * passes the options down to protocols. + * + * If this AVIOContext is manually allocated, then av_class may be set by + * the caller. + * + * warning -- this field can be NULL, be sure to not pass this AVIOContext + * to any av_opt_* functions in that case. + */ + const AVClass *av_class; + + /* + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): + * + ********************************************************************************** + * READING + ********************************************************************************** + * + * | buffer_size | + * |---------------------------------------| + * | | + * + * buffer buf_ptr buf_end + * +---------------+-----------------------+ + * |/ / / / / / / /|/ / / / / / /| | + * read buffer: |/ / consumed / | to be read /| | + * |/ / / / / / / /|/ / / / / / /| | + * +---------------+-----------------------+ + * + * pos + * +-------------------------------------------+-----------------+ + * input file: | | | + * +-------------------------------------------+-----------------+ + * + * + ********************************************************************************** + * WRITING + ********************************************************************************** + * + * | buffer_size | + * |--------------------------------------| + * | | + * + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ + * buf_ptr can be in this + * due to a backward seek + * + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ + * + */ + unsigned char *buffer; /**< Start of the buffer. */ + int buffer_size; /**< Maximum buffer size */ + unsigned char *buf_ptr; /**< Current position in the buffer */ + unsigned char *buf_end; /**< End of the data, may be less than + buffer+buffer_size if the read function returned + less data than requested, e.g. for streams where + no more data has been received yet. */ + void *opaque; /**< A private pointer, passed to the read/write/seek/... + functions. */ + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); + int64_t (*seek)(void *opaque, int64_t offset, int whence); + int64_t pos; /**< position in the file of the current buffer */ + int must_flush; /**< unused */ + int eof_reached; /**< true if eof reached */ + int write_flag; /**< true if open for writing */ + int max_packet_size; + unsigned long checksum; + unsigned char *checksum_ptr; + unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); + int error; /**< contains the error code or 0 if no error happened */ + /** + * Pause or resume playback for network streaming protocols - e.g. MMS. + */ + int (*read_pause)(void *opaque, int pause); + /** + * Seek to a given timestamp in stream with the specified stream_index. + * Needed for some network streaming protocols which don't support seeking + * to byte position. + */ + int64_t (*read_seek)(void *opaque, int stream_index, + int64_t timestamp, int flags); + /** + * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. + */ + int seekable; + + /** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t maxsize; + + /** + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ + int direct; + + /** + * Bytes read statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t bytes_read; + + /** + * seek statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int seek_count; + + /** + * writeout statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int writeout_count; + + /** + * Original buffer size + * used internally after probing and ensure seekback to reset the buffer size + * This field is internal to libavformat and access from outside is not allowed. + */ + int orig_buffer_size; + + /** + * Threshold to favor readahead over seek. + * This is current internal only, do not use from outside. + */ + int short_seek_threshold; + + /** + * ',' separated list of allowed protocols. + */ + const char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + */ + const char *protocol_blacklist; + + /** + * A callback that is used instead of write_packet. + */ + int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); + /** + * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, + * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly + * small chunks of data returned from the callback). + */ + int ignore_boundary_point; + + /** + * Internal, not meant to be used from outside of AVIOContext. + */ + enum AVIODataMarkerType current_type; + int64_t last_time; + + /** + * A callback that is used instead of short_seek_threshold. + * This is current internal only, do not use from outside. + */ + int (*short_seek_get)(void *opaque); + + int64_t written; + + /** + * Maximum reached position before a backward seek in the write buffer, + * used keeping track of already written data for a later flush. + */ + unsigned char *buf_ptr_max; + + /** + * Try to buffer at least this amount of data before flushing it + */ + int min_packet_size; +} AVIOContext; + +/** + * Return the name of the protocol that will handle the passed URL. + * + * NULL is returned if no protocol could be found for the given URL. + * + * @return Name of the protocol or NULL. + */ +const char *avio_find_protocol_name(const char *url); + +/** + * Return AVIO_FLAG_* access flags corresponding to the access permissions + * of the resource in url, or a negative value corresponding to an + * AVERROR code in case of failure. The returned access flags are + * masked by the value in flags. + * + * @note This function is intrinsically unsafe, in the sense that the + * checked resource may change its existence or permission status from + * one call to another. Thus you should not trust the returned value, + * unless you are sure that no other processes are accessing the + * checked resource. + */ +int avio_check(const char *url, int flags); + +/** + * Move or rename a resource. + * + * @note url_src and url_dst should share the same protocol and authority. + * + * @param url_src url to resource to be moved + * @param url_dst new url to resource if the operation succeeded + * @return >=0 on success or negative on error. + */ +int avpriv_io_move(const char *url_src, const char *url_dst); + +/** + * Delete a resource. + * + * @param url resource to be deleted. + * @return >=0 on success or negative on error. + */ +int avpriv_io_delete(const char *url); + +/** + * Open directory for reading. + * + * @param s directory read context. Pointer to a NULL pointer must be passed. + * @param url directory to be listed. + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dictionary + * containing options that were not found. May be NULL. + * @return >=0 on success or negative on error. + */ +int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); + +/** + * Get next directory entry. + * + * Returned entry must be freed with avio_free_directory_entry(). In particular + * it may outlive AVIODirContext. + * + * @param s directory read context. + * @param[out] next next entry or NULL when no more entries. + * @return >=0 on success or negative on error. End of list is not considered an + * error. + */ +int avio_read_dir(AVIODirContext *s, AVIODirEntry **next); + +/** + * Close directory. + * + * @note Entries created using avio_read_dir() are not deleted and must be + * freeded with avio_free_directory_entry(). + * + * @param s directory read context. + * @return >=0 on success or negative on error. + */ +int avio_close_dir(AVIODirContext **s); + +/** + * Free entry allocated by avio_read_dir(). + * + * @param entry entry to be freed. + */ +void avio_free_directory_entry(AVIODirEntry **entry); + +/** + * Allocate and initialize an AVIOContext for buffered I/O. It must be later + * freed with avio_context_free(). + * + * @param buffer Memory block for input/output operations via AVIOContext. + * The buffer must be allocated with av_malloc() and friends. + * It may be freed and replaced with a new buffer by libavformat. + * AVIOContext.buffer holds the buffer currently in use, + * which must be later freed with av_free(). + * @param buffer_size The buffer size is very important for performance. + * For protocols with fixed blocksize it should be set to this blocksize. + * For others a typical size is a cache page, e.g. 4kb. + * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. + * @param opaque An opaque pointer to user-specific data. + * @param read_packet A function for refilling the buffer, may be NULL. + * @param write_packet A function for writing the buffer contents, may be NULL. + * The function may not change the input buffers content. + * @param seek A function for seeking to specified byte position, may be NULL. + * + * @return Allocated AVIOContext or NULL on failure. + */ +AVIOContext *avio_alloc_context( + unsigned char *buffer, + int buffer_size, + int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + int64_t (*seek)(void *opaque, int64_t offset, int whence)); + +/** + * Free the supplied IO context and everything associated with it. + * + * @param s Double pointer to the IO context. This function will write NULL + * into s. + */ +void avio_context_free(AVIOContext **s); + +void avio_w8(AVIOContext *s, int b); +void avio_write(AVIOContext *s, const unsigned char *buf, int size); +void avio_wl64(AVIOContext *s, uint64_t val); +void avio_wb64(AVIOContext *s, uint64_t val); +void avio_wl32(AVIOContext *s, unsigned int val); +void avio_wb32(AVIOContext *s, unsigned int val); +void avio_wl24(AVIOContext *s, unsigned int val); +void avio_wb24(AVIOContext *s, unsigned int val); +void avio_wl16(AVIOContext *s, unsigned int val); +void avio_wb16(AVIOContext *s, unsigned int val); + +/** + * Write a NULL-terminated string. + * @return number of bytes written. + */ +int avio_put_str(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16LE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16le(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16BE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16be(AVIOContext *s, const char *str); + +/** + * Mark the written bytestream as a specific type. + * + * Zero-length ranges are omitted from the output. + * + * @param time the stream time the current bytestream pos corresponds to + * (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not + * applicable + * @param type the kind of data written starting at the current pos + */ +void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); + +/** + * ORing this as the "whence" parameter to a seek function causes it to + * return the filesize without seeking anywhere. Supporting this is optional. + * If it is not supported then the seek function will return <0. + */ +#define AVSEEK_SIZE 0x10000 + +/** + * Passing this flag as the "whence" parameter to a seek function causes it to + * seek by any means (like reopening and linear reading) or other normally unreasonable + * means that can be extremely slow. + * This may be ignored by the seek code. + */ +#define AVSEEK_FORCE 0x20000 + +/** + * fseek() equivalent for AVIOContext. + * @return new position or AVERROR. + */ +int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); + +/** + * Skip given number of bytes forward + * @return new position or AVERROR. + */ +int64_t avio_skip(AVIOContext *s, int64_t offset); + +/** + * ftell() equivalent for AVIOContext. + * @return position or AVERROR. + */ +static av_always_inline int64_t avio_tell(AVIOContext *s) +{ + return avio_seek(s, 0, SEEK_CUR); +} + +/** + * Get the filesize. + * @return filesize or AVERROR + */ +int64_t avio_size(AVIOContext *s); + +/** + * feof() equivalent for AVIOContext. + * @return non zero if and only if end of file + */ +int avio_feof(AVIOContext *s); +#if FF_API_URL_FEOF +/** + * @deprecated use avio_feof() + */ +attribute_deprecated +int url_feof(AVIOContext *s); +#endif + +/** @warning Writes up to 4 KiB per call */ +int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Force flushing of buffered data. + * + * For write streams, force the buffered data to be immediately written to the output, + * without to wait to fill the internal buffer. + * + * For read streams, discard all currently buffered data, and advance the + * reported file position to that of the underlying stream. This does not + * read new data, and does not perform any seeks. + */ +void avio_flush(AVIOContext *s); + +/** + * Read size bytes from AVIOContext into buf. + * @return number of bytes read or AVERROR + */ +int avio_read(AVIOContext *s, unsigned char *buf, int size); + +/** + * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed + * to read fewer bytes than requested. The missing bytes can be read in the next + * call. This always tries to read at least 1 byte. + * Useful to reduce latency in certain cases. + * @return number of bytes read or AVERROR + */ +int avio_read_partial(AVIOContext *s, unsigned char *buf, int size); + +/** + * @name Functions for reading from AVIOContext + * @{ + * + * @note return 0 if EOF, so you cannot use it if EOF handling is + * necessary + */ +int avio_r8 (AVIOContext *s); +unsigned int avio_rl16(AVIOContext *s); +unsigned int avio_rl24(AVIOContext *s); +unsigned int avio_rl32(AVIOContext *s); +uint64_t avio_rl64(AVIOContext *s); +unsigned int avio_rb16(AVIOContext *s); +unsigned int avio_rb24(AVIOContext *s); +unsigned int avio_rb32(AVIOContext *s); +uint64_t avio_rb64(AVIOContext *s); +/** + * @} + */ + +/** + * Read a string from pb into buf. The reading will terminate when either + * a NULL character was encountered, maxlen bytes have been read, or nothing + * more can be read from pb. The result is guaranteed to be NULL-terminated, it + * will be truncated if buf is too small. + * Note that the string is not interpreted or validated in any way, it + * might get truncated in the middle of a sequence for multi-byte encodings. + * + * @return number of bytes read (is always <= maxlen). + * If reading ends on EOF or error, the return value will be one more than + * bytes actually read. + */ +int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); + +/** + * Read a UTF-16 string from pb and convert it to UTF-8. + * The reading will terminate when either a null or invalid character was + * encountered or maxlen bytes have been read. + * @return number of bytes read (is always <= maxlen) + */ +int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); +int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); + + +/** + * @name URL open modes + * The flags argument to avio_open must be one of the following + * constants, optionally ORed with other flags. + * @{ + */ +#define AVIO_FLAG_READ 1 /**< read-only */ +#define AVIO_FLAG_WRITE 2 /**< write-only */ +#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE) /**< read-write pseudo flag */ +/** + * @} + */ + +/** + * Use non-blocking mode. + * If this flag is set, operations on the context will return + * AVERROR(EAGAIN) if they can not be performed immediately. + * If this flag is not set, operations on the context will never return + * AVERROR(EAGAIN). + * Note that this flag does not affect the opening/connecting of the + * context. Connecting a protocol will always block if necessary (e.g. on + * network protocols) but never hang (e.g. on busy devices). + * Warning: non-blocking protocols is work-in-progress; this flag may be + * silently ignored. + */ +#define AVIO_FLAG_NONBLOCK 8 + +/** + * Use direct mode. + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ +#define AVIO_FLAG_DIRECT 0x8000 + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open(AVIOContext **s, const char *url, int flags); + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @param int_cb an interrupt callback to be used at the protocols level + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dict containing options + * that were not found. May be NULL. + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open2(AVIOContext **s, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * Close the resource accessed by the AVIOContext s and free it. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_closep + */ +int avio_close(AVIOContext *s); + +/** + * Close the resource accessed by the AVIOContext *s, free it + * and set the pointer pointing to it to NULL. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_close + */ +int avio_closep(AVIOContext **s); + + +/** + * Open a write only memory stream. + * + * @param s new IO context + * @return zero if no error. + */ +int avio_open_dyn_buf(AVIOContext **s); + +/** + * Return the written size and a pointer to the buffer. + * The AVIOContext stream is left intact. + * The buffer must NOT be freed. + * No padding is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Return the written size and a pointer to the buffer. The buffer + * must be freed with av_free(). + * Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Iterate through names of available protocols. + * + * @param opaque A private pointer representing current protocol. + * It must be a pointer to NULL on first iteration and will + * be updated by successive calls to avio_enum_protocols. + * @param output If set to 1, iterate over output protocols, + * otherwise over input protocols. + * + * @return A static string containing the name of current protocol or NULL + */ +const char *avio_enum_protocols(void **opaque, int output); + +/** + * Pause and resume playing - only meaningful if using a network streaming + * protocol (e.g. MMS). + * + * @param h IO context from which to call the read_pause function pointer + * @param pause 1 for pause, 0 for resume + */ +int avio_pause(AVIOContext *h, int pause); + +/** + * Seek to a given timestamp relative to some component stream. + * Only meaningful if using a network streaming protocol (e.g. MMS.). + * + * @param h IO context from which to call the seek function pointers + * @param stream_index The stream index that the timestamp is relative to. + * If stream_index is (-1) the timestamp should be in AV_TIME_BASE + * units from the beginning of the presentation. + * If a stream_index >= 0 is used and the protocol does not support + * seeking based on component streams, the call will fail. + * @param timestamp timestamp in AVStream.time_base units + * or if there is no stream specified then in AV_TIME_BASE units. + * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE + * and AVSEEK_FLAG_ANY. The protocol may silently ignore + * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will + * fail if used and not supported. + * @return >= 0 on success + * @see AVInputFormat::read_seek + */ +int64_t avio_seek_time(AVIOContext *h, int stream_index, + int64_t timestamp, int flags); + +/* Avoid a warning. The header can not be included because it breaks c++. */ +struct AVBPrint; + +/** + * Read contents of h into print buffer, up to max_size bytes, or up to EOF. + * + * @return 0 for success (max_size bytes read or EOF reached), negative error + * code otherwise + */ +int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); + +/** + * Accept and allocate a client context on a server context. + * @param s the server context + * @param c the client context, must be unallocated + * @return >= 0 on success or a negative value corresponding + * to an AVERROR on failure + */ +int avio_accept(AVIOContext *s, AVIOContext **c); + +/** + * Perform one step of the protocol handshake to accept a new client. + * This function must be called on a client returned by avio_accept() before + * using it as a read/write context. + * It is separate from avio_accept() because it may block. + * A step of the handshake is defined by places where the application may + * decide to change the proceedings. + * For example, on a protocol with a request header and a reply header, each + * one can constitute a step because the application may use the parameters + * from the request to change parameters in the reply; or each individual + * chunk of the request can constitute a step. + * If the handshake is already finished, avio_handshake() does nothing and + * returns 0 immediately. + * + * @param c the client context to perform the handshake on + * @return 0 on a complete and successful handshake + * > 0 if the handshake progressed, but is not complete + * < 0 for an AVERROR code + */ +int avio_handshake(AVIOContext *c); +#endif /* AVFORMAT_AVIO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/version.h new file mode 100644 index 0000000..878917d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavformat/version.h @@ -0,0 +1,105 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFORMAT_VERSION_H +#define AVFORMAT_VERSION_H + +/** + * @file + * @ingroup libavf + * Libavformat version macros + */ + +#include "libavutil/version.h" + +// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) +// Also please add any ticket numbers that you believe might be affected here +#define LIBAVFORMAT_VERSION_MAJOR 57 +#define LIBAVFORMAT_VERSION_MINOR 83 +#define LIBAVFORMAT_VERSION_MICRO 100 + +#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT + +#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + */ +#ifndef FF_API_LAVF_BITEXACT +#define FF_API_LAVF_BITEXACT (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_FRAC +#define FF_API_LAVF_FRAC (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_CODEC_TB +#define FF_API_LAVF_CODEC_TB (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_URL_FEOF +#define FF_API_URL_FEOF (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_FMT_RAWPICTURE +#define FF_API_LAVF_FMT_RAWPICTURE (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_COMPUTE_PKT_FIELDS2 +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_OLD_OPEN_CALLBACKS +#define FF_API_OLD_OPEN_CALLBACKS (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_AVCTX +#define FF_API_LAVF_AVCTX (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_NOCONST_GET_SIDE_DATA +#define FF_API_NOCONST_GET_SIDE_DATA (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_HTTP_USER_AGENT +#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_HLS_WRAP +#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_MERGE_SD +#define FF_API_LAVF_MERGE_SD (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_LAVF_KEEPSIDE_FLAG +#define FF_API_LAVF_KEEPSIDE_FLAG (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_OLD_ROTATE_API +#define FF_API_OLD_ROTATE_API (LIBAVFORMAT_VERSION_MAJOR < 58) +#endif + + +#ifndef FF_API_R_FRAME_RATE +#define FF_API_R_FRAME_RATE 1 +#endif +#endif /* AVFORMAT_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/adler32.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/adler32.h new file mode 100644 index 0000000..a1f035b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/adler32.h @@ -0,0 +1,60 @@ +/* + * copyright (c) 2006 Mans Rullgard + * + * 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 + * @ingroup lavu_adler32 + * Public header for Adler-32 hash function implementation. + */ + +#ifndef AVUTIL_ADLER32_H +#define AVUTIL_ADLER32_H + +#include +#include "attributes.h" + +/** + * @defgroup lavu_adler32 Adler-32 + * @ingroup lavu_hash + * Adler-32 hash function implementation. + * + * @{ + */ + +/** + * Calculate the Adler32 checksum of a buffer. + * + * Passing the return value to a subsequent av_adler32_update() call + * allows the checksum of multiple buffers to be calculated as though + * they were concatenated. + * + * @param adler initial checksum value + * @param buf pointer to input buffer + * @param len size of input buffer + * @return updated checksum + */ +unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, + unsigned int len) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_ADLER32_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes.h new file mode 100644 index 0000000..09efbda --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes.h @@ -0,0 +1,65 @@ +/* + * copyright (c) 2007 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AES_H +#define AVUTIL_AES_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_aes AES + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_aes_size; + +struct AVAES; + +/** + * Allocate an AVAES context. + */ +struct AVAES *av_aes_alloc(void); + +/** + * Initialize an AVAES context. + * @param key_bits 128, 192 or 256 + * @param decrypt 0 for encryption, 1 for decryption + */ +int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * @param count number of 16 byte blocks + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_AES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes_ctr.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes_ctr.h new file mode 100644 index 0000000..f596fa6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/aes_ctr.h @@ -0,0 +1,83 @@ +/* + * AES-CTR cipher + * Copyright (c) 2015 Eran Kornblau + * + * 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 + */ + +#ifndef AVUTIL_AES_CTR_H +#define AVUTIL_AES_CTR_H + +#include + +#include "attributes.h" +#include "version.h" + +#define AES_CTR_KEY_SIZE (16) +#define AES_CTR_IV_SIZE (8) + +struct AVAESCTR; + +/** + * Allocate an AVAESCTR context. + */ +struct AVAESCTR *av_aes_ctr_alloc(void); + +/** + * Initialize an AVAESCTR context. + * @param key encryption key, must have a length of AES_CTR_KEY_SIZE + */ +int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key); + +/** + * Release an AVAESCTR context. + */ +void av_aes_ctr_free(struct AVAESCTR *a); + +/** + * Process a buffer using a previously initialized context. + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param size the size of src and dst + */ +void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size); + +/** + * Get the current iv + */ +const uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a); + +/** + * Generate a random iv + */ +void av_aes_ctr_set_random_iv(struct AVAESCTR *a); + +/** + * Forcefully change the iv + */ +void av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Increment the top 64 bit of the iv (performed after each frame) + */ +void av_aes_ctr_increment_iv(struct AVAESCTR *a); + +/** + * @} + */ + +#endif /* AVUTIL_AES_CTR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/attributes.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/attributes.h new file mode 100644 index 0000000..54d1901 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/attributes.h @@ -0,0 +1,167 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * Macro definitions for various function/variable attributes + */ + +#ifndef AVUTIL_ATTRIBUTES_H +#define AVUTIL_ATTRIBUTES_H + +#ifdef __GNUC__ +# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) +# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) +#else +# define AV_GCC_VERSION_AT_LEAST(x,y) 0 +# define AV_GCC_VERSION_AT_MOST(x,y) 0 +#endif + +#ifndef av_always_inline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_always_inline __attribute__((always_inline)) inline +#elif defined(_MSC_VER) +# define av_always_inline __forceinline +#else +# define av_always_inline inline +#endif +#endif + +#ifndef av_extern_inline +#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) +# define av_extern_inline extern inline +#else +# define av_extern_inline inline +#endif +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,4) +# define av_warn_unused_result __attribute__((warn_unused_result)) +#else +# define av_warn_unused_result +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_noinline __attribute__((noinline)) +#elif defined(_MSC_VER) +# define av_noinline __declspec(noinline) +#else +# define av_noinline +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_pure __attribute__((pure)) +#else +# define av_pure +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,6) +# define av_const __attribute__((const)) +#else +# define av_const +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,3) +# define av_cold __attribute__((cold)) +#else +# define av_cold +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) +# define av_flatten __attribute__((flatten)) +#else +# define av_flatten +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_deprecated __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define attribute_deprecated __declspec(deprecated) +#else +# define attribute_deprecated +#endif + +/** + * Disable warnings about deprecated features + * This is useful for sections of code kept for backward compatibility and + * scheduled for removal. + */ +#ifndef AV_NOWARN_DEPRECATED +#if AV_GCC_VERSION_AT_LEAST(4,6) +# define AV_NOWARN_DEPRECATED(code) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ + code \ + _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +# define AV_NOWARN_DEPRECATED(code) \ + __pragma(warning(push)) \ + __pragma(warning(disable : 4996)) \ + code; \ + __pragma(warning(pop)) +#else +# define AV_NOWARN_DEPRECATED(code) code +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_unused __attribute__((unused)) +#else +# define av_unused +#endif + +/** + * Mark a variable as used and prevent the compiler from optimizing it + * away. This is useful for variables accessed only from inline + * assembler without the compiler being aware. + */ +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_used __attribute__((used)) +#else +# define av_used +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,3) +# define av_alias __attribute__((may_alias)) +#else +# define av_alias +#endif + +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) +# define av_uninit(x) x=x +#else +# define av_uninit(x) x +#endif + +#ifdef __GNUC__ +# define av_builtin_constant_p __builtin_constant_p +# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) +#else +# define av_builtin_constant_p(x) 0 +# define av_printf_format(fmtpos, attrpos) +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,5) +# define av_noreturn __attribute__((noreturn)) +#else +# define av_noreturn +#endif + +#endif /* AVUTIL_ATTRIBUTES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/audio_fifo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/audio_fifo.h new file mode 100644 index 0000000..d8a9194 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/audio_fifo.h @@ -0,0 +1,187 @@ +/* + * Audio FIFO + * Copyright (c) 2012 Justin Ruggles + * + * 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 + * Audio FIFO Buffer + */ + +#ifndef AVUTIL_AUDIO_FIFO_H +#define AVUTIL_AUDIO_FIFO_H + +#include "avutil.h" +#include "fifo.h" +#include "samplefmt.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_audiofifo Audio FIFO Buffer + * @{ + */ + +/** + * Context for an Audio FIFO Buffer. + * + * - Operates at the sample level rather than the byte level. + * - Supports multiple channels with either planar or packed sample format. + * - Automatic reallocation when writing to a full buffer. + */ +typedef struct AVAudioFifo AVAudioFifo; + +/** + * Free an AVAudioFifo. + * + * @param af AVAudioFifo to free + */ +void av_audio_fifo_free(AVAudioFifo *af); + +/** + * Allocate an AVAudioFifo. + * + * @param sample_fmt sample format + * @param channels number of channels + * @param nb_samples initial allocation size, in samples + * @return newly allocated AVAudioFifo, or NULL on error + */ +AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, + int nb_samples); + +/** + * Reallocate an AVAudioFifo. + * + * @param af AVAudioFifo to reallocate + * @param nb_samples new allocation size, in samples + * @return 0 if OK, or negative AVERROR code on failure + */ +av_warn_unused_result +int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); + +/** + * Write data to an AVAudioFifo. + * + * The AVAudioFifo will be reallocated automatically if the available space + * is less than nb_samples. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to write to + * @param data audio data plane pointers + * @param nb_samples number of samples to write + * @return number of samples actually written, or negative AVERROR + * code on failure. If successful, the number of samples + * actually written will always be nb_samples. + */ +int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @param offset offset from current read position + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset); + +/** + * Read data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to read + * @return number of samples actually read, or negative AVERROR code + * on failure. The number of samples actually read will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Drain data from an AVAudioFifo. + * + * Removes the data without reading it. + * + * @param af AVAudioFifo to drain + * @param nb_samples number of samples to drain + * @return 0 if OK, or negative AVERROR code on failure + */ +int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples); + +/** + * Reset the AVAudioFifo buffer. + * + * This empties all data in the buffer. + * + * @param af AVAudioFifo to reset + */ +void av_audio_fifo_reset(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for reading. + * + * @param af the AVAudioFifo to query + * @return number of samples available for reading + */ +int av_audio_fifo_size(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for writing. + * + * @param af the AVAudioFifo to query + * @return number of samples available for writing + */ +int av_audio_fifo_space(AVAudioFifo *af); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_AUDIO_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avassert.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avassert.h new file mode 100644 index 0000000..46f3fea --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avassert.h @@ -0,0 +1,75 @@ +/* + * copyright (c) 2010 Michael Niedermayer + * + * 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 + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_AVASSERT_H +#define AVUTIL_AVASSERT_H + +#include +#include "avutil.h" +#include "log.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do { \ + if (!(cond)) { \ + av_log(NULL, AV_LOG_PANIC, "Assertion %s failed at %s:%d\n", \ + AV_STRINGIFY(cond), __FILE__, __LINE__); \ + abort(); \ + } \ +} while (0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speed loss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert0(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert0(cond) +#define av_assert2_fpu() av_assert0_fpu() +#else +#define av_assert2(cond) ((void)0) +#define av_assert2_fpu() ((void)0) +#endif + +/** + * Assert that floating point opperations can be executed. + * + * This will av_assert0() that the cpu is not in MMX state on X86 + */ +void av_assert0_fpu(void); + +#endif /* AVUTIL_AVASSERT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avconfig.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avconfig.h new file mode 100644 index 0000000..f10aa61 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avconfig.h @@ -0,0 +1,6 @@ +/* Generated by ffconf */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +#define AV_HAVE_BIGENDIAN 0 +#define AV_HAVE_FAST_UNALIGNED 1 +#endif /* AVUTIL_AVCONFIG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avstring.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avstring.h new file mode 100644 index 0000000..04d2695 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avstring.h @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2007 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_AVSTRING_H +#define AVUTIL_AVSTRING_H + +#include +#include +#include "attributes.h" + +/** + * @addtogroup lavu_string + * @{ + */ + +/** + * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to + * the address of the first character in str after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_strstart(const char *str, const char *pfx, const char **ptr); + +/** + * Return non-zero if pfx is a prefix of str independent of case. If + * it is, *ptr is set to the address of the first character in str + * after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_stristart(const char *str, const char *pfx, const char **ptr); + +/** + * Locate the first case-independent occurrence in the string haystack + * of the string needle. A zero-length string needle is considered to + * match at the start of haystack. + * + * This function is a case-insensitive version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_stristr(const char *haystack, const char *needle); + +/** + * Locate the first occurrence of the string needle in the string haystack + * where not more than hay_length characters are searched. A zero-length + * string needle is considered to match at the start of haystack. + * + * This function is a length-limited version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @param hay_length length of string to search in + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_strnstr(const char *haystack, const char *needle, size_t hay_length); + +/** + * Copy the string src to dst, but no more than size - 1 bytes, and + * null-terminate dst. + * + * This function is the same as BSD strlcpy(). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the length of src + * + * @warning since the return value is the length of src, src absolutely + * _must_ be a properly 0-terminated string, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcpy(char *dst, const char *src, size_t size); + +/** + * Append the string src to the string dst, but to a total length of + * no more than size - 1 bytes, and null-terminate dst. + * + * This function is similar to BSD strlcat(), but differs when + * size <= strlen(dst). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the total length of src and dst + * + * @warning since the return value use the length of src and dst, these + * absolutely _must_ be a properly 0-terminated strings, otherwise this + * will read beyond the end of the buffer and possibly crash. + */ +size_t av_strlcat(char *dst, const char *src, size_t size); + +/** + * Append output to a string, according to a format. Never write out of + * the destination buffer, and always put a terminating 0 within + * the buffer. + * @param dst destination buffer (string to which the output is + * appended) + * @param size total size of the destination buffer + * @param fmt printf-compatible format string, specifying how the + * following parameters are used + * @return the length of the string that would have been generated + * if enough space had been available + */ +size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4); + +/** + * Get the count of continuous non zero chars starting from the beginning. + * + * @param len maximum number of characters to check in the string, that + * is the maximum value which is returned by the function + */ +static inline size_t av_strnlen(const char *s, size_t len) +{ + size_t i; + for (i = 0; i < len && s[i]; i++) + ; + return i; +} + +/** + * Print arguments following specified format into a large enough auto + * allocated buffer. It is similar to GNU asprintf(). + * @param fmt printf-compatible format string, specifying how the + * following parameters are used. + * @return the allocated string + * @note You have to free the string yourself with av_free(). + */ +char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); + +/** + * Convert a number to an av_malloced string. + */ +char *av_d2str(double d); + +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + +/** + * Split the string into several tokens which can be accessed by + * successive calls to av_strtok(). + * + * A token is defined as a sequence of characters not belonging to the + * set specified in delim. + * + * On the first call to av_strtok(), s should point to the string to + * parse, and the value of saveptr is ignored. In subsequent calls, s + * should be NULL, and saveptr should be unchanged since the previous + * call. + * + * This function is similar to strtok_r() defined in POSIX.1. + * + * @param s the string to parse, may be NULL + * @param delim 0-terminated list of token delimiters, must be non-NULL + * @param saveptr user-provided pointer which points to stored + * information necessary for av_strtok() to continue scanning the same + * string. saveptr is updated to point to the next character after the + * first delimiter found, or to NULL if the string was terminated + * @return the found token, or NULL when no token is found + */ +char *av_strtok(char *s, const char *delim, char **saveptr); + +/** + * Locale-independent conversion of ASCII isdigit. + */ +static inline av_const int av_isdigit(int c) +{ + return c >= '0' && c <= '9'; +} + +/** + * Locale-independent conversion of ASCII isgraph. + */ +static inline av_const int av_isgraph(int c) +{ + return c > 32 && c < 127; +} + +/** + * Locale-independent conversion of ASCII isspace. + */ +static inline av_const int av_isspace(int c) +{ + return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || + c == '\v'; +} + +/** + * Locale-independent conversion of ASCII characters to uppercase. + */ +static inline av_const int av_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII characters to lowercase. + */ +static inline av_const int av_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII isxdigit. + */ +static inline av_const int av_isxdigit(int c) +{ + c = av_tolower(c); + return av_isdigit(c) || (c >= 'a' && c <= 'f'); +} + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strcasecmp(const char *a, const char *b); + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strncasecmp(const char *a, const char *b, size_t n); + +/** + * Locale-independent strings replace. + * @note This means only ASCII-range characters are replace + */ +char *av_strireplace(const char *str, const char *from, const char *to); + +/** + * Thread safe basename. + * @param path the path, on DOS both \ and / are considered separators. + * @return pointer to the basename substring. + */ +const char *av_basename(const char *path); + +/** + * Thread safe dirname. + * @param path the path, on DOS both \ and / are considered separators. + * @return the path with the separator replaced by the string terminator or ".". + * @note the function may change the input string. + */ +const char *av_dirname(char *path); + +/** + * Match instances of a name in a comma-separated list of names. + * List entries are checked from the start to the end of the names list, + * the first match ends further processing. If an entry prefixed with '-' + * matches, then 0 is returned. The "ALL" list entry is considered to + * match all names. + * + * @param name Name to look for. + * @param names List of names. + * @return 1 on match, 0 otherwise. + */ +int av_match_name(const char *name, const char *names); + +/** + * Append path component to the existing path. + * Path separator '/' is placed between when needed. + * Resulting string have to be freed with av_free(). + * @param path base path + * @param component component to be appended + * @return new path or NULL on error. + */ +char *av_append_path_component(const char *path, const char *component); + +enum AVEscapeMode { + AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. + AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. + AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. +}; + +/** + * Consider spaces special and escape them even in the middle of the + * string. + * + * This is equivalent to adding the whitespace characters to the special + * characters lists, except it is guaranteed to use the exact same list + * of whitespace characters as the rest of libavutil. + */ +#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0) + +/** + * Escape only specified special characters. + * Without this flag, escape also any characters that may be considered + * special by av_get_token(), such as the single quote. + */ +#define AV_ESCAPE_FLAG_STRICT (1 << 1) + +/** + * Escape string in src, and put the escaped string in an allocated + * string in *dst, which must be freed with av_free(). + * + * @param dst pointer where an allocated string is put + * @param src string to escape, must be non-NULL + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_ macros + * @return the length of the allocated string, or a negative error code in case of error + * @see av_bprint_escape() + */ +av_warn_unused_result +int av_escape(char **dst, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES 1 ///< accept codepoints over 0x10FFFF +#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS 2 ///< accept non-characters - 0xFFFE and 0xFFFF +#define AV_UTF8_FLAG_ACCEPT_SURROGATES 4 ///< accept UTF-16 surrogates codes +#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML + +#define AV_UTF8_FLAG_ACCEPT_ALL \ + AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES + +/** + * Read and decode a single UTF-8 code point (character) from the + * buffer in *buf, and update *buf to point to the next byte to + * decode. + * + * In case of an invalid byte sequence, the pointer will be updated to + * the next byte after the invalid sequence and the function will + * return an error code. + * + * Depending on the specified flags, the function will also fail in + * case the decoded code point does not belong to a valid range. + * + * @note For speed-relevant code a carefully implemented use of + * GET_UTF8() may be preferred. + * + * @param codep pointer used to return the parsed code in case of success. + * The value in *codep is set even in case the range check fails. + * @param bufp pointer to the address the first byte of the sequence + * to decode, updated by the function to point to the + * byte next after the decoded sequence + * @param buf_end pointer to the end of the buffer, points to the next + * byte past the last in the buffer. This is used to + * avoid buffer overreads (in case of an unfinished + * UTF-8 sequence towards the end of the buffer). + * @param flags a collection of AV_UTF8_FLAG_* flags + * @return >= 0 in case a sequence was successfully read, a negative + * value in case of invalid sequence + */ +av_warn_unused_result +int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, + unsigned int flags); + +/** + * Check if a name is in a list. + * @returns 0 if not found, or the 1 based index where it has been found in the + * list. + */ +int av_match_list(const char *name, const char *list, char separator); + +/** + * @} + */ + +#endif /* AVUTIL_AVSTRING_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avutil.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avutil.h new file mode 100644 index 0000000..4d63315 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/avutil.h @@ -0,0 +1,365 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AVUTIL_H +#define AVUTIL_AVUTIL_H + +/** + * @file + * @ingroup lavu + * Convenience header that includes @ref lavu "libavutil"'s core. + */ + +/** + * @mainpage + * + * @section ffmpeg_intro Introduction + * + * This document describes the usage of the different libraries + * provided by FFmpeg. + * + * @li @ref libavc "libavcodec" encoding/decoding library + * @li @ref lavfi "libavfilter" graph-based frame editing library + * @li @ref libavf "libavformat" I/O and muxing/demuxing library + * @li @ref lavd "libavdevice" special devices muxing/demuxing library + * @li @ref lavu "libavutil" common utility library + * @li @ref lswr "libswresample" audio resampling, format conversion and mixing + * @li @ref lpp "libpostproc" post processing library + * @li @ref libsws "libswscale" color conversion and scaling library + * + * @section ffmpeg_versioning Versioning and compatibility + * + * Each of the FFmpeg libraries contains a version.h header, which defines a + * major, minor and micro version number with the + * LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version + * number is incremented with backward incompatible changes - e.g. removing + * parts of the public API, reordering public struct members, etc. The minor + * version number is incremented for backward compatible API changes or major + * new features - e.g. adding a new public function or a new decoder. The micro + * version number is incremented for smaller changes that a calling program + * might still want to check for - e.g. changing behavior in a previously + * unspecified situation. + * + * FFmpeg guarantees backward API and ABI compatibility for each library as long + * as its major version number is unchanged. This means that no public symbols + * will be removed or renamed. Types and names of the public struct members and + * values of public macros and enums will remain the same (unless they were + * explicitly declared as not part of the public API). Documented behavior will + * not change. + * + * In other words, any correct program that works with a given FFmpeg snapshot + * should work just as well without any changes with any later snapshot with the + * same major versions. This applies to both rebuilding the program against new + * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program + * links against. + * + * However, new public symbols may be added and new members may be appended to + * public structs whose size is not part of public ABI (most public structs in + * FFmpeg). New macros and enum values may be added. Behavior in undocumented + * situations may change slightly (and be documented). All those are accompanied + * by an entry in doc/APIchanges and incrementing either the minor or micro + * version number. + */ + +/** + * @defgroup lavu libavutil + * Common code shared across all FFmpeg libraries. + * + * @note + * libavutil is designed to be modular. In most cases, in order to use the + * functions provided by one component of libavutil you must explicitly include + * the specific header containing that feature. If you are only using + * media-related components, you could simply include libavutil/avutil.h, which + * brings in most of the "core" components. + * + * @{ + * + * @defgroup lavu_crypto Crypto and Hashing + * + * @{ + * @} + * + * @defgroup lavu_math Mathematics + * @{ + * + * @} + * + * @defgroup lavu_string String Manipulation + * + * @{ + * + * @} + * + * @defgroup lavu_mem Memory Management + * + * @{ + * + * @} + * + * @defgroup lavu_data Data Structures + * @{ + * + * @} + * + * @defgroup lavu_video Video related + * + * @{ + * + * @} + * + * @defgroup lavu_audio Audio related + * + * @{ + * + * @} + * + * @defgroup lavu_error Error Codes + * + * @{ + * + * @} + * + * @defgroup lavu_log Logging Facility + * + * @{ + * + * @} + * + * @defgroup lavu_misc Other + * + * @{ + * + * @defgroup preproc_misc Preprocessor String Macros + * + * @{ + * + * @} + * + * @defgroup version_utils Library Version Macros + * + * @{ + * + * @} + */ + + +/** + * @addtogroup lavu_ver + * @{ + */ + +/** + * Return the LIBAVUTIL_VERSION_INT constant. + */ +unsigned avutil_version(void); + +/** + * Return an informative version string. This usually is the actual release + * version number or a git commit description. This string has no fixed format + * and can change any time. It should never be parsed by code. + */ +const char *av_version_info(void); + +/** + * Return the libavutil build-time configuration. + */ +const char *avutil_configuration(void); + +/** + * Return the libavutil license. + */ +const char *avutil_license(void); + +/** + * @} + */ + +/** + * @addtogroup lavu_media Media Type + * @brief Media Type + */ + +enum AVMediaType { + AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA + AVMEDIA_TYPE_VIDEO, + AVMEDIA_TYPE_AUDIO, + AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous + AVMEDIA_TYPE_SUBTITLE, + AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse + AVMEDIA_TYPE_NB +}; + +/** + * Return a string describing the media_type enum, NULL if media_type + * is unknown. + */ +const char *av_get_media_type_string(enum AVMediaType media_type); + +/** + * @defgroup lavu_const Constants + * @{ + * + * @defgroup lavu_enc Encoding specific + * + * @note those definition should move to avcodec + * @{ + */ + +#define FF_LAMBDA_SHIFT 7 +#define FF_LAMBDA_SCALE (1< + +/** + * @defgroup lavu_base64 Base64 + * @ingroup lavu_crypto + * @{ + */ + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in)) + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Calculate the output size in bytes needed to decode a base64 string + * with length x to a data buffer. + */ +#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4) + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the out buffer (including the + * null terminator), must be at least AV_BASE64_SIZE(in_size) + * @param in input buffer containing the data to encode + * @param in_size size in bytes of the in buffer + * @return out or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes to a + * null-terminated string. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + + /** + * @} + */ + +#endif /* AVUTIL_BASE64_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/blowfish.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/blowfish.h new file mode 100644 index 0000000..9e289a4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/blowfish.h @@ -0,0 +1,82 @@ +/* + * Blowfish algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_BLOWFISH_H +#define AVUTIL_BLOWFISH_H + +#include + +/** + * @defgroup lavu_blowfish Blowfish + * @ingroup lavu_crypto + * @{ + */ + +#define AV_BF_ROUNDS 16 + +typedef struct AVBlowfish { + uint32_t p[AV_BF_ROUNDS + 2]; + uint32_t s[4][256]; +} AVBlowfish; + +/** + * Allocate an AVBlowfish context. + */ +AVBlowfish *av_blowfish_alloc(void); + +/** + * Initialize an AVBlowfish context. + * + * @param ctx an AVBlowfish context + * @param key a key + * @param key_len length of the key + */ +void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param xl left four bytes halves of input to be encrypted + * @param xr right four bytes halves of input to be encrypted + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_BLOWFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bprint.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bprint.h new file mode 100644 index 0000000..c09b1ac --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bprint.h @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2012 Nicolas George + * + * 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 + */ + +#ifndef AVUTIL_BPRINT_H +#define AVUTIL_BPRINT_H + +#include + +#include "attributes.h" +#include "avstring.h" + +/** + * Define a structure with extra padding to a fixed size + * This helps ensuring binary compatibility with future versions. + */ + +#define FF_PAD_STRUCTURE(name, size, ...) \ +struct ff_pad_helper_##name { __VA_ARGS__ }; \ +typedef struct name { \ + __VA_ARGS__ \ + char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \ +} name; + +/** + * Buffer to print data progressively + * + * The string buffer grows as necessary and is always 0-terminated. + * The content of the string is never accessed, and thus is + * encoding-agnostic and can even hold binary data. + * + * Small buffers are kept in the structure itself, and thus require no + * memory allocation at all (unless the contents of the buffer is needed + * after the structure goes out of scope). This is almost as lightweight as + * declaring a local "char buf[512]". + * + * The length of the string can go beyond the allocated size: the buffer is + * then truncated, but the functions still keep account of the actual total + * length. + * + * In other words, buf->len can be greater than buf->size and records the + * total length of what would have been to the buffer if there had been + * enough memory. + * + * Append operations do not need to be tested for failure: if a memory + * allocation fails, data stop being appended to the buffer, but the length + * is still updated. This situation can be tested with + * av_bprint_is_complete(). + * + * The size_max field determines several possible behaviours: + * + * size_max = -1 (= UINT_MAX) or any large value will let the buffer be + * reallocated as necessary, with an amortized linear cost. + * + * size_max = 0 prevents writing anything to the buffer: only the total + * length is computed. The write operations can then possibly be repeated in + * a buffer with exactly the necessary size + * (using size_init = size_max = len + 1). + * + * size_max = 1 is automatically replaced by the exact size available in the + * structure itself, thus ensuring no dynamic memory allocation. The + * internal buffer is large enough to hold a reasonable paragraph of text, + * such as the current paragraph. + */ + +FF_PAD_STRUCTURE(AVBPrint, 1024, + char *str; /**< string so far */ + unsigned len; /**< length so far */ + unsigned size; /**< allocated memory */ + unsigned size_max; /**< maximum allocated memory */ + char reserved_internal_buffer[1]; +) + +/** + * Convenience macros for special values for av_bprint_init() size_max + * parameter. + */ +#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1) +#define AV_BPRINT_SIZE_AUTOMATIC 1 +#define AV_BPRINT_SIZE_COUNT_ONLY 0 + +/** + * Init a print buffer. + * + * @param buf buffer to init + * @param size_init initial size (including the final 0) + * @param size_max maximum size; + * 0 means do not write anything, just count the length; + * 1 is replaced by the maximum value for automatic storage; + * any large value means that the internal buffer will be + * reallocated as needed up to that limit; -1 is converted to + * UINT_MAX, the largest limit possible. + * Check also AV_BPRINT_SIZE_* macros. + */ +void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max); + +/** + * Init a print buffer using a pre-existing buffer. + * + * The buffer will not be reallocated. + * + * @param buf buffer structure to init + * @param buffer byte buffer to use for the string data + * @param size size of buffer + */ +void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size); + +/** + * Append a formatted string to a print buffer. + */ +void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Append a formatted string to a print buffer. + */ +void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg); + +/** + * Append char c n times to a print buffer. + */ +void av_bprint_chars(AVBPrint *buf, char c, unsigned n); + +/** + * Append data to a print buffer. + * + * param buf bprint buffer to use + * param data pointer to data + * param size size of data + */ +void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size); + +struct tm; +/** + * Append a formatted date and time to a print buffer. + * + * param buf bprint buffer to use + * param fmt date and time format string, see strftime() + * param tm broken-down time structure to translate + * + * @note due to poor design of the standard strftime function, it may + * produce poor results if the format string expands to a very long text and + * the bprint buffer is near the limit stated by the size_max option. + */ +void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm); + +/** + * Allocate bytes in the buffer for external use. + * + * @param[in] buf buffer structure + * @param[in] size required size + * @param[out] mem pointer to the memory area + * @param[out] actual_size size of the memory area after allocation; + * can be larger or smaller than size + */ +void av_bprint_get_buffer(AVBPrint *buf, unsigned size, + unsigned char **mem, unsigned *actual_size); + +/** + * Reset the string to "" but keep internal allocated data. + */ +void av_bprint_clear(AVBPrint *buf); + +/** + * Test if the print buffer is complete (not truncated). + * + * It may have been truncated due to a memory allocation failure + * or the size_max limit (compare size and size_max if necessary). + */ +static inline int av_bprint_is_complete(const AVBPrint *buf) +{ + return buf->len < buf->size; +} + +/** + * Finalize a print buffer. + * + * The print buffer can no longer be used afterwards, + * but the len and size fields are still valid. + * + * @arg[out] ret_str if not NULL, used to return a permanent copy of the + * buffer contents, or NULL if memory allocation fails; + * if NULL, the buffer is discarded and freed + * @return 0 for success or error code (probably AVERROR(ENOMEM)) + */ +int av_bprint_finalize(AVBPrint *buf, char **ret_str); + +/** + * Escape the content in src and append it to dstbuf. + * + * @param dstbuf already inited destination bprint buffer + * @param src string containing the text to escape + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_* macros + */ +void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#endif /* AVUTIL_BPRINT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bswap.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bswap.h new file mode 100644 index 0000000..91cb795 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/bswap.h @@ -0,0 +1,109 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * byte swapping routines + */ + +#ifndef AVUTIL_BSWAP_H +#define AVUTIL_BSWAP_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_AARCH64 +# include "aarch64/bswap.h" +#elif ARCH_ARM +# include "arm/bswap.h" +#elif ARCH_AVR32 +# include "avr32/bswap.h" +#elif ARCH_SH4 +# include "sh4/bswap.h" +#elif ARCH_X86 +# include "x86/bswap.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + +#ifndef av_bswap16 +static av_always_inline av_const uint16_t av_bswap16(uint16_t x) +{ + x= (x>>8) | (x<<8); + return x; +} +#endif + +#ifndef av_bswap32 +static av_always_inline av_const uint32_t av_bswap32(uint32_t x) +{ + return AV_BSWAP32C(x); +} +#endif + +#ifndef av_bswap64 +static inline uint64_t av_const av_bswap64(uint64_t x) +{ + return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32); +} +#endif + +// be2ne ... big-endian to native-endian +// le2ne ... little-endian to native-endian + +#if AV_HAVE_BIGENDIAN +#define av_be2ne16(x) (x) +#define av_be2ne32(x) (x) +#define av_be2ne64(x) (x) +#define av_le2ne16(x) av_bswap16(x) +#define av_le2ne32(x) av_bswap32(x) +#define av_le2ne64(x) av_bswap64(x) +#define AV_BE2NEC(s, x) (x) +#define AV_LE2NEC(s, x) AV_BSWAPC(s, x) +#else +#define av_be2ne16(x) av_bswap16(x) +#define av_be2ne32(x) av_bswap32(x) +#define av_be2ne64(x) av_bswap64(x) +#define av_le2ne16(x) (x) +#define av_le2ne32(x) (x) +#define av_le2ne64(x) (x) +#define AV_BE2NEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2NEC(s, x) (x) +#endif + +#define AV_BE2NE16C(x) AV_BE2NEC(16, x) +#define AV_BE2NE32C(x) AV_BE2NEC(32, x) +#define AV_BE2NE64C(x) AV_BE2NEC(64, x) +#define AV_LE2NE16C(x) AV_LE2NEC(16, x) +#define AV_LE2NE32C(x) AV_LE2NEC(32, x) +#define AV_LE2NE64C(x) AV_LE2NEC(64, x) + +#endif /* AVUTIL_BSWAP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/buffer.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/buffer.h new file mode 100644 index 0000000..73b6bd0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/buffer.h @@ -0,0 +1,291 @@ +/* + * 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 + * @ingroup lavu_buffer + * refcounted data buffer API + */ + +#ifndef AVUTIL_BUFFER_H +#define AVUTIL_BUFFER_H + +#include + +/** + * @defgroup lavu_buffer AVBuffer + * @ingroup lavu_data + * + * @{ + * AVBuffer is an API for reference-counted data buffers. + * + * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer + * represents the data buffer itself; it is opaque and not meant to be accessed + * by the caller directly, but only through AVBufferRef. However, the caller may + * e.g. compare two AVBuffer pointers to check whether two different references + * are describing the same data buffer. AVBufferRef represents a single + * reference to an AVBuffer and it is the object that may be manipulated by the + * caller directly. + * + * There are two functions provided for creating a new AVBuffer with a single + * reference -- av_buffer_alloc() to just allocate a new buffer, and + * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing + * reference, additional references may be created with av_buffer_ref(). + * Use av_buffer_unref() to free a reference (this will automatically free the + * data once all the references are freed). + * + * The convention throughout this API and the rest of FFmpeg is such that the + * buffer is considered writable if there exists only one reference to it (and + * it has not been marked as read-only). The av_buffer_is_writable() function is + * provided to check whether this is true and av_buffer_make_writable() will + * automatically create a new writable buffer when necessary. + * Of course nothing prevents the calling code from violating this convention, + * however that is safe only when all the existing references are under its + * control. + * + * @note Referencing and unreferencing the buffers is thread-safe and thus + * may be done from multiple threads simultaneously without any need for + * additional locking. + * + * @note Two different references to the same buffer can point to different + * parts of the buffer (i.e. their AVBufferRef.data will not be equal). + */ + +/** + * A reference counted buffer type. It is opaque and is meant to be used through + * references (AVBufferRef). + */ +typedef struct AVBuffer AVBuffer; + +/** + * A reference to a data buffer. + * + * The size of this struct is not a part of the public ABI and it is not meant + * to be allocated directly. + */ +typedef struct AVBufferRef { + AVBuffer *buffer; + + /** + * The data buffer. It is considered writable if and only if + * this is the only reference to the buffer, in which case + * av_buffer_is_writable() returns 1. + */ + uint8_t *data; + /** + * Size of data in bytes. + */ + int size; +} AVBufferRef; + +/** + * Allocate an AVBuffer of the given size using av_malloc(). + * + * @return an AVBufferRef of given size or NULL when out of memory + */ +AVBufferRef *av_buffer_alloc(int size); + +/** + * Same as av_buffer_alloc(), except the returned buffer will be initialized + * to zero. + */ +AVBufferRef *av_buffer_allocz(int size); + +/** + * Always treat the buffer as read-only, even when it has only one + * reference. + */ +#define AV_BUFFER_FLAG_READONLY (1 << 0) + +/** + * Create an AVBuffer from an existing array. + * + * If this function is successful, data is owned by the AVBuffer. The caller may + * only access data through the returned AVBufferRef and references derived from + * it. + * If this function fails, data is left untouched. + * @param data data array + * @param size size of data in bytes + * @param free a callback for freeing this buffer's data + * @param opaque parameter to be got for processing or passed to free + * @param flags a combination of AV_BUFFER_FLAG_* + * + * @return an AVBufferRef referring to data on success, NULL on failure. + */ +AVBufferRef *av_buffer_create(uint8_t *data, int size, + void (*free)(void *opaque, uint8_t *data), + void *opaque, int flags); + +/** + * Default free callback, which calls av_free() on the buffer data. + * This function is meant to be passed to av_buffer_create(), not called + * directly. + */ +void av_buffer_default_free(void *opaque, uint8_t *data); + +/** + * Create a new reference to an AVBuffer. + * + * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on + * failure. + */ +AVBufferRef *av_buffer_ref(AVBufferRef *buf); + +/** + * Free a given reference and automatically free the buffer if there are no more + * references to it. + * + * @param buf the reference to be freed. The pointer is set to NULL on return. + */ +void av_buffer_unref(AVBufferRef **buf); + +/** + * @return 1 if the caller may write to the data referred to by buf (which is + * true if and only if buf is the only reference to the underlying AVBuffer). + * Return 0 otherwise. + * A positive answer is valid until av_buffer_ref() is called on buf. + */ +int av_buffer_is_writable(const AVBufferRef *buf); + +/** + * @return the opaque parameter set by av_buffer_create. + */ +void *av_buffer_get_opaque(const AVBufferRef *buf); + +int av_buffer_get_ref_count(const AVBufferRef *buf); + +/** + * Create a writable reference from a given buffer reference, avoiding data copy + * if possible. + * + * @param buf buffer reference to make writable. On success, buf is either left + * untouched, or it is unreferenced and a new writable AVBufferRef is + * written in its place. On failure, buf is left untouched. + * @return 0 on success, a negative AVERROR on failure. + */ +int av_buffer_make_writable(AVBufferRef **buf); + +/** + * Reallocate a given buffer. + * + * @param buf a buffer reference to reallocate. On success, buf will be + * unreferenced and a new reference with the required size will be + * written in its place. On failure buf will be left untouched. *buf + * may be NULL, then a new buffer is allocated. + * @param size required new buffer size. + * @return 0 on success, a negative AVERROR on failure. + * + * @note the buffer is actually reallocated with av_realloc() only if it was + * initially allocated through av_buffer_realloc(NULL) and there is only one + * reference to it (i.e. the one passed to this function). In all other cases + * a new buffer is allocated and the data is copied. + */ +int av_buffer_realloc(AVBufferRef **buf, int size); + +/** + * @} + */ + +/** + * @defgroup lavu_bufferpool AVBufferPool + * @ingroup lavu_data + * + * @{ + * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. + * + * Frequently allocating and freeing large buffers may be slow. AVBufferPool is + * meant to solve this in cases when the caller needs a set of buffers of the + * same size (the most obvious use case being buffers for raw video or audio + * frames). + * + * At the beginning, the user must call av_buffer_pool_init() to create the + * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to + * get a reference to a new buffer, similar to av_buffer_alloc(). This new + * reference works in all aspects the same way as the one created by + * av_buffer_alloc(). However, when the last reference to this buffer is + * unreferenced, it is returned to the pool instead of being freed and will be + * reused for subsequent av_buffer_pool_get() calls. + * + * When the caller is done with the pool and no longer needs to allocate any new + * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. + * Once all the buffers are released, it will automatically be freed. + * + * Allocating and releasing buffers with this API is thread-safe as long as + * either the default alloc callback is used, or the user-supplied one is + * thread-safe. + */ + +/** + * The buffer pool. This structure is opaque and not meant to be accessed + * directly. It is allocated with av_buffer_pool_init() and freed with + * av_buffer_pool_uninit(). + */ +typedef struct AVBufferPool AVBufferPool; + +/** + * Allocate and initialize a buffer pool. + * + * @param size size of each buffer in this pool + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. May be NULL, then the default allocator will be used + * (av_buffer_alloc()). + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); + +/** + * Allocate and initialize a buffer pool with a more complex allocator. + * + * @param size size of each buffer in this pool + * @param opaque arbitrary user data used by the allocator + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. + * @param pool_free a function that will be called immediately before the pool + * is freed. I.e. after av_buffer_pool_uninit() is called + * by the caller and all the frames are returned to the pool + * and freed. It is intended to uninitialize the user opaque + * data. + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init2(int size, void *opaque, + AVBufferRef* (*alloc)(void *opaque, int size), + void (*pool_free)(void *opaque)); + +/** + * Mark the pool as being available for freeing. It will actually be freed only + * once all the allocated buffers associated with the pool are released. Thus it + * is safe to call this function while some of the allocated buffers are still + * in use. + * + * @param pool pointer to the pool to be freed. It will be set to NULL. + */ +void av_buffer_pool_uninit(AVBufferPool **pool); + +/** + * Allocate a new AVBuffer, reusing an old buffer from the pool when available. + * This function may be called simultaneously from multiple threads. + * + * @return a reference to the new buffer on success, NULL on error. + */ +AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); + +/** + * @} + */ + +#endif /* AVUTIL_BUFFER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/camellia.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/camellia.h new file mode 100644 index 0000000..e674c9b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/camellia.h @@ -0,0 +1,70 @@ +/* + * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAMELLIA_H +#define AVUTIL_CAMELLIA_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAMELLIA algorithm + * @defgroup lavu_camellia CAMELLIA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_camellia_size; + +struct AVCAMELLIA; + +/** + * Allocate an AVCAMELLIA context + * To free the struct: av_free(ptr) + */ +struct AVCAMELLIA *av_camellia_alloc(void); + +/** + * Initialize an AVCAMELLIA context. + * + * @param ctx an AVCAMELLIA context + * @param key a key of 16, 24, 32 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 128, 192, 256 + */ +int av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAMELLIA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_CAMELLIA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cast5.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cast5.h new file mode 100644 index 0000000..ad5b347 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cast5.h @@ -0,0 +1,80 @@ +/* + * An implementation of the CAST128 algorithm as mentioned in RFC2144 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAST5_H +#define AVUTIL_CAST5_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAST5 algorithm + * @defgroup lavu_cast5 CAST5 + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_cast5_size; + +struct AVCAST5; + +/** + * Allocate an AVCAST5 context + * To free the struct: av_free(ptr) + */ +struct AVCAST5 *av_cast5_alloc(void); +/** + * Initialize an AVCAST5 context. + * + * @param ctx an AVCAST5 context + * @param key a key of 5,6,...16 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 40,48,...,128 + * @return 0 on success, less than 0 on failure + */ +int av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * @} + */ +#endif /* AVUTIL_CAST5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/channel_layout.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/channel_layout.h new file mode 100644 index 0000000..50bb8f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/channel_layout.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2006 Michael Niedermayer + * Copyright (c) 2008 Peter Ross + * + * 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 + */ + +#ifndef AVUTIL_CHANNEL_LAYOUT_H +#define AVUTIL_CHANNEL_LAYOUT_H + +#include + +/** + * @file + * audio channel layout utility functions + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup channel_masks Audio channel masks + * + * A channel layout is a 64-bits integer with a bit set for every channel. + * The number of bits set must be equal to the number of channels. + * The value 0 means that the channel layout is not known. + * @note this data structure is not powerful enough to handle channels + * combinations that have the same channel multiple times, such as + * dual-mono. + * + * @{ + */ +#define AV_CH_FRONT_LEFT 0x00000001 +#define AV_CH_FRONT_RIGHT 0x00000002 +#define AV_CH_FRONT_CENTER 0x00000004 +#define AV_CH_LOW_FREQUENCY 0x00000008 +#define AV_CH_BACK_LEFT 0x00000010 +#define AV_CH_BACK_RIGHT 0x00000020 +#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 +#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 +#define AV_CH_BACK_CENTER 0x00000100 +#define AV_CH_SIDE_LEFT 0x00000200 +#define AV_CH_SIDE_RIGHT 0x00000400 +#define AV_CH_TOP_CENTER 0x00000800 +#define AV_CH_TOP_FRONT_LEFT 0x00001000 +#define AV_CH_TOP_FRONT_CENTER 0x00002000 +#define AV_CH_TOP_FRONT_RIGHT 0x00004000 +#define AV_CH_TOP_BACK_LEFT 0x00008000 +#define AV_CH_TOP_BACK_CENTER 0x00010000 +#define AV_CH_TOP_BACK_RIGHT 0x00020000 +#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. +#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. +#define AV_CH_WIDE_LEFT 0x0000000080000000ULL +#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL +#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL +#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL +#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL + +/** Channel mask value used for AVCodecContext.request_channel_layout + to indicate that the user requests the channel order of the decoder output + to be the native codec channel order. */ +#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL + +/** + * @} + * @defgroup channel_mask_c Audio channel layouts + * @{ + * */ +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) +#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) + +enum AVMatrixEncoding { + AV_MATRIX_ENCODING_NONE, + AV_MATRIX_ENCODING_DOLBY, + AV_MATRIX_ENCODING_DPLII, + AV_MATRIX_ENCODING_DPLIIX, + AV_MATRIX_ENCODING_DPLIIZ, + AV_MATRIX_ENCODING_DOLBYEX, + AV_MATRIX_ENCODING_DOLBYHEADPHONE, + AV_MATRIX_ENCODING_NB +}; + +/** + * Return a channel layout id that matches name, or 0 if no match is found. + * + * name can be one or several of the following notations, + * separated by '+' or '|': + * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, + * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); + * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, + * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); + * - a number of channels, in decimal, followed by 'c', yielding + * the default channel layout for that number of channels (@see + * av_get_default_channel_layout); + * - a channel layout mask, in hexadecimal starting with "0x" (see the + * AV_CH_* macros). + * + * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" + */ +uint64_t av_get_channel_layout(const char *name); + +/** + * Return a channel layout and the number of channels based on the specified name. + * + * This function is similar to (@see av_get_channel_layout), but can also parse + * unknown channel layout specifications. + * + * @param[in] name channel layout specification string + * @param[out] channel_layout parsed channel layout (0 if unknown) + * @param[out] nb_channels number of channels + * + * @return 0 on success, AVERROR(EINVAL) if the parsing fails. + */ +int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels); + +/** + * Return a description of a channel layout. + * If nb_channels is <= 0, it is guessed from the channel_layout. + * + * @param buf put here the string containing the channel layout + * @param buf_size size in bytes of the buffer + */ +void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); + +struct AVBPrint; +/** + * Append a description of a channel layout to a bprint buffer. + */ +void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); + +/** + * Return the number of channels in the channel layout. + */ +int av_get_channel_layout_nb_channels(uint64_t channel_layout); + +/** + * Return default channel layout for a given number of channels. + */ +int64_t av_get_default_channel_layout(int nb_channels); + +/** + * Get the index of a channel in channel_layout. + * + * @param channel a channel layout describing exactly one channel which must be + * present in channel_layout. + * + * @return index of channel in channel_layout on success, a negative AVERROR + * on error. + */ +int av_get_channel_layout_channel_index(uint64_t channel_layout, + uint64_t channel); + +/** + * Get the channel with the given index in channel_layout. + */ +uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index); + +/** + * Get the name of a given channel. + * + * @return channel name on success, NULL on error. + */ +const char *av_get_channel_name(uint64_t channel); + +/** + * Get the description of a given channel. + * + * @param channel a channel layout with a single channel + * @return channel description on success, NULL on error + */ +const char *av_get_channel_description(uint64_t channel); + +/** + * Get the value and name of a standard channel layout. + * + * @param[in] index index in an internal list, starting at 0 + * @param[out] layout channel layout mask + * @param[out] name name of the layout + * @return 0 if the layout exists, + * <0 if index is beyond the limits + */ +int av_get_standard_channel_layout(unsigned index, uint64_t *layout, + const char **name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_CHANNEL_LAYOUT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/common.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/common.h new file mode 100644 index 0000000..8142b31 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/common.h @@ -0,0 +1,530 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * common internal and external API header + */ + +#ifndef AVUTIL_COMMON_H +#define AVUTIL_COMMON_H + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) +#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "attributes.h" +#include "macros.h" +#include "version.h" +#include "libavutil/avconfig.h" + +#if AV_HAVE_BIGENDIAN +# define AV_NE(be, le) (be) +#else +# define AV_NE(be, le) (le) +#endif + +//rounded division & shift +#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) +/* assume b>0 */ +#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) +/* Fast a/(1<=0 and b>=0 */ +#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ + : ((a) + (1<<(b)) - 1) >> (b)) +/* Backwards compat. */ +#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT + +#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) +#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) + +/** + * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they + * are not representable as absolute values of their type. This is the same + * as with *abs() + * @see FFNABS() + */ +#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) +#define FFSIGN(a) ((a) > 0 ? 1 : -1) + +/** + * Negative Absolute value. + * this works for all integers of all types. + * As with many macros, this evaluates its argument twice, it thus must not have + * a sideeffect, that is FFNABS(x++) has undefined behavior. + */ +#define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) + +/** + * Comparator. + * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 + * if x == y. This is useful for instance in a qsort comparator callback. + * Furthermore, compilers are able to optimize this to branchless code, and + * there is no risk of overflow with signed types. + * As with many macros, this evaluates its argument multiple times, it thus + * must not have a side-effect. + */ +#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) + +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) + +#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) + +/* misc math functions */ + +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +# include "intmath.h" +#endif + +/* Pull in unguarded fallback defines at the end of this file. */ +#include "common.h" + +#ifndef av_log2 +av_const int av_log2(unsigned v); +#endif + +#ifndef av_log2_16bit +av_const int av_log2_16bit(unsigned v); +#endif + +/** + * Clip a signed integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int av_clip_c(int a, int amin, int amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed 64bit integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed integer value into the 0-255 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint8_t av_clip_uint8_c(int a) +{ + if (a&(~0xFF)) return (-a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -128,127 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int8_t av_clip_int8_c(int a) +{ + if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; + else return a; +} + +/** + * Clip a signed integer value into the 0-65535 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint16_t av_clip_uint16_c(int a) +{ + if (a&(~0xFFFF)) return (-a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -32768,32767 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int16_t av_clip_int16_c(int a) +{ + if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; + else return a; +} + +/** + * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) +{ + if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); + else return (int32_t)a; +} + +/** + * Clip a signed integer into the -(2^p),(2^p-1) range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const int av_clip_intp2_c(int a, int p) +{ + if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) + return (a >> 31) ^ ((1 << p) - 1); + else + return a; +} + +/** + * Clip a signed integer to an unsigned power of two range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) +{ + if (a & ~((1<> 31 & ((1<= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a double value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** Compute ceil(log2(x)). + * @param x value used to compute ceil(log2(x)) + * @return computed ceiling of log2(x) + */ +static av_always_inline av_const int av_ceil_log2_c(int x) +{ + return av_log2((x - 1) << 1); +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount_c(uint32_t x) +{ + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount64_c(uint64_t x) +{ + return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); +} + +static av_always_inline av_const int av_parity_c(uint32_t v) +{ + return av_popcount(v) & 1; +} + +#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) +#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) + +/** + * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_BYTE Expression reading one byte from the input. + * Evaluated up to 7 times (4 for the currently + * assigned Unicode range). With a memory buffer + * input, this could be *ptr++. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + * + * @warning ERROR should not contain a loop control statement which + * could interact with the internal while loop, and should force an + * exit from the macro code (e.g. through a goto or a return) in order + * to prevent undefined results. + */ +#define GET_UTF8(val, GET_BYTE, ERROR)\ + val= (GET_BYTE);\ + {\ + uint32_t top = (val & 128) >> 1;\ + if ((val & 0xc0) == 0x80 || val >= 0xFE)\ + ERROR\ + while (val & top) {\ + int tmp= (GET_BYTE) - 128;\ + if(tmp>>6)\ + ERROR\ + val= (val<<6) + tmp;\ + top <<= 5;\ + }\ + val &= (top << 1) - 1;\ + } + +/** + * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_16BIT Expression returning two bytes of UTF-16 data converted + * to native byte order. Evaluated one or two times. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF16(val, GET_16BIT, ERROR)\ + val = GET_16BIT;\ + {\ + unsigned int hi = val - 0xD800;\ + if (hi < 0x800) {\ + val = GET_16BIT - 0xDC00;\ + if (val > 0x3FFU || hi > 0x3FFU)\ + ERROR\ + val += (hi<<10) + 0x10000;\ + }\ + }\ + +/** + * @def PUT_UTF8(val, tmp, PUT_BYTE) + * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint8_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_BYTE. + * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. + * It could be a function or a statement, and uses tmp as the input byte. + * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be + * executed up to 4 times for values in the valid UTF-8 range and up to + * 7 times in the general case, depending on the length of the converted + * Unicode character. + */ +#define PUT_UTF8(val, tmp, PUT_BYTE)\ + {\ + int bytes, shift;\ + uint32_t in = val;\ + if (in < 0x80) {\ + tmp = in;\ + PUT_BYTE\ + } else {\ + bytes = (av_log2(in) + 4) / 5;\ + shift = (bytes - 1) * 6;\ + tmp = (256 - (256 >> bytes)) | (in >> shift);\ + PUT_BYTE\ + while (shift >= 6) {\ + shift -= 6;\ + tmp = 0x80 | ((in >> shift) & 0x3f);\ + PUT_BYTE\ + }\ + }\ + } + +/** + * @def PUT_UTF16(val, tmp, PUT_16BIT) + * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint16_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_16BIT. + * @param PUT_16BIT writes the converted UTF-16 data to any proper destination + * in desired endianness. It could be a function or a statement, and uses tmp + * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" + * PUT_BYTE will be executed 1 or 2 times depending on input character. + */ +#define PUT_UTF16(val, tmp, PUT_16BIT)\ + {\ + uint32_t in = val;\ + if (in < 0x10000) {\ + tmp = in;\ + PUT_16BIT\ + } else {\ + tmp = 0xD800 | ((in - 0x10000) >> 10);\ + PUT_16BIT\ + tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ + PUT_16BIT\ + }\ + }\ + + + +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ + +#endif /* AVUTIL_COMMON_H */ + +/* + * The following definitions are outside the multiple inclusion guard + * to ensure they are immediately available in intmath.h. + */ + +#ifndef av_ceil_log2 +# define av_ceil_log2 av_ceil_log2_c +#endif +#ifndef av_clip +# define av_clip av_clip_c +#endif +#ifndef av_clip64 +# define av_clip64 av_clip64_c +#endif +#ifndef av_clip_uint8 +# define av_clip_uint8 av_clip_uint8_c +#endif +#ifndef av_clip_int8 +# define av_clip_int8 av_clip_int8_c +#endif +#ifndef av_clip_uint16 +# define av_clip_uint16 av_clip_uint16_c +#endif +#ifndef av_clip_int16 +# define av_clip_int16 av_clip_int16_c +#endif +#ifndef av_clipl_int32 +# define av_clipl_int32 av_clipl_int32_c +#endif +#ifndef av_clip_intp2 +# define av_clip_intp2 av_clip_intp2_c +#endif +#ifndef av_clip_uintp2 +# define av_clip_uintp2 av_clip_uintp2_c +#endif +#ifndef av_mod_uintp2 +# define av_mod_uintp2 av_mod_uintp2_c +#endif +#ifndef av_sat_add32 +# define av_sat_add32 av_sat_add32_c +#endif +#ifndef av_sat_dadd32 +# define av_sat_dadd32 av_sat_dadd32_c +#endif +#ifndef av_clipf +# define av_clipf av_clipf_c +#endif +#ifndef av_clipd +# define av_clipd av_clipd_c +#endif +#ifndef av_popcount +# define av_popcount av_popcount_c +#endif +#ifndef av_popcount64 +# define av_popcount64 av_popcount64_c +#endif +#ifndef av_parity +# define av_parity av_parity_c +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cpu.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cpu.h new file mode 100644 index 0000000..9e5d40a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/cpu.h @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2000, 2001, 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 + */ + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#include + +#include "attributes.h" + +#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX +#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions +#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster +#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower +#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions +#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer) +#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions +#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions +#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction +#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions +#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 +#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 + +#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard +#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 +#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07 + +#define AV_CPU_FLAG_ARMV5TE (1 << 0) +#define AV_CPU_FLAG_ARMV6 (1 << 1) +#define AV_CPU_FLAG_ARMV6T2 (1 << 2) +#define AV_CPU_FLAG_VFP (1 << 3) +#define AV_CPU_FLAG_VFPV3 (1 << 4) +#define AV_CPU_FLAG_NEON (1 << 5) +#define AV_CPU_FLAG_ARMV8 (1 << 6) +#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations +#define AV_CPU_FLAG_SETEND (1 <<16) + +/** + * Return the flags which specify extensions supported by the CPU. + * The returned value is affected by av_force_cpu_flags() if that was used + * before. So av_get_cpu_flags() can easily be used in an application to + * detect the enabled cpu flags. + */ +int av_get_cpu_flags(void); + +/** + * Disables cpu detection and forces the specified flags. + * -1 is a special case that disables forcing of specific flags. + */ +void av_force_cpu_flags(int flags); + +/** + * Set a mask on flags returned by av_get_cpu_flags(). + * This function is mainly useful for testing. + * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible + */ +attribute_deprecated void av_set_cpu_flags_mask(int mask); + +/** + * Parse CPU flags from a string. + * + * The returned flags contain the specified flags as well as related unspecified flags. + * + * This function exists only for compatibility with libav. + * Please use av_parse_cpu_caps() when possible. + * @return a combination of AV_CPU_* flags, negative on error. + */ +attribute_deprecated +int av_parse_cpu_flags(const char *s); + +/** + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. + * + * @return negative on error. + */ +int av_parse_cpu_caps(unsigned *flags, const char *s); + +/** + * @return the number of logical CPU cores present. + */ +int av_cpu_count(void); + +/** + * Get the maximum data alignment that may be required by FFmpeg. + * + * Note that this is affected by the build configuration and the CPU flags mask, + * so e.g. if the CPU supports AVX, but libavutil has been built with + * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through + * av_set_cpu_flags_mask(), then this function will behave as if AVX is not + * present. + */ +size_t av_cpu_max_align(void); + +#endif /* AVUTIL_CPU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/crc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/crc.h new file mode 100644 index 0000000..2a1b0d7 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/crc.h @@ -0,0 +1,103 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_crc32 + * Public header for CRC hash function implementation. + */ + +#ifndef AVUTIL_CRC_H +#define AVUTIL_CRC_H + +#include +#include +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_crc32 CRC + * @ingroup lavu_hash + * CRC (Cyclic Redundancy Check) hash function implementation. + * + * This module supports numerous CRC polynomials, in addition to the most + * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available + * polynomials. + * + * @{ + */ + +typedef uint32_t AVCRC; + +typedef enum { + AV_CRC_8_ATM, + AV_CRC_16_ANSI, + AV_CRC_16_CCITT, + AV_CRC_32_IEEE, + AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ + AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ +#if FF_API_CRC_BIG_TABLE + AV_CRC_24_IEEE = 12, +#else + AV_CRC_24_IEEE, +#endif /* FF_API_CRC_BIG_TABLE */ + AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ +}AVCRCId; + +/** + * Initialize a CRC table. + * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 + * @param le If 1, the lowest bit represents the coefficient for the highest + * exponent of the corresponding polynomial (both for poly and + * actual CRC). + * If 0, you must swap the CRC parameter and the result of av_crc + * if you need the standard representation (can be simplified in + * most cases to e.g. bswap16): + * av_bswap32(crc << (32-bits)) + * @param bits number of bits for the CRC + * @param poly generator polynomial without the x**bits coefficient, in the + * representation as specified by le + * @param ctx_size size of ctx in bytes + * @return <0 on failure + */ +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); + +/** + * Get an initialized standard CRC table. + * @param crc_id ID of a standard CRC + * @return a pointer to the CRC table or NULL on failure + */ +const AVCRC *av_crc_get_table(AVCRCId crc_id); + +/** + * Calculate the CRC of a block. + * @param crc CRC of previous blocks if any or initial value for CRC + * @return CRC updated with the data from the given block + * + * @see av_crc_init() "le" parameter + */ +uint32_t av_crc(const AVCRC *ctx, uint32_t crc, + const uint8_t *buffer, size_t length) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_CRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/des.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/des.h new file mode 100644 index 0000000..4cf11f5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/des.h @@ -0,0 +1,77 @@ +/* + * DES encryption/decryption + * Copyright (c) 2007 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_DES_H +#define AVUTIL_DES_H + +#include + +/** + * @defgroup lavu_des DES + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVDES { + uint64_t round_keys[3][16]; + int triple_des; +} AVDES; + +/** + * Allocate an AVDES context. + */ +AVDES *av_des_alloc(void); + +/** + * @brief Initializes an AVDES context. + * + * @param key_bits must be 64 or 192 + * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption + * @return zero on success, negative value otherwise + */ +int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + * @param iv initialization vector for CBC mode, if NULL then ECB will be used, + * must be 8-byte aligned + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @brief Calculates CBC-MAC using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + */ +void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); + +/** + * @} + */ + +#endif /* AVUTIL_DES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/dict.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/dict.h new file mode 100644 index 0000000..118f1f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/dict.h @@ -0,0 +1,200 @@ +/* + * 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 + * Public dictionary API. + * @deprecated + * AVDictionary is provided for compatibility with libav. It is both in + * implementation as well as API inefficient. It does not scale and is + * extremely slow with large dictionaries. + * It is recommended that new code uses our tree container from tree.c/h + * where applicable, which uses AVL trees to achieve O(log n) performance. + */ + +#ifndef AVUTIL_DICT_H +#define AVUTIL_DICT_H + +#include + +#include "version.h" + +/** + * @addtogroup lavu_dict AVDictionary + * @ingroup lavu_data + * + * @brief Simple key:value store + * + * @{ + * Dictionaries are used for storing key:value pairs. To create + * an AVDictionary, simply pass an address of a NULL pointer to + * av_dict_set(). NULL can be used as an empty dictionary wherever + * a pointer to an AVDictionary is required. + * Use av_dict_get() to retrieve an entry or iterate over all + * entries and finally av_dict_free() to free the dictionary + * and all its contents. + * + @code + AVDictionary *d = NULL; // "create" an empty dictionary + AVDictionaryEntry *t = NULL; + + av_dict_set(&d, "foo", "bar", 0); // add an entry + + char *k = av_strdup("key"); // if your strings are already allocated, + char *v = av_strdup("value"); // you can avoid copying them like this + av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); + + while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { + <....> // iterate over all entries in d + } + av_dict_free(&d); + @endcode + */ + +#define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */ +#define AV_DICT_IGNORE_SUFFIX 2 /**< Return first entry in a dictionary whose first part corresponds to the search key, + ignoring the suffix of the found key string. Only relevant in av_dict_get(). */ +#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries. +#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no + delimiter is added, the strings are simply concatenated. */ +#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ + +typedef struct AVDictionaryEntry { + char *key; + char *value; +} AVDictionaryEntry; + +typedef struct AVDictionary AVDictionary; + +/** + * Get a dictionary entry with matching key. + * + * The returned entry key or value must not be changed, or it will + * cause undefined behavior. + * + * To iterate through all the dictionary entries, you can set the matching key + * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. + * + * @param prev Set to the previous matching element to find the next. + * If set to NULL the first matching element is returned. + * @param key matching key + * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved + * @return found entry or NULL in case no matching entry was found in the dictionary + */ +AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, + const AVDictionaryEntry *prev, int flags); + +/** + * Get number of entries in dictionary. + * + * @param m dictionary + * @return number of entries in dictionary + */ +int av_dict_count(const AVDictionary *m); + +/** + * Set the given entry in *pm, overwriting an existing entry. + * + * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, + * these arguments will be freed on error. + * + * Warning: Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get. + * + * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL + * a dictionary struct is allocated and put in *pm. + * @param key entry key to add to *pm (will either be av_strduped or added as a new key depending on flags) + * @param value entry value to add to *pm (will be av_strduped or added as a new key depending on flags). + * Passing a NULL value will cause an existing entry to be deleted. + * @return >= 0 on success otherwise an error code <0 + */ +int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); + +/** + * Convenience wrapper for av_dict_set that converts the value to a string + * and stores it. + * + * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. + */ +int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); + +/** + * Parse the key/value pairs list and add the parsed entries to a dictionary. + * + * In case of failure, all the successfully set entries are stored in + * *pm. You may need to manually free the created dictionary. + * + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @param flags flags to use when adding to dictionary. + * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL + * are ignored since the key/value tokens will always + * be duplicated. + * @return 0 on success, negative AVERROR code on failure + */ +int av_dict_parse_string(AVDictionary **pm, const char *str, + const char *key_val_sep, const char *pairs_sep, + int flags); + +/** + * Copy entries from one AVDictionary struct into another. + * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, + * this function will allocate a struct for you and put it in *dst + * @param src pointer to source AVDictionary struct + * @param flags flags to use when setting entries in *dst + * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag + * @return 0 on success, negative AVERROR code on failure. If dst was allocated + * by this function, callers should free the associated memory. + */ +int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); + +/** + * Free all the memory allocated for an AVDictionary struct + * and all keys and values. + */ +void av_dict_free(AVDictionary **m); + +/** + * Get dictionary entries as a string. + * + * Create a string containing dictionary's entries. + * Such string may be passed back to av_dict_parse_string(). + * @note String is escaped with backslashes ('\'). + * + * @param[in] m dictionary + * @param[out] buffer Pointer to buffer that will be allocated with string containg entries. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_dict_get_string(const AVDictionary *m, char **buffer, + const char key_val_sep, const char pairs_sep); + +/** + * @} + */ + +#endif /* AVUTIL_DICT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/display.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/display.h new file mode 100644 index 0000000..515adad --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/display.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2014 Vittorio Giovara + * + * 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 + * Display matrix + */ + +#ifndef AVUTIL_DISPLAY_H +#define AVUTIL_DISPLAY_H + +#include +#include "common.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_display Display transformation matrix functions + * @{ + */ + +/** + * @addtogroup lavu_video_display + * The display transformation matrix specifies an affine transformation that + * should be applied to video frames for correct presentation. It is compatible + * with the matrices stored in the ISO/IEC 14496-12 container format. + * + * The data is a 3x3 matrix represented as a 9-element array: + * + * @code{.unparsed} + * | a b u | + * (a, b, u, c, d, v, x, y, w) -> | c d v | + * | x y w | + * @endcode + * + * All numbers are stored in native endianness, as 16.16 fixed-point values, + * except for u, v and w, which are stored as 2.30 fixed-point values. + * + * The transformation maps a point (p, q) in the source (pre-transformation) + * frame to the point (p', q') in the destination (post-transformation) frame as + * follows: + * + * @code{.unparsed} + * | a b u | + * (p, q, 1) . | c d v | = z * (p', q', 1) + * | x y w | + * @endcode + * + * The transformation can also be more explicitly written in components as + * follows: + * + * @code{.unparsed} + * p' = (a * p + c * q + x) / z; + * q' = (b * p + d * q + y) / z; + * z = u * p + v * q + w + * @endcode + */ + +/** + * Extract the rotation component of the transformation matrix. + * + * @param matrix the transformation matrix + * @return the angle (in degrees) by which the transformation rotates the frame + * counterclockwise. The angle will be in range [-180.0, 180.0], + * or NaN if the matrix is singular. + * + * @note floating point numbers are inherently inexact, so callers are + * recommended to round the return value to nearest integer before use. + */ +double av_display_rotation_get(const int32_t matrix[9]); + +/** + * Initialize a transformation matrix describing a pure counterclockwise + * rotation by the specified angle (in degrees). + * + * @param matrix an allocated transformation matrix (will be fully overwritten + * by this function) + * @param angle rotation angle in degrees. + */ +void av_display_rotation_set(int32_t matrix[9], double angle); + +/** + * Flip the input matrix horizontally and/or vertically. + * + * @param matrix an allocated transformation matrix + * @param hflip whether the matrix should be flipped horizontally + * @param vflip whether the matrix should be flipped vertically + */ +void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_DISPLAY_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/downmix_info.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/downmix_info.h new file mode 100644 index 0000000..221cf5b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/downmix_info.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2014 Tim Walker + * + * 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 + */ + +#ifndef AVUTIL_DOWNMIX_INFO_H +#define AVUTIL_DOWNMIX_INFO_H + +#include "frame.h" + +/** + * @file + * audio downmix medatata + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup downmix_info Audio downmix metadata + * @{ + */ + +/** + * Possible downmix types. + */ +enum AVDownmixType { + AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */ + AV_DOWNMIX_TYPE_LORO, /**< Lo/Ro 2-channel downmix (Stereo). */ + AV_DOWNMIX_TYPE_LTRT, /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */ + AV_DOWNMIX_TYPE_DPLII, /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */ + AV_DOWNMIX_TYPE_NB /**< Number of downmix types. Not part of ABI. */ +}; + +/** + * This structure describes optional metadata relevant to a downmix procedure. + * + * All fields are set by the decoder to the value indicated in the audio + * bitstream (if present), or to a "sane" default otherwise. + */ +typedef struct AVDownmixInfo { + /** + * Type of downmix preferred by the mastering engineer. + */ + enum AVDownmixType preferred_downmix_type; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during a regular downmix. + */ + double center_mix_level; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during an Lt/Rt compatible downmix. + */ + double center_mix_level_ltrt; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during a regular downmix. + */ + double surround_mix_level; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during an Lt/Rt compatible downmix. + */ + double surround_mix_level_ltrt; + + /** + * Absolute scale factor representing the level at which the LFE data is + * mixed into L/R channels during downmixing. + */ + double lfe_mix_level; +} AVDownmixInfo; + +/** + * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing. + * + * If the side data is absent, it is created and added to the frame. + * + * @param frame the frame for which the side data is to be obtained or created + * + * @return the AVDownmixInfo structure to be edited by the caller, or NULL if + * the structure cannot be allocated. + */ +AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame); + +/** + * @} + */ + +/** + * @} + */ + +#endif /* AVUTIL_DOWNMIX_INFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/error.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/error.h new file mode 100644 index 0000000..71df4da --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/error.h @@ -0,0 +1,126 @@ +/* + * 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 + * error code definitions + */ + +#ifndef AVUTIL_ERROR_H +#define AVUTIL_ERROR_H + +#include +#include + +/** + * @addtogroup lavu_error + * + * @{ + */ + + +/* error handling */ +#if EDOM > 0 +#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. +#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. +#else +/* Some platforms have E* and errno already negated. */ +#define AVERROR(e) (e) +#define AVUNERROR(e) (e) +#endif + +#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) + +#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found +#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2 +#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small +#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found +#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found +#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found +#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file +#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted +#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library +#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found +#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input +#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found +#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found +#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome +#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found + +#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< Stream not found +/** + * This is semantically identical to AVERROR_BUG + * it has been introduced in Libav after our AVERROR_BUG and with a modified value. + */ +#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ') +#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library +#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. +#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED) +#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED) +/* HTTP & RTSP errors */ +#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0') +#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1') +#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3') +#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4') +#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X') +#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X') + +#define AV_ERROR_MAX_STRING_SIZE 64 + +/** + * Put a description of the AVERROR code errnum in errbuf. + * In case of failure the global variable errno is set to indicate the + * error. Even in case of failure av_strerror() will print a generic + * error message indicating the errnum provided to errbuf. + * + * @param errnum error code to describe + * @param errbuf buffer to which description is written + * @param errbuf_size the size in bytes of errbuf + * @return 0 on success, a negative value if a description for errnum + * cannot be found + */ +int av_strerror(int errnum, char *errbuf, size_t errbuf_size); + +/** + * Fill the provided buffer with a string containing an error string + * corresponding to the AVERROR code errnum. + * + * @param errbuf a buffer + * @param errbuf_size size in bytes of errbuf + * @param errnum error code to describe + * @return the buffer in input, filled with the error description + * @see av_strerror() + */ +static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) +{ + av_strerror(errnum, errbuf, errbuf_size); + return errbuf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_err2str(errnum) \ + av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) + +/** + * @} + */ + +#endif /* AVUTIL_ERROR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/eval.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/eval.h new file mode 100644 index 0000000..dacd22b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/eval.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002 Michael Niedermayer + * + * 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 + * simple arithmetic expression evaluator + */ + +#ifndef AVUTIL_EVAL_H +#define AVUTIL_EVAL_H + +#include "avutil.h" + +typedef struct AVExpr AVExpr; + +/** + * Parse and evaluate an expression. + * Note, this is significantly slower than av_expr_eval(). + * + * @param res a pointer to a double where is put the result value of + * the expression, or NAN in case of error + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param const_values a zero terminated array of values for the identifiers from const_names + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse_and_eval(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * Parse an expression. + * + * @param expr a pointer where is put an AVExpr containing the parsed + * value in case of successful parsing, or NULL otherwise. + * The pointed to AVExpr must be freed with av_expr_free() by the user + * when it is not needed anymore. + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); + +/** + * Evaluate a previously parsed expression. + * + * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @return the value of the expression + */ +double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); + +/** + * Free a parsed expression previously created with av_expr_parse(). + */ +void av_expr_free(AVExpr *e); + +/** + * Parse the string in numstr and return its value as a double. If + * the string is empty, contains only whitespaces, or does not contain + * an initial substring that has the expected syntax for a + * floating-point number, no conversion is performed. In this case, + * returns a value of zero and the value returned in tail is the value + * of numstr. + * + * @param numstr a string representing a number, may contain one of + * the International System number postfixes, for example 'K', 'M', + * 'G'. If 'i' is appended after the postfix, powers of 2 are used + * instead of powers of 10. The 'B' postfix multiplies the value by + * 8, and can be appended after another postfix or used alone. This + * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. + * @param tail if non-NULL puts here the pointer to the char next + * after the last parsed character + */ +double av_strtod(const char *numstr, char **tail); + +#endif /* AVUTIL_EVAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ffversion.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ffversion.h new file mode 100644 index 0000000..f116d16 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ffversion.h @@ -0,0 +1,5 @@ +/* Automatically generated by version.sh, do not manually edit! */ +#ifndef AVUTIL_FFVERSION_H +#define AVUTIL_FFVERSION_H +#define FFMPEG_VERSION "3.4.2" +#endif /* AVUTIL_FFVERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/fifo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/fifo.h new file mode 100644 index 0000000..dc7bc6f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/fifo.h @@ -0,0 +1,179 @@ +/* + * 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 + * a very simple circular buffer FIFO implementation + */ + +#ifndef AVUTIL_FIFO_H +#define AVUTIL_FIFO_H + +#include +#include "avutil.h" +#include "attributes.h" + +typedef struct AVFifoBuffer { + uint8_t *buffer; + uint8_t *rptr, *wptr, *end; + uint32_t rndx, wndx; +} AVFifoBuffer; + +/** + * Initialize an AVFifoBuffer. + * @param size of FIFO + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc(unsigned int size); + +/** + * Initialize an AVFifoBuffer. + * @param nmemb number of elements + * @param size size of the single element + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); + +/** + * Free an AVFifoBuffer. + * @param f AVFifoBuffer to free + */ +void av_fifo_free(AVFifoBuffer *f); + +/** + * Free an AVFifoBuffer and reset pointer to NULL. + * @param f AVFifoBuffer to free + */ +void av_fifo_freep(AVFifoBuffer **f); + +/** + * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. + * @param f AVFifoBuffer to reset + */ +void av_fifo_reset(AVFifoBuffer *f); + +/** + * Return the amount of data in bytes in the AVFifoBuffer, that is the + * amount of data you can read from it. + * @param f AVFifoBuffer to read from + * @return size + */ +int av_fifo_size(const AVFifoBuffer *f); + +/** + * Return the amount of space in bytes in the AVFifoBuffer, that is the + * amount of data you can write into it. + * @param f AVFifoBuffer to write into + * @return size + */ +int av_fifo_space(const AVFifoBuffer *f); + +/** + * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param offset offset from current read position + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from a user-supplied callback to an AVFifoBuffer. + * @param f AVFifoBuffer to write to + * @param src data source; non-const since it may be used as a + * modifiable context by the function defined in func + * @param size number of bytes to write + * @param func generic write function; the first parameter is src, + * the second is dest_buf, the third is dest_buf_size. + * func must return the number of bytes written to dest_buf, or <= 0 to + * indicate no more data available to write. + * If func is NULL, src is interpreted as a simple byte array for source data. + * @return the number of bytes written to the FIFO + */ +int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); + +/** + * Resize an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * + * @param f AVFifoBuffer to resize + * @param size new AVFifoBuffer size in bytes + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); + +/** + * Enlarge an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * The new fifo size may be larger than the requested size. + * + * @param f AVFifoBuffer to resize + * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); + +/** + * Read and discard the specified amount of data from an AVFifoBuffer. + * @param f AVFifoBuffer to read from + * @param size amount of data to read in bytes + */ +void av_fifo_drain(AVFifoBuffer *f, int size); + +/** + * Return a pointer to the data stored in a FIFO buffer at a certain offset. + * The FIFO buffer is not modified. + * + * @param f AVFifoBuffer to peek at, f must be non-NULL + * @param offs an offset in bytes, its absolute value must be less + * than the used buffer size or the returned pointer will + * point outside to the buffer data. + * The used buffer size can be checked with av_fifo_size(). + */ +static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) +{ + uint8_t *ptr = f->rptr + offs; + if (ptr >= f->end) + ptr = f->buffer + (ptr - f->end); + else if (ptr < f->buffer) + ptr = f->end - (f->buffer - ptr); + return ptr; +} + +#endif /* AVUTIL_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/file.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/file.h new file mode 100644 index 0000000..8666c7b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/file.h @@ -0,0 +1,69 @@ +/* + * 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 + */ + +#ifndef AVUTIL_FILE_H +#define AVUTIL_FILE_H + +#include + +#include "avutil.h" + +/** + * @file + * Misc file utilities. + */ + +/** + * Read the file with name filename, and put its content in a newly + * allocated buffer or map it with mmap() when available. + * In case of success set *bufptr to the read or mmapped buffer, and + * *size to the size in bytes of the buffer in *bufptr. + * The returned buffer must be released with av_file_unmap(). + * + * @param log_offset loglevel offset used for logging + * @param log_ctx context used for logging + * @return a non negative number in case of success, a negative value + * corresponding to an AVERROR error code in case of failure + */ +av_warn_unused_result +int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, + int log_offset, void *log_ctx); + +/** + * Unmap or free the buffer bufptr created by av_file_map(). + * + * @param size size in bytes of bufptr, must be the same as returned + * by av_file_map() + */ +void av_file_unmap(uint8_t *bufptr, size_t size); + +/** + * Wrapper to work around the lack of mkstemp() on mingw. + * Also, tries to create file in /tmp first, if possible. + * *prefix can be a character constant; *filename will be allocated internally. + * @return file descriptor of opened file (or negative value corresponding to an + * AVERROR code on error) + * and opened file name in **filename. + * @note On very old libcs it is necessary to set a secure umask before + * calling this, av_tempfile() can't call umask itself as it is used in + * libraries and could interfere with the calling application. + * @deprecated as fd numbers cannot be passed saftely between libs on some platforms + */ +int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); + +#endif /* AVUTIL_FILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/frame.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/frame.h new file mode 100644 index 0000000..abe4f4f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/frame.h @@ -0,0 +1,821 @@ +/* + * 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 + * @ingroup lavu_frame + * reference-counted frame API + */ + +#ifndef AVUTIL_FRAME_H +#define AVUTIL_FRAME_H + +#include +#include + +#include "avutil.h" +#include "buffer.h" +#include "dict.h" +#include "rational.h" +#include "samplefmt.h" +#include "pixfmt.h" +#include "version.h" + + +/** + * @defgroup lavu_frame AVFrame + * @ingroup lavu_data + * + * @{ + * AVFrame is an abstraction for reference-counted raw multimedia data. + */ + +enum AVFrameSideDataType { + /** + * The data is the AVPanScan struct defined in libavcodec. + */ + AV_FRAME_DATA_PANSCAN, + /** + * ATSC A53 Part 4 Closed Captions. + * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. + * The number of bytes of CC data is AVFrameSideData.size. + */ + AV_FRAME_DATA_A53_CC, + /** + * Stereoscopic 3d metadata. + * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. + */ + AV_FRAME_DATA_STEREO3D, + /** + * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. + */ + AV_FRAME_DATA_MATRIXENCODING, + /** + * Metadata relevant to a downmix procedure. + * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. + */ + AV_FRAME_DATA_DOWNMIX_INFO, + /** + * ReplayGain information in the form of the AVReplayGain struct. + */ + AV_FRAME_DATA_REPLAYGAIN, + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the frame for correct + * presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_FRAME_DATA_DISPLAYMATRIX, + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_FRAME_DATA_AFD, + /** + * Motion vectors exported by some codecs (on demand through the export_mvs + * flag set in the libavcodec AVCodecContext flags2 option). + * The data is the AVMotionVector struct defined in + * libavutil/motion_vector.h. + */ + AV_FRAME_DATA_MOTION_VECTORS, + /** + * Recommmends skipping the specified number of samples. This is exported + * only if the "skip_manual" AVOption is set in libavcodec. + * This has the same format as AV_PKT_DATA_SKIP_SAMPLES. + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_FRAME_DATA_SKIP_SAMPLES, + /** + * This side data must be associated with an audio frame and corresponds to + * enum AVAudioServiceType defined in avcodec.h. + */ + AV_FRAME_DATA_AUDIO_SERVICE_TYPE, + /** + * Mastering display metadata associated with a video frame. The payload is + * an AVMasteringDisplayMetadata type and contains information about the + * mastering display color volume. + */ + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + /** + * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. + * This is set on the first frame of a GOP that has a temporal reference of 0. + */ + AV_FRAME_DATA_GOP_TIMECODE, + + /** + * The data represents the AVSphericalMapping structure defined in + * libavutil/spherical.h. + */ + AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + + /** + * The data contains an ICC profile as an opaque octet buffer following the + * format described by ISO 15076-1 with an optional name defined in the + * metadata key entry "name". + */ + AV_FRAME_DATA_ICC_PROFILE, +}; + +enum AVActiveFormatDescription { + AV_AFD_SAME = 8, + AV_AFD_4_3 = 9, + AV_AFD_16_9 = 10, + AV_AFD_14_9 = 11, + AV_AFD_4_3_SP_14_9 = 13, + AV_AFD_16_9_SP_14_9 = 14, + AV_AFD_SP_4_3 = 15, +}; + + +/** + * Structure to hold side data for an AVFrame. + * + * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + */ +typedef struct AVFrameSideData { + enum AVFrameSideDataType type; + uint8_t *data; + int size; + AVDictionary *metadata; + AVBufferRef *buf; +} AVFrameSideData; + +/** + * This structure describes decoded (raw) audio or video data. + * + * AVFrame must be allocated using av_frame_alloc(). Note that this only + * allocates the AVFrame itself, the buffers for the data must be managed + * through other means (see below). + * AVFrame must be freed with av_frame_free(). + * + * AVFrame is typically allocated once and then reused multiple times to hold + * different data (e.g. a single AVFrame to hold frames received from a + * decoder). In such a case, av_frame_unref() will free any references held by + * the frame and reset it to its original clean state before it + * is reused again. + * + * The data described by an AVFrame is usually reference counted through the + * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / + * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at + * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, + * every single data plane must be contained in one of the buffers in + * AVFrame.buf or AVFrame.extended_buf. + * There may be a single buffer for all the data, or one separate buffer for + * each plane, or anything in between. + * + * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + * + * Fields can be accessed through AVOptions, the name string used, matches the + * C structure field name for fields accessible through AVOptions. The AVClass + * for AVFrame can be obtained from avcodec_get_frame_class() + */ +typedef struct AVFrame { +#define AV_NUM_DATA_POINTERS 8 + /** + * pointer to the picture/channel planes. + * This might be different from the first allocated byte + * + * Some decoders access areas outside 0,0 - width,height, please + * see avcodec_align_dimensions2(). Some filters and swscale can read + * up to 16 bytes beyond the planes, if these filters are to be used, + * then 16 extra bytes must be allocated. + * + * NOTE: Except for hwaccel formats, pointers not needed by the format + * MUST be set to NULL. + */ + uint8_t *data[AV_NUM_DATA_POINTERS]; + + /** + * For video, size in bytes of each picture line. + * For audio, size in bytes of each plane. + * + * For audio, only linesize[0] may be set. For planar audio, each channel + * plane must be the same size. + * + * For video the linesizes should be multiples of the CPUs alignment + * preference, this is 16 or 32 for modern desktop CPUs. + * Some code requires such alignment other code can be slower without + * correct alignment, for yet other it makes no difference. + * + * @note The linesize may be larger than the size of usable data -- there + * may be extra padding present for performance reasons. + */ + int linesize[AV_NUM_DATA_POINTERS]; + + /** + * pointers to the data planes/channels. + * + * For video, this should simply point to data[]. + * + * For planar audio, each channel has a separate data pointer, and + * linesize[0] contains the size of each channel buffer. + * For packed audio, there is just one data pointer, and linesize[0] + * contains the total size of the buffer for all channels. + * + * Note: Both data and extended_data should always be set in a valid frame, + * but for planar audio with more channels that can fit in data, + * extended_data must be used in order to access all channels. + */ + uint8_t **extended_data; + + /** + * @name Video dimensions + * Video frames only. The coded dimensions (in pixels) of the video frame, + * i.e. the size of the rectangle that contains some well-defined values. + * + * @note The part of the frame intended for display/presentation is further + * restricted by the @ref cropping "Cropping rectangle". + * @{ + */ + int width, height; + /** + * @} + */ + + /** + * number of audio samples (per channel) described by this frame + */ + int nb_samples; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum AVPixelFormat for video frames, + * enum AVSampleFormat for audio) + */ + int format; + + /** + * 1 -> keyframe, 0-> not + */ + int key_frame; + + /** + * Picture type of the frame. + */ + enum AVPictureType pict_type; + + /** + * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. + */ + AVRational sample_aspect_ratio; + + /** + * Presentation timestamp in time_base units (time when frame should be shown to user). + */ + int64_t pts; + +#if FF_API_PKT_PTS + /** + * PTS copied from the AVPacket that was decoded to produce this frame. + * @deprecated use the pts field instead + */ + attribute_deprecated + int64_t pkt_pts; +#endif + + /** + * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) + * This is also the Presentation time of this AVFrame calculated from + * only AVPacket.dts values without pts values. + */ + int64_t pkt_dts; + + /** + * picture number in bitstream order + */ + int coded_picture_number; + /** + * picture number in display order + */ + int display_picture_number; + + /** + * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) + */ + int quality; + + /** + * for some private data of the user + */ + void *opaque; + +#if FF_API_ERROR_FRAME + /** + * @deprecated unused + */ + attribute_deprecated + uint64_t error[AV_NUM_DATA_POINTERS]; +#endif + + /** + * When decoding, this signals how much the picture must be delayed. + * extra_delay = repeat_pict / (2*fps) + */ + int repeat_pict; + + /** + * The content of the picture is interlaced. + */ + int interlaced_frame; + + /** + * If the content is interlaced, is top field displayed first. + */ + int top_field_first; + + /** + * Tell user application that palette has changed from previous frame. + */ + int palette_has_changed; + + /** + * reordered opaque 64 bits (generally an integer or a double precision float + * PTS but can be anything). + * The user sets AVCodecContext.reordered_opaque to represent the input at + * that time, + * the decoder reorders values as needed and sets AVFrame.reordered_opaque + * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque + * @deprecated in favor of pkt_pts + */ + int64_t reordered_opaque; + + /** + * Sample rate of the audio data. + */ + int sample_rate; + + /** + * Channel layout of the audio data. + */ + uint64_t channel_layout; + + /** + * AVBuffer references backing the data for this frame. If all elements of + * this array are NULL, then this frame is not reference counted. This array + * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must + * also be non-NULL for all j < i. + * + * There may be at most one AVBuffer per data plane, so for video this array + * always contains all the references. For planar audio with more than + * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in + * this array. Then the extra AVBufferRef pointers are stored in the + * extended_buf array. + */ + AVBufferRef *buf[AV_NUM_DATA_POINTERS]; + + /** + * For planar audio which requires more than AV_NUM_DATA_POINTERS + * AVBufferRef pointers, this array will hold all the references which + * cannot fit into AVFrame.buf. + * + * Note that this is different from AVFrame.extended_data, which always + * contains all the pointers. This array only contains the extra pointers, + * which cannot fit into AVFrame.buf. + * + * This array is always allocated using av_malloc() by whoever constructs + * the frame. It is freed in av_frame_unref(). + */ + AVBufferRef **extended_buf; + /** + * Number of elements in extended_buf. + */ + int nb_extended_buf; + + AVFrameSideData **side_data; + int nb_side_data; + +/** + * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame + * Flags describing additional frame properties. + * + * @{ + */ + +/** + * The frame data may be corrupted, e.g. due to decoding errors. + */ +#define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark the frames which need to be decoded, but shouldn't be output. + */ +#define AV_FRAME_FLAG_DISCARD (1 << 2) +/** + * @} + */ + + /** + * Frame flags, a combination of @ref lavu_frame_flags + */ + int flags; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + enum AVColorPrimaries color_primaries; + + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + enum AVChromaLocation chroma_location; + + /** + * frame timestamp estimated using various heuristics, in stream time base + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int64_t best_effort_timestamp; + + /** + * reordered pos from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_pos; + + /** + * duration of the corresponding packet, expressed in + * AVStream->time_base units, 0 if unknown. + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_duration; + + /** + * metadata. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVDictionary *metadata; + + /** + * decode error flags of the frame, set to a combination of + * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there + * were errors during the decoding. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int decode_error_flags; +#define FF_DECODE_ERROR_INVALID_BITSTREAM 1 +#define FF_DECODE_ERROR_MISSING_REFERENCE 2 + + /** + * number of audio channels, only used for audio. + * - encoding: unused + * - decoding: Read by user. + */ + int channels; + + /** + * size of the corresponding packet containing the compressed + * frame. + * It is set to a negative value if unknown. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int pkt_size; + +#if FF_API_FRAME_QP + /** + * QP table + */ + attribute_deprecated + int8_t *qscale_table; + /** + * QP store stride + */ + attribute_deprecated + int qstride; + + attribute_deprecated + int qscale_type; + + AVBufferRef *qp_table_buf; +#endif + /** + * For hwaccel-format frames, this should be a reference to the + * AVHWFramesContext describing the frame. + */ + AVBufferRef *hw_frames_ctx; + + /** + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * @anchor cropping + * @name Cropping + * Video frames only. The number of pixels to discard from the the + * top/bottom/left/right border of the frame to obtain the sub-rectangle of + * the frame intended for presentation. + * @{ + */ + size_t crop_top; + size_t crop_bottom; + size_t crop_left; + size_t crop_right; + /** + * @} + */ +} AVFrame; + +/** + * Accessors for some AVFrame fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); +void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); +int64_t av_frame_get_pkt_duration (const AVFrame *frame); +void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); +int64_t av_frame_get_pkt_pos (const AVFrame *frame); +void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); +int64_t av_frame_get_channel_layout (const AVFrame *frame); +void av_frame_set_channel_layout (AVFrame *frame, int64_t val); +int av_frame_get_channels (const AVFrame *frame); +void av_frame_set_channels (AVFrame *frame, int val); +int av_frame_get_sample_rate (const AVFrame *frame); +void av_frame_set_sample_rate (AVFrame *frame, int val); +AVDictionary *av_frame_get_metadata (const AVFrame *frame); +void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); +int av_frame_get_decode_error_flags (const AVFrame *frame); +void av_frame_set_decode_error_flags (AVFrame *frame, int val); +int av_frame_get_pkt_size(const AVFrame *frame); +void av_frame_set_pkt_size(AVFrame *frame, int val); +AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame); +#if FF_API_FRAME_QP +int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); +int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); +#endif +enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); +void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); +enum AVColorRange av_frame_get_color_range(const AVFrame *frame); +void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); + +/** + * Get the name of a colorspace. + * @return a static string identifying the colorspace; can be NULL. + */ +const char *av_get_colorspace_name(enum AVColorSpace val); + +/** + * Allocate an AVFrame and set its fields to default values. The resulting + * struct must be freed using av_frame_free(). + * + * @return An AVFrame filled with default values or NULL on failure. + * + * @note this only allocates the AVFrame itself, not the data buffers. Those + * must be allocated through other means, e.g. with av_frame_get_buffer() or + * manually. + */ +AVFrame *av_frame_alloc(void); + +/** + * Free the frame and any dynamically allocated objects in it, + * e.g. extended_data. If the frame is reference counted, it will be + * unreferenced first. + * + * @param frame frame to be freed. The pointer will be set to NULL. + */ +void av_frame_free(AVFrame **frame); + +/** + * Set up a new reference to the data described by the source frame. + * + * Copy frame properties from src to dst and create a new reference for each + * AVBufferRef from src. + * + * If src is not reference counted, new buffers are allocated and the data is + * copied. + * + * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), + * or newly allocated with av_frame_alloc() before calling this + * function, or undefined behavior will occur. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_frame_ref(AVFrame *dst, const AVFrame *src); + +/** + * Create a new frame that references the same data as src. + * + * This is a shortcut for av_frame_alloc()+av_frame_ref(). + * + * @return newly created AVFrame on success, NULL on error. + */ +AVFrame *av_frame_clone(const AVFrame *src); + +/** + * Unreference all the buffers referenced by frame and reset the frame fields. + */ +void av_frame_unref(AVFrame *frame); + +/** + * Move everything contained in src to dst and reset src. + * + * @warning: dst is not unreferenced, but directly overwritten without reading + * or deallocating its contents. Call av_frame_unref(dst) manually + * before calling this function to ensure that no memory is leaked. + */ +void av_frame_move_ref(AVFrame *dst, AVFrame *src); + +/** + * Allocate new buffer(s) for audio or video data. + * + * The following fields must be set on frame before calling this function: + * - format (pixel format for video, sample format for audio) + * - width and height for video + * - nb_samples and channel_layout for audio + * + * This function will fill AVFrame.data and AVFrame.buf arrays and, if + * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. + * For planar formats, one buffer will be allocated for each plane. + * + * @warning: if frame already has been allocated, calling this function will + * leak memory. In addition, undefined behavior can occur in certain + * cases. + * + * @param frame frame in which to store the new buffers. + * @param align Required buffer size alignment. If equal to 0, alignment will be + * chosen automatically for the current CPU. It is highly + * recommended to pass 0 here unless you know what you are doing. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_frame_get_buffer(AVFrame *frame, int align); + +/** + * Check if the frame data is writable. + * + * @return A positive value if the frame data is writable (which is true if and + * only if each of the underlying buffers has only one reference, namely the one + * stored in this frame). Return 0 otherwise. + * + * If 1 is returned the answer is valid until av_buffer_ref() is called on any + * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). + * + * @see av_frame_make_writable(), av_buffer_is_writable() + */ +int av_frame_is_writable(AVFrame *frame); + +/** + * Ensure that the frame data is writable, avoiding data copy if possible. + * + * Do nothing if the frame is writable, allocate new buffers and copy the data + * if it is not. + * + * @return 0 on success, a negative AVERROR on error. + * + * @see av_frame_is_writable(), av_buffer_is_writable(), + * av_buffer_make_writable() + */ +int av_frame_make_writable(AVFrame *frame); + +/** + * Copy the frame data from src to dst. + * + * This function does not allocate anything, dst must be already initialized and + * allocated with the same parameters as src. + * + * This function only copies the frame data (i.e. the contents of the data / + * extended data arrays), not any other properties. + * + * @return >= 0 on success, a negative AVERROR on error. + */ +int av_frame_copy(AVFrame *dst, const AVFrame *src); + +/** + * Copy only "metadata" fields from src to dst. + * + * Metadata for the purpose of this function are those fields that do not affect + * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample + * aspect ratio (for video), but not width/height or channel layout. + * Side data is also copied. + */ +int av_frame_copy_props(AVFrame *dst, const AVFrame *src); + +/** + * Get the buffer reference a given data plane is stored in. + * + * @param plane index of the data plane of interest in frame->extended_data. + * + * @return the buffer reference that contains the plane or NULL if the input + * frame is not valid. + */ +AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); + +/** + * Add a new side data to a frame. + * + * @param frame a frame to which the side data should be added + * @param type type of the added side data + * @param size size of the side data + * + * @return newly added side data on success, NULL on error + */ +AVFrameSideData *av_frame_new_side_data(AVFrame *frame, + enum AVFrameSideDataType type, + int size); + +/** + * @return a pointer to the side data of a given type on success, NULL if there + * is no side data with such type in this frame. + */ +AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, + enum AVFrameSideDataType type); + +/** + * If side data of the supplied type exists in the frame, free it and remove it + * from the frame. + */ +void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); + + +/** + * Flags for frame cropping. + */ +enum { + /** + * Apply the maximum possible cropping, even if it requires setting the + * AVFrame.data[] entries to unaligned pointers. Passing unaligned data + * to FFmpeg API is generally not allowed, and causes undefined behavior + * (such as crashes). You can pass unaligned data only to FFmpeg APIs that + * are explicitly documented to accept it. Use this flag only if you + * absolutely know what you are doing. + */ + AV_FRAME_CROP_UNALIGNED = 1 << 0, +}; + +/** + * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ + * crop_bottom fields. If cropping is successful, the function will adjust the + * data pointers and the width/height fields, and set the crop fields to 0. + * + * In all cases, the cropping boundaries will be rounded to the inherent + * alignment of the pixel format. In some cases, such as for opaque hwaccel + * formats, the left/top cropping is ignored. The crop fields are set to 0 even + * if the cropping was rounded or ignored. + * + * @param frame the frame which should be cropped + * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. + * + * @return >= 0 on success, a negative AVERROR on error. If the cropping fields + * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. + */ +int av_frame_apply_cropping(AVFrame *frame, int flags); + +/** + * @return a string identifying the side data type + */ +const char *av_frame_side_data_name(enum AVFrameSideDataType type); + +/** + * @} + */ + +#endif /* AVUTIL_FRAME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hash.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hash.h new file mode 100644 index 0000000..a20b893 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hash.h @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_hash_generic + * Generic hashing API + */ + +#ifndef AVUTIL_HASH_H +#define AVUTIL_HASH_H + +#include + +/** + * @defgroup lavu_hash Hash Functions + * @ingroup lavu_crypto + * Hash functions useful in multimedia. + * + * Hash functions are widely used in multimedia, from error checking and + * concealment to internal regression testing. libavutil has efficient + * implementations of a variety of hash functions that may be useful for + * FFmpeg and other multimedia applications. + * + * @{ + * + * @defgroup lavu_hash_generic Generic Hashing API + * An abstraction layer for all hash functions supported by libavutil. + * + * If your application needs to support a wide range of different hash + * functions, then the Generic Hashing API is for you. It provides a generic, + * reusable API for @ref lavu_hash "all hash functions" implemented in libavutil. + * If you just need to use one particular hash function, use the @ref lavu_hash + * "individual hash" directly. + * + * @section Sample Code + * + * A basic template for using the Generic Hashing API follows: + * + * @code + * struct AVHashContext *ctx = NULL; + * const char *hash_name = NULL; + * uint8_t *output_buf = NULL; + * + * // Select from a string returned by av_hash_names() + * hash_name = ...; + * + * // Allocate a hash context + * ret = av_hash_alloc(&ctx, hash_name); + * if (ret < 0) + * return ret; + * + * // Initialize the hash context + * av_hash_init(ctx); + * + * // Update the hash context with data + * while (data_left) { + * av_hash_update(ctx, data, size); + * } + * + * // Now we have no more data, so it is time to finalize the hash and get the + * // output. But we need to first allocate an output buffer. Note that you can + * // use any memory allocation function, including malloc(), not just + * // av_malloc(). + * output_buf = av_malloc(av_hash_get_size(ctx)); + * if (!output_buf) + * return AVERROR(ENOMEM); + * + * // Finalize the hash context. + * // You can use any of the av_hash_final*() functions provided, for other + * // output formats. If you do so, be sure to adjust the memory allocation + * // above. See the function documentation below for the exact amount of extra + * // memory needed. + * av_hash_final(ctx, output_buffer); + * + * // Free the context + * av_hash_freep(&ctx); + * @endcode + * + * @section Hash Function-Specific Information + * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be + * used. + * + * If the Murmur3 hash is selected, the default seed will be used. See @ref + * lavu_murmur3_seedinfo "Murmur3" for more information. + * + * @{ + */ + +/** + * @example ffhash.c + * This example is a simple command line application that takes one or more + * arguments. It demonstrates a typical use of the hashing API with allocation, + * initialization, updating, and finalizing. + */ + +struct AVHashContext; + +/** + * Allocate a hash context for the algorithm specified by name. + * + * @return >= 0 for success, a negative error code for failure + * + * @note The context is not initialized after a call to this function; you must + * call av_hash_init() to do so. + */ +int av_hash_alloc(struct AVHashContext **ctx, const char *name); + +/** + * Get the names of available hash algorithms. + * + * This function can be used to enumerate the algorithms. + * + * @param[in] i Index of the hash algorithm, starting from 0 + * @return Pointer to a static string or `NULL` if `i` is out of range + */ +const char *av_hash_names(int i); + +/** + * Get the name of the algorithm corresponding to the given hash context. + */ +const char *av_hash_get_name(const struct AVHashContext *ctx); + +/** + * Maximum value that av_hash_get_size() will currently return. + * + * You can use this if you absolutely want or need to use static allocation for + * the output buffer and are fine with not supporting hashes newly added to + * libavutil without recompilation. + * + * @warning + * Adding new hashes with larger sizes, and increasing the macro while doing + * so, will not be considered an ABI change. To prevent your code from + * overflowing a buffer, either dynamically allocate the output buffer with + * av_hash_get_size(), or limit your use of the Hashing API to hashes that are + * already in FFmpeg during the time of compilation. + */ +#define AV_HASH_MAX_SIZE 64 + +/** + * Get the size of the resulting hash value in bytes. + * + * The maximum value this function will currently return is available as macro + * #AV_HASH_MAX_SIZE. + * + * @param[in] ctx Hash context + * @return Size of the hash value in bytes + */ +int av_hash_get_size(const struct AVHashContext *ctx); + +/** + * Initialize or reset a hash context. + * + * @param[in,out] ctx Hash context + */ +void av_hash_init(struct AVHashContext *ctx); + +/** + * Update a hash context with additional data. + * + * @param[in,out] ctx Hash context + * @param[in] src Data to be added to the hash context + * @param[in] len Size of the additional data + */ +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); + +/** + * Finalize a hash context and compute the actual hash value. + * + * The minimum size of `dst` buffer is given by av_hash_get_size() or + * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * + * @see av_hash_final_bin() provides an alternative API + */ +void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); + +/** + * Finalize a hash context and store the actual hash value in a buffer. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * If `size` is smaller than the hash size (given by av_hash_get_size()), the + * hash is truncated; if size is larger, the buffer is padded with 0. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Number of bytes to write to `dst` + */ +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the hexadecimal representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the + * value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the string will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the Base64 representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is + * the value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Free hash context and set hash context pointer to `NULL`. + * + * @param[in,out] ctx Pointer to hash context + */ +void av_hash_freep(struct AVHashContext **ctx); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_HASH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hmac.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hmac.h new file mode 100644 index 0000000..576a0a4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hmac.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2012 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 + */ + +#ifndef AVUTIL_HMAC_H +#define AVUTIL_HMAC_H + +#include + +#include "version.h" +/** + * @defgroup lavu_hmac HMAC + * @ingroup lavu_crypto + * @{ + */ + +enum AVHMACType { + AV_HMAC_MD5, + AV_HMAC_SHA1, + AV_HMAC_SHA224, + AV_HMAC_SHA256, + AV_HMAC_SHA384 = 12, + AV_HMAC_SHA512, +}; + +typedef struct AVHMAC AVHMAC; + +/** + * Allocate an AVHMAC context. + * @param type The hash function used for the HMAC. + */ +AVHMAC *av_hmac_alloc(enum AVHMACType type); + +/** + * Free an AVHMAC context. + * @param ctx The context to free, may be NULL + */ +void av_hmac_free(AVHMAC *ctx); + +/** + * Initialize an AVHMAC context with an authentication key. + * @param ctx The HMAC context + * @param key The authentication key + * @param keylen The length of the key, in bytes + */ +void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen); + +/** + * Hash data with the HMAC. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + */ +void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len); + +/** + * Finish hashing and output the HMAC digest. + * @param ctx The HMAC context + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen); + +/** + * Hash an array of data with a key. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + * @param key The authentication key + * @param keylen The length of the key, in bytes + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len, + const uint8_t *key, unsigned int keylen, + uint8_t *out, unsigned int outlen); + +/** + * @} + */ + +#endif /* AVUTIL_HMAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext.h new file mode 100644 index 0000000..03334e2 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext.h @@ -0,0 +1,582 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_H +#define AVUTIL_HWCONTEXT_H + +#include "buffer.h" +#include "frame.h" +#include "log.h" +#include "pixfmt.h" + +enum AVHWDeviceType { + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, + AV_HWDEVICE_TYPE_VIDEOTOOLBOX, + AV_HWDEVICE_TYPE_NONE, + AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_DRM, +}; + +typedef struct AVHWDeviceInternal AVHWDeviceInternal; + +/** + * This struct aggregates all the (hardware/vendor-specific) "high-level" state, + * i.e. state that is not tied to a concrete processing configuration. + * E.g., in an API that supports hardware-accelerated encoding and decoding, + * this struct will (if possible) wrap the state that is common to both encoding + * and decoding and from which specific instances of encoders or decoders can be + * derived. + * + * This struct is reference-counted with the AVBuffer mechanism. The + * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field + * points to the actual AVHWDeviceContext. Further objects derived from + * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with + * specific properties) will hold an internal reference to it. After all the + * references are released, the AVHWDeviceContext itself will be freed, + * optionally invoking a user-specified callback for uninitializing the hardware + * state. + */ +typedef struct AVHWDeviceContext { + /** + * A class for logging. Set by av_hwdevice_ctx_alloc(). + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWDeviceInternal *internal; + + /** + * This field identifies the underlying API used for hardware access. + * + * This field is set when this struct is allocated and never changed + * afterwards. + */ + enum AVHWDeviceType type; + + /** + * The format-specific data, allocated and freed by libavutil along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwcontext_*.h) and filled as described in the + * documentation before calling av_hwdevice_ctx_init(). + * + * After calling av_hwdevice_ctx_init() this struct should not be modified + * by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwdevice_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + * + * @note when other objects (e.g an AVHWFramesContext) are derived from this + * struct, this callback will be invoked after all such child objects + * are fully uninitialized and their respective destructors invoked. + */ + void (*free)(struct AVHWDeviceContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; +} AVHWDeviceContext; + +typedef struct AVHWFramesInternal AVHWFramesInternal; + +/** + * This struct describes a set or pool of "hardware" frames (i.e. those with + * data not located in normal system memory). All the frames in the pool are + * assumed to be allocated in the same way and interchangeable. + * + * This struct is reference-counted with the AVBuffer mechanism and tied to a + * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor + * yields a reference, whose data field points to the actual AVHWFramesContext + * struct. + */ +typedef struct AVHWFramesContext { + /** + * A class for logging. + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWFramesInternal *internal; + + /** + * A reference to the parent AVHWDeviceContext. This reference is owned and + * managed by the enclosing AVHWFramesContext, but the caller may derive + * additional references from it. + */ + AVBufferRef *device_ref; + + /** + * The parent AVHWDeviceContext. This is simply a pointer to + * device_ref->data provided for convenience. + * + * Set by libavutil in av_hwframe_ctx_init(). + */ + AVHWDeviceContext *device_ctx; + + /** + * The format-specific data, allocated and freed automatically along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwframe_*.h) and filled as described in the + * documentation before calling av_hwframe_ctx_init(). + * + * After any frames using this context are created, the contents of this + * struct should not be modified by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + */ + void (*free)(struct AVHWFramesContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; + + /** + * A pool from which the frames are allocated by av_hwframe_get_buffer(). + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * The buffers returned by calling av_buffer_pool_get() on this pool must + * have the properties described in the documentation in the corresponding hw + * type's header (hwcontext_*.h). The pool will be freed strictly before + * this struct's free() callback is invoked. + * + * This field may be NULL, then libavutil will attempt to allocate a pool + * internally. Note that certain device types enforce pools allocated at + * fixed size (frame count), which cannot be extended dynamically. In such a + * case, initial_pool_size must be set appropriately. + */ + AVBufferPool *pool; + + /** + * Initial size of the frame pool. If a device type does not support + * dynamically resizing the pool, then this is also the maximum pool size. + * + * May be set by the caller before calling av_hwframe_ctx_init(). Must be + * set if pool is NULL and the device type does not support dynamic pools. + */ + int initial_pool_size; + + /** + * The pixel format identifying the underlying HW surface type. + * + * Must be a hwaccel format, i.e. the corresponding descriptor must have the + * AV_PIX_FMT_FLAG_HWACCEL flag set. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + enum AVPixelFormat format; + + /** + * The pixel format identifying the actual data layout of the hardware + * frames. + * + * Must be set by the caller before calling av_hwframe_ctx_init(). + * + * @note when the underlying API does not provide the exact data layout, but + * only the colorspace/bit depth, this field should be set to the fully + * planar version of that format (e.g. for 8-bit 420 YUV it should be + * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). + */ + enum AVPixelFormat sw_format; + + /** + * The allocated dimensions of the frames in this pool. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + int width, height; +} AVHWFramesContext; + +/** + * Look up an AVHWDeviceType by name. + * + * @param name String name of the device type (case-insensitive). + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); + +/** Get the string name of an AVHWDeviceType. + * + * @param type Type from enum AVHWDeviceType. + * @return Pointer to a static string containing the name, or NULL if the type + * is not valid. + */ +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); + +/** + * Iterate over supported device types. + * + * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type + * returned by this function in subsequent iterations. + * @return The next usable device type from enum AVHWDeviceType, or + * AV_HWDEVICE_TYPE_NONE if there are no more. + */ +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); + +/** + * Allocate an AVHWDeviceContext for a given hardware type. + * + * @param type the type of the hardware device to allocate. + * @return a reference to the newly created AVHWDeviceContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); + +/** + * Finalize the device context before use. This function must be called after + * the context is filled with all the required information and before it is + * used in any way. + * + * @param ref a reference to the AVHWDeviceContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwdevice_ctx_init(AVBufferRef *ref); + +/** + * Open a device of the specified type and create an AVHWDeviceContext for it. + * + * This is a convenience function intended to cover the simple cases. Callers + * who need to fine-tune device creation/management should open the device + * manually and then wrap it in an AVHWDeviceContext using + * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). + * + * The returned context is already initialized and ready for use, the caller + * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of + * the created AVHWDeviceContext are set by this function and should not be + * touched by the caller. + * + * @param device_ctx On success, a reference to the newly-created device context + * will be written here. The reference is owned by the caller + * and must be released with av_buffer_unref() when no longer + * needed. On failure, NULL will be written to this pointer. + * @param type The type of the device to create. + * @param device A type-specific string identifying the device to open. + * @param opts A dictionary of additional (type-specific) options to use in + * opening the device. The dictionary remains owned by the caller. + * @param flags currently unused + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, + const char *device, AVDictionary *opts, int flags); + +/** + * Create a new device of the specified type from an existing device. + * + * If the source device is a device of the target type or was originally + * derived from such a device (possibly through one or more intermediate + * devices of other types), then this will return a reference to the + * existing device of the same type as is requested. + * + * Otherwise, it will attempt to derive a new device from the given source + * device. If direct derivation to the new type is not implemented, it will + * attempt the same derivation from each ancestor of the source device in + * turn looking for an implemented derivation method. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, int flags); + + +/** + * Allocate an AVHWFramesContext tied to a given device context. + * + * @param device_ctx a reference to a AVHWDeviceContext. This function will make + * a new reference for internal use, the one passed to the + * function remains owned by the caller. + * @return a reference to the newly created AVHWFramesContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); + +/** + * Finalize the context before use. This function must be called after the + * context is filled with all the required information and before it is attached + * to any frames. + * + * @param ref a reference to the AVHWFramesContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_ctx_init(AVBufferRef *ref); + +/** + * Allocate a new frame attached to the given AVHWFramesContext. + * + * @param hwframe_ctx a reference to an AVHWFramesContext + * @param frame an empty (freshly allocated or unreffed) frame to be filled with + * newly allocated buffers. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); + +/** + * Copy data to or from a hw surface. At least one of dst/src must have an + * AVHWFramesContext attached. + * + * If src has an AVHWFramesContext attached, then the format of dst (if set) + * must use one of the formats returned by av_hwframe_transfer_get_formats(src, + * AV_HWFRAME_TRANSFER_DIRECTION_FROM). + * If dst has an AVHWFramesContext attached, then the format of src must use one + * of the formats returned by av_hwframe_transfer_get_formats(dst, + * AV_HWFRAME_TRANSFER_DIRECTION_TO) + * + * dst may be "clean" (i.e. with data/buf pointers unset), in which case the + * data buffers will be allocated by this function using av_frame_get_buffer(). + * If dst->format is set, then this format will be used, otherwise (when + * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. + * + * The two frames must have matching allocated dimensions (i.e. equal to + * AVHWFramesContext.width/height), since not all device types support + * transferring a sub-rectangle of the whole surface. The display dimensions + * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but + * also have to be equal for both frames. When the display dimensions are + * smaller than the allocated dimensions, the content of the padding in the + * destination frame is unspecified. + * + * @param dst the destination frame. dst is not touched on failure. + * @param src the source frame. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR error code on failure. + */ +int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); + +enum AVHWFrameTransferDirection { + /** + * Transfer the data from the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_FROM, + + /** + * Transfer the data to the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_TO, +}; + +/** + * Get a list of possible source or target formats usable in + * av_hwframe_transfer_data(). + * + * @param hwframe_ctx the frame context to obtain the information for + * @param dir the direction of the transfer + * @param formats the pointer to the output format list will be written here. + * The list is terminated with AV_PIX_FMT_NONE and must be freed + * by the caller when no longer needed using av_free(). + * If this function returns successfully, the format list will + * have at least one item (not counting the terminator). + * On failure, the contents of this pointer are unspecified. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats, int flags); + + +/** + * This struct describes the constraints on hardware frames attached to + * a given device with a hardware-specific configuration. This is returned + * by av_hwdevice_get_hwframe_constraints() and must be freed by + * av_hwframe_constraints_free() after use. + */ +typedef struct AVHWFramesConstraints { + /** + * A list of possible values for format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. This member will always be filled. + */ + enum AVPixelFormat *valid_hw_formats; + + /** + * A list of possible values for sw_format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is + * not known. + */ + enum AVPixelFormat *valid_sw_formats; + + /** + * The minimum size of frames in this hw_frames_ctx. + * (Zero if not known.) + */ + int min_width; + int min_height; + + /** + * The maximum size of frames in this hw_frames_ctx. + * (INT_MAX if not known / no limit.) + */ + int max_width; + int max_height; +} AVHWFramesConstraints; + +/** + * Allocate a HW-specific configuration structure for a given HW device. + * After use, the user must free all members as required by the specific + * hardware structure being used, then free the structure itself with + * av_free(). + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @return The newly created HW-specific configuration structure on + * success or NULL on failure. + */ +void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); + +/** + * Get the constraints on HW frames given a device and the HW-specific + * configuration to be used with that device. If no HW-specific + * configuration is provided, returns the maximum possible capabilities + * of the device. + * + * @param ref a reference to the associated AVHWDeviceContext. + * @param hwconfig a filled HW-specific configuration structure, or NULL + * to return the maximum possible capabilities of the device. + * @return AVHWFramesConstraints structure describing the constraints + * on the device, or NULL if not available. + */ +AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, + const void *hwconfig); + +/** + * Free an AVHWFrameConstraints structure. + * + * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. + */ +void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); + + +/** + * Flags to apply to frame mappings. + */ +enum { + /** + * The mapping must be readable. + */ + AV_HWFRAME_MAP_READ = 1 << 0, + /** + * The mapping must be writeable. + */ + AV_HWFRAME_MAP_WRITE = 1 << 1, + /** + * The mapped frame will be overwritten completely in subsequent + * operations, so the current frame data need not be loaded. Any values + * which are not overwritten are unspecified. + */ + AV_HWFRAME_MAP_OVERWRITE = 1 << 2, + /** + * The mapping must be direct. That is, there must not be any copying in + * the map or unmap steps. Note that performance of direct mappings may + * be much lower than normal memory. + */ + AV_HWFRAME_MAP_DIRECT = 1 << 3, +}; + +/** + * Map a hardware frame. + * + * This has a number of different possible effects, depending on the format + * and origin of the src and dst frames. On input, src should be a usable + * frame with valid buffers and dst should be blank (typically as just created + * by av_frame_alloc()). src should have an associated hwframe context, and + * dst may optionally have a format and associated hwframe context. + * + * If src was created by mapping a frame from the hwframe context of dst, + * then this function undoes the mapping - dst is replaced by a reference to + * the frame that src was originally mapped from. + * + * If both src and dst have an associated hwframe context, then this function + * attempts to map the src frame from its hardware context to that of dst and + * then fill dst with appropriate data to be usable there. This will only be + * possible if the hwframe contexts and associated devices are compatible - + * given compatible devices, av_hwframe_ctx_create_derived() can be used to + * create a hwframe context for dst in which mapping should be possible. + * + * If src has a hwframe context but dst does not, then the src frame is + * mapped to normal memory and should thereafter be usable as a normal frame. + * If the format is set on dst, then the mapping will attempt to create dst + * with that format and fail if it is not possible. If format is unset (is + * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate + * format to use is (probably the sw_format of the src hwframe context). + * + * A return value of AVERROR(ENOSYS) indicates that the mapping is not + * possible with the given arguments and hwframe setup, while other return + * values indicate that it failed somehow. + * + * @param dst Destination frame, to contain the mapping. + * @param src Source frame, to be mapped. + * @param flags Some combination of AV_HWFRAME_MAP_* flags. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); + + +/** + * Create and initialise an AVHWFramesContext as a mapping of another existing + * AVHWFramesContext on a different device. + * + * av_hwframe_ctx_init() should not be called after this. + * + * @param derived_frame_ctx On success, a reference to the newly created + * AVHWFramesContext. + * @param derived_device_ctx A reference to the device to create the new + * AVHWFramesContext on. + * @param source_frame_ctx A reference to an existing AVHWFramesContext + * which will be mapped to the derived context. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, + enum AVPixelFormat format, + AVBufferRef *derived_device_ctx, + AVBufferRef *source_frame_ctx, + int flags); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_cuda.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_cuda.h new file mode 100644 index 0000000..12dae84 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_cuda.h @@ -0,0 +1,51 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_CUDA_H +#define AVUTIL_HWCONTEXT_CUDA_H + +#ifndef CUDA_VERSION +#include +#endif + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_CUDA. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CUdeviceptr. + */ + +typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal; + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; + AVCUDADeviceContextInternal *internal; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_d3d11va.h new file mode 100644 index 0000000..98db7ce --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_d3d11va.h @@ -0,0 +1,168 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_D3D11VA_H +#define AVUTIL_HWCONTEXT_D3D11VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA. + * + * The default pool implementation will be fixed-size if initial_pool_size is + * set (and allocate elements from an array texture). Otherwise it will allocate + * individual textures. Be aware that decoding requires a single array texture. + * + * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to + * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for + * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. + */ + +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVD3D11VADeviceContext { + /** + * Device used for texture creation and access. This can also be used to + * set the libavcodec decoding device. + * + * Must be set by the user. This is the only mandatory field - the other + * device context fields are set from this and are available for convenience. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11Device *device; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11DeviceContext *device_context; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoDevice *video_device; + + /** + * If unset, this will be set from the device_context field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoContext *video_context; + + /** + * Callbacks for locking. They protect accesses to device_context and + * video_context calls. They also protect access to the internal staging + * texture (for av_hwframe_transfer_data() calls). They do NOT protect + * access to hwcontext or decoder state in general. + * + * If unset on init, the hwcontext implementation will set them to use an + * internal mutex. + * + * The underlying lock must be recursive. lock_ctx is for free use by the + * locking implementation. + */ + void (*lock)(void *lock_ctx); + void (*unlock)(void *lock_ctx); + void *lock_ctx; +} AVD3D11VADeviceContext; + +/** + * D3D11 frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + * + * This has no use outside of custom allocation, and AVFrame AVBufferRef do not + * necessarily point to an instance of this struct. + */ +typedef struct AVD3D11FrameDescriptor { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + * + * Normally stored in AVFrame.data[0]. + */ + ID3D11Texture2D *texture; + + /** + * The index into the array texture element representing the frame, or 0 + * if the texture is not an array texture. + * + * Normally stored in AVFrame.data[1] (cast from intptr_t). + */ + intptr_t index; +} AVD3D11FrameDescriptor; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVD3D11VAFramesContext { + /** + * The canonical texture used for pool allocation. If this is set to NULL + * on init, the hwframes implementation will allocate and set an array + * texture if initial_pool_size > 0. + * + * The only situation when the API user should set this is: + * - the user wants to do manual pool allocation (setting + * AVHWFramesContext.pool), instead of letting AVHWFramesContext + * allocate the pool + * - of an array texture + * - and wants it to use it for decoding + * - this has to be done before calling av_hwframe_ctx_init() + * + * Deallocating the AVHWFramesContext will always release this interface, + * and it does not matter whether it was user-allocated. + * + * This is in particular used by the libavcodec D3D11VA hwaccel, which + * requires a single array texture. It will create ID3D11VideoDecoderOutputView + * objects for each array texture element on decoder initialization. + */ + ID3D11Texture2D *texture; + + /** + * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must + * at least set D3D11_BIND_DECODER if the frames context is to be used for + * video decoding. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT BindFlags; + + /** + * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT MiscFlags; +} AVD3D11VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_drm.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_drm.h new file mode 100644 index 0000000..2e22545 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_drm.h @@ -0,0 +1,166 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_DRM_H +#define AVUTIL_HWCONTEXT_DRM_H + +#include +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_DRM. + * + * Internal frame allocation is not currently supported - all frames + * must be allocated by the user. Thus AVHWFramesContext is always + * NULL, though this may change if support for frame allocation is + * added in future. + */ + +enum { + /** + * The maximum number of layers/planes in a DRM frame. + */ + AV_DRM_MAX_PLANES = 4 +}; + +/** + * DRM object descriptor. + * + * Describes a single DRM object, addressing it as a PRIME file + * descriptor. + */ +typedef struct AVDRMObjectDescriptor { + /** + * DRM PRIME fd for the object. + */ + int fd; + /** + * Total size of the object. + * + * (This includes any parts not which do not contain image data.) + */ + size_t size; + /** + * Format modifier applied to the object (DRM_FORMAT_MOD_*). + */ + uint64_t format_modifier; +} AVDRMObjectDescriptor; + +/** + * DRM plane descriptor. + * + * Describes a single plane of a layer, which is contained within + * a single object. + */ +typedef struct AVDRMPlaneDescriptor { + /** + * Index of the object containing this plane in the objects + * array of the enclosing frame descriptor. + */ + int object_index; + /** + * Offset within that object of this plane. + */ + ptrdiff_t offset; + /** + * Pitch (linesize) of this plane. + */ + ptrdiff_t pitch; +} AVDRMPlaneDescriptor; + +/** + * DRM layer descriptor. + * + * Describes a single layer within a frame. This has the structure + * defined by its format, and will contain one or more planes. + */ +typedef struct AVDRMLayerDescriptor { + /** + * Format of the layer (DRM_FORMAT_*). + */ + uint32_t format; + /** + * Number of planes in the layer. + * + * This must match the number of planes required by format. + */ + int nb_planes; + /** + * Array of planes in this layer. + */ + AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; +} AVDRMLayerDescriptor; + +/** + * DRM frame descriptor. + * + * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. + * It is also used by user-allocated frame pools - allocating in + * AVHWFramesContext.pool must return AVBufferRefs which contain + * an object of this type. + * + * The fields of this structure should be set such it can be + * imported directly by EGL using the EGL_EXT_image_dma_buf_import + * and EGL_EXT_image_dma_buf_import_modifiers extensions. + * (Note that the exact layout of a particular format may vary between + * platforms - we only specify that the same platform should be able + * to import it.) + * + * The total number of planes must not exceed AV_DRM_MAX_PLANES, and + * the order of the planes by increasing layer index followed by + * increasing plane index must be the same as the order which would + * be used for the data pointers in the equivalent software format. + */ +typedef struct AVDRMFrameDescriptor { + /** + * Number of DRM objects making up this frame. + */ + int nb_objects; + /** + * Array of objects making up the frame. + */ + AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; + /** + * Number of layers in the frame. + */ + int nb_layers; + /** + * Array of layers in the frame. + */ + AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; +} AVDRMFrameDescriptor; + +/** + * DRM device. + * + * Allocated as AVHWDeviceContext.hwctx. + */ +typedef struct AVDRMDeviceContext { + /** + * File descriptor of DRM device. + * + * This is used as the device to create frames on, and may also be + * used in some derivation and mapping operations. + * + * If no device is required, set to -1. + */ + int fd; +} AVDRMDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_DRM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_dxva2.h new file mode 100644 index 0000000..e1b79bc --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_dxva2.h @@ -0,0 +1,75 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_DXVA2_H +#define AVUTIL_HWCONTEXT_DXVA2_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_DXVA2. + * + * Only fixed-size pools are supported. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a pointer to IDirect3DSurface9. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVDXVA2DeviceContext { + IDirect3DDeviceManager9 *devmgr; +} AVDXVA2DeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVDXVA2FramesContext { + /** + * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or + * DXVA2_VideoDecoderRenderTarget). Must be set by the caller. + */ + DWORD surface_type; + + /** + * The surface pool. When an external pool is not provided by the caller, + * this will be managed (allocated and filled on init, freed on uninit) by + * libavutil. + */ + IDirect3DSurface9 **surfaces; + int nb_surfaces; + + /** + * Certain drivers require the decoder to be destroyed before the surfaces. + * To allow internally managed pools to work properly in such cases, this + * field is provided. + * + * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on + * it just before the internal surface pool is freed. + * + * This is for convenience only. Some code uses other methods to manage the + * decoder reference. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_qsv.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_qsv.h new file mode 100644 index 0000000..b98d611 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_qsv.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_QSV_H +#define AVUTIL_HWCONTEXT_QSV_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_QSV. + * + * This API does not support dynamic frame pools. AVHWFramesContext.pool must + * contain AVBufferRefs whose data pointer points to an mfxFrameSurface1 struct. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVQSVDeviceContext { + mfxSession session; +} AVQSVDeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVQSVFramesContext { + mfxFrameSurface1 *surfaces; + int nb_surfaces; + + /** + * A combination of MFX_MEMTYPE_* describing the frame pool. + */ + int frame_type; +} AVQSVFramesContext; + +#endif /* AVUTIL_HWCONTEXT_QSV_H */ + diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vaapi.h new file mode 100644 index 0000000..0b2e071 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vaapi.h @@ -0,0 +1,117 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VAAPI_H +#define AVUTIL_HWCONTEXT_VAAPI_H + +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VAAPI. + * + * Dynamic frame pools are supported, but note that any pool used as a render + * target is required to be of fixed size in order to be be usable as an + * argument to vaCreateContext(). + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a VASurfaceID. + */ + +enum { + /** + * The quirks field has been set by the user and should not be detected + * automatically by av_hwdevice_ctx_init(). + */ + AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), + + /** + * The driver does not support the VASurfaceAttribMemoryType attribute, + * so the surface allocation code will not try to use it. + */ + AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), + + /** + * The driver does not support surface attributes at all. + * The surface allocation code will never pass them to surface allocation, + * and the results of the vaQuerySurfaceAttributes() call will be faked. + */ + AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), +}; + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers, unless the + * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user + * may need to refer to this field when performing any later + * operations using VAAPI with the same VADisplay. + */ + unsigned int driver_quirks; +} AVVAAPIDeviceContext; + +/** + * VAAPI-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVVAAPIFramesContext { + /** + * Set by the user to apply surface attributes to all surfaces in + * the frame pool. If null, default settings are used. + */ + VASurfaceAttrib *attributes; + int nb_attributes; + /** + * The surfaces IDs of all surfaces in the pool after creation. + * Only valid if AVHWFramesContext.initial_pool_size was positive. + * These are intended to be used as the render_targets arguments to + * vaCreateContext(). + */ + VASurfaceID *surface_ids; + int nb_surfaces; +} AVVAAPIFramesContext; + +/** + * VAAPI hardware pipeline configuration details. + * + * Allocated with av_hwdevice_hwconfig_alloc(). + */ +typedef struct AVVAAPIHWConfig { + /** + * ID of a VAAPI pipeline configuration. + */ + VAConfigID config_id; +} AVVAAPIHWConfig; + +#endif /* AVUTIL_HWCONTEXT_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vdpau.h new file mode 100644 index 0000000..1b7ea1e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_vdpau.h @@ -0,0 +1,44 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VDPAU_H +#define AVUTIL_HWCONTEXT_VDPAU_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VDPAU. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a VdpVideoSurface. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVDPAUDeviceContext { + VdpDevice device; + VdpGetProcAddress *get_proc_address; +} AVVDPAUDeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_videotoolbox.h new file mode 100644 index 0000000..380918d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/hwcontext_videotoolbox.h @@ -0,0 +1,54 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H +#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H + +#include + +#include + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX. + * + * This API currently does not support frame allocation, as the raw VideoToolbox + * API does allocation, and FFmpeg itself never has the need to allocate frames. + * + * If the API user sets a custom pool, AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef. + * + * Currently AVHWDeviceContext.hwctx and AVHWFramesContext.hwctx are always + * NULL. + */ + +/** + * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. + * Returns AV_PIX_FMT_NONE if no known equivalent was found. + */ +enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); + +/** + * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format. + * Returns 0 if no known equivalent was found. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); + +#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/imgutils.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/imgutils.h new file mode 100644 index 0000000..5b790ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/imgutils.h @@ -0,0 +1,277 @@ +/* + * 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 + */ + +#ifndef AVUTIL_IMGUTILS_H +#define AVUTIL_IMGUTILS_H + +/** + * @file + * misc image utilities + * + * @addtogroup lavu_picture + * @{ + */ + +#include "avutil.h" +#include "pixdesc.h" +#include "rational.h" + +/** + * Compute the max pixel step for each plane of an image with a + * format described by pixdesc. + * + * The pixel step is the distance in bytes between the first byte of + * the group of bytes which describe a pixel component and the first + * byte of the successive group in the same plane for the same + * component. + * + * @param max_pixsteps an array which is filled with the max pixel step + * for each plane. Since a plane may contain different pixel + * components, the computed max_pixsteps[plane] is relative to the + * component in the plane with the max pixel step. + * @param max_pixstep_comps an array which is filled with the component + * for each plane which has the max pixel step. May be NULL. + */ +void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], + const AVPixFmtDescriptor *pixdesc); + +/** + * Compute the size of an image line with format pix_fmt and width + * width for the plane plane. + * + * @return the computed size in bytes + */ +int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane); + +/** + * Fill plane linesizes for an image with pixel format pix_fmt and + * width width. + * + * @param linesizes array to be filled with the linesize for each plane + * @return >= 0 in case of success, a negative error code otherwise + */ +int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width); + +/** + * Fill plane data pointers for an image with pixel format pix_fmt and + * height height. + * + * @param data pointers array to be filled with the pointer for each image plane + * @param ptr the pointer to a buffer which will contain the image + * @param linesizes the array containing the linesize for each + * plane, should be filled by av_image_fill_linesizes() + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, + uint8_t *ptr, const int linesizes[4]); + +/** + * Allocate an image with size w and h and pixel format pix_fmt, and + * fill pointers and linesizes accordingly. + * The allocated image buffer has to be freed by using + * av_freep(&pointers[0]). + * + * @param align the value to use for buffer size alignment + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum AVPixelFormat pix_fmt, int align); + +/** + * Copy image plane from src to dst. + * That is, copy "height" number of lines of "bytewidth" bytes each. + * The first byte of each successive line is separated by *_linesize + * bytes. + * + * bytewidth must be contained by both absolute values of dst_linesize + * and src_linesize, otherwise the function behavior is undefined. + * + * @param dst_linesize linesize for the image plane in dst + * @param src_linesize linesize for the image plane in src + */ +void av_image_copy_plane(uint8_t *dst, int dst_linesize, + const uint8_t *src, int src_linesize, + int bytewidth, int height); + +/** + * Copy image in src_data to dst_data. + * + * @param dst_linesizes linesizes for the image in dst_data + * @param src_linesizes linesizes for the image in src_data + */ +void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], + const uint8_t *src_data[4], const int src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy(). + * + * The data pointers and the linesizes must be aligned to the maximum required + * by the CPU architecture. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy(). + * @note On x86, the linesizes currently need to be aligned to the cacheline + * size (i.e. 64) to get improved performance. + */ +void av_image_copy_uc_from(uint8_t *dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t *src_data[4], const ptrdiff_t src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Setup the data pointers and linesizes based on the specified image + * parameters and the provided array. + * + * The fields of the given image are filled in by using the src + * address which points to the image data buffer. Depending on the + * specified pixel format, one or multiple image data pointers and + * line sizes will be set. If a planar format is specified, several + * pointers will be set pointing to the different picture planes and + * the line sizes of the different planes will be stored in the + * lines_sizes array. Call with src == NULL to get the required + * size for the src buffer. + * + * To allocate the buffer and fill in the dst_data and dst_linesize in + * one call, use av_image_alloc(). + * + * @param dst_data data pointers to be filled in + * @param dst_linesize linesizes for the image in dst_data to be filled in + * @param src buffer which will contain or contains the actual image data, can be NULL + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the value used in src for linesize alignment + * @return the size in bytes required for src, a negative error code + * in case of failure + */ +int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], + const uint8_t *src, + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Return the size in bytes of the amount of data required to store an + * image with the given parameters. + * + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the assumed linesize alignment + * @return the buffer size in bytes, a negative error code in case of failure + */ +int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Copy image data from an image into a buffer. + * + * av_image_get_buffer_size() can be used to compute the required size + * for the buffer to fill. + * + * @param dst a buffer into which picture data will be copied + * @param dst_size the size in bytes of dst + * @param src_data pointers containing the source image data + * @param src_linesize linesizes for the image in src_data + * @param pix_fmt the pixel format of the source image + * @param width the width of the source image in pixels + * @param height the height of the source image in pixels + * @param align the assumed linesize alignment for dst + * @return the number of bytes written to dst, or a negative value + * (error code) on error + */ +int av_image_copy_to_buffer(uint8_t *dst, int dst_size, + const uint8_t * const src_data[4], const int src_linesize[4], + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of the image can be addressed with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of a plane of an image with the specified pix_fmt can be addressed + * with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param max_pixels the maximum number of pixels the user wants to accept + * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown. + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx); + +/** + * Check if the given sample aspect ratio of an image is valid. + * + * It is considered invalid if the denominator is 0 or if applying the ratio + * to the image size would make the smaller dimension less than 1. If the + * sar numerator is 0, it is considered unknown and will return as valid. + * + * @param w width of the image + * @param h height of the image + * @param sar sample aspect ratio of the image + * @return 0 if valid, a negative AVERROR code otherwise + */ +int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); + +/** + * Overwrite the image data with black. This is suitable for filling a + * sub-rectangle of an image, meaning the padding between the right most pixel + * and the left most pixel on the next line will not be overwritten. For some + * formats, the image size might be rounded up due to inherent alignment. + * + * If the pixel format has alpha, the alpha is cleared to opaque. + * + * This can return an error if the pixel format is not supported. Normally, all + * non-hwaccel pixel formats should be supported. + * + * Passing NULL for dst_data is allowed. Then the function returns whether the + * operation would have succeeded. (It can return an error if the pix_fmt is + * not supported.) + * + * @param dst_data data pointers to destination image + * @param dst_linesize linesizes for the destination image + * @param pix_fmt the pixel format of the image + * @param range the color range of the image (important for colorspaces such as YUV) + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return 0 if the image data was cleared, a negative AVERROR code otherwise + */ +int av_image_fill_black(uint8_t *dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, enum AVColorRange range, + int width, int height); + +/** + * @} + */ + + +#endif /* AVUTIL_IMGUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intfloat.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intfloat.h new file mode 100644 index 0000000..fe3d7ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intfloat.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_INTFLOAT_H +#define AVUTIL_INTFLOAT_H + +#include +#include "attributes.h" + +union av_intfloat32 { + uint32_t i; + float f; +}; + +union av_intfloat64 { + uint64_t i; + double f; +}; + +/** + * Reinterpret a 32-bit integer as a float. + */ +static av_always_inline float av_int2float(uint32_t i) +{ + union av_intfloat32 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a float as a 32-bit integer. + */ +static av_always_inline uint32_t av_float2int(float f) +{ + union av_intfloat32 v; + v.f = f; + return v.i; +} + +/** + * Reinterpret a 64-bit integer as a double. + */ +static av_always_inline double av_int2double(uint64_t i) +{ + union av_intfloat64 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a double as a 64-bit integer. + */ +static av_always_inline uint64_t av_double2int(double f) +{ + union av_intfloat64 v; + v.f = f; + return v.i; +} + +#endif /* AVUTIL_INTFLOAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intreadwrite.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intreadwrite.h new file mode 100644 index 0000000..d54d4b9 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/intreadwrite.h @@ -0,0 +1,634 @@ +/* + * 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 + */ + +#ifndef AVUTIL_INTREADWRITE_H +#define AVUTIL_INTREADWRITE_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" +#include "bswap.h" + +typedef union { + uint64_t u64; + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8 [8]; + double f64; + float f32[2]; +} av_alias av_alias64; + +typedef union { + uint32_t u32; + uint16_t u16[2]; + uint8_t u8 [4]; + float f32; +} av_alias av_alias32; + +typedef union { + uint16_t u16; + uint8_t u8 [2]; +} av_alias av_alias16; + +/* + * Arch-specific headers can provide any combination of + * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. + * + * R/W means read/write, B/L/N means big/little/native endianness. + * The following macros require aligned access, compared to their + * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A. + * Incorrect usage may range from abysmal performance to crash + * depending on the platform. + * + * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U. + */ + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/intreadwrite.h" +#elif ARCH_AVR32 +# include "avr32/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" +#elif ARCH_PPC +# include "ppc/intreadwrite.h" +#elif ARCH_TOMI +# include "tomi/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +/* + * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. + */ + +#if AV_HAVE_BIGENDIAN + +# if defined(AV_RN16) && !defined(AV_RB16) +# define AV_RB16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RB16) +# define AV_RN16(p) AV_RB16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WB16) +# define AV_WB16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WB16) +# define AV_WN16(p, v) AV_WB16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RB24) +# define AV_RB24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RB24) +# define AV_RN24(p) AV_RB24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WB24) +# define AV_WB24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WB24) +# define AV_WN24(p, v) AV_WB24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RB32) +# define AV_RB32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RB32) +# define AV_RN32(p) AV_RB32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WB32) +# define AV_WB32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WB32) +# define AV_WN32(p, v) AV_WB32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RB48) +# define AV_RB48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RB48) +# define AV_RN48(p) AV_RB48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WB48) +# define AV_WB48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WB48) +# define AV_WN48(p, v) AV_WB48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RB64) +# define AV_RB64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RB64) +# define AV_RN64(p) AV_RB64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WB64) +# define AV_WB64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WB64) +# define AV_WN64(p, v) AV_WB64(p, v) +# endif + +#else /* AV_HAVE_BIGENDIAN */ + +# if defined(AV_RN16) && !defined(AV_RL16) +# define AV_RL16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RL16) +# define AV_RN16(p) AV_RL16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WL16) +# define AV_WL16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WL16) +# define AV_WN16(p, v) AV_WL16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RL24) +# define AV_RL24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RL24) +# define AV_RN24(p) AV_RL24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WL24) +# define AV_WL24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WL24) +# define AV_WN24(p, v) AV_WL24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RL32) +# define AV_RL32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RL32) +# define AV_RN32(p) AV_RL32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WL32) +# define AV_WL32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WL32) +# define AV_WN32(p, v) AV_WL32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RL48) +# define AV_RL48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RL48) +# define AV_RN48(p) AV_RL48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WL48) +# define AV_WL48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WL48) +# define AV_WN48(p, v) AV_WL48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RL64) +# define AV_RL64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RL64) +# define AV_RN64(p) AV_RL64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WL64) +# define AV_WL64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WL64) +# define AV_WN64(p, v) AV_WL64(p, v) +# endif + +#endif /* !AV_HAVE_BIGENDIAN */ + +/* + * Define AV_[RW]N helper macros to simplify definitions not provided + * by per-arch headers. + */ + +#if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__) + +union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; +union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; +union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; + +# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) +# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) + +#elif defined(__DECC) + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64)) && AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) +# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#else + +#ifndef AV_RB16 +# define AV_RB16(x) \ + ((((const uint8_t*)(x))[0] << 8) | \ + ((const uint8_t*)(x))[1]) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RL16 +# define AV_RL16(x) \ + ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RB32 +# define AV_RB32(x) \ + (((uint32_t)((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RL32 +# define AV_RL32(x) \ + (((uint32_t)((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RB64 +# define AV_RB64(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ + ((uint8_t*)(p))[5] = (d)>>16; \ + ((uint8_t*)(p))[4] = (d)>>24; \ + ((uint8_t*)(p))[3] = (d)>>32; \ + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; \ + } while(0) +#endif + +#ifndef AV_RL64 +# define AV_RL64(x) \ + (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; \ + } while(0) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RN(s, p) AV_RB##s(p) +# define AV_WN(s, p, v) AV_WB##s(p, v) +#else +# define AV_RN(s, p) AV_RL##s(p) +# define AV_WN(s, p, v) AV_WL##s(p, v) +#endif + +#endif /* HAVE_FAST_UNALIGNED */ + +#ifndef AV_RN16 +# define AV_RN16(p) AV_RN(16, p) +#endif + +#ifndef AV_RN32 +# define AV_RN32(p) AV_RN(32, p) +#endif + +#ifndef AV_RN64 +# define AV_RN64(p) AV_RN(64, p) +#endif + +#ifndef AV_WN16 +# define AV_WN16(p, v) AV_WN(16, p, v) +#endif + +#ifndef AV_WN32 +# define AV_WN32(p, v) AV_WN(32, p, v) +#endif + +#ifndef AV_WN64 +# define AV_WN64(p, v) AV_WN(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RB(s, p) AV_RN##s(p) +# define AV_WB(s, p, v) AV_WN##s(p, v) +# define AV_RL(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) +#else +# define AV_RB(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) +# define AV_RL(s, p) AV_RN##s(p) +# define AV_WL(s, p, v) AV_WN##s(p, v) +#endif + +#define AV_RB8(x) (((const uint8_t*)(x))[0]) +#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) + +#define AV_RL8(x) AV_RB8(x) +#define AV_WL8(p, d) AV_WB8(p, d) + +#ifndef AV_RB16 +# define AV_RB16(p) AV_RB(16, p) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, v) AV_WB(16, p, v) +#endif + +#ifndef AV_RL16 +# define AV_RL16(p) AV_RL(16, p) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, v) AV_WL(16, p, v) +#endif + +#ifndef AV_RB32 +# define AV_RB32(p) AV_RB(32, p) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, v) AV_WB(32, p, v) +#endif + +#ifndef AV_RL32 +# define AV_RL32(p) AV_RL(32, p) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, v) AV_WL(32, p, v) +#endif + +#ifndef AV_RB64 +# define AV_RB64(p) AV_RB(64, p) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, v) AV_WB(64, p, v) +#endif + +#ifndef AV_RL64 +# define AV_RL64(p) AV_RL(64, p) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, v) AV_WL(64, p, v) +#endif + +#ifndef AV_RB24 +# define AV_RB24(x) \ + ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[2]) +#endif +#ifndef AV_WB24 +# define AV_WB24(p, d) do { \ + ((uint8_t*)(p))[2] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[0] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RL24 +# define AV_RL24(x) \ + ((((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL24 +# define AV_WL24(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RB48 +# define AV_RB48(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 8) | \ + (uint64_t)((const uint8_t*)(x))[5]) +#endif +#ifndef AV_WB48 +# define AV_WB48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[5] = (d); \ + ((uint8_t*)(p))[4] = (d)>>8; \ + ((uint8_t*)(p))[3] = (d)>>16; \ + ((uint8_t*)(p))[2] = (d)>>24; \ + ((uint8_t*)(p))[1] = (d)>>32; \ + ((uint8_t*)(p))[0] = (d)>>40; \ + } while(0) +#endif + +#ifndef AV_RL48 +# define AV_RL48(x) \ + (((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL48 +# define AV_WL48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + } while(0) +#endif + +/* + * The AV_[RW]NA macros access naturally aligned data + * in a type-safe way. + */ + +#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s) +#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#ifndef AV_RN16A +# define AV_RN16A(p) AV_RNA(16, p) +#endif + +#ifndef AV_RN32A +# define AV_RN32A(p) AV_RNA(32, p) +#endif + +#ifndef AV_RN64A +# define AV_RN64A(p) AV_RNA(64, p) +#endif + +#ifndef AV_WN16A +# define AV_WN16A(p, v) AV_WNA(16, p, v) +#endif + +#ifndef AV_WN32A +# define AV_WN32A(p, v) AV_WNA(32, p, v) +#endif + +#ifndef AV_WN64A +# define AV_WN64A(p, v) AV_WNA(64, p, v) +#endif + +/* + * The AV_COPYxxU macros are suitable for copying data to/from unaligned + * memory locations. + */ + +#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); + +#ifndef AV_COPY16U +# define AV_COPY16U(d, s) AV_COPYU(16, d, s) +#endif + +#ifndef AV_COPY32U +# define AV_COPY32U(d, s) AV_COPYU(32, d, s) +#endif + +#ifndef AV_COPY64U +# define AV_COPY64U(d, s) AV_COPYU(64, d, s) +#endif + +#ifndef AV_COPY128U +# define AV_COPY128U(d, s) \ + do { \ + AV_COPY64U(d, s); \ + AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \ + } while(0) +#endif + +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) \ + (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) + +#ifndef AV_COPY16 +# define AV_COPY16(d, s) AV_COPY(16, d, s) +#endif + +#ifndef AV_COPY32 +# define AV_COPY32(d, s) AV_COPY(32, d, s) +#endif + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) + +#ifndef AV_ZERO16 +# define AV_ZERO16(d) AV_ZERO(16, d) +#endif + +#ifndef AV_ZERO32 +# define AV_ZERO32(d) AV_ZERO(32, d) +#endif + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + +#endif /* AVUTIL_INTREADWRITE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lfg.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lfg.h new file mode 100644 index 0000000..03f779a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lfg.h @@ -0,0 +1,71 @@ +/* + * Lagged Fibonacci PRNG + * Copyright (c) 2008 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LFG_H +#define AVUTIL_LFG_H + +#include + +typedef struct AVLFG { + unsigned int state[64]; + int index; +} AVLFG; + +void av_lfg_init(AVLFG *c, unsigned int seed); + +/** + * Seed the state of the ALFG using binary data. + * + * Return value: 0 on success, negative value (AVERROR) on failure. + */ +int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); + +/** + * Get the next random unsigned 32-bit number using an ALFG. + * + * Please also consider a simple LCG like state= state*1664525+1013904223, + * it may be good enough and faster for your specific use case. + */ +static inline unsigned int av_lfg_get(AVLFG *c){ + c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + return c->state[c->index++ & 63]; +} + +/** + * Get the next random unsigned 32-bit number using a MLFG. + * + * Please also consider av_lfg_get() above, it is faster. + */ +static inline unsigned int av_mlfg_get(AVLFG *c){ + unsigned int a= c->state[(c->index-55) & 63]; + unsigned int b= c->state[(c->index-24) & 63]; + return c->state[c->index++ & 63] = 2*a*b+a+b; +} + +/** + * Get the next two numbers generated by a Box-Muller Gaussian + * generator using the random numbers issued by lfg. + * + * @param out array where the two generated numbers are placed + */ +void av_bmg_get(AVLFG *lfg, double out[2]); + +#endif /* AVUTIL_LFG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/log.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/log.h new file mode 100644 index 0000000..f0a5738 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/log.h @@ -0,0 +1,376 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LOG_H +#define AVUTIL_LOG_H + +#include +#include "avutil.h" +#include "attributes.h" +#include "version.h" + +typedef enum { + AV_CLASS_CATEGORY_NA = 0, + AV_CLASS_CATEGORY_INPUT, + AV_CLASS_CATEGORY_OUTPUT, + AV_CLASS_CATEGORY_MUXER, + AV_CLASS_CATEGORY_DEMUXER, + AV_CLASS_CATEGORY_ENCODER, + AV_CLASS_CATEGORY_DECODER, + AV_CLASS_CATEGORY_FILTER, + AV_CLASS_CATEGORY_BITSTREAM_FILTER, + AV_CLASS_CATEGORY_SWSCALER, + AV_CLASS_CATEGORY_SWRESAMPLER, + AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, + AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT, + AV_CLASS_CATEGORY_NB ///< not part of ABI/API +}AVClassCategory; + +#define AV_IS_INPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) + +#define AV_IS_OUTPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) + +struct AVOptionRanges; + +/** + * Describe the class of an AVClass context structure. That is an + * arbitrary struct of which the first field is a pointer to an + * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). + */ +typedef struct AVClass { + /** + * The name of the class; usually it is the same name as the + * context structure type to which the AVClass is associated. + */ + const char* class_name; + + /** + * A pointer to a function which returns the name of a context + * instance ctx associated with the class. + */ + const char* (*item_name)(void* ctx); + + /** + * a pointer to the first option specified in the class if any or NULL + * + * @see av_set_default_options() + */ + const struct AVOption *option; + + /** + * LIBAVUTIL_VERSION with which this structure was created. + * This is used to allow fields to be added without requiring major + * version bumps everywhere. + */ + + int version; + + /** + * Offset in the structure where log_level_offset is stored. + * 0 means there is no such variable + */ + int log_level_offset_offset; + + /** + * Offset in the structure where a pointer to the parent context for + * logging is stored. For example a decoder could pass its AVCodecContext + * to eval as such a parent context, which an av_log() implementation + * could then leverage to display the parent context. + * The offset can be NULL. + */ + int parent_log_context_offset; + + /** + * Return next AVOptions-enabled child or NULL + */ + void* (*child_next)(void *obj, void *prev); + + /** + * Return an AVClass corresponding to the next potential + * AVOptions-enabled child. + * + * The difference between child_next and this is that + * child_next iterates over _already existing_ objects, while + * child_class_next iterates over _all possible_ children. + */ + const struct AVClass* (*child_class_next)(const struct AVClass *prev); + + /** + * Category used for visualization (like color) + * This is only set if the category is equal for all objects using this class. + * available since version (51 << 16 | 56 << 8 | 100) + */ + AVClassCategory category; + + /** + * Callback to return the category. + * available since version (51 << 16 | 59 << 8 | 100) + */ + AVClassCategory (*get_category)(void* ctx); + + /** + * Callback to return the supported/allowed ranges. + * available since version (52.12) + */ + int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); +} AVClass; + +/** + * @addtogroup lavu_log + * + * @{ + * + * @defgroup lavu_log_constants Logging Constants + * + * @{ + */ + +/** + * Print no output. + */ +#define AV_LOG_QUIET -8 + +/** + * Something went really wrong and we will crash now. + */ +#define AV_LOG_PANIC 0 + +/** + * Something went wrong and recovery is not possible. + * For example, no header was found for a format which depends + * on headers or an illegal combination of parameters is used. + */ +#define AV_LOG_FATAL 8 + +/** + * Something went wrong and cannot losslessly be recovered. + * However, not all future data is affected. + */ +#define AV_LOG_ERROR 16 + +/** + * Something somehow does not look correct. This may or may not + * lead to problems. An example would be the use of '-vstrict -2'. + */ +#define AV_LOG_WARNING 24 + +/** + * Standard information. + */ +#define AV_LOG_INFO 32 + +/** + * Detailed information. + */ +#define AV_LOG_VERBOSE 40 + +/** + * Stuff which is only useful for libav* developers. + */ +#define AV_LOG_DEBUG 48 + +/** + * Extremely verbose debugging, useful for libav* development. + */ +#define AV_LOG_TRACE 56 + +#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) + +/** + * @} + */ + +/** + * Sets additional colors for extended debugging sessions. + * @code + av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); + @endcode + * Requires 256color terminal support. Uses outside debugging is not + * recommended. + */ +#define AV_LOG_C(x) ((x) << 8) + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct or NULL if general log. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + */ +void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); + + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_vlog(void *avcl, int level, const char *fmt, va_list vl); + +/** + * Get the current log level + * + * @see lavu_log_constants + * + * @return Current log level + */ +int av_log_get_level(void); + +/** + * Set the log level + * + * @see lavu_log_constants + * + * @param level Logging level + */ +void av_log_set_level(int level); + +/** + * Set the logging callback + * + * @note The callback must be thread safe, even if the application does not use + * threads itself as some codecs are multithreaded. + * + * @see av_log_default_callback + * + * @param callback A logging function with a compatible signature. + */ +void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); + +/** + * Default logging callback + * + * It prints the message to stderr, optionally colorizing it. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_log_default_callback(void *avcl, int level, const char *fmt, + va_list vl); + +/** + * Return the context name + * + * @param ctx The AVClass context + * + * @return The AVClass class_name + */ +const char* av_default_item_name(void* ctx); +AVClassCategory av_default_get_category(void *ptr); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line + * @param line_size size of the buffer + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + */ +void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occurred, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +#if FF_API_DLOG +/** + * av_dlog macros + * @deprecated unused + * Useful to print debug messages that shouldn't get compiled in normally. + */ + +#ifdef DEBUG +# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__) +#else +# define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0) +#endif +#endif /* FF_API_DLOG */ + +/** + * Skip repeated messages, this requires the user app to use av_log() instead of + * (f)printf as the 2 would otherwise interfere and lead to + * "Last message repeated x times" messages below (f)printf messages with some + * bad luck. + * Also to receive the last, "last repeated" line if any, the user app must + * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end + */ +#define AV_LOG_SKIP_REPEATED 1 + +/** + * Include the log severity in messages originating from codecs. + * + * Results in messages such as: + * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts + */ +#define AV_LOG_PRINT_LEVEL 2 + +void av_log_set_flags(int arg); +int av_log_get_flags(void); + +/** + * @} + */ + +#endif /* AVUTIL_LOG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lzo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lzo.h new file mode 100644 index 0000000..c034039 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/lzo.h @@ -0,0 +1,66 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_LZO_H +#define AVUTIL_LZO_H + +/** + * @defgroup lavu_lzo LZO + * @ingroup lavu_crypto + * + * @{ + */ + +#include + +/** @name Error flags returned by av_lzo1x_decode + * @{ */ +/// end of the input buffer reached before decoding finished +#define AV_LZO_INPUT_DEPLETED 1 +/// decoded data did not fit into output buffer +#define AV_LZO_OUTPUT_FULL 2 +/// a reference to previously decoded data was wrong +#define AV_LZO_INVALID_BACKPTR 4 +/// a non-specific error in the compressed bitstream +#define AV_LZO_ERROR 8 +/** @} */ + +#define AV_LZO_INPUT_PADDING 8 +#define AV_LZO_OUTPUT_PADDING 12 + +/** + * @brief Decodes LZO 1x compressed data. + * @param out output buffer + * @param outlen size of output buffer, number of bytes left are returned here + * @param in input buffer + * @param inlen size of input buffer, number of bytes left are returned here + * @return 0 on success, otherwise a combination of the error flags above + * + * Make sure all buffers are appropriately padded, in must provide + * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. + */ +int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +/** + * @} + */ + +#endif /* AVUTIL_LZO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/macros.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/macros.h new file mode 100644 index 0000000..2007ee5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/macros.h @@ -0,0 +1,50 @@ +/* + * 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 + * @ingroup lavu + * Utility Preprocessor macros + */ + +#ifndef AVUTIL_MACROS_H +#define AVUTIL_MACROS_H + +/** + * @addtogroup preproc_misc Preprocessor String Macros + * + * String manipulation macros + * + * @{ + */ + +#define AV_STRINGIFY(s) AV_TOSTRING(s) +#define AV_TOSTRING(s) #s + +#define AV_GLUE(a, b) a ## b +#define AV_JOIN(a, b) AV_GLUE(a, b) + +/** + * @} + */ + +#define AV_PRAGMA(s) _Pragma(#s) + +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +#endif /* AVUTIL_MACROS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mastering_display_metadata.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mastering_display_metadata.h new file mode 100644 index 0000000..847b0b6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mastering_display_metadata.h @@ -0,0 +1,128 @@ +/** + * Copyright (c) 2016 Neil Birkbeck + * + * 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 + */ + +#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H +#define AVUTIL_MASTERING_DISPLAY_METADATA_H + +#include "frame.h" +#include "rational.h" + + +/** + * Mastering display metadata capable of representing the color volume of + * the display used to master the content (SMPTE 2086:2014). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_mastering_display_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVMasteringDisplayMetadata { + /** + * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). + */ + AVRational display_primaries[3][2]; + + /** + * CIE 1931 xy chromaticity coords of white point. + */ + AVRational white_point[2]; + + /** + * Min luminance of mastering display (cd/m^2). + */ + AVRational min_luminance; + + /** + * Max luminance of mastering display (cd/m^2). + */ + AVRational max_luminance; + + /** + * Flag indicating whether the display primaries (and white point) are set. + */ + int has_primaries; + + /** + * Flag indicating whether the luminance (min_ and max_) have been set. + */ + int has_luminance; + +} AVMasteringDisplayMetadata; + +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); + +/** + * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVMasteringDisplayMetadata structure to be filled by caller. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); + +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mathematics.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mathematics.h new file mode 100644 index 0000000..5490180 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mathematics.h @@ -0,0 +1,242 @@ +/* + * copyright (c) 2005-2012 Michael Niedermayer + * + * 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 + * @addtogroup lavu_math + * Mathematical utilities for working with timestamp and time base. + */ + +#ifndef AVUTIL_MATHEMATICS_H +#define AVUTIL_MATHEMATICS_H + +#include +#include +#include "attributes.h" +#include "rational.h" +#include "intfloat.h" + +#ifndef M_E +#define M_E 2.7182818284590452354 /* e */ +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 /* log_e 2 */ +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 /* log_e 10 */ +#endif +#ifndef M_LOG2_10 +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ +#endif +#ifndef M_PHI +#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#ifndef NAN +#define NAN av_int2float(0x7fc00000) +#endif +#ifndef INFINITY +#define INFINITY av_int2float(0x7f800000) +#endif + +/** + * @addtogroup lavu_math + * + * @{ + */ + +/** + * Rounding methods. + */ +enum AVRounding { + AV_ROUND_ZERO = 0, ///< Round toward zero. + AV_ROUND_INF = 1, ///< Round away from zero. + AV_ROUND_DOWN = 2, ///< Round toward -infinity. + AV_ROUND_UP = 3, ///< Round toward +infinity. + AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. + /** + * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through + * unchanged, avoiding special cases for #AV_NOPTS_VALUE. + * + * Unlike other values of the enumeration AVRounding, this value is a + * bitmask that must be used in conjunction with another value of the + * enumeration through a bitwise OR, in order to set behavior for normal + * cases. + * + * @code{.c} + * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling 3: + * // Calculating 3 * 1 / 2 + * // 3 / 2 is rounded up to 2 + * // => 2 + * + * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling AV_NOPTS_VALUE: + * // AV_NOPTS_VALUE == INT64_MIN + * // AV_NOPTS_VALUE is passed through + * // => AV_NOPTS_VALUE + * @endcode + */ + AV_ROUND_PASS_MINMAX = 8192, +}; + +/** + * Compute the greatest common divisor of two integer operands. + * + * @param a,b Operands + * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; + * if a == 0 and b == 0, returns 0. + */ +int64_t av_const av_gcd(int64_t a, int64_t b); + +/** + * Rescale a 64-bit integer with rounding to nearest. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow. + * + * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; + +/** + * Rescale a 64-bit integer with specified rounding. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow, and does not support different rounding methods. + * + * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() + */ +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers with specified rounding. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q() + */ +int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, + enum AVRounding rnd) av_const; + +/** + * Compare two timestamps each in its own time base. + * + * @return One of the following values: + * - -1 if `ts_a` is before `ts_b` + * - 1 if `ts_a` is after `ts_b` + * - 0 if they represent the same position + * + * @warning + * The result of the function is undefined if one of the timestamps is outside + * the `int64_t` range when represented in the other's timebase. + */ +int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); + +/** + * Compare the remainders of two integer operands divided by a common divisor. + * + * In other words, compare the least significant `log2(mod)` bits of integers + * `a` and `b`. + * + * @code{.c} + * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) + * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) + * @endcode + * + * @param a,b Operands + * @param mod Divisor; must be a power of 2 + * @return + * - a negative value if `a % mod < b % mod` + * - a positive value if `a % mod > b % mod` + * - zero if `a % mod == b % mod` + */ +int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); + +/** + * Rescale a timestamp while preserving known durations. + * + * This function is designed to be called per audio packet to scale the input + * timestamp to a different time base. Compared to a simple av_rescale_q() + * call, this function is robust against possible inconsistent frame durations. + * + * The `last` parameter is a state variable that must be preserved for all + * subsequent calls for the same stream. For the first call, `*last` should be + * initialized to #AV_NOPTS_VALUE. + * + * @param[in] in_tb Input time base + * @param[in] in_ts Input timestamp + * @param[in] fs_tb Duration time base; typically this is finer-grained + * (greater) than `in_tb` and `out_tb` + * @param[in] duration Duration till the next call to this function (i.e. + * duration of the current packet/frame) + * @param[in,out] last Pointer to a timestamp expressed in terms of + * `fs_tb`, acting as a state variable + * @param[in] out_tb Output timebase + * @return Timestamp expressed in terms of `out_tb` + * + * @note In the context of this function, "duration" is in term of samples, not + * seconds. + */ +int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); + +/** + * Add a value to a timestamp. + * + * This function guarantees that when the same value is repeatly added that + * no accumulation of rounding errors occurs. + * + * @param[in] ts Input timestamp + * @param[in] ts_tb Input timestamp time base + * @param[in] inc Value to be added + * @param[in] inc_tb Time base of `inc` + */ +int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); + + +/** + * @} + */ + +#endif /* AVUTIL_MATHEMATICS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/md5.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/md5.h new file mode 100644 index 0000000..ca72ccb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/md5.h @@ -0,0 +1,98 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_md5 + * Public header for MD5 hash function implementation. + */ + +#ifndef AVUTIL_MD5_H +#define AVUTIL_MD5_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_md5 MD5 + * @ingroup lavu_hash + * MD5 hash function implementation. + * + * @{ + */ + +extern const int av_md5_size; + +struct AVMD5; + +/** + * Allocate an AVMD5 context. + */ +struct AVMD5 *av_md5_alloc(void); + +/** + * Initialize MD5 hashing. + * + * @param ctx pointer to the function context (of size av_md5_size) + */ +void av_md5_init(struct AVMD5 *ctx); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param src input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, int len); +#else +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param ctx hash function context + * @param dst buffer where output digest value is stored + */ +void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); + +/** + * Hash an array of data. + * + * @param dst The output buffer to write the digest into + * @param src The data to hash + * @param len The length of the data, in bytes + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len); +#else +void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len); +#endif + +/** + * @} + */ + +#endif /* AVUTIL_MD5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mem.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mem.h new file mode 100644 index 0000000..527cd03 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/mem.h @@ -0,0 +1,699 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_mem + * Memory handling functions + */ + +#ifndef AVUTIL_MEM_H +#define AVUTIL_MEM_H + +#include +#include + +#include "attributes.h" +#include "error.h" +#include "avutil.h" + +/** + * @addtogroup lavu_mem + * Utilities for manipulating memory. + * + * FFmpeg has several applications of memory that are not required of a typical + * program. For example, the computing-heavy components like video decoding and + * encoding can be sped up significantly through the use of aligned memory. + * + * However, for each of FFmpeg's applications of memory, there might not be a + * recognized or standardized API for that specific use. Memory alignment, for + * instance, varies wildly depending on operating systems, architectures, and + * compilers. Hence, this component of @ref libavutil is created to make + * dealing with memory consistently possible on all platforms. + * + * @{ + * + * @defgroup lavu_mem_macros Alignment Macros + * Helper macros for declaring aligned variables. + * @{ + */ + +/** + * @def DECLARE_ALIGNED(n,t,v) + * Declare a variable that is aligned in memory. + * + * @code{.c} + * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; + * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; + * + * // The default-alignment equivalent would be + * uint16_t aligned_int = 42; + * uint8_t aligned_array[128]; + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_CONST(n,t,v) + * Declare a static constant aligned variable appropriate for use in inline + * assembly code. + * + * @code{.c} + * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +#if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v +#elif defined(__TI_COMPILER_VERSION__) + #define DECLARE_ALIGNED(n,t,v) \ + AV_PRAGMA(DATA_ALIGN(v,n)) \ + t __attribute__((aligned(n))) v + #define DECLARE_ASM_CONST(n,t,v) \ + AV_PRAGMA(DATA_ALIGN(v,n)) \ + static const t __attribute__((aligned(n))) v +#elif defined(__DJGPP__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v +#elif defined(__GNUC__) || defined(__clang__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v +#elif defined(_MSC_VER) + #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v +#else + #define DECLARE_ALIGNED(n,t,v) t v + #define DECLARE_ASM_CONST(n,t,v) static const t v +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_attrs Function Attributes + * Function attributes applicable to memory handling functions. + * + * These function attributes can help compilers emit more useful warnings, or + * generate better code. + * @{ + */ + +/** + * @def av_malloc_attrib + * Function attribute denoting a malloc-like function. + * + * @see Function attribute `malloc` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(3,1) + #define av_malloc_attrib __attribute__((__malloc__)) +#else + #define av_malloc_attrib +#endif + +/** + * @def av_alloc_size(...) + * Function attribute used on a function that allocates memory, whose size is + * given by the specified parameter(s). + * + * @code{.c} + * void *av_malloc(size_t size) av_alloc_size(1); + * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); + * @endcode + * + * @param ... One or two parameter indexes, separated by a comma + * + * @see Function attribute `alloc_size` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(4,3) + #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) +#else + #define av_alloc_size(...) +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_funcs Heap Management + * Functions responsible for allocating, freeing, and copying memory. + * + * All memory allocation functions have a built-in upper limit of `INT_MAX` + * bytes. This may be changed with av_max_alloc(), although exercise extreme + * caution when doing so. + * + * @{ + */ + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU). + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_mallocz() + */ +void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU) and zero all the bytes of the + * block. + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if it cannot be allocated + * @see av_malloc() + */ +void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block for an array with av_malloc(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of element + * @param size Size of a single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_malloc() + */ +av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size) +{ + if (!size || nmemb >= INT_MAX / size) + return NULL; + return av_malloc(nmemb * size); +} + +/** + * Allocate a memory block for an array with av_mallocz(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of elements + * @param size Size of the single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * + * @see av_mallocz() + * @see av_malloc_array() + */ +av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size) +{ + if (!size || nmemb >= INT_MAX / size) + return NULL; + return av_mallocz(nmemb * size); +} + +/** + * Non-inlined equivalent of av_mallocz_array(). + * + * Created for symmetry with the calloc() C function. + */ +void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; + +/** + * Allocate, reallocate, or free a block of memory. + * + * If `ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param size Size in bytes of the memory block to be allocated or + * reallocated + * + * @return Pointer to a newly-reallocated block or `NULL` if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be + * correctly aligned. + * @see av_fast_realloc() + * @see av_reallocp() + */ +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); + +/** + * Allocate, reallocate, or free a block of memory through a pointer to a + * pointer. + * + * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already allocated + * with av_realloc(), or a pointer to `NULL`. The pointer + * is updated on success, or freed on failure. + * @param[in] size Size in bytes for the memory block to be allocated or + * reallocated + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); + +/** + * Allocate, reallocate, or free a block of memory. + * + * This function does the same thing as av_realloc(), except: + * - It takes two size arguments and allocates `nelem * elsize` bytes, + * after checking the result of the multiplication for integer overflow. + * - It frees the input block in case of failure, thus avoiding the memory + * leak with the classic + * @code{.c} + * buf = realloc(buf); + * if (!buf) + * return -1; + * @endcode + * pattern. + */ +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); + +/** + * Allocate, reallocate, or free an array. + * + * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. If + * `nmemb` is zero, free the memory block pointed to by `ptr`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param nmemb Number of elements in the array + * @param size Size of the single element of the array + * + * @return Pointer to a newly-reallocated block or NULL if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + * @see av_reallocp_array() + */ +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Allocate, reallocate, or free an array through a pointer to a pointer. + * + * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. If `nmemb` is + * zero, free the memory block pointed to by `*ptr`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already + * allocated with av_realloc(), or a pointer to `NULL`. + * The pointer is updated on success, or freed on failure. + * @param[in] nmemb Number of elements + * @param[in] size Size of the single element + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the given buffer if it is not large enough, otherwise do nothing. + * + * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. + * + * If the given buffer is not large enough, and reallocation fails, `NULL` is + * returned and `*size` is set to 0, but the original buffer is not changed or + * freed. + * + * A typical use pattern follows: + * + * @code{.c} + * uint8_t *buf = ...; + * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); + * if (!new_buf) { + * // Allocation failed; clean up original buffer + * av_freep(&buf); + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Already allocated buffer, or `NULL` + * @param[in,out] size Pointer to current size of buffer `ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `ptr` + * @return `ptr` if the buffer is large enough, a pointer to newly reallocated + * buffer if the buffer was not large enough, or `NULL` in case of + * error + * @see av_realloc() + * @see av_fast_malloc() + */ +void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate a buffer, reusing the given one if large enough. + * + * Contrary to av_fast_realloc(), the current buffer contents might not be + * preserved and on error the old buffer is freed, thus no special handling to + * avoid memleaks is necessary. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @code{.c} + * uint8_t *buf = ...; + * av_fast_malloc(&buf, ¤t_size, size_needed); + * if (!buf) { + * // Allocation failed; buf already freed + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `*ptr` + * @see av_realloc() + * @see av_fast_mallocz() + */ +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate and clear a buffer, reusing the given one if large enough. + * + * Like av_fast_malloc(), but all newly allocated space is initially cleared. + * Reused buffer is not cleared. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is + * changed to `min_size` in case of success or 0 in + * case of failure + * @param[in] min_size New size of buffer `*ptr` + * @see av_fast_malloc() + */ +void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family. + * + * @param ptr Pointer to the memory block which should be freed. + * + * @note `ptr = NULL` is explicitly allowed. + * @note It is recommended that you use av_freep() instead, to prevent leaving + * behind dangling pointers. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family, and set the pointer pointing to it to `NULL`. + * + * @code{.c} + * uint8_t *buf = av_malloc(16); + * av_free(buf); + * // buf now contains a dangling pointer to freed memory, and accidental + * // dereference of buf will result in a use-after-free, which may be a + * // security risk. + * + * uint8_t *buf = av_malloc(16); + * av_freep(&buf); + * // buf is now NULL, and accidental dereference will only result in a + * // NULL-pointer dereference. + * @endcode + * + * @param ptr Pointer to the pointer to the memory block which should be freed + * @note `*ptr = NULL` is safe and leads to no action. + * @see av_free() + */ +void av_freep(void *ptr); + +/** + * Duplicate a string. + * + * @param s String to be duplicated + * @return Pointer to a newly-allocated string containing a + * copy of `s` or `NULL` if the string cannot be allocated + * @see av_strndup() + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Duplicate a substring of a string. + * + * @param s String to be duplicated + * @param len Maximum length of the resulting string (not counting the + * terminating byte) + * @return Pointer to a newly-allocated string containing a + * substring of `s` or `NULL` if the string cannot be allocated + */ +char *av_strndup(const char *s, size_t len) av_malloc_attrib; + +/** + * Duplicate a buffer with av_malloc(). + * + * @param p Buffer to be duplicated + * @param size Size in bytes of the buffer copied + * @return Pointer to a newly allocated buffer containing a + * copy of `p` or `NULL` if the buffer cannot be allocated + */ +void *av_memdup(const void *p, size_t size); + +/** + * Overlapping memcpy() implementation. + * + * @param dst Destination buffer + * @param back Number of bytes back to start copying (i.e. the initial size of + * the overlapping window); must be > 0 + * @param cnt Number of bytes to copy; must be >= 0 + * + * @note `cnt > back` is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of `back`. + */ +void av_memcpy_backptr(uint8_t *dst, int back, int cnt); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_dynarray Dynamic Array + * + * Utilities to make an array grow when needed. + * + * Sometimes, the programmer would want to have an array that can grow when + * needed. The libavutil dynamic array utilities fill that need. + * + * libavutil supports two systems of appending elements onto a dynamically + * allocated array, the first one storing the pointer to the value in the + * array, and the second storing the value directly. In both systems, the + * caller is responsible for maintaining a variable containing the length of + * the array, as well as freeing of the array after use. + * + * The first system stores pointers to values in a block of dynamically + * allocated memory. Since only pointers are stored, the function does not need + * to know the size of the type. Both av_dynarray_add() and + * av_dynarray_add_nofree() implement this system. + * + * @code + * type **array = NULL; //< an array of pointers to values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * av_dynarray_add(&array, &nb, &to_be_added); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * av_dynarray_add(&array, &nb, &to_be_added2); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // &to_be_added == array[0] + * // &to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * The second system stores the value directly in a block of memory. As a + * result, the function has to know the size of the type. av_dynarray2_add() + * implements this mechanism. + * + * @code + * type *array = NULL; //< an array of values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); + * if (!addr) + * return AVERROR(ENOMEM); + * memcpy(addr, &to_be_added, sizeof(to_be_added)); + * + * // Shortcut of the above. + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), + * (const void *)&to_be_added2); + * if (!addr) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // to_be_added == array[0] + * // to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * @{ + */ + +/** + * Add the pointer to an element to a dynamic array. + * + * The array to grow is supposed to be an array of pointers to + * structures, and the element to add must be a pointer to an already + * allocated structure. + * + * The array is reallocated when its size reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem Element to add + * @see av_dynarray_add_nofree(), av_dynarray2_add() + */ +void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element to a dynamic array. + * + * Function has the same functionality as av_dynarray_add(), + * but it doesn't free memory on fails. It returns error code + * instead and leave current buffer untouched. + * + * @return >=0 on success, negative otherwise + * @see av_dynarray_add(), av_dynarray2_add() + */ +av_warn_unused_result +int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element of size `elem_size` to a dynamic array. + * + * The array is reallocated when its number of elements reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem_size Size in bytes of an element in the array + * @param[in] elem_data Pointer to the data of the element to add. If + * `NULL`, the space of the newly added element is + * allocated but left uninitialized. + * + * @return Pointer to the data of the element to copy in the newly allocated + * space + * @see av_dynarray_add(), av_dynarray_add_nofree() + */ +void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, + const uint8_t *elem_data); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_misc Miscellaneous Functions + * + * Other functions related to memory allocation. + * + * @{ + */ + +/** + * Multiply two `size_t` values checking for overflow. + * + * @param[in] a,b Operands of multiplication + * @param[out] r Pointer to the result of the operation + * @return 0 on success, AVERROR(EINVAL) on overflow + */ +static inline int av_size_mult(size_t a, size_t b, size_t *r) +{ + size_t t = a * b; + /* Hack inspired from glibc: don't try the division if nelem and elsize + * are both less than sqrt(SIZE_MAX). */ + if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) + return AVERROR(EINVAL); + *r = t; + return 0; +} + +/** + * Set the maximum size that may be allocated in one block. + * + * The value specified with this function is effective for all libavutil's @ref + * lavu_mem_funcs "heap management functions." + * + * By default, the max value is defined as `INT_MAX`. + * + * @param max Value to be set as the new maximum size + * + * @warning Exercise extreme caution when using this function. Don't touch + * this if you do not understand the full consequence of doing so. + */ +void av_max_alloc(size_t max); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_MEM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/motion_vector.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/motion_vector.h new file mode 100644 index 0000000..ec29556 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/motion_vector.h @@ -0,0 +1,57 @@ +/* + * 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 + */ + +#ifndef AVUTIL_MOTION_VECTOR_H +#define AVUTIL_MOTION_VECTOR_H + +#include + +typedef struct AVMotionVector { + /** + * Where the current macroblock comes from; negative value when it comes + * from the past, positive value when it comes from the future. + * XXX: set exact relative ref frame reference instead of a +/- 1 "direction". + */ + int32_t source; + /** + * Width and height of the block. + */ + uint8_t w, h; + /** + * Absolute source position. Can be outside the frame area. + */ + int16_t src_x, src_y; + /** + * Absolute destination position. Can be outside the frame area. + */ + int16_t dst_x, dst_y; + /** + * Extra flag information. + * Currently unused. + */ + uint64_t flags; + /** + * Motion vector + * src_x = dst_x + motion_x / motion_scale + * src_y = dst_y + motion_y / motion_scale + */ + int32_t motion_x, motion_y; + uint16_t motion_scale; +} AVMotionVector; + +#endif /* AVUTIL_MOTION_VECTOR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/murmur3.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/murmur3.h new file mode 100644 index 0000000..6a1694c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/murmur3.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_murmur3 + * Public header for MurmurHash3 hash function implementation. + */ + +#ifndef AVUTIL_MURMUR3_H +#define AVUTIL_MURMUR3_H + +#include + +/** + * @defgroup lavu_murmur3 Murmur3 + * @ingroup lavu_hash + * MurmurHash3 hash function implementation. + * + * MurmurHash3 is a non-cryptographic hash function, of which three + * incompatible versions were created by its inventor Austin Appleby: + * + * - 32-bit output + * - 128-bit output for 32-bit platforms + * - 128-bit output for 64-bit platforms + * + * FFmpeg only implements the last variant: 128-bit output designed for 64-bit + * platforms. Even though the hash function was designed for 64-bit platforms, + * the function in reality works on 32-bit systems too, only with reduced + * performance. + * + * @anchor lavu_murmur3_seedinfo + * By design, MurmurHash3 requires a seed to operate. In response to this, + * libavutil provides two functions for hash initiation, one that requires a + * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer + * as the seed, and therefore does not (av_murmur3_init()). + * + * To make hashes comparable, you should provide the same seed for all calls to + * this hash function -- if you are supplying one yourself, that is. + * + * @{ + */ + +/** + * Allocate an AVMurMur3 hash context. + * + * @return Uninitialized hash context or `NULL` in case of error + */ +struct AVMurMur3 *av_murmur3_alloc(void); + +/** + * Initialize or reinitialize an AVMurMur3 hash context with a seed. + * + * @param[out] c Hash context + * @param[in] seed Random seed + * + * @see av_murmur3_init() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed); + +/** + * Initialize or reinitialize an AVMurMur3 hash context. + * + * Equivalent to av_murmur3_init_seeded() with a built-in seed. + * + * @param[out] c Hash context + * + * @see av_murmur3_init_seeded() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init(struct AVMurMur3 *c); + +/** + * Update hash context with new data. + * + * @param[out] c Hash context + * @param[in] src Input data to update hash with + * @param[in] len Number of bytes to read from `src` + */ +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len); + +/** + * Finish hashing and output digest value. + * + * @param[in,out] c Hash context + * @param[out] dst Buffer where output digest value is stored + */ +void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]); + +/** + * @} + */ + +#endif /* AVUTIL_MURMUR3_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/opt.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/opt.h new file mode 100644 index 0000000..0d89379 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/opt.h @@ -0,0 +1,866 @@ +/* + * AVOptions + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_OPT_H +#define AVUTIL_OPT_H + +/** + * @file + * AVOptions + */ + +#include "rational.h" +#include "avutil.h" +#include "dict.h" +#include "log.h" +#include "pixfmt.h" +#include "samplefmt.h" +#include "version.h" + +/** + * @defgroup avoptions AVOptions + * @ingroup lavu_data + * @{ + * AVOptions provide a generic system to declare options on arbitrary structs + * ("objects"). An option can have a help text, a type and a range of possible + * values. Options may then be enumerated, read and written to. + * + * @section avoptions_implement Implementing AVOptions + * This section describes how to add AVOptions capabilities to a struct. + * + * All AVOptions-related information is stored in an AVClass. Therefore + * the first member of the struct should be a pointer to an AVClass describing it. + * The option field of the AVClass must be set to a NULL-terminated static array + * of AVOptions. Each AVOption must have a non-empty name, a type, a default + * value and for number-type AVOptions also a range of allowed values. It must + * also declare an offset in bytes from the start of the struct, where the field + * associated with this AVOption is located. Other fields in the AVOption struct + * should also be set when applicable, but are not required. + * + * The following example illustrates an AVOptions-enabled struct: + * @code + * typedef struct test_struct { + * const AVClass *class; + * int int_opt; + * char *str_opt; + * uint8_t *bin_opt; + * int bin_len; + * } test_struct; + * + * static const AVOption test_options[] = { + * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt), + * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX }, + * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt), + * AV_OPT_TYPE_STRING }, + * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt), + * AV_OPT_TYPE_BINARY }, + * { NULL }, + * }; + * + * static const AVClass test_class = { + * .class_name = "test class", + * .item_name = av_default_item_name, + * .option = test_options, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * @endcode + * + * Next, when allocating your struct, you must ensure that the AVClass pointer + * is set to the correct value. Then, av_opt_set_defaults() can be called to + * initialize defaults. After that the struct is ready to be used with the + * AVOptions API. + * + * When cleaning up, you may use the av_opt_free() function to automatically + * free all the allocated string and binary options. + * + * Continuing with the above example: + * + * @code + * test_struct *alloc_test_struct(void) + * { + * test_struct *ret = av_mallocz(sizeof(*ret)); + * ret->class = &test_class; + * av_opt_set_defaults(ret); + * return ret; + * } + * void free_test_struct(test_struct **foo) + * { + * av_opt_free(*foo); + * av_freep(foo); + * } + * @endcode + * + * @subsection avoptions_implement_nesting Nesting + * It may happen that an AVOptions-enabled struct contains another + * AVOptions-enabled struct as a member (e.g. AVCodecContext in + * libavcodec exports generic options, while its priv_data field exports + * codec-specific options). In such a case, it is possible to set up the + * parent struct to export a child's options. To do that, simply + * implement AVClass.child_next() and AVClass.child_class_next() in the + * parent struct's AVClass. + * Assuming that the test_struct from above now also contains a + * child_struct field: + * + * @code + * typedef struct child_struct { + * AVClass *class; + * int flags_opt; + * } child_struct; + * static const AVOption child_opts[] = { + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX }, + * { NULL }, + * }; + * static const AVClass child_class = { + * .class_name = "child class", + * .item_name = av_default_item_name, + * .option = child_opts, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * + * void *child_next(void *obj, void *prev) + * { + * test_struct *t = obj; + * if (!prev && t->child_struct) + * return t->child_struct; + * return NULL + * } + * const AVClass child_class_next(const AVClass *prev) + * { + * return prev ? NULL : &child_class; + * } + * @endcode + * Putting child_next() and child_class_next() as defined above into + * test_class will now make child_struct's options accessible through + * test_struct (again, proper setup as described above needs to be done on + * child_struct right after it is created). + * + * From the above example it might not be clear why both child_next() + * and child_class_next() are needed. The distinction is that child_next() + * iterates over actually existing objects, while child_class_next() + * iterates over all possible child classes. E.g. if an AVCodecContext + * was initialized to use a codec which has private options, then its + * child_next() will return AVCodecContext.priv_data and finish + * iterating. OTOH child_class_next() on AVCodecContext.av_class will + * iterate over all available codecs with private options. + * + * @subsection avoptions_implement_named_constants Named constants + * It is possible to create named constants for options. Simply set the unit + * field of the option the constants should apply to a string and + * create the constants themselves as options of type AV_OPT_TYPE_CONST + * with their unit field set to the same string. + * Their default_val field should contain the value of the named + * constant. + * For example, to add some named constants for the test_flags option + * above, put the following into the child_opts array: + * @code + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" }, + * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" }, + * @endcode + * + * @section avoptions_use Using AVOptions + * This section deals with accessing options in an AVOptions-enabled struct. + * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or + * AVFormatContext in libavformat. + * + * @subsection avoptions_use_examine Examining AVOptions + * The basic functions for examining options are av_opt_next(), which iterates + * over all options defined for one object, and av_opt_find(), which searches + * for an option with the given name. + * + * The situation is more complicated with nesting. An AVOptions-enabled struct + * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag + * to av_opt_find() will make the function search children recursively. + * + * For enumerating there are basically two cases. The first is when you want to + * get all options that may potentially exist on the struct and its children + * (e.g. when constructing documentation). In that case you should call + * av_opt_child_class_next() recursively on the parent struct's AVClass. The + * second case is when you have an already initialized struct with all its + * children and you want to get all options that can be actually written or read + * from it. In that case you should call av_opt_child_next() recursively (and + * av_opt_next() on each result). + * + * @subsection avoptions_use_get_set Reading and writing AVOptions + * When setting options, you often have a string read directly from the + * user. In such a case, simply passing it to av_opt_set() is enough. For + * non-string type options, av_opt_set() will parse the string according to the + * option type. + * + * Similarly av_opt_get() will read any option type and convert it to a string + * which will be returned. Do not forget that the string is allocated, so you + * have to free it with av_free(). + * + * In some cases it may be more convenient to put all options into an + * AVDictionary and call av_opt_set_dict() on it. A specific case of this + * are the format/codec open functions in lavf/lavc which take a dictionary + * filled with option as a parameter. This makes it possible to set some options + * that cannot be set otherwise, since e.g. the input file format is not known + * before the file is actually opened. + */ + +enum AVOptionType{ + AV_OPT_TYPE_FLAGS, + AV_OPT_TYPE_INT, + AV_OPT_TYPE_INT64, + AV_OPT_TYPE_DOUBLE, + AV_OPT_TYPE_FLOAT, + AV_OPT_TYPE_STRING, + AV_OPT_TYPE_RATIONAL, + AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length + AV_OPT_TYPE_DICT, + AV_OPT_TYPE_UINT64, + AV_OPT_TYPE_CONST = 128, + AV_OPT_TYPE_IMAGE_SIZE = MKBETAG('S','I','Z','E'), ///< offset must point to two consecutive integers + AV_OPT_TYPE_PIXEL_FMT = MKBETAG('P','F','M','T'), + AV_OPT_TYPE_SAMPLE_FMT = MKBETAG('S','F','M','T'), + AV_OPT_TYPE_VIDEO_RATE = MKBETAG('V','R','A','T'), ///< offset must point to AVRational + AV_OPT_TYPE_DURATION = MKBETAG('D','U','R',' '), + AV_OPT_TYPE_COLOR = MKBETAG('C','O','L','R'), + AV_OPT_TYPE_CHANNEL_LAYOUT = MKBETAG('C','H','L','A'), + AV_OPT_TYPE_BOOL = MKBETAG('B','O','O','L'), +}; + +/** + * AVOption + */ +typedef struct AVOption { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + union { + int64_t i64; + double dbl; + const char *str; + /* TODO those are unused now */ + AVRational q; + } default_val; + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#if FF_API_OPT_TYPE_METADATA +#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ... +#endif +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +/** + * The option is intended for exporting values to the caller. + */ +#define AV_OPT_FLAG_EXPORT 64 +/** + * The option may not be set through the AVOptions API, only read. + * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. + */ +#define AV_OPT_FLAG_READONLY 128 +#define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering +//FIXME think about enc-audio, ... style flags + + /** + * The logical unit to which the option belongs. Non-constant + * options and corresponding named constants share the same + * unit. May be NULL. + */ + const char *unit; +} AVOption; + +/** + * A single allowed range of values, or a single allowed value. + */ +typedef struct AVOptionRange { + const char *str; + /** + * Value range. + * For string ranges this represents the min/max length. + * For dimensions this represents the min/max pixel count or width/height in multi-component case. + */ + double value_min, value_max; + /** + * Value's component range. + * For string this represents the unicode range for chars, 0-127 limits to ASCII. + */ + double component_min, component_max; + /** + * Range flag. + * If set to 1 the struct encodes a range, if set to 0 a single value. + */ + int is_range; +} AVOptionRange; + +/** + * List of AVOptionRange structs. + */ +typedef struct AVOptionRanges { + /** + * Array of option ranges. + * + * Most of option types use just one component. + * Following describes multi-component option types: + * + * AV_OPT_TYPE_IMAGE_SIZE: + * component index 0: range of pixel count (width * height). + * component index 1: range of width. + * component index 2: range of height. + * + * @note To obtain multi-component version of this structure, user must + * provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or + * av_opt_query_ranges_default function. + * + * Multi-component range can be read as in following example: + * + * @code + * int range_index, component_index; + * AVOptionRanges *ranges; + * AVOptionRange *range[3]; //may require more than 3 in the future. + * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE); + * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) { + * for (component_index = 0; component_index < ranges->nb_components; component_index++) + * range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index]; + * //do something with range here. + * } + * av_opt_freep_ranges(&ranges); + * @endcode + */ + AVOptionRange **range; + /** + * Number of ranges per component. + */ + int nb_ranges; + /** + * Number of componentes. + */ + int nb_components; +} AVOptionRanges; + +/** + * Show the obj options. + * + * @param req_flags requested flags for the options to show. Show only the + * options for which it is opt->flags & req_flags. + * @param rej_flags rejected flags for the options to show. Show only the + * options for which it is !(opt->flags & req_flags). + * @param av_log_obj log context to use for showing the options + */ +int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); + +/** + * Set the values of all AVOption fields to their default values. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + */ +void av_opt_set_defaults(void *s); + +/** + * Set the values of all AVOption fields to their default values. Only these + * AVOption fields for which (opt->flags & mask) == flags will have their + * default applied to s. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + * @param mask combination of AV_OPT_FLAG_* + * @param flags combination of AV_OPT_FLAG_* + */ +void av_opt_set_defaults2(void *s, int mask, int flags); + +/** + * Parse the key/value pairs list in opts. For each key/value pair + * found, stores the value in the field in ctx that is named like the + * key. ctx must be an AVClass context, storing is done using + * AVOptions. + * + * @param opts options string to parse, may be NULL + * @param key_val_sep a 0-terminated list of characters used to + * separate key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @return the number of successfully set key/value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_opt_set() if a key/value pair + * cannot be set + */ +int av_set_options_string(void *ctx, const char *opts, + const char *key_val_sep, const char *pairs_sep); + +/** + * Parse the key-value pairs list in opts. For each key=value pair found, + * set the value of the corresponding option in ctx. + * + * @param ctx the AVClass object to set options on + * @param opts the options string, key-value pairs separated by a + * delimiter + * @param shorthand a NULL-terminated array of options names for shorthand + * notation: if the first field in opts has no key part, + * the key is taken from the first element of shorthand; + * then again for the second, etc., until either opts is + * finished, shorthand is finished or a named option is + * found; after that, all options must be named + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @return the number of successfully set key=value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_set_string3() if a key/value pair + * cannot be set + * + * Options names must use only the following characters: a-z A-Z 0-9 - . / _ + * Separators must use characters distinct from option names and from each + * other. + */ +int av_opt_set_from_string(void *ctx, const char *opts, + const char *const *shorthand, + const char *key_val_sep, const char *pairs_sep); +/** + * Free all allocated objects in obj. + */ +void av_opt_free(void *obj); + +/** + * Check whether a particular flag is set in a flags field. + * + * @param field_name the name of the flag field option + * @param flag_name the name of the flag to check + * @return non-zero if the flag is set, zero if the flag isn't set, + * isn't of the right type, or the flags field doesn't exist. + */ +int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict(void *obj, struct AVDictionary **options); + + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags); + +/** + * Extract a key-value pair from the beginning of a string. + * + * @param ropts pointer to the options string, will be updated to + * point to the rest of the string (one of the pairs_sep + * or the final NUL) + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @param flags flags; see the AV_OPT_FLAG_* values below + * @param rkey parsed key; must be freed using av_free() + * @param rval parsed value; must be freed using av_free() + * + * @return >=0 for success, or a negative value corresponding to an + * AVERROR code in case of error; in particular: + * AVERROR(EINVAL) if no key is present + * + */ +int av_opt_get_key_value(const char **ropts, + const char *key_val_sep, const char *pairs_sep, + unsigned flags, + char **rkey, char **rval); + +enum { + + /** + * Accept to parse a value without a key; the key will then be returned + * as NULL. + */ + AV_OPT_FLAG_IMPLICIT_KEY = 1, +}; + +/** + * @defgroup opt_eval_funcs Evaluating option strings + * @{ + * This group of functions can be used to evaluate option strings + * and get numbers out of them. They do the same thing as av_opt_set(), + * except the result is written into the caller-supplied pointer. + * + * @param obj a struct whose first element is a pointer to AVClass. + * @param o an option for which the string is to be evaluated. + * @param val string to be evaluated. + * @param *_out value of the string will be written here. + * + * @return 0 on success, a negative number on failure. + */ +int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out); +int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out); +int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out); +int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out); +int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out); +int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out); +/** + * @} + */ + +#define AV_OPT_SEARCH_CHILDREN (1 << 0) /**< Search in possible children of the + given object first. */ +/** + * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass + * instead of a required pointer to a struct containing AVClass. This is + * useful for searching for options without needing to allocate the corresponding + * object. + */ +#define AV_OPT_SEARCH_FAKE_OBJ (1 << 1) + +/** + * In av_opt_get, return NULL if the option has a pointer type and is set to NULL, + * rather than returning an empty string. + */ +#define AV_OPT_ALLOW_NULL (1 << 2) + +/** + * Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than + * one component for certain option types. + * @see AVOptionRanges for details. + */ +#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12) + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return A pointer to the option found, or NULL if no option + * was found. + * + * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable + * directly with av_opt_set(). Use special calls which take an options + * AVDictionary (e.g. avformat_open_input()) to set options found with this + * flag. + */ +const AVOption *av_opt_find(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags); + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * @param[out] target_obj if non-NULL, an object to which the option belongs will be + * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present + * in search_flags. This parameter is ignored if search_flags contain + * AV_OPT_SEARCH_FAKE_OBJ. + * + * @return A pointer to the option found, or NULL if no option + * was found. + */ +const AVOption *av_opt_find2(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags, void **target_obj); + +/** + * Iterate over all AVOptions belonging to obj. + * + * @param obj an AVOptions-enabled struct or a double pointer to an + * AVClass describing it. + * @param prev result of the previous call to av_opt_next() on this object + * or NULL + * @return next AVOption or NULL + */ +const AVOption *av_opt_next(const void *obj, const AVOption *prev); + +/** + * Iterate over AVOptions-enabled children of obj. + * + * @param prev result of a previous call to this function or NULL + * @return next AVOptions-enabled child or NULL + */ +void *av_opt_child_next(void *obj, void *prev); + +/** + * Iterate over potential AVOptions-enabled children of parent. + * + * @param prev result of a previous call to this function or NULL + * @return AVClass corresponding to next potential child or NULL + */ +const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev); + +/** + * @defgroup opt_set_funcs Option setting functions + * @{ + * Those functions set the field of obj with the given name to value. + * + * @param[in] obj A struct whose first element is a pointer to an AVClass. + * @param[in] name the name of the field to set + * @param[in] val The value to set. In case of av_opt_set() if the field is not + * of a string type, then the given string is parsed. + * SI postfixes and some named scalars are supported. + * If the field is of a numeric type, it has to be a numeric or named + * scalar. Behavior with more than one scalar and +- infix operators + * is undefined. + * If the field is of a flags type, it has to be a sequence of numeric + * scalars or named flags separated by '+' or '-'. Prefixing a flag + * with '+' causes it to be set without affecting the other flags; + * similarly, '-' unsets a flag. + * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be set on a child of obj. + * + * @return 0 if the value has been set, or an AVERROR code in case of + * error: + * AVERROR_OPTION_NOT_FOUND if no matching option exists + * AVERROR(ERANGE) if the value is out of range + * AVERROR(EINVAL) if the value is not valid + */ +int av_opt_set (void *obj, const char *name, const char *val, int search_flags); +int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); +int av_opt_set_double (void *obj, const char *name, double val, int search_flags); +int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); +int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags); +int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags); +int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags); +int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags); +/** + * @note Any old dictionary present is discarded and replaced with a copy of the new one. The + * caller still owns val is and responsible for freeing it. + */ +int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags); + +/** + * Set a binary option to an integer list. + * + * @param obj AVClass object to set options on + * @param name name of the binary option + * @param val pointer to an integer list (must have the correct type with + * regard to the contents of the list) + * @param term list terminator (usually 0 or -1) + * @param flags search flags + */ +#define av_opt_set_int_list(obj, name, val, term, flags) \ + (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \ + AVERROR(EINVAL) : \ + av_opt_set_bin(obj, name, (const uint8_t *)(val), \ + av_int_list_length(val, term) * sizeof(*(val)), flags)) + +/** + * @} + */ + +/** + * @defgroup opt_get_funcs Option getting functions + * @{ + * Those functions get a value of the option with the given name from an object. + * + * @param[in] obj a struct whose first element is a pointer to an AVClass. + * @param[in] name name of the option to get. + * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be found in a child of obj. + * @param[out] out_val value of the option will be written here + * @return >=0 on success, a negative error code otherwise + */ +/** + * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller + * + * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the option has + * AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will be set + * to NULL instead of an allocated empty string. + */ +int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val); +int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val); +int av_opt_get_double (void *obj, const char *name, int search_flags, double *out_val); +int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out); +int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt); +int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt); +int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *ch_layout); +/** + * @param[out] out_val The returned dictionary is a copy of the actual value and must + * be freed with av_dict_free() by the caller + */ +int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); +/** + * @} + */ +/** + * Gets a pointer to the requested field in a struct. + * This function allows accessing a struct even when its fields are moved or + * renamed since the application making the access has been compiled, + * + * @returns a pointer to the field, it can be cast to the correct type and read + * or written to. + */ +void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name); + +/** + * Free an AVOptionRanges struct and set it to NULL. + */ +void av_opt_freep_ranges(AVOptionRanges **ranges); + +/** + * Get a list of allowed ranges for the given option. + * + * The returned list may depend on other fields in obj like for example profile. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_freep_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Copy options from src object into dest object. + * + * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object. + * Original memory allocated for such options is freed unless both src and dest options points to the same memory. + * + * @param dest Object to copy from + * @param src Object to copy into + * @return 0 on success, negative on error + */ +int av_opt_copy(void *dest, const void *src); + +/** + * Get a default list of allowed ranges for the given option. + * + * This list is constructed without using the AVClass.query_ranges() callback + * and can be used as fallback from within the callback. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_free_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Check if given option is set to its default value. + * + * Options o must belong to the obj. This function must not be called to check child's options state. + * @see av_opt_is_set_to_default_by_name(). + * + * @param obj AVClass object to check option on + * @param o option to be checked + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default(void *obj, const AVOption *o); + +/** + * Check if given option is set to its default value. + * + * @param obj AVClass object to check option on + * @param name option name + * @param search_flags combination of AV_OPT_SEARCH_* + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags); + + +#define AV_OPT_SERIALIZE_SKIP_DEFAULTS 0x00000001 ///< Serialize options that are not set to default values only. +#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT 0x00000002 ///< Serialize options that exactly match opt_flags only. + +/** + * Serialize object's options. + * + * Create a string containing object's serialized options. + * Such string may be passed back to av_opt_set_from_string() in order to restore option values. + * A key/value or pairs separator occurring in the serialized value or + * name string are escaped through the av_escape() function. + * + * @param[in] obj AVClass object to serialize + * @param[in] opt_flags serialize options with all the specified flags set (AV_OPT_FLAG) + * @param[in] flags combination of AV_OPT_SERIALIZE_* flags + * @param[out] buffer Pointer to buffer that will be allocated with string containg serialized options. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, + const char key_val_sep, const char pairs_sep); +/** + * @} + */ + +#endif /* AVUTIL_OPT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/parseutils.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/parseutils.h new file mode 100644 index 0000000..e66d24b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/parseutils.h @@ -0,0 +1,193 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PARSEUTILS_H +#define AVUTIL_PARSEUTILS_H + +#include + +#include "rational.h" + +/** + * @file + * misc parsing utilities + */ + +/** + * Parse str and store the parsed ratio in q. + * + * Note that a ratio with infinite (1/0) or negative value is + * considered valid, so you should check on the returned value if you + * want to exclude those values. + * + * The undefined value can be expressed using the "0:0" string. + * + * @param[in,out] q pointer to the AVRational which will contain the ratio + * @param[in] str the string to parse: it has to be a string in the format + * num:den, a float number or an expression + * @param[in] max the maximum allowed numerator and denominator + * @param[in] log_offset log level offset which is applied to the log + * level of log_ctx + * @param[in] log_ctx parent logging context + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_ratio(AVRational *q, const char *str, int max, + int log_offset, void *log_ctx); + +#define av_parse_ratio_quiet(rate, str, max) \ + av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL) + +/** + * Parse str and put in width_ptr and height_ptr the detected values. + * + * @param[in,out] width_ptr pointer to the variable which will contain the detected + * width value + * @param[in,out] height_ptr pointer to the variable which will contain the detected + * height value + * @param[in] str the string to parse: it has to be a string in the format + * width x height or a valid video size abbreviation. + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str); + +/** + * Parse str and store the detected values in *rate. + * + * @param[in,out] rate pointer to the AVRational which will contain the detected + * frame rate + * @param[in] str the string to parse: it has to be a string in the format + * rate_num / rate_den, a float number or a valid video rate abbreviation + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_rate(AVRational *rate, const char *str); + +/** + * Put the RGBA values that correspond to color_string in rgba_color. + * + * @param color_string a string specifying a color. It can be the name of + * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, + * possibly followed by "@" and a string representing the alpha + * component. + * The alpha component may be a string composed by "0x" followed by an + * hexadecimal number or a decimal number between 0.0 and 1.0, which + * represents the opacity value (0x00/0.0 means completely transparent, + * 0xff/1.0 completely opaque). + * If the alpha component is not specified then 0xff is assumed. + * The string "random" will result in a random color. + * @param slen length of the initial part of color_string containing the + * color. It can be set to -1 if color_string is a null terminated string + * containing nothing else than the color. + * @return >= 0 in case of success, a negative value in case of + * failure (for example if color_string cannot be parsed). + */ +int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, + void *log_ctx); + +/** + * Get the name of a color from the internal table of hard-coded named + * colors. + * + * This function is meant to enumerate the color names recognized by + * av_parse_color(). + * + * @param color_idx index of the requested color, starting from 0 + * @param rgbp if not NULL, will point to a 3-elements array with the color value in RGB + * @return the color name string or NULL if color_idx is not in the array + */ +const char *av_get_known_color_name(int color_idx, const uint8_t **rgb); + +/** + * Parse timestr and return in *time a corresponding number of + * microseconds. + * + * @param timeval puts here the number of microseconds corresponding + * to the string in timestr. If the string represents a duration, it + * is the number of microseconds contained in the time interval. If + * the string is a date, is the number of microseconds since 1st of + * January, 1970 up to the time of the parsed date. If timestr cannot + * be successfully parsed, set *time to INT64_MIN. + + * @param timestr a string representing a date or a duration. + * - If a date the syntax is: + * @code + * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m...]]]}|{HHMMSS[.m...]]]}}[Z] + * now + * @endcode + * If the value is "now" it takes the current time. + * Time is local time unless Z is appended, in which case it is + * interpreted as UTC. + * If the year-month-day part is not specified it takes the current + * year-month-day. + * - If a duration the syntax is: + * @code + * [-][HH:]MM:SS[.m...] + * [-]S+[.m...] + * @endcode + * @param duration flag which tells how to interpret timestr, if not + * zero timestr is interpreted as a duration, otherwise as a date + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_parse_time(int64_t *timeval, const char *timestr, int duration); + +/** + * Attempt to find a specific tag in a URL. + * + * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. + * Return 1 if found. + */ +int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); + +/** + * Simplified version of strptime + * + * Parse the input string p according to the format string fmt and + * store its results in the structure dt. + * This implementation supports only a subset of the formats supported + * by the standard strptime(). + * + * The supported input field descriptors are listed below. + * - %H: the hour as a decimal number, using a 24-hour clock, in the + * range '00' through '23' + * - %J: hours as a decimal number, in the range '0' through INT_MAX + * - %M: the minute as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %S: the second as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %Y: the year as a decimal number, using the Gregorian calendar + * - %m: the month as a decimal number, in the range '1' through '12' + * - %d: the day of the month as a decimal number, in the range '1' + * through '31' + * - %T: alias for '%H:%M:%S' + * - %%: a literal '%' + * + * @return a pointer to the first character not processed in this function + * call. In case the input string contains more characters than + * required by the format string the return value points right after + * the last consumed input character. In case the whole input string + * is consumed the return value points to the null byte at the end of + * the string. On failure NULL is returned. + */ +char *av_small_strptime(const char *p, const char *fmt, struct tm *dt); + +/** + * Convert the decomposed UTC time in tm to a time_t value. + */ +time_t av_timegm(struct tm *tm); + +#endif /* AVUTIL_PARSEUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixdesc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixdesc.h new file mode 100644 index 0000000..fc3737c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixdesc.h @@ -0,0 +1,430 @@ +/* + * pixel format descriptor + * Copyright (c) 2009 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_PIXDESC_H +#define AVUTIL_PIXDESC_H + +#include + +#include "attributes.h" +#include "pixfmt.h" +#include "version.h" + +typedef struct AVComponentDescriptor { + /** + * Which of the 4 planes contains the component. + */ + int plane; + + /** + * Number of elements between 2 horizontally consecutive pixels. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int step; + + /** + * Number of elements before the component of the first pixel. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int offset; + + /** + * Number of least significant bits that must be shifted away + * to get the value. + */ + int shift; + + /** + * Number of bits in the component. + */ + int depth; + +#if FF_API_PLUS1_MINUS1 + /** deprecated, use step instead */ + attribute_deprecated int step_minus1; + + /** deprecated, use depth instead */ + attribute_deprecated int depth_minus1; + + /** deprecated, use offset instead */ + attribute_deprecated int offset_plus1; +#endif +} AVComponentDescriptor; + +/** + * Descriptor that unambiguously describes how the bits of a pixel are + * stored in the up to 4 data planes of an image. It also stores the + * subsampling factors and number of components. + * + * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV + * and all the YUV variants) AVPixFmtDescriptor just stores how values + * are stored not what these values represent. + */ +typedef struct AVPixFmtDescriptor { + const char *name; + uint8_t nb_components; ///< The number of components each pixel has, (1-4) + + /** + * Amount to shift the luma width right to find the chroma width. + * For YV12 this is 1 for example. + * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_w; + + /** + * Amount to shift the luma height right to find the chroma height. + * For YV12 this is 1 for example. + * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_h; + + /** + * Combination of AV_PIX_FMT_FLAG_... flags. + */ + uint64_t flags; + + /** + * Parameters that describe how pixels are packed. + * If the format has 1 or 2 components, then luma is 0. + * If the format has 3 or 4 components: + * if the RGB flag is set then 0 is red, 1 is green and 2 is blue; + * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V. + * + * If present, the Alpha channel is always the last component. + */ + AVComponentDescriptor comp[4]; + + /** + * Alternative comma-separated names. + */ + const char *alias; +} AVPixFmtDescriptor; + +/** + * Pixel format is big-endian. + */ +#define AV_PIX_FMT_FLAG_BE (1 << 0) +/** + * Pixel format has a palette in data[1], values are indexes in this palette. + */ +#define AV_PIX_FMT_FLAG_PAL (1 << 1) +/** + * All values of a component are bit-wise packed end to end. + */ +#define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2) +/** + * Pixel format is an HW accelerated format. + */ +#define AV_PIX_FMT_FLAG_HWACCEL (1 << 3) +/** + * At least one pixel component is not in the first data plane. + */ +#define AV_PIX_FMT_FLAG_PLANAR (1 << 4) +/** + * The pixel format contains RGB-like data (as opposed to YUV/grayscale). + */ +#define AV_PIX_FMT_FLAG_RGB (1 << 5) + +/** + * The pixel format is "pseudo-paletted". This means that it contains a + * fixed palette in the 2nd plane but the palette is fixed/constant for each + * PIX_FMT. This allows interpreting the data as if it was PAL8, which can + * in some cases be simpler. Or the data can be interpreted purely based on + * the pixel format without using the palette. + * An example of a pseudo-paletted format is AV_PIX_FMT_GRAY8 + */ +#define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6) + +/** + * The pixel format has an alpha channel. This is set on all formats that + * support alpha in some way. The exception is AV_PIX_FMT_PAL8, which can + * carry alpha as part of the palette. Details are explained in the + * AVPixelFormat enum, and are also encoded in the corresponding + * AVPixFmtDescriptor. + * + * The alpha is always straight, never pre-multiplied. + * + * If a codec or a filter does not support alpha, it should set all alpha to + * opaque, or use the equivalent pixel formats without alpha component, e.g. + * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA. + */ +#define AV_PIX_FMT_FLAG_ALPHA (1 << 7) + +/** + * The pixel format is following a Bayer pattern + */ +#define AV_PIX_FMT_FLAG_BAYER (1 << 8) + +/** + * The pixel format contains IEEE-754 floating point values. Precision (double, + * single, or half) should be determined by the pixel size (64, 32, or 16 bits). + */ +#define AV_PIX_FMT_FLAG_FLOAT (1 << 9) + +/** + * Return the number of bits per pixel used by the pixel format + * described by pixdesc. Note that this is not the same as the number + * of bits per sample. + * + * The returned number of bits refers to the number of bits actually + * used for storing the pixel information, that is padding bits are + * not counted. + */ +int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * Return the number of bits per pixel for the pixel format + * described by pixdesc, including any padding or unused bits. + */ +int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * @return a pixel format descriptor for provided pixel format or NULL if + * this pixel format is unknown. + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt); + +/** + * Iterate over all pixel format descriptors known to libavutil. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev); + +/** + * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc + * is not a valid pointer to a pixel format descriptor. + */ +enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); + +/** + * Utility function to access log2_chroma_w log2_chroma_h from + * the pixel format AVPixFmtDescriptor. + * + * See av_get_chroma_sub_sample() for a function that asserts a + * valid pixel format instead of returning an error code. + * Its recommended that you use avcodec_get_chroma_sub_sample unless + * you do check the return code! + * + * @param[in] pix_fmt the pixel format + * @param[out] h_shift store log2_chroma_w (horizontal/width shift) + * @param[out] v_shift store log2_chroma_h (vertical/height shift) + * + * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format + */ +int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, + int *h_shift, int *v_shift); + +/** + * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a + * valid pixel format. + */ +int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); + +/** + * @return the name for provided color range or NULL if unknown. + */ +const char *av_color_range_name(enum AVColorRange range); + +/** + * @return the AVColorRange value for name or an AVError if not found. + */ +int av_color_range_from_name(const char *name); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the AVColorPrimaries value for name or an AVError if not found. + */ +int av_color_primaries_from_name(const char *name); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the AVColorTransferCharacteristic value for name or an AVError if not found. + */ +int av_color_transfer_from_name(const char *name); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the AVColorSpace value for name or an AVError if not found. + */ +int av_color_space_from_name(const char *name); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * @return the AVChromaLocation value for name or an AVError if not found. + */ +int av_chroma_location_from_name(const char *name); + +/** + * Return the pixel format corresponding to name. + * + * If there is no pixel format with name name, then looks for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first looks for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. + */ +enum AVPixelFormat av_get_pix_fmt(const char *name); + +/** + * Return the short name for a pixel format, NULL in case pix_fmt is + * unknown. + * + * @see av_get_pix_fmt(), av_get_pix_fmt_string() + */ +const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); + +/** + * Print in buf the string corresponding to the pixel format with + * number pix_fmt, or a header if pix_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param pix_fmt the number of the pixel format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + */ +char *av_get_pix_fmt_string(char *buf, int buf_size, + enum AVPixelFormat pix_fmt); + +/** + * Read a line from an image, and write the values of the + * pixel format component c to dst. + * + * @param data the array containing the pointers to the planes of the image + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to read + * @param y the vertical coordinate of the first pixel to read + * @param w the width of the line to read, that is the number of + * values to write to dst + * @param read_pal_component if not zero and the format is a paletted + * format writes the values corresponding to the palette + * component c in data[1] to dst, rather than the palette indexes in + * data[0]. The behavior is undefined if the format is not paletted. + */ +void av_read_image_line(uint16_t *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component); + +/** + * Write the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + */ +void av_write_image_line(const uint16_t *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w); + +/** + * Utility function to swap the endianness of a pixel format. + * + * @param[in] pix_fmt the pixel format + * + * @return pixel format with swapped endianness if it exists, + * otherwise AV_PIX_FMT_NONE + */ +enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt); + +#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */ +#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */ +#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */ +#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */ +#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */ +#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */ + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, + enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +#endif /* AVUTIL_PIXDESC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixelutils.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixelutils.h new file mode 100644 index 0000000..a8dbc15 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/pixelutils.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PIXELUTILS_H +#define AVUTIL_PIXELUTILS_H + +#include +#include +#include "common.h" + +/** + * Sum of abs(src1[x] - src2[x]) + */ +typedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, + const uint8_t *src2, ptrdiff_t stride2); + +/** + * Get a potentially optimized pointer to a Sum-of-absolute-differences + * function (see the av_pixelutils_sad_fn prototype). + * + * @param w_bits 1< + * + * 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 + */ + +#ifndef AVUTIL_PIXFMT_H +#define AVUTIL_PIXFMT_H + +/** + * @file + * pixel format definitions + */ + +#include "libavutil/avconfig.h" +#include "version.h" + +#define AVPALETTE_SIZE 1024 +#define AVPALETTE_COUNT 256 + +/** + * Pixel format. + * + * @note + * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA + * color is put together as: + * (A << 24) | (R << 16) | (G << 8) | B + * This is stored as BGRA on little-endian CPU architectures and ARGB on + * big-endian CPUs. + * + * @par + * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized + * image data is stored in AVFrame.data[0]. The palette is transported in + * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is + * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is + * also endian-specific). Note also that the individual RGB32 palette + * components stored in AVFrame.data[1] should be in the range 0..255. + * This is important as many custom PAL8 video codecs that were designed + * to run on the IBM VGA graphics adapter use 6-bit palette components. + * + * @par + * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like + * for pal8. This palette is filled in automatically by the function + * allocating the picture. + */ +enum AVPixelFormat { + AV_PIX_FMT_NONE = -1, + AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) + AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... + AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... + AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) + AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) + AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) + AV_PIX_FMT_GRAY8, ///< Y , 8bpp + AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_PAL8, ///< 8 bits with AV_PIX_FMT_RGB32 palette + AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range + AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range + AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range +#if FF_API_XVMC + AV_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing + AV_PIX_FMT_XVMC_MPEG2_IDCT, + AV_PIX_FMT_XVMC = AV_PIX_FMT_XVMC_MPEG2_IDCT, +#endif /* FF_API_XVMC */ + AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 + AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) + AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) + AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) + AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) + AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped + + AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... + AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... + AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... + AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... + + AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian + AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian + AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) + AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range + AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) +#if FF_API_VDPAU + AV_PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + AV_PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers +#endif + AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian + + AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian + AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian + AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined + + AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian + AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian + AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined + +#if FF_API_VAAPI + /** @name Deprecated pixel formats */ + /**@{*/ + AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers + AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers + AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID + /**@}*/ + AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD, +#else + /** + * Hardware acceleration through VA-API, data[3] contains a + * VASurfaceID. + */ + AV_PIX_FMT_VAAPI, +#endif + + AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian +#if FF_API_VDPAU + AV_PIX_FMT_VDPAU_MPEG4, ///< MPEG-4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers +#endif + AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer + + AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha + + AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + + AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian + + /** + * The following 12 formats have the disadvantage of needing 1 format for each bit depth. + * Notice that each 9/10 bits sample is stored in 16 bits with extra padding. + * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. + */ + AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_VDA_VLD, ///< hardware decoding through VDA + AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp + AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP + AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian + AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian + AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian + AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian + AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian + AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) + AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) + AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian + AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian + AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + + AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface + + AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + + AV_PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + AV_PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + + AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + + AV_PIX_FMT_VDA, ///< HW acceleration through VDA, data[3] contains a CVPixelBufferRef + + AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) + AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (little-endian) + + AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp + AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian + AV_PIX_FMT_GBRAP16LE, ///< planar GBRA 4:4:4:4 64bpp, little-endian + /** + * HW acceleration through QSV, data[3] contains a pointer to the + * mfxFrameSurface1 structure. + */ + AV_PIX_FMT_QSV, + /** + * HW acceleration though MMAL, data[3] contains a pointer to the + * MMAL_BUFFER_HEADER_T structure. + */ + AV_PIX_FMT_MMAL, + + AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + + AV_PIX_FMT_0RGB=0x123+4,///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined + AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined + AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined + AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined + + AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big-endian + AV_PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little-endian + AV_PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big-endian + AV_PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little-endian + AV_PIX_FMT_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range + + AV_PIX_FMT_BAYER_BGGR8, ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_RGGB8, ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GBRG8, ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GRBG8, ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */ +#if !FF_API_XVMC + AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing +#endif /* !FF_API_XVMC */ + AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + + AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox + + AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian + + AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian + + AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian + AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian + + AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec + + AV_PIX_FMT_GRAY12BE, ///< Y , 12bpp, big-endian + AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian + AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian + AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian + + AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian + AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian + + /** + * Hardware surfaces for Direct3D11. + * + * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 + * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. + * + * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the + * texture array index of the frame as intptr_t if the ID3D11Texture2D is + * an array texture (or always 0 if it's a normal texture). + */ + AV_PIX_FMT_D3D11, + + AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian + AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian + + AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian + AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian + AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian + AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + + /** + * DRM-managed buffers exposed through PRIME buffer sharing. + * + * data[0] points to an AVDRMFrameDescriptor. + */ + AV_PIX_FMT_DRM_PRIME, + + AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions +}; + +#if AV_HAVE_BIGENDIAN +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be +#else +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le +#endif + +#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA) +#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR) +#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA) +#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB) +#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) +#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) + +#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) +#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) +#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) +#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) +#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) +#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) +#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE) +#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE) +#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE) +#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE) +#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE) +#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE) +#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE) +#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE) +#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE) + +#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE) +#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE) +#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE) +#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE) +#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE) +#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE) +#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE) +#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE) +#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE) +#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE) +#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE) +#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE) +#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE) +#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE) +#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE) +#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE) +#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE) + +#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE) +#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE) +#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) +#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) +#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) +#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) +#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) +#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) + +#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) +#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE) +#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) +#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) + +#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) +#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) + +#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) +#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) +#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) +#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) +#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) +#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) +#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) +#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) +#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) + +#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) +#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) +#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) +#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) +#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) + +/** + * Chromaticity coordinates of the source primaries. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. + */ +enum AVColorPrimaries { + AVCOL_PRI_RESERVED0 = 0, + AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + AVCOL_PRI_UNSPECIFIED = 2, + AVCOL_PRI_RESERVED = 3, + AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above + AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C + AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 + AVCOL_PRI_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + AVCOL_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors + AVCOL_PRI_NB ///< Not part of ABI +}; + +/** + * Color Transfer Characteristic. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. + */ +enum AVColorTransferCharacteristic { + AVCOL_TRC_RESERVED0 = 0, + AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED = 2, + AVCOL_TRC_RESERVED = 3, + AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC + AVCOL_TRC_SMPTE240M = 7, + AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics" + AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" + AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" + AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 + AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut + AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) + AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10-bit system + AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12-bit system + AVCOL_TRC_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, + AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI +}; + +/** + * YUV colorspace type. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. + */ +enum AVColorSpace { + AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) + AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + AVCOL_SPC_UNSPECIFIED = 2, + AVCOL_SPC_RESERVED = 3, + AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_SPC_SMPTE240M = 7, ///< functionally identical to above + AVCOL_SPC_YCGCO = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, + AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system + AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system + AVCOL_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + AVCOL_SPC_NB ///< Not part of ABI +}; + +/** + * MPEG vs JPEG YUV range. + */ +enum AVColorRange { + AVCOL_RANGE_UNSPECIFIED = 0, + AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges + AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges + AVCOL_RANGE_NB ///< Not part of ABI +}; + +/** + * Location of chroma samples. + * + * Illustration showing the location of the first (top left) chroma sample of the + * image, the left shows only luma, the right + * shows the location of the chroma sample, the 2 could be imagined to overlay + * each other but are drawn separately due to limitations of ASCII + * + * 1st 2nd 1st 2nd horizontal luma sample positions + * v v v v + * ______ ______ + *1st luma line > |X X ... |3 4 X ... X are luma samples, + * | |1 2 1-6 are possible chroma positions + *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position + */ +enum AVChromaLocation { + AVCHROMA_LOC_UNSPECIFIED = 0, + AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 + AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 + AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 + AVCHROMA_LOC_TOP = 4, + AVCHROMA_LOC_BOTTOMLEFT = 5, + AVCHROMA_LOC_BOTTOM = 6, + AVCHROMA_LOC_NB ///< Not part of ABI +}; + +#endif /* AVUTIL_PIXFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/random_seed.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/random_seed.h new file mode 100644 index 0000000..0462a04 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/random_seed.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009 Baptiste Coudurier + * + * 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 + */ + +#ifndef AVUTIL_RANDOM_SEED_H +#define AVUTIL_RANDOM_SEED_H + +#include +/** + * @addtogroup lavu_crypto + * @{ + */ + +/** + * Get a seed to use in conjunction with random functions. + * This function tries to provide a good seed at a best effort bases. + * Its possible to call this function multiple times if more bits are needed. + * It can be quite slow, which is why it should only be used as seed for a faster + * PRNG. The quality of the seed depends on the platform. + */ +uint32_t av_get_random_seed(void); + +/** + * @} + */ + +#endif /* AVUTIL_RANDOM_SEED_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rational.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rational.h new file mode 100644 index 0000000..5c6b67b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rational.h @@ -0,0 +1,214 @@ +/* + * rational numbers + * Copyright (c) 2003 Michael Niedermayer + * + * 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 + * @ingroup lavu_math_rational + * Utilties for rational number calculation. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_RATIONAL_H +#define AVUTIL_RATIONAL_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_math_rational AVRational + * @ingroup lavu_math + * Rational number calculation. + * + * While rational numbers can be expressed as floating-point numbers, the + * conversion process is a lossy one, so are floating-point operations. On the + * other hand, the nature of FFmpeg demands highly accurate calculation of + * timestamps. This set of rational number utilities serves as a generic + * interface for manipulating rational numbers as pairs of numerators and + * denominators. + * + * Many of the functions that operate on AVRational's have the suffix `_q`, in + * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * rational numbers. + * + * @{ + */ + +/** + * Rational number (pair of numerator and denominator). + */ +typedef struct AVRational{ + int num; ///< Numerator + int den; ///< Denominator +} AVRational; + +/** + * Create an AVRational. + * + * Useful for compilers that do not support compound literals. + * + * @note The return value is not reduced. + * @see av_reduce() + */ +static inline AVRational av_make_q(int num, int den) +{ + AVRational r = { num, den }; + return r; +} + +/** + * Compare two rationals. + * + * @param a First rational + * @param b Second rational + * + * @return One of the following values: + * - 0 if `a == b` + * - 1 if `a > b` + * - -1 if `a < b` + * - `INT_MIN` if one of the values is of the form `0 / 0` + */ +static inline int av_cmp_q(AVRational a, AVRational b){ + const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; + + if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1; + else if(b.den && a.den) return 0; + else if(a.num && b.num) return (a.num>>31) - (b.num>>31); + else return INT_MIN; +} + +/** + * Convert an AVRational to a `double`. + * @param a AVRational to convert + * @return `a` in floating-point form + * @see av_d2q() + */ +static inline double av_q2d(AVRational a){ + return a.num / (double) a.den; +} + +/** + * Reduce a fraction. + * + * This is useful for framerate calculations. + * + * @param[out] dst_num Destination numerator + * @param[out] dst_den Destination denominator + * @param[in] num Source numerator + * @param[in] den Source denominator + * @param[in] max Maximum allowed values for `dst_num` & `dst_den` + * @return 1 if the operation is exact, 0 otherwise + */ +int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); + +/** + * Multiply two rationals. + * @param b First rational + * @param c Second rational + * @return b*c + */ +AVRational av_mul_q(AVRational b, AVRational c) av_const; + +/** + * Divide one rational by another. + * @param b First rational + * @param c Second rational + * @return b/c + */ +AVRational av_div_q(AVRational b, AVRational c) av_const; + +/** + * Add two rationals. + * @param b First rational + * @param c Second rational + * @return b+c + */ +AVRational av_add_q(AVRational b, AVRational c) av_const; + +/** + * Subtract one rational from another. + * @param b First rational + * @param c Second rational + * @return b-c + */ +AVRational av_sub_q(AVRational b, AVRational c) av_const; + +/** + * Invert a rational. + * @param q value + * @return 1 / q + */ +static av_always_inline AVRational av_inv_q(AVRational q) +{ + AVRational r = { q.den, q.num }; + return r; +} + +/** + * Convert a double precision floating point number to a rational. + * + * In case of infinity, the returned value is expressed as `{1, 0}` or + * `{-1, 0}` depending on the sign. + * + * @param d `double` to convert + * @param max Maximum allowed numerator and denominator + * @return `d` in AVRational form + * @see av_q2d() + */ +AVRational av_d2q(double d, int max) av_const; + +/** + * Find which of the two rationals is closer to another rational. + * + * @param q Rational to be compared against + * @param q1,q2 Rationals to be tested + * @return One of the following values: + * - 1 if `q1` is nearer to `q` than `q2` + * - -1 if `q2` is nearer to `q` than `q1` + * - 0 if they have the same distance + */ +int av_nearer_q(AVRational q, AVRational q1, AVRational q2); + +/** + * Find the value in a list of rationals nearest a given reference rational. + * + * @param q Reference rational + * @param q_list Array of rationals terminated by `{0, 0}` + * @return Index of the nearest value found in the array + */ +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); + +/** + * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point + * format. + * + * @param q Rational to be converted + * @return Equivalent floating-point value, expressed as an unsigned 32-bit + * integer. + * @note The returned value is platform-indepedant. + */ +uint32_t av_q2intfloat(AVRational q); + +/** + * @} + */ + +#endif /* AVUTIL_RATIONAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rc4.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rc4.h new file mode 100644 index 0000000..029cd2a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/rc4.h @@ -0,0 +1,66 @@ +/* + * RC4 encryption/decryption/pseudo-random number generator + * + * 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 + */ + +#ifndef AVUTIL_RC4_H +#define AVUTIL_RC4_H + +#include + +/** + * @defgroup lavu_rc4 RC4 + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVRC4 { + uint8_t state[256]; + int x, y; +} AVRC4; + +/** + * Allocate an AVRC4 context. + */ +AVRC4 *av_rc4_alloc(void); + +/** + * @brief Initializes an AVRC4 context. + * + * @param key_bits must be a multiple of 8 + * @param decrypt 0 for encryption, 1 for decryption, currently has no effect + * @return zero on success, negative value otherwise + */ +int av_rc4_init(struct AVRC4 *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the RC4 algorithm. + * + * @param count number of bytes + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst, may be NULL + * @param iv not (yet) used for RC4, should be NULL + * @param decrypt 0 for encryption, 1 for decryption, not (yet) used + */ +void av_rc4_crypt(struct AVRC4 *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_RC4_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/replaygain.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/replaygain.h new file mode 100644 index 0000000..b49bf1a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/replaygain.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVUTIL_REPLAYGAIN_H +#define AVUTIL_REPLAYGAIN_H + +#include + +/** + * ReplayGain information (see + * http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification). + * The size of this struct is a part of the public ABI. + */ +typedef struct AVReplayGain { + /** + * Track replay gain in microbels (divide by 100000 to get the value in dB). + * Should be set to INT32_MIN when unknown. + */ + int32_t track_gain; + /** + * Peak track amplitude, with 100000 representing full scale (but values + * may overflow). 0 when unknown. + */ + uint32_t track_peak; + /** + * Same as track_gain, but for the whole album. + */ + int32_t album_gain; + /** + * Same as track_peak, but for the whole album, + */ + uint32_t album_peak; +} AVReplayGain; + +#endif /* AVUTIL_REPLAYGAIN_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ripemd.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ripemd.h new file mode 100644 index 0000000..6d6bb32 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/ripemd.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_ripemd + * Public header for RIPEMD hash function implementation. + */ + +#ifndef AVUTIL_RIPEMD_H +#define AVUTIL_RIPEMD_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_ripemd RIPEMD + * @ingroup lavu_hash + * RIPEMD hash function implementation. + * + * @{ + */ + +extern const int av_ripemd_size; + +struct AVRIPEMD; + +/** + * Allocate an AVRIPEMD context. + */ +struct AVRIPEMD *av_ripemd_alloc(void); + +/** + * Initialize RIPEMD hashing. + * + * @param context pointer to the function context (of size av_ripemd_size) + * @param bits number of bits in digest (128, 160, 256 or 320 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_ripemd_init(struct AVRIPEMD* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, unsigned int len); + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_ripemd_final(struct AVRIPEMD* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_RIPEMD_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/samplefmt.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/samplefmt.h new file mode 100644 index 0000000..8cd43ae --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/samplefmt.h @@ -0,0 +1,272 @@ +/* + * 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 + */ + +#ifndef AVUTIL_SAMPLEFMT_H +#define AVUTIL_SAMPLEFMT_H + +#include + +#include "avutil.h" +#include "attributes.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_sampfmts Audio sample formats + * + * Audio sample format enumeration and related convenience functions. + * @{ + */ + +/** + * Audio sample formats + * + * - The data described by the sample format is always in native-endian order. + * Sample values can be expressed by native C types, hence the lack of a signed + * 24-bit sample format even though it is a common raw audio data format. + * + * - The floating-point formats are based on full volume being in the range + * [-1.0, 1.0]. Any values outside this range are beyond full volume level. + * + * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg + * (such as AVFrame in libavcodec) is as follows: + * + * @par + * For planar sample formats, each audio channel is in a separate data plane, + * and linesize is the buffer size, in bytes, for a single plane. All data + * planes must be the same size. For packed sample formats, only the first data + * plane is used, and samples for each channel are interleaved. In this case, + * linesize is the buffer size, in bytes, for the 1 plane. + * + */ +enum AVSampleFormat { + AV_SAMPLE_FMT_NONE = -1, + AV_SAMPLE_FMT_U8, ///< unsigned 8 bits + AV_SAMPLE_FMT_S16, ///< signed 16 bits + AV_SAMPLE_FMT_S32, ///< signed 32 bits + AV_SAMPLE_FMT_FLT, ///< float + AV_SAMPLE_FMT_DBL, ///< double + + AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar + AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar + AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar + AV_SAMPLE_FMT_FLTP, ///< float, planar + AV_SAMPLE_FMT_DBLP, ///< double, planar + AV_SAMPLE_FMT_S64, ///< signed 64 bits + AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar + + AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically +}; + +/** + * Return the name of sample_fmt, or NULL if sample_fmt is not + * recognized. + */ +const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); + +/** + * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE + * on error. + */ +enum AVSampleFormat av_get_sample_fmt(const char *name); + +/** + * Return the planar<->packed alternative form of the given sample format, or + * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the + * requested planar/packed format, the format returned is the same as the + * input. + */ +enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); + +/** + * Get the packed alternative form of the given sample format. + * + * If the passed sample_fmt is already in packed format, the format returned is + * the same as the input. + * + * @return the packed alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Get the planar alternative form of the given sample format. + * + * If the passed sample_fmt is already in planar format, the format returned is + * the same as the input. + * + * @return the planar alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Generate a string corresponding to the sample format with + * sample_fmt, or a header if sample_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param sample_fmt the number of the sample format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + * @return the pointer to the filled buffer or NULL if sample_fmt is + * unknown or in case of other errors + */ +char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); + +/** + * Return number of bytes per sample. + * + * @param sample_fmt the sample format + * @return number of bytes per sample or zero if unknown for the given + * sample format + */ +int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); + +/** + * Check if the sample format is planar. + * + * @param sample_fmt the sample format to inspect + * @return 1 if the sample format is planar, 0 if it is interleaved + */ +int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); + +/** + * Get the required buffer size for the given audio parameters. + * + * @param[out] linesize calculated linesize, may be NULL + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return required buffer size, or negative error code on failure + */ +int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * @} + * + * @defgroup lavu_sampmanip Samples manipulation + * + * Functions that manipulate audio samples + * @{ + */ + +/** + * Fill plane data pointers and linesize for samples with sample + * format sample_fmt. + * + * The audio_data array is filled with the pointers to the samples data planes: + * for planar, set the start point of each channel's data within the buffer, + * for packed, set the start point of the entire buffer only. + * + * The value pointed to by linesize is set to the aligned size of each + * channel's data buffer for planar layout, or to the aligned size of the + * buffer for all channels for packed layout. + * + * The buffer in buf must be big enough to contain all the samples + * (use av_samples_get_buffer_size() to compute its minimum size), + * otherwise the audio_data pointers will point to invalid data. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize calculated linesize, may be NULL + * @param buf the pointer to a buffer containing the samples + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return minimum size in bytes required for the buffer in case + * of success at the next bump + */ +int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, + const uint8_t *buf, + int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a samples buffer for nb_samples samples, and fill data pointers and + * linesize accordingly. + * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) + * Allocated data will be initialized to silence. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize aligned size for audio buffer(s), may be NULL + * @param nb_channels number of audio channels + * @param nb_samples number of samples per channel + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return the size of the allocated buffer in case of success at the next bump + * @see av_samples_fill_arrays() + * @see av_samples_alloc_array_and_samples() + */ +int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a data pointers array, samples buffer for nb_samples + * samples, and fill data pointers and linesize accordingly. + * + * This is the same as av_samples_alloc(), but also allocates the data + * pointers array. + * + * @see av_samples_alloc() + */ +int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Copy samples from src to dst. + * + * @param dst destination array of pointers to data planes + * @param src source array of pointers to data planes + * @param dst_offset offset in samples at which the data will be written to dst + * @param src_offset offset in samples at which the data will be read from src + * @param nb_samples number of samples to be copied + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, + int src_offset, int nb_samples, int nb_channels, + enum AVSampleFormat sample_fmt); + +/** + * Fill an audio buffer with silence. + * + * @param audio_data array of pointers to data planes + * @param offset offset in samples at which to start filling + * @param nb_samples number of samples to fill + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, + int nb_channels, enum AVSampleFormat sample_fmt); + +/** + * @} + * @} + */ +#endif /* AVUTIL_SAMPLEFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha.h new file mode 100644 index 0000000..c0180e5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * + * 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 + * @ingroup lavu_sha + * Public header for SHA-1 & SHA-256 hash function implementations. + */ + +#ifndef AVUTIL_SHA_H +#define AVUTIL_SHA_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha SHA + * @ingroup lavu_hash + * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA hash functions: + * + * - SHA-1: 160 bits + * - SHA-224: 224 bits, as a variant of SHA-2 + * - SHA-256: 256 bits, as a variant of SHA-2 + * + * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512. + * + * @{ + */ + +extern const int av_sha_size; + +struct AVSHA; + +/** + * Allocate an AVSHA context. + */ +struct AVSHA *av_sha_alloc(void); + +/** + * Initialize SHA-1 or SHA-2 hashing. + * + * @param context pointer to the function context (of size av_sha_size) + * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha_init(struct AVSHA* context, int bits); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, unsigned int len); +#else +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha_final(struct AVSHA* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha512.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha512.h new file mode 100644 index 0000000..bef714b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/sha512.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_sha512 + * Public header for SHA-512 implementation. + */ + +#ifndef AVUTIL_SHA512_H +#define AVUTIL_SHA512_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha512 SHA-512 + * @ingroup lavu_hash + * SHA-512 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA-2 hash functions: + * + * - SHA-512/224: 224 bits + * - SHA-512/256: 256 bits + * - SHA-384: 384 bits + * - SHA-512: 512 bits + * + * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha. + * + * @{ + */ + +extern const int av_sha512_size; + +struct AVSHA512; + +/** + * Allocate an AVSHA512 context. + */ +struct AVSHA512 *av_sha512_alloc(void); + +/** + * Initialize SHA-2 512 hashing. + * + * @param context pointer to the function context (of size av_sha512_size) + * @param bits number of bits in digest (224, 256, 384 or 512 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha512_init(struct AVSHA512* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, unsigned int len); +#else +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha512_final(struct AVSHA512* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA512_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/spherical.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/spherical.h new file mode 100644 index 0000000..cef759c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/spherical.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016 Vittorio Giovara + * + * 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 + * Spherical video + */ + +#ifndef AVUTIL_SPHERICAL_H +#define AVUTIL_SPHERICAL_H + +#include +#include + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_spherical Spherical video mapping + * @{ + */ + +/** + * @addtogroup lavu_video_spherical + * A spherical video file contains surfaces that need to be mapped onto a + * sphere. Depending on how the frame was converted, a different distortion + * transformation or surface recomposition function needs to be applied before + * the video should be mapped and displayed. + */ + +/** + * Projection of the video surface(s) on a sphere. + */ +enum AVSphericalProjection { + /** + * Video represents a sphere mapped on a flat surface using + * equirectangular projection. + */ + AV_SPHERICAL_EQUIRECTANGULAR, + + /** + * Video frame is split into 6 faces of a cube, and arranged on a + * 3x2 layout. Faces are oriented upwards for the front, left, right, + * and back faces. The up face is oriented so the top of the face is + * forwards and the down face is oriented so the top of the face is + * to the back. + */ + AV_SPHERICAL_CUBEMAP, + + /** + * Video represents a portion of a sphere mapped on a flat surface + * using equirectangular projection. The @ref bounding fields indicate + * the position of the current video in a larger surface. + */ + AV_SPHERICAL_EQUIRECTANGULAR_TILE, +}; + +/** + * This structure describes how to handle spherical videos, outlining + * information about projection, initial layout, and any other view modifier. + * + * @note The struct must be allocated with av_spherical_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVSphericalMapping { + /** + * Projection type. + */ + enum AVSphericalProjection projection; + + /** + * @name Initial orientation + * @{ + * There fields describe additional rotations applied to the sphere after + * the video frame is mapped onto it. The sphere is rotated around the + * viewer, who remains stationary. The order of transformation is always + * yaw, followed by pitch, and finally by roll. + * + * The coordinate system matches the one defined in OpenGL, where the + * forward vector (z) is coming out of screen, and it is equivalent to + * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll). + * + * A positive yaw rotates the portion of the sphere in front of the viewer + * toward their right. A positive pitch rotates the portion of the sphere + * in front of the viewer upwards. A positive roll tilts the portion of + * the sphere in front of the viewer to the viewer's right. + * + * These values are exported as 16.16 fixed point. + * + * See this equirectangular projection as example: + * + * @code{.unparsed} + * Yaw + * -180 0 180 + * 90 +-------------+-------------+ 180 + * | | | up + * P | | | y| forward + * i | ^ | | /z + * t 0 +-------------X-------------+ 0 Roll | / + * c | | | | / + * h | | | 0|/_____right + * | | | x + * -90 +-------------+-------------+ -180 + * + * X - the default camera center + * ^ - the default up vector + * @endcode + */ + int32_t yaw; ///< Rotation around the up vector [-180, 180]. + int32_t pitch; ///< Rotation around the right vector [-90, 90]. + int32_t roll; ///< Rotation around the forward vector [-180, 180]. + /** + * @} + */ + + /** + * @name Bounding rectangle + * @anchor bounding + * @{ + * These fields indicate the location of the current tile, and where + * it should be mapped relative to the original surface. They are + * exported as 0.32 fixed point, and can be converted to classic + * pixel values with av_spherical_bounds(). + * + * @code{.unparsed} + * +----------------+----------+ + * | |bound_top | + * | +--------+ | + * | bound_left |tile | | + * +<---------->| |<--->+bound_right + * | +--------+ | + * | | | + * | bound_bottom| | + * +----------------+----------+ + * @endcode + * + * If needed, the original video surface dimensions can be derived + * by adding the current stream or frame size to the related bounds, + * like in the following example: + * + * @code{c} + * original_width = tile->width + bound_left + bound_right; + * original_height = tile->height + bound_top + bound_bottom; + * @endcode + * + * @note These values are valid only for the tiled equirectangular + * projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE), + * and should be ignored in all other cases. + */ + uint32_t bound_left; ///< Distance from the left edge + uint32_t bound_top; ///< Distance from the top edge + uint32_t bound_right; ///< Distance from the right edge + uint32_t bound_bottom; ///< Distance from the bottom edge + /** + * @} + */ + + /** + * Number of pixels to pad from the edge of each cube face. + * + * @note This value is valid for only for the cubemap projection type + * (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other + * cases. + */ + uint32_t padding; +} AVSphericalMapping; + +/** + * Allocate a AVSphericalVideo structure and initialize its fields to default + * values. + * + * @return the newly allocated struct or NULL on failure + */ +AVSphericalMapping *av_spherical_alloc(size_t *size); + +/** + * Convert the @ref bounding fields from an AVSphericalVideo + * from 0.32 fixed point to pixels. + * + * @param map The AVSphericalVideo map to read bound values from. + * @param width Width of the current frame or stream. + * @param height Height of the current frame or stream. + * @param left Pixels from the left edge. + * @param top Pixels from the top edge. + * @param right Pixels from the right edge. + * @param bottom Pixels from the bottom edge. + */ +void av_spherical_tile_bounds(const AVSphericalMapping *map, + size_t width, size_t height, + size_t *left, size_t *top, + size_t *right, size_t *bottom); + +/** + * Provide a human-readable name of a given AVSphericalProjection. + * + * @param projection The input AVSphericalProjection. + * + * @return The name of the AVSphericalProjection, or "unknown". + */ +const char *av_spherical_projection_name(enum AVSphericalProjection projection); + +/** + * Get the AVSphericalProjection form a human-readable name. + * + * @param name The input string. + * + * @return The AVSphericalProjection value, or -1 if not found. + */ +int av_spherical_from_name(const char *name); +/** + * @} + * @} + */ + +#endif /* AVUTIL_SPHERICAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/stereo3d.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/stereo3d.h new file mode 100644 index 0000000..54f4c4c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/stereo3d.h @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2013 Vittorio Giovara + * + * 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 + * Stereoscopic video + */ + +#ifndef AVUTIL_STEREO3D_H +#define AVUTIL_STEREO3D_H + +#include + +#include "frame.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_stereo3d Stereo3D types and functions + * @{ + */ + +/** + * @addtogroup lavu_video_stereo3d + * A stereoscopic video file consists in multiple views embedded in a single + * frame, usually describing two views of a scene. This file describes all + * possible codec-independent view arrangements. + * */ + +/** + * List of possible 3D Types + */ +enum AVStereo3DType { + /** + * Video is not stereoscopic (and metadata has to be there). + */ + AV_STEREO3D_2D, + + /** + * Views are next to each other. + * + * @code{.unparsed} + * LLLLRRRR + * LLLLRRRR + * LLLLRRRR + * ... + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE, + + /** + * Views are on top of each other. + * + * @code{.unparsed} + * LLLLLLLL + * LLLLLLLL + * RRRRRRRR + * RRRRRRRR + * @endcode + */ + AV_STEREO3D_TOPBOTTOM, + + /** + * Views are alternated temporally. + * + * @code{.unparsed} + * frame0 frame1 frame2 ... + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * ... ... ... + * @endcode + */ + AV_STEREO3D_FRAMESEQUENCE, + + /** + * Views are packed in a checkerboard-like structure per pixel. + * + * @code{.unparsed} + * LRLRLRLR + * RLRLRLRL + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_CHECKERBOARD, + + /** + * Views are next to each other, but when upscaling + * apply a checkerboard pattern. + * + * @code{.unparsed} + * LLLLRRRR L L L L R R R R + * LLLLRRRR => L L L L R R R R + * LLLLRRRR L L L L R R R R + * LLLLRRRR L L L L R R R R + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE_QUINCUNX, + + /** + * Views are packed per line, as if interlaced. + * + * @code{.unparsed} + * LLLLLLLL + * RRRRRRRR + * LLLLLLLL + * ... + * @endcode + */ + AV_STEREO3D_LINES, + + /** + * Views are packed per column. + * + * @code{.unparsed} + * LRLRLRLR + * LRLRLRLR + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_COLUMNS, +}; + + +/** + * Inverted views, Right/Bottom represents the left view. + */ +#define AV_STEREO3D_FLAG_INVERT (1 << 0) + +/** + * Stereo 3D type: this structure describes how two videos are packed + * within a single video surface, with additional information as needed. + * + * @note The struct must be allocated with av_stereo3d_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVStereo3D { + /** + * How views are packed within the video. + */ + enum AVStereo3DType type; + + /** + * Additional information about the frame packing. + */ + int flags; +} AVStereo3D; + +/** + * Allocate an AVStereo3D structure and set its fields to default values. + * The resulting struct can be freed using av_freep(). + * + * @return An AVStereo3D filled with default values or NULL on failure. + */ +AVStereo3D *av_stereo3d_alloc(void); + +/** + * Allocate a complete AVFrameSideData and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVStereo3D structure to be filled by caller. + */ +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); + +/** + * Provide a human-readable name of a given stereo3d type. + * + * @param type The input stereo3d type value. + * + * @return The name of the stereo3d value, or "unknown". + */ +const char *av_stereo3d_type_name(unsigned int type); + +/** + * Get the AVStereo3DType form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DType value, or -1 if not found. + */ +int av_stereo3d_from_name(const char *name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_STEREO3D_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tea.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tea.h new file mode 100644 index 0000000..dd929bd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tea.h @@ -0,0 +1,71 @@ +/* + * A 32-bit implementation of the TEA algorithm + * Copyright (c) 2015 Vesselin Bontchev + * + * 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 + */ + +#ifndef AVUTIL_TEA_H +#define AVUTIL_TEA_H + +#include + +/** + * @file + * @brief Public header for libavutil TEA algorithm + * @defgroup lavu_tea TEA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_tea_size; + +struct AVTEA; + +/** + * Allocate an AVTEA context + * To free the struct: av_free(ptr) + */ +struct AVTEA *av_tea_alloc(void); + +/** + * Initialize an AVTEA context. + * + * @param ctx an AVTEA context + * @param key a key of 16 bytes used for encryption/decryption + * @param rounds the number of rounds in TEA (64 is the "standard") + */ +void av_tea_init(struct AVTEA *ctx, const uint8_t key[16], int rounds); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_tea_crypt(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_TEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/threadmessage.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/threadmessage.h new file mode 100644 index 0000000..8480a0a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/threadmessage.h @@ -0,0 +1,107 @@ +/* + * 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 + */ + +#ifndef AVUTIL_THREADMESSAGE_H +#define AVUTIL_THREADMESSAGE_H + +typedef struct AVThreadMessageQueue AVThreadMessageQueue; + +typedef enum AVThreadMessageFlags { + + /** + * Perform non-blocking operation. + * If this flag is set, send and recv operations are non-blocking and + * return AVERROR(EAGAIN) immediately if they can not proceed. + */ + AV_THREAD_MESSAGE_NONBLOCK = 1, + +} AVThreadMessageFlags; + +/** + * Allocate a new message queue. + * + * @param mq pointer to the message queue + * @param nelem maximum number of elements in the queue + * @param elsize size of each element in the queue + * @return >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if + * lavu was built without thread support + */ +int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, + unsigned nelem, + unsigned elsize); + +/** + * Free a message queue. + * + * The message queue must no longer be in use by another thread. + */ +void av_thread_message_queue_free(AVThreadMessageQueue **mq); + +/** + * Send a message on the queue. + */ +int av_thread_message_queue_send(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Receive a message from the queue. + */ +int av_thread_message_queue_recv(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Set the sending error code. + * + * If the error code is set to non-zero, av_thread_message_queue_send() will + * return it immediately. Conventional values, such as AVERROR_EOF or + * AVERROR(EAGAIN), can be used to cause the sending thread to stop or + * suspend its operation. + */ +void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, + int err); + +/** + * Set the receiving error code. + * + * If the error code is set to non-zero, av_thread_message_queue_recv() will + * return it immediately when there are no longer available messages. + * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used + * to cause the receiving thread to stop or suspend its operation. + */ +void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, + int err); + +/** + * Set the optional free message callback function which will be called if an + * operation is removing messages from the queue. + */ +void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, + void (*free_func)(void *msg)); + +/** + * Flush the message queue + * + * This function is mostly equivalent to reading and free-ing every message + * except that it will be done in a single operation (no lock/unlock between + * reads). + */ +void av_thread_message_flush(AVThreadMessageQueue *mq); + +#endif /* AVUTIL_THREADMESSAGE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/time.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/time.h new file mode 100644 index 0000000..dc169b0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/time.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2000-2003 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 + */ + +#ifndef AVUTIL_TIME_H +#define AVUTIL_TIME_H + +#include + +/** + * Get the current time in microseconds. + */ +int64_t av_gettime(void); + +/** + * Get the current time in microseconds since some unspecified starting point. + * On platforms that support it, the time comes from a monotonic clock + * This property makes this time source ideal for measuring relative time. + * The returned values may not be monotonic on platforms where a monotonic + * clock is not available. + */ +int64_t av_gettime_relative(void); + +/** + * Indicates with a boolean result if the av_gettime_relative() time source + * is monotonic. + */ +int av_gettime_relative_is_monotonic(void); + +/** + * Sleep for a period of time. Although the duration is expressed in + * microseconds, the actual delay may be rounded to the precision of the + * system timer. + * + * @param usec Number of microseconds to sleep. + * @return zero on success or (negative) error code. + */ +int av_usleep(unsigned usec); + +#endif /* AVUTIL_TIME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timecode.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timecode.h new file mode 100644 index 0000000..37c1361 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timecode.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier + * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch + * + * 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 + * Timecode helpers header + */ + +#ifndef AVUTIL_TIMECODE_H +#define AVUTIL_TIMECODE_H + +#include +#include "rational.h" + +#define AV_TIMECODE_STR_SIZE 23 + +enum AVTimecodeFlag { + AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame + AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours + AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed +}; + +typedef struct { + int start; ///< timecode frame start (first base frame number) + uint32_t flags; ///< flags such as drop frame, +24 hours support, ... + AVRational rate; ///< frame rate in rational form + unsigned fps; ///< frame per second; must be consistent with the rate field +} AVTimecode; + +/** + * Adjust frame number for NTSC drop frame time code. + * + * @param framenum frame number to adjust + * @param fps frame per second, 30 or 60 + * @return adjusted frame number + * @warning adjustment is only valid in NTSC 29.97 and 59.94 + */ +int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); + +/** + * Convert frame number to SMPTE 12M binary representation. + * + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the SMPTE binary representation + * + * @note Frame number adjustment is automatically done in case of drop timecode, + * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). + * @note The frame number is relative to tc->start. + * @note Color frame (CF), binary group flags (BGF) and biphase mark polarity + * correction (PC) bits are set to zero. + */ +uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); + +/** + * Load timecode string in buf. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the buf parameter + * + * @note Timecode representation can be a negative timecode and have more than + * 24 hours, but will only be honored if the flags are correctly set. + * @note The frame number is relative to tc->start. + */ +char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum); + +/** + * Get the timecode string from the SMPTE timecode format. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tcsmpte the 32-bit SMPTE timecode + * @param prevent_df prevent the use of a drop flag when it is known the DF bit + * is arbitrary + * @return the buf parameter + */ +char *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df); + +/** + * Get the timecode string from the 25-bit timecode format (MPEG GOP format). + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc25bit the 25-bits timecode + * @return the buf parameter + */ +char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit); + +/** + * Init a timecode struct with the passed parameters. + * + * @param log_ctx a pointer to an arbitrary struct of which the first field + * is a pointer to an AVClass struct (used for av_log) + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param flags miscellaneous flags such as drop frame, +24 hours, ... + * (see AVTimecodeFlag) + * @param frame_start the first frame number + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); + +/** + * Parse timecode representation (hh:mm:ss[:;.]ff). + * + * @param log_ctx a pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct (used for av_log). + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param str timecode string which will determine the frame start + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); + +/** + * Check if the timecode feature is available for the given frame rate + * + * @return 0 if supported, <0 otherwise + */ +int av_timecode_check_frame_rate(AVRational rate); + +#endif /* AVUTIL_TIMECODE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timestamp.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timestamp.h new file mode 100644 index 0000000..e082f01 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/timestamp.h @@ -0,0 +1,78 @@ +/* + * 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 + * timestamp utils, mostly useful for debugging/logging purposes + */ + +#ifndef AVUTIL_TIMESTAMP_H +#define AVUTIL_TIMESTAMP_H + +#include "common.h" + +#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) +#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS +#endif + +#define AV_TS_MAX_STRING_SIZE 32 + +/** + * Fill the provided buffer with a string containing a timestamp + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @return the buffer in input + */ +static inline char *av_ts_make_string(char *buf, int64_t ts) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) + +/** + * Fill the provided buffer with a string containing a timestamp time + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @param tb the timebase of the timestamp + * @return the buffer in input + */ +static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb) + +#endif /* AVUTIL_TIMESTAMP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tree.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tree.h new file mode 100644 index 0000000..d5e0aeb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/tree.h @@ -0,0 +1,138 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * A tree container. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_TREE_H +#define AVUTIL_TREE_H + +#include "attributes.h" +#include "version.h" + +/** + * @addtogroup lavu_tree AVTree + * @ingroup lavu_data + * + * Low-complexity tree container + * + * Insertion, removal, finding equal, largest which is smaller than and + * smallest which is larger than, all have O(log n) worst-case complexity. + * @{ + */ + + +struct AVTreeNode; +extern const int av_tree_node_size; + +/** + * Allocate an AVTreeNode. + */ +struct AVTreeNode *av_tree_node_alloc(void); + +/** + * Find an element. + * @param root a pointer to the root node of the tree + * @param next If next is not NULL, then next[0] will contain the previous + * element and next[1] the next element. If either does not exist, + * then the corresponding entry in next is unchanged. + * @param cmp compare function used to compare elements in the tree, + * API identical to that of Standard C's qsort + * It is guaranteed that the first and only the first argument to cmp() + * will be the key parameter to av_tree_find(), thus it could if the + * user wants, be a different type (like an opaque context). + * @return An element with cmp(key, elem) == 0 or NULL if no such element + * exists in the tree. + */ +void *av_tree_find(const struct AVTreeNode *root, void *key, + int (*cmp)(const void *key, const void *b), void *next[2]); + +/** + * Insert or remove an element. + * + * If *next is NULL, then the supplied element will be removed if it exists. + * If *next is non-NULL, then the supplied element will be inserted, unless + * it already exists in the tree. + * + * @param rootp A pointer to a pointer to the root node of the tree; note that + * the root node can change during insertions, this is required + * to keep the tree balanced. + * @param key pointer to the element key to insert in the tree + * @param next Used to allocate and free AVTreeNodes. For insertion the user + * must set it to an allocated and zeroed object of at least + * av_tree_node_size bytes size. av_tree_insert() will set it to + * NULL if it has been consumed. + * For deleting elements *next is set to NULL by the user and + * av_tree_insert() will set it to the AVTreeNode which was + * used for the removed element. + * This allows the use of flat arrays, which have + * lower overhead compared to many malloced elements. + * You might want to define a function like: + * @code + * void *tree_insert(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b), + * AVTreeNode **next) + * { + * if (!*next) + * *next = av_mallocz(av_tree_node_size); + * return av_tree_insert(rootp, key, cmp, next); + * } + * void *tree_remove(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b, AVTreeNode **next)) + * { + * av_freep(next); + * return av_tree_insert(rootp, key, cmp, next); + * } + * @endcode + * @param cmp compare function used to compare elements in the tree, API identical + * to that of Standard C's qsort + * @return If no insertion happened, the found element; if an insertion or + * removal happened, then either key or NULL will be returned. + * Which one it is depends on the tree state and the implementation. You + * should make no assumptions that it's one or the other in the code. + */ +void *av_tree_insert(struct AVTreeNode **rootp, void *key, + int (*cmp)(const void *key, const void *b), + struct AVTreeNode **next); + +void av_tree_destroy(struct AVTreeNode *t); + +/** + * Apply enu(opaque, &elem) to all the elements in the tree in a given range. + * + * @param cmp a comparison function that returns < 0 for an element below the + * range, > 0 for an element above the range and == 0 for an + * element inside the range + * + * @note The cmp function should use the same ordering used to construct the + * tree. + */ +void av_tree_enumerate(struct AVTreeNode *t, void *opaque, + int (*cmp)(void *opaque, void *elem), + int (*enu)(void *opaque, void *elem)); + +/** + * @} + */ + +#endif /* AVUTIL_TREE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/twofish.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/twofish.h new file mode 100644 index 0000000..813cfec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/twofish.h @@ -0,0 +1,70 @@ +/* + * An implementation of the TwoFish algorithm + * Copyright (c) 2015 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_TWOFISH_H +#define AVUTIL_TWOFISH_H + +#include + + +/** + * @file + * @brief Public header for libavutil TWOFISH algorithm + * @defgroup lavu_twofish TWOFISH + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_twofish_size; + +struct AVTWOFISH; + +/** + * Allocate an AVTWOFISH context + * To free the struct: av_free(ptr) + */ +struct AVTWOFISH *av_twofish_alloc(void); + +/** + * Initialize an AVTWOFISH context. + * + * @param ctx an AVTWOFISH context + * @param key a key of size ranging from 1 to 32 bytes used for encryption/decryption + * @param key_bits number of keybits: 128, 192, 256 If less than the required, padded with zeroes to nearest valid value; return value is 0 if key_bits is 128/192/256, -1 if less than 0, 1 otherwise + */ +int av_twofish_init(struct AVTWOFISH *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVTWOFISH context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_twofish_crypt(struct AVTWOFISH *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_TWOFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/version.h new file mode 100644 index 0000000..f594dc0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/version.h @@ -0,0 +1,149 @@ +/* + * copyright (c) 2003 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 + * @ingroup lavu + * Libavutil version macros + */ + +#ifndef AVUTIL_VERSION_H +#define AVUTIL_VERSION_H + +#include "macros.h" + +/** + * @addtogroup version_utils + * + * Useful to check and match library version in order to maintain + * backward compatibility. + * + * The FFmpeg libraries follow a versioning sheme very similar to + * Semantic Versioning (http://semver.org/) + * The difference is that the component called PATCH is called MICRO in FFmpeg + * and its value is reset to 100 instead of 0 to keep it above or equal to 100. + * Also we do not increase MICRO for every bugfix or change in git master. + * + * Prior to FFmpeg 3.2 point releases did not change any lib version number to + * avoid aliassing different git master checkouts. + * Starting with FFmpeg 3.2, the released library versions will occupy + * a separate MAJOR.MINOR that is not used on the master development branch. + * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 + * for the release and master will continue at 55.12.100 after it. Each new + * point release will then bump the MICRO improving the usefulness of the lib + * versions. + * + * @{ + */ + +#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c)) +#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c +#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) + +/** + * Extract version components from the full ::AV_VERSION_INT int as returned + * by functions like ::avformat_version() and ::avcodec_version() + */ +#define AV_VERSION_MAJOR(a) ((a) >> 16) +#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) +#define AV_VERSION_MICRO(a) ((a) & 0xFF) + +/** + * @} + */ + +/** + * @defgroup lavu_ver Version and Build diagnostics + * + * Macros and function useful to check at compiletime and at runtime + * which version of libavutil is in use. + * + * @{ + */ + + +#define LIBAVUTIL_VERSION_MAJOR 55 +#define LIBAVUTIL_VERSION_MINOR 78 +#define LIBAVUTIL_VERSION_MICRO 100 + +#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT + +#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) + +/** + * @defgroup lavu_depr_guards Deprecation Guards + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + * @{ + */ + +#ifndef FF_API_VDPAU +#define FF_API_VDPAU (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_XVMC +#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_OPT_TYPE_METADATA +#define FF_API_OPT_TYPE_METADATA (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_DLOG +#define FF_API_DLOG (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_VAAPI +#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_FRAME_QP +#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_PLUS1_MINUS1 +#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_ERROR_FRAME +#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_CRC_BIG_TABLE +#define FF_API_CRC_BIG_TABLE (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_PKT_PTS +#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 56) +#endif +#ifndef FF_API_CRYPTO_SIZE_T +#define FF_API_CRYPTO_SIZE_T (LIBAVUTIL_VERSION_MAJOR < 56) +#endif + + +/** + * @} + * @} + */ + +#endif /* AVUTIL_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/xtea.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/xtea.h new file mode 100644 index 0000000..735427c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libavutil/xtea.h @@ -0,0 +1,94 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_XTEA_H +#define AVUTIL_XTEA_H + +#include + +/** + * @file + * @brief Public header for libavutil XTEA algorithm + * @defgroup lavu_xtea XTEA + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVXTEA { + uint32_t key[16]; +} AVXTEA; + +/** + * Allocate an AVXTEA context. + */ +AVXTEA *av_xtea_alloc(void); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as big endian 32 bit numbers + */ +void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as little endian 32 bit numbers + */ +void av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in big endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in little endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_XTEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/postprocess.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/postprocess.h new file mode 100644 index 0000000..d180686 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/postprocess.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 + */ + +#ifndef POSTPROC_POSTPROCESS_H +#define POSTPROC_POSTPROCESS_H + +/** + * @file + * @ingroup lpp + * external API header + */ + +/** + * @defgroup lpp libpostproc + * Video postprocessing library. + * + * @{ + */ + +#include "libpostproc/version.h" + +/** + * Return the LIBPOSTPROC_VERSION_INT constant. + */ +unsigned postproc_version(void); + +/** + * Return the libpostproc build-time configuration. + */ +const char *postproc_configuration(void); + +/** + * Return the libpostproc license. + */ +const char *postproc_license(void); + +#define PP_QUALITY_MAX 6 + +#if FF_API_QP_TYPE +#define QP_STORE_T int8_t //deprecated +#endif + +#include + +typedef void pp_context; +typedef void pp_mode; + +#if LIBPOSTPROC_VERSION_INT < (52<<16) +typedef pp_context pp_context_t; +typedef pp_mode pp_mode_t; +extern const char *const pp_help; ///< a simple help text +#else +extern const char pp_help[]; ///< a simple help text +#endif + +void pp_postprocess(const uint8_t * src[3], const int srcStride[3], + uint8_t * dst[3], const int dstStride[3], + int horizontalSize, int verticalSize, + const int8_t *QP_store, int QP_stride, + pp_mode *mode, pp_context *ppContext, int pict_type); + + +/** + * Return a pp_mode or NULL if an error occurred. + * + * @param name the string after "-pp" on the command line + * @param quality a number from 0 to PP_QUALITY_MAX + */ +pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality); +void pp_free_mode(pp_mode *mode); + +pp_context *pp_get_context(int width, int height, int flags); +void pp_free_context(pp_context *ppContext); + +#define PP_CPU_CAPS_MMX 0x80000000 +#define PP_CPU_CAPS_MMX2 0x20000000 +#define PP_CPU_CAPS_3DNOW 0x40000000 +#define PP_CPU_CAPS_ALTIVEC 0x10000000 +#define PP_CPU_CAPS_AUTO 0x00080000 + +#define PP_FORMAT 0x00000008 +#define PP_FORMAT_420 (0x00000011|PP_FORMAT) +#define PP_FORMAT_422 (0x00000001|PP_FORMAT) +#define PP_FORMAT_411 (0x00000002|PP_FORMAT) +#define PP_FORMAT_444 (0x00000000|PP_FORMAT) +#define PP_FORMAT_440 (0x00000010|PP_FORMAT) + +#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale + +/** + * @} + */ + +#endif /* POSTPROC_POSTPROCESS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/version.h new file mode 100644 index 0000000..e8f0abe --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libpostproc/version.h @@ -0,0 +1,49 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef POSTPROC_VERSION_H +#define POSTPROC_VERSION_H + +/** + * @file + * Libpostproc version macros + */ + +#include "libavutil/avutil.h" + +#define LIBPOSTPROC_VERSION_MAJOR 54 +#define LIBPOSTPROC_VERSION_MINOR 7 +#define LIBPOSTPROC_VERSION_MICRO 100 + +#define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_VERSION AV_VERSION(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_BUILD LIBPOSTPROC_VERSION_INT + +#define LIBPOSTPROC_IDENT "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) + +#ifndef FF_API_QP_TYPE +#define FF_API_QP_TYPE (LIBPOSTPROC_VERSION_MAJOR < 55) +#endif + +#endif /* POSTPROC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/swresample.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/swresample.h new file mode 100644 index 0000000..c7b84fb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/swresample.h @@ -0,0 +1,579 @@ +/* + * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_SWRESAMPLE_H +#define SWRESAMPLE_SWRESAMPLE_H + +/** + * @file + * @ingroup lswr + * libswresample public header + */ + +/** + * @defgroup lswr libswresample + * @{ + * + * Audio resampling, sample format conversion and mixing library. + * + * Interaction with lswr is done through SwrContext, which is + * allocated with swr_alloc() or swr_alloc_set_opts(). It is opaque, so all parameters + * must be set with the @ref avoptions API. + * + * The first thing you will need to do in order to use lswr is to allocate + * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts(). If you + * are using the former, you must set options through the @ref avoptions API. + * The latter function provides the same feature, but it allows you to set some + * common options in the same statement. + * + * For example the following code will setup conversion from planar float sample + * format to interleaved signed 16-bit integer, downsampling from 48kHz to + * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing + * matrix). This is using the swr_alloc() function. + * @code + * SwrContext *swr = swr_alloc(); + * av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); + * av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + * av_opt_set_int(swr, "in_sample_rate", 48000, 0); + * av_opt_set_int(swr, "out_sample_rate", 44100, 0); + * av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); + * av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + * @endcode + * + * The same job can be done using swr_alloc_set_opts() as well: + * @code + * SwrContext *swr = swr_alloc_set_opts(NULL, // we're allocating a new context + * AV_CH_LAYOUT_STEREO, // out_ch_layout + * AV_SAMPLE_FMT_S16, // out_sample_fmt + * 44100, // out_sample_rate + * AV_CH_LAYOUT_5POINT1, // in_ch_layout + * AV_SAMPLE_FMT_FLTP, // in_sample_fmt + * 48000, // in_sample_rate + * 0, // log_offset + * NULL); // log_ctx + * @endcode + * + * Once all values have been set, it must be initialized with swr_init(). If + * you need to change the conversion parameters, you can change the parameters + * using @ref AVOptions, as described above in the first example; or by using + * swr_alloc_set_opts(), but with the first argument the allocated context. + * You must then call swr_init() again. + * + * The conversion itself is done by repeatedly calling swr_convert(). + * Note that the samples may get buffered in swr if you provide insufficient + * output space or if sample rate conversion is done, which requires "future" + * samples. Samples that do not require future input can be retrieved at any + * time by using swr_convert() (in_count can be set to 0). + * At the end of conversion the resampling buffer can be flushed by calling + * swr_convert() with NULL in and 0 in_count. + * + * The samples used in the conversion process can be managed with the libavutil + * @ref lavu_sampmanip "samples manipulation" API, including av_samples_alloc() + * function used in the following example. + * + * The delay between input and output, can at any time be found by using + * swr_get_delay(). + * + * The following code demonstrates the conversion loop assuming the parameters + * from above and caller-defined functions get_input() and handle_output(): + * @code + * uint8_t **input; + * int in_samples; + * + * while (get_input(&input, &in_samples)) { + * uint8_t *output; + * int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) + + * in_samples, 44100, 48000, AV_ROUND_UP); + * av_samples_alloc(&output, NULL, 2, out_samples, + * AV_SAMPLE_FMT_S16, 0); + * out_samples = swr_convert(swr, &output, out_samples, + * input, in_samples); + * handle_output(output, out_samples); + * av_freep(&output); + * } + * @endcode + * + * When the conversion is finished, the conversion + * context and everything associated with it must be freed with swr_free(). + * A swr_close() function is also available, but it exists mainly for + * compatibility with libavresample, and is not required to be called. + * + * There will be no memory leak if the data is not completely flushed before + * swr_free(). + */ + +#include +#include "libavutil/channel_layout.h" +#include "libavutil/frame.h" +#include "libavutil/samplefmt.h" + +#include "libswresample/version.h" + +/** + * @name Option constants + * These constants are used for the @ref avoptions interface for lswr. + * @{ + * + */ + +#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate +//TODO use int resample ? +//long term TODO can we enable this dynamically? + +/** Dithering algorithms */ +enum SwrDitherType { + SWR_DITHER_NONE = 0, + SWR_DITHER_RECTANGULAR, + SWR_DITHER_TRIANGULAR, + SWR_DITHER_TRIANGULAR_HIGHPASS, + + SWR_DITHER_NS = 64, ///< not part of API/ABI + SWR_DITHER_NS_LIPSHITZ, + SWR_DITHER_NS_F_WEIGHTED, + SWR_DITHER_NS_MODIFIED_E_WEIGHTED, + SWR_DITHER_NS_IMPROVED_E_WEIGHTED, + SWR_DITHER_NS_SHIBATA, + SWR_DITHER_NS_LOW_SHIBATA, + SWR_DITHER_NS_HIGH_SHIBATA, + SWR_DITHER_NB, ///< not part of API/ABI +}; + +/** Resampling Engines */ +enum SwrEngine { + SWR_ENGINE_SWR, /**< SW Resampler */ + SWR_ENGINE_SOXR, /**< SoX Resampler */ + SWR_ENGINE_NB, ///< not part of API/ABI +}; + +/** Resampling Filter Types */ +enum SwrFilterType { + SWR_FILTER_TYPE_CUBIC, /**< Cubic */ + SWR_FILTER_TYPE_BLACKMAN_NUTTALL, /**< Blackman Nuttall windowed sinc */ + SWR_FILTER_TYPE_KAISER, /**< Kaiser windowed sinc */ +}; + +/** + * @} + */ + +/** + * The libswresample context. Unlike libavcodec and libavformat, this structure + * is opaque. This means that if you would like to set options, you must use + * the @ref avoptions API and cannot directly set values to members of the + * structure. + */ +typedef struct SwrContext SwrContext; + +/** + * Get the AVClass for SwrContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + * @return the AVClass of SwrContext + */ +const AVClass *swr_get_class(void); + +/** + * @name SwrContext constructor functions + * @{ + */ + +/** + * Allocate SwrContext. + * + * If you use this function you will need to set the parameters (manually or + * with swr_alloc_set_opts()) before calling swr_init(). + * + * @see swr_alloc_set_opts(), swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc(void); + +/** + * Initialize context after user parameters have been set. + * @note The context must be configured using the AVOption API. + * + * @see av_opt_set_int() + * @see av_opt_set_dict() + * + * @param[in,out] s Swr context to initialize + * @return AVERROR error code in case of failure. + */ +int swr_init(struct SwrContext *s); + +/** + * Check whether an swr context has been initialized or not. + * + * @param[in] s Swr context to check + * @see swr_init() + * @return positive if it has been initialized, 0 if not initialized + */ +int swr_is_initialized(struct SwrContext *s); + +/** + * Allocate SwrContext if needed and set/reset common parameters. + * + * This function does not require s to be allocated with swr_alloc(). On the + * other hand, swr_alloc() can use swr_alloc_set_opts() to set the parameters + * on the allocated context. + * + * @param s existing Swr context if available, or NULL if not + * @param out_ch_layout output channel layout (AV_CH_LAYOUT_*) + * @param out_sample_fmt output sample format (AV_SAMPLE_FMT_*). + * @param out_sample_rate output sample rate (frequency in Hz) + * @param in_ch_layout input channel layout (AV_CH_LAYOUT_*) + * @param in_sample_fmt input sample format (AV_SAMPLE_FMT_*). + * @param in_sample_rate input sample rate (frequency in Hz) + * @param log_offset logging level offset + * @param log_ctx parent logging context, can be NULL + * + * @see swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, + int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, + int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, + int log_offset, void *log_ctx); + +/** + * @} + * + * @name SwrContext destructor functions + * @{ + */ + +/** + * Free the given SwrContext and set the pointer to NULL. + * + * @param[in] s a pointer to a pointer to Swr context + */ +void swr_free(struct SwrContext **s); + +/** + * Closes the context so that swr_is_initialized() returns 0. + * + * The context can be brought back to life by running swr_init(), + * swr_init() can also be used without swr_close(). + * This function is mainly provided for simplifying the usecase + * where one tries to support libavresample and libswresample. + * + * @param[in,out] s Swr context to be closed + */ +void swr_close(struct SwrContext *s); + +/** + * @} + * + * @name Core conversion functions + * @{ + */ + +/** Convert audio. + * + * in and in_count can be set to 0 to flush the last few samples out at the + * end. + * + * If more input is provided than output space, then the input will be buffered. + * You can avoid this buffering by using swr_get_out_samples() to retrieve an + * upper bound on the required number of output samples for the given number of + * input samples. Conversion will run directly without copying whenever possible. + * + * @param s allocated Swr context, with parameters set + * @param out output buffers, only the first one need be set in case of packed audio + * @param out_count amount of space available for output in samples per channel + * @param in input buffers, only the first one need to be set in case of packed audio + * @param in_count number of input samples available in one channel + * + * @return number of samples output per channel, negative value on error + */ +int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, + const uint8_t **in , int in_count); + +/** + * Convert the next timestamp from input to output + * timestamps are in 1/(in_sample_rate * out_sample_rate) units. + * + * @note There are 2 slightly differently behaving modes. + * @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX) + * in this case timestamps will be passed through with delays compensated + * @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX) + * in this case the output timestamps will match output sample numbers. + * See ffmpeg-resampler(1) for the two modes of compensation. + * + * @param s[in] initialized Swr context + * @param pts[in] timestamp for the next input sample, INT64_MIN if unknown + * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are + * function used internally for timestamp compensation. + * @return the output timestamp for the next output sample + */ +int64_t swr_next_pts(struct SwrContext *s, int64_t pts); + +/** + * @} + * + * @name Low-level option setting functions + * These functons provide a means to set low-level options that is not possible + * with the AVOption API. + * @{ + */ + +/** + * Activate resampling compensation ("soft" compensation). This function is + * internally called when needed in swr_next_pts(). + * + * @param[in,out] s allocated Swr context. If it is not initialized, + * or SWR_FLAG_RESAMPLE is not set, swr_init() is + * called with the flag set. + * @param[in] sample_delta delta in PTS per sample + * @param[in] compensation_distance number of samples to compensate for + * @return >= 0 on success, AVERROR error codes if: + * @li @c s is NULL, + * @li @c compensation_distance is less than 0, + * @li @c compensation_distance is 0 but sample_delta is not, + * @li compensation unsupported by resampler, or + * @li swr_init() fails when called. + */ +int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance); + +/** + * Set a customized input channel mapping. + * + * @param[in,out] s allocated Swr context, not yet initialized + * @param[in] channel_map customized input channel mapping (array of channel + * indexes, -1 for a muted channel) + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); + +/** + * Generate a channel mixing matrix. + * + * This function is the one used internally by libswresample for building the + * default mixing matrix. It is made public just as a utility function for + * building custom matrices. + * + * @param in_layout input channel layout + * @param out_layout output channel layout + * @param center_mix_level mix level for the center channel + * @param surround_mix_level mix level for the surround channel(s) + * @param lfe_mix_level mix level for the low-frequency effects channel + * @param rematrix_maxval if 1.0, coefficients will be normalized to prevent + * overflow. if INT_MAX, coefficients will not be + * normalized. + * @param[out] matrix mixing coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o. + * @param stride distance between adjacent input channels in the + * matrix array + * @param matrix_encoding matrixed stereo downmix mode (e.g. dplii) + * @param log_ctx parent logging context, can be NULL + * @return 0 on success, negative AVERROR code on failure + */ +int swr_build_matrix(uint64_t in_layout, uint64_t out_layout, + double center_mix_level, double surround_mix_level, + double lfe_mix_level, double rematrix_maxval, + double rematrix_volume, double *matrix, + int stride, enum AVMatrixEncoding matrix_encoding, + void *log_ctx); + +/** + * Set a customized remix matrix. + * + * @param s allocated Swr context, not yet initialized + * @param matrix remix coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o + * @param stride offset between lines of the matrix + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride); + +/** + * @} + * + * @name Sample handling functions + * @{ + */ + +/** + * Drops the specified number of output samples. + * + * This function, along with swr_inject_silence(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_drop_output(struct SwrContext *s, int count); + +/** + * Injects the specified number of silence samples. + * + * This function, along with swr_drop_output(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_inject_silence(struct SwrContext *s, int count); + +/** + * Gets the delay the next input sample will experience relative to the next output sample. + * + * Swresample can buffer data if more input has been provided than available + * output space, also converting between sample rates needs a delay. + * This function returns the sum of all such delays. + * The exact delay is not necessarily an integer value in either input or + * output sample rate. Especially when downsampling by a large value, the + * output sample rate may be a poor choice to represent the delay, similarly + * for upsampling and the input sample rate. + * + * @param s swr context + * @param base timebase in which the returned delay will be: + * @li if it's set to 1 the returned delay is in seconds + * @li if it's set to 1000 the returned delay is in milliseconds + * @li if it's set to the input sample rate then the returned + * delay is in input samples + * @li if it's set to the output sample rate then the returned + * delay is in output samples + * @li if it's the least common multiple of in_sample_rate and + * out_sample_rate then an exact rounding-free delay will be + * returned + * @returns the delay in 1 / @c base units. + */ +int64_t swr_get_delay(struct SwrContext *s, int64_t base); + +/** + * Find an upper bound on the number of samples that the next swr_convert + * call will output, if called with in_samples of input samples. This + * depends on the internal state, and anything changing the internal state + * (like further swr_convert() calls) will may change the number of samples + * swr_get_out_samples() returns for the same number of input samples. + * + * @param in_samples number of input samples. + * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts() + * or swr_set_compensation() invalidates this limit + * @note it is recommended to pass the correct available buffer size + * to all functions like swr_convert() even if swr_get_out_samples() + * indicates that less would be used. + * @returns an upper bound on the number of samples that the next swr_convert + * will output or a negative value to indicate an error + */ +int swr_get_out_samples(struct SwrContext *s, int in_samples); + +/** + * @} + * + * @name Configuration accessors + * @{ + */ + +/** + * Return the @ref LIBSWRESAMPLE_VERSION_INT constant. + * + * This is useful to check if the build-time libswresample has the same version + * as the run-time one. + * + * @returns the unsigned int-typed version + */ +unsigned swresample_version(void); + +/** + * Return the swr build-time configuration. + * + * @returns the build-time @c ./configure flags + */ +const char *swresample_configuration(void); + +/** + * Return the swr license. + * + * @returns the license of libswresample, determined at build-time + */ +const char *swresample_license(void); + +/** + * @} + * + * @name AVFrame based API + * @{ + */ + +/** + * Convert the samples in the input AVFrame and write them to the output AVFrame. + * + * Input and output AVFrames must have channel_layout, sample_rate and format set. + * + * If the output AVFrame does not have the data pointers allocated the nb_samples + * field will be set using av_frame_get_buffer() + * is called to allocate the frame. + * + * The output AVFrame can be NULL or have fewer allocated samples than required. + * In this case, any remaining samples not written to the output will be added + * to an internal FIFO buffer, to be returned at the next call to this function + * or to swr_convert(). + * + * If converting sample rate, there may be data remaining in the internal + * resampling delay buffer. swr_get_delay() tells the number of + * remaining samples. To get this data as output, call this function or + * swr_convert() with NULL input. + * + * If the SwrContext configuration does not match the output and + * input AVFrame settings the conversion does not take place and depending on + * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED + * or the result of a bitwise-OR of them is returned. + * + * @see swr_delay() + * @see swr_convert() + * @see swr_get_delay() + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure or nonmatching + * configuration. + */ +int swr_convert_frame(SwrContext *swr, + AVFrame *output, const AVFrame *input); + +/** + * Configure or reconfigure the SwrContext using the information + * provided by the AVFrames. + * + * The original resampling context is reset even on failure. + * The function calls swr_close() internally if the context is open. + * + * @see swr_close(); + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure. + */ +int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in); + +/** + * @} + * @} + */ + +#endif /* SWRESAMPLE_SWRESAMPLE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/version.h new file mode 100644 index 0000000..6a66173 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswresample/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_VERSION_H +#define SWRESAMPLE_VERSION_H + +/** + * @file + * Libswresample version macros + */ + +#include "libavutil/avutil.h" + +#define LIBSWRESAMPLE_VERSION_MAJOR 2 +#define LIBSWRESAMPLE_VERSION_MINOR 9 +#define LIBSWRESAMPLE_VERSION_MICRO 100 + +#define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_VERSION AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_BUILD LIBSWRESAMPLE_VERSION_INT + +#define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) + +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/swscale.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/swscale.h new file mode 100644 index 0000000..7713f51 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/swscale.h @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2001-2011 Michael Niedermayer + * + * 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 + */ + +#ifndef SWSCALE_SWSCALE_H +#define SWSCALE_SWSCALE_H + +/** + * @file + * @ingroup libsws + * external API header + */ + +#include + +#include "libavutil/avutil.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "version.h" + +/** + * @defgroup libsws libswscale + * Color conversion and scaling library. + * + * @{ + * + * Return the LIBSWSCALE_VERSION_INT constant. + */ +unsigned swscale_version(void); + +/** + * Return the libswscale build-time configuration. + */ +const char *swscale_configuration(void); + +/** + * Return the libswscale license. + */ +const char *swscale_license(void); + +/* values for the flags, the stuff on the command line is different */ +#define SWS_FAST_BILINEAR 1 +#define SWS_BILINEAR 2 +#define SWS_BICUBIC 4 +#define SWS_X 8 +#define SWS_POINT 0x10 +#define SWS_AREA 0x20 +#define SWS_BICUBLIN 0x40 +#define SWS_GAUSS 0x80 +#define SWS_SINC 0x100 +#define SWS_LANCZOS 0x200 +#define SWS_SPLINE 0x400 + +#define SWS_SRC_V_CHR_DROP_MASK 0x30000 +#define SWS_SRC_V_CHR_DROP_SHIFT 16 + +#define SWS_PARAM_DEFAULT 123456 + +#define SWS_PRINT_INFO 0x1000 + +//the following 3 flags are not completely implemented +//internal chrominance subsampling info +#define SWS_FULL_CHR_H_INT 0x2000 +//input subsampling info +#define SWS_FULL_CHR_H_INP 0x4000 +#define SWS_DIRECT_BGR 0x8000 +#define SWS_ACCURATE_RND 0x40000 +#define SWS_BITEXACT 0x80000 +#define SWS_ERROR_DIFFUSION 0x800000 + +#define SWS_MAX_REDUCE_CUTOFF 0.002 + +#define SWS_CS_ITU709 1 +#define SWS_CS_FCC 4 +#define SWS_CS_ITU601 5 +#define SWS_CS_ITU624 5 +#define SWS_CS_SMPTE170M 5 +#define SWS_CS_SMPTE240M 7 +#define SWS_CS_DEFAULT 5 +#define SWS_CS_BT2020 9 + +/** + * Return a pointer to yuv<->rgb coefficients for the given colorspace + * suitable for sws_setColorspaceDetails(). + * + * @param colorspace One of the SWS_CS_* macros. If invalid, + * SWS_CS_DEFAULT is used. + */ +const int *sws_getCoefficients(int colorspace); + +// when used for filters they must have an odd number of elements +// coeffs cannot be shared between vectors +typedef struct SwsVector { + double *coeff; ///< pointer to the list of coefficients + int length; ///< number of coefficients in the vector +} SwsVector; + +// vectors can be shared +typedef struct SwsFilter { + SwsVector *lumH; + SwsVector *lumV; + SwsVector *chrH; + SwsVector *chrV; +} SwsFilter; + +struct SwsContext; + +/** + * Return a positive value if pix_fmt is a supported input format, 0 + * otherwise. + */ +int sws_isSupportedInput(enum AVPixelFormat pix_fmt); + +/** + * Return a positive value if pix_fmt is a supported output format, 0 + * otherwise. + */ +int sws_isSupportedOutput(enum AVPixelFormat pix_fmt); + +/** + * @param[in] pix_fmt the pixel format + * @return a positive value if an endianness conversion for pix_fmt is + * supported, 0 otherwise. + */ +int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt); + +/** + * Allocate an empty SwsContext. This must be filled and passed to + * sws_init_context(). For filling see AVOptions, options.c and + * sws_setColorspaceDetails(). + */ +struct SwsContext *sws_alloc_context(void); + +/** + * Initialize the swscaler context sws_context. + * + * @return zero or positive value on success, a negative value on + * error + */ +av_warn_unused_result +int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter); + +/** + * Free the swscaler context swsContext. + * If swsContext is NULL, then does nothing. + */ +void sws_freeContext(struct SwsContext *swsContext); + +/** + * Allocate and return an SwsContext. You need it to perform + * scaling/conversion operations using sws_scale(). + * + * @param srcW the width of the source image + * @param srcH the height of the source image + * @param srcFormat the source image format + * @param dstW the width of the destination image + * @param dstH the height of the destination image + * @param dstFormat the destination image format + * @param flags specify which algorithm and options to use for rescaling + * @param param extra parameters to tune the used scaler + * For SWS_BICUBIC param[0] and [1] tune the shape of the basis + * function, param[0] tunes f(1) and param[1] f´(1) + * For SWS_GAUSS param[0] tunes the exponent and thus cutoff + * frequency + * For SWS_LANCZOS param[0] tunes the width of the window function + * @return a pointer to an allocated context, or NULL in case of error + * @note this function is to be removed after a saner alternative is + * written + */ +struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Scale the image slice in srcSlice and put the resulting scaled + * slice in the image in dst. A slice is a sequence of consecutive + * rows in an image. + * + * Slices have to be provided in sequential order, either in + * top-bottom or bottom-top order. If slices are provided in + * non-sequential order the behavior of the function is undefined. + * + * @param c the scaling context previously created with + * sws_getContext() + * @param srcSlice the array containing the pointers to the planes of + * the source slice + * @param srcStride the array containing the strides for each plane of + * the source image + * @param srcSliceY the position in the source image of the slice to + * process, that is the number (counted starting from + * zero) in the image of the first row of the slice + * @param srcSliceH the height of the source slice, that is the number + * of rows in the slice + * @param dst the array containing the pointers to the planes of + * the destination image + * @param dstStride the array containing the strides for each plane of + * the destination image + * @return the height of the output slice + */ +int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], + const int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *const dst[], const int dstStride[]); + +/** + * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) + * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) + * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x] + * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x] + * @param brightness 16.16 fixed point brightness correction + * @param contrast 16.16 fixed point contrast correction + * @param saturation 16.16 fixed point saturation correction + * @return -1 if not supported + */ +int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], + int srcRange, const int table[4], int dstRange, + int brightness, int contrast, int saturation); + +/** + * @return -1 if not supported + */ +int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, + int *srcRange, int **table, int *dstRange, + int *brightness, int *contrast, int *saturation); + +/** + * Allocate and return an uninitialized vector with length coefficients. + */ +SwsVector *sws_allocVec(int length); + +/** + * Return a normalized Gaussian curve used to filter stuff + * quality = 3 is high quality, lower is lower quality. + */ +SwsVector *sws_getGaussianVec(double variance, double quality); + +/** + * Scale all the coefficients of a by the scalar value. + */ +void sws_scaleVec(SwsVector *a, double scalar); + +/** + * Scale all the coefficients of a so that their sum equals height. + */ +void sws_normalizeVec(SwsVector *a, double height); + +#if FF_API_SWS_VECTOR +attribute_deprecated SwsVector *sws_getConstVec(double c, int length); +attribute_deprecated SwsVector *sws_getIdentityVec(void); +attribute_deprecated void sws_convVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_addVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_subVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_shiftVec(SwsVector *a, int shift); +attribute_deprecated SwsVector *sws_cloneVec(SwsVector *a); +attribute_deprecated void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); +#endif + +void sws_freeVec(SwsVector *a); + +SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, + float lumaSharpen, float chromaSharpen, + float chromaHShift, float chromaVShift, + int verbose); +void sws_freeFilter(SwsFilter *filter); + +/** + * Check if context can be reused, otherwise reallocate a new one. + * + * If context is NULL, just calls sws_getContext() to get a new + * context. Otherwise, checks if the parameters are the ones already + * saved in context. If that is the case, returns the current + * context. Otherwise, frees context and gets a new context with + * the new parameters. + * + * Be warned that srcFilter and dstFilter are not checked, they + * are assumed to remain the same. + */ +struct SwsContext *sws_getCachedContext(struct SwsContext *context, + int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 32 bits. + * + * The output frame will have the same packed format as the palette. + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 24 bits. + * + * With the palette format "ABCD", the destination frame ends up with the format "ABC". + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Get the AVClass for swsContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *sws_get_class(void); + +/** + * @} + */ + +#endif /* SWSCALE_SWSCALE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/version.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/version.h new file mode 100644 index 0000000..474e93b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/libswscale/version.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef SWSCALE_VERSION_H +#define SWSCALE_VERSION_H + +/** + * @file + * swscale version macros + */ + +#include "libavutil/version.h" + +#define LIBSWSCALE_VERSION_MAJOR 4 +#define LIBSWSCALE_VERSION_MINOR 8 +#define LIBSWSCALE_VERSION_MICRO 100 + +#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_VERSION AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_BUILD LIBSWSCALE_VERSION_INT + +#define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_SWS_VECTOR +#define FF_API_SWS_VECTOR (LIBSWSCALE_VERSION_MAJOR < 6) +#endif + +#endif /* SWSCALE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxdefs.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxdefs.h new file mode 100644 index 0000000..c2cb52a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxdefs.h @@ -0,0 +1,112 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxdefs.h + +\* ****************************************************************************** */ +#ifndef __MFXDEFS_H__ +#define __MFXDEFS_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if defined( _WIN32 ) || defined ( _WIN64 ) + #define __INT64 __int64 + #define __UINT64 unsigned __int64 +#else + #define __INT64 long long + #define __UINT64 unsigned long long +#endif + +#define MFX_INFINITE 0xFFFFFFFF + +typedef unsigned char mfxU8; +typedef char mfxI8; +typedef short mfxI16; +typedef unsigned short mfxU16; +typedef unsigned int mfxU32; +typedef int mfxI32; +#if defined( _WIN32 ) || defined ( _WIN64 ) +typedef unsigned long mfxUL32; +typedef long mfxL32; +#else +typedef unsigned int mfxUL32; +typedef int mfxL32; +#endif +typedef float mfxF32; +typedef double mfxF64; +typedef __UINT64 mfxU64; +typedef __INT64 mfxI64; +typedef void* mfxHDL; +typedef mfxHDL mfxMemId; +typedef void* mfxThreadTask; + +typedef struct { + mfxI16 x; + mfxI16 y; +} mfxI16Pair; + +typedef struct { + mfxHDL first; + mfxHDL second; +} mfxHDLPair; + + +/*********************************************************************************\ +Error message +\*********************************************************************************/ +typedef enum +{ + /* no error */ + MFX_ERR_NONE = 0, /* no error */ + + /* reserved for unexpected errors */ + MFX_ERR_UNKNOWN = -1, /* unknown error. */ + + /* error codes <0 */ + MFX_ERR_NULL_PTR = -2, /* null pointer */ + MFX_ERR_UNSUPPORTED = -3, /* undeveloped feature */ + MFX_ERR_MEMORY_ALLOC = -4, /* failed to allocate memory */ + MFX_ERR_NOT_ENOUGH_BUFFER = -5, /* insufficient buffer at input/output */ + MFX_ERR_INVALID_HANDLE = -6, /* invalid handle */ + MFX_ERR_LOCK_MEMORY = -7, /* failed to lock the memory block */ + MFX_ERR_NOT_INITIALIZED = -8, /* member function called before initialization */ + MFX_ERR_NOT_FOUND = -9, /* the specified object is not found */ + MFX_ERR_MORE_DATA = -10, /* expect more data at input */ + MFX_ERR_MORE_SURFACE = -11, /* expect more surface at output */ + MFX_ERR_ABORTED = -12, /* operation aborted */ + MFX_ERR_DEVICE_LOST = -13, /* lose the HW acceleration device */ + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM = -14, /* incompatible video parameters */ + MFX_ERR_INVALID_VIDEO_PARAM = -15, /* invalid video parameters */ + MFX_ERR_UNDEFINED_BEHAVIOR = -16, /* undefined behavior */ + MFX_ERR_DEVICE_FAILED = -17, /* device operation failure */ + MFX_ERR_MORE_BITSTREAM = -18, /* expect more bitstream buffers at output */ + + /* warnings >0 */ + MFX_WRN_IN_EXECUTION = 1, /* the previous asynchrous operation is in execution */ + MFX_WRN_DEVICE_BUSY = 2, /* the HW acceleration device is busy */ + MFX_WRN_VIDEO_PARAM_CHANGED = 3, /* the video parameters are changed during decoding */ + MFX_WRN_PARTIAL_ACCELERATION = 4, /* SW is used */ + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM = 5, /* incompatible video parameters */ + MFX_WRN_VALUE_NOT_CHANGED = 6, /* the value is saturated based on its valid range */ + MFX_WRN_OUT_OF_RANGE = 7, /* the value is out of valid range */ + + /* threading statuses */ + MFX_TASK_DONE = MFX_ERR_NONE, /* task has been completed */ + MFX_TASK_WORKING = 8, /* there is some more work to do */ + MFX_TASK_BUSY = 9 /* task is waiting for resources */ + +} mfxStatus; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MFXDEFS_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxjpeg.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxjpeg.h new file mode 100644 index 0000000..5b8ab27 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxjpeg.h @@ -0,0 +1,45 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxjpeg.h + +*******************************************************************************/ +#ifndef __MFX_JPEG_H__ +#define __MFX_JPEG_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* CodecId */ +enum { + MFX_CODEC_JPEG = MFX_MAKEFOURCC('J','P','E','G') +}; + +/* CodecProfile, CodecLevel */ +enum +{ + MFX_PROFILE_JPEG_BASELINE = 1 +}; + +enum +{ + MFX_ROTATION_0 = 0, + MFX_ROTATION_90 = 1, + MFX_ROTATION_180 = 2, + MFX_ROTATION_270 = 3 +}; + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif // __MFX_JPEG_H__ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxmvc.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxmvc.h new file mode 100644 index 0000000..af74465 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxmvc.h @@ -0,0 +1,91 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxmvc.h + +*******************************************************************************/ +#ifndef __MFXMVC_H__ +#define __MFXMVC_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* CodecProfile, CodecLevel */ +enum { + /* MVC profiles */ + MFX_PROFILE_AVC_MULTIVIEW_HIGH =118, + MFX_PROFILE_AVC_STEREO_HIGH =128 +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_MVC_SEQ_DESC = MFX_MAKEFOURCC('M','V','C','D'), + MFX_EXTBUFF_MVC_TARGET_VIEWS = MFX_MAKEFOURCC('M','V','C','T') +}; + +typedef struct { + mfxU16 ViewId; + + mfxU16 NumAnchorRefsL0; + mfxU16 NumAnchorRefsL1; + mfxU16 AnchorRefL0[16]; + mfxU16 AnchorRefL1[16]; + + mfxU16 NumNonAnchorRefsL0; + mfxU16 NumNonAnchorRefsL1; + mfxU16 NonAnchorRefL0[16]; + mfxU16 NonAnchorRefL1[16]; +} mfxMVCViewDependency; + +typedef struct { + mfxU16 TemporalId; /* operation point temporal ID */ + mfxU16 LevelIdc; + + mfxU16 NumViews; /* total number of views, including "depend on" views */ + mfxU16 NumTargetViews; /* number of the output views for the current operation point */ + mfxU16 *TargetViewId; /* array of target view ID, it points to mfxExtMVCSeqDesc::ViewId, set by SDK */ +} mfxMVCOperationPoint; + +typedef struct { + mfxExtBuffer Header; + + mfxU32 NumView; /* number of view in the stream, set by SDK */ + mfxU32 NumViewAlloc; /* number of allocated elements, set by application */ + mfxMVCViewDependency *View; /* view ID and list of views used as reference for this view, allocated by application */ + + mfxU32 NumViewId; /* num of views IDs, to simplify copying, set by SDK */ + mfxU32 NumViewIdAlloc; /* number of allocated elements, set by application */ + mfxU16 *ViewId; /* allocated by application */ + + mfxU32 NumOP; /* number of operation points in OP array, set by SDK */ + mfxU32 NumOPAlloc; /* number of allocated elements in OP array, set by application */ + mfxMVCOperationPoint *OP; /* allocated by application */ + + mfxU16 NumRefsTotal; /* total number of reference frames in the sequence */ + mfxU32 Reserved[16]; + +} mfxExtMVCSeqDesc; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 TemporalId; + mfxU32 NumView; /* number of view to decode */ + mfxU16 ViewId[1024]; +} mfxExtMVCTargetViews ; + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin++.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin++.h new file mode 100644 index 0000000..b62c9b9 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin++.h @@ -0,0 +1,55 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2011 Intel Corporation. All Rights Reserved. + + +File Name: mfxplugin++.h + +\* ****************************************************************************** */ + +#ifndef __MFXPLUGINPLUSPLUS_H +#define __MFXPLUGINPLUSPLUS_H + +#include "mfxvideo.h" +#include "mfxplugin.h" + +class MFXPlugin +{ +public: + virtual mfxStatus mfxPluginInit(mfxCoreInterface *core) = 0; + virtual mfxStatus mfxPluginClose() = 0; + virtual mfxStatus mfxGetPluginParam(mfxPluginParam *par) = 0; + virtual mfxStatus mfxSubmit(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) = 0; + virtual mfxStatus mfxExecute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a) = 0; + virtual mfxStatus mfxFreeResources(mfxThreadTask task, mfxStatus sts) = 0; +}; + +/* Class adapter between "C" structure mfxPlugin and C++ interface MFXPlugin */ +class MFXPluginAdapter : public mfxPlugin +{ +public: + MFXPluginAdapter(MFXPlugin *pPlugin) + { + pthis = pPlugin; + PluginInit = MFXPluginAdapter::_PluginInit; + PluginClose = MFXPluginAdapter::_PluginClose; + GetPluginParam = MFXPluginAdapter::_GetPluginParam; + Submit = MFXPluginAdapter::_Submit; + Execute = MFXPluginAdapter::_Execute; + FreeResources = MFXPluginAdapter::_FreeResources; + } + +private: + static mfxStatus _PluginInit(mfxHDL pthis, mfxCoreInterface *core) { return ((MFXPlugin*)pthis)->mfxPluginInit(core); } + static mfxStatus _PluginClose(mfxHDL pthis) { return ((MFXPlugin*)pthis)->mfxPluginClose(); } + static mfxStatus _GetPluginParam(mfxHDL pthis, mfxPluginParam *par) { return ((MFXPlugin*)pthis)->mfxGetPluginParam(par); } + static mfxStatus _Submit(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) { return ((MFXPlugin*)pthis)->mfxSubmit(in, in_num, out, out_num, task); } + static mfxStatus _Execute(mfxHDL pthis, mfxThreadTask task, mfxU32 thread_id, mfxU32 call_count) { return ((MFXPlugin*)pthis)->mfxExecute(task, thread_id, call_count); } + static mfxStatus _FreeResources(mfxHDL pthis, mfxThreadTask task, mfxStatus sts) { return ((MFXPlugin*)pthis)->mfxFreeResources(task, sts); } +}; + +#endif // __MFXPLUGINPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin.h new file mode 100644 index 0000000..bfb7547 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxplugin.h @@ -0,0 +1,90 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2011 Intel Corporation. All Rights Reserved. + +File Name: mfxplugin.h + +*******************************************************************************/ +#ifndef __MFXPLUGIN_H__ +#define __MFXPLUGIN_H__ +#include "mfxvideo.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +typedef enum { + MFX_THREADPOLICY_SERIAL = 0, + MFX_THREADPOLICY_PARALLEL = 1 +} mfxThreadPolicy; + +typedef struct mfxPluginParam { + mfxU32 reserved[14]; + mfxThreadPolicy ThreadPolicy; + mfxU32 MaxThreadNum; +} mfxPluginParam; + +typedef struct mfxCoreParam{ + mfxU32 reserved[13]; + mfxIMPL Impl; + mfxVersion Version; + mfxU32 NumWorkingThread; +} mfxCoreParam; + +typedef struct mfxCoreInterface { + mfxHDL pthis; + + mfxHDL reserved1[2]; + mfxFrameAllocator FrameAllocator; + mfxBufferAllocator reserved3; + + mfxStatus (MFX_CDECL *GetCoreParam)(mfxHDL pthis, mfxCoreParam *par); + mfxStatus (MFX_CDECL *GetHandle) (mfxHDL pthis, mfxHandleType type, mfxHDL *handle); + mfxStatus (MFX_CDECL *IncreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *DecreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *CopyFrame) (mfxHDL pthis, mfxFrameSurface1 *dst, mfxFrameSurface1 *src); + mfxStatus (MFX_CDECL *CopyBuffer)(mfxHDL pthis, mfxU8 *dst, mfxU32 size, mfxFrameSurface1 *src); + + mfxStatus (MFX_CDECL *MapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + mfxStatus (MFX_CDECL *UnmapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + + mfxStatus (MFX_CDECL *GetRealSurface)(mfxHDL pthis, mfxFrameSurface1 *op_surf, mfxFrameSurface1 **surf); + mfxStatus (MFX_CDECL *GetOpaqueSurface)(mfxHDL pthis, mfxFrameSurface1 *surf, mfxFrameSurface1 **op_surf); + + mfxHDL reserved4[4]; +} mfxCoreInterface; + +typedef struct mfxPlugin{ + mfxHDL pthis; + + mfxStatus (MFX_CDECL *PluginInit) (mfxHDL pthis, mfxCoreInterface *core); + mfxStatus (MFX_CDECL *PluginClose) (mfxHDL pthis); + + mfxStatus (MFX_CDECL *GetPluginParam)(mfxHDL pthis, mfxPluginParam *par); + + mfxStatus (MFX_CDECL *Submit)(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task); + mfxStatus (MFX_CDECL *Execute)(mfxHDL pthis, mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); + mfxStatus (MFX_CDECL *FreeResources)(mfxHDL pthis, mfxThreadTask task, mfxStatus sts); + + mfxHDL reserved[9]; +} mfxPlugin; + + + +mfxStatus MFX_CDECL MFXVideoUSER_Register(mfxSession session, mfxU32 type, const mfxPlugin *par); +mfxStatus MFX_CDECL MFXVideoUSER_Unregister(mfxSession session, mfxU32 type); + +mfxStatus MFX_CDECL MFXVideoUSER_ProcessFrameAsync(mfxSession session, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif /* __MFXPLUGIN_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxstructures.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxstructures.h new file mode 100644 index 0000000..13e362b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxstructures.h @@ -0,0 +1,763 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxstructures.h + +*******************************************************************************/ +#ifndef __MFXSTRUCTURES_H__ +#define __MFXSTRUCTURES_H__ +#include "mfxdefs.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" { +#endif + +#define MFX_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24)) + +/* Extended Configuration Header Structure */ +typedef struct { + mfxU32 BufferId; + mfxU32 BufferSz; +} mfxExtBuffer; + +/* Frame ID for SVC and MVC */ +typedef struct { + mfxU16 TemporalId; + mfxU16 PriorityId; + union { + struct { + mfxU16 DependencyId; + mfxU16 QualityId; + }; + struct { + mfxU16 ViewId; + }; + }; +} mfxFrameId; + +/* Frame Info */ +typedef struct { + mfxU32 reserved[6]; + mfxFrameId FrameId; + + mfxU32 FourCC; + mfxU16 Width; + mfxU16 Height; + + mfxU16 CropX; + mfxU16 CropY; + mfxU16 CropW; + mfxU16 CropH; + + mfxU32 FrameRateExtN; + mfxU32 FrameRateExtD; + mfxU16 reserved3; + + mfxU16 AspectRatioW; + mfxU16 AspectRatioH; + + mfxU16 PicStruct; + mfxU16 ChromaFormat; + mfxU16 reserved2; +} mfxFrameInfo; + +/* FourCC */ +enum { + MFX_FOURCC_NV12 = MFX_MAKEFOURCC('N','V','1','2'), /* Native Format */ + MFX_FOURCC_YV12 = MFX_MAKEFOURCC('Y','V','1','2'), + MFX_FOURCC_YUY2 = MFX_MAKEFOURCC('Y','U','Y','2'), + MFX_FOURCC_RGB3 = MFX_MAKEFOURCC('R','G','B','3'), /* RGB24 */ + MFX_FOURCC_RGB4 = MFX_MAKEFOURCC('R','G','B','4'), /* RGB32 */ + MFX_FOURCC_P8 = 41 /* D3DFMT_P8 */ +}; + +/* PicStruct */ +enum { + MFX_PICSTRUCT_UNKNOWN =0x00, + MFX_PICSTRUCT_PROGRESSIVE =0x01, + MFX_PICSTRUCT_FIELD_TFF =0x02, + MFX_PICSTRUCT_FIELD_BFF =0x04, + + MFX_PICSTRUCT_FIELD_REPEATED=0x10, /* first field repeated, pic_struct=5 or 6 in H.264 */ + MFX_PICSTRUCT_FRAME_DOUBLING=0x20, /* pic_struct=7 in H.264 */ + MFX_PICSTRUCT_FRAME_TRIPLING=0x40 /* pic_struct=8 in H.264 */ +}; + +/* ColorFormat */ +enum { + MFX_CHROMAFORMAT_MONOCHROME =0, + MFX_CHROMAFORMAT_YUV420 =1, + MFX_CHROMAFORMAT_YUV422 =2, + MFX_CHROMAFORMAT_YUV444 =3, + MFX_CHROMAFORMAT_YUV400 = MFX_CHROMAFORMAT_MONOCHROME, + MFX_CHROMAFORMAT_YUV411 = 4, + MFX_CHROMAFORMAT_YUV422H = MFX_CHROMAFORMAT_YUV422, + MFX_CHROMAFORMAT_YUV422V = 5 + +}; + +enum { + MFX_TIMESTAMP_UNKNOWN = -1 +}; + +enum { + MFX_FRAMEORDER_UNKNOWN = -1 +}; + +/* DataFlag in mfxFrameData */ +enum { + MFX_FRAMEDATA_ORIGINAL_TIMESTAMP = 0x0001 +}; + +/* Corrupted in mfxFrameData */ +enum { + MFX_CORRUPTION_MINOR = 0x0001, + MFX_CORRUPTION_MAJOR = 0x0002, + MFX_CORRUPTION_REFERENCE_FRAME = 0x0010, + MFX_CORRUPTION_REFERENCE_LIST = 0x0020 +}; + +/* Frame Data Info */ +typedef struct { + mfxU32 reserved[8]; + + mfxU64 TimeStamp; + mfxU32 FrameOrder; + mfxU16 Locked; + mfxU16 Pitch; + + /* color planes */ + union { + mfxU8 *Y; + mfxU8 *R; + }; + union { + mfxU8 *UV; /* for UV merged formats */ + mfxU8 *VU; /* for VU merged formats */ + mfxU8 *CbCr; /* for CbCr merged formats */ + mfxU8 *CrCb; /* for CrCb merged formats */ + mfxU8 *Cb; + mfxU8 *U; + mfxU8 *G; + }; + union { + mfxU8 *Cr; + mfxU8 *V; + mfxU8 *B; + }; + mfxU8 *A; + mfxMemId MemId; + + /* Additional Flags */ + mfxU16 Corrupted; + mfxU16 DataFlag; +} mfxFrameData; + +/* Frame Surface */ +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxFrameData Data; +} mfxFrameSurface1; + +enum { + MFX_TIMESTAMPCALC_UNKNOWN = 0, + MFX_TIMESTAMPCALC_TELECINE = 1, +}; + +/* Transcoding Info */ +typedef struct { + mfxU32 reserved[7]; + + mfxU16 reserved4; + mfxU16 BRCParamMultiplier; + + mfxFrameInfo FrameInfo; + mfxU32 CodecId; + mfxU16 CodecProfile; + mfxU16 CodecLevel; + mfxU16 NumThread; + + union { + struct { /* MPEG-2/H.264 Encoding Options */ + mfxU16 TargetUsage; + + mfxU16 GopPicSize; + mfxU16 GopRefDist; + mfxU16 GopOptFlag; + mfxU16 IdrInterval; + + mfxU16 RateControlMethod; + union { + mfxU16 InitialDelayInKB; + mfxU16 QPI; + mfxU16 Accuracy; + }; + mfxU16 BufferSizeInKB; + union { + mfxU16 TargetKbps; + mfxU16 QPP; + }; + union { + mfxU16 MaxKbps; + mfxU16 QPB; + mfxU16 Convergence; + }; + + mfxU16 NumSlice; + mfxU16 NumRefFrame; + mfxU16 EncodedOrder; + }; + struct { /* H.264, MPEG-2 and VC-1 Decoding Options */ + mfxU16 DecodedOrder; + mfxU16 ExtendedPicStruct; + mfxU16 TimeStampCalc; + mfxU16 reserved2[10]; + }; + struct { /* JPEG Decoding Options */ + mfxU16 JPEGChromaFormat; + mfxU16 Rotation; + mfxU16 reserved3[11]; + }; + }; +} mfxInfoMFX; + +typedef struct { + mfxU32 reserved[8]; + mfxFrameInfo In; + mfxFrameInfo Out; +} mfxInfoVPP; + +typedef struct { + mfxU32 reserved[3]; + mfxU16 reserved3; + mfxU16 AsyncDepth; + + union { + mfxInfoMFX mfx; + mfxInfoVPP vpp; + }; + mfxU16 Protected; + mfxU16 IOPattern; + mfxExtBuffer** ExtParam; + mfxU16 NumExtParam; + mfxU16 reserved2; +} mfxVideoParam; + +/* IOPattern */ +enum { + MFX_IOPATTERN_IN_VIDEO_MEMORY = 0x01, + MFX_IOPATTERN_IN_SYSTEM_MEMORY = 0x02, + MFX_IOPATTERN_IN_OPAQUE_MEMORY = 0x04, + MFX_IOPATTERN_OUT_VIDEO_MEMORY = 0x10, + MFX_IOPATTERN_OUT_SYSTEM_MEMORY = 0x20, + MFX_IOPATTERN_OUT_OPAQUE_MEMORY = 0x40 +}; + +/* CodecId */ +enum { + MFX_CODEC_AVC =MFX_MAKEFOURCC('A','V','C',' '), + MFX_CODEC_MPEG2 =MFX_MAKEFOURCC('M','P','G','2'), + MFX_CODEC_VC1 =MFX_MAKEFOURCC('V','C','1',' ') +}; + +/* CodecProfile, CodecLevel */ +enum { + MFX_PROFILE_UNKNOWN =0, + MFX_LEVEL_UNKNOWN =0, + + /* AVC Profiles & Levels */ + MFX_PROFILE_AVC_CONSTRAINT_SET0 = (0x100 << 0), + MFX_PROFILE_AVC_CONSTRAINT_SET1 = (0x100 << 1), + MFX_PROFILE_AVC_CONSTRAINT_SET2 = (0x100 << 2), + MFX_PROFILE_AVC_CONSTRAINT_SET3 = (0x100 << 3), + MFX_PROFILE_AVC_CONSTRAINT_SET4 = (0x100 << 4), + MFX_PROFILE_AVC_CONSTRAINT_SET5 = (0x100 << 5), + + MFX_PROFILE_AVC_BASELINE =66, + MFX_PROFILE_AVC_MAIN =77, + MFX_PROFILE_AVC_EXTENDED =88, + MFX_PROFILE_AVC_HIGH =100, + MFX_PROFILE_AVC_CONSTRAINED_BASELINE =MFX_PROFILE_AVC_BASELINE + MFX_PROFILE_AVC_CONSTRAINT_SET1, + MFX_PROFILE_AVC_CONSTRAINED_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4 + + MFX_PROFILE_AVC_CONSTRAINT_SET5, + MFX_PROFILE_AVC_PROGRESSIVE_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4, + + MFX_LEVEL_AVC_1 =10, + MFX_LEVEL_AVC_1b =9, + MFX_LEVEL_AVC_11 =11, + MFX_LEVEL_AVC_12 =12, + MFX_LEVEL_AVC_13 =13, + MFX_LEVEL_AVC_2 =20, + MFX_LEVEL_AVC_21 =21, + MFX_LEVEL_AVC_22 =22, + MFX_LEVEL_AVC_3 =30, + MFX_LEVEL_AVC_31 =31, + MFX_LEVEL_AVC_32 =32, + MFX_LEVEL_AVC_4 =40, + MFX_LEVEL_AVC_41 =41, + MFX_LEVEL_AVC_42 =42, + MFX_LEVEL_AVC_5 =50, + MFX_LEVEL_AVC_51 =51, + + /* MPEG-2 Profiles & Levels */ + MFX_PROFILE_MPEG2_SIMPLE =0x50, + MFX_PROFILE_MPEG2_MAIN =0x40, + MFX_PROFILE_MPEG2_HIGH =0x10, + + MFX_LEVEL_MPEG2_LOW =0xA, + MFX_LEVEL_MPEG2_MAIN =0x8, + MFX_LEVEL_MPEG2_HIGH =0x4, + MFX_LEVEL_MPEG2_HIGH1440 =0x6, + + /* VC1 Profiles & Levels */ + MFX_PROFILE_VC1_SIMPLE =(0+1), + MFX_PROFILE_VC1_MAIN =(4+1), + MFX_PROFILE_VC1_ADVANCED =(12+1), + + /* VC1 levels for simple & main profiles */ + MFX_LEVEL_VC1_LOW =(0+1), + MFX_LEVEL_VC1_MEDIAN =(2+1), + MFX_LEVEL_VC1_HIGH =(4+1), + + /* VC1 levels for the advanced profile */ + MFX_LEVEL_VC1_0 =(0x00+1), + MFX_LEVEL_VC1_1 =(0x01+1), + MFX_LEVEL_VC1_2 =(0x02+1), + MFX_LEVEL_VC1_3 =(0x03+1), + MFX_LEVEL_VC1_4 =(0x04+1) +}; + +/* GopOptFlag */ +enum { + MFX_GOP_CLOSED =1, + MFX_GOP_STRICT =2 +}; + +/* TargetUsages: from 1 to 7 inclusive */ +enum { + MFX_TARGETUSAGE_UNKNOWN =0, + MFX_TARGETUSAGE_BEST_QUALITY =1, + MFX_TARGETUSAGE_BALANCED =4, + MFX_TARGETUSAGE_BEST_SPEED =7 +}; + +/* RateControlMethod */ +enum { + MFX_RATECONTROL_CBR =1, + MFX_RATECONTROL_VBR =2, + MFX_RATECONTROL_CQP =3, + MFX_RATECONTROL_AVBR =4 +}; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved1; + mfxU16 RateDistortionOpt; /* tri-state option */ + mfxU16 MECostType; + mfxU16 MESearchType; + mfxI16Pair MVSearchWindow; + mfxU16 EndOfSequence; /* tri-state option */ + mfxU16 FramePicture; /* tri-state option */ + + union { + struct { /* AVC */ + mfxU16 CAVLC; /* tri-state option */ + mfxU16 reserved2[3]; + mfxU16 ViewOutput; /* tri-state option */ + mfxU16 NalHrdConformance; /* tri-state option */ + mfxU16 SingleSeiNalUnit; /* tri-state option */ + mfxU16 VuiVclHrdParameters; /* tri-state option */ + + mfxU16 RefPicListReordering; /* tri-state option */ + mfxU16 ResetRefList; /* tri-state option */ + mfxU16 RefPicMarkRep; /* tri-state option */ + mfxU16 FieldOutput; /* tri-state option */ + + mfxU16 IntraPredBlockSize; + mfxU16 InterPredBlockSize; + mfxU16 MVPrecision; + mfxU16 MaxDecFrameBuffering; + + mfxU16 AUDelimiter; /* tri-state option */ + mfxU16 EndOfStream; /* tri-state option */ + mfxU16 PicTimingSEI; /* tri-state option */ + mfxU16 VuiNalHrdParameters; /* tri-state option */ + }; + }; +} mfxExtCodingOption; + +/* IntraPredBlockSize/InterPredBlockSize */ +enum { + MFX_BLOCKSIZE_UNKNOWN = 0, + MFX_BLOCKSIZE_MIN_16X16 = 1, /* 16x16 */ + MFX_BLOCKSIZE_MIN_8X8 = 2, /* 16x16, 8x8 */ + MFX_BLOCKSIZE_MIN_4X4 = 3 /* 16x16, 8x8, 4x4 */ +}; + +/* MVPrecision */ +enum { + MFX_MVPRECISION_UNKNOWN = 0, + MFX_MVPRECISION_INTEGER = (1 << 0), + MFX_MVPRECISION_HALFPEL = (1 << 1), + MFX_MVPRECISION_QUARTERPEL = (1 << 2) +}; + +enum { + MFX_CODINGOPTION_UNKNOWN =0, + MFX_CODINGOPTION_ON =0x10, + MFX_CODINGOPTION_OFF =0x20 +}; + +typedef struct _mfxEncryptedData mfxEncryptedData; + +typedef struct { + union { + mfxEncryptedData* EncryptedData; + mfxU32 reserved[8]; + }; + mfxU64 TimeStamp; + mfxU8* Data; + mfxU32 DataOffset; + mfxU32 DataLength; + mfxU32 MaxLength; + + mfxU16 PicStruct; + mfxU16 FrameType; + mfxU16 DataFlag; + mfxU16 reserved2; +} mfxBitstream; + +/* Data Flag */ +enum { + MFX_BITSTREAM_COMPLETE_FRAME = 0x0001 /* the bitstream contains a complete frame or field pair of data */ +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_CODING_OPTION = MFX_MAKEFOURCC('C','D','O','P'), + MFX_EXTBUFF_CODING_OPTION_SPSPPS= MFX_MAKEFOURCC('C','O','S','P'), + MFX_EXTBUFF_VPP_DONOTUSE = MFX_MAKEFOURCC('N','U','S','E'), + MFX_EXTBUFF_VPP_AUXDATA = MFX_MAKEFOURCC('A','U','X','D'), + MFX_EXTBUFF_VPP_DENOISE = MFX_MAKEFOURCC('D','N','I','S'), + MFX_EXTBUFF_VPP_SCENE_ANALYSIS = MFX_MAKEFOURCC('S','C','L','Y'), + MFX_EXTBUFF_VPP_SCENE_CHANGE = MFX_EXTBUFF_VPP_SCENE_ANALYSIS, + MFX_EXTBUFF_VPP_PROCAMP = MFX_MAKEFOURCC('P','A','M','P'), + MFX_EXTBUFF_VPP_DETAIL = MFX_MAKEFOURCC('D','E','T',' '), + MFX_EXTBUFF_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','S','I','N'), + MFX_EXTBUFF_VPP_DOUSE = MFX_MAKEFOURCC('D','U','S','E'), + MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION = MFX_MAKEFOURCC('O','P','Q','S'), + MFX_EXTBUFF_AVC_REFLIST_CTRL = MFX_MAKEFOURCC('R','L','S','T'), + MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION = MFX_MAKEFOURCC('F','R','C',' '), + MFX_EXTBUFF_PICTURE_TIMING_SEI = MFX_MAKEFOURCC('P','T','S','E'), + MFX_EXTBUFF_AVC_TEMPORAL_LAYERS = MFX_MAKEFOURCC('A','T','M','L') +}; + +/* VPP Conf: Do not use certain algorithms */ +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32* AlgList; +} mfxExtVPPDoNotUse; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DenoiseFactor; +} mfxExtVPPDenoise; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DetailFactor; +} mfxExtVPPDetail; + +typedef struct { + mfxExtBuffer Header; + mfxF64 Brightness; + mfxF64 Contrast; + mfxF64 Hue; + mfxF64 Saturation; +} mfxExtVPPProcAmp; + +/* statistics collected for decode, encode and vpp */ +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU64 NumBit; + mfxU32 NumCachedFrame; +} mfxEncodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumSkippedFrame; + mfxU32 NumError; + mfxU32 NumCachedFrame; +} mfxDecodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumCachedFrame; +} mfxVPPStat; + +typedef struct { + mfxExtBuffer Header; + mfxU32 SpatialComplexity; + mfxU32 TemporalComplexity; + mfxU16 SceneChangeRate; + mfxU16 RepeatedFrame; +} mfxExtVppAuxData; + +typedef struct { + mfxU32 reserved[4]; + mfxU8 *Data; /* buffer pointer */ + mfxU32 NumBit; /* number of bits */ + mfxU16 Type; /* SEI message type in H.264 or user data start_code in MPEG-2 */ + mfxU16 BufSize; /* payload buffer size in bytes */ +} mfxPayload; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[5]; + mfxU16 reserved1; + + mfxU16 QP; /* per frame QP */ + + mfxU16 FrameType; + mfxU16 NumExtParam; + mfxU16 NumPayload; /* MPEG-2 user data or H.264 SEI message(s) */ + mfxU16 reserved2; + + mfxExtBuffer **ExtParam; + mfxPayload **Payload; /* for field pair, first field uses even payloads and second field uses odd payloads */ +} mfxEncodeCtrl; + +/* Buffer Memory Types */ +enum { + /* Buffer types */ + MFX_MEMTYPE_PERSISTENT_MEMORY =0x0002 +}; + +/* Frame Memory Types */ +#define MFX_MEMTYPE_BASE(x) (0xf0ff & (x)) + +enum { + MFX_MEMTYPE_DXVA2_DECODER_TARGET =0x0010, + MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET =0x0020, + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = MFX_MEMTYPE_DXVA2_DECODER_TARGET, + MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET, + MFX_MEMTYPE_SYSTEM_MEMORY =0x0040, + + MFX_MEMTYPE_FROM_ENCODE = 0x0100, + MFX_MEMTYPE_FROM_DECODE = 0x0200, + MFX_MEMTYPE_FROM_VPPIN = 0x0400, + MFX_MEMTYPE_FROM_VPPOUT = 0x0800, + + MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, + MFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, + MFX_MEMTYPE_OPAQUE_FRAME = 0x0004 +}; + +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxU16 Type; /* decoder or processor render targets */ + mfxU16 NumFrameMin; + mfxU16 NumFrameSuggested; + mfxU16 reserved2; +} mfxFrameAllocRequest; + +typedef struct { + mfxU32 reserved[4]; + mfxMemId *mids; /* the array allocated by application */ + mfxU16 NumFrameActual; + mfxU16 reserved2; +} mfxFrameAllocResponse; + +/* FrameType */ +enum { + MFX_FRAMETYPE_UNKNOWN =0x0000, + + MFX_FRAMETYPE_I =0x0001, + MFX_FRAMETYPE_P =0x0002, + MFX_FRAMETYPE_B =0x0004, + MFX_FRAMETYPE_S =0x0008, + + MFX_FRAMETYPE_REF =0x0040, + MFX_FRAMETYPE_IDR =0x0080, + + MFX_FRAMETYPE_xI =0x0100, + MFX_FRAMETYPE_xP =0x0200, + MFX_FRAMETYPE_xB =0x0400, + MFX_FRAMETYPE_xS =0x0800, + + MFX_FRAMETYPE_xREF =0x4000, + MFX_FRAMETYPE_xIDR =0x8000 +}; + +typedef enum { + MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 =1, /* IDirect3DDeviceManager9 */ + MFX_HANDLE_D3D9_DEVICE_MANAGER = MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9, + MFX_HANDLE_D3D11_DEVICE_AND_CONTEXT = 2, + MFX_HANDLE_D3D11_DEVICE = 3, + MFX_HANDLE_VA_DISPLAY = 4 +} mfxHandleType; + +typedef enum { + MFX_SKIPMODE_NOSKIP=0, + MFX_SKIPMODE_MORE=1, + MFX_SKIPMODE_LESS=2 +} mfxSkipMode; + +/* Library initialization and deinitialization */ +typedef mfxI32 mfxIMPL; +#define MFX_IMPL_BASETYPE(x) (0x00ff & (x)) + +enum { + MFX_IMPL_AUTO = 0x0000, /* Auto Selection/In or Not Supported/Out */ + MFX_IMPL_SOFTWARE = 0x0001, /* Pure Software Implementation */ + MFX_IMPL_HARDWARE = 0x0002, /* Hardware Accelerated Implementation (default device) */ + MFX_IMPL_AUTO_ANY = 0x0003, /* Auto selection of any hardware/software implementation */ + MFX_IMPL_HARDWARE_ANY = 0x0004, /* Auto selection of any hardware implementation */ + MFX_IMPL_HARDWARE2 = 0x0005, /* Hardware accelerated implementation (2nd device) */ + MFX_IMPL_HARDWARE3 = 0x0006, /* Hardware accelerated implementation (3rd device) */ + MFX_IMPL_HARDWARE4 = 0x0007, /* Hardware accelerated implementation (4th device) */ + + MFX_IMPL_VIA_ANY = 0x0100, + MFX_IMPL_VIA_D3D9 = 0x0200, + MFX_IMPL_VIA_D3D11 = 0x0300, + + MFX_IMPL_UNSUPPORTED = 0x0000 /* One of the MFXQueryIMPL returns */ +}; + +/* Version Info */ +typedef union { + struct { + mfxU16 Minor; + mfxU16 Major; + }; + mfxU32 Version; +} mfxVersion; + +typedef struct { + mfxExtBuffer Header; + mfxU8 *SPSBuffer; + mfxU8 *PPSBuffer; + mfxU16 SPSBufSize; + mfxU16 PPSBufSize; + mfxU16 SPSId; + mfxU16 PPSId; +} mfxExtCodingOptionSPSPPS; + +/* session priority */ +typedef enum +{ + MFX_PRIORITY_LOW = 0, + MFX_PRIORITY_NORMAL = 1, + MFX_PRIORITY_HIGH = 2 + +} mfxPriority; + +typedef struct { + mfxExtBuffer Header; + mfxU16 VideoFormat; + mfxU16 VideoFullRange; + mfxU16 ColourDescriptionPresent; + mfxU16 ColourPrimaries; + mfxU16 TransferCharacteristics; + mfxU16 MatrixCoefficients; +} mfxExtVideoSignalInfo; + +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32 *AlgList; +} mfxExtVPPDoUse; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[2]; + struct { + mfxFrameSurface1 **Surfaces; + mfxU32 reserved2[5]; + mfxU16 Type; + mfxU16 NumSurface; + } In, Out; +} mfxExtOpaqueSurfaceAlloc; + +typedef struct { + mfxExtBuffer Header; + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + + struct { + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 ViewId; + mfxU32 reserved[2]; + } PreferredRefList[32], RejectedRefList[16], LongTermRefList[16]; + + mfxU32 reserved[8]; +} mfxExtAVCRefListCtrl; + +enum { + MFX_FRCALGM_PRESERVE_TIMESTAMP = 1, + MFX_FRCALGM_DISTRIBUTED_TIMESTAMP = 2 +}; + +typedef struct { + mfxExtBuffer Header; + mfxU16 Algorithm; + mfxU16 reserved; + mfxU32 reserved2[15]; +} mfxExtVPPFrameRateConversion; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[14]; + + struct { + mfxU16 ClockTimestampFlag; + mfxU16 CtType; + mfxU16 NuitFieldBasedFlag; + mfxU16 CountingType; + mfxU16 FullTimestampFlag; + mfxU16 DiscontinuityFlag; + mfxU16 CntDroppedFlag; + mfxU16 NFrames; + mfxU16 SecondsFlag; + mfxU16 MinutesFlag; + mfxU16 HoursFlag; + mfxU16 SecondsValue; + mfxU16 MinutesValue; + mfxU16 HoursValue; + mfxU32 TimeOffset; + } TimeStamp[3]; +} mfxExtPictureTimingSEI; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[4]; + mfxU16 reserved2; + mfxU16 BaseLayerPID; + + struct { + mfxU16 Scale; + mfxU16 reserved[3]; + }Layer[8]; +} mfxExtAvcTemporalLayers; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo++.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo++.h new file mode 100644 index 0000000..e513b62 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo++.h @@ -0,0 +1,127 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2010 Intel Corporation. All Rights Reserved. + + +File Name: mfxvideo++.h + +\* ****************************************************************************** */ + +#ifndef __MFXVIDEOPLUSPLUS_H +#define __MFXVIDEOPLUSPLUS_H + +#include "mfxvideo.h" + +class MFXVideoSession +{ +public: + MFXVideoSession(void) { m_session = (mfxSession) 0; } + virtual ~MFXVideoSession(void) { Close(); } + + mfxStatus Init(mfxIMPL impl, mfxVersion *ver) { return MFXInit(impl, ver, &m_session); } + mfxStatus Close(void) + { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); m_session = (mfxSession) 0; + return mfxRes; + } + + mfxStatus QueryIMPL(mfxIMPL *impl) { return MFXQueryIMPL(m_session, impl); } + mfxStatus QueryVersion(mfxVersion *version) { return MFXQueryVersion(m_session, version); } + + mfxStatus JoinSession(mfxSession child_session) { return MFXJoinSession(m_session, child_session);} + mfxStatus DisjoinSession( ) { return MFXDisjoinSession(m_session);} + mfxStatus CloneSession( mfxSession *clone) { return MFXCloneSession(m_session, clone);} + mfxStatus SetPriority( mfxPriority priority) { return MFXSetPriority(m_session, priority);} + mfxStatus GetPriority( mfxPriority *priority) { return MFXGetPriority(m_session, priority);} + + mfxStatus SetBufferAllocator(mfxBufferAllocator *allocator) { return MFXVideoCORE_SetBufferAllocator(m_session, allocator); } + mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) { return MFXVideoCORE_SetFrameAllocator(m_session, allocator); } + mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) { return MFXVideoCORE_SetHandle(m_session, type, hdl); } + mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) { return MFXVideoCORE_GetHandle(m_session, type, hdl); } + + mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) { return MFXVideoCORE_SyncOperation(m_session, syncp, wait); } + + operator mfxSession (void) { return m_session; } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoENCODE +{ +public: + + MFXVideoENCODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoENCODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENCODE_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENCODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoENCODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoENCODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoENCODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoENCODE_GetVideoParam(m_session, par); } + mfxStatus GetEncodeStat(mfxEncodeStat *stat) { return MFXVideoENCODE_GetEncodeStat(m_session, stat); } + + mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) { return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE +{ +public: + + MFXVideoDECODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoDECODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoDECODE_Query(m_session, in, out); } + mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { return MFXVideoDECODE_DecodeHeader(m_session, bs, par); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoDECODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoDECODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoDECODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoDECODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoDECODE_GetVideoParam(m_session, par); } + + mfxStatus GetDecodeStat(mfxDecodeStat *stat) { return MFXVideoDECODE_GetDecodeStat(m_session, stat); } + mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) {return MFXVideoDECODE_GetPayload(m_session, ts, payload); } + mfxStatus SetSkipMode(mfxSkipMode mode) { return MFXVideoDECODE_SetSkipMode(m_session, mode); } + mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) { return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoVPP +{ +public: + + MFXVideoVPP(mfxSession session) { m_session = session; } + virtual ~MFXVideoVPP(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoVPP_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request[2]) { return MFXVideoVPP_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoVPP_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoVPP_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoVPP_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoVPP_GetVideoParam(m_session, par); } + mfxStatus GetVPPStat(mfxVPPStat *stat) { return MFXVideoVPP_GetVPPStat(m_session, stat); } + mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) { return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif // __MFXVIDEOPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo.h b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo.h new file mode 100644 index 0000000..641dc7a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg3/include64/mfx/mfxvideo.h @@ -0,0 +1,117 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxvideo.h + +\* ****************************************************************************** */ +#ifndef __MFXVIDEO_H__ +#define __MFXVIDEO_H__ +#include "mfxstructures.h" + +/* This is the external include file for the Intel(R) Media Sofware Development Kit product */ +#define MFX_VERSION_MAJOR 1 +#define MFX_VERSION_MINOR 4 + +#ifdef _WIN32 + #define MFX_CDECL __cdecl + #define MFX_STDCALL __stdcall +#else + #define MFX_CDECL + #define MFX_STDCALL +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* MFXVideoCORE */ +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxU32 nbytes, mfxU16 type, mfxMemId *mid); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxU8 **ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxMemId mid); +} mfxBufferAllocator; + +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *GetHDL) (mfxHDL pthis, mfxMemId mid, mfxHDL *handle); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxFrameAllocResponse *response); +} mfxFrameAllocator; + +/* Global Functions */ +typedef struct _mfxSession *mfxSession; +mfxStatus MFX_CDECL MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session); +mfxStatus MFX_CDECL MFXClose(mfxSession session); + +mfxStatus MFX_CDECL MFXQueryIMPL(mfxSession session, mfxIMPL *impl); +mfxStatus MFX_CDECL MFXQueryVersion(mfxSession session, mfxVersion *version); + +mfxStatus MFX_CDECL MFXJoinSession(mfxSession session, mfxSession child); +mfxStatus MFX_CDECL MFXDisjoinSession(mfxSession session); +mfxStatus MFX_CDECL MFXCloneSession(mfxSession session, mfxSession *clone); +mfxStatus MFX_CDECL MFXSetPriority(mfxSession session, mfxPriority priority); +mfxStatus MFX_CDECL MFXGetPriority(mfxSession session, mfxPriority *priority); + +/* VideoCORE */ +mfxStatus MFX_CDECL MFXVideoCORE_SetBufferAllocator(mfxSession session, mfxBufferAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetFrameAllocator(mfxSession session, mfxFrameAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetHandle(mfxSession session, mfxHandleType type, mfxHDL hdl); +mfxStatus MFX_CDECL MFXVideoCORE_GetHandle(mfxSession session, mfxHandleType type, mfxHDL *hdl); + +typedef struct _mfxSyncPoint *mfxSyncPoint; +mfxStatus MFX_CDECL MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); + +/* VideoENCODE */ +mfxStatus MFX_CDECL MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoENCODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_GetEncodeStat(mfxSession session, mfxEncodeStat *stat); +mfxStatus MFX_CDECL MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp); + +/* VideoDECODE */ +mfxStatus MFX_CDECL MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoDECODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_GetDecodeStat(mfxSession session, mfxDecodeStat *stat); +mfxStatus MFX_CDECL MFXVideoDECODE_SetSkipMode(mfxSession session, mfxSkipMode mode); +mfxStatus MFX_CDECL MFXVideoDECODE_GetPayload(mfxSession session, mfxU64 *ts, mfxPayload *payload); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); + +/* VideoVPP */ +mfxStatus MFX_CDECL MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); +mfxStatus MFX_CDECL MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoVPP_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_GetVPPStat(mfxSession session, mfxVPPStat *stat); +mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avcodec.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avcodec.lib new file mode 100644 index 0000000000000000000000000000000000000000..1ad73750cc4e37c3d2eb1d41bedc3affbaee782f GIT binary patch literal 189782 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 z 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 OCY$tXpT(?`-v1B6d&Bww literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avfilter.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avfilter.lib new file mode 100644 index 0000000000000000000000000000000000000000..aaf1929ff9e9799504ea7775d3cc7c670c896bec GIT binary patch literal 59140 zcmeI5eTXDS6~OD}lH7Sl6O)ViFwwcoT|AR>o!#4=-7{yroR>sHh*1s=A*QcqcIIZh z*_m->_CA7yGlVE1Xb66QAc!CcN)Q!M5RDR0L?I}GCo=>4AUd`iu8%yjA2UtB~t4*jA810N2J~}jA1(as7S*DjA0u8Q>5un8N+n$ zNs%tXaWQ=wWH3GPib$XN6=Rs5`n*V=Z83)FncGBq_8*L4`U3PNrsp3M=}U(h!}JyC zi?2f8WBS@Dk-iT7_l+-$^vxb)n7(yVq;JEyF}-kuNZ9b;dCL z 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avformat.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avformat.lib new file mode 100644 index 0000000000000000000000000000000000000000..f874b23e11f1d43d206fa2429e0f57002649aeb1 GIT binary patch literal 170820 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avutil.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib/avutil.lib new file mode 100644 index 0000000000000000000000000000000000000000..ba7b0cfde2a8b7b245d88c53d7f8251eaa3650d8 GIT binary patch literal 388892 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�oll{e80AXuspB`L%wDJyu{}rA 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 E2li?DtN;K2 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib/postproc.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib/postproc.lib new file mode 100644 index 0000000000000000000000000000000000000000..451fbdf92a16f83750c21f3eac733c716ca58eef GIT binary patch literal 8904 zcmeI2&yU+g6vtnjY_p9Pfl3RgDqzsU0hN$sW9?HRzkf79ao;kZAWE|#@!oe*dvgJ^8)K!2j-~7mk;Yjian~!_LX!a5`BA zkCutuloh>(^B~~v3?IWLJ=8AhD%eSxRe-(^=8N%kqK+mbsO-u!93KXg1qD(BMtbJi zhr{$Su>axs=w#koX7w3w9rXKQe_5YO(oDjjy9dNrXT`Raz!SgZ;A5Zvs z(oTMx`F^|7?={@m%J7rzasWT}+Vw#gLVY+6gQ)S}X8=c~Veg?dM0PV)bm(&8_~d5B z$;tCEVpPuaG2%nlTrN=^FHsCRHXGQq!iVERqhBsjWYR?*oqQbl0P8~Ss4#Z(tl4a7O8*k)%*DXr=50@&tS zR1SQG8-%4szQ^ZCTu3lV7?CF%wDGM+in{bHzb zj8DEsItRfs?N5bz7km=yROmRu@)7?Ql>=YkMt(XapHd?ATAiw~8Z)(fR@8biH5PH~ z2A40LB%3gDuako+rY+q*?uu<=`Q#>+fPwTcQ4%q@#3DEzb_N5 zobw7R-PtCQWEGUYIBaSXUl%9MwF5i2mRW3cQAJW}DCMpdbDh1kQvQN5E>g;YF;?fr z95FI6`dy`zkFxz@%#l+5ob9KWdmqPOKl0IoldY7S#NNvHr}b7&emGzdG_QAcNKi{d z{6)&SG6Wjv0ykT2?bvaCkrD7%36zyqE6&f75mY7T@--cg{4!(&7Be3OlQ%je@a(8< z;WSkuk0oU*Qs*xXRXb00zHjuqN}bK8hvAn}=Nz?H)Y5yZtvX*KYV{PdcMxAGfw;X2Y$97tW`R_I<42d*E`W!)5?L{SSLBu7g#g} zrr)s|RwQ=3^wa+dj!@A%);B_&SfkGK9cyUxn@1v%Gt2gikw`OOKV*{~M*Z>Ux literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib/swresample.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib/swresample.lib new file mode 100644 index 0000000000000000000000000000000000000000..43ffe0b09e7a59284213aebbfb6c4426fb43c297 GIT binary patch literal 18696 zcmeI4TW{P%6oAhQ>w1`XDdXwxnfl^g~s;Ua8s;a805Sz_j61UFoYIjpg z#X}zu&wb{H@W4}^5I=$kegi*%a?TmsbH;WyV^LD9c%&J7&zv25X1<&~o;l9jSDM4t z`qkM>WiwT4)ur0plIzyXWtXdDSuR(ri%L*lnFWAL0Mma0%!~nM@2Gs}bpXmoP)_;y zFDjoJ08l>riOO#r2B3UyOXc!U0F>WdR{6qT0F>YVRppO*0F*25sO}tZUXq-&k+vDfsyC!My`i`TGr??Iee30*chz!~THobFgXj!w{1m zl7QbEWAlpPkgj-z(3KqtzOIHwQI*;h(iqCQCBJX5+-NBQ)va!Nemez4Q%;&q-|x2= zyM7Fmcuk}&@12#P{czP^9as9HeUo;r=2p?N&9NP;qNQ6{D3@zXOMxL=nO!cSDZx}O zp#|f!eWl76!R7Pqi!!(?m3DL7++Kxiu7SH%Sw$>%NKZ-6qXy5T9aCu<57T&GGI4uK zuNKNlZ~yjsmqWdicycgBFRaHQ4$R}nbCtI5lf2T!zqUZ(@8ay0NwOdFMXbLUa7Ksne`j+e8%d+LfEQa8*9C2x4V$}&I)1ud#5c8f1$7>!>(#NE z(`hWP1v-HU59O`r7wFToXIchO0&S@qq04{@H0yLdq6FXoW;M?AS)R$Urb|vGtux5q zEVjiEP{$)hSHW+I-=W}dM_6ZrRqiLLsSUt<10jM1%iA)Yl?qZqhU?-gE za6oKWXDiJVR||@9gcX44p2&-)__U-rd;$t)f3Hv+c6-7jp~WMqrr5QkxQ-9}oU|?e z5vP79Tl|f}gDKffTig}bon(s#>3RuU{3Km3vc+#Ah1UWdJPlI1Ej}eFHlN9JZI9my zdadp8)o>v2=)fwL(jJ>#Px2hE-+7@WqPn_dNA>(-g6bb|7I&ihj-X*Tss2`6cM{d> z>3RvOhv|9|)yHwhY^gp;RLhkkp7Z>A7vxn_(lmdl1YA1sH6Dp(*=5bJDa}Ieq8+(4 zT$G5}AJCVCrd}HzrZOJ_mk!!4D=GqqH0y`&7Z}dlvatH2X8PRKWJH~LVE(^(* z?MSXCNiIB#^U-wCOxlusT$3DITvty>dG(RcG0V~xUkN01a9{;XO>?a4ai9~`S(vWd zF+HDLxp-`0oo|WX}v!jCQWSghmKMQ?qSKq#=9+y zZL%s0$CmqZ^GS}2XEnY4kmXtJV8pSCeao}QdxGG_r1>>tBbKo);&)Q0UnUR1ayPDE zmgio>f?M25-Q% z+gGbCQtU4!9p^x?1QZ#S7IVhpSg~8rUKHzgLz%$17iz?uxu|nHT`zLUXlH<8*krth zc$SNvy~wgs44awCTk`V(MQ0S5PIVNUC*#RTree(gKapknmp=4e=`J1k3`^mZcB78j zgp28@N7r&cY$3UKP{br?e>6)>!hR-EzWtEzXR1>KBqmMjMJ3?Ufm?WFpHy~Pplgb= zSWnA+FM3sileV4(yPDmTI6t;4S2N5m#z2V|b@J?+o(V|R?7D%34i4PGlG!!8Ea;6_ zWZ~Cx7i=!M@>;9~XntuG(w5&>B)>ev`Q5h--}BMzp2r@A$$=YqD%q9pLO`w6dlXUp zqHDR|wUAu9D(tQ1HH*F77xJoKT12aqUuJ2?nv!O=q6Azza2t;yv%1Tsxs~!P*4A>L zOTA)gJZlyET$&WqA(NV}Ej| zD~pw#Vor^hy7z{aHM%UUY)qcT%3AJk6_H&N>CF<^C2efbUtJ&OWG@6v;ZX1o&&GnW%Vs}{xab1X|heF`b zBg_F0qscTLk3c?CG>WFvo$<(Lz`db-RXX1&PC8JhN%Sav!znpx-ittS7*11F z;|P_`jb1cL;^a4(S^>pWiqigJcrcwpE`04&iqgIo^}~Ze0bhuuNcGxup8SgeJebQ&Jf zpF~+ejYy~arG_e6svpx-Y_G338XKEi>h-+4d~*R_q7cq6!26Yc z9bH(V`=vh$Hx1F;UFn5MSg0Wrwng*l${rYj8R0SN#dyMt>sl3Fwc-femmBDOQg1`c zQSVr>-es)^uTXJ3M^C3iJ)p7wXnmzO9D;DAAA{+a;eTJk`*)!q-q!*pcgqS-y_h*a zs=4J96zMo+v{^4aRImKpvsWS<|rhU=uo*}?Jq98oIZ*AOP?Ke0`VSfXZRn> zMB;!?V!OTOk=TY3#G1mocT1N$`hL&yek=>))uS ze`oi{L9irni_hp1mCsA`i^J%EoI_BDK=m#9$>3mgUrLA);g<9vaZIHvImYtEGPS|A z1@fLfvPoGpihF#vz}u&-+yvr#@MDHsT;MM&pIS0KZ8n>0YXtTz>)Kue6H5WD>k{3_ zZ=pz+>6g#+F_3=<>9?`iA>i(7WZGCmEU|UC*k{glg|)&d>$(X#gM2;1G@kDY=uGnU z+K@~E8dzdm=_nEG8c)A`AOCvt#LBQNluhnve^u5pUJI!Z;zfwEjPY;xmq)a3hlTrQ zBC9JDWmHOdl|?PF7FA0q=P5QRk9ZG~Wjr1OW>&I!n*J67pE)V{P)TqXh#$k&Z;u&o z4&P3uB+98KOH9CZts zRaJZYrpmFkx0|{UU>}G(ur>BJo$U<2*~GGrHcN4nN3m?4fzMzmegw5Pi{e{O?H?w^ zpE}nqqqvu^=TSV$*E1Aj>x4`3J4mtaPoz4oF1@l9} zzGqu=deLx-^~L4%ZON(b*9KcuT~5)X$6&4O2U0-WKwN`8b-+z^c3o1fjK}IGkJYyC z8T=mX%q*LF*Re&1X;b^ob<1q(e!iY(Q$NqwGpwG6I^nYVmSi<=RHf3~zO5*=+`<5y z34yo^za_VMS$7%EPv`M`na6Xhw!K(25^K|rGd#~@d(TUr^|)W98Rpwwon4n(E90@+ z=CQi!vzkD~&9c2W9h-HSw)c*6-7?#|o3H2D-e2YG8CJ0$muq|9w5(Q|Q#rQe`Unkt zoK*+}T3%^ukx6$@kH%zX^x>KoS8IbuXshk@(bk^qvw5=Th)_EXqRO7^Yl=tf5qwJ{ z3i|*jCP_+db{%u-3VHT)ok#1MPisA*U}-%CwZgThZxF4i**KN9tFJ3QEwL*~g1bQ6 zge}?CRF)lRGjblc%#pCVcb4ixx&yw?I#2KHS>o287FK0z%k7%Sus;j3Ktd9*S|*>E~J z1v_)0_KhvAXlb~9#cP^Y_q!K3zRJ{M3m1d+BU(~G+d$lcJ^2v;sGIFHy6F@izsym! znqR7kA}?VceotzC-7m4=?9U6oZno3>rc-$QGDq6#zKK$P=jma4Rr8zvGO*J8vil~$ z{-(2?CODhMW0*M>x28V*c4j};qZ`(Tz!83~4{<^>yrVukthoKfRw@STKU|Um+6LlB zu-E>B&T^VuE9EiE9g*|>-kRBGWA+t?S^4>NwS5NeH$L=f_IOnOAvv!Xc$GOGSI>zg zyHVur&NC^f|=uTb^EQsVbY zVp-cJb8M~dX`mV?@_*;)X;?O-suiKAPOCfPf!))9XzE3liSt)`o*NCIr0f@h+8sf=z|xbbpyQxl+34 zY0tf2=*FcxtL<&D+jD4!Gb@!^5zh`YN8##k;!8=LXRhQ?NvdA$w$gSN+p!p|S5dGY ziCx^+w&WZck5%T_TRqc^>ZHhLm}jiw2(g-3aT(5DWnY0kQ!FTQ+SdH9 z;OZFP)_PQWhRsSQQ+TH;^ aqZq75dqE0l8;EV#OAA}{Pa?`!i~c{w4tTQw literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avcodec.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avcodec.lib new file mode 100644 index 0000000000000000000000000000000000000000..c4a77f0bbd46404e5541ccd3d9b8cd9b3b7a4af1 GIT binary patch literal 190786 zcmeI53!E)SS>S8V4FR%%AR#>DF$ntM-=1^&%yjN~<(xBf z=Vl{hvkhj6O#U-Ake=aUA zubx<4^t8j!WARNFg*E`2v7Mt#xOkXvm!j>-Hc&)_MEZj z!8u;=<05?bZH&ESNrabuGh^4jRfOaQ#xQI=pRwLujBV~PcHKi58{Em*xX;-1evHlG zd}pr};fBXDhT+C9itwsWGlt>j_lfYDI~c=o>r{jvxQa0hue*;3w||Z?3~zX|2yeQD zF$_Q47vaaA#@HQ@j^QmI7vU$~!x)C2yh((gxq>kaKlf}Ae*W={VR+Zyitq~`X6zRS zBK$J66NX>?dlByZAY&MQ{gono=mcXJe(S3u{5I4T!|%fVWB9$JBK-cJGKS%kP)`hh zaI*-Xy_zu$pNBTZ@P{82;fv6|82$wM3d5J+8W{fKVIuq`+z*Do{*nlP^M1xK{O{L` z@c*_L!|?YH=V5_;it%vdjcftK`7adV-dC^%4EMQEg!_GrEns-S+eNr=mn~p;@UVe_KUlQS(_p=2I zFTYKM?>)^HFr=4>(1m;$`tK1T-(d?F2B$&K z6ya5$Vhb2<{y`C5a}8U-aO))^-1g^e0mExQBEs!&W(yeJ0Cm9dCb)MDZ@x=}ABDET za0jGecne$y!`r?p!rMQ|7BKwuts?yF3ATXY9Z)9>?|ioi?;f!Q4DWrs2)_j9$M7pZ zA;PbHFI&Lyfrp6j!H=^A48Qq$5kCA}wt(Sxj*9Tn^VtH1k9}5zPrQ#UVE7dD3x?0Y zJz)6U{YCh~7uf=aKmHjJ?z)*RVE8kr6NW#BI$`)S)CgWg^_;1nXe9*F_>+@VBgk;l4j5!u_vd9Sje=K!gWZ1ky2l z%S41nuCoq?#lI8b(eGg$43E7|gl~H!>tJ}or$spWM%KZwe60v;4`Uq+>rfuU$&ZR~ z`CC~B!;@Yu!j(PN!SGZ#7lx;QN`z(@k>L%U$u`Jf2revEZ6+&CBE zRhP34hMN~fc+LG-2gCP&K!n@iyck~lLJ@9%JnLY1Lq~)k`XuXMc=H`1{OHZBgW-<8 z2ygjr)_L0>iSTyl4-7vI*T(R(mx}O?udoh=cfLb}cki+ehWDNl;eF?`4u)U(kO;rF z!#Wr~aJ2}(0cjY1^CKdB_(s;j0BrN{(eqdb!^fbVFnj{q8^fn=7vVD-tb^fmkRQVz zG72#JQ zv-vbjhxw>Kwo3SN6s2dAK|W7*^T`&kYc`#kWj*Od$;tK{ub7WE%@URI`EJr5&XbMF zEE$e>tU_91x|2iO@`f2svdwh6myZ+ZALygv9?i1kOl#s)vvfFtKAWcVY^GnRNZ!om zNq0Qz=T^P&GJ9r85rylMdAgy_oSHYkV&A=!E-P=P>`~B7-pJ=zOMW{gouXZ@gUTd3 z=^*KKtzt4I?Iwe5peY@7728&6$kW}Lj%#wkEzIB|^`|N`QO>p3ZSiwi_f<4#%@b%Q z75VcKJQ~?x!vaA?7x}hU*4L7)be4>^hsiV>PkY%EH~;}+Jxp~Oi*q4;)AVdIDISP< zx@n!no1-Y*$JR!f1vemM!XO`6y;qUPa|W!aNrzsRr^-^J9teYUijPjuxuBV-mno`g zUj+)3DMjvVH}99vQQq&F1?zIakFF#h=#V)ad{ux06Z4rhsX>32G5nafUkzB0C;)Ci$$NY~{20czRBr z(26b(Z(S~71Ui8&zBRAqPP0Kd8+4H=A-AFw0s6d!g!L6l;W$$ zm1iF0U3d!Aub#+L#+JGAS%Rms?zW6AbD_YQpPSexlhJxUIa&j#;OAqI&g{pKi?4E| zr{&VmQnEA{dy5;%dN~iPcsU-e=i{VT-kqMRm&$q|{?6vT`IgmScnvL4FH>*~x>i5k z9?WN}o}z9Z;|vvTDB9M@iDL)QTDCU|&Bb>uCr^0>#JS>;F_L8d!S-w`+1T#)^--?i ztZ$^r5;=&-Y=l{+$;LUKWa;~|_{v*V)5}RY$s@%`xAuB=7UOzFqVIZTl97KSo6SpY zI~n)E+A*`G7{4!XzS=X{54`s@D`xHWtL#}`FAI8}7~cDSFt{41Cztn~;gAibx1ek? zwjX{^22~cpNOtmGHnwk7KvSk!B}$QFbx~19rdp-=?N?lS zg5jo!*7IS%`+g@evr5xT_*4bVZR!Yo1n5_zjHL3+kQIz{+hE~xb#XIImVlpUTPf)B zIGIDr0Y2aZ>0mXV5)?8+S(ewP{6VsRHmyWe1_y|01Ymcu7$oZHRVA(avdK~1~8BaGr;Sxj1X*SbFA-*)bgh82Eps*;Jkz8pljhCJz z`}{%|>JN0gnOzJmAR>piv}{UGIcUdZwgnaeG`br@Fe@7JLE{Khvsq^|TF=)VgOPbO z1Cy<~1({n*G|CuEt812A%NX~RSQk02+d7+eyO|pHxhZ;XAs#pbQ~kun_|Zt#%OQK* zXq3QDG7OzOWt}WozSp>~o=YEr$@3Q@FY%}q23;i}tY|zNS~0Dkd?QljF^Mb+ zmd{`DuOLW1dPb}|6B?X0HD1eXBAVyJ#{?W;U{=*yfDiDZW6zZvFih+t0 z=dp9B(!$a+1BJ{qFqUQQbgg7r#?Y7z#^i|0&LN{fRW!>pI5LcCA2L6(BsS!mU&Ky?_;m}iyIMZRn|g+UPNI|)qlaJmu8__Gw{ z#bXFoYkMAs7>4l?oR(UYs=c0_Sd`IBCrPguacPno8?qzXt}W;M8}|vo@E(~MyJ_ythw!~(v6anGvFuz z_u~fqj_Vgf+Yg@ENH3^T3B?_k z@mSJGH%boEUC;=8y@lnpRHIaN3A=ysETY!x`LJ8ho5#4G)BBz}I(f`9>`e&2jlHw= z`^uG{Y{0Yt?kcx`gzN;k8H_4@)4uFhT2aEp63S@0y@=Rrlo7;2KA~T9HRo6n?+>%8_^XPU?P*eeWTiZva*$A<}c4`+Z+49oT`Wh@BJ9hGTvFz;h1-)C&XLww?z}PqOzwW_~^4Tc-pURI#_WaXFxs9YU z3r{%3o`2`j4Vc-m$8i(p%khMlu9aEu1%I3e_oW}F*ixDASQ(G`?o*xbc$x41@W+Lo zd}Vt1UHD19{n+uNJy46-Q6M`j694`mU=7?tKRr`M6!ChS;U$h(*THOhdv&VvXl-?* zDv#Dq=kYw)0_IV)C2ym9K+=(g$~?S%kb)x%f&lYO&<8~X=IO9U!{;7rA1>fTZqbQc zUte*ET!$9K9>eSFt;?f4A74izSIWy>h<5|`^^l@>v4?y_mihH>EuSP@PcQ$*eC6Nv zH!PB5M;Lx$PaWayb6@@!h0!fOHwd!B!TX!_=UdyOGa`mlVze|?@&GvItt&Xj_Qf_; zhb|MuJv(Ic%q64vjn5Wi7xPc?(Scq9YU`Hd?13~VdbYH*vUZGPEoCgM)b+{O^;JmV z2g=xc^4oYdH0TBVFPCV1IxmCtYq8Pcz^_HNM3k{06E(TPPvH5uNy$zr6S2M4;9`C4 zx=iIWWb6sZGx6t>L}NWpL7p4@`PR$Zf~BzR>LO1W2Q|L)A0C7M-F~}@Q-3Xh(pSz{ z5I^Ihuko6q|L+Zd34R1CShk=>`%S~k9&x2H)7ucw0(pd_<*kKRkTFWGmU(y!7=-e= zV$X{^5_c$iRuGD`xK@lXuI zB6fLn*o)!sikg=wdz*zy^eT<$D2;ia2(YCFEs1U;jlWv>#D_RJ(4SG``WF&ymKr`14729|>eP)g=C> zWY@R8Ic$y>`ID|owy&0V=NX_qM6r z{;RTgwVfhD=J}$6Ud1zPCnb*#dlvj%@T}F?;8>5R@wQ@lNx9@!wZuFKU~W;7%sRfup}~bi0LO z^y2ci;k(070-Hoyb*vrANxRzWiAW{1qyS2e(7vuz{-uvf+(M@~?zU879f?#Pr%`#r z9izPwx^k~E+Mtjh_;rwDv>olbRk9Lg;7$H~29+oSZ}aDqvhotBU(?_EFPC&yZPEni z4EeYJ(Zy4y=V0oqD^VU3y>G`| zn?kgisj=50^h#5C{O2B8`BW#d;a$+O_~L?DC5x{rV(_cOQux$l@t%A6dAIu`%3+$1 z?$}9JRW9SM(lav zmkVcPR@%q#&O7Wo;nR}6TK#GTuJTf>5@|N#kDJ_jR(HoT%k#8qR%bbc6rZKN$V!I-9Od)6eh0AZIk&GLen5FF76t? zJhokww|X6Gl?Y|qrFqPvPAeL}ipnNB?Vm_0<*wYYU$;2IvL}?<0^Yk%r`79Mi=&c~ zD?|_2vg^TpC3Ma=>KN;^0LRuroiWyR{(R0DYwph{b=pPf5$YK0E|*7G=&N>#$KDN# z%g5m@7e|LZ75*~ET9Qkno>W4K-Y|SoRJ6w0#7jca??5H=zk3PQ-zy+GJ1k1w8RgZK z>UE`ZO7xFKuK|Zg2vlkPYQ^anO-^yCr1_Q%foWjUbT6*~m!@uAYcZAj=L*rcC6-Bo zJdM6BpH21B2GaD8{gmn=hI1O0G<`zxY~fdjT@9ZeX!oxug7B zLA2~Ock8q^I$k`$mAVz9cVm=~GgT@^@5U$}$3|$;z(ahwy6Hn8t?68WFOO$zDrX+v9>{HxnM!XX)Xo?@?P<&YtgI^u?4EQW4Ry8&V)}o2@5`9v}t~6r3 z!JFan+e;2lH2HOqa=2oL14j!g28xgMk4hzpVxX^-OKyQdO9Ta=>2I*{eLU_ z8>c5aZ$u57_C?-WI_*~$G5BSy?)BE*z}%mM#`iMOhj!fcP{f(IN+(%_UTeztXG^~I zcj}6L9{D?aLzd>3AjWVgX^u0<%cH~4hh0eXirO25SLGoxPV~a9yCcXrM@%u^X1|=z z_T<4dKO*| zslD?Yt`xG&Zmy+S!&IEYBtX@(YtrdwT|2h-MiQL^0YQCJIL|nLEHH* z0t%aIB7a~IUA(F`aGKHHiHDNVa{Et+?Xc&;rh%tY^Bl+4&Ywmn6T z7~4qZPnA8I?dJVr|NSKI_wYK0L^9hoH*j_mi9{1Ug{$sr&1kn)`g5Dz`TlE3bZ=Z( zt-~hyf%quGp``NTLJ*=pWk#?eg zG1{tmPgRWx+t{i8=TdREq-+B%r-$Y;Il53}qJNhX-8%K`li8l}b z-aWrBx$dUL>o>vGIEVMzi6g9;c$a8Z?yx7pe4M6 z&Zp3!yW?qAybDyQ(|FO4^@|2GKYBoLRVz5CS7xM1<0YckFz!)ROZ_6GHXS?uo=$!F z!Z%!xF`s5BOauy<_KSII>Du&FMGSr!dsHFqZtWe;Jz0o^6McwrW;O4jD!JZfX7xu) z!o@3n;qA!cC43>1-C$<5S!;u6D~U)l(RUbUR@ai;W@hz&F-S%s9kzUKFteJY%4_Tr zETW0@(maO8S6t8ckAqO!%k#Y}1Q++T9i)}I;{99B%xautg@+|yotf2d^5>HtL)>$} zsiyI}ieA{LiN8L$n@*D1nS4^{*znTO0qUHncZ5y$cVGqJP!{Xc{D1M$Vc!RT6c%go zo^7c5jmKRpNSu+XtRQWy*uPWu{|4;JH<~ANa60b7PFUp&f4Iw zYBSU6w`H$(R}J4fTqk6n8_cUt?V6iJJE=sbi9W`-r(7-5i;#M%_$}fY`G?;J^I@Ik z?p8V)WrJjpo*RRJo~IkUWLSO}cTSVTrl+1%{g~(_j8d1ABOsLPb-yO5`=2GLu#<&w zFQ8P(rf{XhB6aPWn`AqwB&oZ6lIUTK_Pbi9+t}}Z3z^Ql^KI}d3ZWY|%S8K~Sz`&Y z6-}g<=qX%tXPL$^ow8V51Z+38-~FaWFPf{0=}19K;|KF+Tp!ad6*2hLVb6h2^~}mz z+YGA&BE>{+V4UU8d!tIPXfwS_*gWtGw#+Q{4wYUHK^*v~C+nTxtV9?BB@coD%r zJM8K3t+WPFV;kKfmdGyAPq*g!=_0#|-8N&kUx%K|rs-yu%q9ca&u+Lg3tC@5%^wfN zF8cDzqr;vBf4Vg;>9t#eW=C5-N%X`;n*;BNDt)&NzaQYendGy6vX#%~$HCFhV(M0J>^u0yRp_bk@n!|qrdc_185W=&3Jc28PZ2hHa4rYx@c&%6>yF?#b z9Ix#=yLU=|>+QbWl%r4E+ASf+rY@%C663M0d-rSj*aVI&Y^R}7s@N0@(u=Dov zVKze93$u;GCYZMCRza{?bBkmvkw)|hqUSB{x`m)s&f#g}yLi7wG;TnZcF$zeGwYHg#er4TueJ~$7bYZ!+I&Y!{gID5S%q7BEtYI4liz2h}Q)+=Z}IE`abYY)an z0+C{(4=%3AL%=Gfahut}zalA~W}9G?fYCabL&K(+wjxhZY}DH1*i0glO!Ub`>sl?z zZLDj*?2sHb#Wd@hNwM_G+0jILiGI1bhi5IlZN_=;)9CGH`A()3OAgUOCk$CXrmZ_Fg|7hCry`f6H`9`dp1Y_e?>o!CC|RCN z$FMXyOGfDs=BtIwauY4tsI@7V%_O2!CVKJW9z(SxFG6b5nZxf@B1Hk(>&J=y!npdB_fXZWxi*%O zcl&#qFBb_}TcNG_cVxM-Y@{NU$TZP+7@6L8rvIalY1~&0u5<{Q<~6UB*CLh3G|`i| z?(Q=bXDTV31Z7iGo#b6Uri&#eAv665{`Bj*$mK;0es$PO;nSmwm`hC@LEUK0$#J4r zan+rFcN6>+@3ni@HR9)*`;`xJ_pA-=x{S%aDx94X_4f^F`J7oE74HXHFT3mh@JCas z-zoccJjq5YK}%AGCNq#^jZJt}G?8ASXE557 zYw5iNQk!bJKWET8+uoSxb8vLSR0Y@$dyvj>$w|mGH?b-6O@urx;KJ=|C!&w=IMGKK zZ56ewx3N|HtigKe3m%LS@{k#CVyi&Ljhee~o5@58PV@>!{iBxZHu}fEH>eJOhEh}g zgV)%lSVYt4U5|b~#L^nkt#MT0qg+o_@s1N|X=~%>`x%2?J~Q%ep?5U#^Px=EYwp5q zq!O8?`uSYzarB8OpGX^~f7)O=>%rDVXY<~C3!kTu^^7L7`jKg^<}T8DB9UmKmoLt) z@pH(s5MvwkUlW}hQ2w7U=>UKO7*S>w`g#Uzd&1>voS;Q0hCHnuOjOKk)#qT1d zHkHwDH~HOyd7zx)xo%y0Gu7y@j?n3z2Z5=P>FW zwS>3PJKpLg{1E9K8n)JMGdlE)=mTFTdJChht|fU9Qk%-^x0ocui_8zPthQ_Kk=0HX znyfxX^e9GIT}yZyS^eW)!Vj6OF0l2G~1ldT-@N#Cd2kDu6=W}K~-Qv$D{ppW{UTaGFzp3u$;325R6`p2~X9So9myO)o}1h=r|cawS6uw9^8 zb6ZWZlZi5$=zEMZyO!!UGW$m*)!Ar!$oCc#9^}b5`1i6jk=dTwn{4|s5b2KoNW|8X z#g0a@*LyA6SWSLJqZ>_v$xhzO#$oS#(8M1poK|J6ZJ_lQp=#Gee`MTesa8_AnScGm zHp}I5J-AZH-bTCr zp$gLRLLqC{O;$IWgj-%2JCR5<(eD^7d$mNjvFyE3Bbu*hOi&{A$J1eoDoM~(H?iy$ z>pAt>+cMi}9-=j5jp}Q3M~>0gsJ!ZJ=zfEjZn53~osA*O>_vP$;ZVNDD@6qV?63sB zOJAc-cUk*tyk!oe^p4&}Y;s{BkzPc{GP2hWB5k~luXlPl+s(S$^9R3~%@)c?0X22j(^~W~QY7`) z!^e2L#SJ`Z>bS>~(yH5N9skm1x%8zSDy@S*#j57E z)?p_Tsg7R8|6daNbvD)9r?wWf#?eAT7q#}{T&59OCVCm;zNobt^o5YxbdL3F70a-f zbw0|$mKU<7(PUrLURh%cVHr)Mca`W*jQfMs(%WV}-VYk|qCHyd#vU@kjU+Lks%q_G ztfdiICVC9x&U&>hw~@p@V6ZISffh2yO?K8pN$h(moEA^ym*^jiE6Qv6Z6k|sllxMI*xWf{fv7<8cm!jNzVpan+&}_h#Oc=YbDi9>4MGcs<6N%rxq{ zwYPxwWFXQ_^zX%)p}g1j(`S8)q??a;N=11UFBI~4ugT0%tL7%vb|R5zs+aHhqBu@p z(7OenRK}v0?`!k&y+$KC-y9{qdJbLMQWt?5N>GLdSc$8Xh@)~|*x-fNBQ zwE_dKcOB#!*}it&x;3&Be?G2HBF5#r9MAX#d_s@aqG#{iJ@B-V7d>;I+ z91rBry)LC6SH$2~hdmWOts0l2*=Pph9Q_rdw=dcb;ZW~+1&Crj@Za&!> zq}_b98ML-cvt{VDEul5yXwr6t=+%q1uugA>fn;e$IpD#pvuaLsC$KEZzYwYF`DmY9Ff3LG%Si{h9ZSrJKkxUmHpNeSW@! z=DLmk%(<4vHxKjFm3=Ej&tIHtU(0fv8J;&H%d@R%J~{(q!R{Ft1_sSBZLYmlV=0u) zhM-DfqL(kyyYKY=Q=}J+7wK>UmgDe8enfiB8cTYuXri7>_2n%`A2sk>rAOfJXH&1o z4FU0iczOZF5ZPtZ)Znc`bEbECxqKSUIxLyQ7t0cOOHgV1*I{4Y07x5O- zM|($$82sw6XThib3uMml)Cg}f%X69N&0BH(&^Lj2+RG1pjSykH-w)Ccy`f#V&JR8C z=X0#dJN|rfWOqO4o2C+ZSMN>U!{N^AL~kY@%2IKOh~S?c_9Xb$*j3}WQjMUF-j=DJ zJXeE=He+RJLs`?5*R!GrH{pGP@Y?RJvuU@R4d6T>TiDPdgNNc4Hs+8=hdmGe=GH>Og{C(w6TNtGRvYgPA%5Li6m4d;?HE0Zn~!vbXL=eo%d}Z-peGc>8Z~!;Hj{}| z6FqwIjor0WFG6Zl>AY=Fjq}>((<~h(@P;uE*I|==F>fthN?%pP;8%yG@Tp5_r}i%0 zZWbcpL{Hz!NymZ_^<|}hw3+=j=Y8Dk-yL>oc|gIh(mU|Y&*jl!Pli8{XjxlDu!;Dovx!2yZ6)FdOyY>>+E))Da%yiM2I>ndpaGb;o6KJ)Iht zwIO$`liQt+CxMfTzDPXO*zEBlf`4|{)8SitR(XvbbVV#p>Mjv|aFJc!163omHtdd! zo`h}N;0hs+(wef1HFnwMu|#%>{_|=GxCf7&lq%c{AFgm1>IrEv~SyWw*@=`%QygT(=1uTy}9o_;eb&y=;-UmTv34vWUSixx!v7 zRt1jj+Ph3UIf$~E=y_Xr*I~rnTb2K!&3xd##`kP8$mhu{?_~+!DLZ5tP20V-Scsk2 zHMhxj(urIX{c>@hJC{3EzKu3qXFAs<(a8ul{|H<6AkK3yWVU>kMa>|*ho9quYR+Pe{?#I|eiuA zjc!;P39}Hh1a~M7Sq~x3XDj5jR%@GQJ&8y%)xYPi7LBVllvdqlF7bvzazAK-(c*)L zni1rC?@}q3(YoWJ3vondiJrYU66AfdpBi(jF>8+CN-jT9MDWiJdkK8wOif{hHfwHEZKV>KruqZj zS;uiV3dMAr-6#^RXNTh*+*Tf)DnaWR59ZwJJTDb7qGr#5FU7O0wT-e$AW}^93r3BD z_r`u|9N(+=XExo;G}(N3G>)NFa|dWUoyaxOXBah(TCUq@9Iw#0-UOewZlVjB>t-5< zS#z6eE0xGJ(NB2HwP-|*<7?A6uGN_CPsc;yAq-pNAnt!vXwa(GHp^NHk>ltWM4@Zx z5^G!#!$NQ_0KBagoxZxwr~Ms63D zUM3S*Lw%@xep;<6$D= z!ij#pIQzbq@HVsWUt|&9%lhf|pxlu=Y;A)$`(DG>sJ)MGGXs%sqK7Ziz3+6tu!3%G zU4^TKY)@`aw`p7U;4d-|=_dO9;yUhqr~3sK-F$SfwoDG1?nT~O`pmg2ix~Wp>$o*| z&D#5fx0Qp&_i>^JFz#N@`^WOPNDE$@5##eY-@R_Bjf5<%iM!ViWo;F}DvC%f(eoGI z4^m5PoA-k}PZE1*-VefwHQo=RVu-vF{d-Zu*7Dj$!ai5>dT8Dc!s#^M528g8i6wgV z*4;UqapjZpNVoBfJO_y#j5m{EKAYvE&7_~D_=W|1G(y%7h;Kdj)m&-{-b5nNL|@;r zW6oRf;w)rEbekOlo?Q~1&dwzL@idvG!^t2Enr3{m@lfmd}cX1F<(@1=$Fge;kfGwNZ2iCJrnWIKh(G12e0 z=FWSIGFi#wHXJ__IlgX`Co@>;bX~fWCOboXRzl{OxE9r}wZzy-AW}^9?L~?auzi)r z&nPLzg=vS6V!hS|#YO^=VxkW(t^=v1xXm2otC3=SA3-^B2(A#a944*<(Q7Q}H6n@R z68&>=##=49ZLDig=j3wh(pEY+6gy_+sv2S8iC(w3(xaByHX6cHk=d=YX}6mVV21JTJa7$xxJt>Wv6QxEERkKJ2QF&2 z`_ArF$nNHJET_c>&Mr~A)oU!#H6n@R5}(%8yneEIJsb1fYr_Y9JVzU8_@?n zHY3`4(STsoS|RMD5IH9L-{O17YB|PV&Za(#D<#L>Axxg^Ww1~*WUZI@9x~3btg#8O ziYC%a^tiMCvwmvU(8!e_aa|a#NbzlrSOT` z6UbbD?G36cvJeR;`r_iwgS>~TW&yXE@pG!|W3dEpo^B?y`4p!9a0bGCHwbYpG}7(V z+yL86B{EI)%*9!3`_A-}N~Rro9k%X4oW+Jr+ch_kb`pt16TNg%52+=35mK9K(N~m2 zr`x@Job;#gR3c9MftB` z6}fHJi$1X=7bkYX*+bSLaE25fN{6^aMDWiJdlG!(FAM<6Yil4YVu-vFeSRzMTBVzy z^Df}`a~?Z77c&LQo5UU3FN5@JL*5H~O+I5-AcdX2Z_jdyF4E*`l^n9lv&yGKzT!_<#*OO%risj8g^ZHFi zgDGAY%O-^H4*M?nEO<4RHzUA2f=DaTvlpc+Z+!u+d`iA1T2GYyCl)scO=|<`YR+Us zTty6#SE4U3T7_$QZR6=U&UsB|IMcn?%X-O>?^tsKUMOVEfM^x&dupzf1YaVNXrk{f zu5GR*y3N|=bwANT(@b33?9!~PWWF>a%a+gX#Ny(yCER6VWeFGNFE1^vudOXEuE+Uq zwJf)p?{*AX?xBecT^q&pufQcUalV^VYblo96e7o#r>>G?_ubKPZL_lTwvowe1;=9A zK*4d~9=eC}r(L%_$l)-5LSF!%;_0<&t%GbQ5lOZ@a+M^zdjUm~70GQR@~W>-4~;}N za8!JS!4`o$*tcc*B9rhIX zMoFw{t36VYKiu7nj=KW(m5t8&aK942d&vFyuplugKE3(>gILU{T1UWD3Pkj66 zn&qRbX0_ zr0da=*2CkYLpV(zor)pyYWe7@cwKj;YutZW@ro;On(DpZ&Usz!Eic2SfaVJ&g4PTk zQT&Q1efM(hccsH#3jd)V;H|mRbp6Rhsx3cVCDpD?I8v>sZsU2r4Ewe_+2C&~&!+P{ zn+dp~*F&~O5ZBmwYc8SorxKYa`s<>k=F+BW+}1`?KY=qno}4SpYWhobLuQ&Nsk`2q zE2#a+M5>A2ySQIaE!A!2x#h&FNbf`u5f1=x8|Ba_NUXhUL|_( zBGz;PxRs9+NimQYcrk5HPOQt=eyN%-DY;hx0+lJ#%HG) zE^rB1+aS(&Q?k0KwTI?1g~&0{e|Ow{m&fe{f5?^)XxtNgke=$PcHO!)OE>!SIiBiU z{Q0E+ZV~uvYO#B)$+76$UN-Aa^T~WX4Vvdm_*1Xz9#1P`@Tn8Gs4`80(^B(Pi7ZrF1BF^Dr9O2>Y-h~S?c zmczH9V|P6*;6vS)jVRHHKEpU)j`xue?C!e0HuL2!RejBO`wm$nAay?9Ule>jQ8lQ1Ilx5?IB7%Q* z*h}DBS~iett>zx8^;8)TMckROujX#)OYFd-iU@bE7dK@?82+%9SR<(xImi zIVO4vqlcxI<3&hqYJGl$$+74`*jNCzMgaYG28?o`=YI^deFi-)l{G8!zIwSd4p|V?oREMqWhDxu*qusQa=J zX{UJ+kDY`~z4&qZg5E9nL_qlduJ`7DxqI32XzSyk=7n4a;#psxTQx6a3G!9!d22}Y z6OeBpM7}Ng<-8EozE2f-RJ9lHRDY|#9;PVo_jj`C3|>%Drs9qXNBBSITYu@h1>=Q| zFnwQOw5&jkwgWJp1!AH-z%ieU;dK^QElTm)VPA_o!t!{ikz%53ad0IBtbT*=yDIX{{FzipDj#=5^Y2t7t^Z=Kg#J zjY!!m{rL^+f!=^vE3ZC z5MQ7urg{h6)v=LcH4h0#@=YmzNZFs$tefRK@>L=sTb|KciHD+CKIjnJVK0Kuf?})I z2FP|AQ9mGh2;;sl*hQ84L7SZk9$fY+pJ5aBObz0`FDP)$IYugm$ScwF7x!AO<+Y9M zy{P1MknDNBw{e9ne~Is8 zM`_Dh!kL(W1tCLAW~Hb$e|rYWFXD^YFaw6ost$wo?^D&oH_jy^co837BxHgc zjN*{svepj6GJzaQD>GJ5X zC&QnG#X;28kh4V;O~Nh_{cmySZ{GY>c7`@Xm+HHRo$XPDbXM~ER1t$;9rg^(yMyuJ*c;p-ThzQ7>>{1WHPMq7JtMVTxABaek6fqQy?mU&rr_ytGRTCR zi_5ieS1b`dBfgqTsJ)3qqKUq~ID5X9=r*(G@1cn9jz_R8be?egRLGh&arV3b)~K}w zvzbO@nds$<(z%x9Hq!Y#m*v8C7q<1Tk#sJZwd{B%?9D8CRL|eCvsOROd{d*uHh$|P z4$)zgO!QkDu&SAxRy0u_6Fq*%TpLGR52EO8qg!;C=rO4(i(yXCwrJ9N5OaWF4F0@H nM3RZV!1(sbTFs)(+b93lA{j3bvW850`=o(tDTS@bT5|spj>?)u literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avdevice.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avdevice.lib new file mode 100644 index 0000000000000000000000000000000000000000..55d590ae562a3a308feebc6401afdc0ede3be8bd GIT binary patch literal 478340 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avformat.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avformat.lib new file mode 100644 index 0000000000000000000000000000000000000000..add092c0d65d206d3adc304f5f54f4415677d1d2 GIT binary patch literal 171176 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avutil.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/avutil.lib new file mode 100644 index 0000000000000000000000000000000000000000..3f242d903bd9b2c7456a03c9772de0d1fe1f4554 GIT binary patch literal 390820 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/postproc.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/postproc.lib new file mode 100644 index 0000000000000000000000000000000000000000..7baefb88bf3eca5ee15219dba125499290b07745 GIT binary patch literal 8952 zcmeI1&5qkt6vt1TOs9DtDQ+>$V#8=m&dc0N4a@9srd70$BfDY~>#THvSgd>wf~! zcI`K@UB3@N+YS63Z8!fA+pXsS?iOvnKM427qv>os86EhlfkrICDl z`cW{Qg71e%Xh|{lgTa`7aTv_}qfs~T_n-JQh~F7@{qK)EgK+jlpJJg`be4nBa27nC z**}s-^yy84fQQl^+9dm>zq)vKkyaIxN5Nzoj)w9~GG@}O{08AcFq~rKL@cCVin-T| zod8Gfg@?zJ&MaX#yA!&@Wgn@?C@16>(h0Yk()BVnN_bsn*@dd~Ye_r# zZKV5cOTRa;v6us>?#&geK&*-ueT^Vmh7ACmn%d0p4A@p1-6t#`@Uf^I_zWAErN}>}^bBipk|q?H+1<&-ZfmkPaqmEgHQs{@pC=X7i@kE| zte21WiyVPhNV%(RV6)_S8$Z^cqFV~byUE0&TOtL)(|ya(tVhFy~1iaDBF{RK4o;cC4hyJbw* zfxCD#hohcfhM?*%4AopbdR{yq_!Z-y^#s<9)`)h?d;%L9P_~T literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/swresample.lib b/ffmpegdemo/ffmpeg/ffmpeg3/winlib64/swresample.lib new file mode 100644 index 0000000000000000000000000000000000000000..dac692be47c0b10434d5791f617e318f8c76ad6b GIT binary patch literal 18774 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 LtpD{Q-^=|Un*&*V literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/ac3_parser.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/ac3_parser.h new file mode 100644 index 0000000..ff8cc4c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/ac3_parser.h @@ -0,0 +1,36 @@ +/* + * AC-3 parser prototypes + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 Michael Niedermayer + * + * 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 + */ + +#ifndef AVCODEC_AC3_PARSER_H +#define AVCODEC_AC3_PARSER_H + +#include +#include + +/** + * Extract the bitstream ID and the frame size from AC-3 data. + */ +int av_ac3_parse_header(const uint8_t *buf, size_t size, + uint8_t *bitstream_id, uint16_t *frame_size); + + +#endif /* AVCODEC_AC3_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/adts_parser.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/adts_parser.h new file mode 100644 index 0000000..f85becd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/adts_parser.h @@ -0,0 +1,37 @@ +/* + * 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 + */ + +#ifndef AVCODEC_ADTS_PARSER_H +#define AVCODEC_ADTS_PARSER_H + +#include +#include + +#define AV_AAC_ADTS_HEADER_SIZE 7 + +/** + * Extract the number of samples and frames from AAC data. + * @param[in] buf pointer to AAC data buffer + * @param[out] samples Pointer to where number of samples is written + * @param[out] frames Pointer to where number of frames is written + * @return Returns 0 on success, error code on failure. + */ +int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, + uint8_t *frames); + +#endif /* AVCODEC_ADTS_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avcodec.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avcodec.h new file mode 100644 index 0000000..d234271 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avcodec.h @@ -0,0 +1,6228 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVCODEC_AVCODEC_H +#define AVCODEC_AVCODEC_H + +/** + * @file + * @ingroup libavc + * Libavcodec external API header + */ + +#include +#include "libavutil/samplefmt.h" +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/cpu.h" +#include "libavutil/channel_layout.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/hwcontext.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "version.h" + +/** + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * + * @{ + * + * @defgroup lavc_decoding Decoding + * @{ + * @} + * + * @defgroup lavc_encoding Encoding + * @{ + * @} + * + * @defgroup lavc_codec Codecs + * @{ + * @defgroup lavc_codec_native Native Codecs + * @{ + * @} + * @defgroup lavc_codec_wrappers External library wrappers + * @{ + * @} + * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge + * @{ + * @} + * @} + * @defgroup lavc_internal Internal + * @{ + * @} + * @} + */ + +/** + * @ingroup libavc + * @defgroup lavc_encdec send/receive encoding and decoding API overview + * @{ + * + * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ + * avcodec_receive_packet() functions provide an encode/decode API, which + * decouples input and output. + * + * The API is very similar for encoding/decoding and audio/video, and works as + * follows: + * - Set up and open the AVCodecContext as usual. + * - Send valid input: + * - For decoding, call avcodec_send_packet() to give the decoder raw + * compressed data in an AVPacket. + * - For encoding, call avcodec_send_frame() to give the encoder an AVFrame + * containing uncompressed audio or video. + * In both cases, it is recommended that AVPackets and AVFrames are + * refcounted, or libavcodec might have to copy the input data. (libavformat + * always returns refcounted AVPackets, and av_frame_get_buffer() allocates + * refcounted AVFrames.) + * - Receive output in a loop. Periodically call one of the avcodec_receive_*() + * functions and process their output: + * - For decoding, call avcodec_receive_frame(). On success, it will return + * an AVFrame containing uncompressed audio or video data. + * - For encoding, call avcodec_receive_packet(). On success, it will return + * an AVPacket with a compressed frame. + * Repeat this call until it returns AVERROR(EAGAIN) or an error. The + * AVERROR(EAGAIN) return value means that new input data is required to + * return new output. In this case, continue with sending input. For each + * input frame/packet, the codec will typically return 1 output frame/packet, + * but it can also be 0 or more than 1. + * + * At the beginning of decoding or encoding, the codec might accept multiple + * input frames/packets without returning a frame, until its internal buffers + * are filled. This situation is handled transparently if you follow the steps + * outlined above. + * + * In theory, sending input can result in EAGAIN - this should happen only if + * not all output was received. You can use this to structure alternative decode + * or encode loops other than the one suggested above. For example, you could + * try sending new input on each iteration, and try to receive output if that + * returns EAGAIN. + * + * End of stream situations. These require "flushing" (aka draining) the codec, + * as the codec might buffer multiple frames or packets internally for + * performance or out of necessity (consider B-frames). + * This is handled as follows: + * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) + * or avcodec_send_frame() (encoding) functions. This will enter draining + * mode. + * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() + * (encoding) in a loop until AVERROR_EOF is returned. The functions will + * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. + * - Before decoding can be resumed again, the codec has to be reset with + * avcodec_flush_buffers(). + * + * Using the API as outlined above is highly recommended. But it is also + * possible to call functions outside of this rigid schema. For example, you can + * call avcodec_send_packet() repeatedly without calling + * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed + * until the codec's internal buffer has been filled up (which is typically of + * size 1 per output frame, after initial input), and then reject input with + * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to + * read at least some output. + * + * Not all codecs will follow a rigid and predictable dataflow; the only + * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on + * one end implies that a receive/send call on the other end will succeed, or + * at least will not fail with AVERROR(EAGAIN). In general, no codec will + * permit unlimited buffering of input or output. + * + * This API replaces the following legacy functions: + * - avcodec_decode_video2() and avcodec_decode_audio4(): + * Use avcodec_send_packet() to feed input to the decoder, then use + * avcodec_receive_frame() to receive decoded frames after each packet. + * Unlike with the old video decoding API, multiple frames might result from + * a packet. For audio, splitting the input packet into frames by partially + * decoding packets becomes transparent to the API user. You never need to + * feed an AVPacket to the API twice (unless it is rejected with AVERROR(EAGAIN) - then + * no data was read from the packet). + * Additionally, sending a flush/draining packet is required only once. + * - avcodec_encode_video2()/avcodec_encode_audio2(): + * Use avcodec_send_frame() to feed input to the encoder, then use + * avcodec_receive_packet() to receive encoded packets. + * Providing user-allocated buffers for avcodec_receive_packet() is not + * possible. + * - The new API does not handle subtitles yet. + * + * Mixing new and old function calls on the same AVCodecContext is not allowed, + * and will result in undefined behavior. + * + * Some codecs might require using the new API; using the old API will return + * an error when calling it. All codecs support the new API. + * + * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This + * would be an invalid state, which could put the codec user into an endless + * loop. The API has no concept of time either: it cannot happen that trying to + * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second + * later accepts the packet (with no other receive/flush API calls involved). + * The API is a strict state machine, and the passage of time is not supposed + * to influence it. Some timing-dependent behavior might still be deemed + * acceptable in certain cases. But it must never result in both send/receive + * returning EAGAIN at the same time at any point. It must also absolutely be + * avoided that the current state is "unstable" and can "flip-flop" between + * the send/receive APIs allowing progress. For example, it's not allowed that + * the codec randomly decides that it actually wants to consume a packet now + * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an + * avcodec_send_packet() call. + * @} + */ + +/** + * @defgroup lavc_core Core functions/structures. + * @ingroup libavc + * + * Basic definitions, functions for querying libavcodec capabilities, + * allocating core structures, etc. + * @{ + */ + + +/** + * Identify the syntax and semantics of the bitstream. + * The principle is roughly: + * Two decoders with the same ID can decode the same streams. + * Two encoders with the same ID can encode compatible streams. + * There may be slight deviations from the principle due to implementation + * details. + * + * If you add a codec ID to this list, add it so that + * 1. no value of an existing codec ID changes (that would break ABI), + * 2. it is as close as possible to similar codecs + * + * After adding new codec IDs, do not forget to add an entry to the codec + * descriptor list and bump libavcodec minor version. + */ +enum AVCodecID { + AV_CODEC_ID_NONE, + + /* video codecs */ + AV_CODEC_ID_MPEG1VIDEO, + AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding + AV_CODEC_ID_H261, + AV_CODEC_ID_H263, + AV_CODEC_ID_RV10, + AV_CODEC_ID_RV20, + AV_CODEC_ID_MJPEG, + AV_CODEC_ID_MJPEGB, + AV_CODEC_ID_LJPEG, + AV_CODEC_ID_SP5X, + AV_CODEC_ID_JPEGLS, + AV_CODEC_ID_MPEG4, + AV_CODEC_ID_RAWVIDEO, + AV_CODEC_ID_MSMPEG4V1, + AV_CODEC_ID_MSMPEG4V2, + AV_CODEC_ID_MSMPEG4V3, + AV_CODEC_ID_WMV1, + AV_CODEC_ID_WMV2, + AV_CODEC_ID_H263P, + AV_CODEC_ID_H263I, + AV_CODEC_ID_FLV1, + AV_CODEC_ID_SVQ1, + AV_CODEC_ID_SVQ3, + AV_CODEC_ID_DVVIDEO, + AV_CODEC_ID_HUFFYUV, + AV_CODEC_ID_CYUV, + AV_CODEC_ID_H264, + AV_CODEC_ID_INDEO3, + AV_CODEC_ID_VP3, + AV_CODEC_ID_THEORA, + AV_CODEC_ID_ASV1, + AV_CODEC_ID_ASV2, + AV_CODEC_ID_FFV1, + AV_CODEC_ID_4XM, + AV_CODEC_ID_VCR1, + AV_CODEC_ID_CLJR, + AV_CODEC_ID_MDEC, + AV_CODEC_ID_ROQ, + AV_CODEC_ID_INTERPLAY_VIDEO, + AV_CODEC_ID_XAN_WC3, + AV_CODEC_ID_XAN_WC4, + AV_CODEC_ID_RPZA, + AV_CODEC_ID_CINEPAK, + AV_CODEC_ID_WS_VQA, + AV_CODEC_ID_MSRLE, + AV_CODEC_ID_MSVIDEO1, + AV_CODEC_ID_IDCIN, + AV_CODEC_ID_8BPS, + AV_CODEC_ID_SMC, + AV_CODEC_ID_FLIC, + AV_CODEC_ID_TRUEMOTION1, + AV_CODEC_ID_VMDVIDEO, + AV_CODEC_ID_MSZH, + AV_CODEC_ID_ZLIB, + AV_CODEC_ID_QTRLE, + AV_CODEC_ID_TSCC, + AV_CODEC_ID_ULTI, + AV_CODEC_ID_QDRAW, + AV_CODEC_ID_VIXL, + AV_CODEC_ID_QPEG, + AV_CODEC_ID_PNG, + AV_CODEC_ID_PPM, + AV_CODEC_ID_PBM, + AV_CODEC_ID_PGM, + AV_CODEC_ID_PGMYUV, + AV_CODEC_ID_PAM, + AV_CODEC_ID_FFVHUFF, + AV_CODEC_ID_RV30, + AV_CODEC_ID_RV40, + AV_CODEC_ID_VC1, + AV_CODEC_ID_WMV3, + AV_CODEC_ID_LOCO, + AV_CODEC_ID_WNV1, + AV_CODEC_ID_AASC, + AV_CODEC_ID_INDEO2, + AV_CODEC_ID_FRAPS, + AV_CODEC_ID_TRUEMOTION2, + AV_CODEC_ID_BMP, + AV_CODEC_ID_CSCD, + AV_CODEC_ID_MMVIDEO, + AV_CODEC_ID_ZMBV, + AV_CODEC_ID_AVS, + AV_CODEC_ID_SMACKVIDEO, + AV_CODEC_ID_NUV, + AV_CODEC_ID_KMVC, + AV_CODEC_ID_FLASHSV, + AV_CODEC_ID_CAVS, + AV_CODEC_ID_JPEG2000, + AV_CODEC_ID_VMNC, + AV_CODEC_ID_VP5, + AV_CODEC_ID_VP6, + AV_CODEC_ID_VP6F, + AV_CODEC_ID_TARGA, + AV_CODEC_ID_DSICINVIDEO, + AV_CODEC_ID_TIERTEXSEQVIDEO, + AV_CODEC_ID_TIFF, + AV_CODEC_ID_GIF, + AV_CODEC_ID_DXA, + AV_CODEC_ID_DNXHD, + AV_CODEC_ID_THP, + AV_CODEC_ID_SGI, + AV_CODEC_ID_C93, + AV_CODEC_ID_BETHSOFTVID, + AV_CODEC_ID_PTX, + AV_CODEC_ID_TXD, + AV_CODEC_ID_VP6A, + AV_CODEC_ID_AMV, + AV_CODEC_ID_VB, + AV_CODEC_ID_PCX, + AV_CODEC_ID_SUNRAST, + AV_CODEC_ID_INDEO4, + AV_CODEC_ID_INDEO5, + AV_CODEC_ID_MIMIC, + AV_CODEC_ID_RL2, + AV_CODEC_ID_ESCAPE124, + AV_CODEC_ID_DIRAC, + AV_CODEC_ID_BFI, + AV_CODEC_ID_CMV, + AV_CODEC_ID_MOTIONPIXELS, + AV_CODEC_ID_TGV, + AV_CODEC_ID_TGQ, + AV_CODEC_ID_TQI, + AV_CODEC_ID_AURA, + AV_CODEC_ID_AURA2, + AV_CODEC_ID_V210X, + AV_CODEC_ID_TMV, + AV_CODEC_ID_V210, + AV_CODEC_ID_DPX, + AV_CODEC_ID_MAD, + AV_CODEC_ID_FRWU, + AV_CODEC_ID_FLASHSV2, + AV_CODEC_ID_CDGRAPHICS, + AV_CODEC_ID_R210, + AV_CODEC_ID_ANM, + AV_CODEC_ID_BINKVIDEO, + AV_CODEC_ID_IFF_ILBM, +#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM + AV_CODEC_ID_KGV1, + AV_CODEC_ID_YOP, + AV_CODEC_ID_VP8, + AV_CODEC_ID_PICTOR, + AV_CODEC_ID_ANSI, + AV_CODEC_ID_A64_MULTI, + AV_CODEC_ID_A64_MULTI5, + AV_CODEC_ID_R10K, + AV_CODEC_ID_MXPEG, + AV_CODEC_ID_LAGARITH, + AV_CODEC_ID_PRORES, + AV_CODEC_ID_JV, + AV_CODEC_ID_DFA, + AV_CODEC_ID_WMV3IMAGE, + AV_CODEC_ID_VC1IMAGE, + AV_CODEC_ID_UTVIDEO, + AV_CODEC_ID_BMV_VIDEO, + AV_CODEC_ID_VBLE, + AV_CODEC_ID_DXTORY, + AV_CODEC_ID_V410, + AV_CODEC_ID_XWD, + AV_CODEC_ID_CDXL, + AV_CODEC_ID_XBM, + AV_CODEC_ID_ZEROCODEC, + AV_CODEC_ID_MSS1, + AV_CODEC_ID_MSA1, + AV_CODEC_ID_TSCC2, + AV_CODEC_ID_MTS2, + AV_CODEC_ID_CLLC, + AV_CODEC_ID_MSS2, + AV_CODEC_ID_VP9, + AV_CODEC_ID_AIC, + AV_CODEC_ID_ESCAPE130, + AV_CODEC_ID_G2M, + AV_CODEC_ID_WEBP, + AV_CODEC_ID_HNM4_VIDEO, + AV_CODEC_ID_HEVC, +#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC + AV_CODEC_ID_FIC, + AV_CODEC_ID_ALIAS_PIX, + AV_CODEC_ID_BRENDER_PIX, + AV_CODEC_ID_PAF_VIDEO, + AV_CODEC_ID_EXR, + AV_CODEC_ID_VP7, + AV_CODEC_ID_SANM, + AV_CODEC_ID_SGIRLE, + AV_CODEC_ID_MVC1, + AV_CODEC_ID_MVC2, + AV_CODEC_ID_HQX, + AV_CODEC_ID_TDSC, + AV_CODEC_ID_HQ_HQA, + AV_CODEC_ID_HAP, + AV_CODEC_ID_DDS, + AV_CODEC_ID_DXV, + AV_CODEC_ID_SCREENPRESSO, + AV_CODEC_ID_RSCC, + AV_CODEC_ID_AVS2, + + AV_CODEC_ID_Y41P = 0x8000, + AV_CODEC_ID_AVRP, + AV_CODEC_ID_012V, + AV_CODEC_ID_AVUI, + AV_CODEC_ID_AYUV, + AV_CODEC_ID_TARGA_Y216, + AV_CODEC_ID_V308, + AV_CODEC_ID_V408, + AV_CODEC_ID_YUV4, + AV_CODEC_ID_AVRN, + AV_CODEC_ID_CPIA, + AV_CODEC_ID_XFACE, + AV_CODEC_ID_SNOW, + AV_CODEC_ID_SMVJPEG, + AV_CODEC_ID_APNG, + AV_CODEC_ID_DAALA, + AV_CODEC_ID_CFHD, + AV_CODEC_ID_TRUEMOTION2RT, + AV_CODEC_ID_M101, + AV_CODEC_ID_MAGICYUV, + AV_CODEC_ID_SHEERVIDEO, + AV_CODEC_ID_YLC, + AV_CODEC_ID_PSD, + AV_CODEC_ID_PIXLET, + AV_CODEC_ID_SPEEDHQ, + AV_CODEC_ID_FMVC, + AV_CODEC_ID_SCPR, + AV_CODEC_ID_CLEARVIDEO, + AV_CODEC_ID_XPM, + AV_CODEC_ID_AV1, + AV_CODEC_ID_BITPACKED, + AV_CODEC_ID_MSCC, + AV_CODEC_ID_SRGC, + AV_CODEC_ID_SVG, + AV_CODEC_ID_GDV, + AV_CODEC_ID_FITS, + AV_CODEC_ID_IMM4, + AV_CODEC_ID_PROSUMER, + AV_CODEC_ID_MWSC, + AV_CODEC_ID_WCMV, + AV_CODEC_ID_RASC, + AV_CODEC_ID_HYMT, + AV_CODEC_ID_ARBC, + AV_CODEC_ID_AGM, + AV_CODEC_ID_LSCR, + AV_CODEC_ID_VP4, + + /* various PCM "codecs" */ + AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs + AV_CODEC_ID_PCM_S16LE = 0x10000, + AV_CODEC_ID_PCM_S16BE, + AV_CODEC_ID_PCM_U16LE, + AV_CODEC_ID_PCM_U16BE, + AV_CODEC_ID_PCM_S8, + AV_CODEC_ID_PCM_U8, + AV_CODEC_ID_PCM_MULAW, + AV_CODEC_ID_PCM_ALAW, + AV_CODEC_ID_PCM_S32LE, + AV_CODEC_ID_PCM_S32BE, + AV_CODEC_ID_PCM_U32LE, + AV_CODEC_ID_PCM_U32BE, + AV_CODEC_ID_PCM_S24LE, + AV_CODEC_ID_PCM_S24BE, + AV_CODEC_ID_PCM_U24LE, + AV_CODEC_ID_PCM_U24BE, + AV_CODEC_ID_PCM_S24DAUD, + AV_CODEC_ID_PCM_ZORK, + AV_CODEC_ID_PCM_S16LE_PLANAR, + AV_CODEC_ID_PCM_DVD, + AV_CODEC_ID_PCM_F32BE, + AV_CODEC_ID_PCM_F32LE, + AV_CODEC_ID_PCM_F64BE, + AV_CODEC_ID_PCM_F64LE, + AV_CODEC_ID_PCM_BLURAY, + AV_CODEC_ID_PCM_LXF, + AV_CODEC_ID_S302M, + AV_CODEC_ID_PCM_S8_PLANAR, + AV_CODEC_ID_PCM_S24LE_PLANAR, + AV_CODEC_ID_PCM_S32LE_PLANAR, + AV_CODEC_ID_PCM_S16BE_PLANAR, + + AV_CODEC_ID_PCM_S64LE = 0x10800, + AV_CODEC_ID_PCM_S64BE, + AV_CODEC_ID_PCM_F16LE, + AV_CODEC_ID_PCM_F24LE, + AV_CODEC_ID_PCM_VIDC, + + /* various ADPCM codecs */ + AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, + AV_CODEC_ID_ADPCM_IMA_WAV, + AV_CODEC_ID_ADPCM_IMA_DK3, + AV_CODEC_ID_ADPCM_IMA_DK4, + AV_CODEC_ID_ADPCM_IMA_WS, + AV_CODEC_ID_ADPCM_IMA_SMJPEG, + AV_CODEC_ID_ADPCM_MS, + AV_CODEC_ID_ADPCM_4XM, + AV_CODEC_ID_ADPCM_XA, + AV_CODEC_ID_ADPCM_ADX, + AV_CODEC_ID_ADPCM_EA, + AV_CODEC_ID_ADPCM_G726, + AV_CODEC_ID_ADPCM_CT, + AV_CODEC_ID_ADPCM_SWF, + AV_CODEC_ID_ADPCM_YAMAHA, + AV_CODEC_ID_ADPCM_SBPRO_4, + AV_CODEC_ID_ADPCM_SBPRO_3, + AV_CODEC_ID_ADPCM_SBPRO_2, + AV_CODEC_ID_ADPCM_THP, + AV_CODEC_ID_ADPCM_IMA_AMV, + AV_CODEC_ID_ADPCM_EA_R1, + AV_CODEC_ID_ADPCM_EA_R3, + AV_CODEC_ID_ADPCM_EA_R2, + AV_CODEC_ID_ADPCM_IMA_EA_SEAD, + AV_CODEC_ID_ADPCM_IMA_EA_EACS, + AV_CODEC_ID_ADPCM_EA_XAS, + AV_CODEC_ID_ADPCM_EA_MAXIS_XA, + AV_CODEC_ID_ADPCM_IMA_ISS, + AV_CODEC_ID_ADPCM_G722, + AV_CODEC_ID_ADPCM_IMA_APC, + AV_CODEC_ID_ADPCM_VIMA, + + AV_CODEC_ID_ADPCM_AFC = 0x11800, + AV_CODEC_ID_ADPCM_IMA_OKI, + AV_CODEC_ID_ADPCM_DTK, + AV_CODEC_ID_ADPCM_IMA_RAD, + AV_CODEC_ID_ADPCM_G726LE, + AV_CODEC_ID_ADPCM_THP_LE, + AV_CODEC_ID_ADPCM_PSX, + AV_CODEC_ID_ADPCM_AICA, + AV_CODEC_ID_ADPCM_IMA_DAT4, + AV_CODEC_ID_ADPCM_MTAF, + AV_CODEC_ID_ADPCM_AGM, + + /* AMR */ + AV_CODEC_ID_AMR_NB = 0x12000, + AV_CODEC_ID_AMR_WB, + + /* RealAudio codecs*/ + AV_CODEC_ID_RA_144 = 0x13000, + AV_CODEC_ID_RA_288, + + /* various DPCM codecs */ + AV_CODEC_ID_ROQ_DPCM = 0x14000, + AV_CODEC_ID_INTERPLAY_DPCM, + AV_CODEC_ID_XAN_DPCM, + AV_CODEC_ID_SOL_DPCM, + + AV_CODEC_ID_SDX2_DPCM = 0x14800, + AV_CODEC_ID_GREMLIN_DPCM, + + /* audio codecs */ + AV_CODEC_ID_MP2 = 0x15000, + AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 + AV_CODEC_ID_AAC, + AV_CODEC_ID_AC3, + AV_CODEC_ID_DTS, + AV_CODEC_ID_VORBIS, + AV_CODEC_ID_DVAUDIO, + AV_CODEC_ID_WMAV1, + AV_CODEC_ID_WMAV2, + AV_CODEC_ID_MACE3, + AV_CODEC_ID_MACE6, + AV_CODEC_ID_VMDAUDIO, + AV_CODEC_ID_FLAC, + AV_CODEC_ID_MP3ADU, + AV_CODEC_ID_MP3ON4, + AV_CODEC_ID_SHORTEN, + AV_CODEC_ID_ALAC, + AV_CODEC_ID_WESTWOOD_SND1, + AV_CODEC_ID_GSM, ///< as in Berlin toast format + AV_CODEC_ID_QDM2, + AV_CODEC_ID_COOK, + AV_CODEC_ID_TRUESPEECH, + AV_CODEC_ID_TTA, + AV_CODEC_ID_SMACKAUDIO, + AV_CODEC_ID_QCELP, + AV_CODEC_ID_WAVPACK, + AV_CODEC_ID_DSICINAUDIO, + AV_CODEC_ID_IMC, + AV_CODEC_ID_MUSEPACK7, + AV_CODEC_ID_MLP, + AV_CODEC_ID_GSM_MS, /* as found in WAV */ + AV_CODEC_ID_ATRAC3, + AV_CODEC_ID_APE, + AV_CODEC_ID_NELLYMOSER, + AV_CODEC_ID_MUSEPACK8, + AV_CODEC_ID_SPEEX, + AV_CODEC_ID_WMAVOICE, + AV_CODEC_ID_WMAPRO, + AV_CODEC_ID_WMALOSSLESS, + AV_CODEC_ID_ATRAC3P, + AV_CODEC_ID_EAC3, + AV_CODEC_ID_SIPR, + AV_CODEC_ID_MP1, + AV_CODEC_ID_TWINVQ, + AV_CODEC_ID_TRUEHD, + AV_CODEC_ID_MP4ALS, + AV_CODEC_ID_ATRAC1, + AV_CODEC_ID_BINKAUDIO_RDFT, + AV_CODEC_ID_BINKAUDIO_DCT, + AV_CODEC_ID_AAC_LATM, + AV_CODEC_ID_QDMC, + AV_CODEC_ID_CELT, + AV_CODEC_ID_G723_1, + AV_CODEC_ID_G729, + AV_CODEC_ID_8SVX_EXP, + AV_CODEC_ID_8SVX_FIB, + AV_CODEC_ID_BMV_AUDIO, + AV_CODEC_ID_RALF, + AV_CODEC_ID_IAC, + AV_CODEC_ID_ILBC, + AV_CODEC_ID_OPUS, + AV_CODEC_ID_COMFORT_NOISE, + AV_CODEC_ID_TAK, + AV_CODEC_ID_METASOUND, + AV_CODEC_ID_PAF_AUDIO, + AV_CODEC_ID_ON2AVC, + AV_CODEC_ID_DSS_SP, + AV_CODEC_ID_CODEC2, + + AV_CODEC_ID_FFWAVESYNTH = 0x15800, + AV_CODEC_ID_SONIC, + AV_CODEC_ID_SONIC_LS, + AV_CODEC_ID_EVRC, + AV_CODEC_ID_SMV, + AV_CODEC_ID_DSD_LSBF, + AV_CODEC_ID_DSD_MSBF, + AV_CODEC_ID_DSD_LSBF_PLANAR, + AV_CODEC_ID_DSD_MSBF_PLANAR, + AV_CODEC_ID_4GV, + AV_CODEC_ID_INTERPLAY_ACM, + AV_CODEC_ID_XMA1, + AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, + AV_CODEC_ID_ATRAC3AL, + AV_CODEC_ID_ATRAC3PAL, + AV_CODEC_ID_DOLBY_E, + AV_CODEC_ID_APTX, + AV_CODEC_ID_APTX_HD, + AV_CODEC_ID_SBC, + AV_CODEC_ID_ATRAC9, + AV_CODEC_ID_HCOM, + + /* subtitle codecs */ + AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. + AV_CODEC_ID_DVD_SUBTITLE = 0x17000, + AV_CODEC_ID_DVB_SUBTITLE, + AV_CODEC_ID_TEXT, ///< raw UTF-8 text + AV_CODEC_ID_XSUB, + AV_CODEC_ID_SSA, + AV_CODEC_ID_MOV_TEXT, + AV_CODEC_ID_HDMV_PGS_SUBTITLE, + AV_CODEC_ID_DVB_TELETEXT, + AV_CODEC_ID_SRT, + + AV_CODEC_ID_MICRODVD = 0x17800, + AV_CODEC_ID_EIA_608, + AV_CODEC_ID_JACOSUB, + AV_CODEC_ID_SAMI, + AV_CODEC_ID_REALTEXT, + AV_CODEC_ID_STL, + AV_CODEC_ID_SUBVIEWER1, + AV_CODEC_ID_SUBVIEWER, + AV_CODEC_ID_SUBRIP, + AV_CODEC_ID_WEBVTT, + AV_CODEC_ID_MPL2, + AV_CODEC_ID_VPLAYER, + AV_CODEC_ID_PJS, + AV_CODEC_ID_ASS, + AV_CODEC_ID_HDMV_TEXT_SUBTITLE, + AV_CODEC_ID_TTML, + AV_CODEC_ID_ARIB_CAPTION, + + /* other specific kind of codecs (generally used for attachments) */ + AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. + AV_CODEC_ID_TTF = 0x18000, + + AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. + AV_CODEC_ID_BINTEXT = 0x18800, + AV_CODEC_ID_XBIN, + AV_CODEC_ID_IDF, + AV_CODEC_ID_OTF, + AV_CODEC_ID_SMPTE_KLV, + AV_CODEC_ID_DVD_NAV, + AV_CODEC_ID_TIMED_ID3, + AV_CODEC_ID_BIN_DATA, + + + AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it + + AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS + * stream (only used by libavformat) */ + AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems + * stream (only used by libavformat) */ + AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. + AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket +}; + +/** + * This struct describes the properties of a single codec described by an + * AVCodecID. + * @see avcodec_descriptor_get() + */ +typedef struct AVCodecDescriptor { + enum AVCodecID id; + enum AVMediaType type; + /** + * Name of the codec described by this descriptor. It is non-empty and + * unique for each codec descriptor. It should contain alphanumeric + * characters and '_' only. + */ + const char *name; + /** + * A more descriptive name for this codec. May be NULL. + */ + const char *long_name; + /** + * Codec properties, a combination of AV_CODEC_PROP_* flags. + */ + int props; + /** + * MIME type(s) associated with the codec. + * May be NULL; if not, a NULL-terminated array of MIME types. + * The first item is always non-NULL and is the preferred MIME type. + */ + const char *const *mime_types; + /** + * If non-NULL, an array of profiles recognized for this codec. + * Terminated with FF_PROFILE_UNKNOWN. + */ + const struct AVProfile *profiles; +} AVCodecDescriptor; + +/** + * Codec uses only intra compression. + * Video and audio codecs only. + */ +#define AV_CODEC_PROP_INTRA_ONLY (1 << 0) +/** + * Codec supports lossy compression. Audio and video codecs only. + * @note a codec may support both lossy and lossless + * compression modes + */ +#define AV_CODEC_PROP_LOSSY (1 << 1) +/** + * Codec supports lossless compression. Audio and video codecs only. + */ +#define AV_CODEC_PROP_LOSSLESS (1 << 2) +/** + * Codec supports frame reordering. That is, the coded order (the order in which + * the encoded packets are output by the encoders / stored / input to the + * decoders) may be different from the presentation order of the corresponding + * frames. + * + * For codecs that do not have this property set, PTS and DTS should always be + * equal. + */ +#define AV_CODEC_PROP_REORDER (1 << 3) +/** + * Subtitle codec is bitmap based + * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. + */ +#define AV_CODEC_PROP_BITMAP_SUB (1 << 16) +/** + * Subtitle codec is text based. + * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field. + */ +#define AV_CODEC_PROP_TEXT_SUB (1 << 17) + +/** + * @ingroup lavc_decoding + * Required number of additionally allocated bytes at the end of the input bitstream for decoding. + * This is mainly needed because some optimized bitstream readers read + * 32 or 64 bit at once and could read over the end.
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged + * MPEG bitstreams could cause overread and segfault. + */ +#define AV_INPUT_BUFFER_PADDING_SIZE 64 + +/** + * @ingroup lavc_encoding + * minimum encoding buffer size + * Used to avoid some checks during header writing. + */ +#define AV_INPUT_BUFFER_MIN_SIZE 16384 + +/** + * @ingroup lavc_decoding + */ +enum AVDiscard{ + /* We leave some space between them for extensions (drop some + * keyframes for intra-only or drop just some bidir frames). */ + AVDISCARD_NONE =-16, ///< discard nothing + AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi + AVDISCARD_NONREF = 8, ///< discard all non reference + AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames + AVDISCARD_NONINTRA= 24, ///< discard all non intra frames + AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes + AVDISCARD_ALL = 48, ///< discard all +}; + +enum AVAudioServiceType { + AV_AUDIO_SERVICE_TYPE_MAIN = 0, + AV_AUDIO_SERVICE_TYPE_EFFECTS = 1, + AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2, + AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3, + AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4, + AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5, + AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6, + AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7, + AV_AUDIO_SERVICE_TYPE_KARAOKE = 8, + AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI +}; + +/** + * @ingroup lavc_encoding + */ +typedef struct RcOverride{ + int start_frame; + int end_frame; + int qscale; // If this is 0 then quality_factor will be used instead. + float quality_factor; +} RcOverride; + +/* encoding support + These flags can be passed in AVCodecContext.flags before initialization. + Note: Not everything is supported yet. +*/ + +/** + * Allow decoders to produce frames with data planes that are not aligned + * to CPU requirements (e.g. due to cropping). + */ +#define AV_CODEC_FLAG_UNALIGNED (1 << 0) +/** + * Use fixed qscale. + */ +#define AV_CODEC_FLAG_QSCALE (1 << 1) +/** + * 4 MV per MB allowed / advanced prediction for H.263. + */ +#define AV_CODEC_FLAG_4MV (1 << 2) +/** + * Output even those frames that might be corrupted. + */ +#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3) +/** + * Use qpel MC. + */ +#define AV_CODEC_FLAG_QPEL (1 << 4) +/** + * Don't output frames whose parameters differ from first + * decoded frame in stream. + */ +#define AV_CODEC_FLAG_DROPCHANGED (1 << 5) +/** + * Use internal 2pass ratecontrol in first pass mode. + */ +#define AV_CODEC_FLAG_PASS1 (1 << 9) +/** + * Use internal 2pass ratecontrol in second pass mode. + */ +#define AV_CODEC_FLAG_PASS2 (1 << 10) +/** + * loop filter. + */ +#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11) +/** + * Only decode/encode grayscale. + */ +#define AV_CODEC_FLAG_GRAY (1 << 13) +/** + * error[?] variables will be set during encoding. + */ +#define AV_CODEC_FLAG_PSNR (1 << 15) +/** + * Input bitstream might be truncated at a random location + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG_TRUNCATED (1 << 16) +/** + * Use interlaced DCT. + */ +#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18) +/** + * Force low delay. + */ +#define AV_CODEC_FLAG_LOW_DELAY (1 << 19) +/** + * Place global headers in extradata instead of every keyframe. + */ +#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) +/** + * Use only bitexact stuff (except (I)DCT). + */ +#define AV_CODEC_FLAG_BITEXACT (1 << 23) +/* Fx : Flag for H.263+ extra options */ +/** + * H.263 advanced intra coding / MPEG-4 AC prediction + */ +#define AV_CODEC_FLAG_AC_PRED (1 << 24) +/** + * interlaced motion estimation + */ +#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) +#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) + +/** + * Allow non spec compliant speedup tricks. + */ +#define AV_CODEC_FLAG2_FAST (1 << 0) +/** + * Skip bitstream encoding. + */ +#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2) +/** + * Place global headers at every keyframe instead of in extradata. + */ +#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3) + +/** + * timecode is in drop frame format. DEPRECATED!!!! + */ +#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13) + +/** + * Input bitstream might be truncated at a packet boundaries + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG2_CHUNKS (1 << 15) +/** + * Discard cropping information from SPS. + */ +#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16) + +/** + * Show all frames before the first keyframe + */ +#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) +/** + * Export motion vectors through frame side data + */ +#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) +/** + * Do not skip samples and export skip information as frame side data + */ +#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) +/** + * Do not reset ASS ReadOrder field on flush (subtitles decoding) + */ +#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +/** + * Decoder can use draw_horiz_band callback. + */ +#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0) +/** + * Codec uses get_buffer() for allocating buffers and supports custom allocators. + * If not set, it might not use get_buffer() at all or use operations that + * assume the buffer was allocated by avcodec_default_get_buffer. + */ +#define AV_CODEC_CAP_DR1 (1 << 1) +#define AV_CODEC_CAP_TRUNCATED (1 << 3) +/** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + */ +#define AV_CODEC_CAP_DELAY (1 << 5) +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) + +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carrying such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define AV_CODEC_CAP_SUBFRAMES (1 << 8) +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9) +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10) +/** + * Codec supports frame-level multithreading. + */ +#define AV_CODEC_CAP_FRAME_THREADS (1 << 12) +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define AV_CODEC_CAP_SLICE_THREADS (1 << 13) +/** + * Codec supports changed parameters at any point. + */ +#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14) +/** + * Codec supports avctx->thread_count == 0 (auto). + */ +#define AV_CODEC_CAP_AUTO_THREADS (1 << 15) +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) +/** + * Decoder is not a preferred choice for probing. + * This indicates that the decoder is not a good choice for probing. + * It could for example be an expensive to spin up hardware decoder, + * or it could simply not provide a lot of useful information about + * the stream. + * A decoder marked with this flag should only be used as last resort + * choice for probing. + */ +#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) +/** + * Codec is intra only. + */ +#define AV_CODEC_CAP_INTRA_ONLY 0x40000000 +/** + * Codec is lossless. + */ +#define AV_CODEC_CAP_LOSSLESS 0x80000000 + +/** + * Codec is backed by a hardware implementation. Typically used to + * identify a non-hwaccel hardware decoder. For information about hwaccels, use + * avcodec_get_hw_config() instead. + */ +#define AV_CODEC_CAP_HARDWARE (1 << 18) + +/** + * Codec is potentially backed by a hardware implementation, but not + * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the + * implementation provides some sort of internal fallback. + */ +#define AV_CODEC_CAP_HYBRID (1 << 19) + +/** + * This codec takes the reordered_opaque field from input AVFrames + * and returns it in the corresponding field in AVCodecContext after + * encoding. + */ +#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20) + +/** + * Pan Scan area. + * This specifies the area which should be displayed. + * Note there may be multiple such areas for one frame. + */ +typedef struct AVPanScan { + /** + * id + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int id; + + /** + * width and height in 1/16 pel + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int width; + int height; + + /** + * position of the top left corner in 1/16 pel for up to 3 fields/frames + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int16_t position[3][2]; +} AVPanScan; + +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int max_bitrate; +#else + int64_t max_bitrate; +#endif + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int min_bitrate; +#else + int64_t min_bitrate; +#endif + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int avg_bitrate; +#else + int64_t avg_bitrate; +#endif + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; + +/** + * The decoder will keep a reference to the frame and may reuse it later. + */ +#define AV_GET_BUFFER_FLAG_REF (1 << 0) + +/** + * @defgroup lavc_packet AVPacket + * + * Types and functions for working with AVPacket. + * @{ + */ +enum AVPacketSideDataType { + /** + * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE + * bytes worth of palette. This side data signals that a new palette is + * present. + */ + AV_PKT_DATA_PALETTE, + + /** + * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format + * that the extradata buffer was changed and the receiving side should + * act upon it appropriately. The new extradata is embedded in the side + * data buffer and should be immediately used for processing the current + * frame or packet. + */ + AV_PKT_DATA_NEW_EXTRADATA, + + /** + * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: + * @code + * u32le param_flags + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) + * s32le channel_count + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) + * u64le channel_layout + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) + * s32le sample_rate + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) + * s32le width + * s32le height + * @endcode + */ + AV_PKT_DATA_PARAM_CHANGE, + + /** + * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of + * structures with info about macroblocks relevant to splitting the + * packet into smaller packets on macroblock edges (e.g. as for RFC 2190). + * That is, it does not necessarily contain info about all macroblocks, + * as long as the distance between macroblocks in the info is smaller + * than the target payload size. + * Each MB info structure is 12 bytes, and is laid out as follows: + * @code + * u32le bit offset from the start of the packet + * u8 current quantizer at the start of the macroblock + * u8 GOB number + * u16le macroblock address within the GOB + * u8 horizontal MV predictor + * u8 vertical MV predictor + * u8 horizontal MV predictor for block number 3 + * u8 vertical MV predictor for block number 3 + * @endcode + */ + AV_PKT_DATA_H263_MB_INFO, + + /** + * This side data should be associated with an audio stream and contains + * ReplayGain information in form of the AVReplayGain struct. + */ + AV_PKT_DATA_REPLAYGAIN, + + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the decoded video frames for + * correct presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_PKT_DATA_DISPLAYMATRIX, + + /** + * This side data should be associated with a video stream and contains + * Stereoscopic 3D information in form of the AVStereo3D struct. + */ + AV_PKT_DATA_STEREO3D, + + /** + * This side data should be associated with an audio stream and corresponds + * to enum AVAudioServiceType. + */ + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + + /** + * This side data contains quality related information from the encoder. + * @code + * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). + * u8 picture type + * u8 error count + * u16 reserved + * u64le[error count] sum of squared differences between encoder in and output + * @endcode + */ + AV_PKT_DATA_QUALITY_STATS, + + /** + * This side data contains an integer value representing the stream index + * of a "fallback" track. A fallback track indicates an alternate + * track to use when the current track can not be decoded for some reason. + * e.g. no decoder available for codec. + */ + AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, + + /** + * Recommmends skipping the specified number of samples + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_PKT_DATA_SKIP_SAMPLES, + + /** + * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that + * the packet may contain "dual mono" audio specific to Japanese DTV + * and if it is true, recommends only the selected channel to be used. + * @code + * u8 selected channels (0=mail/left, 1=sub/right, 2=both) + * @endcode + */ + AV_PKT_DATA_JP_DUALMONO, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. + */ + AV_PKT_DATA_STRINGS_METADATA, + + /** + * Subtitle event position + * @code + * u32le x1 + * u32le y1 + * u32le x2 + * u32le y2 + * @endcode + */ + AV_PKT_DATA_SUBTITLE_POSITION, + + /** + * Data found in BlockAdditional element of matroska container. There is + * no end marker for the data, so it is required to rely on the side data + * size to recognize the end. 8 byte id (as found in BlockAddId) followed + * by data. + */ + AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, + + /** + * The optional first identifier line of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_IDENTIFIER, + + /** + * The optional settings (rendering instructions) that immediately + * follow the timestamp specifier of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_SETTINGS, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. This + * side data includes updated metadata which appeared in the stream. + */ + AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID as uint8_t, this is required to pass the stream ID + * information from the demuxer to the corresponding muxer. + */ + AV_PKT_DATA_MPEGTS_STREAM_ID, + + /** + * Mastering display metadata (based on SMPTE-2086:2014). This metadata + * should be associated with a video stream and contains data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This metadata should be + * associated with a video stream and contains data in the form of the + * AVContentLightMetadata struct. + */ + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + + /** + * ATSC A53 Part 4 Closed Captions. This metadata should be associated with + * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. + * The number of bytes of CC data is AVPacketSideData.size. + */ + AV_PKT_DATA_A53_CC, + + /** + * This side data is encryption initialization data. + * The format is not part of ABI, use av_encryption_init_info_* methods to + * access. + */ + AV_PKT_DATA_ENCRYPTION_INIT_INFO, + + /** + * This side data contains encryption info for how to decrypt the packet. + * The format is not part of ABI, use av_encryption_info_* methods to access. + */ + AV_PKT_DATA_ENCRYPTION_INFO, + + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_PKT_DATA_AFD, + + /** + * The number of side data types. + * This is not part of the public API/ABI in the sense that it may + * change when new side data types are added. + * This must stay the last enum value. + * If its value becomes huge, some code using it + * needs to be updated as it assumes it to be smaller than other limits. + */ + AV_PKT_DATA_NB +}; + +#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED + +typedef struct AVPacketSideData { + uint8_t *data; + int size; + enum AVPacketSideDataType type; +} AVPacketSideData; + +/** + * This structure stores compressed data. It is typically exported by demuxers + * and then passed as input to decoders, or received as output from encoders and + * then passed to muxers. + * + * For video, it should typically contain one compressed frame. For audio it may + * contain several compressed frames. Encoders are allowed to output empty + * packets, with no compressed data, containing only side data + * (e.g. to update some stream parameters at the end of encoding). + * + * AVPacket is one of the few structs in FFmpeg, whose size is a part of public + * ABI. Thus it may be allocated on stack and no new fields can be added to it + * without libavcodec and libavformat major bump. + * + * The semantics of data ownership depends on the buf field. + * If it is set, the packet data is dynamically allocated and is + * valid indefinitely until a call to av_packet_unref() reduces the + * reference count to 0. + * + * If the buf field is not set av_packet_ref() would make a copy instead + * of increasing the reference count. + * + * The side data is always allocated with av_malloc(), copied by + * av_packet_ref() and freed by av_packet_unref(). + * + * @see av_packet_ref + * @see av_packet_unref + */ +typedef struct AVPacket { + /** + * A reference to the reference-counted buffer where the packet data is + * stored. + * May be NULL, then the packet data is not reference-counted. + */ + AVBufferRef *buf; + /** + * Presentation timestamp in AVStream->time_base units; the time at which + * the decompressed packet will be presented to the user. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + * pts MUST be larger or equal to dts as presentation cannot happen before + * decompression, unless one wants to view hex dumps. Some formats misuse + * the terms dts and pts/cts to mean something different. Such timestamps + * must be converted to true pts/dts before they are stored in AVPacket. + */ + int64_t pts; + /** + * Decompression timestamp in AVStream->time_base units; the time at which + * the packet is decompressed. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + */ + int64_t dts; + uint8_t *data; + int size; + int stream_index; + /** + * A combination of AV_PKT_FLAG values + */ + int flags; + /** + * Additional packet data that can be provided by the container. + * Packet can contain several types of side information. + */ + AVPacketSideData *side_data; + int side_data_elems; + + /** + * Duration of this packet in AVStream->time_base units, 0 if unknown. + * Equals next_pts - this_pts in presentation order. + */ + int64_t duration; + + int64_t pos; ///< byte position in stream, -1 if unknown + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated Same as the duration field, but as int64_t. This was required + * for Matroska subtitles, whose duration values could overflow when the + * duration field was still an int. + */ + attribute_deprecated + int64_t convergence_duration; +#endif +} AVPacket; +#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe +#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * Flag is used to discard packets which are required to maintain valid + * decoder state but are not required for output and should be dropped + * after decoding. + **/ +#define AV_PKT_FLAG_DISCARD 0x0004 +/** + * The packet comes from a trusted source. + * + * Otherwise-unsafe constructs such as arbitrary pointers to data + * outside the packet may be followed. + */ +#define AV_PKT_FLAG_TRUSTED 0x0008 +/** + * Flag is used to indicate packets that contain frames that can + * be discarded by the decoder. I.e. Non-reference frames. + */ +#define AV_PKT_FLAG_DISPOSABLE 0x0010 + + +enum AVSideDataParamChangeFlags { + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, + AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, + AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, +}; +/** + * @} + */ + +struct AVCodecInternal; + +enum AVFieldOrder { + AV_FIELD_UNKNOWN, + AV_FIELD_PROGRESSIVE, + AV_FIELD_TT, //< Top coded_first, top displayed first + AV_FIELD_BB, //< Bottom coded first, bottom displayed first + AV_FIELD_TB, //< Top coded first, bottom displayed first + AV_FIELD_BT, //< Bottom coded first, top displayed first +}; + +/** + * main external API structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * applications. + * The name string for AVOptions options matches the associated command line + * parameter name and can be found in libavcodec/options_table.h + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + * sizeof(AVCodecContext) must not be used outside libav*. + */ +typedef struct AVCodecContext { + /** + * information on struct for av_log + * - set by avcodec_alloc_context3 + */ + const AVClass *av_class; + int log_level_offset; + + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + const struct AVCodec *codec; + enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ + + /** + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * A demuxer should set this to what is stored in the field used to identify the codec. + * If there are multiple such fields in a container then the demuxer should choose the one + * which maximizes the information about the used codec. + * If the codec tag field in a container is larger than 32 bits then the demuxer should + * remap the longer ID to 32 bits with a table or other structure. Alternatively a new + * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated + * first. + * - encoding: Set by user, if not then the default based on codec_id will be used. + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int codec_tag; + + void *priv_data; + + /** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + */ + struct AVCodecInternal *internal; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + + /** + * the average bitrate + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: Set by user, may be overwritten by libavcodec + * if this info is available in the stream + */ + int64_t bit_rate; + + /** + * number of bits the bitstream is allowed to diverge from the reference. + * the reference can be CBR (for CBR pass1) or VBR (for pass2) + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: unused + */ + int bit_rate_tolerance; + + /** + * Global quality for codecs which cannot change it per frame. + * This should be proportional to MPEG-1/2/4 qscale. + * - encoding: Set by user. + * - decoding: unused + */ + int global_quality; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + + /** + * AV_CODEC_FLAG_*. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags; + + /** + * AV_CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags2; + + /** + * some codecs need / can use extradata like Huffman tables. + * MJPEG: Huffman tables + * rv10: additional flags + * MPEG-4: global headers (they can be in the bitstream or here) + * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger + * than extradata_size to avoid problems if it is read with the bitstream reader. + * The bytewise contents of extradata must not depend on the architecture or CPU endianness. + * Must be allocated with the av_malloc() family of functions. + * - encoding: Set/allocated/freed by libavcodec. + * - decoding: Set/allocated/freed by user. + */ + uint8_t *extradata; + int extradata_size; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identically 1. + * This often, but not always is the inverse of the frame rate or field rate + * for video. 1/time_base is not the average frame rate if the frame rate is not + * constant. + * + * Like containers, elementary streams also can store timestamps, 1/time_base + * is the unit in which these timestamps are specified. + * As example of such codec time base see ISO/IEC 14496-2:2001(E) + * vop_time_increment_resolution and fixed_vop_rate + * (fixed_vop_rate == 0 implies that it is different from the framerate) + * + * - encoding: MUST be set by user. + * - decoding: the use of this field for decoding is deprecated. + * Use framerate instead. + */ + AVRational time_base; + + /** + * For some codecs, the time base is closer to the field rate than the frame rate. + * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration + * if no telecine is used ... + * + * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. + */ + int ticks_per_frame; + + /** + * Codec delay. + * + * Encoding: Number of frames delay there will be from the encoder input to + * the decoder output. (we assume the decoder matches the spec) + * Decoding: Number of frames delay in addition to what a standard decoder + * as specified in the spec would produce. + * + * Video: + * Number of frames the decoded output will be delayed relative to the + * encoded input. + * + * Audio: + * For encoding, this field is unused (see initial_padding). + * + * For decoding, this is the number of samples the decoder needs to + * output before the decoder's output is valid. When seeking, you should + * start decoding this many samples prior to your desired seek point. + * + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int delay; + + + /* video only */ + /** + * picture width / height. + * + * @note Those fields may not match the values of the last + * AVFrame output by avcodec_decode_video2 due frame + * reordering. + * + * - encoding: MUST be set by user. + * - decoding: May be set by the user before opening the decoder if known e.g. + * from the container. Some decoders will require the dimensions + * to be set by the caller. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int width, height; + + /** + * Bitstream width / height, may be different from width/height e.g. when + * the decoded frame is cropped before being output or lowres is enabled. + * + * @note Those field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: unused + * - decoding: May be set by the user before opening the decoder if known + * e.g. from the container. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int coded_width, coded_height; + + /** + * the number of pictures in a group of pictures, or 0 for intra_only + * - encoding: Set by user. + * - decoding: unused + */ + int gop_size; + + /** + * Pixel format, see AV_PIX_FMT_xxx. + * May be set by the demuxer if known from headers. + * May be overridden by the decoder if it knows better. + * + * @note This field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: Set by user. + * - decoding: Set by user if known, overridden by libavcodec while + * parsing the data. + */ + enum AVPixelFormat pix_fmt; + + /** + * If non NULL, 'draw_horiz_band' is called by the libavcodec + * decoder to draw a horizontal band. It improves cache usage. Not + * all codecs can do that. You must check the codec capabilities + * beforehand. + * When multithreading is used, it may be called from multiple threads + * at the same time; threads might draw different parts of the same AVFrame, + * or multiple AVFrames, and there is no guarantee that slices will be drawn + * in order. + * The function is also used by hardware acceleration APIs. + * It is called at least once during frame decoding to pass + * the data needed for hardware render. + * In that mode instead of pixel data, AVFrame points to + * a structure specific to the acceleration API. The application + * reads the structure and can change some fields to indicate progress + * or mark state. + * - encoding: unused + * - decoding: Set by user. + * @param height the height of the slice + * @param y the y position of the slice + * @param type 1->top field, 2->bottom field, 3->frame + * @param offset offset into the AVFrame.data from which the slice should be read + */ + void (*draw_horiz_band)(struct AVCodecContext *s, + const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], + int y, int type, int height); + + /** + * callback to negotiate the pixelFormat + * @param fmt is the list of formats which are supported by the codec, + * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. + * The first is always the native one. + * @note The callback may be called again immediately if initialization for + * the selected (hardware-accelerated) pixel format failed. + * @warning Behavior is undefined if the callback returns a value not + * in the fmt list of formats. + * @return the chosen format + * - encoding: unused + * - decoding: Set by user, if not set the native format will be chosen. + */ + enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + + /** + * maximum number of B-frames between non-B-frames + * Note: The output will be delayed by max_b_frames+1 relative to the input. + * - encoding: Set by user. + * - decoding: unused + */ + int max_b_frames; + + /** + * qscale factor between IP and B-frames + * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_factor; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_frame_strategy; +#endif + + /** + * qscale offset between IP and B-frames + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_offset; + + /** + * Size of the frame reordering buffer in the decoder. + * For MPEG-2 it is 1 IPB or 0 low delay IP. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int has_b_frames; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int mpeg_quant; +#endif + + /** + * qscale factor between P- and I-frames + * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_factor; + + /** + * qscale offset between P and I-frames + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_offset; + + /** + * luminance masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float lumi_masking; + + /** + * temporary complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float temporal_cplx_masking; + + /** + * spatial complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float spatial_cplx_masking; + + /** + * p block masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float p_masking; + + /** + * darkness masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float dark_masking; + + /** + * slice count + * - encoding: Set by libavcodec. + * - decoding: Set by user (or 0). + */ + int slice_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int prediction_method; +#define FF_PRED_LEFT 0 +#define FF_PRED_PLANE 1 +#define FF_PRED_MEDIAN 2 +#endif + + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + + /** + * sample aspect ratio (0 if unknown) + * That is the width of a pixel divided by the height of the pixel. + * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVRational sample_aspect_ratio; + + /** + * motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_cmp; + /** + * subpixel motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_sub_cmp; + /** + * macroblock comparison function (not supported yet) + * - encoding: Set by user. + * - decoding: unused + */ + int mb_cmp; + /** + * interlaced DCT comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int ildct_cmp; +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_MEDIAN_SAD 15 +#define FF_CMP_CHROMA 256 + + /** + * ME diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int dia_size; + + /** + * amount of previous MV predictors (2a+1 x 2a+1 square) + * - encoding: Set by user. + * - decoding: unused + */ + int last_predictor_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int pre_me; +#endif + + /** + * motion estimation prepass comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_pre_cmp; + + /** + * ME prepass diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int pre_dia_size; + + /** + * subpel ME quality + * - encoding: Set by user. + * - decoding: unused + */ + int me_subpel_quality; + + /** + * maximum motion estimation search range in subpel units + * If 0 then no limit. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_range; + + /** + * slice flags + * - encoding: unused + * - decoding: Set by user. + */ + int slice_flags; +#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) +#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) + + /** + * macroblock decision mode + * - encoding: Set by user. + * - decoding: unused + */ + int mb_decision; +#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp +#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits +#define FF_MB_DECISION_RD 2 ///< rate distortion + + /** + * custom intra quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *intra_matrix; + + /** + * custom inter quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *inter_matrix; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int scenechange_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int noise_reduction; +#endif + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: Set by libavcodec + */ + int intra_dc_precision; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + + /** + * minimum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + +#if FF_API_PRIVATE_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int me_penalty_compensation; +#endif + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int brd_scale; +#endif + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int chromaoffset; +#endif + + /** + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + int mv0_threshold; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_sensitivity; +#endif + + /** + * Chromaticity coordinates of the source primaries. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorPrimaries color_primaries; + + /** + * Color Transfer Characteristic. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by user. + */ + enum AVFieldOrder field_order; + + /* audio only */ + int sample_rate; ///< samples per second + int channels; ///< number of audio channels + + /** + * audio sample format + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< sample format + + /* The following data should not be initialized. */ + /** + * Number of samples per channel in an audio frame. + * + * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame + * except the last must contain exactly frame_size samples per channel. + * May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the + * frame size is not restricted. + * - decoding: may be set by some decoders to indicate constant frame size + */ + int frame_size; + + /** + * Frame counter, set by libavcodec. + * + * - decoding: total number of frames returned from the decoder so far. + * - encoding: total number of frames passed to the encoder so far. + * + * @note the counter is not incremented if encoding/decoding resulted in + * an error. + */ + int frame_number; + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + + /** + * Audio channel layout. + * - encoding: set by user. + * - decoding: set by user, may be overwritten by libavcodec. + */ + uint64_t channel_layout; + + /** + * Request decoder to use this channel layout if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + */ + uint64_t request_channel_layout; + + /** + * Type of service that the audio stream conveys. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVAudioServiceType audio_service_type; + + /** + * desired sample format + * - encoding: Not used. + * - decoding: Set by user. + * Decoder will decode to this format if it can. + */ + enum AVSampleFormat request_sample_fmt; + + /** + * This callback is called at the beginning of each frame to get data + * buffer(s) for it. There may be one contiguous buffer for all the data or + * there may be a buffer per each data plane or anything in between. What + * this means is, you may set however many entries in buf[] you feel necessary. + * Each buffer must be reference-counted using the AVBuffer API (see description + * of buf[] below). + * + * The following fields will be set in the frame before this callback is + * called: + * - format + * - width, height (video only) + * - sample_rate, channel_layout, nb_samples (audio only) + * Their values may differ from the corresponding values in + * AVCodecContext. This callback must use the frame values, not the codec + * context values, to calculate the required buffer size. + * + * This callback must fill the following fields in the frame: + * - data[] + * - linesize[] + * - extended_data: + * * if the data is planar audio with more than 8 channels, then this + * callback must allocate and fill extended_data to contain all pointers + * to all data planes. data[] must hold as many pointers as it can. + * extended_data must be allocated with av_malloc() and will be freed in + * av_frame_unref(). + * * otherwise extended_data must point to data + * - buf[] must contain one or more pointers to AVBufferRef structures. Each of + * the frame's data and extended_data pointers must be contained in these. That + * is, one AVBufferRef for each allocated chunk of memory, not necessarily one + * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), + * and av_buffer_ref(). + * - extended_buf and nb_extended_buf must be allocated with av_malloc() by + * this callback and filled with the extra buffers if there are more + * buffers than buf[] can hold. extended_buf will be freed in + * av_frame_unref(). + * + * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call + * avcodec_default_get_buffer2() instead of providing buffers allocated by + * some other means. + * + * Each data plane must be aligned to the maximum required by the target + * CPU. + * + * @see avcodec_default_get_buffer2() + * + * Video: + * + * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused + * (read and/or written to if it is writable) later by libavcodec. + * + * avcodec_align_dimensions2() should be used to find the required width and + * height, as they normally need to be rounded up to the next multiple of 16. + * + * Some decoders do not support linesizes changing between frames. + * + * If frame multithreading is used and thread_safe_callbacks is set, + * this callback may be called from a different thread, but not from more + * than one at once. Does not need to be reentrant. + * + * @see avcodec_align_dimensions2() + * + * Audio: + * + * Decoders request a buffer of a particular size by setting + * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, + * however, utilize only part of the buffer by setting AVFrame.nb_samples + * to a smaller value in the output frame. + * + * As a convenience, av_samples_get_buffer_size() and + * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() + * functions to find the required data size and to fill data pointers and + * linesize. In AVFrame.linesize, only linesize[0] may be set for audio + * since all planes must be the same size. + * + * @see av_samples_get_buffer_size(), av_samples_fill_arrays() + * + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); + + /** + * If non-zero, the decoded audio and video frames returned from + * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted + * and are valid indefinitely. The caller must free them with + * av_frame_unref() when they are not needed anymore. + * Otherwise, the decoded frames must not be freed by the caller and are + * only valid until the next decode call. + * + * This is always automatically enabled if avcodec_receive_frame() is used. + * + * - encoding: unused + * - decoding: set by the caller before avcodec_open2(). + */ + attribute_deprecated + int refcounted_frames; + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + int rc_override_count; + RcOverride *rc_override; + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: Set by user, may be overwritten by libavcodec. + */ + int64_t rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int64_t rc_min_rate; + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + +#if FF_API_CODER_TYPE +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 +#define FF_CODER_TYPE_RAW 2 +#define FF_CODER_TYPE_RLE 3 + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int coder_type; +#endif /* FF_API_CODER_TYPE */ + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int context_model; +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_factor; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_exp; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_cmp; +#endif /* FF_API_PRIVATE_OPT */ + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int min_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int max_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int64_t timecode_frame_start; +#endif + +#if FF_API_RTP_CALLBACK + /** + * @deprecated unused + */ + /* The RTP callback: This function is called */ + /* every time the encoder has a packet to send. */ + /* It depends on the encoder if the data starts */ + /* with a Start Code (it should). H.263 does. */ + /* mb_nb contains the number of macroblocks */ + /* encoded in the RTP payload. */ + attribute_deprecated + void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int rtp_payload_size; /* The size of the RTP payload: the coder will */ + /* do its best to deliver a chunk with size */ + /* below rtp_payload_size, the chunk will start */ + /* with a start code on some codecs like H.263. */ + /* This doesn't take account of any particular */ + /* headers inside the transmitted RTP payload. */ +#endif + +#if FF_API_STAT_BITS + /* statistics, used for 2-pass encoding */ + attribute_deprecated + int mv_bits; + attribute_deprecated + int header_bits; + attribute_deprecated + int i_tex_bits; + attribute_deprecated + int p_tex_bits; + attribute_deprecated + int i_count; + attribute_deprecated + int p_count; + attribute_deprecated + int skip_count; + attribute_deprecated + int misc_bits; + + /** @deprecated this field is unused */ + attribute_deprecated + int frame_bits; +#endif + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + int workaround_bugs; +#define FF_BUG_AUTODETECT 1 ///< autodetection +#define FF_BUG_XVID_ILACE 4 +#define FF_BUG_UMP4 8 +#define FF_BUG_NO_PADDING 16 +#define FF_BUG_AMV 32 +#define FF_BUG_QPEL_CHROMA 64 +#define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 +#define FF_BUG_HPEL_CHROMA 2048 +#define FF_BUG_DC_CLIP 4096 +#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. +#define FF_BUG_TRUNCATED 16384 +#define FF_BUG_IEDGE 32768 + + /** + * strictly follow the standard (MPEG-4, ...). + * - encoding: Set by user. + * - decoding: Set by user. + * Setting this to STRICT or higher means the encoder and decoder will + * generally do stupid things, whereas setting it to unofficial or lower + * will mean the encoder might produce output that is not supported by all + * spec-compliant decoders. Decoders don't differentiate between normal, + * unofficial and experimental (that is, they always try to decode things + * when they can) unless they are explicitly asked to behave stupidly + * (=strictly conform to the specs) + */ + int strict_std_compliance; +#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. +#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. +#define FF_COMPLIANCE_NORMAL 0 +#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions +#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + + /** + * error concealment flags + * - encoding: unused + * - decoding: Set by user. + */ + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 +#define FF_EC_FAVOR_INTER 256 + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug; +#define FF_DEBUG_PICT_INFO 1 +#define FF_DEBUG_RC 2 +#define FF_DEBUG_BITSTREAM 4 +#define FF_DEBUG_MB_TYPE 8 +#define FF_DEBUG_QP 16 +#if FF_API_DEBUG_MV +/** + * @deprecated this option does nothing + */ +#define FF_DEBUG_MV 32 +#endif +#define FF_DEBUG_DCT_COEFF 0x00000040 +#define FF_DEBUG_SKIP 0x00000080 +#define FF_DEBUG_STARTCODE 0x00000100 +#define FF_DEBUG_ER 0x00000400 +#define FF_DEBUG_MMCO 0x00000800 +#define FF_DEBUG_BUGS 0x00001000 +#if FF_API_DEBUG_MV +#define FF_DEBUG_VIS_QP 0x00002000 +#define FF_DEBUG_VIS_MB_TYPE 0x00004000 +#endif +#define FF_DEBUG_BUFFERS 0x00008000 +#define FF_DEBUG_THREADS 0x00010000 +#define FF_DEBUG_GREEN_MD 0x00800000 +#define FF_DEBUG_NOMC 0x01000000 + +#if FF_API_DEBUG_MV + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 // visualize forward predicted MVs of P-frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 // visualize forward predicted MVs of B-frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames +#endif + + /** + * Error recognition; may misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + */ + int err_recognition; + +/** + * Verify checksums embedded in the bitstream (could be of either encoded or + * decoded data, depending on the codec) and print an error message on mismatch. + * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the + * decoder returning an error. + */ +#define AV_EF_CRCCHECK (1<<0) +#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations +#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length +#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection + +#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue +#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors +#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors +#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder should not do as an error + + + /** + * opaque 64-bit number (generally a PTS) that will be reordered and + * output in AVFrame.reordered_opaque + * - encoding: Set by libavcodec to the reordered_opaque of the input + * frame corresponding to the last returned packet. Only + * supported by encoders with the + * AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability. + * - decoding: Set by user. + */ + int64_t reordered_opaque; + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + const struct AVHWAccel *hwaccel; + + /** + * Hardware accelerator context. + * For some hardware accelerators, a global context needs to be + * provided by the user. In that case, this holds display-dependent + * data FFmpeg cannot instantiate itself. Please refer to the + * FFmpeg HW accelerator documentation to know how to fill this + * is. e.g. for VA API, this is a struct vaapi_context. + * - encoding: unused + * - decoding: Set by user + */ + void *hwaccel_context; + + /** + * error + * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. + * - decoding: unused + */ + uint64_t error[AV_NUM_DATA_POINTERS]; + + /** + * DCT algorithm, see FF_DCT_* below + * - encoding: Set by user. + * - decoding: unused + */ + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 + + /** + * IDCT algorithm, see FF_IDCT_* below. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#define FF_IDCT_SIMPLEARM 10 +#define FF_IDCT_XVID 14 +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#define FF_IDCT_FAAN 20 +#define FF_IDCT_SIMPLENEON 22 +#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */ +#define FF_IDCT_SIMPLEAUTO 128 + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + +#if FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + +#if FF_API_CODED_FRAME + /** + * the picture in the bitstream + * - encoding: Set by libavcodec. + * - decoding: unused + * + * @deprecated use the quality factor packet side data instead + */ + attribute_deprecated AVFrame *coded_frame; +#endif + + /** + * thread count + * is used to decide how many independent tasks should be passed to execute() + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_count; + + /** + * Which multithreading methods to use. + * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, + * so clients which cannot provide future frames should not use it. + * + * - encoding: Set by user, otherwise the default is used. + * - decoding: Set by user, otherwise the default is used. + */ + int thread_type; +#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once +#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once + + /** + * Which multithreading methods are in use by the codec. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int active_thread_type; + + /** + * Set by the client if its custom get_buffer() callback can be called + * synchronously from another thread, which allows faster multithreaded decoding. + * draw_horiz_band() will be called from other threads regardless of this setting. + * Ignored if the default get_buffer() is used. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_safe_callbacks; + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * @param count the number of things to execute + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. + * @param c context passed also to func + * @param count the number of things to execute + * @param arg2 argument passed unchanged to func + * @param ret return values of executed functions, must have space for "count" values. May be NULL. + * @param func function that will be called count times, with jobnr from 0 to count-1. + * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no + * two instances of func executing at the same time will have the same threadnr. + * @return always 0 currently, but code should handle a future improvement where when any call to func + * returns < 0 no further calls to func may be done and < 0 is returned. + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + + /** + * noise vs. sse weight for the nsse comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int nsse_weight; + + /** + * profile + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int profile; +#define FF_PROFILE_UNKNOWN -99 +#define FF_PROFILE_RESERVED -100 + +#define FF_PROFILE_AAC_MAIN 0 +#define FF_PROFILE_AAC_LOW 1 +#define FF_PROFILE_AAC_SSR 2 +#define FF_PROFILE_AAC_LTP 3 +#define FF_PROFILE_AAC_HE 4 +#define FF_PROFILE_AAC_HE_V2 28 +#define FF_PROFILE_AAC_LD 22 +#define FF_PROFILE_AAC_ELD 38 +#define FF_PROFILE_MPEG2_AAC_LOW 128 +#define FF_PROFILE_MPEG2_AAC_HE 131 + +#define FF_PROFILE_DNXHD 0 +#define FF_PROFILE_DNXHR_LB 1 +#define FF_PROFILE_DNXHR_SQ 2 +#define FF_PROFILE_DNXHR_HQ 3 +#define FF_PROFILE_DNXHR_HQX 4 +#define FF_PROFILE_DNXHR_444 5 + +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 +#define FF_PROFILE_DTS_EXPRESS 70 + +#define FF_PROFILE_MPEG2_422 0 +#define FF_PROFILE_MPEG2_HIGH 1 +#define FF_PROFILE_MPEG2_SS 2 +#define FF_PROFILE_MPEG2_SNR_SCALABLE 3 +#define FF_PROFILE_MPEG2_MAIN 4 +#define FF_PROFILE_MPEG2_SIMPLE 5 + +#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag +#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag + +#define FF_PROFILE_H264_BASELINE 66 +#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED) +#define FF_PROFILE_H264_MAIN 77 +#define FF_PROFILE_H264_EXTENDED 88 +#define FF_PROFILE_H264_HIGH 100 +#define FF_PROFILE_H264_HIGH_10 110 +#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 +#define FF_PROFILE_H264_HIGH_422 122 +#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_STEREO_HIGH 128 +#define FF_PROFILE_H264_HIGH_444 144 +#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 +#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_CAVLC_444 44 + +#define FF_PROFILE_VC1_SIMPLE 0 +#define FF_PROFILE_VC1_MAIN 1 +#define FF_PROFILE_VC1_COMPLEX 2 +#define FF_PROFILE_VC1_ADVANCED 3 + +#define FF_PROFILE_MPEG4_SIMPLE 0 +#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1 +#define FF_PROFILE_MPEG4_CORE 2 +#define FF_PROFILE_MPEG4_MAIN 3 +#define FF_PROFILE_MPEG4_N_BIT 4 +#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5 +#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 +#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 +#define FF_PROFILE_MPEG4_HYBRID 8 +#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 +#define FF_PROFILE_MPEG4_CORE_SCALABLE 10 +#define FF_PROFILE_MPEG4_ADVANCED_CODING 11 +#define FF_PROFILE_MPEG4_ADVANCED_CORE 12 +#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 +#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 +#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 + +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 +#define FF_PROFILE_JPEG2000_DCINEMA_2K 3 +#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 + +#define FF_PROFILE_VP9_0 0 +#define FF_PROFILE_VP9_1 1 +#define FF_PROFILE_VP9_2 2 +#define FF_PROFILE_VP9_3 3 + +#define FF_PROFILE_HEVC_MAIN 1 +#define FF_PROFILE_HEVC_MAIN_10 2 +#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define FF_PROFILE_HEVC_REXT 4 + +#define FF_PROFILE_AV1_MAIN 0 +#define FF_PROFILE_AV1_HIGH 1 +#define FF_PROFILE_AV1_PROFESSIONAL 2 + +#define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0 +#define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1 +#define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2 +#define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3 +#define FF_PROFILE_MJPEG_JPEG_LS 0xf7 + +#define FF_PROFILE_SBC_MSBC 1 + +#define FF_PROFILE_PRORES_PROXY 0 +#define FF_PROFILE_PRORES_LT 1 +#define FF_PROFILE_PRORES_STANDARD 2 +#define FF_PROFILE_PRORES_HQ 3 +#define FF_PROFILE_PRORES_4444 4 +#define FF_PROFILE_PRORES_XQ 5 + +#define FF_PROFILE_ARIB_PROFILE_A 0 +#define FF_PROFILE_ARIB_PROFILE_C 1 + + /** + * level + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int level; +#define FF_LEVEL_UNKNOWN -99 + + /** + * Skip loop filtering for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_loop_filter; + + /** + * Skip IDCT/dequantization for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_idct; + + /** + * Skip decoding for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_frame; + + /** + * Header containing style information for text subtitles. + * For SUBTITLE_ASS subtitle type, it should contain the whole ASS + * [Script Info] and [V4+ Styles] section, plus the [Events] line and + * the Format line following. It shouldn't include any Dialogue line. + * - encoding: Set/allocated/freed by user (before avcodec_open2()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; + +#if FF_API_VBV_DELAY + /** + * VBV delay coded in the last frame (in periods of a 27 MHz clock). + * Used for compliant TS muxing. + * - encoding: Set by libavcodec. + * - decoding: unused. + * @deprecated this value is now exported as a part of + * AV_PKT_DATA_CPB_PROPERTIES packet side data + */ + attribute_deprecated + uint64_t vbv_delay; +#endif + +#if FF_API_SIDEDATA_ONLY_PKT + /** + * Encoding only and set by default. Allow encoders to output packets + * that do not contain any encoded data, only side data. + * + * Some encoders need to output such packets, e.g. to update some stream + * parameters at the end of encoding. + * + * @deprecated this field disables the default behaviour and + * it is kept only for compatibility. + */ + attribute_deprecated + int side_data_only_packets; +#endif + + /** + * Audio only. The number of "priming" samples (padding) inserted by the + * encoder at the beginning of the audio. I.e. this number of leading + * decoded samples must be discarded by the caller to get the original audio + * without leading padding. + * + * - decoding: unused + * - encoding: Set by libavcodec. The timestamps on the output packets are + * adjusted by the encoder so that they always refer to the + * first sample of the data actually contained in the packet, + * including any added padding. E.g. if the timebase is + * 1/samplerate and the timestamp of the first input sample is + * 0, the timestamp of the first output packet will be + * -initial_padding. + */ + int initial_padding; + + /** + * - decoding: For codecs that store a framerate value in the compressed + * bitstream, the decoder may export it here. { 0, 1} when + * unknown. + * - encoding: May be used to signal the framerate of CFR content to an + * encoder. + */ + AVRational framerate; + + /** + * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. + * - encoding: unused. + * - decoding: Set by libavcodec before calling get_format() + */ + enum AVPixelFormat sw_pix_fmt; + + /** + * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. + * - encoding unused. + * - decoding set by user. + */ + AVRational pkt_timebase; + + /** + * AVCodecDescriptor + * - encoding: unused. + * - decoding: set by libavcodec. + */ + const AVCodecDescriptor *codec_descriptor; + +#if !FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + + /** + * Current statistics for PTS correction. + * - decoding: maintained and used by libavcodec, not intended to be used by user apps + * - encoding: unused + */ + int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far + int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far + int64_t pts_correction_last_pts; /// PTS of the last frame + int64_t pts_correction_last_dts; /// DTS of the last frame + + /** + * Character encoding of the input subtitles file. + * - decoding: set by user + * - encoding: unused + */ + char *sub_charenc; + + /** + * Subtitles character encoding mode. Formats or codecs might be adjusting + * this setting (if they are doing the conversion themselves for instance). + * - decoding: set by libavcodec + * - encoding: unused + */ + int sub_charenc_mode; +#define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) +#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself +#define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv +#define FF_SUB_CHARENC_MODE_IGNORE 2 ///< neither convert the subtitles, nor check them for valid UTF-8 + + /** + * Skip processing alpha if supported by codec. + * Note that if the format uses pre-multiplied alpha (common with VP6, + * and recommended due to better video quality/compression) + * the image will look as if alpha-blended onto a black background. + * However for formats that do not use pre-multiplied alpha + * there might be serious artefacts (though e.g. libswscale currently + * assumes pre-multiplied alpha anyway). + * + * - decoding: set by user + * - encoding: unused + */ + int skip_alpha; + + /** + * Number of samples to skip after a discontinuity + * - decoding: unused + * - encoding: set by libavcodec + */ + int seek_preroll; + +#if !FF_API_DEBUG_MV + /** + * debug motion vectors + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames +#endif + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: unused. + */ + uint16_t *chroma_intra_matrix; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - encoding: Set by user. + * - decoding: Set by user. + */ + uint8_t *dump_separator; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * Properties of the stream that gets decoded + * - encoding: unused + * - decoding: set by libavcodec + */ + unsigned properties; +#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 +#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 + + /** + * Additional data associated with the entire coded stream. + * + * - decoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). + */ + AVPacketSideData *coded_side_data; + int nb_coded_side_data; + + /** + * A reference to the AVHWFramesContext describing the input (for encoding) + * or output (decoding) frames. The reference is set by the caller and + * afterwards owned (and freed) by libavcodec - it should never be read by + * the caller after being set. + * + * - decoding: This field should be set by the caller from the get_format() + * callback. The previous reference (if any) will always be + * unreffed by libavcodec before the get_format() call. + * + * If the default get_buffer2() is used with a hwaccel pixel + * format, then this AVHWFramesContext will be used for + * allocating the frame buffers. + * + * - encoding: For hardware encoders configured to use a hwaccel pixel + * format, this field should be set by the caller to a reference + * to the AVHWFramesContext describing input frames. + * AVHWFramesContext.format must be equal to + * AVCodecContext.pix_fmt. + * + * This field should be set before avcodec_open2() is called. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Control the form of AVSubtitle.rects[N]->ass + * - decoding: set by user + * - encoding: unused + */ + int sub_text_format; +#define FF_SUB_TEXT_FMT_ASS 0 +#if FF_API_ASS_TIMING +#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1 +#endif + + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + * + * - decoding: unused + * - encoding: unused + */ + int trailing_padding; + + /** + * The number of pixels per image to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + int64_t max_pixels; + + /** + * A reference to the AVHWDeviceContext describing the device which will + * be used by a hardware encoder/decoder. The reference is set by the + * caller and afterwards owned (and freed) by libavcodec. + * + * This should be used if either the codec device does not require + * hardware frames or any that are used are to be allocated internally by + * libavcodec. If the user wishes to supply any of the frames used as + * encoder input or decoder output then hw_frames_ctx should be used + * instead. When hw_frames_ctx is set in get_format() for a decoder, this + * field will be ignored while decoding the associated stream segment, but + * may again be used on a following one after another get_format() call. + * + * For both encoders and decoders this field should be set before + * avcodec_open2() is called and must not be written to thereafter. + * + * Note that some decoders may require this field to be set initially in + * order to support hw_frames_ctx at all - in that case, all frames + * contexts used must be created on the same device. + */ + AVBufferRef *hw_device_ctx; + + /** + * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated + * decoding (if active). + * - encoding: unused + * - decoding: Set by user (either before avcodec_open2(), or in the + * AVCodecContext.get_format callback) + */ + int hwaccel_flags; + + /** + * Video decoding only. Certain video codecs support cropping, meaning that + * only a sub-rectangle of the decoded frame is intended for display. This + * option controls how cropping is handled by libavcodec. + * + * When set to 1 (the default), libavcodec will apply cropping internally. + * I.e. it will modify the output frame width/height fields and offset the + * data pointers (only by as much as possible while preserving alignment, or + * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that + * the frames output by the decoder refer only to the cropped area. The + * crop_* fields of the output frames will be zero. + * + * When set to 0, the width/height fields of the output frames will be set + * to the coded dimensions and the crop_* fields will describe the cropping + * rectangle. Applying the cropping is left to the caller. + * + * @warning When hardware acceleration with opaque output frames is used, + * libavcodec is unable to apply cropping from the top/left border. + * + * @note when this option is set to zero, the width/height fields of the + * AVCodecContext and output AVFrames have different meanings. The codec + * context fields store display dimensions (with the coded dimensions in + * coded_width/height), while the frame fields store the coded dimensions + * (with the display dimensions being determined by the crop_* fields). + */ + int apply_cropping; + + /* + * Video decoding only. Sets the number of extra hardware frames which + * the decoder will allocate for use by the caller. This must be set + * before avcodec_open2() is called. + * + * Some hardware decoders require all frames that they will use for + * output to be defined in advance before decoding starts. For such + * decoders, the hardware frame pool must therefore be of a fixed size. + * The extra frames set here are on top of any number that the decoder + * needs internally in order to operate normally (for example, frames + * used as reference pictures). + */ + int extra_hw_frames; + + /** + * The percentage of damaged samples to discard a frame. + * + * - decoding: set by user + * - encoding: unused + */ + int discard_damaged_percentage; +} AVCodecContext; + +#if FF_API_CODEC_GET_SET +/** + * Accessors for some AVCodecContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); + +attribute_deprecated +const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); + +attribute_deprecated +unsigned av_codec_get_codec_properties(const AVCodecContext *avctx); + +#if FF_API_LOWRES +attribute_deprecated +int av_codec_get_lowres(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_lowres(AVCodecContext *avctx, int val); +#endif + +attribute_deprecated +int av_codec_get_seek_preroll(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); + +attribute_deprecated +uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val); +#endif + +/** + * AVProfile. + */ +typedef struct AVProfile { + int profile; + const char *name; ///< short name for the profile +} AVProfile; + +enum { + /** + * The codec supports this format via the hw_device_ctx interface. + * + * When selecting this format, AVCodecContext.hw_device_ctx should + * have been set to a device of the specified type before calling + * avcodec_open2(). + */ + AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01, + /** + * The codec supports this format via the hw_frames_ctx interface. + * + * When selecting this format for a decoder, + * AVCodecContext.hw_frames_ctx should be set to a suitable frames + * context inside the get_format() callback. The frames context + * must have been created on a device of the specified type. + */ + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02, + /** + * The codec supports this format by some internal method. + * + * This format can be selected without any additional configuration - + * no device or frames context is required. + */ + AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04, + /** + * The codec supports this format by some ad-hoc method. + * + * Additional settings and/or function calls are required. See the + * codec-specific documentation for details. (Methods requiring + * this sort of configuration are deprecated and others should be + * used in preference.) + */ + AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08, +}; + +typedef struct AVCodecHWConfig { + /** + * A hardware pixel format which the codec can use. + */ + enum AVPixelFormat pix_fmt; + /** + * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible + * setup methods which can be used with this configuration. + */ + int methods; + /** + * The device type associated with the configuration. + * + * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and + * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused. + */ + enum AVHWDeviceType device_type; +} AVCodecHWConfig; + +typedef struct AVCodecDefault AVCodecDefault; + +struct AVSubtitle; + +/** + * AVCodec. + */ +typedef struct AVCodec { + /** + * Name of the codec implementation. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + * This is the primary way to find a codec from the user perspective. + */ + const char *name; + /** + * Descriptive name for the codec, meant to be more human readable than name. + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *long_name; + enum AVMediaType type; + enum AVCodecID id; + /** + * Codec capabilities. + * see AV_CODEC_CAP_* + */ + int capabilities; + const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} + const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 + const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 + const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 + const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder + const AVClass *priv_class; ///< AVClass for the private context + const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} + + /** + * Group name of the codec implementation. + * This is a short symbolic name of the wrapper backing this codec. A + * wrapper uses some kind of external implementation for the codec, such + * as an external library, or a codec implementation provided by the OS or + * the hardware. + * If this field is NULL, this is a builtin, libavcodec native codec. + * If non-NULL, this will be the suffix in AVCodec.name in most cases + * (usually AVCodec.name will be of the form "_"). + */ + const char *wrapper_name; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int priv_data_size; + struct AVCodec *next; + /** + * @name Frame-level threading support functions + * @{ + */ + /** + * If defined, called on thread contexts when they are created. + * If the codec allocates writable tables in init(), re-allocate them here. + * priv_data will be set to a copy of the original. + */ + int (*init_thread_copy)(AVCodecContext *); + /** + * Copy necessary context variables from a previous thread context to the current one. + * If not defined, the next thread will start automatically; otherwise, the codec + * must call ff_thread_finish_setup(). + * + * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. + */ + int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); + /** @} */ + + /** + * Private codec-specific defaults. + */ + const AVCodecDefault *defaults; + + /** + * Initialize codec static data, called from avcodec_register(). + * + * This is not intended for time consuming operations as it is + * run for every codec regardless of that codec being used. + */ + void (*init_static_data)(struct AVCodec *codec); + + int (*init)(AVCodecContext *); + int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, + const struct AVSubtitle *sub); + /** + * Encode data to an AVPacket. + * + * @param avctx codec context + * @param avpkt output AVPacket (may contain a user-provided buffer) + * @param[in] frame AVFrame containing the raw data to be encoded + * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a + * non-empty packet was returned in avpkt. + * @return 0 on success, negative error code on failure + */ + int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, + int *got_packet_ptr); + int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); + int (*close)(AVCodecContext *); + /** + * Encode API with decoupled packet/frame dataflow. The API is the + * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except + * that: + * - never called if the codec is closed or the wrong type, + * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent, + * - only one drain frame is ever passed down, + */ + int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); + int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); + + /** + * Decode API with decoupled packet/frame dataflow. This function is called + * to get one output frame. It should call ff_decode_get_packet() to obtain + * input data. + */ + int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); + /** + * Flush buffers. + * Will be called when seeking + */ + void (*flush)(AVCodecContext *); + /** + * Internal codec capabilities. + * See FF_CODEC_CAP_* in internal.h + */ + int caps_internal; + + /** + * Decoding only, a comma-separated list of bitstream filters to apply to + * packets before decoding. + */ + const char *bsfs; + + /** + * Array of pointers to hardware configurations supported by the codec, + * or NULL if no hardware supported. The array is terminated by a NULL + * pointer. + * + * The user can only access this field via avcodec_get_hw_config(). + */ + const struct AVCodecHWConfigInternal **hw_configs; +} AVCodec; + +#if FF_API_CODEC_GET_SET +attribute_deprecated +int av_codec_get_max_lowres(const AVCodec *codec); +#endif + +struct MpegEncContext; + +/** + * Retrieve supported hardware configurations for a codec. + * + * Values of index from zero to some maximum return the indexed configuration + * descriptor; all other values return NULL. If the codec does not support + * any hardware configurations then it will always return NULL. + */ +const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index); + +/** + * @defgroup lavc_hwaccel AVHWAccel + * + * @note Nothing in this structure should be accessed by the user. At some + * point in future it will not be externally visible at all. + * + * @{ + */ +typedef struct AVHWAccel { + /** + * Name of the hardware accelerated codec. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + */ + const char *name; + + /** + * Type of codec implemented by the hardware accelerator. + * + * See AVMEDIA_TYPE_xxx + */ + enum AVMediaType type; + + /** + * Codec implemented by the hardware accelerator. + * + * See AV_CODEC_ID_xxx + */ + enum AVCodecID id; + + /** + * Supported pixel format. + * + * Only hardware accelerated formats are supported here. + */ + enum AVPixelFormat pix_fmt; + + /** + * Hardware accelerated codec capabilities. + * see AV_HWACCEL_CODEC_CAP_* + */ + int capabilities; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Allocate a custom buffer + */ + int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame); + + /** + * Called at the beginning of each frame or field picture. + * + * Meaningful frame information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * Note that buf can be NULL along with buf_size set to 0. + * Otherwise, this means the whole frame is available at this point. + * + * @param avctx the codec context + * @param buf the frame data buffer base + * @param buf_size the size of the frame in bytes + * @return zero if successful, a negative value otherwise + */ + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for parameter data (SPS/PPS/VPS etc). + * + * Useful for hardware decoders which keep persistent state about the + * video parameters, and need to receive any changes to update that state. + * + * @param avctx the codec context + * @param type the nal unit type + * @param buf the nal unit data buffer + * @param buf_size the size of the nal unit in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for each slice. + * + * Meaningful slice information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * The only exception is XvMC, that works on MB level. + * + * @param avctx the codec context + * @param buf the slice data buffer base + * @param buf_size the size of the slice in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Called at the end of each frame or field picture. + * + * The whole picture is parsed at this point and can now be sent + * to the hardware accelerator. This function is mandatory. + * + * @param avctx the codec context + * @return zero if successful, a negative value otherwise + */ + int (*end_frame)(AVCodecContext *avctx); + + /** + * Size of per-frame hardware accelerator private data. + * + * Private data is allocated with av_mallocz() before + * AVCodecContext.get_buffer() and deallocated after + * AVCodecContext.release_buffer(). + */ + int frame_priv_data_size; + + /** + * Called for every Macroblock in a slice. + * + * XvMC uses it to replace the ff_mpv_reconstruct_mb(). + * Instead of decoding to raw picture, MB parameters are + * stored in an array provided by the video driver. + * + * @param s the mpeg context + */ + void (*decode_mb)(struct MpegEncContext *s); + + /** + * Initialize the hwaccel private data. + * + * This will be called from ff_get_format(), after hwaccel and + * hwaccel_context are set and the hwaccel private data in AVCodecInternal + * is allocated. + */ + int (*init)(AVCodecContext *avctx); + + /** + * Uninitialize the hwaccel private data. + * + * This will be called from get_format() or avcodec_close(), after hwaccel + * and hwaccel_context are already uninitialized. + */ + int (*uninit)(AVCodecContext *avctx); + + /** + * Size of the private data to allocate in + * AVCodecInternal.hwaccel_priv_data. + */ + int priv_data_size; + + /** + * Internal hwaccel capabilities. + */ + int caps_internal; + + /** + * Fill the given hw_frames context with current codec parameters. Called + * from get_format. Refer to avcodec_get_hw_frames_parameters() for + * details. + * + * This CAN be called before AVHWAccel.init is called, and you must assume + * that avctx->hwaccel_priv_data is invalid. + */ + int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); +} AVHWAccel; + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 + +/** + * Hardware acceleration should be used for decoding even if the codec level + * used is unknown or higher than the maximum supported level reported by the + * hardware driver. + * + * It's generally a good idea to pass this flag unless you have a specific + * reason not to, as hardware tends to under-report supported levels. + */ +#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0) + +/** + * Hardware acceleration can output YUV pixel formats with a different chroma + * sampling than 4:2:0 and/or other than 8 bits per component. + */ +#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) + +/** + * Hardware acceleration should still be attempted for decoding when the + * codec profile does not match the reported capabilities of the hardware. + * + * For example, this can be used to try to decode baseline profile H.264 + * streams in hardware - it will often succeed, because many streams marked + * as baseline profile actually conform to constrained baseline profile. + * + * @warning If the stream is actually not supported then the behaviour is + * undefined, and may include returning entirely incorrect output + * while indicating success. + */ +#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @defgroup lavc_picture AVPicture + * + * Functions for working with AVPicture + * @{ + */ + +/** + * Picture data structure. + * + * Up to four components can be stored into it, the last component is + * alpha. + * @deprecated use AVFrame or imgutils functions instead + */ +typedef struct AVPicture { + attribute_deprecated + uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes + attribute_deprecated + int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line +} AVPicture; + +/** + * @} + */ +#endif + +enum AVSubtitleType { + SUBTITLE_NONE, + + SUBTITLE_BITMAP, ///< A bitmap, pict will be set + + /** + * Plain text, the text field must be set by the decoder and is + * authoritative. ass and pict fields may contain approximations. + */ + SUBTITLE_TEXT, + + /** + * Formatted text, the ass field must be set by the decoder and is + * authoritative. pict and text fields may contain approximations. + */ + SUBTITLE_ASS, +}; + +#define AV_SUBTITLE_FLAG_FORCED 0x00000001 + +typedef struct AVSubtitleRect { + int x; ///< top left corner of pict, undefined when pict is not set + int y; ///< top left corner of pict, undefined when pict is not set + int w; ///< width of pict, undefined when pict is not set + int h; ///< height of pict, undefined when pict is not set + int nb_colors; ///< number of colors in pict, undefined when pict is not set + +#if FF_API_AVPICTURE + /** + * @deprecated unused + */ + attribute_deprecated + AVPicture pict; +#endif + /** + * data+linesize for the bitmap of this subtitle. + * Can be set for text/ass as well once they are rendered. + */ + uint8_t *data[4]; + int linesize[4]; + + enum AVSubtitleType type; + + char *text; ///< 0 terminated plain UTF-8 text + + /** + * 0 terminated ASS/SSA compatible event line. + * The presentation of this is unaffected by the other values in this + * struct. + */ + char *ass; + + int flags; +} AVSubtitleRect; + +typedef struct AVSubtitle { + uint16_t format; /* 0 = graphics */ + uint32_t start_display_time; /* relative to packet pts, in ms */ + uint32_t end_display_time; /* relative to packet pts, in ms */ + unsigned num_rects; + AVSubtitleRect **rects; + int64_t pts; ///< Same as packet pts, in AV_TIME_BASE +} AVSubtitle; + +/** + * This struct describes the properties of an encoded stream. + * + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must + * be allocated with avcodec_parameters_alloc() and freed with + * avcodec_parameters_free(). + */ +typedef struct AVCodecParameters { + /** + * General type of the encoded data. + */ + enum AVMediaType codec_type; + /** + * Specific type of the encoded data (the codec used). + */ + enum AVCodecID codec_id; + /** + * Additional information about the codec (corresponds to the AVI FOURCC). + */ + uint32_t codec_tag; + + /** + * Extra binary data needed for initializing the decoder, codec-dependent. + * + * Must be allocated with av_malloc() and will be freed by + * avcodec_parameters_free(). The allocated size of extradata must be at + * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding + * bytes zeroed. + */ + uint8_t *extradata; + /** + * Size of the extradata content in bytes. + */ + int extradata_size; + + /** + * - video: the pixel format, the value corresponds to enum AVPixelFormat. + * - audio: the sample format, the value corresponds to enum AVSampleFormat. + */ + int format; + + /** + * The average bitrate of the encoded data (in bits per second). + */ + int64_t bit_rate; + + /** + * The number of bits per sample in the codedwords. + * + * This is basically the bitrate per sample. It is mandatory for a bunch of + * formats to actually decode them. It's the number of bits for one sample in + * the actual coded bitstream. + * + * This could be for example 4 for ADPCM + * For PCM formats this matches bits_per_raw_sample + * Can be 0 + */ + int bits_per_coded_sample; + + /** + * This is the number of valid bits in each output sample. If the + * sample format has more bits, the least significant bits are additional + * padding bits, which are always 0. Use right shifts to reduce the sample + * to its actual size. For example, audio formats with 24 bit samples will + * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. + * To get the original sample use "(int32_t)sample >> 8"." + * + * For ADPCM this might be 12 or 16 or similar + * Can be 0 + */ + int bits_per_raw_sample; + + /** + * Codec-specific bitstream restrictions that the stream conforms to. + */ + int profile; + int level; + + /** + * Video only. The dimensions of the video frame in pixels. + */ + int width; + int height; + + /** + * Video only. The aspect ratio (width / height) which a single pixel + * should have when displayed. + * + * When the aspect ratio is unknown / undefined, the numerator should be + * set to 0 (the denominator may have any value). + */ + AVRational sample_aspect_ratio; + + /** + * Video only. The order of the fields in interlaced video. + */ + enum AVFieldOrder field_order; + + /** + * Video only. Additional colorspace characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + enum AVChromaLocation chroma_location; + + /** + * Video only. Number of delayed frames. + */ + int video_delay; + + /** + * Audio only. The channel layout bitmask. May be 0 if the channel layout is + * unknown or unspecified, otherwise the number of bits set must be equal to + * the channels field. + */ + uint64_t channel_layout; + /** + * Audio only. The number of audio channels. + */ + int channels; + /** + * Audio only. The number of audio samples per second. + */ + int sample_rate; + /** + * Audio only. The number of bytes per coded audio frame, required by some + * formats. + * + * Corresponds to nBlockAlign in WAVEFORMATEX. + */ + int block_align; + /** + * Audio only. Audio frame size, if known. Required by some formats to be static. + */ + int frame_size; + + /** + * Audio only. The amount of padding (in samples) inserted by the encoder at + * the beginning of the audio. I.e. this number of leading decoded samples + * must be discarded by the caller to get the original audio without leading + * padding. + */ + int initial_padding; + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + */ + int trailing_padding; + /** + * Audio only. Number of samples to skip after a discontinuity. + */ + int seek_preroll; +} AVCodecParameters; + +/** + * Iterate over all registered codecs. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec or NULL when the iteration is + * finished + */ +const AVCodec *av_codec_iterate(void **opaque); + +#if FF_API_NEXT +/** + * If c is NULL, returns the first registered codec, + * if c is non-NULL, returns the next registered codec after c, + * or NULL if c is the last one. + */ +attribute_deprecated +AVCodec *av_codec_next(const AVCodec *c); +#endif + +/** + * Return the LIBAVCODEC_VERSION_INT constant. + */ +unsigned avcodec_version(void); + +/** + * Return the libavcodec build-time configuration. + */ +const char *avcodec_configuration(void); + +/** + * Return the libavcodec license. + */ +const char *avcodec_license(void); + +#if FF_API_NEXT +/** + * Register the codec codec and initialize libavcodec. + * + * @warning either this function or avcodec_register_all() must be called + * before any other libavcodec functions. + * + * @see avcodec_register_all() + */ +attribute_deprecated +void avcodec_register(AVCodec *codec); + +/** + * Register all the codecs, parsers and bitstream filters which were enabled at + * configuration time. If you do not call this function you can select exactly + * which formats you want to support, by using the individual registration + * functions. + * + * @see avcodec_register + * @see av_register_codec_parser + * @see av_register_bitstream_filter + */ +attribute_deprecated +void avcodec_register_all(void); +#endif + +/** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct should be freed with avcodec_free_context(). + * + * @param codec if non-NULL, allocate private data and initialize defaults + * for the given codec. It is illegal to then call avcodec_open2() + * with a different codec. + * If NULL, then the codec-specific defaults won't be initialized, + * which may result in suboptimal default settings (this is + * important mainly for encoders, e.g. libx264). + * + * @return An AVCodecContext filled with default values or NULL on failure. + */ +AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); + +/** + * Free the codec context and everything associated with it and write NULL to + * the provided pointer. + */ +void avcodec_free_context(AVCodecContext **avctx); + +#if FF_API_GET_CONTEXT_DEFAULTS +/** + * @deprecated This function should not be used, as closing and opening a codec + * context multiple time is not supported. A new codec context should be + * allocated for each new use. + */ +int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); +#endif + +/** + * Get the AVClass for AVCodecContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_class(void); + +#if FF_API_COPY_CONTEXT +/** + * Get the AVClass for AVFrame. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_frame_class(void); + +/** + * Get the AVClass for AVSubtitleRect. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_subtitle_rect_class(void); + +/** + * Copy the settings of the source AVCodecContext into the destination + * AVCodecContext. The resulting destination codec context will be + * unopened, i.e. you are required to call avcodec_open2() before you + * can use this AVCodecContext to decode/encode video/audio data. + * + * @param dest target codec context, should be initialized with + * avcodec_alloc_context3(NULL), but otherwise uninitialized + * @param src source codec context + * @return AVERROR() on error (e.g. memory allocation error), 0 on success + * + * @deprecated The semantics of this function are ill-defined and it should not + * be used. If you need to transfer the stream parameters from one codec context + * to another, use an intermediate AVCodecParameters instance and the + * avcodec_parameters_from_context() / avcodec_parameters_to_context() + * functions. + */ +attribute_deprecated +int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); +#endif + +/** + * Allocate a new AVCodecParameters and set its fields to default values + * (unknown/invalid/0). The returned struct must be freed with + * avcodec_parameters_free(). + */ +AVCodecParameters *avcodec_parameters_alloc(void); + +/** + * Free an AVCodecParameters instance and everything associated with it and + * write NULL to the supplied pointer. + */ +void avcodec_parameters_free(AVCodecParameters **par); + +/** + * Copy the contents of src to dst. Any allocated fields in dst are freed and + * replaced with newly allocated duplicates of the corresponding fields in src. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); + +/** + * Fill the parameters struct based on the values from the supplied codec + * context. Any allocated fields in par are freed and replaced with duplicates + * of the corresponding fields in codec. + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int avcodec_parameters_from_context(AVCodecParameters *par, + const AVCodecContext *codec); + +/** + * Fill the codec context based on the values from the supplied codec + * parameters. Any allocated fields in codec that have a corresponding field in + * par are freed and replaced with duplicates of the corresponding field in par. + * Fields in codec that do not have a counterpart in par are not touched. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_to_context(AVCodecContext *codec, + const AVCodecParameters *par); + +/** + * Initialize the AVCodecContext to use the given AVCodec. Prior to using this + * function the context has to be allocated with avcodec_alloc_context3(). + * + * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), + * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for + * retrieving a codec. + * + * @warning This function is not thread safe! + * + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). + * + * @code + * avcodec_register_all(); + * av_dict_set(&opts, "b", "2.5M", 0); + * codec = avcodec_find_decoder(AV_CODEC_ID_H264); + * if (!codec) + * exit(1); + * + * context = avcodec_alloc_context3(codec); + * + * if (avcodec_open2(context, codec, opts) < 0) + * exit(1); + * @endcode + * + * @param avctx The context to initialize. + * @param codec The codec to open this context for. If a non-NULL codec has been + * previously passed to avcodec_alloc_context3() or + * for this context, then this parameter MUST be either NULL or + * equal to the previously passed codec. + * @param options A dictionary filled with AVCodecContext and codec-private options. + * On return this object will be filled with options that were not found. + * + * @return zero on success, a negative value on error + * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), + * av_dict_set(), av_opt_find(). + */ +int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); + +/** + * Close a given AVCodecContext and free all the data associated with it + * (but not the AVCodecContext itself). + * + * Calling this function on an AVCodecContext that hasn't been opened will free + * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL + * codec. Subsequent calls will do nothing. + * + * @note Do not use this function. Use avcodec_free_context() to destroy a + * codec context (either open or closed). Opening and closing a codec context + * multiple times is not supported anymore -- use multiple codec contexts + * instead. + */ +int avcodec_close(AVCodecContext *avctx); + +/** + * Free all allocated data in the given subtitle struct. + * + * @param sub AVSubtitle to free. + */ +void avsubtitle_free(AVSubtitle *sub); + +/** + * @} + */ + +/** + * @addtogroup lavc_packet + * @{ + */ + +/** + * Allocate an AVPacket and set its fields to default values. The resulting + * struct must be freed using av_packet_free(). + * + * @return An AVPacket filled with default values or NULL on failure. + * + * @note this only allocates the AVPacket itself, not the data buffers. Those + * must be allocated through other means such as av_new_packet. + * + * @see av_new_packet + */ +AVPacket *av_packet_alloc(void); + +/** + * Create a new packet that references the same data as src. + * + * This is a shortcut for av_packet_alloc()+av_packet_ref(). + * + * @return newly created AVPacket on success, NULL on error. + * + * @see av_packet_alloc + * @see av_packet_ref + */ +AVPacket *av_packet_clone(const AVPacket *src); + +/** + * Free the packet, if the packet is reference counted, it will be + * unreferenced first. + * + * @param pkt packet to be freed. The pointer will be set to NULL. + * @note passing NULL is a no-op. + */ +void av_packet_free(AVPacket **pkt); + +/** + * Initialize optional fields of a packet with default values. + * + * Note, this does not touch the data and size members, which have to be + * initialized separately. + * + * @param pkt packet + */ +void av_init_packet(AVPacket *pkt); + +/** + * Allocate the payload of a packet and initialize its fields with + * default values. + * + * @param pkt packet + * @param size wanted payload size + * @return 0 if OK, AVERROR_xxx otherwise + */ +int av_new_packet(AVPacket *pkt, int size); + +/** + * Reduce packet size, correctly zeroing padding + * + * @param pkt packet + * @param size new size + */ +void av_shrink_packet(AVPacket *pkt, int size); + +/** + * Increase packet size, correctly zeroing padding + * + * @param pkt packet + * @param grow_by number of bytes by which to increase the size of the packet + */ +int av_grow_packet(AVPacket *pkt, int grow_by); + +/** + * Initialize a reference-counted packet from av_malloc()ed data. + * + * @param pkt packet to be initialized. This function will set the data, size, + * and buf fields, all others are left untouched. + * @param data Data allocated by av_malloc() to be used as packet data. If this + * function returns successfully, the data is owned by the underlying AVBuffer. + * The caller may not access the data through other means. + * @param size size of data in bytes, without the padding. I.e. the full buffer + * size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); + +#if FF_API_AVPACKET_OLD_API +/** + * @warning This is a hack - the packet memory allocation stuff is broken. The + * packet is allocated if it was not really allocated. + * + * @deprecated Use av_packet_ref or av_packet_make_refcounted + */ +attribute_deprecated +int av_dup_packet(AVPacket *pkt); +/** + * Copy packet, including contents + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_ref + */ +attribute_deprecated +int av_copy_packet(AVPacket *dst, const AVPacket *src); + +/** + * Copy packet side data + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_copy_props + */ +attribute_deprecated +int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); + +/** + * Free a packet. + * + * @deprecated Use av_packet_unref + * + * @param pkt packet to free + */ +attribute_deprecated +void av_free_packet(AVPacket *pkt); +#endif +/** + * Allocate new information of a packet. + * + * @param pkt packet + * @param type side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Wrap an existing array as a packet side data. + * + * @param pkt packet + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * pkt. + * @param size side information size + * @return a non-negative number on success, a negative AVERROR code on + * failure. On failure, the packet is unchanged and the data remains + * owned by the caller. + */ +int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Shrink the already allocated side data buffer + * + * @param pkt packet + * @param type side information type + * @param size new side information size + * @return 0 on success, < 0 on failure + */ +int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Get side information from packet. + * + * @param pkt packet + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, + int *size); + +#if FF_API_MERGE_SD_API +attribute_deprecated +int av_packet_merge_side_data(AVPacket *pkt); + +attribute_deprecated +int av_packet_split_side_data(AVPacket *pkt); +#endif + +const char *av_packet_side_data_name(enum AVPacketSideDataType type); + +/** + * Pack a dictionary for use in side_data. + * + * @param dict The dictionary to pack. + * @param size pointer to store the size of the returned data + * @return pointer to data if successful, NULL otherwise + */ +uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size); +/** + * Unpack a dictionary from side_data. + * + * @param data data from side_data + * @param size size of the data + * @param dict the metadata storage dictionary + * @return 0 on success, < 0 on failure + */ +int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict); + + +/** + * Convenience function to free all the side data stored. + * All the other fields stay untouched. + * + * @param pkt packet + */ +void av_packet_free_side_data(AVPacket *pkt); + +/** + * Setup a new reference to the data described by a given packet + * + * If src is reference-counted, setup dst as a new reference to the + * buffer in src. Otherwise allocate a new buffer in dst and copy the + * data from src into it. + * + * All the other fields are copied from src. + * + * @see av_packet_unref + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_packet_ref(AVPacket *dst, const AVPacket *src); + +/** + * Wipe the packet. + * + * Unreference the buffer referenced by the packet and reset the + * remaining packet fields to their default values. + * + * @param pkt The packet to be unreferenced. + */ +void av_packet_unref(AVPacket *pkt); + +/** + * Move every field in src to dst and reset src. + * + * @see av_packet_unref + * + * @param src Source packet, will be reset + * @param dst Destination packet + */ +void av_packet_move_ref(AVPacket *dst, AVPacket *src); + +/** + * Copy only "properties" fields from src to dst. + * + * Properties for the purpose of this function are all the fields + * beside those related to the packet data (buf, data, size) + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success AVERROR on failure. + */ +int av_packet_copy_props(AVPacket *dst, const AVPacket *src); + +/** + * Ensure the data described by a given packet is reference counted. + * + * @note This function does not ensure that the reference will be writable. + * Use av_packet_make_writable instead for that purpose. + * + * @see av_packet_ref + * @see av_packet_make_writable + * + * @param pkt packet whose data should be made reference counted. + * + * @return 0 on success, a negative AVERROR on error. On failure, the + * packet is unchanged. + */ +int av_packet_make_refcounted(AVPacket *pkt); + +/** + * Create a writable reference for the data described by a given packet, + * avoiding data copy if possible. + * + * @param pkt Packet whose data should be made writable. + * + * @return 0 on success, a negative AVERROR on failure. On failure, the + * packet is unchanged. + */ +int av_packet_make_writable(AVPacket *pkt); + +/** + * Convert valid timing fields (timestamps / durations) in a packet from one + * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be + * ignored. + * + * @param pkt packet on which the conversion will be performed + * @param tb_src source timebase, in which the timing fields in pkt are + * expressed + * @param tb_dst destination timebase, to which the timing fields will be + * converted + */ +void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); + +/** + * @} + */ + +/** + * @addtogroup lavc_decoding + * @{ + */ + +/** + * Find a registered decoder with a matching codec ID. + * + * @param id AVCodecID of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder(enum AVCodecID id); + +/** + * Find a registered decoder with the specified name. + * + * @param name name of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder_by_name(const char *name); + +/** + * The default callback for AVCodecContext.get_buffer2(). It is made public so + * it can be called by custom get_buffer2() implementations for decoders without + * AV_CODEC_CAP_DR1 set. + */ +int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you do not use any horizontal + * padding. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you also ensure that all + * line sizes are a multiple of the respective linesize_align[i]. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, + int linesize_align[AV_NUM_DATA_POINTERS]); + +/** + * Converts AVChromaLocation to swscale x/y chroma position. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos); + +/** + * Converts swscale x/y chroma position to AVChromaLocation. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); + +/** + * Decode the audio frame of size avpkt->size from avpkt->data into frame. + * + * Some decoders may support multiple frames in a single AVPacket. Such + * decoders would then just decode the first frame and the return value would be + * less than the packet size. In this case, avcodec_decode_audio4 has to be + * called again with an AVPacket containing the remaining data in order to + * decode the second frame, etc... Even if no frames are returned, the packet + * needs to be fed to the decoder with remaining data until it is completely + * consumed or an error occurs. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning samples. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no samples will be returned. + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] frame The AVFrame in which to store decoded audio samples. + * The decoder will allocate a buffer for the decoded frame by + * calling the AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is + * non-zero. Note that this field being set to zero + * does not mean that an error has occurred. For + * decoders with AV_CODEC_CAP_DELAY set, no given decode + * call is guaranteed to produce a frame. + * @param[in] avpkt The input AVPacket containing the input buffer. + * At least avpkt->data and avpkt->size should be set. Some + * decoders might also require additional fields to be set. + * @return A negative error code is returned if an error occurred during + * decoding, otherwise the number of bytes consumed from the input + * AVPacket is returned. + * +* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, + int *got_frame_ptr, const AVPacket *avpkt); + +/** + * Decode the video frame of size avpkt->size from avpkt->data into picture. + * Some decoders may support multiple frames in a single AVPacket, such + * decoders would then just decode the first frame. + * + * @warning The input buffer must be AV_INPUT_BUFFER_PADDING_SIZE larger than + * the actual read bytes because some optimized bitstream readers read 32 or 64 + * bits at once and could read over the end. + * + * @warning The end of the input buffer buf should be set to 0 to ensure that + * no overreading happens for damaged MPEG streams. + * + * @note Codecs which have the AV_CODEC_CAP_DELAY capability set have a delay + * between input and output, these need to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to return the remaining frames. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] picture The AVFrame in which the decoded video frame will be stored. + * Use av_frame_alloc() to get an AVFrame. The codec will + * allocate memory for the actual bitmap by calling the + * AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * + * @param[in] avpkt The input AVPacket containing the input buffer. + * You can create such packet with av_init_packet() and by then setting + * data and size, some decoders might in addition need other fields like + * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least + * fields possible. + * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame could be decompressed. + * + * @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, + int *got_picture_ptr, + const AVPacket *avpkt); + +/** + * Decode a subtitle message. + * Return a negative value on error, otherwise return the number of bytes used. + * If no subtitle could be decompressed, got_sub_ptr is zero. + * Otherwise, the subtitle is stored in *sub. + * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for + * simplicity, because the performance difference is expect to be negligible + * and reusing a get_buffer written for video codecs would probably perform badly + * due to a potentially very different allocation pattern. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning subtitles. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored, + * must be freed with avsubtitle_free if *got_sub_ptr is set. + * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. + * @param[in] avpkt The input AVPacket containing the input buffer. + */ +int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, + int *got_sub_ptr, + AVPacket *avpkt); + +/** + * Supply raw packet data as input to a decoder. + * + * Internally, this call will copy relevant AVCodecContext fields, which can + * influence decoding per-packet, and apply them when the packet is actually + * decoded. (For example AVCodecContext.skip_frame, which might direct the + * decoder to drop the frame contained by the packet sent with this function.) + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @warning Do not mix this API with the legacy API (like avcodec_decode_video2()) + * on the same AVCodecContext. It will return unexpected results now + * or in future libavcodec versions. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx codec context + * @param[in] avpkt The input AVPacket. Usually, this will be a single video + * frame, or several complete audio frames. + * Ownership of the packet remains with the caller, and the + * decoder will not write to the packet. The decoder may create + * a reference to the packet data (or copy it if the packet is + * not reference-counted). + * Unlike with older APIs, the packet is always fully consumed, + * and if it contains multiple frames (e.g. some audio codecs), + * will require you to call avcodec_receive_frame() multiple + * times afterwards before you can send a new packet. + * It can be NULL (or an AVPacket with data set to NULL and + * size set to 0); in this case, it is considered a flush + * packet, which signals the end of the stream. Sending the + * first flush packet will return success. Subsequent ones are + * unnecessary and will return AVERROR_EOF. If the decoder + * still has frames buffered, it will return them after sending + * a flush packet. + * + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_frame() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the decoder has been flushed, and no new packets can + * be sent to it (also returned if more than 1 flush + * packet is sent) + * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); + +/** + * Return decoded output data from a decoder. + * + * @param avctx codec context + * @param frame This will be set to a reference-counted video or audio + * frame (depending on the decoder type) allocated by the + * decoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * + * @return + * 0: success, a frame was returned + * AVERROR(EAGAIN): output is not available in this state - user must try + * to send new input + * AVERROR_EOF: the decoder has been fully flushed, and there will be + * no more output frames + * AVERROR(EINVAL): codec not opened, or it is an encoder + * AVERROR_INPUT_CHANGED: current decoded frame has changed parameters + * with respect to first decoded frame. Applicable + * when flag AV_CODEC_FLAG_DROPCHANGED is set. + * other negative values: legitimate decoding errors + */ +int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); + +/** + * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() + * to retrieve buffered output packets. + * + * @param avctx codec context + * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. + * Ownership of the frame remains with the caller, and the + * encoder will not write to the frame. The encoder may create + * a reference to the frame data (or copy it if the frame is + * not reference-counted). + * It can be NULL, in which case it is considered a flush + * packet. This signals the end of the stream. If the encoder + * still has packets buffered, it will return them after this + * call. Once flushing mode has been entered, additional flush + * packets are ignored, and sending frames will return + * AVERROR_EOF. + * + * For audio: + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_packet() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the encoder has been flushed, and no new frames can + * be sent to it + * AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a + * decoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); + +/** + * Read encoded data from the encoder. + * + * @param avctx codec context + * @param avpkt This will be set to a reference-counted packet allocated by the + * encoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): output is not available in the current state - user + * must try to send input + * AVERROR_EOF: the encoder has been fully flushed, and there will be + * no more output packets + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other errors: legitimate decoding errors + */ +int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); + +/** + * Create and return a AVHWFramesContext with values adequate for hardware + * decoding. This is meant to get called from the get_format callback, and is + * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx. + * This API is for decoding with certain hardware acceleration modes/APIs only. + * + * The returned AVHWFramesContext is not initialized. The caller must do this + * with av_hwframe_ctx_init(). + * + * Calling this function is not a requirement, but makes it simpler to avoid + * codec or hardware API specific details when manually allocating frames. + * + * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx, + * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes + * it unnecessary to call this function or having to care about + * AVHWFramesContext initialization at all. + * + * There are a number of requirements for calling this function: + * + * - It must be called from get_format with the same avctx parameter that was + * passed to get_format. Calling it outside of get_format is not allowed, and + * can trigger undefined behavior. + * - The function is not always supported (see description of return values). + * Even if this function returns successfully, hwaccel initialization could + * fail later. (The degree to which implementations check whether the stream + * is actually supported varies. Some do this check only after the user's + * get_format callback returns.) + * - The hw_pix_fmt must be one of the choices suggested by get_format. If the + * user decides to use a AVHWFramesContext prepared with this API function, + * the user must return the same hw_pix_fmt from get_format. + * - The device_ref passed to this function must support the given hw_pix_fmt. + * - After calling this API function, it is the user's responsibility to + * initialize the AVHWFramesContext (returned by the out_frames_ref parameter), + * and to set AVCodecContext.hw_frames_ctx to it. If done, this must be done + * before returning from get_format (this is implied by the normal + * AVCodecContext.hw_frames_ctx API rules). + * - The AVHWFramesContext parameters may change every time time get_format is + * called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So + * you are inherently required to go through this process again on every + * get_format call. + * - It is perfectly possible to call this function without actually using + * the resulting AVHWFramesContext. One use-case might be trying to reuse a + * previously initialized AVHWFramesContext, and calling this API function + * only to test whether the required frame parameters have changed. + * - Fields that use dynamically allocated values of any kind must not be set + * by the user unless setting them is explicitly allowed by the documentation. + * If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque, + * the new free callback must call the potentially set previous free callback. + * This API call may set any dynamically allocated fields, including the free + * callback. + * + * The function will set at least the following fields on AVHWFramesContext + * (potentially more, depending on hwaccel API): + * + * - All fields set by av_hwframe_ctx_alloc(). + * - Set the format field to hw_pix_fmt. + * - Set the sw_format field to the most suited and most versatile format. (An + * implication is that this will prefer generic formats over opaque formats + * with arbitrary restrictions, if possible.) + * - Set the width/height fields to the coded frame size, rounded up to the + * API-specific minimum alignment. + * - Only _if_ the hwaccel requires a pre-allocated pool: set the initial_pool_size + * field to the number of maximum reference surfaces possible with the codec, + * plus 1 surface for the user to work (meaning the user can safely reference + * at most 1 decoded surface at a time), plus additional buffering introduced + * by frame threading. If the hwaccel does not require pre-allocation, the + * field is left to 0, and the decoder will allocate new surfaces on demand + * during decoding. + * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying + * hardware API. + * + * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but + * with basic frame parameters set. + * + * The function is stateless, and does not change the AVCodecContext or the + * device_ref AVHWDeviceContext. + * + * @param avctx The context which is currently calling get_format, and which + * implicitly contains all state needed for filling the returned + * AVHWFramesContext properly. + * @param device_ref A reference to the AVHWDeviceContext describing the device + * which will be used by the hardware decoder. + * @param hw_pix_fmt The hwaccel format you are going to return from get_format. + * @param out_frames_ref On success, set to a reference to an _uninitialized_ + * AVHWFramesContext, created from the given device_ref. + * Fields will be set to values required for decoding. + * Not changed if an error is returned. + * @return zero on success, a negative value on error. The following error codes + * have special semantics: + * AVERROR(ENOENT): the decoder does not support this functionality. Setup + * is always manual, or it is a decoder which does not + * support setting AVCodecContext.hw_frames_ctx at all, + * or it is a software format. + * AVERROR(EINVAL): it is known that hardware decoding is not supported for + * this configuration, or the device_ref is not supported + * for the hwaccel referenced by hw_pix_fmt. + */ +int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, + AVBufferRef *device_ref, + enum AVPixelFormat hw_pix_fmt, + AVBufferRef **out_frames_ref); + + + +/** + * @defgroup lavc_parsing Frame parsing + * @{ + */ + +enum AVPictureStructure { + AV_PICTURE_STRUCTURE_UNKNOWN, //< unknown + AV_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field + AV_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field + AV_PICTURE_STRUCTURE_FRAME, //< coded as frame +}; + +typedef struct AVCodecParserContext { + void *priv_data; + struct AVCodecParser *parser; + int64_t frame_offset; /* offset of the current frame */ + int64_t cur_offset; /* current offset + (incremented by each av_parser_parse()) */ + int64_t next_frame_offset; /* offset of the next frame */ + /* video info */ + int pict_type; /* XXX: Put it back in AVCodecContext. */ + /** + * This field is used for proper frame duration computation in lavf. + * It signals, how much longer the frame duration of the current frame + * is compared to normal frame duration. + * + * frame_duration = (1 + repeat_pict) * time_base + * + * It is used by codecs like H.264 to display telecined material. + */ + int repeat_pict; /* XXX: Put it back in AVCodecContext. */ + int64_t pts; /* pts of the current frame */ + int64_t dts; /* dts of the current frame */ + + /* private data */ + int64_t last_pts; + int64_t last_dts; + int fetch_timestamp; + +#define AV_PARSER_PTS_NB 4 + int cur_frame_start_index; + int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_pts[AV_PARSER_PTS_NB]; + int64_t cur_frame_dts[AV_PARSER_PTS_NB]; + + int flags; +#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 +#define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 +#define PARSER_FLAG_USE_CODEC_TS 0x1000 + + int64_t offset; ///< byte offset from starting packet start + int64_t cur_frame_end[AV_PARSER_PTS_NB]; + + /** + * Set by parser to 1 for key frames and 0 for non-key frames. + * It is initialized to -1, so if the parser doesn't set this flag, + * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames + * will be used. + */ + int key_frame; + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated unused + */ + attribute_deprecated + int64_t convergence_duration; +#endif + + // Timestamp generation support: + /** + * Synchronization point for start of timestamp generation. + * + * Set to >0 for sync point, 0 for no sync point and <0 for undefined + * (default). + * + * For example, this corresponds to presence of H.264 buffering period + * SEI message. + */ + int dts_sync_point; + + /** + * Offset of the current timestamp against last timestamp sync point in + * units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain a valid timestamp offset. + * + * Note that the timestamp of sync point has usually a nonzero + * dts_ref_dts_delta, which refers to the previous sync point. Offset of + * the next frame after timestamp sync point will be usually 1. + * + * For example, this corresponds to H.264 cpb_removal_delay. + */ + int dts_ref_dts_delta; + + /** + * Presentation delay of current frame in units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain valid non-negative timestamp delta (presentation time of a frame + * must not lie in the past). + * + * This delay represents the difference between decoding and presentation + * time of the frame. + * + * For example, this corresponds to H.264 dpb_output_delay. + */ + int pts_dts_delta; + + /** + * Position of the packet in file. + * + * Analogous to cur_frame_pts/dts + */ + int64_t cur_frame_pos[AV_PARSER_PTS_NB]; + + /** + * Byte position of currently parsed frame in stream. + */ + int64_t pos; + + /** + * Previous frame byte position. + */ + int64_t last_pos; + + /** + * Duration of the current frame. + * For audio, this is in units of 1 / AVCodecContext.sample_rate. + * For all other types, this is in units of AVCodecContext.time_base. + */ + int duration; + + enum AVFieldOrder field_order; + + /** + * Indicate whether a picture is coded as a frame, top field or bottom field. + * + * For example, H.264 field_pic_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag + * equal to 1 and bottom_field_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_TOP_FIELD. + */ + enum AVPictureStructure picture_structure; + + /** + * Picture number incremented in presentation or output order. + * This field may be reinitialized at the first picture of a new sequence. + * + * For example, this corresponds to H.264 PicOrderCnt. + */ + int output_picture_number; + + /** + * Dimensions of the decoded video intended for presentation. + */ + int width; + int height; + + /** + * Dimensions of the coded video. + */ + int coded_width; + int coded_height; + + /** + * The format of the coded data, corresponds to enum AVPixelFormat for video + * and for enum AVSampleFormat for audio. + * + * Note that a decoder can have considerable freedom in how exactly it + * decodes the data, so the format reported here might be different from the + * one returned by a decoder. + */ + int format; +} AVCodecParserContext; + +typedef struct AVCodecParser { + int codec_ids[5]; /* several codec IDs are permitted */ + int priv_data_size; + int (*parser_init)(AVCodecParserContext *s); + /* This callback never returns an error, a negative value means that + * the frame start was in a previous packet. */ + int (*parser_parse)(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size); + void (*parser_close)(AVCodecParserContext *s); + int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); + struct AVCodecParser *next; +} AVCodecParser; + +/** + * Iterate over all registered codec parsers. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec parser or NULL when the iteration is + * finished + */ +const AVCodecParser *av_parser_iterate(void **opaque); + +attribute_deprecated +AVCodecParser *av_parser_next(const AVCodecParser *c); + +attribute_deprecated +void av_register_codec_parser(AVCodecParser *parser); +AVCodecParserContext *av_parser_init(int codec_id); + +/** + * Parse a packet. + * + * @param s parser context. + * @param avctx codec context. + * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. + * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. + * @param buf input buffer. + * @param buf_size buffer size in bytes without the padding. I.e. the full buffer + size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. + To signal EOF, this should be 0 (so that the last frame + can be output). + * @param pts input presentation timestamp. + * @param dts input decoding timestamp. + * @param pos input byte position in stream. + * @return the number of bytes of the input bitstream used. + * + * Example: + * @code + * while(in_len){ + * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, + * in_data, in_len, + * pts, dts, pos); + * in_data += len; + * in_len -= len; + * + * if(size) + * decode_frame(data, size); + * } + * @endcode + */ +int av_parser_parse2(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts, + int64_t pos); + +/** + * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed + * @deprecated use AVBitStreamFilter + */ +int av_parser_change(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +void av_parser_close(AVCodecParserContext *s); + +/** + * @} + * @} + */ + +/** + * @addtogroup lavc_encoding + * @{ + */ + +/** + * Find a registered encoder with a matching codec ID. + * + * @param id AVCodecID of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder(enum AVCodecID id); + +/** + * Find a registered encoder with the specified name. + * + * @param name name of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder_by_name(const char *name); + +/** + * Encode a frame of audio. + * + * Takes input samples from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay, split, and combine input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. If avpkt->data and + * avpkt->size are set, avpkt->destruct must also be set. All + * other AVPacket fields will be reset by the encoder using + * av_init_packet(). If avpkt->data is NULL, the encoder will + * allocate it. The encoder will set avpkt->size to the size + * of the output packet. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw audio data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +/** + * Encode a frame of video. + * + * Takes input raw video data from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay and reorder input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. All other AVPacket fields + * will be reset by the encoder using av_init_packet(). If + * avpkt->data is NULL, the encoder will allocate it. + * The encoder will set avpkt->size to the size of the + * output packet. The returned data (if any) belongs to the + * caller, he is responsible for freeing it. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw video data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVSubtitle *sub); + + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @addtogroup lavc_picture + * @{ + */ + +/** + * @deprecated unused + */ +attribute_deprecated +int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +void avpicture_free(AVPicture *picture); + +/** + * @deprecated use av_image_fill_arrays() instead. + */ +attribute_deprecated +int avpicture_fill(AVPicture *picture, const uint8_t *ptr, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated use av_image_copy_to_buffer() instead. + */ +attribute_deprecated +int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt, + int width, int height, + unsigned char *dest, int dest_size); + +/** + * @deprecated use av_image_get_buffer_size() instead. + */ +attribute_deprecated +int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated av_image_copy() instead. + */ +attribute_deprecated +void av_picture_copy(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_crop(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int top_band, int left_band); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt, + int padtop, int padbottom, int padleft, int padright, int *color); + +/** + * @} + */ +#endif + +/** + * @defgroup lavc_misc Utility functions + * @ingroup libavc + * + * Miscellaneous utility functions related to both encoding and decoding + * (or neither). + * @{ + */ + +/** + * @defgroup lavc_misc_pixfmt Pixel formats + * + * Functions for working with pixel formats. + * @{ + */ + +#if FF_API_GETCHROMA +/** + * @deprecated Use av_pix_fmt_get_chroma_sub_sample + */ + +attribute_deprecated +void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); +#endif + +/** + * Return a value representing the fourCC code associated to the + * pixel format pix_fmt, or 0 if no associated fourCC code can be + * found. + */ +unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt); + +/** + * @deprecated see av_get_pix_fmt_loss() + */ +int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Find the best pixel format to convert to given a certain source pixel + * format. When converting from one pixel format to another, information loss + * may occur. For example, when converting from RGB24 to GRAY, the color + * information will be lost. Similarly, other losses occur when converting from + * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of + * the given pixel formats should be used to suffer the least amount of loss. + * The pixel formats from which it chooses one, are determined by the + * pix_fmt_list parameter. + * + * + * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. + * @return The best pixel format to convert to or -1 if none was found. + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, + enum AVPixelFormat src_pix_fmt, + int has_alpha, int *loss_ptr); + +/** + * @deprecated see av_find_best_pix_fmt_of_2() + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +attribute_deprecated +enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + +/** + * @} + */ + +#if FF_API_TAG_STRING +/** + * Put a string representing the codec tag codec_tag in buf. + * + * @param buf buffer to place codec tag in + * @param buf_size size in bytes of buf + * @param codec_tag codec tag to assign + * @return the length of the string that would have been generated if + * enough space had been available, excluding the trailing null + * + * @deprecated see av_fourcc_make_string() and av_fourcc2str(). + */ +attribute_deprecated +size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); +#endif + +void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); + +/** + * Return a name for the specified profile, if available. + * + * @param codec the codec that is searched for the given profile + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + */ +const char *av_get_profile_name(const AVCodec *codec, int profile); + +/** + * Return a name for the specified profile, if available. + * + * @param codec_id the ID of the codec to which the requested profile belongs + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + * + * @note unlike av_get_profile_name(), which searches a list of profiles + * supported by a specific decoder or encoder implementation, this + * function searches the list of profiles from the AVCodecDescriptor + */ +const char *avcodec_profile_name(enum AVCodecID codec_id, int profile); + +int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); +int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); +//FIXME func typedef + +/** + * Fill AVFrame audio data and linesize pointers. + * + * The buffer buf must be a preallocated buffer with a size big enough + * to contain the specified samples amount. The filled AVFrame data + * pointers will point to this buffer. + * + * AVFrame extended_data channel pointers are allocated if necessary for + * planar audio. + * + * @param frame the AVFrame + * frame->nb_samples must be set prior to calling the + * function. This function fills in frame->data, + * frame->extended_data, frame->linesize[0]. + * @param nb_channels channel count + * @param sample_fmt sample format + * @param buf buffer to use for frame data + * @param buf_size size of buffer + * @param align plane size sample alignment (0 = default) + * @return >=0 on success, negative error code on failure + * @todo return the size in bytes required to store the samples in + * case of success, at the next libavutil bump + */ +int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, + enum AVSampleFormat sample_fmt, const uint8_t *buf, + int buf_size, int align); + +/** + * Reset the internal decoder state / flush internal buffers. Should be called + * e.g. when seeking or when switching to a different stream. + * + * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0), + * this invalidates the frames previously returned from the decoder. When + * refcounted frames are used, the decoder just releases any references it might + * keep internally, but the caller's reference remains valid. + */ +void avcodec_flush_buffers(AVCodecContext *avctx); + +/** + * Return codec bits per sample. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return the PCM codec associated with a sample format. + * @param be endianness, 0 for little, 1 for big, + * -1 (or anything else) for native + * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE + */ +enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be); + +/** + * Return codec bits per sample. + * Only return non-zero if the bits per sample is exactly correct, not an + * approximation. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_exact_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return audio frame duration. + * + * @param avctx codec context + * @param frame_bytes size of the frame, or 0 if unknown + * @return frame duration, in samples, if known. 0 if not able to + * determine. + */ +int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); + +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); + +#if FF_API_OLD_BSF +typedef struct AVBitStreamFilterContext { + void *priv_data; + const struct AVBitStreamFilter *filter; + AVCodecParserContext *parser; + struct AVBitStreamFilterContext *next; + /** + * Internal default arguments, used if NULL is passed to av_bitstream_filter_filter(). + * Not for access by library users. + */ + char *args; +} AVBitStreamFilterContext; +#endif + +typedef struct AVBSFInternal AVBSFInternal; + +/** + * The bitstream filter state. + * + * This struct must be allocated with av_bsf_alloc() and freed with + * av_bsf_free(). + * + * The fields in the struct will only be changed (by the caller or by the + * filter) as described in their documentation, and are to be considered + * immutable otherwise. + */ +typedef struct AVBSFContext { + /** + * A class for logging and AVOptions + */ + const AVClass *av_class; + + /** + * The bitstream filter this context is an instance of. + */ + const struct AVBitStreamFilter *filter; + + /** + * Opaque libavcodec internal data. Must not be touched by the caller in any + * way. + */ + AVBSFInternal *internal; + + /** + * Opaque filter-specific private data. If filter->priv_class is non-NULL, + * this is an AVOptions-enabled struct. + */ + void *priv_data; + + /** + * Parameters of the input stream. This field is allocated in + * av_bsf_alloc(), it needs to be filled by the caller before + * av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. This field is allocated in + * av_bsf_alloc(), it is set by the filter in av_bsf_init(). + */ + AVCodecParameters *par_out; + + /** + * The timebase used for the timestamps of the input packets. Set by the + * caller before av_bsf_init(). + */ + AVRational time_base_in; + + /** + * The timebase used for the timestamps of the output packets. Set by the + * filter in av_bsf_init(). + */ + AVRational time_base_out; +} AVBSFContext; + +typedef struct AVBitStreamFilter { + const char *name; + + /** + * A list of codec ids supported by the filter, terminated by + * AV_CODEC_ID_NONE. + * May be NULL, in that case the bitstream filter works with any codec id. + */ + const enum AVCodecID *codec_ids; + + /** + * A class for the private data, used to declare bitstream filter private + * AVOptions. This field is NULL for bitstream filters that do not declare + * any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavcodec generic + * code to this class. + */ + const AVClass *priv_class; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + int priv_data_size; + int (*init)(AVBSFContext *ctx); + int (*filter)(AVBSFContext *ctx, AVPacket *pkt); + void (*close)(AVBSFContext *ctx); + void (*flush)(AVBSFContext *ctx); +} AVBitStreamFilter; + +#if FF_API_OLD_BSF +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use the new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +void av_register_bitstream_filter(AVBitStreamFilter *bsf); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_get_by_name(), av_bsf_alloc(), and av_bsf_init() + * from the new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_send_packet() and av_bsf_receive_packet() from the + * new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, + AVCodecContext *avctx, const char *args, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_free() from the new bitstream filtering API (using + * AVBSFContext). + */ +attribute_deprecated +void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_iterate() from the new bitstream filtering API (using + * AVBSFContext). + */ +attribute_deprecated +const AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +#endif + +/** + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. + */ +const AVBitStreamFilter *av_bsf_get_by_name(const char *name); + +/** + * Iterate over all registered bitstream filters. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered bitstream filter or NULL when the iteration is + * finished + */ +const AVBitStreamFilter *av_bsf_iterate(void **opaque); +#if FF_API_NEXT +attribute_deprecated +const AVBitStreamFilter *av_bsf_next(void **opaque); +#endif + +/** + * Allocate a context for a given bitstream filter. The caller must fill in the + * context parameters as described in the documentation and then call + * av_bsf_init() before sending any data to the filter. + * + * @param filter the filter for which to allocate an instance. + * @param ctx a pointer into which the pointer to the newly-allocated context + * will be written. It must be freed with av_bsf_free() after the + * filtering is done. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); + +/** + * Prepare the filter for use, after all the parameters and options have been + * set. + */ +int av_bsf_init(AVBSFContext *ctx); + +/** + * Submit a packet for filtering. + * + * After sending each packet, the filter must be completely drained by calling + * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or + * AVERROR_EOF. + * + * @param pkt the packet to filter. The bitstream filter will take ownership of + * the packet and reset the contents of pkt. pkt is not touched if an error occurs. + * This parameter may be NULL, which signals the end of the stream (i.e. no more + * packets will be sent). That will cause the filter to output any packets it + * may have buffered internally. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Retrieve a filtered packet. + * + * @param[out] pkt this struct will be filled with the contents of the filtered + * packet. It is owned by the caller and must be freed using + * av_packet_unref() when it is no longer needed. + * This parameter should be "clean" (i.e. freshly allocated + * with av_packet_alloc() or unreffed with av_packet_unref()) + * when this function is called. If this function returns + * successfully, the contents of pkt will be completely + * overwritten by the returned data. On failure, pkt is not + * touched. + * + * @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the + * filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there + * will be no further output from the filter. Another negative AVERROR value if + * an error occurs. + * + * @note one input packet may result in several output packets, so after sending + * a packet with av_bsf_send_packet(), this function needs to be called + * repeatedly until it stops returning 0. It is also possible for a filter to + * output fewer packets than were sent to it, so this function may return + * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. + */ +int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Reset the internal bitstream filter state / flush internal buffers. + */ +void av_bsf_flush(AVBSFContext *ctx); + +/** + * Free a bitstream filter context and everything associated with it; write NULL + * into the supplied pointer. + */ +void av_bsf_free(AVBSFContext **ctx); + +/** + * Get the AVClass for AVBSFContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_bsf_get_class(void); + +/** + * Structure for chain/list of bitstream filters. + * Empty list can be allocated by av_bsf_list_alloc(). + */ +typedef struct AVBSFList AVBSFList; + +/** + * Allocate empty list of bitstream filters. + * The list must be later freed by av_bsf_list_free() + * or finalized by av_bsf_list_finalize(). + * + * @return Pointer to @ref AVBSFList on success, NULL in case of failure + */ +AVBSFList *av_bsf_list_alloc(void); + +/** + * Free list of bitstream filters. + * + * @param lst Pointer to pointer returned by av_bsf_list_alloc() + */ +void av_bsf_list_free(AVBSFList **lst); + +/** + * Append bitstream filter to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf Filter context to be appended + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); + +/** + * Construct new bitstream filter context given it's name and options + * and append it to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf_name Name of the bitstream filter + * @param options Options for the bitstream filter, can be set to NULL + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); +/** + * Finalize list of bitstream filters. + * + * This function will transform @ref AVBSFList to single @ref AVBSFContext, + * so the whole chain of bitstream filters can be treated as single filter + * freshly allocated by av_bsf_alloc(). + * If the call is successful, @ref AVBSFList structure is freed and lst + * will be set to NULL. In case of failure, caller is responsible for + * freeing the structure by av_bsf_list_free() + * + * @param lst Filter list structure to be transformed + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); + +/** + * Parse string describing list of bitstream filters and create single + * @ref AVBSFContext describing the whole chain of bitstream filters. + * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly + * allocated by av_bsf_alloc(). + * + * @param str String describing chain of bitstream filters in format + * `bsf1[=opt1=val1:opt2=val2][,bsf2]` + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); + +/** + * Get null/pass-through bitstream filter. + * + * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter + * + * @return + */ +int av_bsf_get_null_filter(AVBSFContext **bsf); + +/* memory */ + +/** + * Same behaviour av_fast_malloc but the buffer has additional + * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. + * + * In addition the whole buffer will initially and after resizes + * be 0-initialized so that no uninitialized data will ever appear. + */ +void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Same behaviour av_fast_padded_malloc except that buffer will always + * be 0-initialized after call. + */ +void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Encode extradata length to a buffer. Used by xiph codecs. + * + * @param s buffer to write to; must be at least (v/255+1) bytes long + * @param v size of extradata in bytes + * @return number of bytes written to the buffer. + */ +unsigned int av_xiphlacing(unsigned char *s, unsigned int v); + +#if FF_API_USER_VISIBLE_AVHWACCEL +/** + * Register the hardware accelerator hwaccel. + * + * @deprecated This function doesn't do anything. + */ +attribute_deprecated +void av_register_hwaccel(AVHWAccel *hwaccel); + +/** + * If hwaccel is NULL, returns the first registered hardware accelerator, + * if hwaccel is non-NULL, returns the next registered hardware accelerator + * after hwaccel, or NULL if hwaccel is the last one. + * + * @deprecated AVHWaccel structures contain no user-serviceable parts, so + * this function should not be used. + */ +attribute_deprecated +AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); +#endif + +#if FF_API_LOCKMGR +/** + * Lock operation used by lockmgr + * + * @deprecated Deprecated together with av_lockmgr_register(). + */ +enum AVLockOp { + AV_LOCK_CREATE, ///< Create a mutex + AV_LOCK_OBTAIN, ///< Lock the mutex + AV_LOCK_RELEASE, ///< Unlock the mutex + AV_LOCK_DESTROY, ///< Free mutex resources +}; + +/** + * Register a user provided lock manager supporting the operations + * specified by AVLockOp. The "mutex" argument to the function points + * to a (void *) where the lockmgr should store/get a pointer to a user + * allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the + * value left by the last call for all other ops. If the lock manager is + * unable to perform the op then it should leave the mutex in the same + * state as when it was called and return a non-zero value. However, + * when called with AV_LOCK_DESTROY the mutex will always be assumed to + * have been successfully destroyed. If av_lockmgr_register succeeds + * it will return a non-negative value, if it fails it will return a + * negative value and destroy all mutex and unregister all callbacks. + * av_lockmgr_register is not thread-safe, it must be called from a + * single thread before any calls which make use of locking are used. + * + * @param cb User defined callback. av_lockmgr_register invokes calls + * to this callback and the previously registered callback. + * The callback will be used to create more than one mutex + * each of which must be backed by its own underlying locking + * mechanism (i.e. do not use a single static object to + * implement your lock manager). If cb is set to NULL the + * lockmgr will be unregistered. + * + * @deprecated This function does nothing, and always returns 0. Be sure to + * build with thread support to get basic thread safety. + */ +attribute_deprecated +int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); +#endif + +/** + * Get the type of the given codec. + */ +enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); + +/** + * Get the name of a codec. + * @return a static string identifying the codec; never NULL + */ +const char *avcodec_get_name(enum AVCodecID id); + +/** + * @return a positive value if s is open (i.e. avcodec_open2() was called on it + * with no corresponding avcodec_close()), 0 otherwise. + */ +int avcodec_is_open(AVCodecContext *s); + +/** + * @return a non-zero number if codec is an encoder, zero otherwise + */ +int av_codec_is_encoder(const AVCodec *codec); + +/** + * @return a non-zero number if codec is a decoder, zero otherwise + */ +int av_codec_is_decoder(const AVCodec *codec); + +/** + * @return descriptor for given codec ID or NULL if no descriptor exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id); + +/** + * Iterate over all codec descriptors known to libavcodec. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); + +/** + * @return codec descriptor with the given name or NULL if no such descriptor + * exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); + +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + +/** + * @} + */ + +#endif /* AVCODEC_AVCODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avdct.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avdct.h new file mode 100644 index 0000000..272422e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avdct.h @@ -0,0 +1,84 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVDCT_H +#define AVCODEC_AVDCT_H + +#include "libavutil/opt.h" + +/** + * AVDCT context. + * @note function pointers can be NULL if the specific features have been + * disabled at build time. + */ +typedef struct AVDCT { + const AVClass *av_class; + + void (*idct)(int16_t *block /* align 16 */); + + /** + * IDCT input permutation. + * Several optimized IDCTs need a permutated input (relative to the + * normal order of the reference IDCT). + * This permutation must be performed before the idct_put/add. + * Note, normally this can be merged with the zigzag/alternate scan
+ * An example to avoid confusion: + * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...) + * - (x -> reference DCT -> reference IDCT -> x) + * - (x -> reference DCT -> simple_mmx_perm = idct_permutation + * -> simple_idct_mmx -> x) + * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant + * -> simple_idct_mmx -> ...) + */ + uint8_t idct_permutation[64]; + + void (*fdct)(int16_t *block /* align 16 */); + + + /** + * DCT algorithm. + * must use AVOptions to set this field. + */ + int dct_algo; + + /** + * IDCT algorithm. + * must use AVOptions to set this field. + */ + int idct_algo; + + void (*get_pixels)(int16_t *block /* align 16 */, + const uint8_t *pixels /* align 8 */, + ptrdiff_t line_size); + + int bits_per_sample; +} AVDCT; + +/** + * Allocates a AVDCT context. + * This needs to be initialized with avcodec_dct_init() after optionally + * configuring it with AVOptions. + * + * To free it use av_free() + */ +AVDCT *avcodec_dct_alloc(void); +int avcodec_dct_init(AVDCT *); + +const AVClass *avcodec_dct_get_class(void); + +#endif /* AVCODEC_AVDCT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avfft.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avfft.h new file mode 100644 index 0000000..0c0f9b8 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/avfft.h @@ -0,0 +1,118 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVFFT_H +#define AVCODEC_AVFFT_H + +/** + * @file + * @ingroup lavc_fft + * FFT functions + */ + +/** + * @defgroup lavc_fft FFT functions + * @ingroup lavc_misc + * + * @{ + */ + +typedef float FFTSample; + +typedef struct FFTComplex { + FFTSample re, im; +} FFTComplex; + +typedef struct FFTContext FFTContext; + +/** + * Set up a complex FFT. + * @param nbits log2 of the length of the input array + * @param inverse if 0 perform the forward transform, if 1 perform the inverse + */ +FFTContext *av_fft_init(int nbits, int inverse); + +/** + * Do the permutation needed BEFORE calling ff_fft_calc(). + */ +void av_fft_permute(FFTContext *s, FFTComplex *z); + +/** + * Do a complex FFT with the parameters defined in av_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ +void av_fft_calc(FFTContext *s, FFTComplex *z); + +void av_fft_end(FFTContext *s); + +FFTContext *av_mdct_init(int nbits, int inverse, double scale); +void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_end(FFTContext *s); + +/* Real Discrete Fourier Transform */ + +enum RDFTransformType { + DFT_R2C, + IDFT_C2R, + IDFT_R2C, + DFT_C2R, +}; + +typedef struct RDFTContext RDFTContext; + +/** + * Set up a real FFT. + * @param nbits log2 of the length of the input array + * @param trans the type of transform + */ +RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +void av_rdft_calc(RDFTContext *s, FFTSample *data); +void av_rdft_end(RDFTContext *s); + +/* Discrete Cosine Transform */ + +typedef struct DCTContext DCTContext; + +enum DCTTransformType { + DCT_II = 0, + DCT_III, + DCT_I, + DST_I, +}; + +/** + * Set up DCT. + * + * @param nbits size of the input array: + * (1 << nbits) for DCT-II, DCT-III and DST-I + * (1 << nbits) + 1 for DCT-I + * @param type the type of transform + * + * @note the first element of the input of DST-I is ignored + */ +DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +void av_dct_calc(DCTContext *s, FFTSample *data); +void av_dct_end (DCTContext *s); + +/** + * @} + */ + +#endif /* AVCODEC_AVFFT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/d3d11va.h new file mode 100644 index 0000000..6816b6c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/d3d11va.h @@ -0,0 +1,112 @@ +/* + * Direct3D11 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * copyright (c) 2015 Steve Lhomme + * + * 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 + */ + +#ifndef AVCODEC_D3D11VA_H +#define AVCODEC_D3D11VA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_d3d11va + * Public libavcodec D3D11VA header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the Direct3D11 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + * + * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. + */ +typedef struct AVD3D11VAContext { + /** + * D3D11 decoder object + */ + ID3D11VideoDecoder *decoder; + + /** + * D3D11 VideoContext + */ + ID3D11VideoContext *video_context; + + /** + * D3D11 configuration used to create the decoder + */ + D3D11_VIDEO_DECODER_CONFIG *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + ID3D11VideoDecoderOutputView **surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; + + /** + * Mutex to access video_context + */ + HANDLE context_mutex; +} AVD3D11VAContext; + +/** + * Allocate an AVD3D11VAContext. + * + * @return Newly-allocated AVD3D11VAContext or NULL on failure. + */ +AVD3D11VAContext *av_d3d11va_alloc_context(void); + +/** + * @} + */ + +#endif /* AVCODEC_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dirac.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dirac.h new file mode 100644 index 0000000..e6d9d34 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dirac.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007 Marco Gerards + * Copyright (C) 2009 David Conrad + * Copyright (C) 2011 Jordi Ortiz + * + * 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 + */ + +#ifndef AVCODEC_DIRAC_H +#define AVCODEC_DIRAC_H + +/** + * @file + * Interface to Dirac Decoder/Encoder + * @author Marco Gerards + * @author David Conrad + * @author Jordi Ortiz + */ + +#include "avcodec.h" + +/** + * The spec limits the number of wavelet decompositions to 4 for both + * level 1 (VC-2) and 128 (long-gop default). + * 5 decompositions is the maximum before >16-bit buffers are needed. + * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting + * the others to 4 decompositions (or 3 for the fidelity filter). + * + * We use this instead of MAX_DECOMPOSITIONS to save some memory. + */ +#define MAX_DWT_LEVELS 5 + +/** + * Parse code values: + * + * Dirac Specification -> + * 9.6.1 Table 9.1 + * + * VC-2 Specification -> + * 10.4.1 Table 10.1 + */ + +enum DiracParseCodes { + DIRAC_PCODE_SEQ_HEADER = 0x00, + DIRAC_PCODE_END_SEQ = 0x10, + DIRAC_PCODE_AUX = 0x20, + DIRAC_PCODE_PAD = 0x30, + DIRAC_PCODE_PICTURE_CODED = 0x08, + DIRAC_PCODE_PICTURE_RAW = 0x48, + DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8, + DIRAC_PCODE_PICTURE_HQ = 0xE8, + DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A, + DIRAC_PCODE_INTER_NOREF_CO2 = 0x09, + DIRAC_PCODE_INTER_REF_CO1 = 0x0D, + DIRAC_PCODE_INTER_REF_CO2 = 0x0E, + DIRAC_PCODE_INTRA_REF_CO = 0x0C, + DIRAC_PCODE_INTRA_REF_RAW = 0x4C, + DIRAC_PCODE_INTRA_REF_PICT = 0xCC, + DIRAC_PCODE_MAGIC = 0x42424344, +}; + +typedef struct DiracVersionInfo { + int major; + int minor; +} DiracVersionInfo; + +typedef struct AVDiracSeqHeader { + unsigned width; + unsigned height; + uint8_t chroma_format; ///< 0: 444 1: 422 2: 420 + + uint8_t interlaced; + uint8_t top_field_first; + + uint8_t frame_rate_index; ///< index into dirac_frame_rate[] + uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[] + + uint16_t clean_width; + uint16_t clean_height; + uint16_t clean_left_offset; + uint16_t clean_right_offset; + + uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[] + uint8_t color_spec_index; ///< index into dirac_color_spec_presets[] + + int profile; + int level; + + AVRational framerate; + AVRational sample_aspect_ratio; + + enum AVPixelFormat pix_fmt; + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; + + DiracVersionInfo version; + int bit_depth; +} AVDiracSeqHeader; + +/** + * Parse a Dirac sequence header. + * + * @param dsh this function will allocate and fill an AVDiracSeqHeader struct + * and write it into this pointer. The caller must free it with + * av_free(). + * @param buf the data buffer + * @param buf_size the size of the data buffer in bytes + * @param log_ctx if non-NULL, this function will log errors here + * @return 0 on success, a negative AVERROR code on failure + */ +int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh, + const uint8_t *buf, size_t buf_size, + void *log_ctx); + +#endif /* AVCODEC_DIRAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dv_profile.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dv_profile.h new file mode 100644 index 0000000..9380a66 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dv_profile.h @@ -0,0 +1,83 @@ +/* + * 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 + */ + +#ifndef AVCODEC_DV_PROFILE_H +#define AVCODEC_DV_PROFILE_H + +#include + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "avcodec.h" + +/* minimum number of bytes to read from a DV stream in order to + * determine the profile */ +#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */ + + +/* + * AVDVProfile is used to express the differences between various + * DV flavors. For now it's primarily used for differentiating + * 525/60 and 625/50, but the plans are to use it for various + * DV specs as well (e.g. SMPTE314M vs. IEC 61834). + */ +typedef struct AVDVProfile { + int dsf; /* value of the dsf in the DV header */ + int video_stype; /* stype for VAUX source pack */ + int frame_size; /* total size of one frame in bytes */ + int difseg_size; /* number of DIF segments per DIF channel */ + int n_difchan; /* number of DIF channels per frame */ + AVRational time_base; /* 1/framerate */ + int ltc_divisor; /* FPS from the LTS standpoint */ + int height; /* picture height in pixels */ + int width; /* picture width in pixels */ + AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ + enum AVPixelFormat pix_fmt; /* picture pixel format */ + int bpm; /* blocks per macroblock */ + const uint8_t *block_sizes; /* AC block sizes, in bits */ + int audio_stride; /* size of audio_shuffle table */ + int audio_min_samples[3]; /* min amount of audio samples */ + /* for 48kHz, 44.1kHz and 32kHz */ + int audio_samples_dist[5]; /* how many samples are supposed to be */ + /* in each frame in a 5 frames window */ + const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ +} AVDVProfile; + +/** + * Get a DV profile for the provided compressed frame. + * + * @param sys the profile used for the previous frame, may be NULL + * @param frame the compressed data buffer + * @param buf_size size of the buffer in bytes + * @return the DV profile for the supplied data or NULL on failure + */ +const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, + const uint8_t *frame, unsigned buf_size); + +/** + * Get a DV profile for the provided stream parameters. + */ +const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt); + +/** + * Get a DV profile for the provided stream parameters. + * The frame rate is used as a best-effort parameter. + */ +const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate); + +#endif /* AVCODEC_DV_PROFILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dxva2.h new file mode 100644 index 0000000..22c9399 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/dxva2.h @@ -0,0 +1,93 @@ +/* + * DXVA2 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * + * 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 + */ + +#ifndef AVCODEC_DXVA2_H +#define AVCODEC_DXVA2_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_dxva2 + * Public libavcodec DXVA2 header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_dxva2 DXVA2 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the DXVA2 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct dxva_context { + /** + * DXVA2 decoder object + */ + IDirectXVideoDecoder *decoder; + + /** + * DXVA2 configuration used to create the decoder + */ + const DXVA2_ConfigPictureDecode *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + LPDIRECT3DSURFACE9 *surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; +}; + +/** + * @} + */ + +#endif /* AVCODEC_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/jni.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/jni.h new file mode 100644 index 0000000..dd99e92 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/jni.h @@ -0,0 +1,46 @@ +/* + * JNI public API functions + * + * Copyright (c) 2015-2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_JNI_H +#define AVCODEC_JNI_H + +/* + * Manually set a Java virtual machine which will be used to retrieve the JNI + * environment. Once a Java VM is set it cannot be changed afterwards, meaning + * you can call multiple times av_jni_set_java_vm with the same Java VM pointer + * however it will error out if you try to set a different Java VM. + * + * @param vm Java virtual machine + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_java_vm(void *vm, void *log_ctx); + +/* + * Get the Java virtual machine which has been set with av_jni_set_java_vm. + * + * @param vm Java virtual machine + * @return a pointer to the Java virtual machine + */ +void *av_jni_get_java_vm(void *log_ctx); + +#endif /* AVCODEC_JNI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/mediacodec.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/mediacodec.h new file mode 100644 index 0000000..4c8545d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/mediacodec.h @@ -0,0 +1,101 @@ +/* + * Android MediaCodec public API + * + * Copyright (c) 2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_MEDIACODEC_H +#define AVCODEC_MEDIACODEC_H + +#include "libavcodec/avcodec.h" + +/** + * This structure holds a reference to a android/view/Surface object that will + * be used as output by the decoder. + * + */ +typedef struct AVMediaCodecContext { + + /** + * android/view/Surface object reference. + */ + void *surface; + +} AVMediaCodecContext; + +/** + * Allocate and initialize a MediaCodec context. + * + * When decoding with MediaCodec is finished, the caller must free the + * MediaCodec context with av_mediacodec_default_free. + * + * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise + */ +AVMediaCodecContext *av_mediacodec_alloc_context(void); + +/** + * Convenience function that sets up the MediaCodec context. + * + * @param avctx codec context + * @param ctx MediaCodec context to initialize + * @param surface reference to an android/view/Surface + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface); + +/** + * This function must be called to free the MediaCodec context initialized with + * av_mediacodec_default_init(). + * + * @param avctx codec context + */ +void av_mediacodec_default_free(AVCodecContext *avctx); + +/** + * Opaque structure representing a MediaCodec buffer to render. + */ +typedef struct MediaCodecBuffer AVMediaCodecBuffer; + +/** + * Release a MediaCodec buffer and render it to the surface that is associated + * with the decoder. This function should only be called once on a given + * buffer, once released the underlying buffer returns to the codec, thus + * subsequent calls to this function will have no effect. + * + * @param buffer the buffer to render + * @param render 1 to release and render the buffer to the surface or 0 to + * discard the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); + +/** + * Release a MediaCodec buffer and render it at the given time to the surface + * that is associated with the decoder. The timestamp must be within one second + * of the current java/lang/System#nanoTime() (which is implemented using + * CLOCK_MONOTONIC on Android). See the Android MediaCodec documentation + * of android/media/MediaCodec#releaseOutputBuffer(int,long) for more details. + * + * @param buffer the buffer to render + * @param time timestamp in nanoseconds of when to render the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/qsv.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/qsv.h new file mode 100644 index 0000000..b77158e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/qsv.h @@ -0,0 +1,107 @@ +/* + * Intel MediaSDK QSV public API + * + * 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 + */ + +#ifndef AVCODEC_QSV_H +#define AVCODEC_QSV_H + +#include + +#include "libavutil/buffer.h" + +/** + * This struct is used for communicating QSV parameters between libavcodec and + * the caller. It is managed by the caller and must be assigned to + * AVCodecContext.hwaccel_context. + * - decoding: hwaccel_context must be set on return from the get_format() + * callback + * - encoding: hwaccel_context must be set before avcodec_open2() + */ +typedef struct AVQSVContext { + /** + * If non-NULL, the session to use for encoding or decoding. + * Otherwise, libavcodec will try to create an internal session. + */ + mfxSession session; + + /** + * The IO pattern to use. + */ + int iopattern; + + /** + * Extra buffers to pass to encoder or decoder initialization. + */ + mfxExtBuffer **ext_buffers; + int nb_ext_buffers; + + /** + * Encoding only. If this field is set to non-zero by the caller, libavcodec + * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to + * the encoder initialization. This only makes sense if iopattern is also + * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. + * + * The number of allocated opaque surfaces will be the sum of the number + * required by the encoder and the user-provided value nb_opaque_surfaces. + * The array of the opaque surfaces will be exported to the caller through + * the opaque_surfaces field. + */ + int opaque_alloc; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. Before + * calling avcodec_open2(), the caller should set this field to the number + * of extra opaque surfaces to allocate beyond what is required by the + * encoder. + * + * On return from avcodec_open2(), this field will be set by libavcodec to + * the total number of allocated opaque surfaces. + */ + int nb_opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be used by libavcodec to export the + * array of the allocated opaque surfaces to the caller, so they can be + * passed to other parts of the pipeline. + * + * The buffer reference exported here is owned and managed by libavcodec, + * the callers should make their own reference with av_buffer_ref() and free + * it with av_buffer_unref() when it is no longer needed. + * + * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. + */ + AVBufferRef *opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be set to the surface type used in + * the opaque allocation request. + */ + int opaque_alloc_type; +} AVQSVContext; + +/** + * Allocate a new context. + * + * It must be freed by the caller with av_free(). + */ +AVQSVContext *av_qsv_alloc_context(void); + +#endif /* AVCODEC_QSV_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vaapi.h new file mode 100644 index 0000000..2cf7da5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vaapi.h @@ -0,0 +1,86 @@ +/* + * Video Acceleration API (shared data between FFmpeg and the video player) + * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 + * + * Copyright (C) 2008-2009 Splitted-Desktop Systems + * + * 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 + */ + +#ifndef AVCODEC_VAAPI_H +#define AVCODEC_VAAPI_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vaapi + * Public libavcodec VA API header. + */ + +#include +#include "libavutil/attributes.h" +#include "version.h" + +#if FF_API_STRUCT_VAAPI_CONTEXT + +/** + * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding + * @ingroup lavc_codec_hwaccel + * @{ + */ + +/** + * This structure is used to share data between the FFmpeg library and + * the client video application. + * This shall be zero-allocated and available as + * AVCodecContext.hwaccel_context. All user members can be set once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * Deprecated: use AVCodecContext.hw_frames_ctx instead. + */ +struct attribute_deprecated vaapi_context { + /** + * Window system dependent data + * + * - encoding: unused + * - decoding: Set by user + */ + void *display; + + /** + * Configuration ID + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t config_id; + + /** + * Context ID (video decode pipeline) + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t context_id; +}; + +/* @} */ + +#endif /* FF_API_STRUCT_VAAPI_CONTEXT */ + +#endif /* AVCODEC_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vdpau.h new file mode 100644 index 0000000..4d99943 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vdpau.h @@ -0,0 +1,176 @@ +/* + * The Video Decode and Presentation API for UNIX (VDPAU) is used for + * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. + * + * Copyright (C) 2008 NVIDIA + * + * 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 + */ + +#ifndef AVCODEC_VDPAU_H +#define AVCODEC_VDPAU_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vdpau + * Public libavcodec VDPAU header. + */ + + +/** + * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer + * @ingroup lavc_codec_hwaccel + * + * VDPAU hardware acceleration has two modules + * - VDPAU decoding + * - VDPAU presentation + * + * The VDPAU decoding module parses all headers using FFmpeg + * parsing mechanisms and uses VDPAU for the actual decoding. + * + * As per the current implementation, the actual decoding + * and rendering (API calls) are done as part of the VDPAU + * presentation (vo_vdpau.c) module. + * + * @{ + */ + +#include + +#include "libavutil/avconfig.h" +#include "libavutil/attributes.h" + +#include "avcodec.h" +#include "version.h" + +struct AVCodecContext; +struct AVFrame; + +typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, + const VdpPictureInfo *, uint32_t, + const VdpBitstreamBuffer *); + +/** + * This structure is used to share data between the libavcodec library and + * the client video application. + * The user shall allocate the structure via the av_alloc_vdpau_hwaccel + * function and make it available as + * AVCodecContext.hwaccel_context. Members can be set by the user once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * The size of this structure is not a part of the public ABI and must not + * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an + * AVVDPAUContext. + */ +typedef struct AVVDPAUContext { + /** + * VDPAU decoder handle + * + * Set by user. + */ + VdpDecoder decoder; + + /** + * VDPAU decoder render callback + * + * Set by the user. + */ + VdpDecoderRender *render; + + AVVDPAU_Render2 render2; +} AVVDPAUContext; + +/** + * @brief allocation function for AVVDPAUContext + * + * Allows extending the struct without breaking API/ABI + */ +AVVDPAUContext *av_alloc_vdpaucontext(void); + +AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); +void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); + +/** + * Associate a VDPAU device with a codec context for hardware acceleration. + * This function is meant to be called from the get_format() codec callback, + * or earlier. It can also be called after avcodec_flush_buffers() to change + * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent + * display preemption). + * + * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes + * successfully. + * + * @param avctx decoding context whose get_format() callback is invoked + * @param device VDPAU device handle to use for hardware acceleration + * @param get_proc_address VDPAU device driver + * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags + * + * @return 0 on success, an AVERROR code on failure. + */ +int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, + VdpGetProcAddress *get_proc_address, unsigned flags); + +/** + * Gets the parameters to create an adequate VDPAU video surface for the codec + * context using VDPAU hardware decoding acceleration. + * + * @note Behavior is undefined if the context was not successfully bound to a + * VDPAU device using av_vdpau_bind_context(). + * + * @param avctx the codec context being used for decoding the stream + * @param type storage space for the VDPAU video surface chroma type + * (or NULL to ignore) + * @param width storage space for the VDPAU video surface pixel width + * (or NULL to ignore) + * @param height storage space for the VDPAU video surface pixel height + * (or NULL to ignore) + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, + uint32_t *width, uint32_t *height); + +/** + * Allocate an AVVDPAUContext. + * + * @return Newly-allocated AVVDPAUContext or NULL on failure. + */ +AVVDPAUContext *av_vdpau_alloc_context(void); + +#if FF_API_VDPAU_PROFILE +/** + * Get a decoder profile that should be used for initializing a VDPAU decoder. + * Should be called from the AVCodecContext.get_format() callback. + * + * @deprecated Use av_vdpau_bind_context() instead. + * + * @param avctx the codec context being used for decoding the stream + * @param profile a pointer into which the result will be written on success. + * The contents of profile are undefined if this function returns + * an error. + * + * @return 0 on success (non-negative), a negative AVERROR on failure. + */ +attribute_deprecated +int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile); +#endif + +/* @}*/ + +#endif /* AVCODEC_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/version.h new file mode 100644 index 0000000..3331d47 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/version.h @@ -0,0 +1,140 @@ +/* + * 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 + */ + +#ifndef AVCODEC_VERSION_H +#define AVCODEC_VERSION_H + +/** + * @file + * @ingroup libavc + * Libavcodec version macros. + */ + +#include "libavutil/version.h" + +#define LIBAVCODEC_VERSION_MAJOR 58 +#define LIBAVCODEC_VERSION_MINOR 54 +#define LIBAVCODEC_VERSION_MICRO 100 + +#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT + +#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + */ + +#ifndef FF_API_LOWRES +#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_DEBUG_MV +#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AVCTX_TIMEBASE +#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODED_FRAME +#define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_SIDEDATA_ONLY_PKT +#define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VDPAU_PROFILE +#define FF_API_VDPAU_PROFILE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CONVERGENCE_DURATION +#define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPICTURE +#define FF_API_AVPICTURE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPACKET_OLD_API +#define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_RTP_CALLBACK +#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VBV_DELAY +#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODER_TYPE +#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STAT_BITS +#define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_PRIVATE_OPT +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_ASS_TIMING +#define FF_API_ASS_TIMING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_BSF +#define FF_API_OLD_BSF (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_COPY_CONTEXT +#define FF_API_COPY_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GET_CONTEXT_DEFAULTS +#define FF_API_GET_CONTEXT_DEFAULTS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NVENC_OLD_NAME +#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STRUCT_VAAPI_CONTEXT +#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MERGE_SD_API +#define FF_API_MERGE_SD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_TAG_STRING +#define FF_API_TAG_STRING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GETCHROMA +#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODEC_GET_SET +#define FF_API_CODEC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_USER_VISIBLE_AVHWACCEL +#define FF_API_USER_VISIBLE_AVHWACCEL (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LOCKMGR +#define FF_API_LOCKMGR (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_UNSANITIZED_BITRATES +#define FF_API_UNSANITIZED_BITRATES (LIBAVCODEC_VERSION_MAJOR < 59) +#endif + + +#endif /* AVCODEC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/videotoolbox.h new file mode 100644 index 0000000..af2db0d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/videotoolbox.h @@ -0,0 +1,127 @@ +/* + * Videotoolbox hardware acceleration + * + * copyright (c) 2012 Sebastien Zwickert + * + * 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 + */ + +#ifndef AVCODEC_VIDEOTOOLBOX_H +#define AVCODEC_VIDEOTOOLBOX_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_videotoolbox + * Public libavcodec Videotoolbox header. + */ + +#include + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/avcodec.h" + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing Videotoolbox decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_videotoolbox_alloc_context() and freed with av_free(). + */ +typedef struct AVVideotoolboxContext { + /** + * Videotoolbox decompression session object. + * Created and freed the caller. + */ + VTDecompressionSessionRef session; + + /** + * The output callback that must be passed to the session. + * Set by av_videottoolbox_default_init() + */ + VTDecompressionOutputCallback output_callback; + + /** + * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames. + * set by the caller. If this is set to 0, then no specific format is + * requested from the decoder, and its native format is output. + */ + OSType cv_pix_fmt_type; + + /** + * CoreMedia Format Description that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + CMVideoFormatDescriptionRef cm_fmt_desc; + + /** + * CoreMedia codec type that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + int cm_codec_type; +} AVVideotoolboxContext; + +/** + * Allocate and initialize a Videotoolbox context. + * + * This function should be called from the get_format() callback when the caller + * selects the AV_PIX_FMT_VIDETOOLBOX format. The caller must then create + * the decoder object (using the output callback provided by libavcodec) that + * will be used for Videotoolbox-accelerated decoding. + * + * When decoding with Videotoolbox is finished, the caller must destroy the decoder + * object and free the Videotoolbox context using av_free(). + * + * @return the newly allocated context or NULL on failure + */ +AVVideotoolboxContext *av_videotoolbox_alloc_context(void); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init(AVCodecContext *avctx); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * @param vtctx the Videotoolbox context to use + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx); + +/** + * This function must be called to free the Videotoolbox context initialized with + * av_videotoolbox_default_init(). + * + * @param avctx the corresponding codec context + */ +void av_videotoolbox_default_free(AVCodecContext *avctx); + +/** + * @} + */ + +#endif /* AVCODEC_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vorbis_parser.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vorbis_parser.h new file mode 100644 index 0000000..789932a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/vorbis_parser.h @@ -0,0 +1,74 @@ +/* + * 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 + * A public API for Vorbis parsing + * + * Determines the duration for each packet. + */ + +#ifndef AVCODEC_VORBIS_PARSER_H +#define AVCODEC_VORBIS_PARSER_H + +#include + +typedef struct AVVorbisParseContext AVVorbisParseContext; + +/** + * Allocate and initialize the Vorbis parser using headers in the extradata. + */ +AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata, + int extradata_size); + +/** + * Free the parser and everything associated with it. + */ +void av_vorbis_parse_free(AVVorbisParseContext **s); + +#define VORBIS_FLAG_HEADER 0x00000001 +#define VORBIS_FLAG_COMMENT 0x00000002 +#define VORBIS_FLAG_SETUP 0x00000004 + +/** + * Get the duration for a Vorbis packet. + * + * If @p flags is @c NULL, + * special frames are considered invalid. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + * @param flags flags for special frames + */ +int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size, int *flags); + +/** + * Get the duration for a Vorbis packet. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + */ +int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size); + +void av_vorbis_parse_reset(AVVorbisParseContext *s); + +#endif /* AVCODEC_VORBIS_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/xvmc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/xvmc.h new file mode 100644 index 0000000..465ee78 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavcodec/xvmc.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2003 Ivan Kalvachev + * + * 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 + */ + +#ifndef AVCODEC_XVMC_H +#define AVCODEC_XVMC_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_xvmc + * Public libavcodec XvMC header. + */ + +#include + +#include "libavutil/attributes.h" +#include "version.h" +#include "avcodec.h" + +/** + * @defgroup lavc_codec_hwaccel_xvmc XvMC + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct + the number is 1337 speak for the letters IDCT MCo (motion compensation) */ + +struct attribute_deprecated xvmc_pix_fmt { + /** The field contains the special constant value AV_XVMC_ID. + It is used as a test that the application correctly uses the API, + and that there is no corruption caused by pixel routines. + - application - set during initialization + - libavcodec - unchanged + */ + int xvmc_id; + + /** Pointer to the block array allocated by XvMCCreateBlocks(). + The array has to be freed by XvMCDestroyBlocks(). + Each group of 64 values represents one data block of differential + pixel information (in MoCo mode) or coefficients for IDCT. + - application - set the pointer during initialization + - libavcodec - fills coefficients/pixel data into the array + */ + short* data_blocks; + + /** Pointer to the macroblock description array allocated by + XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). + - application - set the pointer during initialization + - libavcodec - fills description data into the array + */ + XvMCMacroBlock* mv_blocks; + + /** Number of macroblock descriptions that can be stored in the mv_blocks + array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_mv_blocks; + + /** Number of blocks that can be stored at once in the data_blocks array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_data_blocks; + + /** Indicate that the hardware would interpret data_blocks as IDCT + coefficients and perform IDCT on them. + - application - set during initialization + - libavcodec - unchanged + */ + int idct; + + /** In MoCo mode it indicates that intra macroblocks are assumed to be in + unsigned format; same as the XVMC_INTRA_UNSIGNED flag. + - application - set during initialization + - libavcodec - unchanged + */ + int unsigned_intra; + + /** Pointer to the surface allocated by XvMCCreateSurface(). + It has to be freed by XvMCDestroySurface() on application exit. + It identifies the frame and its state on the video hardware. + - application - set during initialization + - libavcodec - unchanged + */ + XvMCSurface* p_surface; + +/** Set by the decoder before calling ff_draw_horiz_band(), + needed by the XvMCRenderSurface function. */ +//@{ + /** Pointer to the surface used as past reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_past_surface; + + /** Pointer to the surface used as future reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_future_surface; + + /** top/bottom field or frame + - application - unchanged + - libavcodec - set + */ + unsigned int picture_structure; + + /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence + - application - unchanged + - libavcodec - set + */ + unsigned int flags; +//}@ + + /** Number of macroblock descriptions in the mv_blocks array + that have already been passed to the hardware. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may increment it + with filled_mb_block_num or zero both. + - libavcodec - unchanged + */ + int start_mv_blocks_num; + + /** Number of new macroblock descriptions in the mv_blocks array (after + start_mv_blocks_num) that are filled by libavcodec and have to be + passed to the hardware. + - application - zeroes it on get_buffer() or after successful + ff_draw_horiz_band(). + - libavcodec - increment with one of each stored MB + */ + int filled_mv_blocks_num; + + /** Number of the next free data block; one data block consists of + 64 short values in the data_blocks array. + All blocks before this one have already been claimed by placing their + position into the corresponding block description structure field, + that are part of the mv_blocks array. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may zero it together + with start_mb_blocks_num. + - libavcodec - each decoded macroblock increases it by the number + of coded blocks it contains. + */ + int next_free_data_block_num; +}; + +/** + * @} + */ + +#endif /* AVCODEC_XVMC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/avdevice.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/avdevice.h new file mode 100644 index 0000000..ee94624 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/avdevice.h @@ -0,0 +1,514 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_AVDEVICE_H +#define AVDEVICE_AVDEVICE_H + +#include "version.h" + +/** + * @file + * @ingroup lavd + * Main libavdevice API header + */ + +/** + * @defgroup lavd libavdevice + * Special devices muxing/demuxing library. + * + * Libavdevice is a complementary library to @ref libavf "libavformat". It + * provides various "special" platform-specific muxers and demuxers, e.g. for + * grabbing devices, audio capture and playback etc. As a consequence, the + * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own + * I/O functions). The filename passed to avformat_open_input() often does not + * refer to an actually existing file, but has some special device-specific + * meaning - e.g. for xcbgrab it is the display name. + * + * To use libavdevice, simply call avdevice_register_all() to register all + * compiled muxers and demuxers. They all use standard libavformat API. + * + * @{ + */ + +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/dict.h" +#include "libavformat/avformat.h" + +/** + * Return the LIBAVDEVICE_VERSION_INT constant. + */ +unsigned avdevice_version(void); + +/** + * Return the libavdevice build-time configuration. + */ +const char *avdevice_configuration(void); + +/** + * Return the libavdevice license. + */ +const char *avdevice_license(void); + +/** + * Initialize libavdevice and register all the input and output devices. + */ +void avdevice_register_all(void); + +/** + * Audio input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_audio_device_next(AVInputFormat *d); + +/** + * Video input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_video_device_next(AVInputFormat *d); + +/** + * Audio output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); + +/** + * Video output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); + +typedef struct AVDeviceRect { + int x; /**< x coordinate of top left corner */ + int y; /**< y coordinate of top left corner */ + int width; /**< width */ + int height; /**< height */ +} AVDeviceRect; + +/** + * Message types used by avdevice_app_to_dev_control_message(). + */ +enum AVAppToDevMessageType { + /** + * Dummy message. + */ + AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), + + /** + * Window size change message. + * + * Message is sent to the device every time the application changes the size + * of the window device renders to. + * Message should also be sent right after window is created. + * + * data: AVDeviceRect: new window size. + */ + AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), + + /** + * Repaint request message. + * + * Message is sent to the device when window has to be repainted. + * + * data: AVDeviceRect: area required to be repainted. + * NULL: whole area is required to be repainted. + */ + AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), + + /** + * Request pause/play. + * + * Application requests pause/unpause playback. + * Mostly usable with devices that have internal buffer. + * By default devices are not paused. + * + * data: NULL + */ + AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '), + AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'), + AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), + + /** + * Volume control message. + * + * Set volume level. It may be device-dependent if volume + * is changed per stream or system wide. Per stream volume + * change is expected when possible. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), + + /** + * Mute control messages. + * + * Change mute state. It may be device-dependent if mute status + * is changed per stream or system wide. Per stream mute status + * change is expected when possible. + * + * data: NULL. + */ + AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'), + AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'), + AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), + + /** + * Get volume/mute messages. + * + * Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or + * AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively. + * + * data: NULL. + */ + AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), + AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'), +}; + +/** + * Message types used by avdevice_dev_to_app_control_message(). + */ +enum AVDevToAppMessageType { + /** + * Dummy message. + */ + AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), + + /** + * Create window buffer message. + * + * Device requests to create a window buffer. Exact meaning is device- + * and application-dependent. Message is sent before rendering first + * frame and all one-shot initializations should be done here. + * Application is allowed to ignore preferred window buffer size. + * + * @note: Application is obligated to inform about window buffer size + * with AV_APP_TO_DEV_WINDOW_SIZE message. + * + * data: AVDeviceRect: preferred size of the window buffer. + * NULL: no preferred size of the window buffer. + */ + AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), + + /** + * Prepare window buffer message. + * + * Device requests to prepare a window buffer for rendering. + * Exact meaning is device- and application-dependent. + * Message is sent before rendering of each frame. + * + * data: NULL. + */ + AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'), + + /** + * Display window buffer message. + * + * Device requests to display a window buffer. + * Message is sent when new frame is ready to be displayed. + * Usually buffers need to be swapped in handler of this message. + * + * data: NULL. + */ + AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), + + /** + * Destroy window buffer message. + * + * Device requests to destroy a window buffer. + * Message is sent when device is about to be destroyed and window + * buffer is not required anymore. + * + * data: NULL. + */ + AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), + + /** + * Buffer fullness status messages. + * + * Device signals buffer overflow/underflow. + * + * data: NULL. + */ + AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), + AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), + + /** + * Buffer readable/writable. + * + * Device informs that buffer is readable/writable. + * When possible, device informs how many bytes can be read/write. + * + * @warning Device may not inform when number of bytes than can be read/write changes. + * + * data: int64_t: amount of bytes available to read/write. + * NULL: amount of bytes available to read/write is not known. + */ + AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), + AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), + + /** + * Mute state change message. + * + * Device informs that mute state has changed. + * + * data: int: 0 for not muted state, non-zero for muted state. + */ + AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), + + /** + * Volume level change message. + * + * Device informs that volume level has changed. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'), +}; + +/** + * Send control message from application to device. + * + * @param s device context. + * @param type message type. + * @param data message data. Exact type depends on message type. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when device doesn't implement handler of the message. + */ +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, + enum AVAppToDevMessageType type, + void *data, size_t data_size); + +/** + * Send control message from device to application. + * + * @param s device context. + * @param type message type. + * @param data message data. Can be NULL. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when application doesn't implement handler of the message. + */ +int avdevice_dev_to_app_control_message(struct AVFormatContext *s, + enum AVDevToAppMessageType type, + void *data, size_t data_size); + +/** + * Following API allows user to probe device capabilities (supported codecs, + * pixel formats, sample formats, resolutions, channel counts, etc). + * It is build on top op AVOption API. + * Queried capabilities make it possible to set up converters of video or audio + * parameters that fit to the device. + * + * List of capabilities that can be queried: + * - Capabilities valid for both audio and video devices: + * - codec: supported audio/video codecs. + * type: AV_OPT_TYPE_INT (AVCodecID value) + * - Capabilities valid for audio devices: + * - sample_format: supported sample formats. + * type: AV_OPT_TYPE_INT (AVSampleFormat value) + * - sample_rate: supported sample rates. + * type: AV_OPT_TYPE_INT + * - channels: supported number of channels. + * type: AV_OPT_TYPE_INT + * - channel_layout: supported channel layouts. + * type: AV_OPT_TYPE_INT64 + * - Capabilities valid for video devices: + * - pixel_format: supported pixel formats. + * type: AV_OPT_TYPE_INT (AVPixelFormat value) + * - window_size: supported window sizes (describes size of the window size presented to the user). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - frame_size: supported frame sizes (describes size of provided video frames). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - fps: supported fps values + * type: AV_OPT_TYPE_RATIONAL + * + * Value of the capability may be set by user using av_opt_set() function + * and AVDeviceCapabilitiesQuery object. Following queries will + * limit results to the values matching already set capabilities. + * For example, setting a codec may impact number of formats or fps values + * returned during next query. Setting invalid value may limit results to zero. + * + * Example of the usage basing on opengl output device: + * + * @code + * AVFormatContext *oc = NULL; + * AVDeviceCapabilitiesQuery *caps = NULL; + * AVOptionRanges *ranges; + * int ret; + * + * if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0) + * goto fail; + * if (avdevice_capabilities_create(&caps, oc, NULL) < 0) + * goto fail; + * + * //query codecs + * if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick codec here and set it + * av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0); + * + * //query format + * if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick format here and set it + * av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0); + * + * //query and set more capabilities + * + * fail: + * //clean up code + * avdevice_capabilities_free(&query, oc); + * avformat_free_context(oc); + * @endcode + */ + +/** + * Structure describes device capabilities. + * + * It is used by devices in conjunction with av_device_capabilities AVOption table + * to implement capabilities probing API based on AVOption API. Should not be used directly. + */ +typedef struct AVDeviceCapabilitiesQuery { + const AVClass *av_class; + AVFormatContext *device_context; + enum AVCodecID codec; + enum AVSampleFormat sample_format; + enum AVPixelFormat pixel_format; + int sample_rate; + int channels; + int64_t channel_layout; + int window_width; + int window_height; + int frame_width; + int frame_height; + AVRational fps; +} AVDeviceCapabilitiesQuery; + +/** + * AVOption table used by devices to implement device capabilities API. Should not be used by a user. + */ +extern const AVOption av_device_capabilities[]; + +/** + * Initialize capabilities probing API based on AVOption API. + * + * avdevice_capabilities_free() must be called when query capabilities API is + * not used anymore. + * + * @param[out] caps Device capabilities data. Pointer to a NULL pointer must be passed. + * @param s Context of the device. + * @param device_options An AVDictionary filled with device-private options. + * On return this parameter will be destroyed and replaced with a dict + * containing options that were not found. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * + * @return >= 0 on success, negative otherwise. + */ +int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, + AVDictionary **device_options); + +/** + * Free resources created by avdevice_capabilities_create() + * + * @param caps Device capabilities data to be freed. + * @param s Context of the device. + */ +void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); + +/** + * Structure describes basic parameters of the device. + */ +typedef struct AVDeviceInfo { + char *device_name; /**< device name, format depends on device */ + char *device_description; /**< human friendly name */ +} AVDeviceInfo; + +/** + * List of devices. + */ +typedef struct AVDeviceInfoList { + AVDeviceInfo **devices; /**< list of autodetected devices */ + int nb_devices; /**< number of autodetected devices */ + int default_device; /**< index of default device or -1 if no default */ +} AVDeviceInfoList; + +/** + * List devices. + * + * Returns available device names and their parameters. + * + * @note: Some devices may accept system-dependent device names that cannot be + * autodetected. The list returned by this function cannot be assumed to + * be always completed. + * + * @param s device context. + * @param[out] device_list list of autodetected devices. + * @return count of autodetected devices, negative on error. + */ +int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list); + +/** + * Convenient function to free result of avdevice_list_devices(). + * + * @param devices device list to be freed. + */ +void avdevice_free_list_devices(AVDeviceInfoList **device_list); + +/** + * List devices. + * + * Returns available device names and their parameters. + * These are convinient wrappers for avdevice_list_devices(). + * Device context is allocated and deallocated internally. + * + * @param device device format. May be NULL if device name is set. + * @param device_name device name. May be NULL if device format is set. + * @param device_options An AVDictionary filled with device-private options. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * @param[out] device_list list of autodetected devices + * @return count of autodetected devices, negative on error. + * @note device argument takes precedence over device_name when both are set. + */ +int avdevice_list_input_sources(struct AVInputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); +int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); + +/** + * @} + */ + +#endif /* AVDEVICE_AVDEVICE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/version.h new file mode 100644 index 0000000..840cefa --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavdevice/version.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_VERSION_H +#define AVDEVICE_VERSION_H + +/** + * @file + * @ingroup lavd + * Libavdevice version macros + */ + +#include "libavutil/version.h" + +#define LIBAVDEVICE_VERSION_MAJOR 58 +#define LIBAVDEVICE_VERSION_MINOR 8 +#define LIBAVDEVICE_VERSION_MICRO 100 + +#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT + +#define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* AVDEVICE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/avfilter.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/avfilter.h new file mode 100644 index 0000000..9d70e71 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/avfilter.h @@ -0,0 +1,1168 @@ +/* + * filter layer + * Copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTER_H +#define AVFILTER_AVFILTER_H + +/** + * @file + * @ingroup lavfi + * Main libavfilter public API header + */ + +/** + * @defgroup lavfi libavfilter + * Graph-based frame editing library. + * + * @{ + */ + +#include + +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/samplefmt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "libavfilter/version.h" + +/** + * Return the LIBAVFILTER_VERSION_INT constant. + */ +unsigned avfilter_version(void); + +/** + * Return the libavfilter build-time configuration. + */ +const char *avfilter_configuration(void); + +/** + * Return the libavfilter license. + */ +const char *avfilter_license(void); + +typedef struct AVFilterContext AVFilterContext; +typedef struct AVFilterLink AVFilterLink; +typedef struct AVFilterPad AVFilterPad; +typedef struct AVFilterFormats AVFilterFormats; + +/** + * Get the number of elements in a NULL-terminated array of AVFilterPads (e.g. + * AVFilter.inputs/outputs). + */ +int avfilter_pad_count(const AVFilterPad *pads); + +/** + * Get the name of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array it; is the caller's + * responsibility to ensure the index is valid + * + * @return name of the pad_idx'th pad in pads + */ +const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx); + +/** + * Get the type of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array; it is the caller's + * responsibility to ensure the index is valid + * + * @return type of the pad_idx'th pad in pads + */ +enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx); + +/** + * The number of the filter inputs is not determined just by AVFilter.inputs. + * The filter might add additional inputs during initialization depending on the + * options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_INPUTS (1 << 0) +/** + * The number of the filter outputs is not determined just by AVFilter.outputs. + * The filter might add additional outputs during initialization depending on + * the options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_OUTPUTS (1 << 1) +/** + * The filter supports multithreading by splitting frames into multiple parts + * and processing them concurrently. + */ +#define AVFILTER_FLAG_SLICE_THREADS (1 << 2) +/** + * Some filters support a generic "enable" expression option that can be used + * to enable or disable a filter in the timeline. Filters supporting this + * option have this flag set. When the enable expression is false, the default + * no-op filter_frame() function is called in place of the filter_frame() + * callback defined on each input pad, thus the frame is passed unchanged to + * the next filters. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC (1 << 16) +/** + * Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will + * have its filter_frame() callback(s) called as usual even when the enable + * expression is false. The filter will disable filtering within the + * filter_frame() callback(s) itself, for example executing code depending on + * the AVFilterContext->is_disabled value. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL (1 << 17) +/** + * Handy mask to test whether the filter supports or no the timeline feature + * (internally or generically). + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL) + +/** + * Filter definition. This defines the pads a filter contains, and all the + * callback functions used to interact with the filter. + */ +typedef struct AVFilter { + /** + * Filter name. Must be non-NULL and unique among filters. + */ + const char *name; + + /** + * A description of the filter. May be NULL. + * + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *description; + + /** + * List of inputs, terminated by a zeroed element. + * + * NULL if there are no (static) inputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in + * this list. + */ + const AVFilterPad *inputs; + /** + * List of outputs, terminated by a zeroed element. + * + * NULL if there are no (static) outputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in + * this list. + */ + const AVFilterPad *outputs; + + /** + * A class for the private data, used to declare filter private AVOptions. + * This field is NULL for filters that do not declare any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavfilter generic + * code to this class. + */ + const AVClass *priv_class; + + /** + * A combination of AVFILTER_FLAG_* + */ + int flags; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Filter pre-initialization function + * + * This callback will be called immediately after the filter context is + * allocated, to allow allocating and initing sub-objects. + * + * If this callback is not NULL, the uninit callback will be called on + * allocation failure. + * + * @return 0 on success, + * AVERROR code on failure (but the code will be + * dropped and treated as ENOMEM by the calling code) + */ + int (*preinit)(AVFilterContext *ctx); + + /** + * Filter initialization function. + * + * This callback will be called only once during the filter lifetime, after + * all the options have been set, but before links between filters are + * established and format negotiation is done. + * + * Basic filter initialization should be done here. Filters with dynamic + * inputs and/or outputs should create those inputs/outputs here based on + * provided options. No more changes to this filter's inputs/outputs can be + * done after this callback. + * + * This callback must not assume that the filter links exist or frame + * parameters are known. + * + * @ref AVFilter.uninit "uninit" is guaranteed to be called even if + * initialization fails, so this callback does not have to clean up on + * failure. + * + * @return 0 on success, a negative AVERROR on failure + */ + int (*init)(AVFilterContext *ctx); + + /** + * Should be set instead of @ref AVFilter.init "init" by the filters that + * want to pass a dictionary of AVOptions to nested contexts that are + * allocated during init. + * + * On return, the options dict should be freed and replaced with one that + * contains all the options which could not be processed by this filter (or + * with NULL if all the options were processed). + * + * Otherwise the semantics is the same as for @ref AVFilter.init "init". + */ + int (*init_dict)(AVFilterContext *ctx, AVDictionary **options); + + /** + * Filter uninitialization function. + * + * Called only once right before the filter is freed. Should deallocate any + * memory held by the filter, release any buffer references, etc. It does + * not need to deallocate the AVFilterContext.priv memory itself. + * + * This callback may be called even if @ref AVFilter.init "init" was not + * called or failed, so it must be prepared to handle such a situation. + */ + void (*uninit)(AVFilterContext *ctx); + + /** + * Query formats supported by the filter on its inputs and outputs. + * + * This callback is called after the filter is initialized (so the inputs + * and outputs are fixed), shortly before the format negotiation. This + * callback may be called more than once. + * + * This callback must set AVFilterLink.out_formats on every input link and + * AVFilterLink.in_formats on every output link to a list of pixel/sample + * formats that the filter supports on that link. For audio links, this + * filter must also set @ref AVFilterLink.in_samplerates "in_samplerates" / + * @ref AVFilterLink.out_samplerates "out_samplerates" and + * @ref AVFilterLink.in_channel_layouts "in_channel_layouts" / + * @ref AVFilterLink.out_channel_layouts "out_channel_layouts" analogously. + * + * This callback may be NULL for filters with one input, in which case + * libavfilter assumes that it supports all input formats and preserves + * them on output. + * + * @return zero on success, a negative value corresponding to an + * AVERROR code otherwise + */ + int (*query_formats)(AVFilterContext *); + + int priv_size; ///< size of private data to allocate for the filter + + int flags_internal; ///< Additional flags for avfilter internal use only. + + /** + * Used by the filter registration system. Must not be touched by any other + * code. + */ + struct AVFilter *next; + + /** + * Make the filter instance process a command. + * + * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. + * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be + * time consuming then a filter should treat it like an unsupported command + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ + int (*process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags); + + /** + * Filter initialization function, alternative to the init() + * callback. Args contains the user-supplied parameters, opaque is + * used for providing binary data. + */ + int (*init_opaque)(AVFilterContext *ctx, void *opaque); + + /** + * Filter activation function. + * + * Called when any processing is needed from the filter, instead of any + * filter_frame and request_frame on pads. + * + * The function must examine inlinks and outlinks and perform a single + * step of processing. If there is nothing to do, the function must do + * nothing and not return an error. If more steps are or may be + * possible, it must use ff_filter_set_ready() to schedule another + * activation. + */ + int (*activate)(AVFilterContext *ctx); +} AVFilter; + +/** + * Process multiple parts of the frame concurrently. + */ +#define AVFILTER_THREAD_SLICE (1 << 0) + +typedef struct AVFilterInternal AVFilterInternal; + +/** An instance of a filter */ +struct AVFilterContext { + const AVClass *av_class; ///< needed for av_log() and filters common options + + const AVFilter *filter; ///< the AVFilter of which this is an instance + + char *name; ///< name of this filter instance + + AVFilterPad *input_pads; ///< array of input pads + AVFilterLink **inputs; ///< array of pointers to input links + unsigned nb_inputs; ///< number of input pads + + AVFilterPad *output_pads; ///< array of output pads + AVFilterLink **outputs; ///< array of pointers to output links + unsigned nb_outputs; ///< number of output pads + + void *priv; ///< private data for use by the filter + + struct AVFilterGraph *graph; ///< filtergraph this filter belongs to + + /** + * Type of multithreading being allowed/used. A combination of + * AVFILTER_THREAD_* flags. + * + * May be set by the caller before initializing the filter to forbid some + * or all kinds of multithreading for this filter. The default is allowing + * everything. + * + * When the filter is initialized, this field is combined using bit AND with + * AVFilterGraph.thread_type to get the final mask used for determining + * allowed threading types. I.e. a threading type needs to be set in both + * to be allowed. + * + * After the filter is initialized, libavfilter sets this field to the + * threading type that is actually used (0 for no multithreading). + */ + int thread_type; + + /** + * An opaque struct for libavfilter internal use. + */ + AVFilterInternal *internal; + + struct AVFilterCommand *command_queue; + + char *enable_str; ///< enable expression string + void *enable; ///< parsed expression (AVExpr*) + double *var_values; ///< variable values for the enable expression + int is_disabled; ///< the enabled state from the last expression evaluation + + /** + * For filters which will create hardware frames, sets the device the + * filter should create them in. All other filters will ignore this field: + * in particular, a filter which consumes or processes hardware frames will + * instead use the hw_frames_ctx field in AVFilterLink to carry the + * hardware context information. + */ + AVBufferRef *hw_device_ctx; + + /** + * Max number of threads allowed in this filter instance. + * If <= 0, its value is ignored. + * Overrides global number of threads set per filter graph. + */ + int nb_threads; + + /** + * Ready status of the filter. + * A non-0 value means that the filter needs activating; + * a higher value suggests a more urgent activation. + */ + unsigned ready; + + /** + * Sets the number of extra hardware frames which the filter will + * allocate on its output links for use in following filters or by + * the caller. + * + * Some hardware filters require all frames that they will use for + * output to be defined in advance before filtering starts. For such + * filters, any hardware frame pools used for output must therefore be + * of fixed size. The extra frames set here are on top of any number + * that the filter needs internally in order to operate normally. + * + * This field must be set before the graph containing this filter is + * configured. + */ + int extra_hw_frames; +}; + +/** + * A link between two filters. This contains pointers to the source and + * destination filters between which this link exists, and the indexes of + * the pads involved. In addition, this link also contains the parameters + * which have been negotiated and agreed upon between the filter, such as + * image dimensions, format, etc. + * + * Applications must not normally access the link structure directly. + * Use the buffersrc and buffersink API instead. + * In the future, access to the header may be reserved for filters + * implementation. + */ +struct AVFilterLink { + AVFilterContext *src; ///< source filter + AVFilterPad *srcpad; ///< output pad on the source filter + + AVFilterContext *dst; ///< dest filter + AVFilterPad *dstpad; ///< input pad on the dest filter + + enum AVMediaType type; ///< filter media type + + /* These parameters apply only to video */ + int w; ///< agreed upon image width + int h; ///< agreed upon image height + AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio + /* These parameters apply only to audio */ + uint64_t channel_layout; ///< channel layout of current buffer (see libavutil/channel_layout.h) + int sample_rate; ///< samples per second + + int format; ///< agreed upon media format + + /** + * Define the time base used by the PTS of the frames/samples + * which will pass through this link. + * During the configuration stage, each filter is supposed to + * change only the output timebase, while the timebase of the + * input link is assumed to be an unchangeable property. + */ + AVRational time_base; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + /** + * Lists of formats and channel layouts supported by the input and output + * filters respectively. These lists are used for negotiating the format + * to actually be used, which will be loaded into the format and + * channel_layout members, above, when chosen. + * + */ + AVFilterFormats *in_formats; + AVFilterFormats *out_formats; + + /** + * Lists of channel layouts and sample rates used for automatic + * negotiation. + */ + AVFilterFormats *in_samplerates; + AVFilterFormats *out_samplerates; + struct AVFilterChannelLayouts *in_channel_layouts; + struct AVFilterChannelLayouts *out_channel_layouts; + + /** + * Audio only, the destination filter sets this to a non-zero value to + * request that buffers with the given number of samples should be sent to + * it. AVFilterPad.needs_fifo must also be set on the corresponding input + * pad. + * Last buffer before EOF will be padded with silence. + */ + int request_samples; + + /** stage of the initialization of the link properties (dimensions, etc) */ + enum { + AVLINK_UNINIT = 0, ///< not started + AVLINK_STARTINIT, ///< started, but incomplete + AVLINK_INIT ///< complete + } init_state; + + /** + * Graph the filter belongs to. + */ + struct AVFilterGraph *graph; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in link time_base units. + */ + int64_t current_pts; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in AV_TIME_BASE units. + */ + int64_t current_pts_us; + + /** + * Index in the age array. + */ + int age_index; + + /** + * Frame rate of the stream on the link, or 1/0 if unknown or variable; + * if left to 0/0, will be automatically copied from the first input + * of the source filter if it exists. + * + * Sources should set it to the best estimation of the real frame rate. + * If the source frame rate is unknown or variable, set this to 1/0. + * Filters should update it if necessary depending on their function. + * Sinks can use it to set a default output frame rate. + * It is similar to the r_frame_rate field in AVStream. + */ + AVRational frame_rate; + + /** + * Buffer partially filled with samples to achieve a fixed/minimum size. + */ + AVFrame *partial_buf; + + /** + * Size of the partial buffer to allocate. + * Must be between min_samples and max_samples. + */ + int partial_buf_size; + + /** + * Minimum number of samples to filter at once. If filter_frame() is + * called with fewer samples, it will accumulate them in partial_buf. + * This field and the related ones must not be changed after filtering + * has started. + * If 0, all related fields are ignored. + */ + int min_samples; + + /** + * Maximum number of samples to filter at once. If filter_frame() is + * called with more samples, it will split them. + */ + int max_samples; + + /** + * Number of channels. + */ + int channels; + + /** + * Link processing flags. + */ + unsigned flags; + + /** + * Number of past frames sent through the link. + */ + int64_t frame_count_in, frame_count_out; + + /** + * A pointer to a FFFramePool struct. + */ + void *frame_pool; + + /** + * True if a frame is currently wanted on the output of this filter. + * Set when ff_request_frame() is called by the output, + * cleared when a frame is filtered. + */ + int frame_wanted_out; + + /** + * For hwaccel pixel formats, this should be a reference to the + * AVHWFramesContext describing the frames. + */ + AVBufferRef *hw_frames_ctx; + +#ifndef FF_INTERNAL_FIELDS + + /** + * Internal structure members. + * The fields below this limit are internal for libavfilter's use + * and must in no way be accessed by applications. + */ + char reserved[0xF000]; + +#else /* FF_INTERNAL_FIELDS */ + + /** + * Queue of frames waiting to be filtered. + */ + FFFrameQueue fifo; + + /** + * If set, the source filter can not generate a frame as is. + * The goal is to avoid repeatedly calling the request_frame() method on + * the same link. + */ + int frame_blocked_in; + + /** + * Link input status. + * If not zero, all attempts of filter_frame will fail with the + * corresponding code. + */ + int status_in; + + /** + * Timestamp of the input status change. + */ + int64_t status_in_pts; + + /** + * Link output status. + * If not zero, all attempts of request_frame will fail with the + * corresponding code. + */ + int status_out; + +#endif /* FF_INTERNAL_FIELDS */ + +}; + +/** + * Link two filters together. + * + * @param src the source filter + * @param srcpad index of the output pad on the source filter + * @param dst the destination filter + * @param dstpad index of the input pad on the destination filter + * @return zero on success + */ +int avfilter_link(AVFilterContext *src, unsigned srcpad, + AVFilterContext *dst, unsigned dstpad); + +/** + * Free the link in *link, and set its pointer to NULL. + */ +void avfilter_link_free(AVFilterLink **link); + +#if FF_API_FILTER_GET_SET +/** + * Get the number of channels of a link. + * @deprecated Use av_buffersink_get_channels() + */ +attribute_deprecated +int avfilter_link_get_channels(AVFilterLink *link); +#endif + +/** + * Set the closed field of a link. + * @deprecated applications are not supposed to mess with links, they should + * close the sinks. + */ +attribute_deprecated +void avfilter_link_set_closed(AVFilterLink *link, int closed); + +/** + * Negotiate the media format, dimensions, etc of all inputs to a filter. + * + * @param filter the filter to negotiate the properties for its inputs + * @return zero on successful negotiation + */ +int avfilter_config_links(AVFilterContext *filter); + +#define AVFILTER_CMD_FLAG_ONE 1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically +#define AVFILTER_CMD_FLAG_FAST 2 ///< Only execute command when its fast (like a video out that supports contrast adjustment in hw) + +/** + * Make the filter instance process a command. + * It is recommended to use avfilter_graph_send_command(). + */ +int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Iterate over all registered filters. + * + * @param opaque a pointer where libavfilter will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered filter or NULL when the iteration is + * finished + */ +const AVFilter *av_filter_iterate(void **opaque); + +#if FF_API_NEXT +/** Initialize the filter system. Register all builtin filters. */ +attribute_deprecated +void avfilter_register_all(void); + +/** + * Register a filter. This is only needed if you plan to use + * avfilter_get_by_name later to lookup the AVFilter structure by name. A + * filter can still by instantiated with avfilter_graph_alloc_filter even if it + * is not registered. + * + * @param filter the filter to register + * @return 0 if the registration was successful, a negative value + * otherwise + */ +attribute_deprecated +int avfilter_register(AVFilter *filter); + +/** + * Iterate over all registered filters. + * @return If prev is non-NULL, next registered filter after prev or NULL if + * prev is the last filter. If prev is NULL, return the first registered filter. + */ +attribute_deprecated +const AVFilter *avfilter_next(const AVFilter *prev); +#endif + +/** + * Get a filter definition matching the given name. + * + * @param name the filter name to find + * @return the filter definition, if any matching one is registered. + * NULL if none found. + */ +const AVFilter *avfilter_get_by_name(const char *name); + + +/** + * Initialize a filter with the supplied parameters. + * + * @param ctx uninitialized filter context to initialize + * @param args Options to initialize the filter with. This must be a + * ':'-separated list of options in the 'key=value' form. + * May be NULL if the options have been set directly using the + * AVOptions API or there are no options that need to be set. + * @return 0 on success, a negative AVERROR on failure + */ +int avfilter_init_str(AVFilterContext *ctx, const char *args); + +/** + * Initialize a filter with the supplied dictionary of options. + * + * @param ctx uninitialized filter context to initialize + * @param options An AVDictionary filled with options for this filter. On + * return this parameter will be destroyed and replaced with + * a dict containing options that were not found. This dictionary + * must be freed by the caller. + * May be NULL, then this function is equivalent to + * avfilter_init_str() with the second parameter set to NULL. + * @return 0 on success, a negative AVERROR on failure + * + * @note This function and avfilter_init_str() do essentially the same thing, + * the difference is in manner in which the options are passed. It is up to the + * calling code to choose whichever is more preferable. The two functions also + * behave differently when some of the provided options are not declared as + * supported by the filter. In such a case, avfilter_init_str() will fail, but + * this function will leave those extra options in the options AVDictionary and + * continue as usual. + */ +int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options); + +/** + * Free a filter context. This will also remove the filter from its + * filtergraph's list of filters. + * + * @param filter the filter to free + */ +void avfilter_free(AVFilterContext *filter); + +/** + * Insert a filter in the middle of an existing link. + * + * @param link the link into which the filter should be inserted + * @param filt the filter to be inserted + * @param filt_srcpad_idx the input pad on the filter to connect + * @param filt_dstpad_idx the output pad on the filter to connect + * @return zero on success + */ +int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, + unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); + +/** + * @return AVClass for AVFilterContext. + * + * @see av_opt_find(). + */ +const AVClass *avfilter_get_class(void); + +typedef struct AVFilterGraphInternal AVFilterGraphInternal; + +/** + * A function pointer passed to the @ref AVFilterGraph.execute callback to be + * executed multiple times, possibly in parallel. + * + * @param ctx the filter context the job belongs to + * @param arg an opaque parameter passed through from @ref + * AVFilterGraph.execute + * @param jobnr the index of the job being executed + * @param nb_jobs the total number of jobs + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_action_func)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); + +/** + * A function executing multiple jobs, possibly in parallel. + * + * @param ctx the filter context to which the jobs belong + * @param func the function to be called multiple times + * @param arg the argument to be passed to func + * @param ret a nb_jobs-sized array to be filled with return values from each + * invocation of func + * @param nb_jobs the number of jobs to execute + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_execute_func)(AVFilterContext *ctx, avfilter_action_func *func, + void *arg, int *ret, int nb_jobs); + +typedef struct AVFilterGraph { + const AVClass *av_class; + AVFilterContext **filters; + unsigned nb_filters; + + char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters +#if FF_API_LAVR_OPTS + attribute_deprecated char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters +#endif + + /** + * Type of multithreading allowed for filters in this graph. A combination + * of AVFILTER_THREAD_* flags. + * + * May be set by the caller at any point, the setting will apply to all + * filters initialized after that. The default is allowing everything. + * + * When a filter in this graph is initialized, this field is combined using + * bit AND with AVFilterContext.thread_type to get the final mask used for + * determining allowed threading types. I.e. a threading type needs to be + * set in both to be allowed. + */ + int thread_type; + + /** + * Maximum number of threads used by filters in this graph. May be set by + * the caller before adding any filters to the filtergraph. Zero (the + * default) means that the number of threads is determined automatically. + */ + int nb_threads; + + /** + * Opaque object for libavfilter internal use. + */ + AVFilterGraphInternal *internal; + + /** + * Opaque user data. May be set by the caller to an arbitrary value, e.g. to + * be used from callbacks like @ref AVFilterGraph.execute. + * Libavfilter will not touch this field in any way. + */ + void *opaque; + + /** + * This callback may be set by the caller immediately after allocating the + * graph and before adding any filters to it, to provide a custom + * multithreading implementation. + * + * If set, filters with slice threading capability will call this callback + * to execute multiple jobs in parallel. + * + * If this field is left unset, libavfilter will use its internal + * implementation, which may or may not be multithreaded depending on the + * platform and build options. + */ + avfilter_execute_func *execute; + + char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions + + /** + * Private fields + * + * The following fields are for internal use only. + * Their type, offset, number and semantic can change without notice. + */ + + AVFilterLink **sink_links; + int sink_links_count; + + unsigned disable_auto_convert; +} AVFilterGraph; + +/** + * Allocate a filter graph. + * + * @return the allocated filter graph on success or NULL. + */ +AVFilterGraph *avfilter_graph_alloc(void); + +/** + * Create a new filter instance in a filter graph. + * + * @param graph graph in which the new filter will be used + * @param filter the filter to create an instance of + * @param name Name to give to the new instance (will be copied to + * AVFilterContext.name). This may be used by the caller to identify + * different filters, libavfilter itself assigns no semantics to + * this parameter. May be NULL. + * + * @return the context of the newly created filter instance (note that it is + * also retrievable directly through AVFilterGraph.filters or with + * avfilter_graph_get_filter()) on success or NULL on failure. + */ +AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, + const AVFilter *filter, + const char *name); + +/** + * Get a filter instance identified by instance name from graph. + * + * @param graph filter graph to search through. + * @param name filter instance name (should be unique in the graph). + * @return the pointer to the found filter instance or NULL if it + * cannot be found. + */ +AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); + +/** + * Create and add a filter instance into an existing graph. + * The filter instance is created from the filter filt and inited + * with the parameters args and opaque. + * + * In case of success put in *filt_ctx the pointer to the created + * filter instance, otherwise set *filt_ctx to NULL. + * + * @param name the instance name to give to the created filter instance + * @param graph_ctx the filter graph + * @return a negative AVERROR error code in case of failure, a non + * negative value otherwise + */ +int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, + const char *name, const char *args, void *opaque, + AVFilterGraph *graph_ctx); + +/** + * Enable or disable automatic format conversion inside the graph. + * + * Note that format conversion can still happen inside explicitly inserted + * scale and aresample filters. + * + * @param flags any of the AVFILTER_AUTO_CONVERT_* constants + */ +void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags); + +enum { + AVFILTER_AUTO_CONVERT_ALL = 0, /**< all automatic conversions enabled */ + AVFILTER_AUTO_CONVERT_NONE = -1, /**< all automatic conversions disabled */ +}; + +/** + * Check validity and configure all the links and formats in the graph. + * + * @param graphctx the filter graph + * @param log_ctx context used for logging + * @return >= 0 in case of success, a negative AVERROR code otherwise + */ +int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx); + +/** + * Free a graph, destroy its links, and set *graph to NULL. + * If *graph is NULL, do nothing. + */ +void avfilter_graph_free(AVFilterGraph **graph); + +/** + * A linked-list of the inputs/outputs of the filter chain. + * + * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(), + * where it is used to communicate open (unlinked) inputs and outputs from and + * to the caller. + * This struct specifies, per each not connected pad contained in the graph, the + * filter context and the pad index required for establishing a link. + */ +typedef struct AVFilterInOut { + /** unique name for this input/output in the list */ + char *name; + + /** filter context associated to this input/output */ + AVFilterContext *filter_ctx; + + /** index of the filt_ctx pad to use for linking */ + int pad_idx; + + /** next input/input in the list, NULL if this is the last */ + struct AVFilterInOut *next; +} AVFilterInOut; + +/** + * Allocate a single AVFilterInOut entry. + * Must be freed with avfilter_inout_free(). + * @return allocated AVFilterInOut on success, NULL on failure. + */ +AVFilterInOut *avfilter_inout_alloc(void); + +/** + * Free the supplied list of AVFilterInOut and set *inout to NULL. + * If *inout is NULL, do nothing. + */ +void avfilter_inout_free(AVFilterInOut **inout); + +/** + * Add a graph described by a string to a graph. + * + * @note The caller must provide the lists of inputs and outputs, + * which therefore must be known before calling the function. + * + * @note The inputs parameter describes inputs of the already existing + * part of the graph; i.e. from the point of view of the newly created + * part, they are outputs. Similarly the outputs parameter describes + * outputs of the already existing filters, which are provided as + * inputs to the parsed filters. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs linked list to the inputs of the graph + * @param outputs linked list to the outputs of the graph + * @return zero on success, a negative AVERROR code on error + */ +int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, + AVFilterInOut *inputs, AVFilterInOut *outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * In the graph filters description, if the input label of the first + * filter is not specified, "in" is assumed; if the output label of + * the last filter is not specified, "out" is assumed. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. + * If non-NULL, *inputs is updated to contain the list of open inputs + * after the parsing, should be freed with avfilter_inout_free(). + * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. + * If non-NULL, *outputs is updated to contain the list of open outputs + * after the parsing, should be freed with avfilter_inout_free(). + * @return non negative on success, a negative AVERROR code on error + */ +int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, AVFilterInOut **outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * @param[in] graph the filter graph where to link the parsed graph context + * @param[in] filters string to be parsed + * @param[out] inputs a linked list of all free (unlinked) inputs of the + * parsed graph will be returned here. It is to be freed + * by the caller using avfilter_inout_free(). + * @param[out] outputs a linked list of all free (unlinked) outputs of the + * parsed graph will be returned here. It is to be freed by the + * caller using avfilter_inout_free(). + * @return zero on success, a negative AVERROR code on error + * + * @note This function returns the inputs and outputs that are left + * unlinked after parsing the graph and the caller then deals with + * them. + * @note This function makes no reference whatsoever to already + * existing parts of the graph and the inputs parameter will on return + * contain inputs of the newly parsed part of the graph. Analogously + * the outputs parameter will contain outputs of the newly created + * filters. + */ +int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, + AVFilterInOut **outputs); + +/** + * Send a command to one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to send, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ +int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Queue a command for one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to sent, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param ts time at which the command should be sent to the filter + * + * @note As this executes commands after this function returns, no return code + * from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported. + */ +int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts); + + +/** + * Dump a graph into a human-readable string representation. + * + * @param graph the graph to dump + * @param options formatting options; currently ignored + * @return a string, or NULL in case of memory allocation failure; + * the string must be freed using av_free + */ +char *avfilter_graph_dump(AVFilterGraph *graph, const char *options); + +/** + * Request a frame on the oldest sink link. + * + * If the request returns AVERROR_EOF, try the next. + * + * Note that this function is not meant to be the sole scheduling mechanism + * of a filtergraph, only a convenience function to help drain a filtergraph + * in a balanced way under normal circumstances. + * + * Also note that AVERROR_EOF does not mean that frames did not arrive on + * some of the sinks during the process. + * When there are multiple sink links, in case the requested link + * returns an EOF, this may cause a filter to flush pending frames + * which are sent to another sink link, although unrequested. + * + * @return the return value of ff_request_frame(), + * or AVERROR_EOF if all links returned AVERROR_EOF + */ +int avfilter_graph_request_oldest(AVFilterGraph *graph); + +/** + * @} + */ + +#endif /* AVFILTER_AVFILTER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersink.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersink.h new file mode 100644 index 0000000..3c846bb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersink.h @@ -0,0 +1,165 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSINK_H +#define AVFILTER_BUFFERSINK_H + +/** + * @file + * @ingroup lavfi_buffersink + * memory buffer sink API for audio and video + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersink Buffer sink API + * @ingroup lavfi + * @{ + */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a buffersink or abuffersink filter context. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * @param flags a combination of AV_BUFFERSINK_FLAG_* flags + * + * @return >= 0 in for success, a negative AVERROR code for failure. + */ +int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); + +/** + * Tell av_buffersink_get_buffer_ref() to read video/samples buffer + * reference, but not remove it from the buffer. This is useful if you + * need only to read a video/samples buffer, without to fetch it. + */ +#define AV_BUFFERSINK_FLAG_PEEK 1 + +/** + * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. + * If a frame is already buffered, it is read (and removed from the buffer), + * but if no frame is present, return AVERROR(EAGAIN). + */ +#define AV_BUFFERSINK_FLAG_NO_REQUEST 2 + +/** + * Struct to use for initializing a buffersink context. + */ +typedef struct AVBufferSinkParams { + const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE +} AVBufferSinkParams; + +/** + * Create an AVBufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVBufferSinkParams *av_buffersink_params_alloc(void); + +/** + * Struct to use for initializing an abuffersink context. + */ +typedef struct AVABufferSinkParams { + const enum AVSampleFormat *sample_fmts; ///< list of allowed sample formats, terminated by AV_SAMPLE_FMT_NONE + const int64_t *channel_layouts; ///< list of allowed channel layouts, terminated by -1 + const int *channel_counts; ///< list of allowed channel counts, terminated by -1 + int all_channel_counts; ///< if not 0, accept any channel count or layout + int *sample_rates; ///< list of allowed sample rates, terminated by -1 +} AVABufferSinkParams; + +/** + * Create an AVABufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVABufferSinkParams *av_abuffersink_params_alloc(void); + +/** + * Set the frame size for an audio buffer sink. + * + * All calls to av_buffersink_get_buffer_ref will return a buffer with + * exactly the specified number of samples, or AVERROR(EAGAIN) if there is + * not enough. The last buffer at EOF will be padded with 0. + */ +void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); + +/** + * @defgroup lavfi_buffersink_accessors Buffer sink accessors + * Get the properties of the stream + * @{ + */ + +enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); +AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); +int av_buffersink_get_format (const AVFilterContext *ctx); + +AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); +int av_buffersink_get_w (const AVFilterContext *ctx); +int av_buffersink_get_h (const AVFilterContext *ctx); +AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); + +int av_buffersink_get_channels (const AVFilterContext *ctx); +uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); +int av_buffersink_get_sample_rate (const AVFilterContext *ctx); + +AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx); + +/** @} */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * + * @return + * - >= 0 if a frame was successfully returned. + * - AVERROR(EAGAIN) if no frames are available at this point; more + * input frames must be added to the filtergraph to get more output. + * - AVERROR_EOF if there will be no more output frames on this sink. + * - A different negative AVERROR code in other failure cases. + */ +int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Same as av_buffersink_get_frame(), but with the ability to specify the number + * of samples read. This function is less efficient than + * av_buffersink_get_frame(), because it copies the data around. + * + * @param ctx pointer to a context of the abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * frame will contain exactly nb_samples audio samples, except at + * the end of stream, when it can contain less than nb_samples. + * + * @return The return codes have the same meaning as for + * av_buffersink_get_frame(). + * + * @warning do not mix this function with av_buffersink_get_frame(). Use only one or + * the other with a single sink, not both. + */ +int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSINK_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersrc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersrc.h new file mode 100644 index 0000000..08fbd18 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/buffersrc.h @@ -0,0 +1,209 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSRC_H +#define AVFILTER_BUFFERSRC_H + +/** + * @file + * @ingroup lavfi_buffersrc + * Memory buffer source API. + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersrc Buffer source API + * @ingroup lavfi + * @{ + */ + +enum { + + /** + * Do not check for format changes. + */ + AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, + + /** + * Immediately push the frame to the output. + */ + AV_BUFFERSRC_FLAG_PUSH = 4, + + /** + * Keep a reference to the frame. + * If the frame if reference-counted, create a new reference; otherwise + * copy the frame data. + */ + AV_BUFFERSRC_FLAG_KEEP_REF = 8, + +}; + +/** + * Get the number of failed requests. + * + * A failed request is when the request_frame method is called while no + * frame is present in the buffer. + * The number is reset when a frame is added. + */ +unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); + +/** + * This structure contains the parameters describing the frames that will be + * passed to this filter. + * + * It should be allocated with av_buffersrc_parameters_alloc() and freed with + * av_free(). All the allocated fields in it remain owned by the caller. + */ +typedef struct AVBufferSrcParameters { + /** + * video: the pixel format, value corresponds to enum AVPixelFormat + * audio: the sample format, value corresponds to enum AVSampleFormat + */ + int format; + /** + * The timebase to be used for the timestamps on the input frames. + */ + AVRational time_base; + + /** + * Video only, the display dimensions of the input frames. + */ + int width, height; + + /** + * Video only, the sample (pixel) aspect ratio. + */ + AVRational sample_aspect_ratio; + + /** + * Video only, the frame rate of the input video. This field must only be + * set to a non-zero value if input stream has a known constant framerate + * and should be left at its initial value if the framerate is variable or + * unknown. + */ + AVRational frame_rate; + + /** + * Video with a hwaccel pixel format only. This should be a reference to an + * AVHWFramesContext instance describing the input frames. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only, the audio sampling rate in samples per second. + */ + int sample_rate; + + /** + * Audio only, the audio channel layout + */ + uint64_t channel_layout; +} AVBufferSrcParameters; + +/** + * Allocate a new AVBufferSrcParameters instance. It should be freed by the + * caller with av_free(). + */ +AVBufferSrcParameters *av_buffersrc_parameters_alloc(void); + +/** + * Initialize the buffersrc or abuffersrc filter with the provided parameters. + * This function may be called multiple times, the later calls override the + * previous ones. Some of the parameters may also be set through AVOptions, then + * whatever method is used last takes precedence. + * + * @param ctx an instance of the buffersrc or abuffersrc filter + * @param param the stream parameters. The frames later passed to this filter + * must conform to those parameters. All the allocated fields in + * param remain owned by the caller, libavfilter will make internal + * copies or references when necessary. + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will make a new reference to it. Otherwise the frame data will be + * copied. + * + * @return 0 on success, a negative AVERROR on error + * + * This function is equivalent to av_buffersrc_add_frame_flags() with the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will take ownership of the reference(s) and reset the frame. + * Otherwise the frame data will be copied. If this function returns an error, + * the input frame is not touched. + * + * @return 0 on success, a negative AVERROR on error. + * + * @note the difference between this function and av_buffersrc_write_frame() is + * that av_buffersrc_write_frame() creates a new reference to the input frame, + * while this function takes ownership of the reference passed to it. + * + * This function is equivalent to av_buffersrc_add_frame_flags() without the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * By default, if the frame is reference-counted, this function will take + * ownership of the reference(s) and reset the frame. This can be controlled + * using the flags. + * + * If this function returns an error, the input frame is not touched. + * + * @param buffer_src pointer to a buffer source context + * @param frame a frame, or NULL to mark EOF + * @param flags a combination of AV_BUFFERSRC_FLAG_* + * @return >= 0 in case of success, a negative AVERROR code + * in case of failure + */ +av_warn_unused_result +int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, + AVFrame *frame, int flags); + +/** + * Close the buffer source after EOF. + * + * This is similar to passing NULL to av_buffersrc_add_frame_flags() + * except it takes the timestamp of the EOF, i.e. the timestamp of the end + * of the last frame. + */ +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/version.h new file mode 100644 index 0000000..cc5b23b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavfilter/version.h @@ -0,0 +1,66 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFILTER_VERSION_H +#define AVFILTER_VERSION_H + +/** + * @file + * @ingroup lavfi + * Libavfilter version macros + */ + +#include "libavutil/version.h" + +#define LIBAVFILTER_VERSION_MAJOR 7 +#define LIBAVFILTER_VERSION_MINOR 57 +#define LIBAVFILTER_VERSION_MICRO 100 + + +#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT + +#define LIBAVFILTER_IDENT "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_OLD_FILTER_OPTS_ERROR +#define FF_API_OLD_FILTER_OPTS_ERROR (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_LAVR_OPTS +#define FF_API_LAVR_OPTS (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_FILTER_GET_SET +#define FF_API_FILTER_GET_SET (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFILTER_VERSION_MAJOR < 8) +#endif + +#endif /* AVFILTER_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avformat.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avformat.h new file mode 100644 index 0000000..6eb329f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avformat.h @@ -0,0 +1,3092 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVFORMAT_AVFORMAT_H +#define AVFORMAT_AVFORMAT_H + +/** + * @file + * @ingroup libavf + * Main libavformat public API header + */ + +/** + * @defgroup libavf libavformat + * I/O and Muxing/Demuxing Library + * + * Libavformat (lavf) is a library for dealing with various media container + * formats. Its main two purposes are demuxing - i.e. splitting a media file + * into component streams, and the reverse process of muxing - writing supplied + * data in a specified container format. It also has an @ref lavf_io + * "I/O module" which supports a number of protocols for accessing the data (e.g. + * file, tcp, http and others). + * Unless you are absolutely sure you won't use libavformat's network + * capabilities, you should also call avformat_network_init(). + * + * A supported input format is described by an AVInputFormat struct, conversely + * an output format is described by AVOutputFormat. You can iterate over all + * input/output formats using the av_demuxer_iterate / av_muxer_iterate() functions. + * The protocols layer is not part of the public API, so you can only get the names + * of supported protocols with the avio_enum_protocols() function. + * + * Main lavf structure used for both muxing and demuxing is AVFormatContext, + * which exports all information about the file being read or written. As with + * most Libavformat structures, its size is not part of public ABI, so it cannot be + * allocated on stack or directly with av_malloc(). To create an + * AVFormatContext, use avformat_alloc_context() (some functions, like + * avformat_open_input() might do that for you). + * + * Most importantly an AVFormatContext contains: + * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat + * "output" format. It is either autodetected or set by user for input; + * always set by user for output. + * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all + * elementary streams stored in the file. AVStreams are typically referred to + * using their index in this array. + * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or + * set by user for input, always set by user for output (unless you are dealing + * with an AVFMT_NOFILE format). + * + * @section lavf_options Passing options to (de)muxers + * It is possible to configure lavf muxers and demuxers using the @ref avoptions + * mechanism. Generic (format-independent) libavformat options are provided by + * AVFormatContext, they can be examined from a user program by calling + * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass + * from avformat_get_class()). Private (format-specific) options are provided by + * AVFormatContext.priv_data if and only if AVInputFormat.priv_class / + * AVOutputFormat.priv_class of the corresponding format struct is non-NULL. + * Further options may be provided by the @ref AVFormatContext.pb "I/O context", + * if its AVClass is non-NULL, and the protocols layer. See the discussion on + * nesting in @ref avoptions documentation to learn how to access those. + * + * @section urls + * URL strings in libavformat are made of a scheme/protocol, a ':', and a + * scheme specific string. URLs without a scheme and ':' used for local files + * are supported but deprecated. "file:" should be used for local files. + * + * It is important that the scheme string is not taken from untrusted + * sources without checks. + * + * Note that some schemes/protocols are quite powerful, allowing access to + * both local and remote files, parts of them, concatenations of them, local + * audio and video devices and so on. + * + * @{ + * + * @defgroup lavf_decoding Demuxing + * @{ + * Demuxers read a media file and split it into chunks of data (@em packets). A + * @ref AVPacket "packet" contains one or more encoded frames which belongs to a + * single elementary stream. In the lavf API this process is represented by the + * avformat_open_input() function for opening a file, av_read_frame() for + * reading a single packet and finally avformat_close_input(), which does the + * cleanup. + * + * @section lavf_decoding_open Opening a media file + * The minimum information required to open a file is its URL, which + * is passed to avformat_open_input(), as in the following code: + * @code + * const char *url = "file:in.mp3"; + * AVFormatContext *s = NULL; + * int ret = avformat_open_input(&s, url, NULL, NULL); + * if (ret < 0) + * abort(); + * @endcode + * The above code attempts to allocate an AVFormatContext, open the + * specified file (autodetecting the format) and read the header, exporting the + * information stored there into s. Some formats do not have a header or do not + * store enough information there, so it is recommended that you call the + * avformat_find_stream_info() function which tries to read and decode a few + * frames to find missing information. + * + * In some cases you might want to preallocate an AVFormatContext yourself with + * avformat_alloc_context() and do some tweaking on it before passing it to + * avformat_open_input(). One such case is when you want to use custom functions + * for reading input data instead of lavf internal I/O layer. + * To do that, create your own AVIOContext with avio_alloc_context(), passing + * your reading callbacks to it. Then set the @em pb field of your + * AVFormatContext to newly created AVIOContext. + * + * Since the format of the opened file is in general not known until after + * avformat_open_input() has returned, it is not possible to set demuxer private + * options on a preallocated context. Instead, the options should be passed to + * avformat_open_input() wrapped in an AVDictionary: + * @code + * AVDictionary *options = NULL; + * av_dict_set(&options, "video_size", "640x480", 0); + * av_dict_set(&options, "pixel_format", "rgb24", 0); + * + * if (avformat_open_input(&s, url, NULL, &options) < 0) + * abort(); + * av_dict_free(&options); + * @endcode + * This code passes the private options 'video_size' and 'pixel_format' to the + * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it + * cannot know how to interpret raw video data otherwise. If the format turns + * out to be something different than raw video, those options will not be + * recognized by the demuxer and therefore will not be applied. Such unrecognized + * options are then returned in the options dictionary (recognized options are + * consumed). The calling program can handle such unrecognized options as it + * wishes, e.g. + * @code + * AVDictionaryEntry *e; + * if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { + * fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); + * abort(); + * } + * @endcode + * + * After you have finished reading the file, you must close it with + * avformat_close_input(). It will free everything associated with the file. + * + * @section lavf_decoding_read Reading from an opened file + * Reading data from an opened AVFormatContext is done by repeatedly calling + * av_read_frame() on it. Each call, if successful, will return an AVPacket + * containing encoded data for one AVStream, identified by + * AVPacket.stream_index. This packet may be passed straight into the libavcodec + * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the + * caller wishes to decode the data. + * + * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be + * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for + * pts/dts, 0 for duration) if the stream does not provide them. The timing + * information will be in AVStream.time_base units, i.e. it has to be + * multiplied by the timebase to convert them to seconds. + * + * If AVPacket.buf is set on the returned packet, then the packet is + * allocated dynamically and the user may keep it indefinitely. + * Otherwise, if AVPacket.buf is NULL, the packet data is backed by a + * static storage somewhere inside the demuxer and the packet is only valid + * until the next av_read_frame() call or closing the file. If the caller + * requires a longer lifetime, av_packet_make_refcounted() will ensure that + * the data is reference counted, copying the data if necessary. + * In both cases, the packet must be freed with av_packet_unref() when it is no + * longer needed. + * + * @section lavf_decoding_seek Seeking + * @} + * + * @defgroup lavf_encoding Muxing + * @{ + * Muxers take encoded data in the form of @ref AVPacket "AVPackets" and write + * it into files or other output bytestreams in the specified container format. + * + * The main API functions for muxing are avformat_write_header() for writing the + * file header, av_write_frame() / av_interleaved_write_frame() for writing the + * packets and av_write_trailer() for finalizing the file. + * + * At the beginning of the muxing process, the caller must first call + * avformat_alloc_context() to create a muxing context. The caller then sets up + * the muxer by filling the various fields in this context: + * + * - The @ref AVFormatContext.oformat "oformat" field must be set to select the + * muxer that will be used. + * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb + * "pb" field must be set to an opened IO context, either returned from + * avio_open2() or a custom one. + * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must + * be created with the avformat_new_stream() function. The caller should fill + * the @ref AVStream.codecpar "stream codec parameters" information, such as the + * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id + * "id" and other parameters (e.g. width / height, the pixel or sample format, + * etc.) as known. The @ref AVStream.time_base "stream timebase" should + * be set to the timebase that the caller desires to use for this stream (note + * that the timebase actually used by the muxer can be different, as will be + * described later). + * - It is advised to manually initialize only the relevant fields in + * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during + * remuxing: there is no guarantee that the codec context values remain valid + * for both input and output format contexts. + * - The caller may fill in additional information, such as @ref + * AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream" + * metadata, @ref AVFormatContext.chapters "chapters", @ref + * AVFormatContext.programs "programs", etc. as described in the + * AVFormatContext documentation. Whether such information will actually be + * stored in the output depends on what the container format and the muxer + * support. + * + * When the muxing context is fully set up, the caller must call + * avformat_write_header() to initialize the muxer internals and write the file + * header. Whether anything actually is written to the IO context at this step + * depends on the muxer, but this function must always be called. Any muxer + * private options must be passed in the options parameter to this function. + * + * The data is then sent to the muxer by repeatedly calling av_write_frame() or + * av_interleaved_write_frame() (consult those functions' documentation for + * discussion on the difference between them; only one of them may be used with + * a single muxing context, they should not be mixed). Do note that the timing + * information on the packets sent to the muxer must be in the corresponding + * AVStream's timebase. That timebase is set by the muxer (in the + * avformat_write_header() step) and may be different from the timebase + * requested by the caller. + * + * Once all the data has been written, the caller must call av_write_trailer() + * to flush any buffered packets and finalize the output file, then close the IO + * context (if any) and finally free the muxing context with + * avformat_free_context(). + * @} + * + * @defgroup lavf_io I/O Read/Write + * @{ + * @section lavf_io_dirlist Directory listing + * The directory listing API makes it possible to list files on remote servers. + * + * Some of possible use cases: + * - an "open file" dialog to choose files from a remote location, + * - a recursive media finder providing a player with an ability to play all + * files from a given directory. + * + * @subsection lavf_io_dirlist_open Opening a directory + * At first, a directory needs to be opened by calling avio_open_dir() + * supplied with a URL and, optionally, ::AVDictionary containing + * protocol-specific parameters. The function returns zero or positive + * integer and allocates AVIODirContext on success. + * + * @code + * AVIODirContext *ctx = NULL; + * if (avio_open_dir(&ctx, "smb://example.com/some_dir", NULL) < 0) { + * fprintf(stderr, "Cannot open directory.\n"); + * abort(); + * } + * @endcode + * + * This code tries to open a sample directory using smb protocol without + * any additional parameters. + * + * @subsection lavf_io_dirlist_read Reading entries + * Each directory's entry (i.e. file, another directory, anything else + * within ::AVIODirEntryType) is represented by AVIODirEntry. + * Reading consecutive entries from an opened AVIODirContext is done by + * repeatedly calling avio_read_dir() on it. Each call returns zero or + * positive integer if successful. Reading can be stopped right after the + * NULL entry has been read -- it means there are no entries left to be + * read. The following code reads all entries from a directory associated + * with ctx and prints their names to standard output. + * @code + * AVIODirEntry *entry = NULL; + * for (;;) { + * if (avio_read_dir(ctx, &entry) < 0) { + * fprintf(stderr, "Cannot list directory.\n"); + * abort(); + * } + * if (!entry) + * break; + * printf("%s\n", entry->name); + * avio_free_directory_entry(&entry); + * } + * @endcode + * @} + * + * @defgroup lavf_codec Demuxers + * @{ + * @defgroup lavf_codec_native Native Demuxers + * @{ + * @} + * @defgroup lavf_codec_wrappers External library wrappers + * @{ + * @} + * @} + * @defgroup lavf_protos I/O Protocols + * @{ + * @} + * @defgroup lavf_internal Internal + * @{ + * @} + * @} + */ + +#include +#include /* FILE */ +#include "libavcodec/avcodec.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "avio.h" +#include "libavformat/version.h" + +struct AVFormatContext; + +struct AVDeviceInfoList; +struct AVDeviceCapabilitiesQuery; + +/** + * @defgroup metadata_api Public Metadata API + * @{ + * @ingroup libavf + * The metadata API allows libavformat to export metadata tags to a client + * application when demuxing. Conversely it allows a client application to + * set metadata when muxing. + * + * Metadata is exported or set as pairs of key/value strings in the 'metadata' + * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs + * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg, + * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata + * exported by demuxers isn't checked to be valid UTF-8 in most cases. + * + * Important concepts to keep in mind: + * - Keys are unique; there can never be 2 tags with the same key. This is + * also meant semantically, i.e., a demuxer should not knowingly produce + * several keys that are literally different but semantically identical. + * E.g., key=Author5, key=Author6. In this example, all authors must be + * placed in the same tag. + * - Metadata is flat, not hierarchical; there are no subtags. If you + * want to store, e.g., the email address of the child of producer Alice + * and actor Bob, that could have key=alice_and_bobs_childs_email_address. + * - Several modifiers can be applied to the tag name. This is done by + * appending a dash character ('-') and the modifier name in the order + * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. + * - language -- a tag whose value is localized for a particular language + * is appended with the ISO 639-2/B 3-letter language code. + * For example: Author-ger=Michael, Author-eng=Mike + * The original/default language is in the unqualified "Author" tag. + * A demuxer should set a default if it sets any translated tag. + * - sorting -- a modified version of a tag that should be used for + * sorting will have '-sort' appended. E.g. artist="The Beatles", + * artist-sort="Beatles, The". + * - Some protocols and demuxers support metadata updates. After a successful + * call to av_read_packet(), AVFormatContext.event_flags or AVStream.event_flags + * will be updated to indicate if metadata changed. In order to detect metadata + * changes on a stream, you need to loop through all streams in the AVFormatContext + * and check their individual event_flags. + * + * - Demuxers attempt to export metadata in a generic format, however tags + * with no generic equivalents are left as they are stored in the container. + * Follows a list of generic tag names: + * + @verbatim + album -- name of the set this work belongs to + album_artist -- main creator of the set/album, if different from artist. + e.g. "Various Artists" for compilation albums. + artist -- main creator of the work + comment -- any additional description of the file. + composer -- who composed the work, if different from artist. + copyright -- name of copyright holder. + creation_time-- date when the file was created, preferably in ISO 8601. + date -- date when the work was created, preferably in ISO 8601. + disc -- number of a subset, e.g. disc in a multi-disc collection. + encoder -- name/settings of the software/hardware that produced the file. + encoded_by -- person/group who created the file. + filename -- original name of the file. + genre -- . + language -- main language in which the work is performed, preferably + in ISO 639-2 format. Multiple languages can be specified by + separating them with commas. + performer -- artist who performed the work, if different from artist. + E.g for "Also sprach Zarathustra", artist would be "Richard + Strauss" and performer "London Philharmonic Orchestra". + publisher -- name of the label/publisher. + service_name -- name of the service in broadcasting (channel name). + service_provider -- name of the service provider in broadcasting. + title -- name of the work. + track -- number of this work in the set, can be in form current/total. + variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of + @endverbatim + * + * Look in the examples section for an application example how to use the Metadata API. + * + * @} + */ + +/* packet functions */ + + +/** + * Allocate and read the payload of a packet and initialize its + * fields with default values. + * + * @param s associated IO context + * @param pkt packet + * @param size desired payload size + * @return >0 (read size) if OK, AVERROR_xxx otherwise + */ +int av_get_packet(AVIOContext *s, AVPacket *pkt, int size); + + +/** + * Read data and append it to the current content of the AVPacket. + * If pkt->size is 0 this is identical to av_get_packet. + * Note that this uses av_grow_packet and thus involves a realloc + * which is inefficient. Thus this function should only be used + * when there is no reasonable way to know (an upper bound of) + * the final size. + * + * @param s associated IO context + * @param pkt packet + * @param size amount of data to read + * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data + * will not be lost even if an error occurs. + */ +int av_append_packet(AVIOContext *s, AVPacket *pkt, int size); + +/*************************************************/ +/* input/output formats */ + +struct AVCodecTag; + +/** + * This structure contains the data a format has to probe a file. + */ +typedef struct AVProbeData { + const char *filename; + unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ + int buf_size; /**< Size of buf except extra allocated bytes */ + const char *mime_type; /**< mime_type, when known. */ +} AVProbeData; + +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4) +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1) + +#define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension +#define AVPROBE_SCORE_MIME 75 ///< score for file mime type +#define AVPROBE_SCORE_MAX 100 ///< maximum score + +#define AVPROBE_PADDING_SIZE 32 ///< extra allocated bytes at the end of the probe buffer + +/// Demuxer will use avio_open, no opened file should be provided by the caller. +#define AVFMT_NOFILE 0x0001 +#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ +#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ +#define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ +#define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ +#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ +#define AVFMT_TS_DISCONT 0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */ +#define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ +#define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ +#define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ +#define AVFMT_NOBINSEARCH 0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */ +#define AVFMT_NOGENSEARCH 0x4000 /**< Format does not allow to fall back on generic search */ +#define AVFMT_NO_BYTE_SEEK 0x8000 /**< Format does not allow seeking by bytes */ +#define AVFMT_ALLOW_FLUSH 0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */ +#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly + increasing timestamps, but they must + still be monotonic */ +#define AVFMT_TS_NEGATIVE 0x40000 /**< Format allows muxing negative + timestamps. If not set the timestamp + will be shifted in av_write_frame and + av_interleaved_write_frame so they + start from 0. + The user or muxer can override this through + AVFormatContext.avoid_negative_ts + */ + +#define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */ + +/** + * @addtogroup lavf_encoding + * @{ + */ +typedef struct AVOutputFormat { + const char *name; + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + const char *mime_type; + const char *extensions; /**< comma-separated filename extensions */ + /* output support */ + enum AVCodecID audio_codec; /**< default audio codec */ + enum AVCodecID video_codec; /**< default video codec */ + enum AVCodecID subtitle_codec; /**< default subtitle codec */ + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, + * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, + * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE + */ + int flags; + + /** + * List of supported codec_id-codec_tag pairs, ordered by "better + * choice first". The arrays are all terminated by AV_CODEC_ID_NONE. + */ + const struct AVCodecTag * const *codec_tag; + + + const AVClass *priv_class; ///< AVClass for the private context + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + /** + * The ff_const59 define is not part of the public API and will + * be removed without further warning. + */ +#if FF_API_AVIOFORMAT +#define ff_const59 +#else +#define ff_const59 const +#endif + ff_const59 struct AVOutputFormat *next; + /** + * size of private data so that it can be allocated in the wrapper + */ + int priv_data_size; + + int (*write_header)(struct AVFormatContext *); + /** + * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, + * pkt can be NULL in order to flush data buffered in the muxer. + * When flushing, return 0 if there still is more data to flush, + * or 1 if everything was flushed and there is no more buffered + * data. + */ + int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); + int (*write_trailer)(struct AVFormatContext *); + /** + * Currently only used to set pixel format if not YUV420P. + */ + int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, + AVPacket *in, int flush); + /** + * Test if the given codec can be stored in this container. + * + * @return 1 if the codec is supported, 0 if it is not. + * A negative number if unknown. + * MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC + */ + int (*query_codec)(enum AVCodecID id, int std_compliance); + + void (*get_output_timestamp)(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + /** + * Allows sending messages from application to device. + */ + int (*control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + + /** + * Write an uncoded AVFrame. + * + * See av_write_uncoded_frame() for details. + * + * The library will free *frame afterwards, but the muxer can prevent it + * by setting the pointer to NULL. + */ + int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index, + AVFrame **frame, unsigned flags); + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + enum AVCodecID data_codec; /**< default data codec */ + /** + * Initialize format. May allocate data here, and set any AVFormatContext or + * AVStream parameters that need to be set before packets are sent. + * This method must not write output. + * + * Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure + * + * Any allocations made here must be freed in deinit(). + */ + int (*init)(struct AVFormatContext *); + /** + * Deinitialize format. If present, this is called whenever the muxer is being + * destroyed, regardless of whether or not the header has been written. + * + * If a trailer is being written, this is called after write_trailer(). + * + * This is called if init() fails as well. + */ + void (*deinit)(struct AVFormatContext *); + /** + * Set up any necessary bitstream filtering and extract any extra data needed + * for the global header. + * Return 0 if more packets from this stream must be checked; 1 if not. + */ + int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); +} AVOutputFormat; +/** + * @} + */ + +/** + * @addtogroup lavf_decoding + * @{ + */ +typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ + const char *name; + + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, + * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. + */ + int flags; + + /** + * If extensions are defined, then no probe is done. You should + * usually not use extension format guessing because it is not + * reliable enough + */ + const char *extensions; + + const struct AVCodecTag * const *codec_tag; + + const AVClass *priv_class; ///< AVClass for the private context + + /** + * Comma-separated list of mime types. + * It is used check for matching mime types while probing. + * @see av_probe_input_format2 + */ + const char *mime_type; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + ff_const59 struct AVInputFormat *next; + + /** + * Raw demuxers store their codec ID here. + */ + int raw_codec_id; + + /** + * Size of private data so that it can be allocated in the wrapper. + */ + int priv_data_size; + + /** + * Tell if a given file has a chance of being parsed as this format. + * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes + * big so you do not have to check for that unless you need more. + */ + int (*read_probe)(const AVProbeData *); + + /** + * Read the format header and initialize the AVFormatContext + * structure. Return 0 if OK. 'avformat_new_stream' should be + * called to create new streams. + */ + int (*read_header)(struct AVFormatContext *); + + /** + * Read one packet and put it in 'pkt'. pts and flags are also + * set. 'avformat_new_stream' can be called only if the flag + * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a + * background thread). + * @return 0 on success, < 0 on error. + * When returning an error, pkt must not have been allocated + * or must be freed before returning + */ + int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); + + /** + * Close the stream. The AVFormatContext and AVStreams are not + * freed by this function + */ + int (*read_close)(struct AVFormatContext *); + + /** + * Seek to a given timestamp relative to the frames in + * stream component stream_index. + * @param stream_index Must not be -1. + * @param flags Selects which direction should be preferred if no exact + * match is available. + * @return >= 0 on success (but not necessarily the new offset) + */ + int (*read_seek)(struct AVFormatContext *, + int stream_index, int64_t timestamp, int flags); + + /** + * Get the next timestamp in stream[stream_index].time_base units. + * @return the timestamp or AV_NOPTS_VALUE if an error occurred + */ + int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, + int64_t *pos, int64_t pos_limit); + + /** + * Start/resume playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_play)(struct AVFormatContext *); + + /** + * Pause playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_pause)(struct AVFormatContext *); + + /** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + */ + int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); +} AVInputFormat; +/** + * @} + */ + +enum AVStreamParseType { + AVSTREAM_PARSE_NONE, + AVSTREAM_PARSE_FULL, /**< full parsing and repack */ + AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ + AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ + AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ + AVSTREAM_PARSE_FULL_RAW, /**< full parsing and repack with timestamp and position generation by parser for raw + this assumes that each packet in the file contains no demuxer level headers and + just codec level data, otherwise position generation would fail */ +}; + +typedef struct AVIndexEntry { + int64_t pos; + int64_t timestamp; /**< + * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available + * when seeking to this entry. That means preferable PTS on keyframe based formats. + * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better + * is known + */ +#define AVINDEX_KEYFRAME 0x0001 +#define AVINDEX_DISCARD_FRAME 0x0002 /** + * Flag is used to indicate which frame should be discarded after decoding. + */ + int flags:2; + int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ +} AVIndexEntry; + +#define AV_DISPOSITION_DEFAULT 0x0001 +#define AV_DISPOSITION_DUB 0x0002 +#define AV_DISPOSITION_ORIGINAL 0x0004 +#define AV_DISPOSITION_COMMENT 0x0008 +#define AV_DISPOSITION_LYRICS 0x0010 +#define AV_DISPOSITION_KARAOKE 0x0020 + +/** + * Track should be used during playback by default. + * Useful for subtitle track that should be displayed + * even when user did not explicitly ask for subtitles. + */ +#define AV_DISPOSITION_FORCED 0x0040 +#define AV_DISPOSITION_HEARING_IMPAIRED 0x0080 /**< stream for hearing impaired audiences */ +#define AV_DISPOSITION_VISUAL_IMPAIRED 0x0100 /**< stream for visual impaired audiences */ +#define AV_DISPOSITION_CLEAN_EFFECTS 0x0200 /**< stream without voice */ +/** + * The stream is stored in the file as an attached picture/"cover art" (e.g. + * APIC frame in ID3v2). The first (usually only) packet associated with it + * will be returned among the first few packets read from the file unless + * seeking takes place. It can also be accessed at any time in + * AVStream.attached_pic. + */ +#define AV_DISPOSITION_ATTACHED_PIC 0x0400 +/** + * The stream is sparse, and contains thumbnail images, often corresponding + * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. + */ +#define AV_DISPOSITION_TIMED_THUMBNAILS 0x0800 + +typedef struct AVStreamInternal AVStreamInternal; + +/** + * To specify text track kind (different from subtitles default). + */ +#define AV_DISPOSITION_CAPTIONS 0x10000 +#define AV_DISPOSITION_DESCRIPTIONS 0x20000 +#define AV_DISPOSITION_METADATA 0x40000 +#define AV_DISPOSITION_DEPENDENT 0x80000 ///< dependent audio stream (mix_type=0 in mpegts) +#define AV_DISPOSITION_STILL_IMAGE 0x100000 ///< still images in video stream (still_picture_flag=1 in mpegts) + +/** + * Options for behavior on timestamp wrap detection. + */ +#define AV_PTS_WRAP_IGNORE 0 ///< ignore the wrap +#define AV_PTS_WRAP_ADD_OFFSET 1 ///< add the format specific offset on wrap detection +#define AV_PTS_WRAP_SUB_OFFSET -1 ///< subtract the format specific offset on wrap detection + +/** + * Stream structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVStream) must not be used outside libav*. + */ +typedef struct AVStream { + int index; /**< stream index in AVFormatContext */ + /** + * Format-specific stream ID. + * decoding: set by libavformat + * encoding: set by the user, replaced by libavformat if left unset + */ + int id; +#if FF_API_LAVF_AVCTX + /** + * @deprecated use the codecpar struct instead + */ + attribute_deprecated + AVCodecContext *codec; +#endif + void *priv_data; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. + * + * decoding: set by libavformat + * encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the desired timebase. In + * avformat_write_header(), the muxer will overwrite this field + * with the timebase that will actually be used for the timestamps + * written into the file (which may or may not be related to the + * user-provided one, depending on the format). + */ + AVRational time_base; + + /** + * Decoding: pts of the first frame of the stream in presentation order, in stream time base. + * Only set this if you are absolutely 100% sure that the value you set + * it to really is the pts of the first frame. + * This may be undefined (AV_NOPTS_VALUE). + * @note The ASF header does NOT contain a correct start_time the ASF + * demuxer must NOT set this. + */ + int64_t start_time; + + /** + * Decoding: duration of the stream, in stream time base. + * If a source file does not specify a duration, but does specify + * a bitrate, this value will be estimated from bitrate and file size. + * + * Encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the estimated duration. + */ + int64_t duration; + + int64_t nb_frames; ///< number of frames in this stream if known or 0 + + int disposition; /**< AV_DISPOSITION_* bit field */ + + enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed. + + /** + * sample aspect ratio (0 if unknown) + * - encoding: Set by user. + * - decoding: Set by libavformat. + */ + AVRational sample_aspect_ratio; + + AVDictionary *metadata; + + /** + * Average framerate + * + * - demuxing: May be set by libavformat when creating the stream or in + * avformat_find_stream_info(). + * - muxing: May be set by the caller before avformat_write_header(). + */ + AVRational avg_frame_rate; + + /** + * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet + * will contain the attached picture. + * + * decoding: set by libavformat, must not be modified by the caller. + * encoding: unused + */ + AVPacket attached_pic; + + /** + * An array of side data that applies to the whole stream (i.e. the + * container does not allow it to change between packets). + * + * There may be no overlap between the side data in this array and side data + * in the packets. I.e. a given side data is either exported by the muxer + * (demuxing) / set by the caller (muxing) in this array, then it never + * appears in the packets, or the side data is exported / sent through + * the packets (always in the first packet where the value becomes known or + * changes), then it does not appear in this array. + * + * - demuxing: Set by libavformat when the stream is created. + * - muxing: May be set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + * + * @see av_format_inject_global_side_data() + */ + AVPacketSideData *side_data; + /** + * The number of elements in the AVStream.side_data array. + */ + int nb_side_data; + + /** + * Flags for the user to detect events happening on the stream. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVSTREAM_EVENT_FLAG_*. + */ + int event_flags; +#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * Real base framerate of the stream. + * This is the lowest framerate with which all timestamps can be + * represented accurately (it is the least common multiple of all + * framerates in the stream). Note, this value is just a guess! + * For example, if the time base is 1/90000 and all frames have either + * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. + */ + AVRational r_frame_rate; + +#if FF_API_LAVF_FFSERVER + /** + * String containing pairs of key and values describing recommended encoder configuration. + * Pairs are separated by ','. + * Keys are separated from values by '='. + * + * @deprecated unused + */ + attribute_deprecated + char *recommended_encoder_configuration; +#endif + + /** + * Codec parameters associated with this stream. Allocated and freed by + * libavformat in avformat_new_stream() and avformat_free_context() + * respectively. + * + * - demuxing: filled by libavformat on stream creation or in + * avformat_find_stream_info() + * - muxing: filled by the caller before avformat_write_header() + */ + AVCodecParameters *codecpar; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * Internal note: be aware that physically removing these fields + * will break ABI. Replace removed fields with dummy fields, and + * add new fields to AVStreamInternal. + ***************************************************************** + */ + +#define MAX_STD_TIMEBASES (30*12+30+3+6) + /** + * Stream information used internally by avformat_find_stream_info() + */ + struct { + int64_t last_dts; + int64_t duration_gcd; + int duration_count; + int64_t rfps_duration_sum; + double (*duration_error)[2][MAX_STD_TIMEBASES]; + int64_t codec_info_duration; + int64_t codec_info_duration_fields; + int frame_delay_evidence; + + /** + * 0 -> decoder has not been searched for yet. + * >0 -> decoder found + * <0 -> decoder with codec_id == -found_decoder has not been found + */ + int found_decoder; + + int64_t last_duration; + + /** + * Those are used for average framerate estimation. + */ + int64_t fps_first_dts; + int fps_first_dts_idx; + int64_t fps_last_dts; + int fps_last_dts_idx; + + } *info; + + int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */ + + // Timestamp generation support: + /** + * Timestamp corresponding to the last dts sync point. + * + * Initialized when AVCodecParserContext.dts_sync_point >= 0 and + * a DTS is received from the underlying container. Otherwise set to + * AV_NOPTS_VALUE by default. + */ + int64_t first_dts; + int64_t cur_dts; + int64_t last_IP_pts; + int last_IP_duration; + + /** + * Number of packets to buffer for codec probing + */ + int probe_packets; + + /** + * Number of frames that have been demuxed during avformat_find_stream_info() + */ + int codec_info_nb_frames; + + /* av_read_frame() support */ + enum AVStreamParseType need_parsing; + struct AVCodecParserContext *parser; + + /** + * last packet in packet_buffer for this stream when muxing. + */ + struct AVPacketList *last_in_packet_buffer; + AVProbeData probe_data; +#define MAX_REORDER_DELAY 16 + int64_t pts_buffer[MAX_REORDER_DELAY+1]; + + AVIndexEntry *index_entries; /**< Only used if the format does not + support seeking natively. */ + int nb_index_entries; + unsigned int index_entries_allocated_size; + + /** + * Stream Identifier + * This is the MPEG-TS stream identifier +1 + * 0 means unknown + */ + int stream_identifier; + + /** + * Details of the MPEG-TS program which created this stream. + */ + int program_num; + int pmt_version; + int pmt_stream_idx; + + int64_t interleaver_chunk_size; + int64_t interleaver_chunk_duration; + + /** + * stream probing state + * -1 -> probing finished + * 0 -> no probing requested + * rest -> perform probing with request_probe being the minimum score to accept. + * NOT PART OF PUBLIC API + */ + int request_probe; + /** + * Indicates that everything up to the next keyframe + * should be discarded. + */ + int skip_to_keyframe; + + /** + * Number of samples to skip at the start of the frame decoded from the next packet. + */ + int skip_samples; + + /** + * If not 0, the number of samples that should be skipped from the start of + * the stream (the samples are removed from packets with pts==0, which also + * assumes negative timestamps do not happen). + * Intended for use with formats such as mp3 with ad-hoc gapless audio + * support. + */ + int64_t start_skip_samples; + + /** + * If not 0, the first audio sample that should be discarded from the stream. + * This is broken by design (needs global sample count), but can't be + * avoided for broken by design formats such as mp3 with ad-hoc gapless + * audio support. + */ + int64_t first_discard_sample; + + /** + * The sample after last sample that is intended to be discarded after + * first_discard_sample. Works on frame boundaries only. Used to prevent + * early EOF if the gapless info is broken (considered concatenated mp3s). + */ + int64_t last_discard_sample; + + /** + * Number of internally decoded frames, used internally in libavformat, do not access + * its lifetime differs from info which is why it is not in that structure. + */ + int nb_decoded_frames; + + /** + * Timestamp offset added to timestamps before muxing + * NOT PART OF PUBLIC API + */ + int64_t mux_ts_offset; + + /** + * Internal data to check for wrapping of the time stamp + */ + int64_t pts_wrap_reference; + + /** + * Options for behavior, when a wrap is detected. + * + * Defined by AV_PTS_WRAP_ values. + * + * If correction is enabled, there are two possibilities: + * If the first time stamp is near the wrap point, the wrap offset + * will be subtracted, which will create negative time stamps. + * Otherwise the offset will be added. + */ + int pts_wrap_behavior; + + /** + * Internal data to prevent doing update_initial_durations() twice + */ + int update_initial_durations_done; + + /** + * Internal data to generate dts from pts + */ + int64_t pts_reorder_error[MAX_REORDER_DELAY+1]; + uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1]; + + /** + * Internal data to analyze DTS and detect faulty mpeg streams + */ + int64_t last_dts_for_order_check; + uint8_t dts_ordered; + uint8_t dts_misordered; + + /** + * Internal data to inject global side data + */ + int inject_global_side_data; + + /** + * display aspect ratio (0 if unknown) + * - encoding: unused + * - decoding: Set by libavformat to calculate sample_aspect_ratio internally + */ + AVRational display_aspect_ratio; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVStreamInternal *internal; +} AVStream; + +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVStream fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +AVRational av_stream_get_r_frame_rate(const AVStream *s); +attribute_deprecated +void av_stream_set_r_frame_rate(AVStream *s, AVRational r); +#if FF_API_LAVF_FFSERVER +attribute_deprecated +char* av_stream_get_recommended_encoder_configuration(const AVStream *s); +attribute_deprecated +void av_stream_set_recommended_encoder_configuration(AVStream *s, char *configuration); +#endif +#endif + +struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); + +/** + * Returns the pts of the last muxed packet + its duration + * + * the retuned value is undefined when used with a demuxer. + */ +int64_t av_stream_get_end_pts(const AVStream *st); + +#define AV_PROGRAM_RUNNING 1 + +/** + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVProgram) must not be used outside libav*. + */ +typedef struct AVProgram { + int id; + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; + AVDictionary *metadata; + + int program_num; + int pmt_pid; + int pcr_pid; + int pmt_version; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int64_t start_time; + int64_t end_time; + + int64_t pts_wrap_reference; ///< reference dts for wrap detection + int pts_wrap_behavior; ///< behavior on wrap detection +} AVProgram; + +#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present + (streams are added dynamically) */ +#define AVFMTCTX_UNSEEKABLE 0x0002 /**< signal that the stream is definitely + not seekable, and attempts to call the + seek function will fail. For some + network protocols (e.g. HLS), this can + change dynamically at runtime. */ + +typedef struct AVChapter { + int id; ///< unique ID to identify the chapter + AVRational time_base; ///< time base in which the start/end timestamps are specified + int64_t start, end; ///< chapter start/end time in time_base units + AVDictionary *metadata; +} AVChapter; + + +/** + * Callback used by devices to communicate with application. + */ +typedef int (*av_format_control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + +typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * The duration of a video can be estimated through various ways, and this enum can be used + * to know how the duration was estimated. + */ +enum AVDurationEstimationMethod { + AVFMT_DURATION_FROM_PTS, ///< Duration accurately estimated from PTSes + AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration + AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate) +}; + +typedef struct AVFormatInternal AVFormatInternal; + +/** + * Format I/O context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVFormatContext) must not be used outside libav*, use + * avformat_alloc_context() to create an AVFormatContext. + * + * Fields can be accessed through AVOptions (av_opt*), + * the name string used matches the associated command line parameter name and + * can be found in libavformat/options_table.h. + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + */ +typedef struct AVFormatContext { + /** + * A class for logging and @ref avoptions. Set by avformat_alloc_context(). + * Exports (de)muxer private options if they exist. + */ + const AVClass *av_class; + + /** + * The input container format. + * + * Demuxing only, set by avformat_open_input(). + */ + ff_const59 struct AVInputFormat *iformat; + + /** + * The output container format. + * + * Muxing only, must be set by the caller before avformat_write_header(). + */ + ff_const59 struct AVOutputFormat *oformat; + + /** + * Format private data. This is an AVOptions-enabled struct + * if and only if iformat/oformat.priv_class is not NULL. + * + * - muxing: set by avformat_write_header() + * - demuxing: set by avformat_open_input() + */ + void *priv_data; + + /** + * I/O context. + * + * - demuxing: either set by the user before avformat_open_input() (then + * the user must close it manually) or set by avformat_open_input(). + * - muxing: set by the user before avformat_write_header(). The caller must + * take care of closing / freeing the IO context. + * + * Do NOT set this field if AVFMT_NOFILE flag is set in + * iformat/oformat.flags. In such a case, the (de)muxer will handle + * I/O in some other way and this field will be NULL. + */ + AVIOContext *pb; + + /* stream info */ + /** + * Flags signalling stream properties. A combination of AVFMTCTX_*. + * Set by libavformat. + */ + int ctx_flags; + + /** + * Number of elements in AVFormatContext.streams. + * + * Set by avformat_new_stream(), must not be modified by any other code. + */ + unsigned int nb_streams; + /** + * A list of all streams in the file. New streams are created with + * avformat_new_stream(). + * + * - demuxing: streams are created by libavformat in avformat_open_input(). + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also + * appear in av_read_frame(). + * - muxing: streams are created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStream **streams; + +#if FF_API_FORMAT_FILENAME + /** + * input or output filename + * + * - demuxing: set by avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * @deprecated Use url instead. + */ + attribute_deprecated + char filename[1024]; +#endif + + /** + * input or output URL. Unlike the old filename field, this field has no + * length restriction. + * + * - demuxing: set by avformat_open_input(), initialized to an empty + * string if url parameter was NULL in avformat_open_input(). + * - muxing: may be set by the caller before calling avformat_write_header() + * (or avformat_init_output() if that is called first) to a string + * which is freeable by av_free(). Set to an empty string if it + * was NULL in avformat_init_output(). + * + * Freed by libavformat in avformat_free_context(). + */ + char *url; + + /** + * Position of the first frame of the component, in + * AV_TIME_BASE fractional seconds. NEVER set this value directly: + * It is deduced from the AVStream values. + * + * Demuxing only, set by libavformat. + */ + int64_t start_time; + + /** + * Duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also do not set any of them. This is deduced from the + * AVStream values if not set. + * + * Demuxing only, set by libavformat. + */ + int64_t duration; + + /** + * Total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ + int64_t bit_rate; + + unsigned int packet_size; + int max_delay; + + /** + * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*. + * Set by the user before avformat_open_input() / avformat_write_header(). + */ + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< Generate missing pts even if it requires parsing future frames. +#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index. +#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input. +#define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS +#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container +#define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled +#define AVFMT_FLAG_NOBUFFER 0x0040 ///< Do not buffer frames when possible +#define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it. +#define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted +#define AVFMT_FLAG_FLUSH_PACKETS 0x0200 ///< Flush the AVIOContext every packet. +/** + * When muxing, try to avoid writing any random/volatile data to the output. + * This includes any random IDs, real-time timestamps/dates, muxer version, etc. + * + * This flag is mainly intended for testing. + */ +#define AVFMT_FLAG_BITEXACT 0x0400 +#if FF_API_LAVF_MP4A_LATM +#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Deprecated, does nothing. +#endif +#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) +#define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted) +#if FF_API_LAVF_KEEPSIDE_FLAG +#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Deprecated, does nothing. +#endif +#define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Add bitstream filters as requested by the muxer + + /** + * Maximum size of the data read from input for determining + * the input container format. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int64_t probesize; + + /** + * Maximum duration (in AV_TIME_BASE units) of the data read + * from input in avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + * Can be set to 0 to let avformat choose using a heuristic. + */ + int64_t max_analyze_duration; + + const uint8_t *key; + int keylen; + + unsigned int nb_programs; + AVProgram **programs; + + /** + * Forced video codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID video_codec_id; + + /** + * Forced audio codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID audio_codec_id; + + /** + * Forced subtitle codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID subtitle_codec_id; + + /** + * Maximum amount of memory in bytes to use for the index of each stream. + * If the index exceeds this size, entries will be discarded as + * needed to maintain a smaller size. This can lead to slower or less + * accurate seeking (depends on demuxer). + * Demuxers for which a full in-memory index is mandatory will ignore + * this. + * - muxing: unused + * - demuxing: set by user + */ + unsigned int max_index_size; + + /** + * Maximum amount of memory in bytes to use for buffering frames + * obtained from realtime capture devices. + */ + unsigned int max_picture_buffer; + + /** + * Number of chapters in AVChapter array. + * When muxing, chapters are normally written in the file header, + * so nb_chapters should normally be initialized before write_header + * is called. Some muxers (e.g. mov and mkv) can also write chapters + * in the trailer. To write chapters in the trailer, nb_chapters + * must be zero when write_header is called and non-zero when + * write_trailer is called. + * - muxing: set by user + * - demuxing: set by libavformat + */ + unsigned int nb_chapters; + AVChapter **chapters; + + /** + * Metadata that applies to the whole file. + * + * - demuxing: set by libavformat in avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * Freed by libavformat in avformat_free_context(). + */ + AVDictionary *metadata; + + /** + * Start time of the stream in real world time, in microseconds + * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the + * stream was captured at this real world time. + * - muxing: Set by the caller before avformat_write_header(). If set to + * either 0 or AV_NOPTS_VALUE, then the current wall-time will + * be used. + * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that + * the value may become known after some number of frames + * have been received. + */ + int64_t start_time_realtime; + + /** + * The number of frames used for determining the framerate in + * avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + */ + int fps_probe_size; + + /** + * Error recognition; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int error_recognition; + + /** + * Custom interrupt callbacks for the I/O layer. + * + * demuxing: set by the user before avformat_open_input(). + * muxing: set by the user before avformat_write_header() + * (mainly useful for AVFMT_NOFILE formats). The callback + * should also be passed to avio_open2() if it's used to + * open the file. + */ + AVIOInterruptCB interrupt_callback; + + /** + * Flags to enable debugging. + */ + int debug; +#define FF_FDEBUG_TS 0x0001 + + /** + * Maximum buffering duration for interleaving. + * + * To ensure all the streams are interleaved correctly, + * av_interleaved_write_frame() will wait until it has at least one packet + * for each stream before actually writing any packets to the output file. + * When some streams are "sparse" (i.e. there are large gaps between + * successive packets), this can result in excessive buffering. + * + * This field specifies the maximum difference between the timestamps of the + * first and the last packet in the muxing queue, above which libavformat + * will output a packet regardless of whether it has queued a packet for all + * the streams. + * + * Muxing only, set by the caller before avformat_write_header(). + */ + int64_t max_interleave_delta; + + /** + * Allow non-standard and experimental extension + * @see AVCodecContext.strict_std_compliance + */ + int strict_std_compliance; + + /** + * Flags for the user to detect events happening on the file. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVFMT_EVENT_FLAG_*. + */ + int event_flags; +#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * Maximum number of packets to read while waiting for the first timestamp. + * Decoding only. + */ + int max_ts_probe; + + /** + * Avoid negative timestamps during muxing. + * Any value of the AVFMT_AVOID_NEG_TS_* constants. + * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use) + * - muxing: Set by user + * - demuxing: unused + */ + int avoid_negative_ts; +#define AVFMT_AVOID_NEG_TS_AUTO -1 ///< Enabled when required by target format +#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative +#define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 ///< Shift timestamps so that they start at 0 + + /** + * Transport stream id. + * This will be moved into demuxer private options. Thus no API/ABI compatibility + */ + int ts_id; + + /** + * Audio preload in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int audio_preload; + + /** + * Max chunk time in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_duration; + + /** + * Max chunk size in bytes + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_size; + + /** + * forces the use of wallclock timestamps as pts/dts of packets + * This has undefined results in the presence of B frames. + * - encoding: unused + * - decoding: Set by user + */ + int use_wallclock_as_timestamps; + + /** + * avio flags, used to force AVIO_FLAG_DIRECT. + * - encoding: unused + * - decoding: Set by user + */ + int avio_flags; + + /** + * The duration field can be estimated through various ways, and this field can be used + * to know how the duration was estimated. + * - encoding: unused + * - decoding: Read by user + */ + enum AVDurationEstimationMethod duration_estimation_method; + + /** + * Skip initial bytes when opening stream + * - encoding: unused + * - decoding: Set by user + */ + int64_t skip_initial_bytes; + + /** + * Correct single timestamp overflows + * - encoding: unused + * - decoding: Set by user + */ + unsigned int correct_ts_overflow; + + /** + * Force seeking to any (also non key) frames. + * - encoding: unused + * - decoding: Set by user + */ + int seek2any; + + /** + * Flush the I/O context after each packet. + * - encoding: Set by user + * - decoding: unused + */ + int flush_packets; + + /** + * format probing score. + * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes + * the format. + * - encoding: unused + * - decoding: set by avformat, read by user + */ + int probe_score; + + /** + * number of bytes to read maximally to identify format. + * - encoding: unused + * - decoding: set by user + */ + int format_probesize; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * ',' separated list of allowed demuxers. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *format_whitelist; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVFormatInternal *internal; + + /** + * IO repositioned flag. + * This is set by avformat when the underlaying IO context read pointer + * is repositioned, for example when doing byte based seeking. + * Demuxers can use the flag to detect such changes. + */ + int io_repositioned; + + /** + * Forced video codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *video_codec; + + /** + * Forced audio codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *audio_codec; + + /** + * Forced subtitle codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *subtitle_codec; + + /** + * Forced data codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *data_codec; + + /** + * Number of bytes to be written as padding in a metadata header. + * Demuxing: Unused. + * Muxing: Set by user via av_format_set_metadata_header_padding. + */ + int metadata_header_padding; + + /** + * User data. + * This is a place for some private data of the user. + */ + void *opaque; + + /** + * Callback used by devices to communicate with application. + */ + av_format_control_message control_message_cb; + + /** + * Output timestamp offset, in microseconds. + * Muxing: set by user + */ + int64_t output_ts_offset; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - muxing: Set by user. + * - demuxing: Set by user. + */ + uint8_t *dump_separator; + + /** + * Forced Data codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID data_codec_id; + +#if FF_API_OLD_OPEN_CALLBACKS + /** + * Called to open further IO contexts when needed for demuxing. + * + * This can be set by the user application to perform security checks on + * the URLs before opening them. + * The function should behave like avio_open2(), AVFormatContext is provided + * as contextual information and to reach AVFormatContext.opaque. + * + * If NULL then some simple checks are used together with avio_open2(). + * + * Must not be accessed directly from outside avformat. + * @See av_format_set_open_cb() + * + * Demuxing: Set by user. + * + * @deprecated Use io_open and io_close. + */ + attribute_deprecated + int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); +#endif + + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_whitelist; + + /** + * A callback for opening new IO streams. + * + * Whenever a muxer or a demuxer needs to open an IO stream (typically from + * avformat_open_input() for demuxers, but for certain formats can happen at + * other times as well), it will call this callback to obtain an IO context. + * + * @param s the format context + * @param pb on success, the newly opened IO context should be returned here + * @param url the url to open + * @param flags a combination of AVIO_FLAG_* + * @param options a dictionary of additional options, with the same + * semantics as in avio_open2() + * @return 0 on success, a negative AVERROR code on failure + * + * @note Certain muxers and demuxers do nesting, i.e. they open one or more + * additional internal format contexts. Thus the AVFormatContext pointer + * passed to this callback may be different from the one facing the caller. + * It will, however, have the same 'opaque' field. + */ + int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, + int flags, AVDictionary **options); + + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + */ + void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); + + /** + * ',' separated list of disallowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_blacklist; + + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user + */ + int max_streams; + + /** + * Skip duration calcuation in estimate_timings_from_pts. + * - encoding: unused + * - decoding: set by user + */ + int skip_estimate_duration_from_pts; +} AVFormatContext; + +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVFormatContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +int av_format_get_probe_score(const AVFormatContext *s); +attribute_deprecated +AVCodec * av_format_get_video_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_video_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_audio_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_data_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_data_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +int av_format_get_metadata_header_padding(const AVFormatContext *s); +attribute_deprecated +void av_format_set_metadata_header_padding(AVFormatContext *s, int c); +attribute_deprecated +void * av_format_get_opaque(const AVFormatContext *s); +attribute_deprecated +void av_format_set_opaque(AVFormatContext *s, void *opaque); +attribute_deprecated +av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); +attribute_deprecated +void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); +#if FF_API_OLD_OPEN_CALLBACKS +attribute_deprecated AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); +attribute_deprecated void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); +#endif +#endif + +/** + * This function will cause global side data to be injected in the next packet + * of each stream as well as after any subsequent seek. + */ +void av_format_inject_global_side_data(AVFormatContext *s); + +/** + * Returns the method used to set ctx->duration. + * + * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. + */ +enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); + +typedef struct AVPacketList { + AVPacket pkt; + struct AVPacketList *next; +} AVPacketList; + + +/** + * @defgroup lavf_core Core functions + * @ingroup libavf + * + * Functions for querying libavformat capabilities, allocating core structures, + * etc. + * @{ + */ + +/** + * Return the LIBAVFORMAT_VERSION_INT constant. + */ +unsigned avformat_version(void); + +/** + * Return the libavformat build-time configuration. + */ +const char *avformat_configuration(void); + +/** + * Return the libavformat license. + */ +const char *avformat_license(void); + +#if FF_API_NEXT +/** + * Initialize libavformat and register all the muxers, demuxers and + * protocols. If you do not call this function, then you can select + * exactly which formats you want to support. + * + * @see av_register_input_format() + * @see av_register_output_format() + */ +attribute_deprecated +void av_register_all(void); + +attribute_deprecated +void av_register_input_format(AVInputFormat *format); +attribute_deprecated +void av_register_output_format(AVOutputFormat *format); +#endif + +/** + * Do global initialization of network libraries. This is optional, + * and not recommended anymore. + * + * This functions only exists to work around thread-safety issues + * with older GnuTLS or OpenSSL libraries. If libavformat is linked + * to newer versions of those libraries, or if you do not use them, + * calling this function is unnecessary. Otherwise, you need to call + * this function before any other threads using them are started. + * + * This function will be deprecated once support for older GnuTLS and + * OpenSSL libraries is removed, and this function has no purpose + * anymore. + */ +int avformat_network_init(void); + +/** + * Undo the initialization done by avformat_network_init. Call it only + * once for each time you called avformat_network_init. + */ +int avformat_network_deinit(void); + +#if FF_API_NEXT +/** + * If f is NULL, returns the first registered input format, + * if f is non-NULL, returns the next registered input format after f + * or NULL if f is the last one. + */ +attribute_deprecated +AVInputFormat *av_iformat_next(const AVInputFormat *f); + +/** + * If f is NULL, returns the first registered output format, + * if f is non-NULL, returns the next registered output format after f + * or NULL if f is the last one. + */ +attribute_deprecated +AVOutputFormat *av_oformat_next(const AVOutputFormat *f); +#endif + +/** + * Iterate over all registered muxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered muxer or NULL when the iteration is + * finished + */ +const AVOutputFormat *av_muxer_iterate(void **opaque); + +/** + * Iterate over all registered demuxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered demuxer or NULL when the iteration is + * finished + */ +const AVInputFormat *av_demuxer_iterate(void **opaque); + +/** + * Allocate an AVFormatContext. + * avformat_free_context() can be used to free the context and everything + * allocated by the framework within it. + */ +AVFormatContext *avformat_alloc_context(void); + +/** + * Free an AVFormatContext and all its streams. + * @param s context to free + */ +void avformat_free_context(AVFormatContext *s); + +/** + * Get the AVClass for AVFormatContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avformat_get_class(void); + +/** + * Add a new stream to a media file. + * + * When demuxing, it is called by the demuxer in read_header(). If the + * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also + * be called in read_packet(). + * + * When muxing, should be called by the user before avformat_write_header(). + * + * User is required to call avcodec_close() and avformat_free_context() to + * clean up the allocation by avformat_new_stream(). + * + * @param s media file handle + * @param c If non-NULL, the AVCodecContext corresponding to the new stream + * will be initialized to use this codec. This is needed for e.g. codec-specific + * defaults to be set, so codec should be provided if it is known. + * + * @return newly created stream or NULL on error. + */ +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); + +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * st. + * @param size side information size + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Allocate new information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t *av_stream_new_side_data(AVStream *stream, + enum AVPacketSideDataType type, int size); +/** + * Get side information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +uint8_t *av_stream_get_side_data(const AVStream *stream, + enum AVPacketSideDataType type, int *size); + +AVProgram *av_new_program(AVFormatContext *s, int id); + +/** + * @} + */ + + +/** + * Allocate an AVFormatContext for an output format. + * avformat_free_context() can be used to free the context and + * everything allocated by the framework within it. + * + * @param *ctx is set to the created format context, or to NULL in + * case of failure + * @param oformat format to use for allocating the context, if NULL + * format_name and filename are used instead + * @param format_name the name of output format to use for allocating the + * context, if NULL filename is used instead + * @param filename the name of the filename to use for allocating the + * context, may be NULL + * @return >= 0 in case of success, a negative AVERROR code in case of + * failure + */ +int avformat_alloc_output_context2(AVFormatContext **ctx, ff_const59 AVOutputFormat *oformat, + const char *format_name, const char *filename); + +/** + * @addtogroup lavf_decoding + * @{ + */ + +/** + * Find AVInputFormat based on the short name of the input format. + */ +ff_const59 AVInputFormat *av_find_input_format(const char *short_name); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + */ +ff_const59 AVInputFormat *av_probe_input_format(ff_const59 AVProbeData *pd, int is_opened); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_max A probe score larger that this is required to accept a + * detection, the variable is set to the actual detection + * score afterwards. + * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended + * to retry with a larger probe buffer. + */ +ff_const59 AVInputFormat *av_probe_input_format2(ff_const59 AVProbeData *pd, int is_opened, int *score_max); + +/** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_ret The score of the best detection. + */ +ff_const59 AVInputFormat *av_probe_input_format3(ff_const59 AVProbeData *pd, int is_opened, int *score_ret); + +/** + * Probe a bytestream to determine the input format. Each time a probe returns + * with a score that is too low, the probe buffer size is increased and another + * attempt is made. When the maximum probe size is reached, the input format + * with the highest score is returned. + * + * @param pb the bytestream to probe + * @param fmt the input format is put here + * @param url the url of the stream + * @param logctx the log context + * @param offset the offset within the bytestream to probe from + * @param max_probe_size the maximum probe buffer size (zero for default) + * @return the score in case of success, a negative value corresponding to an + * the maximal score is AVPROBE_SCORE_MAX + * AVERROR code otherwise + */ +int av_probe_input_buffer2(AVIOContext *pb, ff_const59 AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Like av_probe_input_buffer2() but returns 0 on success + */ +int av_probe_input_buffer(AVIOContext *pb, ff_const59 AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Open an input stream and read the header. The codecs are not opened. + * The stream must be closed with avformat_close_input(). + * + * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). + * May be a pointer to NULL, in which case an AVFormatContext is allocated by this + * function and written into ps. + * Note that a user-supplied AVFormatContext will be freed on failure. + * @param url URL of the stream to open. + * @param fmt If non-NULL, this parameter forces a specific input format. + * Otherwise the format is autodetected. + * @param options A dictionary filled with AVFormatContext and demuxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return 0 on success, a negative AVERROR on failure. + * + * @note If you want to use custom IO, preallocate the format context and set its pb field. + */ +int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); + +attribute_deprecated +int av_demuxer_open(AVFormatContext *ic); + +/** + * Read packets of a media file to get stream information. This + * is useful for file formats with no headers such as MPEG. This + * function also computes the real framerate in case of MPEG-2 repeat + * frame mode. + * The logical file position is not changed by this function; + * examined packets may be buffered for later processing. + * + * @param ic media file handle + * @param options If non-NULL, an ic.nb_streams long array of pointers to + * dictionaries, where i-th member contains options for + * codec corresponding to i-th stream. + * On return each dictionary will be filled with options that were not found. + * @return >=0 if OK, AVERROR_xxx on error + * + * @note this function isn't guaranteed to open all the codecs, so + * options being non-empty at return is a perfectly normal behavior. + * + * @todo Let the user decide somehow what information is needed so that + * we do not waste time getting stuff the user does not need. + */ +int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); + +/** + * Find the programs which belong to a given stream. + * + * @param ic media file handle + * @param last the last found program, the search will start after this + * program, or from the beginning if it is NULL + * @param s stream index + * @return the next program which belongs to s, NULL if no program is found or + * the last program is not among the programs of ic. + */ +AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); + +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); + +/** + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + */ +int av_find_best_stream(AVFormatContext *ic, + enum AVMediaType type, + int wanted_stream_nb, + int related_stream, + AVCodec **decoder_ret, + int flags); + +/** + * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. + * + * If pkt->buf is NULL, then the packet is valid until the next + * av_read_frame() or until avformat_close_input(). Otherwise the packet + * is valid indefinitely. In both cases the packet must be freed with + * av_packet_unref when it is no longer needed. For video, the packet contains + * exactly one frame. For audio, it contains an integer number of frames if each + * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames + * have a variable size (e.g. MPEG audio), then it contains one frame. + * + * pkt->pts, pkt->dts and pkt->duration are always set to correct + * values in AVStream.time_base units (and guessed if the format cannot + * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format + * has B-frames, so it is better to rely on pkt->dts if you do not + * decompress the payload. + * + * @return 0 if OK, < 0 on error or end of file + */ +int av_read_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Seek to the keyframe at timestamp. + * 'timestamp' in 'stream_index'. + * + * @param s media file handle + * @param stream_index If stream_index is (-1), a default + * stream is selected, and timestamp is automatically converted + * from AV_TIME_BASE units to the stream specific time_base. + * @param timestamp Timestamp in AVStream.time_base units + * or, if no stream is specified, in AV_TIME_BASE units. + * @param flags flags which select direction and seeking mode + * @return >= 0 on success + */ +int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, + int flags); + +/** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + * + * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and + * are the file position (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames + * in the stream with stream_index (this may not be supported by all demuxers). + * Otherwise all timestamps are in units of the stream selected by stream_index + * or if stream_index is -1, in AV_TIME_BASE units. + * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as + * keyframes (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored. + * + * @param s media file handle + * @param stream_index index of the stream which is used as time base reference + * @param min_ts smallest acceptable timestamp + * @param ts target timestamp + * @param max_ts largest acceptable timestamp + * @param flags flags + * @return >=0 on success, error code otherwise + * + * @note This is part of the new seek API which is still under construction. + * Thus do not use this yet. It may change at any time, do not expect + * ABI compatibility yet! + */ +int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + +/** + * Discard all internally buffered data. This can be useful when dealing with + * discontinuities in the byte stream. Generally works only with formats that + * can resync. This includes headerless formats like MPEG-TS/TS but should also + * work with NUT, Ogg and in a limited way AVI for example. + * + * The set of streams, the detected duration, stream parameters and codecs do + * not change when calling this function. If you want a complete reset, it's + * better to open a new AVFormatContext. + * + * This does not flush the AVIOContext (s->pb). If necessary, call + * avio_flush(s->pb) before calling this function. + * + * @param s media file handle + * @return >=0 on success, error code otherwise + */ +int avformat_flush(AVFormatContext *s); + +/** + * Start playing a network-based stream (e.g. RTSP stream) at the + * current position. + */ +int av_read_play(AVFormatContext *s); + +/** + * Pause a network-based stream (e.g. RTSP stream). + * + * Use av_read_play() to resume it. + */ +int av_read_pause(AVFormatContext *s); + +/** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + */ +void avformat_close_input(AVFormatContext **s); +/** + * @} + */ + +#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward +#define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +#define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes +#define AVSEEK_FLAG_FRAME 8 ///< seeking based on frame number + +/** + * @addtogroup lavf_encoding + * @{ + */ + +#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header +#define AVSTREAM_INIT_IN_INIT_OUTPUT 1 ///< stream parameters initialized in avformat_init_output + +/** + * Allocate the stream private data and write the stream header to + * an output media file. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec had not already been fully initialized in avformat_init, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec had already been fully initialized in avformat_init, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. + */ +av_warn_unused_result +int avformat_write_header(AVFormatContext *s, AVDictionary **options); + +/** + * Allocate the stream private data and initialize the codec, but do not write the header. + * May optionally be used before avformat_write_header to initialize stream parameters + * before actually writing the header. + * If using this function, do not pass the same options to avformat_write_header. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec requires avformat_write_header to fully initialize, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec has been fully initialized, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. + */ +av_warn_unused_result +int avformat_init_output(AVFormatContext *s, AVDictionary **options); + +/** + * Write a packet to an output media file. + * + * This function passes the packet directly to the muxer, without any buffering + * or reordering. The caller is responsible for correctly interleaving the + * packets if the format requires it. Callers that want libavformat to handle + * the interleaving should call av_interleaved_write_frame() instead of this + * function. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. Note that unlike + * av_interleaved_write_frame(), this function does not take + * ownership of the packet passed to it (though some muxers may make + * an internal reference to the input packet). + *
+ * This parameter can be NULL (at any time, not just at the end), in + * order to immediately flush data buffered within the muxer, for + * muxers that buffer up data internally before writing it to the + * output. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets passed to this function must be strictly + * increasing when compared in their respective timebases (unless the + * output format is flagged with the AVFMT_TS_NONSTRICT, then they + * merely have to be nondecreasing). @ref AVPacket.duration + * "duration") should also be set if known. + * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush + * + * @see av_interleaved_write_frame() + */ +int av_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write a packet to an output media file ensuring correct interleaving. + * + * This function will buffer the packets internally as needed to make sure the + * packets in the output file are properly interleaved in the order of + * increasing dts. Callers doing their own interleaving should call + * av_write_frame() instead of this function. + * + * Using this function instead of av_write_frame() can give muxers advance + * knowledge of future packets, improving e.g. the behaviour of the mp4 + * muxer for VFR content in fragmenting mode. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. + *
+ * If the packet is reference-counted, this function will take + * ownership of this reference and unreference it later when it sees + * fit. + * The caller must not access the data through this reference after + * this function returns. If the packet is not reference-counted, + * libavformat will make a copy. + *
+ * This parameter can be NULL (at any time, not just at the end), to + * flush the interleaving queues. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets in one stream must be strictly + * increasing (unless the output format is flagged with the + * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing). + * @ref AVPacket.duration "duration") should also be set if known. + * + * @return 0 on success, a negative AVERROR on error. Libavformat will always + * take care of freeing the packet, even if this function fails. + * + * @see av_write_frame(), AVFormatContext.max_interleave_delta + */ +int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write an uncoded frame to an output media file. + * + * The frame must be correctly interleaved according to the container + * specification; if not, then av_interleaved_write_frame() must be used. + * + * See av_interleaved_write_frame() for details. + */ +int av_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Write an uncoded frame to an output media file. + * + * If the muxer supports it, this function makes it possible to write an AVFrame + * structure directly, without encoding it into a packet. + * It is mostly useful for devices and similar special muxers that use raw + * video or PCM data and will not serialize it into a byte stream. + * + * To test whether it is possible to use it with a given muxer and stream, + * use av_write_uncoded_frame_query(). + * + * The caller gives up ownership of the frame and must not access it + * afterwards. + * + * @return >=0 for success, a negative code on error + */ +int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Test whether a muxer supports uncoded frame. + * + * @return >=0 if an uncoded frame can be written to that muxer and stream, + * <0 if not + */ +int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index); + +/** + * Write the stream trailer to an output media file and free the + * file private data. + * + * May only be called after a successful call to avformat_write_header. + * + * @param s media file handle + * @return 0 if OK, AVERROR_xxx on error + */ +int av_write_trailer(AVFormatContext *s); + +/** + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if + * there is no match. + * + * @param short_name if non-NULL checks if short_name matches with the + * names of the registered formats + * @param filename if non-NULL checks if filename terminates with the + * extensions of the registered formats + * @param mime_type if non-NULL checks if mime_type matches with the + * MIME type of the registered formats + */ +ff_const59 AVOutputFormat *av_guess_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * Guess the codec ID based upon muxer and filename. + */ +enum AVCodecID av_guess_codec(ff_const59 AVOutputFormat *fmt, const char *short_name, + const char *filename, const char *mime_type, + enum AVMediaType type); + +/** + * Get timing information for the data currently output. + * The exact meaning of "currently output" depends on the format. + * It is mostly relevant for devices that have an internal buffer and/or + * work in real time. + * @param s media file handle + * @param stream stream in the media file + * @param[out] dts DTS of the last packet output for the stream, in stream + * time_base units + * @param[out] wall absolute time when that packet whas output, + * in microsecond + * @return 0 if OK, AVERROR(ENOSYS) if the format does not support it + * Note: some formats or devices may not allow to measure dts and wall + * atomically. + */ +int av_get_output_timestamp(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + + +/** + * @} + */ + + +/** + * @defgroup lavf_misc Utility functions + * @ingroup libavf + * @{ + * + * Miscellaneous utility functions related to both muxing and demuxing + * (or neither). + */ + +/** + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump(FILE *f, const uint8_t *buf, int size); + +/** + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size); + +/** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st); + + +/** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload, + const AVStream *st); + +/** + * Get the AVCodecID for the given codec tag tag. + * If no codec id is found returns AV_CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param tag codec tag to match to a codec ID + */ +enum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); + +/** + * Get the codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec ID to match to a codec tag + */ +unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id); + +/** + * Get the codec tag for the given codec id. + * + * @param tags list of supported codec_id - codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec id that should be searched for in the list + * @param tag A pointer to the found tag + * @return 0 if id was not found in tags, > 0 if it was found + */ +int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id, + unsigned int *tag); + +int av_find_default_stream_index(AVFormatContext *s); + +/** + * Get the index for a specific timestamp. + * + * @param st stream that the timestamp belongs to + * @param timestamp timestamp to retrieve the index for + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise + * @return < 0 if no such timestamp could be found + */ +int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); + +/** + * Add an index entry into a sorted list. Update the entry if the list + * already contains it. + * + * @param timestamp timestamp in the time base of the given stream + */ +int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, + int size, int distance, int flags); + + +/** + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + */ +void av_url_split(char *proto, int proto_size, + char *authorization, int authorization_size, + char *hostname, int hostname_size, + int *port_ptr, + char *path, int path_size, + const char *url); + + +/** + * Print detailed information about the input or output format, such as + * duration, bitrate, streams, container, programs, metadata, side data, + * codec and time base. + * + * @param ic the context to analyze + * @param index index of the stream to dump information about + * @param url the URL to print, such as source or destination file + * @param is_output Select whether the specified context is an input(0) or output(1) + */ +void av_dump_format(AVFormatContext *ic, + int index, + const char *url, + int is_output); + + +#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d + +/** + * Return in 'buf' the path with '%d' replaced by a number. + * + * Also handles the '%0nd' format where 'n' is the total number + * of digits and '%%'. + * + * @param buf destination buffer + * @param buf_size destination buffer size + * @param path numbered sequence string + * @param number frame number + * @param flags AV_FRAME_FILENAME_FLAGS_* + * @return 0 if OK, -1 on format error + */ +int av_get_frame_filename2(char *buf, int buf_size, + const char *path, int number, int flags); + +int av_get_frame_filename(char *buf, int buf_size, + const char *path, int number); + +/** + * Check whether filename actually is a numbered sequence generator. + * + * @param filename possible numbered sequence string + * @return 1 if a valid numbered sequence string, 0 otherwise + */ +int av_filename_number_test(const char *filename); + +/** + * Generate an SDP for an RTP session. + * + * Note, this overwrites the id values of AVStreams in the muxer contexts + * for getting unique dynamic payload types. + * + * @param ac array of AVFormatContexts describing the RTP streams. If the + * array is composed by only one context, such context can contain + * multiple AVStreams (one AVStream per RTP stream). Otherwise, + * all the contexts in the array (an AVCodecContext per RTP stream) + * must contain only one AVStream. + * @param n_files number of AVCodecContexts contained in ac + * @param buf buffer where the SDP will be stored (must be allocated by + * the caller) + * @param size the size of the buffer + * @return 0 if OK, AVERROR_xxx on error + */ +int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size); + +/** + * Return a positive value if the given filename has one of the given + * extensions, 0 otherwise. + * + * @param filename file name to check against the given extensions + * @param extensions a comma-separated list of filename extensions + */ +int av_match_ext(const char *filename, const char *extensions); + +/** + * Test if the given container can store a codec. + * + * @param ofmt container to check for compatibility + * @param codec_id codec to potentially store in container + * @param std_compliance standards compliance level, one of FF_COMPLIANCE_* + * + * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. + * A negative number if this information is not available. + */ +int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id, + int std_compliance); + +/** + * @defgroup riff_fourcc RIFF FourCCs + * @{ + * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are + * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the + * following code: + * @code + * uint32_t tag = MKTAG('H', '2', '6', '4'); + * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; + * enum AVCodecID id = av_codec_get_id(table, tag); + * @endcode + */ +/** + * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_video_tags(void); +/** + * @return the table mapping RIFF FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_audio_tags(void); +/** + * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_video_tags(void); +/** + * @return the table mapping MOV FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_audio_tags(void); + +/** + * @} + */ + +/** + * Guess the sample aspect ratio of a frame, based on both the stream and the + * frame aspect ratio. + * + * Since the frame aspect ratio is set by the codec but the stream aspect ratio + * is set by the demuxer, these two may not be equal. This function tries to + * return the value that you should use if you would like to display the frame. + * + * Basic logic is to use the stream aspect ratio if it is set to something sane + * otherwise use the frame aspect ratio. This way a container setting, which is + * usually easy to modify can override the coded value in the frames. + * + * @param format the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame with the aspect ratio to be determined + * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea + */ +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame); + +/** + * Guess the frame rate, based on both the container and codec information. + * + * @param ctx the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame for which the frame rate should be determined, may be NULL + * @return the guessed (valid) frame rate, 0/1 if no idea + */ +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame); + +/** + * Check if the stream st contained in s is matched by the stream specifier + * spec. + * + * See the "stream specifiers" chapter in the documentation for the syntax + * of spec. + * + * @return >0 if st is matched by spec; + * 0 if st is not matched by spec; + * AVERROR code if spec is invalid + * + * @note A stream specifier can match several streams in the format. + */ +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, + const char *spec); + +int avformat_queue_attached_pictures(AVFormatContext *s); + +#if FF_API_OLD_BSF +/** + * Apply a list of bitstream filters to a packet. + * + * @param codec AVCodecContext, usually from an AVStream + * @param pkt the packet to apply filters to. If, on success, the returned + * packet has size == 0 and side_data_elems == 0, it indicates that + * the packet should be dropped + * @param bsfc a NULL-terminated list of filters to apply + * @return >=0 on success; + * AVERROR code on failure + */ +attribute_deprecated +int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt, + AVBitStreamFilterContext *bsfc); +#endif + +enum AVTimebaseSource { + AVFMT_TBCF_AUTO = -1, + AVFMT_TBCF_DECODER, + AVFMT_TBCF_DEMUXER, +#if FF_API_R_FRAME_RATE + AVFMT_TBCF_R_FRAMERATE, +#endif +}; + +/** + * Transfer internal timing information from one stream to another. + * + * This function is useful when doing stream copy. + * + * @param ofmt target output format for ost + * @param ost output stream which needs timings copy and adjustments + * @param ist reference input stream to copy timings from + * @param copy_tb define from where the stream codec timebase needs to be imported + */ +int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, + AVStream *ost, const AVStream *ist, + enum AVTimebaseSource copy_tb); + +/** + * Get the internal codec timebase from a stream. + * + * @param st input stream to extract the timebase from + */ +AVRational av_stream_get_codec_timebase(const AVStream *st); + +/** + * @} + */ + +#endif /* AVFORMAT_AVFORMAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avio.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avio.h new file mode 100644 index 0000000..dcb8dcd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/avio.h @@ -0,0 +1,861 @@ +/* + * copyright (c) 2001 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 + */ +#ifndef AVFORMAT_AVIO_H +#define AVFORMAT_AVIO_H + +/** + * @file + * @ingroup lavf_io + * Buffered I/O operations + */ + +#include + +#include "libavutil/common.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "libavformat/version.h" + +/** + * Seeking works like for a local file. + */ +#define AVIO_SEEKABLE_NORMAL (1 << 0) + +/** + * Seeking by timestamp with avio_seek_time() is possible. + */ +#define AVIO_SEEKABLE_TIME (1 << 1) + +/** + * Callback for checking whether to abort blocking functions. + * AVERROR_EXIT is returned in this case by the interrupted + * function. During blocking operations, callback is called with + * opaque as parameter. If the callback returns 1, the + * blocking operation will be aborted. + * + * No members can be added to this struct without a major bump, if + * new elements have been added after this struct in AVFormatContext + * or AVIOContext. + */ +typedef struct AVIOInterruptCB { + int (*callback)(void*); + void *opaque; +} AVIOInterruptCB; + +/** + * Directory entry types. + */ +enum AVIODirEntryType { + AVIO_ENTRY_UNKNOWN, + AVIO_ENTRY_BLOCK_DEVICE, + AVIO_ENTRY_CHARACTER_DEVICE, + AVIO_ENTRY_DIRECTORY, + AVIO_ENTRY_NAMED_PIPE, + AVIO_ENTRY_SYMBOLIC_LINK, + AVIO_ENTRY_SOCKET, + AVIO_ENTRY_FILE, + AVIO_ENTRY_SERVER, + AVIO_ENTRY_SHARE, + AVIO_ENTRY_WORKGROUP, +}; + +/** + * Describes single entry of the directory. + * + * Only name and type fields are guaranteed be set. + * Rest of fields are protocol or/and platform dependent and might be unknown. + */ +typedef struct AVIODirEntry { + char *name; /**< Filename */ + int type; /**< Type of the entry */ + int utf8; /**< Set to 1 when name is encoded with UTF-8, 0 otherwise. + Name can be encoded with UTF-8 even though 0 is set. */ + int64_t size; /**< File size in bytes, -1 if unknown. */ + int64_t modification_timestamp; /**< Time of last modification in microseconds since unix + epoch, -1 if unknown. */ + int64_t access_timestamp; /**< Time of last access in microseconds since unix epoch, + -1 if unknown. */ + int64_t status_change_timestamp; /**< Time of last status change in microseconds since unix + epoch, -1 if unknown. */ + int64_t user_id; /**< User ID of owner, -1 if unknown. */ + int64_t group_id; /**< Group ID of owner, -1 if unknown. */ + int64_t filemode; /**< Unix file mode, -1 if unknown. */ +} AVIODirEntry; + +typedef struct AVIODirContext { + struct URLContext *url_context; +} AVIODirContext; + +/** + * Different data types that can be returned via the AVIO + * write_data_type callback. + */ +enum AVIODataMarkerType { + /** + * Header data; this needs to be present for the stream to be decodeable. + */ + AVIO_DATA_MARKER_HEADER, + /** + * A point in the output bytestream where a decoder can start decoding + * (i.e. a keyframe). A demuxer/decoder given the data flagged with + * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, + * should give decodeable results. + */ + AVIO_DATA_MARKER_SYNC_POINT, + /** + * A point in the output bytestream where a demuxer can start parsing + * (for non self synchronizing bytestream formats). That is, any + * non-keyframe packet start point. + */ + AVIO_DATA_MARKER_BOUNDARY_POINT, + /** + * This is any, unlabelled data. It can either be a muxer not marking + * any positions at all, it can be an actual boundary/sync point + * that the muxer chooses not to mark, or a later part of a packet/fragment + * that is cut into multiple write callbacks due to limited IO buffer size. + */ + AVIO_DATA_MARKER_UNKNOWN, + /** + * Trailer data, which doesn't contain actual content, but only for + * finalizing the output file. + */ + AVIO_DATA_MARKER_TRAILER, + /** + * A point in the output bytestream where the underlying AVIOContext might + * flush the buffer depending on latency or buffering requirements. Typically + * means the end of a packet. + */ + AVIO_DATA_MARKER_FLUSH_POINT, +}; + +/** + * Bytestream IO Context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVIOContext) must not be used outside libav*. + * + * @note None of the function pointers in AVIOContext should be called + * directly, they should only be set by the client application + * when implementing custom I/O. Normally these are set to the + * function pointers specified in avio_alloc_context() + */ +typedef struct AVIOContext { + /** + * A class for private options. + * + * If this AVIOContext is created by avio_open2(), av_class is set and + * passes the options down to protocols. + * + * If this AVIOContext is manually allocated, then av_class may be set by + * the caller. + * + * warning -- this field can be NULL, be sure to not pass this AVIOContext + * to any av_opt_* functions in that case. + */ + const AVClass *av_class; + + /* + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): + * + ********************************************************************************** + * READING + ********************************************************************************** + * + * | buffer_size | + * |---------------------------------------| + * | | + * + * buffer buf_ptr buf_end + * +---------------+-----------------------+ + * |/ / / / / / / /|/ / / / / / /| | + * read buffer: |/ / consumed / | to be read /| | + * |/ / / / / / / /|/ / / / / / /| | + * +---------------+-----------------------+ + * + * pos + * +-------------------------------------------+-----------------+ + * input file: | | | + * +-------------------------------------------+-----------------+ + * + * + ********************************************************************************** + * WRITING + ********************************************************************************** + * + * | buffer_size | + * |--------------------------------------| + * | | + * + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ + * buf_ptr can be in this + * due to a backward seek + * + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ + * + */ + unsigned char *buffer; /**< Start of the buffer. */ + int buffer_size; /**< Maximum buffer size */ + unsigned char *buf_ptr; /**< Current position in the buffer */ + unsigned char *buf_end; /**< End of the data, may be less than + buffer+buffer_size if the read function returned + less data than requested, e.g. for streams where + no more data has been received yet. */ + void *opaque; /**< A private pointer, passed to the read/write/seek/... + functions. */ + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); + int64_t (*seek)(void *opaque, int64_t offset, int whence); + int64_t pos; /**< position in the file of the current buffer */ + int eof_reached; /**< true if was unable to read due to error or eof */ + int write_flag; /**< true if open for writing */ + int max_packet_size; + unsigned long checksum; + unsigned char *checksum_ptr; + unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); + int error; /**< contains the error code or 0 if no error happened */ + /** + * Pause or resume playback for network streaming protocols - e.g. MMS. + */ + int (*read_pause)(void *opaque, int pause); + /** + * Seek to a given timestamp in stream with the specified stream_index. + * Needed for some network streaming protocols which don't support seeking + * to byte position. + */ + int64_t (*read_seek)(void *opaque, int stream_index, + int64_t timestamp, int flags); + /** + * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. + */ + int seekable; + + /** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t maxsize; + + /** + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ + int direct; + + /** + * Bytes read statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t bytes_read; + + /** + * seek statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int seek_count; + + /** + * writeout statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int writeout_count; + + /** + * Original buffer size + * used internally after probing and ensure seekback to reset the buffer size + * This field is internal to libavformat and access from outside is not allowed. + */ + int orig_buffer_size; + + /** + * Threshold to favor readahead over seek. + * This is current internal only, do not use from outside. + */ + int short_seek_threshold; + + /** + * ',' separated list of allowed protocols. + */ + const char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + */ + const char *protocol_blacklist; + + /** + * A callback that is used instead of write_packet. + */ + int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); + /** + * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, + * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly + * small chunks of data returned from the callback). + */ + int ignore_boundary_point; + + /** + * Internal, not meant to be used from outside of AVIOContext. + */ + enum AVIODataMarkerType current_type; + int64_t last_time; + + /** + * A callback that is used instead of short_seek_threshold. + * This is current internal only, do not use from outside. + */ + int (*short_seek_get)(void *opaque); + + int64_t written; + + /** + * Maximum reached position before a backward seek in the write buffer, + * used keeping track of already written data for a later flush. + */ + unsigned char *buf_ptr_max; + + /** + * Try to buffer at least this amount of data before flushing it + */ + int min_packet_size; +} AVIOContext; + +/** + * Return the name of the protocol that will handle the passed URL. + * + * NULL is returned if no protocol could be found for the given URL. + * + * @return Name of the protocol or NULL. + */ +const char *avio_find_protocol_name(const char *url); + +/** + * Return AVIO_FLAG_* access flags corresponding to the access permissions + * of the resource in url, or a negative value corresponding to an + * AVERROR code in case of failure. The returned access flags are + * masked by the value in flags. + * + * @note This function is intrinsically unsafe, in the sense that the + * checked resource may change its existence or permission status from + * one call to another. Thus you should not trust the returned value, + * unless you are sure that no other processes are accessing the + * checked resource. + */ +int avio_check(const char *url, int flags); + +/** + * Move or rename a resource. + * + * @note url_src and url_dst should share the same protocol and authority. + * + * @param url_src url to resource to be moved + * @param url_dst new url to resource if the operation succeeded + * @return >=0 on success or negative on error. + */ +int avpriv_io_move(const char *url_src, const char *url_dst); + +/** + * Delete a resource. + * + * @param url resource to be deleted. + * @return >=0 on success or negative on error. + */ +int avpriv_io_delete(const char *url); + +/** + * Open directory for reading. + * + * @param s directory read context. Pointer to a NULL pointer must be passed. + * @param url directory to be listed. + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dictionary + * containing options that were not found. May be NULL. + * @return >=0 on success or negative on error. + */ +int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); + +/** + * Get next directory entry. + * + * Returned entry must be freed with avio_free_directory_entry(). In particular + * it may outlive AVIODirContext. + * + * @param s directory read context. + * @param[out] next next entry or NULL when no more entries. + * @return >=0 on success or negative on error. End of list is not considered an + * error. + */ +int avio_read_dir(AVIODirContext *s, AVIODirEntry **next); + +/** + * Close directory. + * + * @note Entries created using avio_read_dir() are not deleted and must be + * freeded with avio_free_directory_entry(). + * + * @param s directory read context. + * @return >=0 on success or negative on error. + */ +int avio_close_dir(AVIODirContext **s); + +/** + * Free entry allocated by avio_read_dir(). + * + * @param entry entry to be freed. + */ +void avio_free_directory_entry(AVIODirEntry **entry); + +/** + * Allocate and initialize an AVIOContext for buffered I/O. It must be later + * freed with avio_context_free(). + * + * @param buffer Memory block for input/output operations via AVIOContext. + * The buffer must be allocated with av_malloc() and friends. + * It may be freed and replaced with a new buffer by libavformat. + * AVIOContext.buffer holds the buffer currently in use, + * which must be later freed with av_free(). + * @param buffer_size The buffer size is very important for performance. + * For protocols with fixed blocksize it should be set to this blocksize. + * For others a typical size is a cache page, e.g. 4kb. + * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. + * @param opaque An opaque pointer to user-specific data. + * @param read_packet A function for refilling the buffer, may be NULL. + * For stream protocols, must never return 0 but rather + * a proper AVERROR code. + * @param write_packet A function for writing the buffer contents, may be NULL. + * The function may not change the input buffers content. + * @param seek A function for seeking to specified byte position, may be NULL. + * + * @return Allocated AVIOContext or NULL on failure. + */ +AVIOContext *avio_alloc_context( + unsigned char *buffer, + int buffer_size, + int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + int64_t (*seek)(void *opaque, int64_t offset, int whence)); + +/** + * Free the supplied IO context and everything associated with it. + * + * @param s Double pointer to the IO context. This function will write NULL + * into s. + */ +void avio_context_free(AVIOContext **s); + +void avio_w8(AVIOContext *s, int b); +void avio_write(AVIOContext *s, const unsigned char *buf, int size); +void avio_wl64(AVIOContext *s, uint64_t val); +void avio_wb64(AVIOContext *s, uint64_t val); +void avio_wl32(AVIOContext *s, unsigned int val); +void avio_wb32(AVIOContext *s, unsigned int val); +void avio_wl24(AVIOContext *s, unsigned int val); +void avio_wb24(AVIOContext *s, unsigned int val); +void avio_wl16(AVIOContext *s, unsigned int val); +void avio_wb16(AVIOContext *s, unsigned int val); + +/** + * Write a NULL-terminated string. + * @return number of bytes written. + */ +int avio_put_str(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16LE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16le(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16BE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16be(AVIOContext *s, const char *str); + +/** + * Mark the written bytestream as a specific type. + * + * Zero-length ranges are omitted from the output. + * + * @param time the stream time the current bytestream pos corresponds to + * (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not + * applicable + * @param type the kind of data written starting at the current pos + */ +void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); + +/** + * ORing this as the "whence" parameter to a seek function causes it to + * return the filesize without seeking anywhere. Supporting this is optional. + * If it is not supported then the seek function will return <0. + */ +#define AVSEEK_SIZE 0x10000 + +/** + * Passing this flag as the "whence" parameter to a seek function causes it to + * seek by any means (like reopening and linear reading) or other normally unreasonable + * means that can be extremely slow. + * This may be ignored by the seek code. + */ +#define AVSEEK_FORCE 0x20000 + +/** + * fseek() equivalent for AVIOContext. + * @return new position or AVERROR. + */ +int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); + +/** + * Skip given number of bytes forward + * @return new position or AVERROR. + */ +int64_t avio_skip(AVIOContext *s, int64_t offset); + +/** + * ftell() equivalent for AVIOContext. + * @return position or AVERROR. + */ +static av_always_inline int64_t avio_tell(AVIOContext *s) +{ + return avio_seek(s, 0, SEEK_CUR); +} + +/** + * Get the filesize. + * @return filesize or AVERROR + */ +int64_t avio_size(AVIOContext *s); + +/** + * Similar to feof() but also returns nonzero on read errors. + * @return non zero if and only if at end of file or a read error happened when reading. + */ +int avio_feof(AVIOContext *s); + +/** @warning Writes up to 4 KiB per call */ +int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Force flushing of buffered data. + * + * For write streams, force the buffered data to be immediately written to the output, + * without to wait to fill the internal buffer. + * + * For read streams, discard all currently buffered data, and advance the + * reported file position to that of the underlying stream. This does not + * read new data, and does not perform any seeks. + */ +void avio_flush(AVIOContext *s); + +/** + * Read size bytes from AVIOContext into buf. + * @return number of bytes read or AVERROR + */ +int avio_read(AVIOContext *s, unsigned char *buf, int size); + +/** + * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed + * to read fewer bytes than requested. The missing bytes can be read in the next + * call. This always tries to read at least 1 byte. + * Useful to reduce latency in certain cases. + * @return number of bytes read or AVERROR + */ +int avio_read_partial(AVIOContext *s, unsigned char *buf, int size); + +/** + * @name Functions for reading from AVIOContext + * @{ + * + * @note return 0 if EOF, so you cannot use it if EOF handling is + * necessary + */ +int avio_r8 (AVIOContext *s); +unsigned int avio_rl16(AVIOContext *s); +unsigned int avio_rl24(AVIOContext *s); +unsigned int avio_rl32(AVIOContext *s); +uint64_t avio_rl64(AVIOContext *s); +unsigned int avio_rb16(AVIOContext *s); +unsigned int avio_rb24(AVIOContext *s); +unsigned int avio_rb32(AVIOContext *s); +uint64_t avio_rb64(AVIOContext *s); +/** + * @} + */ + +/** + * Read a string from pb into buf. The reading will terminate when either + * a NULL character was encountered, maxlen bytes have been read, or nothing + * more can be read from pb. The result is guaranteed to be NULL-terminated, it + * will be truncated if buf is too small. + * Note that the string is not interpreted or validated in any way, it + * might get truncated in the middle of a sequence for multi-byte encodings. + * + * @return number of bytes read (is always <= maxlen). + * If reading ends on EOF or error, the return value will be one more than + * bytes actually read. + */ +int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); + +/** + * Read a UTF-16 string from pb and convert it to UTF-8. + * The reading will terminate when either a null or invalid character was + * encountered or maxlen bytes have been read. + * @return number of bytes read (is always <= maxlen) + */ +int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); +int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); + + +/** + * @name URL open modes + * The flags argument to avio_open must be one of the following + * constants, optionally ORed with other flags. + * @{ + */ +#define AVIO_FLAG_READ 1 /**< read-only */ +#define AVIO_FLAG_WRITE 2 /**< write-only */ +#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE) /**< read-write pseudo flag */ +/** + * @} + */ + +/** + * Use non-blocking mode. + * If this flag is set, operations on the context will return + * AVERROR(EAGAIN) if they can not be performed immediately. + * If this flag is not set, operations on the context will never return + * AVERROR(EAGAIN). + * Note that this flag does not affect the opening/connecting of the + * context. Connecting a protocol will always block if necessary (e.g. on + * network protocols) but never hang (e.g. on busy devices). + * Warning: non-blocking protocols is work-in-progress; this flag may be + * silently ignored. + */ +#define AVIO_FLAG_NONBLOCK 8 + +/** + * Use direct mode. + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ +#define AVIO_FLAG_DIRECT 0x8000 + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open(AVIOContext **s, const char *url, int flags); + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @param int_cb an interrupt callback to be used at the protocols level + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dict containing options + * that were not found. May be NULL. + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open2(AVIOContext **s, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * Close the resource accessed by the AVIOContext s and free it. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_closep + */ +int avio_close(AVIOContext *s); + +/** + * Close the resource accessed by the AVIOContext *s, free it + * and set the pointer pointing to it to NULL. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_close + */ +int avio_closep(AVIOContext **s); + + +/** + * Open a write only memory stream. + * + * @param s new IO context + * @return zero if no error. + */ +int avio_open_dyn_buf(AVIOContext **s); + +/** + * Return the written size and a pointer to the buffer. + * The AVIOContext stream is left intact. + * The buffer must NOT be freed. + * No padding is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Return the written size and a pointer to the buffer. The buffer + * must be freed with av_free(). + * Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Iterate through names of available protocols. + * + * @param opaque A private pointer representing current protocol. + * It must be a pointer to NULL on first iteration and will + * be updated by successive calls to avio_enum_protocols. + * @param output If set to 1, iterate over output protocols, + * otherwise over input protocols. + * + * @return A static string containing the name of current protocol or NULL + */ +const char *avio_enum_protocols(void **opaque, int output); + +/** + * Pause and resume playing - only meaningful if using a network streaming + * protocol (e.g. MMS). + * + * @param h IO context from which to call the read_pause function pointer + * @param pause 1 for pause, 0 for resume + */ +int avio_pause(AVIOContext *h, int pause); + +/** + * Seek to a given timestamp relative to some component stream. + * Only meaningful if using a network streaming protocol (e.g. MMS.). + * + * @param h IO context from which to call the seek function pointers + * @param stream_index The stream index that the timestamp is relative to. + * If stream_index is (-1) the timestamp should be in AV_TIME_BASE + * units from the beginning of the presentation. + * If a stream_index >= 0 is used and the protocol does not support + * seeking based on component streams, the call will fail. + * @param timestamp timestamp in AVStream.time_base units + * or if there is no stream specified then in AV_TIME_BASE units. + * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE + * and AVSEEK_FLAG_ANY. The protocol may silently ignore + * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will + * fail if used and not supported. + * @return >= 0 on success + * @see AVInputFormat::read_seek + */ +int64_t avio_seek_time(AVIOContext *h, int stream_index, + int64_t timestamp, int flags); + +/* Avoid a warning. The header can not be included because it breaks c++. */ +struct AVBPrint; + +/** + * Read contents of h into print buffer, up to max_size bytes, or up to EOF. + * + * @return 0 for success (max_size bytes read or EOF reached), negative error + * code otherwise + */ +int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); + +/** + * Accept and allocate a client context on a server context. + * @param s the server context + * @param c the client context, must be unallocated + * @return >= 0 on success or a negative value corresponding + * to an AVERROR on failure + */ +int avio_accept(AVIOContext *s, AVIOContext **c); + +/** + * Perform one step of the protocol handshake to accept a new client. + * This function must be called on a client returned by avio_accept() before + * using it as a read/write context. + * It is separate from avio_accept() because it may block. + * A step of the handshake is defined by places where the application may + * decide to change the proceedings. + * For example, on a protocol with a request header and a reply header, each + * one can constitute a step because the application may use the parameters + * from the request to change parameters in the reply; or each individual + * chunk of the request can constitute a step. + * If the handshake is already finished, avio_handshake() does nothing and + * returns 0 immediately. + * + * @param c the client context to perform the handshake on + * @return 0 on a complete and successful handshake + * > 0 if the handshake progressed, but is not complete + * < 0 for an AVERROR code + */ +int avio_handshake(AVIOContext *c); +#endif /* AVFORMAT_AVIO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/version.h new file mode 100644 index 0000000..22ed534 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavformat/version.h @@ -0,0 +1,114 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFORMAT_VERSION_H +#define AVFORMAT_VERSION_H + +/** + * @file + * @ingroup libavf + * Libavformat version macros + */ + +#include "libavutil/version.h" + +// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) +// Also please add any ticket numbers that you believe might be affected here +#define LIBAVFORMAT_VERSION_MAJOR 58 +#define LIBAVFORMAT_VERSION_MINOR 29 +#define LIBAVFORMAT_VERSION_MICRO 100 + +#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT + +#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + */ +#ifndef FF_API_COMPUTE_PKT_FIELDS2 +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_OPEN_CALLBACKS +#define FF_API_OLD_OPEN_CALLBACKS (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_AVCTX +#define FF_API_LAVF_AVCTX (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HTTP_USER_AGENT +#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HLS_WRAP +#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HLS_USE_LOCALTIME +#define FF_API_HLS_USE_LOCALTIME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_KEEPSIDE_FLAG +#define FF_API_LAVF_KEEPSIDE_FLAG (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_ROTATE_API +#define FF_API_OLD_ROTATE_API (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_GET_SET +#define FF_API_FORMAT_GET_SET (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_AVIO_EOF_0 +#define FF_API_OLD_AVIO_EOF_0 (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_FFSERVER +#define FF_API_LAVF_FFSERVER (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_FILENAME +#define FF_API_FORMAT_FILENAME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_RTSP_OPTIONS +#define FF_API_OLD_RTSP_OPTIONS (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_DASH_MIN_SEG_DURATION +#define FF_API_DASH_MIN_SEG_DURATION (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_MP4A_LATM +#define FF_API_LAVF_MP4A_LATM (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVIOFORMAT +#define FF_API_AVIOFORMAT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif + + +#ifndef FF_API_R_FRAME_RATE +#define FF_API_R_FRAME_RATE 1 +#endif +#endif /* AVFORMAT_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/adler32.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/adler32.h new file mode 100644 index 0000000..a1f035b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/adler32.h @@ -0,0 +1,60 @@ +/* + * copyright (c) 2006 Mans Rullgard + * + * 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 + * @ingroup lavu_adler32 + * Public header for Adler-32 hash function implementation. + */ + +#ifndef AVUTIL_ADLER32_H +#define AVUTIL_ADLER32_H + +#include +#include "attributes.h" + +/** + * @defgroup lavu_adler32 Adler-32 + * @ingroup lavu_hash + * Adler-32 hash function implementation. + * + * @{ + */ + +/** + * Calculate the Adler32 checksum of a buffer. + * + * Passing the return value to a subsequent av_adler32_update() call + * allows the checksum of multiple buffers to be calculated as though + * they were concatenated. + * + * @param adler initial checksum value + * @param buf pointer to input buffer + * @param len size of input buffer + * @return updated checksum + */ +unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, + unsigned int len) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_ADLER32_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes.h new file mode 100644 index 0000000..09efbda --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes.h @@ -0,0 +1,65 @@ +/* + * copyright (c) 2007 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AES_H +#define AVUTIL_AES_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_aes AES + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_aes_size; + +struct AVAES; + +/** + * Allocate an AVAES context. + */ +struct AVAES *av_aes_alloc(void); + +/** + * Initialize an AVAES context. + * @param key_bits 128, 192 or 256 + * @param decrypt 0 for encryption, 1 for decryption + */ +int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * @param count number of 16 byte blocks + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_AES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes_ctr.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes_ctr.h new file mode 100644 index 0000000..e4aae12 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/aes_ctr.h @@ -0,0 +1,88 @@ +/* + * AES-CTR cipher + * Copyright (c) 2015 Eran Kornblau + * + * 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 + */ + +#ifndef AVUTIL_AES_CTR_H +#define AVUTIL_AES_CTR_H + +#include + +#include "attributes.h" +#include "version.h" + +#define AES_CTR_KEY_SIZE (16) +#define AES_CTR_IV_SIZE (8) + +struct AVAESCTR; + +/** + * Allocate an AVAESCTR context. + */ +struct AVAESCTR *av_aes_ctr_alloc(void); + +/** + * Initialize an AVAESCTR context. + * @param key encryption key, must have a length of AES_CTR_KEY_SIZE + */ +int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key); + +/** + * Release an AVAESCTR context. + */ +void av_aes_ctr_free(struct AVAESCTR *a); + +/** + * Process a buffer using a previously initialized context. + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param size the size of src and dst + */ +void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size); + +/** + * Get the current iv + */ +const uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a); + +/** + * Generate a random iv + */ +void av_aes_ctr_set_random_iv(struct AVAESCTR *a); + +/** + * Forcefully change the 8-byte iv + */ +void av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Forcefully change the "full" 16-byte iv, including the counter + */ +void av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Increment the top 64 bit of the iv (performed after each frame) + */ +void av_aes_ctr_increment_iv(struct AVAESCTR *a); + +/** + * @} + */ + +#endif /* AVUTIL_AES_CTR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/attributes.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/attributes.h new file mode 100644 index 0000000..ced108a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/attributes.h @@ -0,0 +1,167 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * Macro definitions for various function/variable attributes + */ + +#ifndef AVUTIL_ATTRIBUTES_H +#define AVUTIL_ATTRIBUTES_H + +#ifdef __GNUC__ +# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) +# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) +#else +# define AV_GCC_VERSION_AT_LEAST(x,y) 0 +# define AV_GCC_VERSION_AT_MOST(x,y) 0 +#endif + +#ifndef av_always_inline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_always_inline __attribute__((always_inline)) inline +#elif defined(_MSC_VER) +# define av_always_inline __forceinline +#else +# define av_always_inline inline +#endif +#endif + +#ifndef av_extern_inline +#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) +# define av_extern_inline extern inline +#else +# define av_extern_inline inline +#endif +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,4) +# define av_warn_unused_result __attribute__((warn_unused_result)) +#else +# define av_warn_unused_result +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_noinline __attribute__((noinline)) +#elif defined(_MSC_VER) +# define av_noinline __declspec(noinline) +#else +# define av_noinline +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_pure __attribute__((pure)) +#else +# define av_pure +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) +# define av_const __attribute__((const)) +#else +# define av_const +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) +# define av_cold __attribute__((cold)) +#else +# define av_cold +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) +# define av_flatten __attribute__((flatten)) +#else +# define av_flatten +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_deprecated __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define attribute_deprecated __declspec(deprecated) +#else +# define attribute_deprecated +#endif + +/** + * Disable warnings about deprecated features + * This is useful for sections of code kept for backward compatibility and + * scheduled for removal. + */ +#ifndef AV_NOWARN_DEPRECATED +#if AV_GCC_VERSION_AT_LEAST(4,6) +# define AV_NOWARN_DEPRECATED(code) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ + code \ + _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +# define AV_NOWARN_DEPRECATED(code) \ + __pragma(warning(push)) \ + __pragma(warning(disable : 4996)) \ + code; \ + __pragma(warning(pop)) +#else +# define AV_NOWARN_DEPRECATED(code) code +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_unused __attribute__((unused)) +#else +# define av_unused +#endif + +/** + * Mark a variable as used and prevent the compiler from optimizing it + * away. This is useful for variables accessed only from inline + * assembler without the compiler being aware. + */ +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_used __attribute__((used)) +#else +# define av_used +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__) +# define av_alias __attribute__((may_alias)) +#else +# define av_alias +#endif + +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) +# define av_uninit(x) x=x +#else +# define av_uninit(x) x +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_builtin_constant_p __builtin_constant_p +# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) +#else +# define av_builtin_constant_p(x) 0 +# define av_printf_format(fmtpos, attrpos) +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__) +# define av_noreturn __attribute__((noreturn)) +#else +# define av_noreturn +#endif + +#endif /* AVUTIL_ATTRIBUTES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/audio_fifo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/audio_fifo.h new file mode 100644 index 0000000..d8a9194 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/audio_fifo.h @@ -0,0 +1,187 @@ +/* + * Audio FIFO + * Copyright (c) 2012 Justin Ruggles + * + * 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 + * Audio FIFO Buffer + */ + +#ifndef AVUTIL_AUDIO_FIFO_H +#define AVUTIL_AUDIO_FIFO_H + +#include "avutil.h" +#include "fifo.h" +#include "samplefmt.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_audiofifo Audio FIFO Buffer + * @{ + */ + +/** + * Context for an Audio FIFO Buffer. + * + * - Operates at the sample level rather than the byte level. + * - Supports multiple channels with either planar or packed sample format. + * - Automatic reallocation when writing to a full buffer. + */ +typedef struct AVAudioFifo AVAudioFifo; + +/** + * Free an AVAudioFifo. + * + * @param af AVAudioFifo to free + */ +void av_audio_fifo_free(AVAudioFifo *af); + +/** + * Allocate an AVAudioFifo. + * + * @param sample_fmt sample format + * @param channels number of channels + * @param nb_samples initial allocation size, in samples + * @return newly allocated AVAudioFifo, or NULL on error + */ +AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, + int nb_samples); + +/** + * Reallocate an AVAudioFifo. + * + * @param af AVAudioFifo to reallocate + * @param nb_samples new allocation size, in samples + * @return 0 if OK, or negative AVERROR code on failure + */ +av_warn_unused_result +int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); + +/** + * Write data to an AVAudioFifo. + * + * The AVAudioFifo will be reallocated automatically if the available space + * is less than nb_samples. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to write to + * @param data audio data plane pointers + * @param nb_samples number of samples to write + * @return number of samples actually written, or negative AVERROR + * code on failure. If successful, the number of samples + * actually written will always be nb_samples. + */ +int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @param offset offset from current read position + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset); + +/** + * Read data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to read + * @return number of samples actually read, or negative AVERROR code + * on failure. The number of samples actually read will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Drain data from an AVAudioFifo. + * + * Removes the data without reading it. + * + * @param af AVAudioFifo to drain + * @param nb_samples number of samples to drain + * @return 0 if OK, or negative AVERROR code on failure + */ +int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples); + +/** + * Reset the AVAudioFifo buffer. + * + * This empties all data in the buffer. + * + * @param af AVAudioFifo to reset + */ +void av_audio_fifo_reset(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for reading. + * + * @param af the AVAudioFifo to query + * @return number of samples available for reading + */ +int av_audio_fifo_size(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for writing. + * + * @param af the AVAudioFifo to query + * @return number of samples available for writing + */ +int av_audio_fifo_space(AVAudioFifo *af); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_AUDIO_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avassert.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avassert.h new file mode 100644 index 0000000..9abeade --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avassert.h @@ -0,0 +1,75 @@ +/* + * copyright (c) 2010 Michael Niedermayer + * + * 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 + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_AVASSERT_H +#define AVUTIL_AVASSERT_H + +#include +#include "avutil.h" +#include "log.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do { \ + if (!(cond)) { \ + av_log(NULL, AV_LOG_PANIC, "Assertion %s failed at %s:%d\n", \ + AV_STRINGIFY(cond), __FILE__, __LINE__); \ + abort(); \ + } \ +} while (0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speed loss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert0(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert0(cond) +#define av_assert2_fpu() av_assert0_fpu() +#else +#define av_assert2(cond) ((void)0) +#define av_assert2_fpu() ((void)0) +#endif + +/** + * Assert that floating point operations can be executed. + * + * This will av_assert0() that the cpu is not in MMX state on X86 + */ +void av_assert0_fpu(void); + +#endif /* AVUTIL_AVASSERT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avconfig.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avconfig.h new file mode 100644 index 0000000..c289fbb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avconfig.h @@ -0,0 +1,6 @@ +/* Generated by ffmpeg configure */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +#define AV_HAVE_BIGENDIAN 0 +#define AV_HAVE_FAST_UNALIGNED 1 +#endif /* AVUTIL_AVCONFIG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avstring.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avstring.h new file mode 100644 index 0000000..37dd4e2 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avstring.h @@ -0,0 +1,413 @@ +/* + * Copyright (c) 2007 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_AVSTRING_H +#define AVUTIL_AVSTRING_H + +#include +#include +#include "attributes.h" + +/** + * @addtogroup lavu_string + * @{ + */ + +/** + * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to + * the address of the first character in str after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_strstart(const char *str, const char *pfx, const char **ptr); + +/** + * Return non-zero if pfx is a prefix of str independent of case. If + * it is, *ptr is set to the address of the first character in str + * after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_stristart(const char *str, const char *pfx, const char **ptr); + +/** + * Locate the first case-independent occurrence in the string haystack + * of the string needle. A zero-length string needle is considered to + * match at the start of haystack. + * + * This function is a case-insensitive version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_stristr(const char *haystack, const char *needle); + +/** + * Locate the first occurrence of the string needle in the string haystack + * where not more than hay_length characters are searched. A zero-length + * string needle is considered to match at the start of haystack. + * + * This function is a length-limited version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @param hay_length length of string to search in + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_strnstr(const char *haystack, const char *needle, size_t hay_length); + +/** + * Copy the string src to dst, but no more than size - 1 bytes, and + * null-terminate dst. + * + * This function is the same as BSD strlcpy(). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the length of src + * + * @warning since the return value is the length of src, src absolutely + * _must_ be a properly 0-terminated string, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcpy(char *dst, const char *src, size_t size); + +/** + * Append the string src to the string dst, but to a total length of + * no more than size - 1 bytes, and null-terminate dst. + * + * This function is similar to BSD strlcat(), but differs when + * size <= strlen(dst). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the total length of src and dst + * + * @warning since the return value use the length of src and dst, these + * absolutely _must_ be a properly 0-terminated strings, otherwise this + * will read beyond the end of the buffer and possibly crash. + */ +size_t av_strlcat(char *dst, const char *src, size_t size); + +/** + * Append output to a string, according to a format. Never write out of + * the destination buffer, and always put a terminating 0 within + * the buffer. + * @param dst destination buffer (string to which the output is + * appended) + * @param size total size of the destination buffer + * @param fmt printf-compatible format string, specifying how the + * following parameters are used + * @return the length of the string that would have been generated + * if enough space had been available + */ +size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4); + +/** + * Get the count of continuous non zero chars starting from the beginning. + * + * @param len maximum number of characters to check in the string, that + * is the maximum value which is returned by the function + */ +static inline size_t av_strnlen(const char *s, size_t len) +{ + size_t i; + for (i = 0; i < len && s[i]; i++) + ; + return i; +} + +/** + * Print arguments following specified format into a large enough auto + * allocated buffer. It is similar to GNU asprintf(). + * @param fmt printf-compatible format string, specifying how the + * following parameters are used. + * @return the allocated string + * @note You have to free the string yourself with av_free(). + */ +char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); + +/** + * Convert a number to an av_malloced string. + */ +char *av_d2str(double d); + +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + +/** + * Split the string into several tokens which can be accessed by + * successive calls to av_strtok(). + * + * A token is defined as a sequence of characters not belonging to the + * set specified in delim. + * + * On the first call to av_strtok(), s should point to the string to + * parse, and the value of saveptr is ignored. In subsequent calls, s + * should be NULL, and saveptr should be unchanged since the previous + * call. + * + * This function is similar to strtok_r() defined in POSIX.1. + * + * @param s the string to parse, may be NULL + * @param delim 0-terminated list of token delimiters, must be non-NULL + * @param saveptr user-provided pointer which points to stored + * information necessary for av_strtok() to continue scanning the same + * string. saveptr is updated to point to the next character after the + * first delimiter found, or to NULL if the string was terminated + * @return the found token, or NULL when no token is found + */ +char *av_strtok(char *s, const char *delim, char **saveptr); + +/** + * Locale-independent conversion of ASCII isdigit. + */ +static inline av_const int av_isdigit(int c) +{ + return c >= '0' && c <= '9'; +} + +/** + * Locale-independent conversion of ASCII isgraph. + */ +static inline av_const int av_isgraph(int c) +{ + return c > 32 && c < 127; +} + +/** + * Locale-independent conversion of ASCII isspace. + */ +static inline av_const int av_isspace(int c) +{ + return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || + c == '\v'; +} + +/** + * Locale-independent conversion of ASCII characters to uppercase. + */ +static inline av_const int av_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII characters to lowercase. + */ +static inline av_const int av_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII isxdigit. + */ +static inline av_const int av_isxdigit(int c) +{ + c = av_tolower(c); + return av_isdigit(c) || (c >= 'a' && c <= 'f'); +} + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strcasecmp(const char *a, const char *b); + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strncasecmp(const char *a, const char *b, size_t n); + +/** + * Locale-independent strings replace. + * @note This means only ASCII-range characters are replace + */ +char *av_strireplace(const char *str, const char *from, const char *to); + +/** + * Thread safe basename. + * @param path the path, on DOS both \ and / are considered separators. + * @return pointer to the basename substring. + */ +const char *av_basename(const char *path); + +/** + * Thread safe dirname. + * @param path the path, on DOS both \ and / are considered separators. + * @return the path with the separator replaced by the string terminator or ".". + * @note the function may change the input string. + */ +const char *av_dirname(char *path); + +/** + * Match instances of a name in a comma-separated list of names. + * List entries are checked from the start to the end of the names list, + * the first match ends further processing. If an entry prefixed with '-' + * matches, then 0 is returned. The "ALL" list entry is considered to + * match all names. + * + * @param name Name to look for. + * @param names List of names. + * @return 1 on match, 0 otherwise. + */ +int av_match_name(const char *name, const char *names); + +/** + * Append path component to the existing path. + * Path separator '/' is placed between when needed. + * Resulting string have to be freed with av_free(). + * @param path base path + * @param component component to be appended + * @return new path or NULL on error. + */ +char *av_append_path_component(const char *path, const char *component); + +enum AVEscapeMode { + AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. + AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. + AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. +}; + +/** + * Consider spaces special and escape them even in the middle of the + * string. + * + * This is equivalent to adding the whitespace characters to the special + * characters lists, except it is guaranteed to use the exact same list + * of whitespace characters as the rest of libavutil. + */ +#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0) + +/** + * Escape only specified special characters. + * Without this flag, escape also any characters that may be considered + * special by av_get_token(), such as the single quote. + */ +#define AV_ESCAPE_FLAG_STRICT (1 << 1) + +/** + * Escape string in src, and put the escaped string in an allocated + * string in *dst, which must be freed with av_free(). + * + * @param dst pointer where an allocated string is put + * @param src string to escape, must be non-NULL + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_ macros + * @return the length of the allocated string, or a negative error code in case of error + * @see av_bprint_escape() + */ +av_warn_unused_result +int av_escape(char **dst, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES 1 ///< accept codepoints over 0x10FFFF +#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS 2 ///< accept non-characters - 0xFFFE and 0xFFFF +#define AV_UTF8_FLAG_ACCEPT_SURROGATES 4 ///< accept UTF-16 surrogates codes +#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML + +#define AV_UTF8_FLAG_ACCEPT_ALL \ + AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES + +/** + * Read and decode a single UTF-8 code point (character) from the + * buffer in *buf, and update *buf to point to the next byte to + * decode. + * + * In case of an invalid byte sequence, the pointer will be updated to + * the next byte after the invalid sequence and the function will + * return an error code. + * + * Depending on the specified flags, the function will also fail in + * case the decoded code point does not belong to a valid range. + * + * @note For speed-relevant code a carefully implemented use of + * GET_UTF8() may be preferred. + * + * @param codep pointer used to return the parsed code in case of success. + * The value in *codep is set even in case the range check fails. + * @param bufp pointer to the address the first byte of the sequence + * to decode, updated by the function to point to the + * byte next after the decoded sequence + * @param buf_end pointer to the end of the buffer, points to the next + * byte past the last in the buffer. This is used to + * avoid buffer overreads (in case of an unfinished + * UTF-8 sequence towards the end of the buffer). + * @param flags a collection of AV_UTF8_FLAG_* flags + * @return >= 0 in case a sequence was successfully read, a negative + * value in case of invalid sequence + */ +av_warn_unused_result +int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, + unsigned int flags); + +/** + * Check if a name is in a list. + * @returns 0 if not found, or the 1 based index where it has been found in the + * list. + */ +int av_match_list(const char *name, const char *list, char separator); + +/** + * See libc sscanf manual for more information. + * Locale-independent sscanf implementation. + */ +int av_sscanf(const char *string, const char *format, ...); + +/** + * @} + */ + +#endif /* AVUTIL_AVSTRING_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avutil.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avutil.h new file mode 100644 index 0000000..4d63315 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/avutil.h @@ -0,0 +1,365 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AVUTIL_H +#define AVUTIL_AVUTIL_H + +/** + * @file + * @ingroup lavu + * Convenience header that includes @ref lavu "libavutil"'s core. + */ + +/** + * @mainpage + * + * @section ffmpeg_intro Introduction + * + * This document describes the usage of the different libraries + * provided by FFmpeg. + * + * @li @ref libavc "libavcodec" encoding/decoding library + * @li @ref lavfi "libavfilter" graph-based frame editing library + * @li @ref libavf "libavformat" I/O and muxing/demuxing library + * @li @ref lavd "libavdevice" special devices muxing/demuxing library + * @li @ref lavu "libavutil" common utility library + * @li @ref lswr "libswresample" audio resampling, format conversion and mixing + * @li @ref lpp "libpostproc" post processing library + * @li @ref libsws "libswscale" color conversion and scaling library + * + * @section ffmpeg_versioning Versioning and compatibility + * + * Each of the FFmpeg libraries contains a version.h header, which defines a + * major, minor and micro version number with the + * LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version + * number is incremented with backward incompatible changes - e.g. removing + * parts of the public API, reordering public struct members, etc. The minor + * version number is incremented for backward compatible API changes or major + * new features - e.g. adding a new public function or a new decoder. The micro + * version number is incremented for smaller changes that a calling program + * might still want to check for - e.g. changing behavior in a previously + * unspecified situation. + * + * FFmpeg guarantees backward API and ABI compatibility for each library as long + * as its major version number is unchanged. This means that no public symbols + * will be removed or renamed. Types and names of the public struct members and + * values of public macros and enums will remain the same (unless they were + * explicitly declared as not part of the public API). Documented behavior will + * not change. + * + * In other words, any correct program that works with a given FFmpeg snapshot + * should work just as well without any changes with any later snapshot with the + * same major versions. This applies to both rebuilding the program against new + * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program + * links against. + * + * However, new public symbols may be added and new members may be appended to + * public structs whose size is not part of public ABI (most public structs in + * FFmpeg). New macros and enum values may be added. Behavior in undocumented + * situations may change slightly (and be documented). All those are accompanied + * by an entry in doc/APIchanges and incrementing either the minor or micro + * version number. + */ + +/** + * @defgroup lavu libavutil + * Common code shared across all FFmpeg libraries. + * + * @note + * libavutil is designed to be modular. In most cases, in order to use the + * functions provided by one component of libavutil you must explicitly include + * the specific header containing that feature. If you are only using + * media-related components, you could simply include libavutil/avutil.h, which + * brings in most of the "core" components. + * + * @{ + * + * @defgroup lavu_crypto Crypto and Hashing + * + * @{ + * @} + * + * @defgroup lavu_math Mathematics + * @{ + * + * @} + * + * @defgroup lavu_string String Manipulation + * + * @{ + * + * @} + * + * @defgroup lavu_mem Memory Management + * + * @{ + * + * @} + * + * @defgroup lavu_data Data Structures + * @{ + * + * @} + * + * @defgroup lavu_video Video related + * + * @{ + * + * @} + * + * @defgroup lavu_audio Audio related + * + * @{ + * + * @} + * + * @defgroup lavu_error Error Codes + * + * @{ + * + * @} + * + * @defgroup lavu_log Logging Facility + * + * @{ + * + * @} + * + * @defgroup lavu_misc Other + * + * @{ + * + * @defgroup preproc_misc Preprocessor String Macros + * + * @{ + * + * @} + * + * @defgroup version_utils Library Version Macros + * + * @{ + * + * @} + */ + + +/** + * @addtogroup lavu_ver + * @{ + */ + +/** + * Return the LIBAVUTIL_VERSION_INT constant. + */ +unsigned avutil_version(void); + +/** + * Return an informative version string. This usually is the actual release + * version number or a git commit description. This string has no fixed format + * and can change any time. It should never be parsed by code. + */ +const char *av_version_info(void); + +/** + * Return the libavutil build-time configuration. + */ +const char *avutil_configuration(void); + +/** + * Return the libavutil license. + */ +const char *avutil_license(void); + +/** + * @} + */ + +/** + * @addtogroup lavu_media Media Type + * @brief Media Type + */ + +enum AVMediaType { + AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA + AVMEDIA_TYPE_VIDEO, + AVMEDIA_TYPE_AUDIO, + AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous + AVMEDIA_TYPE_SUBTITLE, + AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse + AVMEDIA_TYPE_NB +}; + +/** + * Return a string describing the media_type enum, NULL if media_type + * is unknown. + */ +const char *av_get_media_type_string(enum AVMediaType media_type); + +/** + * @defgroup lavu_const Constants + * @{ + * + * @defgroup lavu_enc Encoding specific + * + * @note those definition should move to avcodec + * @{ + */ + +#define FF_LAMBDA_SHIFT 7 +#define FF_LAMBDA_SCALE (1< + +/** + * @defgroup lavu_base64 Base64 + * @ingroup lavu_crypto + * @{ + */ + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in)) + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Calculate the output size in bytes needed to decode a base64 string + * with length x to a data buffer. + */ +#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4) + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the out buffer (including the + * null terminator), must be at least AV_BASE64_SIZE(in_size) + * @param in input buffer containing the data to encode + * @param in_size size in bytes of the in buffer + * @return out or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes to a + * null-terminated string. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + + /** + * @} + */ + +#endif /* AVUTIL_BASE64_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/blowfish.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/blowfish.h new file mode 100644 index 0000000..9e289a4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/blowfish.h @@ -0,0 +1,82 @@ +/* + * Blowfish algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_BLOWFISH_H +#define AVUTIL_BLOWFISH_H + +#include + +/** + * @defgroup lavu_blowfish Blowfish + * @ingroup lavu_crypto + * @{ + */ + +#define AV_BF_ROUNDS 16 + +typedef struct AVBlowfish { + uint32_t p[AV_BF_ROUNDS + 2]; + uint32_t s[4][256]; +} AVBlowfish; + +/** + * Allocate an AVBlowfish context. + */ +AVBlowfish *av_blowfish_alloc(void); + +/** + * Initialize an AVBlowfish context. + * + * @param ctx an AVBlowfish context + * @param key a key + * @param key_len length of the key + */ +void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param xl left four bytes halves of input to be encrypted + * @param xr right four bytes halves of input to be encrypted + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_BLOWFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bprint.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bprint.h new file mode 100644 index 0000000..c09b1ac --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bprint.h @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2012 Nicolas George + * + * 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 + */ + +#ifndef AVUTIL_BPRINT_H +#define AVUTIL_BPRINT_H + +#include + +#include "attributes.h" +#include "avstring.h" + +/** + * Define a structure with extra padding to a fixed size + * This helps ensuring binary compatibility with future versions. + */ + +#define FF_PAD_STRUCTURE(name, size, ...) \ +struct ff_pad_helper_##name { __VA_ARGS__ }; \ +typedef struct name { \ + __VA_ARGS__ \ + char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \ +} name; + +/** + * Buffer to print data progressively + * + * The string buffer grows as necessary and is always 0-terminated. + * The content of the string is never accessed, and thus is + * encoding-agnostic and can even hold binary data. + * + * Small buffers are kept in the structure itself, and thus require no + * memory allocation at all (unless the contents of the buffer is needed + * after the structure goes out of scope). This is almost as lightweight as + * declaring a local "char buf[512]". + * + * The length of the string can go beyond the allocated size: the buffer is + * then truncated, but the functions still keep account of the actual total + * length. + * + * In other words, buf->len can be greater than buf->size and records the + * total length of what would have been to the buffer if there had been + * enough memory. + * + * Append operations do not need to be tested for failure: if a memory + * allocation fails, data stop being appended to the buffer, but the length + * is still updated. This situation can be tested with + * av_bprint_is_complete(). + * + * The size_max field determines several possible behaviours: + * + * size_max = -1 (= UINT_MAX) or any large value will let the buffer be + * reallocated as necessary, with an amortized linear cost. + * + * size_max = 0 prevents writing anything to the buffer: only the total + * length is computed. The write operations can then possibly be repeated in + * a buffer with exactly the necessary size + * (using size_init = size_max = len + 1). + * + * size_max = 1 is automatically replaced by the exact size available in the + * structure itself, thus ensuring no dynamic memory allocation. The + * internal buffer is large enough to hold a reasonable paragraph of text, + * such as the current paragraph. + */ + +FF_PAD_STRUCTURE(AVBPrint, 1024, + char *str; /**< string so far */ + unsigned len; /**< length so far */ + unsigned size; /**< allocated memory */ + unsigned size_max; /**< maximum allocated memory */ + char reserved_internal_buffer[1]; +) + +/** + * Convenience macros for special values for av_bprint_init() size_max + * parameter. + */ +#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1) +#define AV_BPRINT_SIZE_AUTOMATIC 1 +#define AV_BPRINT_SIZE_COUNT_ONLY 0 + +/** + * Init a print buffer. + * + * @param buf buffer to init + * @param size_init initial size (including the final 0) + * @param size_max maximum size; + * 0 means do not write anything, just count the length; + * 1 is replaced by the maximum value for automatic storage; + * any large value means that the internal buffer will be + * reallocated as needed up to that limit; -1 is converted to + * UINT_MAX, the largest limit possible. + * Check also AV_BPRINT_SIZE_* macros. + */ +void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max); + +/** + * Init a print buffer using a pre-existing buffer. + * + * The buffer will not be reallocated. + * + * @param buf buffer structure to init + * @param buffer byte buffer to use for the string data + * @param size size of buffer + */ +void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size); + +/** + * Append a formatted string to a print buffer. + */ +void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Append a formatted string to a print buffer. + */ +void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg); + +/** + * Append char c n times to a print buffer. + */ +void av_bprint_chars(AVBPrint *buf, char c, unsigned n); + +/** + * Append data to a print buffer. + * + * param buf bprint buffer to use + * param data pointer to data + * param size size of data + */ +void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size); + +struct tm; +/** + * Append a formatted date and time to a print buffer. + * + * param buf bprint buffer to use + * param fmt date and time format string, see strftime() + * param tm broken-down time structure to translate + * + * @note due to poor design of the standard strftime function, it may + * produce poor results if the format string expands to a very long text and + * the bprint buffer is near the limit stated by the size_max option. + */ +void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm); + +/** + * Allocate bytes in the buffer for external use. + * + * @param[in] buf buffer structure + * @param[in] size required size + * @param[out] mem pointer to the memory area + * @param[out] actual_size size of the memory area after allocation; + * can be larger or smaller than size + */ +void av_bprint_get_buffer(AVBPrint *buf, unsigned size, + unsigned char **mem, unsigned *actual_size); + +/** + * Reset the string to "" but keep internal allocated data. + */ +void av_bprint_clear(AVBPrint *buf); + +/** + * Test if the print buffer is complete (not truncated). + * + * It may have been truncated due to a memory allocation failure + * or the size_max limit (compare size and size_max if necessary). + */ +static inline int av_bprint_is_complete(const AVBPrint *buf) +{ + return buf->len < buf->size; +} + +/** + * Finalize a print buffer. + * + * The print buffer can no longer be used afterwards, + * but the len and size fields are still valid. + * + * @arg[out] ret_str if not NULL, used to return a permanent copy of the + * buffer contents, or NULL if memory allocation fails; + * if NULL, the buffer is discarded and freed + * @return 0 for success or error code (probably AVERROR(ENOMEM)) + */ +int av_bprint_finalize(AVBPrint *buf, char **ret_str); + +/** + * Escape the content in src and append it to dstbuf. + * + * @param dstbuf already inited destination bprint buffer + * @param src string containing the text to escape + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_* macros + */ +void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#endif /* AVUTIL_BPRINT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bswap.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bswap.h new file mode 100644 index 0000000..91cb795 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/bswap.h @@ -0,0 +1,109 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * byte swapping routines + */ + +#ifndef AVUTIL_BSWAP_H +#define AVUTIL_BSWAP_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_AARCH64 +# include "aarch64/bswap.h" +#elif ARCH_ARM +# include "arm/bswap.h" +#elif ARCH_AVR32 +# include "avr32/bswap.h" +#elif ARCH_SH4 +# include "sh4/bswap.h" +#elif ARCH_X86 +# include "x86/bswap.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + +#ifndef av_bswap16 +static av_always_inline av_const uint16_t av_bswap16(uint16_t x) +{ + x= (x>>8) | (x<<8); + return x; +} +#endif + +#ifndef av_bswap32 +static av_always_inline av_const uint32_t av_bswap32(uint32_t x) +{ + return AV_BSWAP32C(x); +} +#endif + +#ifndef av_bswap64 +static inline uint64_t av_const av_bswap64(uint64_t x) +{ + return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32); +} +#endif + +// be2ne ... big-endian to native-endian +// le2ne ... little-endian to native-endian + +#if AV_HAVE_BIGENDIAN +#define av_be2ne16(x) (x) +#define av_be2ne32(x) (x) +#define av_be2ne64(x) (x) +#define av_le2ne16(x) av_bswap16(x) +#define av_le2ne32(x) av_bswap32(x) +#define av_le2ne64(x) av_bswap64(x) +#define AV_BE2NEC(s, x) (x) +#define AV_LE2NEC(s, x) AV_BSWAPC(s, x) +#else +#define av_be2ne16(x) av_bswap16(x) +#define av_be2ne32(x) av_bswap32(x) +#define av_be2ne64(x) av_bswap64(x) +#define av_le2ne16(x) (x) +#define av_le2ne32(x) (x) +#define av_le2ne64(x) (x) +#define AV_BE2NEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2NEC(s, x) (x) +#endif + +#define AV_BE2NE16C(x) AV_BE2NEC(16, x) +#define AV_BE2NE32C(x) AV_BE2NEC(32, x) +#define AV_BE2NE64C(x) AV_BE2NEC(64, x) +#define AV_LE2NE16C(x) AV_LE2NEC(16, x) +#define AV_LE2NE32C(x) AV_LE2NEC(32, x) +#define AV_LE2NE64C(x) AV_LE2NEC(64, x) + +#endif /* AVUTIL_BSWAP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/buffer.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/buffer.h new file mode 100644 index 0000000..73b6bd0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/buffer.h @@ -0,0 +1,291 @@ +/* + * 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 + * @ingroup lavu_buffer + * refcounted data buffer API + */ + +#ifndef AVUTIL_BUFFER_H +#define AVUTIL_BUFFER_H + +#include + +/** + * @defgroup lavu_buffer AVBuffer + * @ingroup lavu_data + * + * @{ + * AVBuffer is an API for reference-counted data buffers. + * + * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer + * represents the data buffer itself; it is opaque and not meant to be accessed + * by the caller directly, but only through AVBufferRef. However, the caller may + * e.g. compare two AVBuffer pointers to check whether two different references + * are describing the same data buffer. AVBufferRef represents a single + * reference to an AVBuffer and it is the object that may be manipulated by the + * caller directly. + * + * There are two functions provided for creating a new AVBuffer with a single + * reference -- av_buffer_alloc() to just allocate a new buffer, and + * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing + * reference, additional references may be created with av_buffer_ref(). + * Use av_buffer_unref() to free a reference (this will automatically free the + * data once all the references are freed). + * + * The convention throughout this API and the rest of FFmpeg is such that the + * buffer is considered writable if there exists only one reference to it (and + * it has not been marked as read-only). The av_buffer_is_writable() function is + * provided to check whether this is true and av_buffer_make_writable() will + * automatically create a new writable buffer when necessary. + * Of course nothing prevents the calling code from violating this convention, + * however that is safe only when all the existing references are under its + * control. + * + * @note Referencing and unreferencing the buffers is thread-safe and thus + * may be done from multiple threads simultaneously without any need for + * additional locking. + * + * @note Two different references to the same buffer can point to different + * parts of the buffer (i.e. their AVBufferRef.data will not be equal). + */ + +/** + * A reference counted buffer type. It is opaque and is meant to be used through + * references (AVBufferRef). + */ +typedef struct AVBuffer AVBuffer; + +/** + * A reference to a data buffer. + * + * The size of this struct is not a part of the public ABI and it is not meant + * to be allocated directly. + */ +typedef struct AVBufferRef { + AVBuffer *buffer; + + /** + * The data buffer. It is considered writable if and only if + * this is the only reference to the buffer, in which case + * av_buffer_is_writable() returns 1. + */ + uint8_t *data; + /** + * Size of data in bytes. + */ + int size; +} AVBufferRef; + +/** + * Allocate an AVBuffer of the given size using av_malloc(). + * + * @return an AVBufferRef of given size or NULL when out of memory + */ +AVBufferRef *av_buffer_alloc(int size); + +/** + * Same as av_buffer_alloc(), except the returned buffer will be initialized + * to zero. + */ +AVBufferRef *av_buffer_allocz(int size); + +/** + * Always treat the buffer as read-only, even when it has only one + * reference. + */ +#define AV_BUFFER_FLAG_READONLY (1 << 0) + +/** + * Create an AVBuffer from an existing array. + * + * If this function is successful, data is owned by the AVBuffer. The caller may + * only access data through the returned AVBufferRef and references derived from + * it. + * If this function fails, data is left untouched. + * @param data data array + * @param size size of data in bytes + * @param free a callback for freeing this buffer's data + * @param opaque parameter to be got for processing or passed to free + * @param flags a combination of AV_BUFFER_FLAG_* + * + * @return an AVBufferRef referring to data on success, NULL on failure. + */ +AVBufferRef *av_buffer_create(uint8_t *data, int size, + void (*free)(void *opaque, uint8_t *data), + void *opaque, int flags); + +/** + * Default free callback, which calls av_free() on the buffer data. + * This function is meant to be passed to av_buffer_create(), not called + * directly. + */ +void av_buffer_default_free(void *opaque, uint8_t *data); + +/** + * Create a new reference to an AVBuffer. + * + * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on + * failure. + */ +AVBufferRef *av_buffer_ref(AVBufferRef *buf); + +/** + * Free a given reference and automatically free the buffer if there are no more + * references to it. + * + * @param buf the reference to be freed. The pointer is set to NULL on return. + */ +void av_buffer_unref(AVBufferRef **buf); + +/** + * @return 1 if the caller may write to the data referred to by buf (which is + * true if and only if buf is the only reference to the underlying AVBuffer). + * Return 0 otherwise. + * A positive answer is valid until av_buffer_ref() is called on buf. + */ +int av_buffer_is_writable(const AVBufferRef *buf); + +/** + * @return the opaque parameter set by av_buffer_create. + */ +void *av_buffer_get_opaque(const AVBufferRef *buf); + +int av_buffer_get_ref_count(const AVBufferRef *buf); + +/** + * Create a writable reference from a given buffer reference, avoiding data copy + * if possible. + * + * @param buf buffer reference to make writable. On success, buf is either left + * untouched, or it is unreferenced and a new writable AVBufferRef is + * written in its place. On failure, buf is left untouched. + * @return 0 on success, a negative AVERROR on failure. + */ +int av_buffer_make_writable(AVBufferRef **buf); + +/** + * Reallocate a given buffer. + * + * @param buf a buffer reference to reallocate. On success, buf will be + * unreferenced and a new reference with the required size will be + * written in its place. On failure buf will be left untouched. *buf + * may be NULL, then a new buffer is allocated. + * @param size required new buffer size. + * @return 0 on success, a negative AVERROR on failure. + * + * @note the buffer is actually reallocated with av_realloc() only if it was + * initially allocated through av_buffer_realloc(NULL) and there is only one + * reference to it (i.e. the one passed to this function). In all other cases + * a new buffer is allocated and the data is copied. + */ +int av_buffer_realloc(AVBufferRef **buf, int size); + +/** + * @} + */ + +/** + * @defgroup lavu_bufferpool AVBufferPool + * @ingroup lavu_data + * + * @{ + * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. + * + * Frequently allocating and freeing large buffers may be slow. AVBufferPool is + * meant to solve this in cases when the caller needs a set of buffers of the + * same size (the most obvious use case being buffers for raw video or audio + * frames). + * + * At the beginning, the user must call av_buffer_pool_init() to create the + * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to + * get a reference to a new buffer, similar to av_buffer_alloc(). This new + * reference works in all aspects the same way as the one created by + * av_buffer_alloc(). However, when the last reference to this buffer is + * unreferenced, it is returned to the pool instead of being freed and will be + * reused for subsequent av_buffer_pool_get() calls. + * + * When the caller is done with the pool and no longer needs to allocate any new + * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. + * Once all the buffers are released, it will automatically be freed. + * + * Allocating and releasing buffers with this API is thread-safe as long as + * either the default alloc callback is used, or the user-supplied one is + * thread-safe. + */ + +/** + * The buffer pool. This structure is opaque and not meant to be accessed + * directly. It is allocated with av_buffer_pool_init() and freed with + * av_buffer_pool_uninit(). + */ +typedef struct AVBufferPool AVBufferPool; + +/** + * Allocate and initialize a buffer pool. + * + * @param size size of each buffer in this pool + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. May be NULL, then the default allocator will be used + * (av_buffer_alloc()). + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); + +/** + * Allocate and initialize a buffer pool with a more complex allocator. + * + * @param size size of each buffer in this pool + * @param opaque arbitrary user data used by the allocator + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. + * @param pool_free a function that will be called immediately before the pool + * is freed. I.e. after av_buffer_pool_uninit() is called + * by the caller and all the frames are returned to the pool + * and freed. It is intended to uninitialize the user opaque + * data. + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init2(int size, void *opaque, + AVBufferRef* (*alloc)(void *opaque, int size), + void (*pool_free)(void *opaque)); + +/** + * Mark the pool as being available for freeing. It will actually be freed only + * once all the allocated buffers associated with the pool are released. Thus it + * is safe to call this function while some of the allocated buffers are still + * in use. + * + * @param pool pointer to the pool to be freed. It will be set to NULL. + */ +void av_buffer_pool_uninit(AVBufferPool **pool); + +/** + * Allocate a new AVBuffer, reusing an old buffer from the pool when available. + * This function may be called simultaneously from multiple threads. + * + * @return a reference to the new buffer on success, NULL on error. + */ +AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); + +/** + * @} + */ + +#endif /* AVUTIL_BUFFER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/camellia.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/camellia.h new file mode 100644 index 0000000..e674c9b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/camellia.h @@ -0,0 +1,70 @@ +/* + * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAMELLIA_H +#define AVUTIL_CAMELLIA_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAMELLIA algorithm + * @defgroup lavu_camellia CAMELLIA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_camellia_size; + +struct AVCAMELLIA; + +/** + * Allocate an AVCAMELLIA context + * To free the struct: av_free(ptr) + */ +struct AVCAMELLIA *av_camellia_alloc(void); + +/** + * Initialize an AVCAMELLIA context. + * + * @param ctx an AVCAMELLIA context + * @param key a key of 16, 24, 32 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 128, 192, 256 + */ +int av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAMELLIA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_CAMELLIA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cast5.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cast5.h new file mode 100644 index 0000000..ad5b347 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cast5.h @@ -0,0 +1,80 @@ +/* + * An implementation of the CAST128 algorithm as mentioned in RFC2144 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAST5_H +#define AVUTIL_CAST5_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAST5 algorithm + * @defgroup lavu_cast5 CAST5 + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_cast5_size; + +struct AVCAST5; + +/** + * Allocate an AVCAST5 context + * To free the struct: av_free(ptr) + */ +struct AVCAST5 *av_cast5_alloc(void); +/** + * Initialize an AVCAST5 context. + * + * @param ctx an AVCAST5 context + * @param key a key of 5,6,...16 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 40,48,...,128 + * @return 0 on success, less than 0 on failure + */ +int av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * @} + */ +#endif /* AVUTIL_CAST5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/channel_layout.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/channel_layout.h new file mode 100644 index 0000000..50bb8f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/channel_layout.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2006 Michael Niedermayer + * Copyright (c) 2008 Peter Ross + * + * 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 + */ + +#ifndef AVUTIL_CHANNEL_LAYOUT_H +#define AVUTIL_CHANNEL_LAYOUT_H + +#include + +/** + * @file + * audio channel layout utility functions + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup channel_masks Audio channel masks + * + * A channel layout is a 64-bits integer with a bit set for every channel. + * The number of bits set must be equal to the number of channels. + * The value 0 means that the channel layout is not known. + * @note this data structure is not powerful enough to handle channels + * combinations that have the same channel multiple times, such as + * dual-mono. + * + * @{ + */ +#define AV_CH_FRONT_LEFT 0x00000001 +#define AV_CH_FRONT_RIGHT 0x00000002 +#define AV_CH_FRONT_CENTER 0x00000004 +#define AV_CH_LOW_FREQUENCY 0x00000008 +#define AV_CH_BACK_LEFT 0x00000010 +#define AV_CH_BACK_RIGHT 0x00000020 +#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 +#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 +#define AV_CH_BACK_CENTER 0x00000100 +#define AV_CH_SIDE_LEFT 0x00000200 +#define AV_CH_SIDE_RIGHT 0x00000400 +#define AV_CH_TOP_CENTER 0x00000800 +#define AV_CH_TOP_FRONT_LEFT 0x00001000 +#define AV_CH_TOP_FRONT_CENTER 0x00002000 +#define AV_CH_TOP_FRONT_RIGHT 0x00004000 +#define AV_CH_TOP_BACK_LEFT 0x00008000 +#define AV_CH_TOP_BACK_CENTER 0x00010000 +#define AV_CH_TOP_BACK_RIGHT 0x00020000 +#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. +#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. +#define AV_CH_WIDE_LEFT 0x0000000080000000ULL +#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL +#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL +#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL +#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL + +/** Channel mask value used for AVCodecContext.request_channel_layout + to indicate that the user requests the channel order of the decoder output + to be the native codec channel order. */ +#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL + +/** + * @} + * @defgroup channel_mask_c Audio channel layouts + * @{ + * */ +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) +#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) + +enum AVMatrixEncoding { + AV_MATRIX_ENCODING_NONE, + AV_MATRIX_ENCODING_DOLBY, + AV_MATRIX_ENCODING_DPLII, + AV_MATRIX_ENCODING_DPLIIX, + AV_MATRIX_ENCODING_DPLIIZ, + AV_MATRIX_ENCODING_DOLBYEX, + AV_MATRIX_ENCODING_DOLBYHEADPHONE, + AV_MATRIX_ENCODING_NB +}; + +/** + * Return a channel layout id that matches name, or 0 if no match is found. + * + * name can be one or several of the following notations, + * separated by '+' or '|': + * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, + * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); + * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, + * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); + * - a number of channels, in decimal, followed by 'c', yielding + * the default channel layout for that number of channels (@see + * av_get_default_channel_layout); + * - a channel layout mask, in hexadecimal starting with "0x" (see the + * AV_CH_* macros). + * + * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" + */ +uint64_t av_get_channel_layout(const char *name); + +/** + * Return a channel layout and the number of channels based on the specified name. + * + * This function is similar to (@see av_get_channel_layout), but can also parse + * unknown channel layout specifications. + * + * @param[in] name channel layout specification string + * @param[out] channel_layout parsed channel layout (0 if unknown) + * @param[out] nb_channels number of channels + * + * @return 0 on success, AVERROR(EINVAL) if the parsing fails. + */ +int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels); + +/** + * Return a description of a channel layout. + * If nb_channels is <= 0, it is guessed from the channel_layout. + * + * @param buf put here the string containing the channel layout + * @param buf_size size in bytes of the buffer + */ +void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); + +struct AVBPrint; +/** + * Append a description of a channel layout to a bprint buffer. + */ +void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); + +/** + * Return the number of channels in the channel layout. + */ +int av_get_channel_layout_nb_channels(uint64_t channel_layout); + +/** + * Return default channel layout for a given number of channels. + */ +int64_t av_get_default_channel_layout(int nb_channels); + +/** + * Get the index of a channel in channel_layout. + * + * @param channel a channel layout describing exactly one channel which must be + * present in channel_layout. + * + * @return index of channel in channel_layout on success, a negative AVERROR + * on error. + */ +int av_get_channel_layout_channel_index(uint64_t channel_layout, + uint64_t channel); + +/** + * Get the channel with the given index in channel_layout. + */ +uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index); + +/** + * Get the name of a given channel. + * + * @return channel name on success, NULL on error. + */ +const char *av_get_channel_name(uint64_t channel); + +/** + * Get the description of a given channel. + * + * @param channel a channel layout with a single channel + * @return channel description on success, NULL on error + */ +const char *av_get_channel_description(uint64_t channel); + +/** + * Get the value and name of a standard channel layout. + * + * @param[in] index index in an internal list, starting at 0 + * @param[out] layout channel layout mask + * @param[out] name name of the layout + * @return 0 if the layout exists, + * <0 if index is beyond the limits + */ +int av_get_standard_channel_layout(unsigned index, uint64_t *layout, + const char **name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_CHANNEL_LAYOUT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/common.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/common.h new file mode 100644 index 0000000..8db0291 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/common.h @@ -0,0 +1,560 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * common internal and external API header + */ + +#ifndef AVUTIL_COMMON_H +#define AVUTIL_COMMON_H + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) +#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "attributes.h" +#include "macros.h" +#include "version.h" +#include "libavutil/avconfig.h" + +#if AV_HAVE_BIGENDIAN +# define AV_NE(be, le) (be) +#else +# define AV_NE(be, le) (le) +#endif + +//rounded division & shift +#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) +/* assume b>0 */ +#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) +/* Fast a/(1<=0 and b>=0 */ +#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ + : ((a) + (1<<(b)) - 1) >> (b)) +/* Backwards compat. */ +#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT + +#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) +#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) + +/** + * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they + * are not representable as absolute values of their type. This is the same + * as with *abs() + * @see FFNABS() + */ +#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) +#define FFSIGN(a) ((a) > 0 ? 1 : -1) + +/** + * Negative Absolute value. + * this works for all integers of all types. + * As with many macros, this evaluates its argument twice, it thus must not have + * a sideeffect, that is FFNABS(x++) has undefined behavior. + */ +#define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) + +/** + * Comparator. + * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 + * if x == y. This is useful for instance in a qsort comparator callback. + * Furthermore, compilers are able to optimize this to branchless code, and + * there is no risk of overflow with signed types. + * As with many macros, this evaluates its argument multiple times, it thus + * must not have a side-effect. + */ +#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) + +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) + +#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) + +/* misc math functions */ + +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +# include "intmath.h" +#endif + +/* Pull in unguarded fallback defines at the end of this file. */ +#include "common.h" + +#ifndef av_log2 +av_const int av_log2(unsigned v); +#endif + +#ifndef av_log2_16bit +av_const int av_log2_16bit(unsigned v); +#endif + +/** + * Clip a signed integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int av_clip_c(int a, int amin, int amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed 64bit integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed integer value into the 0-255 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint8_t av_clip_uint8_c(int a) +{ + if (a&(~0xFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -128,127 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int8_t av_clip_int8_c(int a) +{ + if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; + else return a; +} + +/** + * Clip a signed integer value into the 0-65535 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint16_t av_clip_uint16_c(int a) +{ + if (a&(~0xFFFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -32768,32767 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int16_t av_clip_int16_c(int a) +{ + if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; + else return a; +} + +/** + * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) +{ + if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); + else return (int32_t)a; +} + +/** + * Clip a signed integer into the -(2^p),(2^p-1) range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const int av_clip_intp2_c(int a, int p) +{ + if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) + return (a >> 31) ^ ((1 << p) - 1); + else + return a; +} + +/** + * Clip a signed integer to an unsigned power of two range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) +{ + if (a & ~((1<> 31 & ((1<= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a double value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** Compute ceil(log2(x)). + * @param x value used to compute ceil(log2(x)) + * @return computed ceiling of log2(x) + */ +static av_always_inline av_const int av_ceil_log2_c(int x) +{ + return av_log2((x - 1) << 1); +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount_c(uint32_t x) +{ + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount64_c(uint64_t x) +{ + return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); +} + +static av_always_inline av_const int av_parity_c(uint32_t v) +{ + return av_popcount(v) & 1; +} + +#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) +#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) + +/** + * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_BYTE Expression reading one byte from the input. + * Evaluated up to 7 times (4 for the currently + * assigned Unicode range). With a memory buffer + * input, this could be *ptr++. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + * + * @warning ERROR should not contain a loop control statement which + * could interact with the internal while loop, and should force an + * exit from the macro code (e.g. through a goto or a return) in order + * to prevent undefined results. + */ +#define GET_UTF8(val, GET_BYTE, ERROR)\ + val= (GET_BYTE);\ + {\ + uint32_t top = (val & 128) >> 1;\ + if ((val & 0xc0) == 0x80 || val >= 0xFE)\ + ERROR\ + while (val & top) {\ + int tmp= (GET_BYTE) - 128;\ + if(tmp>>6)\ + ERROR\ + val= (val<<6) + tmp;\ + top <<= 5;\ + }\ + val &= (top << 1) - 1;\ + } + +/** + * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_16BIT Expression returning two bytes of UTF-16 data converted + * to native byte order. Evaluated one or two times. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF16(val, GET_16BIT, ERROR)\ + val = GET_16BIT;\ + {\ + unsigned int hi = val - 0xD800;\ + if (hi < 0x800) {\ + val = GET_16BIT - 0xDC00;\ + if (val > 0x3FFU || hi > 0x3FFU)\ + ERROR\ + val += (hi<<10) + 0x10000;\ + }\ + }\ + +/** + * @def PUT_UTF8(val, tmp, PUT_BYTE) + * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint8_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_BYTE. + * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. + * It could be a function or a statement, and uses tmp as the input byte. + * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be + * executed up to 4 times for values in the valid UTF-8 range and up to + * 7 times in the general case, depending on the length of the converted + * Unicode character. + */ +#define PUT_UTF8(val, tmp, PUT_BYTE)\ + {\ + int bytes, shift;\ + uint32_t in = val;\ + if (in < 0x80) {\ + tmp = in;\ + PUT_BYTE\ + } else {\ + bytes = (av_log2(in) + 4) / 5;\ + shift = (bytes - 1) * 6;\ + tmp = (256 - (256 >> bytes)) | (in >> shift);\ + PUT_BYTE\ + while (shift >= 6) {\ + shift -= 6;\ + tmp = 0x80 | ((in >> shift) & 0x3f);\ + PUT_BYTE\ + }\ + }\ + } + +/** + * @def PUT_UTF16(val, tmp, PUT_16BIT) + * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint16_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_16BIT. + * @param PUT_16BIT writes the converted UTF-16 data to any proper destination + * in desired endianness. It could be a function or a statement, and uses tmp + * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" + * PUT_BYTE will be executed 1 or 2 times depending on input character. + */ +#define PUT_UTF16(val, tmp, PUT_16BIT)\ + {\ + uint32_t in = val;\ + if (in < 0x10000) {\ + tmp = in;\ + PUT_16BIT\ + } else {\ + tmp = 0xD800 | ((in - 0x10000) >> 10);\ + PUT_16BIT\ + tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ + PUT_16BIT\ + }\ + }\ + + + +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ + +#endif /* AVUTIL_COMMON_H */ + +/* + * The following definitions are outside the multiple inclusion guard + * to ensure they are immediately available in intmath.h. + */ + +#ifndef av_ceil_log2 +# define av_ceil_log2 av_ceil_log2_c +#endif +#ifndef av_clip +# define av_clip av_clip_c +#endif +#ifndef av_clip64 +# define av_clip64 av_clip64_c +#endif +#ifndef av_clip_uint8 +# define av_clip_uint8 av_clip_uint8_c +#endif +#ifndef av_clip_int8 +# define av_clip_int8 av_clip_int8_c +#endif +#ifndef av_clip_uint16 +# define av_clip_uint16 av_clip_uint16_c +#endif +#ifndef av_clip_int16 +# define av_clip_int16 av_clip_int16_c +#endif +#ifndef av_clipl_int32 +# define av_clipl_int32 av_clipl_int32_c +#endif +#ifndef av_clip_intp2 +# define av_clip_intp2 av_clip_intp2_c +#endif +#ifndef av_clip_uintp2 +# define av_clip_uintp2 av_clip_uintp2_c +#endif +#ifndef av_mod_uintp2 +# define av_mod_uintp2 av_mod_uintp2_c +#endif +#ifndef av_sat_add32 +# define av_sat_add32 av_sat_add32_c +#endif +#ifndef av_sat_dadd32 +# define av_sat_dadd32 av_sat_dadd32_c +#endif +#ifndef av_sat_sub32 +# define av_sat_sub32 av_sat_sub32_c +#endif +#ifndef av_sat_dsub32 +# define av_sat_dsub32 av_sat_dsub32_c +#endif +#ifndef av_clipf +# define av_clipf av_clipf_c +#endif +#ifndef av_clipd +# define av_clipd av_clipd_c +#endif +#ifndef av_popcount +# define av_popcount av_popcount_c +#endif +#ifndef av_popcount64 +# define av_popcount64 av_popcount64_c +#endif +#ifndef av_parity +# define av_parity av_parity_c +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cpu.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cpu.h new file mode 100644 index 0000000..8bb9eb6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/cpu.h @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2000, 2001, 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 + */ + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#include + +#include "attributes.h" + +#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX +#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions +#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster +#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower +#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions +#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer) +#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions +#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions +#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction +#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions +#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 +#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 +#define AV_CPU_FLAG_AVX512 0x100000 ///< AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used + +#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard +#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 +#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07 + +#define AV_CPU_FLAG_ARMV5TE (1 << 0) +#define AV_CPU_FLAG_ARMV6 (1 << 1) +#define AV_CPU_FLAG_ARMV6T2 (1 << 2) +#define AV_CPU_FLAG_VFP (1 << 3) +#define AV_CPU_FLAG_VFPV3 (1 << 4) +#define AV_CPU_FLAG_NEON (1 << 5) +#define AV_CPU_FLAG_ARMV8 (1 << 6) +#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations +#define AV_CPU_FLAG_SETEND (1 <<16) + +/** + * Return the flags which specify extensions supported by the CPU. + * The returned value is affected by av_force_cpu_flags() if that was used + * before. So av_get_cpu_flags() can easily be used in an application to + * detect the enabled cpu flags. + */ +int av_get_cpu_flags(void); + +/** + * Disables cpu detection and forces the specified flags. + * -1 is a special case that disables forcing of specific flags. + */ +void av_force_cpu_flags(int flags); + +/** + * Set a mask on flags returned by av_get_cpu_flags(). + * This function is mainly useful for testing. + * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible + */ +attribute_deprecated void av_set_cpu_flags_mask(int mask); + +/** + * Parse CPU flags from a string. + * + * The returned flags contain the specified flags as well as related unspecified flags. + * + * This function exists only for compatibility with libav. + * Please use av_parse_cpu_caps() when possible. + * @return a combination of AV_CPU_* flags, negative on error. + */ +attribute_deprecated +int av_parse_cpu_flags(const char *s); + +/** + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. + * + * @return negative on error. + */ +int av_parse_cpu_caps(unsigned *flags, const char *s); + +/** + * @return the number of logical CPU cores present. + */ +int av_cpu_count(void); + +/** + * Get the maximum data alignment that may be required by FFmpeg. + * + * Note that this is affected by the build configuration and the CPU flags mask, + * so e.g. if the CPU supports AVX, but libavutil has been built with + * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through + * av_set_cpu_flags_mask(), then this function will behave as if AVX is not + * present. + */ +size_t av_cpu_max_align(void); + +#endif /* AVUTIL_CPU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/crc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/crc.h new file mode 100644 index 0000000..47e22b4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/crc.h @@ -0,0 +1,100 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_crc32 + * Public header for CRC hash function implementation. + */ + +#ifndef AVUTIL_CRC_H +#define AVUTIL_CRC_H + +#include +#include +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_crc32 CRC + * @ingroup lavu_hash + * CRC (Cyclic Redundancy Check) hash function implementation. + * + * This module supports numerous CRC polynomials, in addition to the most + * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available + * polynomials. + * + * @{ + */ + +typedef uint32_t AVCRC; + +typedef enum { + AV_CRC_8_ATM, + AV_CRC_16_ANSI, + AV_CRC_16_CCITT, + AV_CRC_32_IEEE, + AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ + AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ + AV_CRC_24_IEEE, + AV_CRC_8_EBU, + AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ +}AVCRCId; + +/** + * Initialize a CRC table. + * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 + * @param le If 1, the lowest bit represents the coefficient for the highest + * exponent of the corresponding polynomial (both for poly and + * actual CRC). + * If 0, you must swap the CRC parameter and the result of av_crc + * if you need the standard representation (can be simplified in + * most cases to e.g. bswap16): + * av_bswap32(crc << (32-bits)) + * @param bits number of bits for the CRC + * @param poly generator polynomial without the x**bits coefficient, in the + * representation as specified by le + * @param ctx_size size of ctx in bytes + * @return <0 on failure + */ +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); + +/** + * Get an initialized standard CRC table. + * @param crc_id ID of a standard CRC + * @return a pointer to the CRC table or NULL on failure + */ +const AVCRC *av_crc_get_table(AVCRCId crc_id); + +/** + * Calculate the CRC of a block. + * @param crc CRC of previous blocks if any or initial value for CRC + * @return CRC updated with the data from the given block + * + * @see av_crc_init() "le" parameter + */ +uint32_t av_crc(const AVCRC *ctx, uint32_t crc, + const uint8_t *buffer, size_t length) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_CRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/des.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/des.h new file mode 100644 index 0000000..4cf11f5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/des.h @@ -0,0 +1,77 @@ +/* + * DES encryption/decryption + * Copyright (c) 2007 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_DES_H +#define AVUTIL_DES_H + +#include + +/** + * @defgroup lavu_des DES + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVDES { + uint64_t round_keys[3][16]; + int triple_des; +} AVDES; + +/** + * Allocate an AVDES context. + */ +AVDES *av_des_alloc(void); + +/** + * @brief Initializes an AVDES context. + * + * @param key_bits must be 64 or 192 + * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption + * @return zero on success, negative value otherwise + */ +int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + * @param iv initialization vector for CBC mode, if NULL then ECB will be used, + * must be 8-byte aligned + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @brief Calculates CBC-MAC using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + */ +void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); + +/** + * @} + */ + +#endif /* AVUTIL_DES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/dict.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/dict.h new file mode 100644 index 0000000..118f1f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/dict.h @@ -0,0 +1,200 @@ +/* + * 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 + * Public dictionary API. + * @deprecated + * AVDictionary is provided for compatibility with libav. It is both in + * implementation as well as API inefficient. It does not scale and is + * extremely slow with large dictionaries. + * It is recommended that new code uses our tree container from tree.c/h + * where applicable, which uses AVL trees to achieve O(log n) performance. + */ + +#ifndef AVUTIL_DICT_H +#define AVUTIL_DICT_H + +#include + +#include "version.h" + +/** + * @addtogroup lavu_dict AVDictionary + * @ingroup lavu_data + * + * @brief Simple key:value store + * + * @{ + * Dictionaries are used for storing key:value pairs. To create + * an AVDictionary, simply pass an address of a NULL pointer to + * av_dict_set(). NULL can be used as an empty dictionary wherever + * a pointer to an AVDictionary is required. + * Use av_dict_get() to retrieve an entry or iterate over all + * entries and finally av_dict_free() to free the dictionary + * and all its contents. + * + @code + AVDictionary *d = NULL; // "create" an empty dictionary + AVDictionaryEntry *t = NULL; + + av_dict_set(&d, "foo", "bar", 0); // add an entry + + char *k = av_strdup("key"); // if your strings are already allocated, + char *v = av_strdup("value"); // you can avoid copying them like this + av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); + + while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { + <....> // iterate over all entries in d + } + av_dict_free(&d); + @endcode + */ + +#define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */ +#define AV_DICT_IGNORE_SUFFIX 2 /**< Return first entry in a dictionary whose first part corresponds to the search key, + ignoring the suffix of the found key string. Only relevant in av_dict_get(). */ +#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries. +#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no + delimiter is added, the strings are simply concatenated. */ +#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ + +typedef struct AVDictionaryEntry { + char *key; + char *value; +} AVDictionaryEntry; + +typedef struct AVDictionary AVDictionary; + +/** + * Get a dictionary entry with matching key. + * + * The returned entry key or value must not be changed, or it will + * cause undefined behavior. + * + * To iterate through all the dictionary entries, you can set the matching key + * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. + * + * @param prev Set to the previous matching element to find the next. + * If set to NULL the first matching element is returned. + * @param key matching key + * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved + * @return found entry or NULL in case no matching entry was found in the dictionary + */ +AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, + const AVDictionaryEntry *prev, int flags); + +/** + * Get number of entries in dictionary. + * + * @param m dictionary + * @return number of entries in dictionary + */ +int av_dict_count(const AVDictionary *m); + +/** + * Set the given entry in *pm, overwriting an existing entry. + * + * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, + * these arguments will be freed on error. + * + * Warning: Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get. + * + * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL + * a dictionary struct is allocated and put in *pm. + * @param key entry key to add to *pm (will either be av_strduped or added as a new key depending on flags) + * @param value entry value to add to *pm (will be av_strduped or added as a new key depending on flags). + * Passing a NULL value will cause an existing entry to be deleted. + * @return >= 0 on success otherwise an error code <0 + */ +int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); + +/** + * Convenience wrapper for av_dict_set that converts the value to a string + * and stores it. + * + * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. + */ +int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); + +/** + * Parse the key/value pairs list and add the parsed entries to a dictionary. + * + * In case of failure, all the successfully set entries are stored in + * *pm. You may need to manually free the created dictionary. + * + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @param flags flags to use when adding to dictionary. + * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL + * are ignored since the key/value tokens will always + * be duplicated. + * @return 0 on success, negative AVERROR code on failure + */ +int av_dict_parse_string(AVDictionary **pm, const char *str, + const char *key_val_sep, const char *pairs_sep, + int flags); + +/** + * Copy entries from one AVDictionary struct into another. + * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, + * this function will allocate a struct for you and put it in *dst + * @param src pointer to source AVDictionary struct + * @param flags flags to use when setting entries in *dst + * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag + * @return 0 on success, negative AVERROR code on failure. If dst was allocated + * by this function, callers should free the associated memory. + */ +int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); + +/** + * Free all the memory allocated for an AVDictionary struct + * and all keys and values. + */ +void av_dict_free(AVDictionary **m); + +/** + * Get dictionary entries as a string. + * + * Create a string containing dictionary's entries. + * Such string may be passed back to av_dict_parse_string(). + * @note String is escaped with backslashes ('\'). + * + * @param[in] m dictionary + * @param[out] buffer Pointer to buffer that will be allocated with string containg entries. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_dict_get_string(const AVDictionary *m, char **buffer, + const char key_val_sep, const char pairs_sep); + +/** + * @} + */ + +#endif /* AVUTIL_DICT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/display.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/display.h new file mode 100644 index 0000000..515adad --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/display.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2014 Vittorio Giovara + * + * 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 + * Display matrix + */ + +#ifndef AVUTIL_DISPLAY_H +#define AVUTIL_DISPLAY_H + +#include +#include "common.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_display Display transformation matrix functions + * @{ + */ + +/** + * @addtogroup lavu_video_display + * The display transformation matrix specifies an affine transformation that + * should be applied to video frames for correct presentation. It is compatible + * with the matrices stored in the ISO/IEC 14496-12 container format. + * + * The data is a 3x3 matrix represented as a 9-element array: + * + * @code{.unparsed} + * | a b u | + * (a, b, u, c, d, v, x, y, w) -> | c d v | + * | x y w | + * @endcode + * + * All numbers are stored in native endianness, as 16.16 fixed-point values, + * except for u, v and w, which are stored as 2.30 fixed-point values. + * + * The transformation maps a point (p, q) in the source (pre-transformation) + * frame to the point (p', q') in the destination (post-transformation) frame as + * follows: + * + * @code{.unparsed} + * | a b u | + * (p, q, 1) . | c d v | = z * (p', q', 1) + * | x y w | + * @endcode + * + * The transformation can also be more explicitly written in components as + * follows: + * + * @code{.unparsed} + * p' = (a * p + c * q + x) / z; + * q' = (b * p + d * q + y) / z; + * z = u * p + v * q + w + * @endcode + */ + +/** + * Extract the rotation component of the transformation matrix. + * + * @param matrix the transformation matrix + * @return the angle (in degrees) by which the transformation rotates the frame + * counterclockwise. The angle will be in range [-180.0, 180.0], + * or NaN if the matrix is singular. + * + * @note floating point numbers are inherently inexact, so callers are + * recommended to round the return value to nearest integer before use. + */ +double av_display_rotation_get(const int32_t matrix[9]); + +/** + * Initialize a transformation matrix describing a pure counterclockwise + * rotation by the specified angle (in degrees). + * + * @param matrix an allocated transformation matrix (will be fully overwritten + * by this function) + * @param angle rotation angle in degrees. + */ +void av_display_rotation_set(int32_t matrix[9], double angle); + +/** + * Flip the input matrix horizontally and/or vertically. + * + * @param matrix an allocated transformation matrix + * @param hflip whether the matrix should be flipped horizontally + * @param vflip whether the matrix should be flipped vertically + */ +void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_DISPLAY_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/downmix_info.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/downmix_info.h new file mode 100644 index 0000000..221cf5b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/downmix_info.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2014 Tim Walker + * + * 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 + */ + +#ifndef AVUTIL_DOWNMIX_INFO_H +#define AVUTIL_DOWNMIX_INFO_H + +#include "frame.h" + +/** + * @file + * audio downmix medatata + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup downmix_info Audio downmix metadata + * @{ + */ + +/** + * Possible downmix types. + */ +enum AVDownmixType { + AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */ + AV_DOWNMIX_TYPE_LORO, /**< Lo/Ro 2-channel downmix (Stereo). */ + AV_DOWNMIX_TYPE_LTRT, /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */ + AV_DOWNMIX_TYPE_DPLII, /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */ + AV_DOWNMIX_TYPE_NB /**< Number of downmix types. Not part of ABI. */ +}; + +/** + * This structure describes optional metadata relevant to a downmix procedure. + * + * All fields are set by the decoder to the value indicated in the audio + * bitstream (if present), or to a "sane" default otherwise. + */ +typedef struct AVDownmixInfo { + /** + * Type of downmix preferred by the mastering engineer. + */ + enum AVDownmixType preferred_downmix_type; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during a regular downmix. + */ + double center_mix_level; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during an Lt/Rt compatible downmix. + */ + double center_mix_level_ltrt; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during a regular downmix. + */ + double surround_mix_level; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during an Lt/Rt compatible downmix. + */ + double surround_mix_level_ltrt; + + /** + * Absolute scale factor representing the level at which the LFE data is + * mixed into L/R channels during downmixing. + */ + double lfe_mix_level; +} AVDownmixInfo; + +/** + * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing. + * + * If the side data is absent, it is created and added to the frame. + * + * @param frame the frame for which the side data is to be obtained or created + * + * @return the AVDownmixInfo structure to be edited by the caller, or NULL if + * the structure cannot be allocated. + */ +AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame); + +/** + * @} + */ + +/** + * @} + */ + +#endif /* AVUTIL_DOWNMIX_INFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/encryption_info.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/encryption_info.h new file mode 100644 index 0000000..8fe7ebf --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/encryption_info.h @@ -0,0 +1,205 @@ +/** + * 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 + */ + +#ifndef AVUTIL_ENCRYPTION_INFO_H +#define AVUTIL_ENCRYPTION_INFO_H + +#include +#include + +typedef struct AVSubsampleEncryptionInfo { + /** The number of bytes that are clear. */ + unsigned int bytes_of_clear_data; + + /** + * The number of bytes that are protected. If using pattern encryption, + * the pattern applies to only the protected bytes; if not using pattern + * encryption, all these bytes are encrypted. + */ + unsigned int bytes_of_protected_data; +} AVSubsampleEncryptionInfo; + +/** + * This describes encryption info for a packet. This contains frame-specific + * info for how to decrypt the packet before passing it to the decoder. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInfo { + /** The fourcc encryption scheme, in big-endian byte order. */ + uint32_t scheme; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are encrypted. + */ + uint32_t crypt_byte_block; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are clear. + */ + uint32_t skip_byte_block; + + /** + * The ID of the key used to encrypt the packet. This should always be + * 16 bytes long, but may be changed in the future. + */ + uint8_t *key_id; + uint32_t key_id_size; + + /** + * The initialization vector. This may have been zero-filled to be the + * correct block size. This should always be 16 bytes long, but may be + * changed in the future. + */ + uint8_t *iv; + uint32_t iv_size; + + /** + * An array of subsample encryption info specifying how parts of the sample + * are encrypted. If there are no subsamples, then the whole sample is + * encrypted. + */ + AVSubsampleEncryptionInfo *subsamples; + uint32_t subsample_count; +} AVEncryptionInfo; + +/** + * This describes info used to initialize an encryption key system. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInitInfo { + /** + * A unique identifier for the key system this is for, can be NULL if it + * is not known. This should always be 16 bytes, but may change in the + * future. + */ + uint8_t* system_id; + uint32_t system_id_size; + + /** + * An array of key IDs this initialization data is for. All IDs are the + * same length. Can be NULL if there are no known key IDs. + */ + uint8_t** key_ids; + /** The number of key IDs. */ + uint32_t num_key_ids; + /** + * The number of bytes in each key ID. This should always be 16, but may + * change in the future. + */ + uint32_t key_id_size; + + /** + * Key-system specific initialization data. This data is copied directly + * from the file and the format depends on the specific key system. This + * can be NULL if there is no initialization data; in that case, there + * will be at least one key ID. + */ + uint8_t* data; + uint32_t data_size; + + /** + * An optional pointer to the next initialization info in the list. + */ + struct AVEncryptionInitInfo *next; +} AVEncryptionInitInfo; + +/** + * Allocates an AVEncryptionInfo structure and sub-pointers to hold the given + * number of subsamples. This will allocate pointers for the key ID, IV, + * and subsample entries, set the size members, and zero-initialize the rest. + * + * @param subsample_count The number of subsamples. + * @param key_id_size The number of bytes in the key ID, should be 16. + * @param iv_size The number of bytes in the IV, should be 16. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size); + +/** + * Allocates an AVEncryptionInfo structure with a copy of the given data. + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_clone(const AVEncryptionInfo *info); + +/** + * Frees the given encryption info object. This MUST NOT be used to free the + * side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_info_free(AVEncryptionInfo *info); + +/** + * Creates a copy of the AVEncryptionInfo that is contained in the given side + * data. The resulting object should be passed to av_encryption_info_free() + * when done. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_get_side_data(const uint8_t *side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * info. The resulting pointer should be either freed using av_free or given + * to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_info_add_side_data( + const AVEncryptionInfo *info, size_t *side_data_size); + + +/** + * Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the + * given sizes. This will allocate pointers and set all the fields. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_alloc( + uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size); + +/** + * Frees the given encryption init info object. This MUST NOT be used to free + * the side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_init_info_free(AVEncryptionInitInfo* info); + +/** + * Creates a copy of the AVEncryptionInitInfo that is contained in the given + * side data. The resulting object should be passed to + * av_encryption_init_info_free() when done. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_get_side_data( + const uint8_t* side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * init info. The resulting pointer should be either freed using av_free or + * given to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_init_info_add_side_data( + const AVEncryptionInitInfo *info, size_t *side_data_size); + +#endif /* AVUTIL_ENCRYPTION_INFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/error.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/error.h new file mode 100644 index 0000000..71df4da --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/error.h @@ -0,0 +1,126 @@ +/* + * 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 + * error code definitions + */ + +#ifndef AVUTIL_ERROR_H +#define AVUTIL_ERROR_H + +#include +#include + +/** + * @addtogroup lavu_error + * + * @{ + */ + + +/* error handling */ +#if EDOM > 0 +#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. +#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. +#else +/* Some platforms have E* and errno already negated. */ +#define AVERROR(e) (e) +#define AVUNERROR(e) (e) +#endif + +#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) + +#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found +#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2 +#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small +#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found +#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found +#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found +#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file +#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted +#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library +#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found +#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input +#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found +#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found +#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome +#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found + +#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< Stream not found +/** + * This is semantically identical to AVERROR_BUG + * it has been introduced in Libav after our AVERROR_BUG and with a modified value. + */ +#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ') +#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library +#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. +#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED) +#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED) +/* HTTP & RTSP errors */ +#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0') +#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1') +#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3') +#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4') +#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X') +#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X') + +#define AV_ERROR_MAX_STRING_SIZE 64 + +/** + * Put a description of the AVERROR code errnum in errbuf. + * In case of failure the global variable errno is set to indicate the + * error. Even in case of failure av_strerror() will print a generic + * error message indicating the errnum provided to errbuf. + * + * @param errnum error code to describe + * @param errbuf buffer to which description is written + * @param errbuf_size the size in bytes of errbuf + * @return 0 on success, a negative value if a description for errnum + * cannot be found + */ +int av_strerror(int errnum, char *errbuf, size_t errbuf_size); + +/** + * Fill the provided buffer with a string containing an error string + * corresponding to the AVERROR code errnum. + * + * @param errbuf a buffer + * @param errbuf_size size in bytes of errbuf + * @param errnum error code to describe + * @return the buffer in input, filled with the error description + * @see av_strerror() + */ +static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) +{ + av_strerror(errnum, errbuf, errbuf_size); + return errbuf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_err2str(errnum) \ + av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) + +/** + * @} + */ + +#endif /* AVUTIL_ERROR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/eval.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/eval.h new file mode 100644 index 0000000..dacd22b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/eval.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002 Michael Niedermayer + * + * 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 + * simple arithmetic expression evaluator + */ + +#ifndef AVUTIL_EVAL_H +#define AVUTIL_EVAL_H + +#include "avutil.h" + +typedef struct AVExpr AVExpr; + +/** + * Parse and evaluate an expression. + * Note, this is significantly slower than av_expr_eval(). + * + * @param res a pointer to a double where is put the result value of + * the expression, or NAN in case of error + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param const_values a zero terminated array of values for the identifiers from const_names + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse_and_eval(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * Parse an expression. + * + * @param expr a pointer where is put an AVExpr containing the parsed + * value in case of successful parsing, or NULL otherwise. + * The pointed to AVExpr must be freed with av_expr_free() by the user + * when it is not needed anymore. + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); + +/** + * Evaluate a previously parsed expression. + * + * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @return the value of the expression + */ +double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); + +/** + * Free a parsed expression previously created with av_expr_parse(). + */ +void av_expr_free(AVExpr *e); + +/** + * Parse the string in numstr and return its value as a double. If + * the string is empty, contains only whitespaces, or does not contain + * an initial substring that has the expected syntax for a + * floating-point number, no conversion is performed. In this case, + * returns a value of zero and the value returned in tail is the value + * of numstr. + * + * @param numstr a string representing a number, may contain one of + * the International System number postfixes, for example 'K', 'M', + * 'G'. If 'i' is appended after the postfix, powers of 2 are used + * instead of powers of 10. The 'B' postfix multiplies the value by + * 8, and can be appended after another postfix or used alone. This + * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. + * @param tail if non-NULL puts here the pointer to the char next + * after the last parsed character + */ +double av_strtod(const char *numstr, char **tail); + +#endif /* AVUTIL_EVAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ffversion.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ffversion.h new file mode 100644 index 0000000..4690884 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ffversion.h @@ -0,0 +1,5 @@ +/* Automatically generated by version.sh, do not manually edit! */ +#ifndef AVUTIL_FFVERSION_H +#define AVUTIL_FFVERSION_H +#define FFMPEG_VERSION "4.2.1" +#endif /* AVUTIL_FFVERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/fifo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/fifo.h new file mode 100644 index 0000000..dc7bc6f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/fifo.h @@ -0,0 +1,179 @@ +/* + * 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 + * a very simple circular buffer FIFO implementation + */ + +#ifndef AVUTIL_FIFO_H +#define AVUTIL_FIFO_H + +#include +#include "avutil.h" +#include "attributes.h" + +typedef struct AVFifoBuffer { + uint8_t *buffer; + uint8_t *rptr, *wptr, *end; + uint32_t rndx, wndx; +} AVFifoBuffer; + +/** + * Initialize an AVFifoBuffer. + * @param size of FIFO + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc(unsigned int size); + +/** + * Initialize an AVFifoBuffer. + * @param nmemb number of elements + * @param size size of the single element + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); + +/** + * Free an AVFifoBuffer. + * @param f AVFifoBuffer to free + */ +void av_fifo_free(AVFifoBuffer *f); + +/** + * Free an AVFifoBuffer and reset pointer to NULL. + * @param f AVFifoBuffer to free + */ +void av_fifo_freep(AVFifoBuffer **f); + +/** + * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. + * @param f AVFifoBuffer to reset + */ +void av_fifo_reset(AVFifoBuffer *f); + +/** + * Return the amount of data in bytes in the AVFifoBuffer, that is the + * amount of data you can read from it. + * @param f AVFifoBuffer to read from + * @return size + */ +int av_fifo_size(const AVFifoBuffer *f); + +/** + * Return the amount of space in bytes in the AVFifoBuffer, that is the + * amount of data you can write into it. + * @param f AVFifoBuffer to write into + * @return size + */ +int av_fifo_space(const AVFifoBuffer *f); + +/** + * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param offset offset from current read position + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from a user-supplied callback to an AVFifoBuffer. + * @param f AVFifoBuffer to write to + * @param src data source; non-const since it may be used as a + * modifiable context by the function defined in func + * @param size number of bytes to write + * @param func generic write function; the first parameter is src, + * the second is dest_buf, the third is dest_buf_size. + * func must return the number of bytes written to dest_buf, or <= 0 to + * indicate no more data available to write. + * If func is NULL, src is interpreted as a simple byte array for source data. + * @return the number of bytes written to the FIFO + */ +int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); + +/** + * Resize an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * + * @param f AVFifoBuffer to resize + * @param size new AVFifoBuffer size in bytes + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); + +/** + * Enlarge an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * The new fifo size may be larger than the requested size. + * + * @param f AVFifoBuffer to resize + * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); + +/** + * Read and discard the specified amount of data from an AVFifoBuffer. + * @param f AVFifoBuffer to read from + * @param size amount of data to read in bytes + */ +void av_fifo_drain(AVFifoBuffer *f, int size); + +/** + * Return a pointer to the data stored in a FIFO buffer at a certain offset. + * The FIFO buffer is not modified. + * + * @param f AVFifoBuffer to peek at, f must be non-NULL + * @param offs an offset in bytes, its absolute value must be less + * than the used buffer size or the returned pointer will + * point outside to the buffer data. + * The used buffer size can be checked with av_fifo_size(). + */ +static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) +{ + uint8_t *ptr = f->rptr + offs; + if (ptr >= f->end) + ptr = f->buffer + (ptr - f->end); + else if (ptr < f->buffer) + ptr = f->end - (f->buffer - ptr); + return ptr; +} + +#endif /* AVUTIL_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/file.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/file.h new file mode 100644 index 0000000..3ef4a60 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/file.h @@ -0,0 +1,71 @@ +/* + * 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 + */ + +#ifndef AVUTIL_FILE_H +#define AVUTIL_FILE_H + +#include + +#include "avutil.h" + +/** + * @file + * Misc file utilities. + */ + +/** + * Read the file with name filename, and put its content in a newly + * allocated buffer or map it with mmap() when available. + * In case of success set *bufptr to the read or mmapped buffer, and + * *size to the size in bytes of the buffer in *bufptr. + * Unlike mmap this function succeeds with zero sized files, in this + * case *bufptr will be set to NULL and *size will be set to 0. + * The returned buffer must be released with av_file_unmap(). + * + * @param log_offset loglevel offset used for logging + * @param log_ctx context used for logging + * @return a non negative number in case of success, a negative value + * corresponding to an AVERROR error code in case of failure + */ +av_warn_unused_result +int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, + int log_offset, void *log_ctx); + +/** + * Unmap or free the buffer bufptr created by av_file_map(). + * + * @param size size in bytes of bufptr, must be the same as returned + * by av_file_map() + */ +void av_file_unmap(uint8_t *bufptr, size_t size); + +/** + * Wrapper to work around the lack of mkstemp() on mingw. + * Also, tries to create file in /tmp first, if possible. + * *prefix can be a character constant; *filename will be allocated internally. + * @return file descriptor of opened file (or negative value corresponding to an + * AVERROR code on error) + * and opened file name in **filename. + * @note On very old libcs it is necessary to set a secure umask before + * calling this, av_tempfile() can't call umask itself as it is used in + * libraries and could interfere with the calling application. + * @deprecated as fd numbers cannot be passed saftely between libs on some platforms + */ +int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); + +#endif /* AVUTIL_FILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/frame.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/frame.h new file mode 100644 index 0000000..5d3231e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/frame.h @@ -0,0 +1,971 @@ +/* + * 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 + * @ingroup lavu_frame + * reference-counted frame API + */ + +#ifndef AVUTIL_FRAME_H +#define AVUTIL_FRAME_H + +#include +#include + +#include "avutil.h" +#include "buffer.h" +#include "dict.h" +#include "rational.h" +#include "samplefmt.h" +#include "pixfmt.h" +#include "version.h" + + +/** + * @defgroup lavu_frame AVFrame + * @ingroup lavu_data + * + * @{ + * AVFrame is an abstraction for reference-counted raw multimedia data. + */ + +enum AVFrameSideDataType { + /** + * The data is the AVPanScan struct defined in libavcodec. + */ + AV_FRAME_DATA_PANSCAN, + /** + * ATSC A53 Part 4 Closed Captions. + * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. + * The number of bytes of CC data is AVFrameSideData.size. + */ + AV_FRAME_DATA_A53_CC, + /** + * Stereoscopic 3d metadata. + * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. + */ + AV_FRAME_DATA_STEREO3D, + /** + * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. + */ + AV_FRAME_DATA_MATRIXENCODING, + /** + * Metadata relevant to a downmix procedure. + * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. + */ + AV_FRAME_DATA_DOWNMIX_INFO, + /** + * ReplayGain information in the form of the AVReplayGain struct. + */ + AV_FRAME_DATA_REPLAYGAIN, + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the frame for correct + * presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_FRAME_DATA_DISPLAYMATRIX, + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_FRAME_DATA_AFD, + /** + * Motion vectors exported by some codecs (on demand through the export_mvs + * flag set in the libavcodec AVCodecContext flags2 option). + * The data is the AVMotionVector struct defined in + * libavutil/motion_vector.h. + */ + AV_FRAME_DATA_MOTION_VECTORS, + /** + * Recommmends skipping the specified number of samples. This is exported + * only if the "skip_manual" AVOption is set in libavcodec. + * This has the same format as AV_PKT_DATA_SKIP_SAMPLES. + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_FRAME_DATA_SKIP_SAMPLES, + /** + * This side data must be associated with an audio frame and corresponds to + * enum AVAudioServiceType defined in avcodec.h. + */ + AV_FRAME_DATA_AUDIO_SERVICE_TYPE, + /** + * Mastering display metadata associated with a video frame. The payload is + * an AVMasteringDisplayMetadata type and contains information about the + * mastering display color volume. + */ + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + /** + * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. + * This is set on the first frame of a GOP that has a temporal reference of 0. + */ + AV_FRAME_DATA_GOP_TIMECODE, + + /** + * The data represents the AVSphericalMapping structure defined in + * libavutil/spherical.h. + */ + AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + + /** + * The data contains an ICC profile as an opaque octet buffer following the + * format described by ISO 15076-1 with an optional name defined in the + * metadata key entry "name". + */ + AV_FRAME_DATA_ICC_PROFILE, + +#if FF_API_FRAME_QP + /** + * Implementation-specific description of the format of AV_FRAME_QP_TABLE_DATA. + * The contents of this side data are undocumented and internal; use + * av_frame_set_qp_table() and av_frame_get_qp_table() to access this in a + * meaningful way instead. + */ + AV_FRAME_DATA_QP_TABLE_PROPERTIES, + + /** + * Raw QP table data. Its format is described by + * AV_FRAME_DATA_QP_TABLE_PROPERTIES. Use av_frame_set_qp_table() and + * av_frame_get_qp_table() to access this instead. + */ + AV_FRAME_DATA_QP_TABLE_DATA, +#endif + + /** + * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t + * where the first uint32_t describes how many (1-3) of the other timecodes are used. + * The timecode format is described in the av_timecode_get_smpte_from_framenum() + * function in libavutil/timecode.c. + */ + AV_FRAME_DATA_S12M_TIMECODE, + + /** + * HDR dynamic metadata associated with a video frame. The payload is + * an AVDynamicHDRPlus type and contains information for color + * volume transform - application 4 of SMPTE 2094-40:2016 standard. + */ + AV_FRAME_DATA_DYNAMIC_HDR_PLUS, + + /** + * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of + * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size. + */ + AV_FRAME_DATA_REGIONS_OF_INTEREST, +}; + +enum AVActiveFormatDescription { + AV_AFD_SAME = 8, + AV_AFD_4_3 = 9, + AV_AFD_16_9 = 10, + AV_AFD_14_9 = 11, + AV_AFD_4_3_SP_14_9 = 13, + AV_AFD_16_9_SP_14_9 = 14, + AV_AFD_SP_4_3 = 15, +}; + + +/** + * Structure to hold side data for an AVFrame. + * + * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + */ +typedef struct AVFrameSideData { + enum AVFrameSideDataType type; + uint8_t *data; + int size; + AVDictionary *metadata; + AVBufferRef *buf; +} AVFrameSideData; + +/** + * Structure describing a single Region Of Interest. + * + * When multiple regions are defined in a single side-data block, they + * should be ordered from most to least important - some encoders are only + * capable of supporting a limited number of distinct regions, so will have + * to truncate the list. + * + * When overlapping regions are defined, the first region containing a given + * area of the frame applies. + */ +typedef struct AVRegionOfInterest { + /** + * Must be set to the size of this data structure (that is, + * sizeof(AVRegionOfInterest)). + */ + uint32_t self_size; + /** + * Distance in pixels from the top edge of the frame to the top and + * bottom edges and from the left edge of the frame to the left and + * right edges of the rectangle defining this region of interest. + * + * The constraints on a region are encoder dependent, so the region + * actually affected may be slightly larger for alignment or other + * reasons. + */ + int top; + int bottom; + int left; + int right; + /** + * Quantisation offset. + * + * Must be in the range -1 to +1. A value of zero indicates no quality + * change. A negative value asks for better quality (less quantisation), + * while a positive value asks for worse quality (greater quantisation). + * + * The range is calibrated so that the extreme values indicate the + * largest possible offset - if the rest of the frame is encoded with the + * worst possible quality, an offset of -1 indicates that this region + * should be encoded with the best possible quality anyway. Intermediate + * values are then interpolated in some codec-dependent way. + * + * For example, in 10-bit H.264 the quantisation parameter varies between + * -12 and 51. A typical qoffset value of -1/10 therefore indicates that + * this region should be encoded with a QP around one-tenth of the full + * range better than the rest of the frame. So, if most of the frame + * were to be encoded with a QP of around 30, this region would get a QP + * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3). + * An extreme value of -1 would indicate that this region should be + * encoded with the best possible quality regardless of the treatment of + * the rest of the frame - that is, should be encoded at a QP of -12. + */ + AVRational qoffset; +} AVRegionOfInterest; + +/** + * This structure describes decoded (raw) audio or video data. + * + * AVFrame must be allocated using av_frame_alloc(). Note that this only + * allocates the AVFrame itself, the buffers for the data must be managed + * through other means (see below). + * AVFrame must be freed with av_frame_free(). + * + * AVFrame is typically allocated once and then reused multiple times to hold + * different data (e.g. a single AVFrame to hold frames received from a + * decoder). In such a case, av_frame_unref() will free any references held by + * the frame and reset it to its original clean state before it + * is reused again. + * + * The data described by an AVFrame is usually reference counted through the + * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / + * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at + * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, + * every single data plane must be contained in one of the buffers in + * AVFrame.buf or AVFrame.extended_buf. + * There may be a single buffer for all the data, or one separate buffer for + * each plane, or anything in between. + * + * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + * + * Fields can be accessed through AVOptions, the name string used, matches the + * C structure field name for fields accessible through AVOptions. The AVClass + * for AVFrame can be obtained from avcodec_get_frame_class() + */ +typedef struct AVFrame { +#define AV_NUM_DATA_POINTERS 8 + /** + * pointer to the picture/channel planes. + * This might be different from the first allocated byte + * + * Some decoders access areas outside 0,0 - width,height, please + * see avcodec_align_dimensions2(). Some filters and swscale can read + * up to 16 bytes beyond the planes, if these filters are to be used, + * then 16 extra bytes must be allocated. + * + * NOTE: Except for hwaccel formats, pointers not needed by the format + * MUST be set to NULL. + */ + uint8_t *data[AV_NUM_DATA_POINTERS]; + + /** + * For video, size in bytes of each picture line. + * For audio, size in bytes of each plane. + * + * For audio, only linesize[0] may be set. For planar audio, each channel + * plane must be the same size. + * + * For video the linesizes should be multiples of the CPUs alignment + * preference, this is 16 or 32 for modern desktop CPUs. + * Some code requires such alignment other code can be slower without + * correct alignment, for yet other it makes no difference. + * + * @note The linesize may be larger than the size of usable data -- there + * may be extra padding present for performance reasons. + */ + int linesize[AV_NUM_DATA_POINTERS]; + + /** + * pointers to the data planes/channels. + * + * For video, this should simply point to data[]. + * + * For planar audio, each channel has a separate data pointer, and + * linesize[0] contains the size of each channel buffer. + * For packed audio, there is just one data pointer, and linesize[0] + * contains the total size of the buffer for all channels. + * + * Note: Both data and extended_data should always be set in a valid frame, + * but for planar audio with more channels that can fit in data, + * extended_data must be used in order to access all channels. + */ + uint8_t **extended_data; + + /** + * @name Video dimensions + * Video frames only. The coded dimensions (in pixels) of the video frame, + * i.e. the size of the rectangle that contains some well-defined values. + * + * @note The part of the frame intended for display/presentation is further + * restricted by the @ref cropping "Cropping rectangle". + * @{ + */ + int width, height; + /** + * @} + */ + + /** + * number of audio samples (per channel) described by this frame + */ + int nb_samples; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum AVPixelFormat for video frames, + * enum AVSampleFormat for audio) + */ + int format; + + /** + * 1 -> keyframe, 0-> not + */ + int key_frame; + + /** + * Picture type of the frame. + */ + enum AVPictureType pict_type; + + /** + * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. + */ + AVRational sample_aspect_ratio; + + /** + * Presentation timestamp in time_base units (time when frame should be shown to user). + */ + int64_t pts; + +#if FF_API_PKT_PTS + /** + * PTS copied from the AVPacket that was decoded to produce this frame. + * @deprecated use the pts field instead + */ + attribute_deprecated + int64_t pkt_pts; +#endif + + /** + * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) + * This is also the Presentation time of this AVFrame calculated from + * only AVPacket.dts values without pts values. + */ + int64_t pkt_dts; + + /** + * picture number in bitstream order + */ + int coded_picture_number; + /** + * picture number in display order + */ + int display_picture_number; + + /** + * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) + */ + int quality; + + /** + * for some private data of the user + */ + void *opaque; + +#if FF_API_ERROR_FRAME + /** + * @deprecated unused + */ + attribute_deprecated + uint64_t error[AV_NUM_DATA_POINTERS]; +#endif + + /** + * When decoding, this signals how much the picture must be delayed. + * extra_delay = repeat_pict / (2*fps) + */ + int repeat_pict; + + /** + * The content of the picture is interlaced. + */ + int interlaced_frame; + + /** + * If the content is interlaced, is top field displayed first. + */ + int top_field_first; + + /** + * Tell user application that palette has changed from previous frame. + */ + int palette_has_changed; + + /** + * reordered opaque 64 bits (generally an integer or a double precision float + * PTS but can be anything). + * The user sets AVCodecContext.reordered_opaque to represent the input at + * that time, + * the decoder reorders values as needed and sets AVFrame.reordered_opaque + * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque + */ + int64_t reordered_opaque; + + /** + * Sample rate of the audio data. + */ + int sample_rate; + + /** + * Channel layout of the audio data. + */ + uint64_t channel_layout; + + /** + * AVBuffer references backing the data for this frame. If all elements of + * this array are NULL, then this frame is not reference counted. This array + * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must + * also be non-NULL for all j < i. + * + * There may be at most one AVBuffer per data plane, so for video this array + * always contains all the references. For planar audio with more than + * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in + * this array. Then the extra AVBufferRef pointers are stored in the + * extended_buf array. + */ + AVBufferRef *buf[AV_NUM_DATA_POINTERS]; + + /** + * For planar audio which requires more than AV_NUM_DATA_POINTERS + * AVBufferRef pointers, this array will hold all the references which + * cannot fit into AVFrame.buf. + * + * Note that this is different from AVFrame.extended_data, which always + * contains all the pointers. This array only contains the extra pointers, + * which cannot fit into AVFrame.buf. + * + * This array is always allocated using av_malloc() by whoever constructs + * the frame. It is freed in av_frame_unref(). + */ + AVBufferRef **extended_buf; + /** + * Number of elements in extended_buf. + */ + int nb_extended_buf; + + AVFrameSideData **side_data; + int nb_side_data; + +/** + * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame + * Flags describing additional frame properties. + * + * @{ + */ + +/** + * The frame data may be corrupted, e.g. due to decoding errors. + */ +#define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark the frames which need to be decoded, but shouldn't be output. + */ +#define AV_FRAME_FLAG_DISCARD (1 << 2) +/** + * @} + */ + + /** + * Frame flags, a combination of @ref lavu_frame_flags + */ + int flags; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + enum AVColorPrimaries color_primaries; + + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + enum AVChromaLocation chroma_location; + + /** + * frame timestamp estimated using various heuristics, in stream time base + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int64_t best_effort_timestamp; + + /** + * reordered pos from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_pos; + + /** + * duration of the corresponding packet, expressed in + * AVStream->time_base units, 0 if unknown. + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_duration; + + /** + * metadata. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVDictionary *metadata; + + /** + * decode error flags of the frame, set to a combination of + * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there + * were errors during the decoding. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int decode_error_flags; +#define FF_DECODE_ERROR_INVALID_BITSTREAM 1 +#define FF_DECODE_ERROR_MISSING_REFERENCE 2 +#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE 4 +#define FF_DECODE_ERROR_DECODE_SLICES 8 + + /** + * number of audio channels, only used for audio. + * - encoding: unused + * - decoding: Read by user. + */ + int channels; + + /** + * size of the corresponding packet containing the compressed + * frame. + * It is set to a negative value if unknown. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int pkt_size; + +#if FF_API_FRAME_QP + /** + * QP table + */ + attribute_deprecated + int8_t *qscale_table; + /** + * QP store stride + */ + attribute_deprecated + int qstride; + + attribute_deprecated + int qscale_type; + + attribute_deprecated + AVBufferRef *qp_table_buf; +#endif + /** + * For hwaccel-format frames, this should be a reference to the + * AVHWFramesContext describing the frame. + */ + AVBufferRef *hw_frames_ctx; + + /** + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * @anchor cropping + * @name Cropping + * Video frames only. The number of pixels to discard from the the + * top/bottom/left/right border of the frame to obtain the sub-rectangle of + * the frame intended for presentation. + * @{ + */ + size_t crop_top; + size_t crop_bottom; + size_t crop_left; + size_t crop_right; + /** + * @} + */ + + /** + * AVBufferRef for internal use by a single libav* library. + * Must not be used to transfer data between libraries. + * Has to be NULL when ownership of the frame leaves the respective library. + * + * Code outside the FFmpeg libs should never check or change the contents of the buffer ref. + * + * FFmpeg calls av_buffer_unref() on it when the frame is unreferenced. + * av_frame_copy_props() calls create a new reference with av_buffer_ref() + * for the target frame's private_ref field. + */ + AVBufferRef *private_ref; +} AVFrame; + +#if FF_API_FRAME_GET_SET +/** + * Accessors for some AVFrame fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); +attribute_deprecated +void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_pkt_duration (const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_pkt_pos (const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_channel_layout (const AVFrame *frame); +attribute_deprecated +void av_frame_set_channel_layout (AVFrame *frame, int64_t val); +attribute_deprecated +int av_frame_get_channels (const AVFrame *frame); +attribute_deprecated +void av_frame_set_channels (AVFrame *frame, int val); +attribute_deprecated +int av_frame_get_sample_rate (const AVFrame *frame); +attribute_deprecated +void av_frame_set_sample_rate (AVFrame *frame, int val); +attribute_deprecated +AVDictionary *av_frame_get_metadata (const AVFrame *frame); +attribute_deprecated +void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); +attribute_deprecated +int av_frame_get_decode_error_flags (const AVFrame *frame); +attribute_deprecated +void av_frame_set_decode_error_flags (AVFrame *frame, int val); +attribute_deprecated +int av_frame_get_pkt_size(const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_size(AVFrame *frame, int val); +#if FF_API_FRAME_QP +attribute_deprecated +int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); +attribute_deprecated +int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); +#endif +attribute_deprecated +enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); +attribute_deprecated +void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); +attribute_deprecated +enum AVColorRange av_frame_get_color_range(const AVFrame *frame); +attribute_deprecated +void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); +#endif + +/** + * Get the name of a colorspace. + * @return a static string identifying the colorspace; can be NULL. + */ +const char *av_get_colorspace_name(enum AVColorSpace val); + +/** + * Allocate an AVFrame and set its fields to default values. The resulting + * struct must be freed using av_frame_free(). + * + * @return An AVFrame filled with default values or NULL on failure. + * + * @note this only allocates the AVFrame itself, not the data buffers. Those + * must be allocated through other means, e.g. with av_frame_get_buffer() or + * manually. + */ +AVFrame *av_frame_alloc(void); + +/** + * Free the frame and any dynamically allocated objects in it, + * e.g. extended_data. If the frame is reference counted, it will be + * unreferenced first. + * + * @param frame frame to be freed. The pointer will be set to NULL. + */ +void av_frame_free(AVFrame **frame); + +/** + * Set up a new reference to the data described by the source frame. + * + * Copy frame properties from src to dst and create a new reference for each + * AVBufferRef from src. + * + * If src is not reference counted, new buffers are allocated and the data is + * copied. + * + * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), + * or newly allocated with av_frame_alloc() before calling this + * function, or undefined behavior will occur. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_frame_ref(AVFrame *dst, const AVFrame *src); + +/** + * Create a new frame that references the same data as src. + * + * This is a shortcut for av_frame_alloc()+av_frame_ref(). + * + * @return newly created AVFrame on success, NULL on error. + */ +AVFrame *av_frame_clone(const AVFrame *src); + +/** + * Unreference all the buffers referenced by frame and reset the frame fields. + */ +void av_frame_unref(AVFrame *frame); + +/** + * Move everything contained in src to dst and reset src. + * + * @warning: dst is not unreferenced, but directly overwritten without reading + * or deallocating its contents. Call av_frame_unref(dst) manually + * before calling this function to ensure that no memory is leaked. + */ +void av_frame_move_ref(AVFrame *dst, AVFrame *src); + +/** + * Allocate new buffer(s) for audio or video data. + * + * The following fields must be set on frame before calling this function: + * - format (pixel format for video, sample format for audio) + * - width and height for video + * - nb_samples and channel_layout for audio + * + * This function will fill AVFrame.data and AVFrame.buf arrays and, if + * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. + * For planar formats, one buffer will be allocated for each plane. + * + * @warning: if frame already has been allocated, calling this function will + * leak memory. In addition, undefined behavior can occur in certain + * cases. + * + * @param frame frame in which to store the new buffers. + * @param align Required buffer size alignment. If equal to 0, alignment will be + * chosen automatically for the current CPU. It is highly + * recommended to pass 0 here unless you know what you are doing. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_frame_get_buffer(AVFrame *frame, int align); + +/** + * Check if the frame data is writable. + * + * @return A positive value if the frame data is writable (which is true if and + * only if each of the underlying buffers has only one reference, namely the one + * stored in this frame). Return 0 otherwise. + * + * If 1 is returned the answer is valid until av_buffer_ref() is called on any + * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). + * + * @see av_frame_make_writable(), av_buffer_is_writable() + */ +int av_frame_is_writable(AVFrame *frame); + +/** + * Ensure that the frame data is writable, avoiding data copy if possible. + * + * Do nothing if the frame is writable, allocate new buffers and copy the data + * if it is not. + * + * @return 0 on success, a negative AVERROR on error. + * + * @see av_frame_is_writable(), av_buffer_is_writable(), + * av_buffer_make_writable() + */ +int av_frame_make_writable(AVFrame *frame); + +/** + * Copy the frame data from src to dst. + * + * This function does not allocate anything, dst must be already initialized and + * allocated with the same parameters as src. + * + * This function only copies the frame data (i.e. the contents of the data / + * extended data arrays), not any other properties. + * + * @return >= 0 on success, a negative AVERROR on error. + */ +int av_frame_copy(AVFrame *dst, const AVFrame *src); + +/** + * Copy only "metadata" fields from src to dst. + * + * Metadata for the purpose of this function are those fields that do not affect + * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample + * aspect ratio (for video), but not width/height or channel layout. + * Side data is also copied. + */ +int av_frame_copy_props(AVFrame *dst, const AVFrame *src); + +/** + * Get the buffer reference a given data plane is stored in. + * + * @param plane index of the data plane of interest in frame->extended_data. + * + * @return the buffer reference that contains the plane or NULL if the input + * frame is not valid. + */ +AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); + +/** + * Add a new side data to a frame. + * + * @param frame a frame to which the side data should be added + * @param type type of the added side data + * @param size size of the side data + * + * @return newly added side data on success, NULL on error + */ +AVFrameSideData *av_frame_new_side_data(AVFrame *frame, + enum AVFrameSideDataType type, + int size); + +/** + * Add a new side data to a frame from an existing AVBufferRef + * + * @param frame a frame to which the side data should be added + * @param type the type of the added side data + * @param buf an AVBufferRef to add as side data. The ownership of + * the reference is transferred to the frame. + * + * @return newly added side data on success, NULL on error. On failure + * the frame is unchanged and the AVBufferRef remains owned by + * the caller. + */ +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, + enum AVFrameSideDataType type, + AVBufferRef *buf); + +/** + * @return a pointer to the side data of a given type on success, NULL if there + * is no side data with such type in this frame. + */ +AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, + enum AVFrameSideDataType type); + +/** + * If side data of the supplied type exists in the frame, free it and remove it + * from the frame. + */ +void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); + + +/** + * Flags for frame cropping. + */ +enum { + /** + * Apply the maximum possible cropping, even if it requires setting the + * AVFrame.data[] entries to unaligned pointers. Passing unaligned data + * to FFmpeg API is generally not allowed, and causes undefined behavior + * (such as crashes). You can pass unaligned data only to FFmpeg APIs that + * are explicitly documented to accept it. Use this flag only if you + * absolutely know what you are doing. + */ + AV_FRAME_CROP_UNALIGNED = 1 << 0, +}; + +/** + * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ + * crop_bottom fields. If cropping is successful, the function will adjust the + * data pointers and the width/height fields, and set the crop fields to 0. + * + * In all cases, the cropping boundaries will be rounded to the inherent + * alignment of the pixel format. In some cases, such as for opaque hwaccel + * formats, the left/top cropping is ignored. The crop fields are set to 0 even + * if the cropping was rounded or ignored. + * + * @param frame the frame which should be cropped + * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. + * + * @return >= 0 on success, a negative AVERROR on error. If the cropping fields + * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. + */ +int av_frame_apply_cropping(AVFrame *frame, int flags); + +/** + * @return a string identifying the side data type + */ +const char *av_frame_side_data_name(enum AVFrameSideDataType type); + +/** + * @} + */ + +#endif /* AVUTIL_FRAME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hash.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hash.h new file mode 100644 index 0000000..7693e6b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hash.h @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_hash_generic + * Generic hashing API + */ + +#ifndef AVUTIL_HASH_H +#define AVUTIL_HASH_H + +#include + +#include "version.h" + +/** + * @defgroup lavu_hash Hash Functions + * @ingroup lavu_crypto + * Hash functions useful in multimedia. + * + * Hash functions are widely used in multimedia, from error checking and + * concealment to internal regression testing. libavutil has efficient + * implementations of a variety of hash functions that may be useful for + * FFmpeg and other multimedia applications. + * + * @{ + * + * @defgroup lavu_hash_generic Generic Hashing API + * An abstraction layer for all hash functions supported by libavutil. + * + * If your application needs to support a wide range of different hash + * functions, then the Generic Hashing API is for you. It provides a generic, + * reusable API for @ref lavu_hash "all hash functions" implemented in libavutil. + * If you just need to use one particular hash function, use the @ref lavu_hash + * "individual hash" directly. + * + * @section Sample Code + * + * A basic template for using the Generic Hashing API follows: + * + * @code + * struct AVHashContext *ctx = NULL; + * const char *hash_name = NULL; + * uint8_t *output_buf = NULL; + * + * // Select from a string returned by av_hash_names() + * hash_name = ...; + * + * // Allocate a hash context + * ret = av_hash_alloc(&ctx, hash_name); + * if (ret < 0) + * return ret; + * + * // Initialize the hash context + * av_hash_init(ctx); + * + * // Update the hash context with data + * while (data_left) { + * av_hash_update(ctx, data, size); + * } + * + * // Now we have no more data, so it is time to finalize the hash and get the + * // output. But we need to first allocate an output buffer. Note that you can + * // use any memory allocation function, including malloc(), not just + * // av_malloc(). + * output_buf = av_malloc(av_hash_get_size(ctx)); + * if (!output_buf) + * return AVERROR(ENOMEM); + * + * // Finalize the hash context. + * // You can use any of the av_hash_final*() functions provided, for other + * // output formats. If you do so, be sure to adjust the memory allocation + * // above. See the function documentation below for the exact amount of extra + * // memory needed. + * av_hash_final(ctx, output_buffer); + * + * // Free the context + * av_hash_freep(&ctx); + * @endcode + * + * @section Hash Function-Specific Information + * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be + * used. + * + * If the Murmur3 hash is selected, the default seed will be used. See @ref + * lavu_murmur3_seedinfo "Murmur3" for more information. + * + * @{ + */ + +/** + * @example ffhash.c + * This example is a simple command line application that takes one or more + * arguments. It demonstrates a typical use of the hashing API with allocation, + * initialization, updating, and finalizing. + */ + +struct AVHashContext; + +/** + * Allocate a hash context for the algorithm specified by name. + * + * @return >= 0 for success, a negative error code for failure + * + * @note The context is not initialized after a call to this function; you must + * call av_hash_init() to do so. + */ +int av_hash_alloc(struct AVHashContext **ctx, const char *name); + +/** + * Get the names of available hash algorithms. + * + * This function can be used to enumerate the algorithms. + * + * @param[in] i Index of the hash algorithm, starting from 0 + * @return Pointer to a static string or `NULL` if `i` is out of range + */ +const char *av_hash_names(int i); + +/** + * Get the name of the algorithm corresponding to the given hash context. + */ +const char *av_hash_get_name(const struct AVHashContext *ctx); + +/** + * Maximum value that av_hash_get_size() will currently return. + * + * You can use this if you absolutely want or need to use static allocation for + * the output buffer and are fine with not supporting hashes newly added to + * libavutil without recompilation. + * + * @warning + * Adding new hashes with larger sizes, and increasing the macro while doing + * so, will not be considered an ABI change. To prevent your code from + * overflowing a buffer, either dynamically allocate the output buffer with + * av_hash_get_size(), or limit your use of the Hashing API to hashes that are + * already in FFmpeg during the time of compilation. + */ +#define AV_HASH_MAX_SIZE 64 + +/** + * Get the size of the resulting hash value in bytes. + * + * The maximum value this function will currently return is available as macro + * #AV_HASH_MAX_SIZE. + * + * @param[in] ctx Hash context + * @return Size of the hash value in bytes + */ +int av_hash_get_size(const struct AVHashContext *ctx); + +/** + * Initialize or reset a hash context. + * + * @param[in,out] ctx Hash context + */ +void av_hash_init(struct AVHashContext *ctx); + +/** + * Update a hash context with additional data. + * + * @param[in,out] ctx Hash context + * @param[in] src Data to be added to the hash context + * @param[in] len Size of the additional data + */ +#if FF_API_CRYPTO_SIZE_T +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); +#else +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finalize a hash context and compute the actual hash value. + * + * The minimum size of `dst` buffer is given by av_hash_get_size() or + * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * + * @see av_hash_final_bin() provides an alternative API + */ +void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); + +/** + * Finalize a hash context and store the actual hash value in a buffer. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * If `size` is smaller than the hash size (given by av_hash_get_size()), the + * hash is truncated; if size is larger, the buffer is padded with 0. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Number of bytes to write to `dst` + */ +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the hexadecimal representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the + * value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the string will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the Base64 representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is + * the value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Free hash context and set hash context pointer to `NULL`. + * + * @param[in,out] ctx Pointer to hash context + */ +void av_hash_freep(struct AVHashContext **ctx); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_HASH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hdr_dynamic_metadata.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hdr_dynamic_metadata.h new file mode 100644 index 0000000..2d72de5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hdr_dynamic_metadata.h @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2018 Mohammad Izadi + * + * 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 + */ + +#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H +#define AVUTIL_HDR_DYNAMIC_METADATA_H + +#include "frame.h" +#include "rational.h" + +/** + * Option for overlapping elliptical pixel selectors in an image. + */ +enum AVHDRPlusOverlapProcessOption { + AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0, + AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1, +}; + +/** + * Represents the percentile at a specific percentage in + * a distribution. + */ +typedef struct AVHDRPlusPercentile { + /** + * The percentage value corresponding to a specific percentile linearized + * RGB value in the processing window in the scene. The value shall be in + * the range of 0 to100, inclusive. + */ + uint8_t percentage; + + /** + * The linearized maxRGB value at a specific percentile in the processing + * window in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.00001. + */ + AVRational percentile; +} AVHDRPlusPercentile; + +/** + * Color transform parameters at a processing window in a dynamic metadata for + * SMPTE 2094-40. + */ +typedef struct AVHDRPlusColorTransformParams { + /** + * The relative x coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_x; + + /** + * The relative y coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_y; + + /** + * The relative x coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_x; + + /** + * The relative y coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_y; + + /** + * The x coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (width of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_x; + + /** + * The y coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (height of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_y; + + /** + * The clockwise rotation angle in degree of arc with respect to the + * positive direction of the x-axis of the concentric internal and external + * ellipses of the elliptical pixel selector in the processing window. The + * value shall be in the range of 0 to 180, inclusive and in multiples of 1. + */ + uint8_t rotation_angle; + + /** + * The semi-major axis value of the internal ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_internal_ellipse; + + /** + * The semi-major axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value + * shall not be less than semimajor_axis_internal_ellipse of the current + * processing window. The value shall be in the range of 1 to 65535, + * inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_external_ellipse; + + /** + * The semi-minor axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semiminor_axis_external_ellipse; + + /** + * Overlap process option indicates one of the two methods of combining + * rendered pixels in the processing window in an image with at least one + * elliptical pixel selector. For overlapping elliptical pixel selectors + * in an image, overlap_process_option shall have the same value. + */ + enum AVHDRPlusOverlapProcessOption overlap_process_option; + + /** + * The maximum of the color components of linearized RGB values in the + * processing window in the scene. The values should be in the range of 0 to + * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and + * maxscl[ 2 ] are corresponding to R, G, B color components respectively. + */ + AVRational maxscl[3]; + + /** + * The average of linearized maxRGB values in the processing window in the + * scene. The value should be in the range of 0 to 1, inclusive and in + * multiples of 0.00001. + */ + AVRational average_maxrgb; + + /** + * The number of linearized maxRGB values at given percentiles in the + * processing window in the scene. The maximum value shall be 15. + */ + uint8_t num_distribution_maxrgb_percentiles; + + /** + * The linearized maxRGB values at given percentiles in the + * processing window in the scene. + */ + AVHDRPlusPercentile distribution_maxrgb[15]; + + /** + * The fraction of selected pixels in the image that contains the brightest + * pixel in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.001. + */ + AVRational fraction_bright_pixels; + + /** + * This flag indicates that the metadata for the tone mapping function in + * the processing window is present (for value of 1). + */ + uint8_t tone_mapping_flag; + + /** + * The x coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_x; + + /** + * The y coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_y; + + /** + * The number of the intermediate anchor parameters of the tone mapping + * function in the processing window. The maximum value shall be 15. + */ + uint8_t num_bezier_curve_anchors; + + /** + * The intermediate anchor parameters of the tone mapping function in the + * processing window in the scene. The values should be in the range of 0 + * to 1, inclusive and in multiples of 1/1023. + */ + AVRational bezier_curve_anchors[15]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. Other values are reserved for future use. + */ + uint8_t color_saturation_mapping_flag; + + /** + * The color saturation gain in the processing window in the scene. The + * value shall be in the range of 0 to 63/8, inclusive and in multiples of + * 1/8. The default value shall be 1. + */ + AVRational color_saturation_weight; +} AVHDRPlusColorTransformParams; + +/** + * This struct represents dynamic metadata for color volume transform - + * application 4 of SMPTE 2094-40:2016 standard. + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with + * av_dynamic_hdr_plus_alloc() and its size is not a part of + * the public ABI. + */ +typedef struct AVDynamicHDRPlus { + /** + * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5. + */ + uint8_t itu_t_t35_country_code; + + /** + * Application version in the application defining document in ST-2094 + * suite. The value shall be set to 0. + */ + uint8_t application_version; + + /** + * The number of processing windows. The value shall be in the range + * of 1 to 3, inclusive. + */ + uint8_t num_windows; + + /** + * The color transform parameters for every processing window. + */ + AVHDRPlusColorTransformParams params[3]; + + /** + * The nominal maximum display luminance of the targeted system display, + * in units of 0.0001 candelas per square metre. The value shall be in + * the range of 0 to 10000, inclusive. + */ + AVRational targeted_system_display_maximum_luminance; + + /** + * This flag shall be equal to 0 in bit streams conforming to this version + * of this Specification. The value 1 is reserved for future use. + */ + uint8_t targeted_system_display_actual_peak_luminance_flag; + + /** + * The number of rows in the targeted system_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_targeted_system_display_actual_peak_luminance; + + /** + * The number of columns in the + * targeted_system_display_actual_peak_luminance array. The value shall be + * in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_targeted_system_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the targeted system display. The + * values should be in the range of 0 to 1, inclusive and in multiples of + * 1/15. + */ + AVRational targeted_system_display_actual_peak_luminance[25][25]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. The value 1 is reserved for future use. + */ + uint8_t mastering_display_actual_peak_luminance_flag; + + /** + * The number of rows in the mastering_display_actual_peak_luminance array. + * The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_mastering_display_actual_peak_luminance; + + /** + * The number of columns in the mastering_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_mastering_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the mastering display used for + * mastering the image essence. The values should be in the range of 0 to 1, + * inclusive and in multiples of 1/15. + */ + AVRational mastering_display_actual_peak_luminance[25][25]; +} AVDynamicHDRPlus; + +/** + * Allocate an AVDynamicHDRPlus structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVDynamicHDRPlus filled with default values or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); + +/** + * Allocate a complete AVDynamicHDRPlus and add it to the frame. + * @param frame The frame which side data is added to. + * + * @return The AVDynamicHDRPlus structure to be filled by caller or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hmac.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hmac.h new file mode 100644 index 0000000..412e950 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hmac.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2012 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 + */ + +#ifndef AVUTIL_HMAC_H +#define AVUTIL_HMAC_H + +#include + +#include "version.h" +/** + * @defgroup lavu_hmac HMAC + * @ingroup lavu_crypto + * @{ + */ + +enum AVHMACType { + AV_HMAC_MD5, + AV_HMAC_SHA1, + AV_HMAC_SHA224, + AV_HMAC_SHA256, + AV_HMAC_SHA384, + AV_HMAC_SHA512, +}; + +typedef struct AVHMAC AVHMAC; + +/** + * Allocate an AVHMAC context. + * @param type The hash function used for the HMAC. + */ +AVHMAC *av_hmac_alloc(enum AVHMACType type); + +/** + * Free an AVHMAC context. + * @param ctx The context to free, may be NULL + */ +void av_hmac_free(AVHMAC *ctx); + +/** + * Initialize an AVHMAC context with an authentication key. + * @param ctx The HMAC context + * @param key The authentication key + * @param keylen The length of the key, in bytes + */ +void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen); + +/** + * Hash data with the HMAC. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + */ +void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len); + +/** + * Finish hashing and output the HMAC digest. + * @param ctx The HMAC context + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen); + +/** + * Hash an array of data with a key. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + * @param key The authentication key + * @param keylen The length of the key, in bytes + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len, + const uint8_t *key, unsigned int keylen, + uint8_t *out, unsigned int outlen); + +/** + * @} + */ + +#endif /* AVUTIL_HMAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext.h new file mode 100644 index 0000000..f5a4b62 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext.h @@ -0,0 +1,584 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_H +#define AVUTIL_HWCONTEXT_H + +#include "buffer.h" +#include "frame.h" +#include "log.h" +#include "pixfmt.h" + +enum AVHWDeviceType { + AV_HWDEVICE_TYPE_NONE, + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, + AV_HWDEVICE_TYPE_VIDEOTOOLBOX, + AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_DRM, + AV_HWDEVICE_TYPE_OPENCL, + AV_HWDEVICE_TYPE_MEDIACODEC, +}; + +typedef struct AVHWDeviceInternal AVHWDeviceInternal; + +/** + * This struct aggregates all the (hardware/vendor-specific) "high-level" state, + * i.e. state that is not tied to a concrete processing configuration. + * E.g., in an API that supports hardware-accelerated encoding and decoding, + * this struct will (if possible) wrap the state that is common to both encoding + * and decoding and from which specific instances of encoders or decoders can be + * derived. + * + * This struct is reference-counted with the AVBuffer mechanism. The + * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field + * points to the actual AVHWDeviceContext. Further objects derived from + * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with + * specific properties) will hold an internal reference to it. After all the + * references are released, the AVHWDeviceContext itself will be freed, + * optionally invoking a user-specified callback for uninitializing the hardware + * state. + */ +typedef struct AVHWDeviceContext { + /** + * A class for logging. Set by av_hwdevice_ctx_alloc(). + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWDeviceInternal *internal; + + /** + * This field identifies the underlying API used for hardware access. + * + * This field is set when this struct is allocated and never changed + * afterwards. + */ + enum AVHWDeviceType type; + + /** + * The format-specific data, allocated and freed by libavutil along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwcontext_*.h) and filled as described in the + * documentation before calling av_hwdevice_ctx_init(). + * + * After calling av_hwdevice_ctx_init() this struct should not be modified + * by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwdevice_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + * + * @note when other objects (e.g an AVHWFramesContext) are derived from this + * struct, this callback will be invoked after all such child objects + * are fully uninitialized and their respective destructors invoked. + */ + void (*free)(struct AVHWDeviceContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; +} AVHWDeviceContext; + +typedef struct AVHWFramesInternal AVHWFramesInternal; + +/** + * This struct describes a set or pool of "hardware" frames (i.e. those with + * data not located in normal system memory). All the frames in the pool are + * assumed to be allocated in the same way and interchangeable. + * + * This struct is reference-counted with the AVBuffer mechanism and tied to a + * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor + * yields a reference, whose data field points to the actual AVHWFramesContext + * struct. + */ +typedef struct AVHWFramesContext { + /** + * A class for logging. + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWFramesInternal *internal; + + /** + * A reference to the parent AVHWDeviceContext. This reference is owned and + * managed by the enclosing AVHWFramesContext, but the caller may derive + * additional references from it. + */ + AVBufferRef *device_ref; + + /** + * The parent AVHWDeviceContext. This is simply a pointer to + * device_ref->data provided for convenience. + * + * Set by libavutil in av_hwframe_ctx_init(). + */ + AVHWDeviceContext *device_ctx; + + /** + * The format-specific data, allocated and freed automatically along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwframe_*.h) and filled as described in the + * documentation before calling av_hwframe_ctx_init(). + * + * After any frames using this context are created, the contents of this + * struct should not be modified by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + */ + void (*free)(struct AVHWFramesContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; + + /** + * A pool from which the frames are allocated by av_hwframe_get_buffer(). + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * The buffers returned by calling av_buffer_pool_get() on this pool must + * have the properties described in the documentation in the corresponding hw + * type's header (hwcontext_*.h). The pool will be freed strictly before + * this struct's free() callback is invoked. + * + * This field may be NULL, then libavutil will attempt to allocate a pool + * internally. Note that certain device types enforce pools allocated at + * fixed size (frame count), which cannot be extended dynamically. In such a + * case, initial_pool_size must be set appropriately. + */ + AVBufferPool *pool; + + /** + * Initial size of the frame pool. If a device type does not support + * dynamically resizing the pool, then this is also the maximum pool size. + * + * May be set by the caller before calling av_hwframe_ctx_init(). Must be + * set if pool is NULL and the device type does not support dynamic pools. + */ + int initial_pool_size; + + /** + * The pixel format identifying the underlying HW surface type. + * + * Must be a hwaccel format, i.e. the corresponding descriptor must have the + * AV_PIX_FMT_FLAG_HWACCEL flag set. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + enum AVPixelFormat format; + + /** + * The pixel format identifying the actual data layout of the hardware + * frames. + * + * Must be set by the caller before calling av_hwframe_ctx_init(). + * + * @note when the underlying API does not provide the exact data layout, but + * only the colorspace/bit depth, this field should be set to the fully + * planar version of that format (e.g. for 8-bit 420 YUV it should be + * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). + */ + enum AVPixelFormat sw_format; + + /** + * The allocated dimensions of the frames in this pool. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + int width, height; +} AVHWFramesContext; + +/** + * Look up an AVHWDeviceType by name. + * + * @param name String name of the device type (case-insensitive). + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); + +/** Get the string name of an AVHWDeviceType. + * + * @param type Type from enum AVHWDeviceType. + * @return Pointer to a static string containing the name, or NULL if the type + * is not valid. + */ +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); + +/** + * Iterate over supported device types. + * + * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type + * returned by this function in subsequent iterations. + * @return The next usable device type from enum AVHWDeviceType, or + * AV_HWDEVICE_TYPE_NONE if there are no more. + */ +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); + +/** + * Allocate an AVHWDeviceContext for a given hardware type. + * + * @param type the type of the hardware device to allocate. + * @return a reference to the newly created AVHWDeviceContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); + +/** + * Finalize the device context before use. This function must be called after + * the context is filled with all the required information and before it is + * used in any way. + * + * @param ref a reference to the AVHWDeviceContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwdevice_ctx_init(AVBufferRef *ref); + +/** + * Open a device of the specified type and create an AVHWDeviceContext for it. + * + * This is a convenience function intended to cover the simple cases. Callers + * who need to fine-tune device creation/management should open the device + * manually and then wrap it in an AVHWDeviceContext using + * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). + * + * The returned context is already initialized and ready for use, the caller + * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of + * the created AVHWDeviceContext are set by this function and should not be + * touched by the caller. + * + * @param device_ctx On success, a reference to the newly-created device context + * will be written here. The reference is owned by the caller + * and must be released with av_buffer_unref() when no longer + * needed. On failure, NULL will be written to this pointer. + * @param type The type of the device to create. + * @param device A type-specific string identifying the device to open. + * @param opts A dictionary of additional (type-specific) options to use in + * opening the device. The dictionary remains owned by the caller. + * @param flags currently unused + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, + const char *device, AVDictionary *opts, int flags); + +/** + * Create a new device of the specified type from an existing device. + * + * If the source device is a device of the target type or was originally + * derived from such a device (possibly through one or more intermediate + * devices of other types), then this will return a reference to the + * existing device of the same type as is requested. + * + * Otherwise, it will attempt to derive a new device from the given source + * device. If direct derivation to the new type is not implemented, it will + * attempt the same derivation from each ancestor of the source device in + * turn looking for an implemented derivation method. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, int flags); + + +/** + * Allocate an AVHWFramesContext tied to a given device context. + * + * @param device_ctx a reference to a AVHWDeviceContext. This function will make + * a new reference for internal use, the one passed to the + * function remains owned by the caller. + * @return a reference to the newly created AVHWFramesContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); + +/** + * Finalize the context before use. This function must be called after the + * context is filled with all the required information and before it is attached + * to any frames. + * + * @param ref a reference to the AVHWFramesContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_ctx_init(AVBufferRef *ref); + +/** + * Allocate a new frame attached to the given AVHWFramesContext. + * + * @param hwframe_ctx a reference to an AVHWFramesContext + * @param frame an empty (freshly allocated or unreffed) frame to be filled with + * newly allocated buffers. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); + +/** + * Copy data to or from a hw surface. At least one of dst/src must have an + * AVHWFramesContext attached. + * + * If src has an AVHWFramesContext attached, then the format of dst (if set) + * must use one of the formats returned by av_hwframe_transfer_get_formats(src, + * AV_HWFRAME_TRANSFER_DIRECTION_FROM). + * If dst has an AVHWFramesContext attached, then the format of src must use one + * of the formats returned by av_hwframe_transfer_get_formats(dst, + * AV_HWFRAME_TRANSFER_DIRECTION_TO) + * + * dst may be "clean" (i.e. with data/buf pointers unset), in which case the + * data buffers will be allocated by this function using av_frame_get_buffer(). + * If dst->format is set, then this format will be used, otherwise (when + * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. + * + * The two frames must have matching allocated dimensions (i.e. equal to + * AVHWFramesContext.width/height), since not all device types support + * transferring a sub-rectangle of the whole surface. The display dimensions + * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but + * also have to be equal for both frames. When the display dimensions are + * smaller than the allocated dimensions, the content of the padding in the + * destination frame is unspecified. + * + * @param dst the destination frame. dst is not touched on failure. + * @param src the source frame. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR error code on failure. + */ +int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); + +enum AVHWFrameTransferDirection { + /** + * Transfer the data from the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_FROM, + + /** + * Transfer the data to the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_TO, +}; + +/** + * Get a list of possible source or target formats usable in + * av_hwframe_transfer_data(). + * + * @param hwframe_ctx the frame context to obtain the information for + * @param dir the direction of the transfer + * @param formats the pointer to the output format list will be written here. + * The list is terminated with AV_PIX_FMT_NONE and must be freed + * by the caller when no longer needed using av_free(). + * If this function returns successfully, the format list will + * have at least one item (not counting the terminator). + * On failure, the contents of this pointer are unspecified. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats, int flags); + + +/** + * This struct describes the constraints on hardware frames attached to + * a given device with a hardware-specific configuration. This is returned + * by av_hwdevice_get_hwframe_constraints() and must be freed by + * av_hwframe_constraints_free() after use. + */ +typedef struct AVHWFramesConstraints { + /** + * A list of possible values for format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. This member will always be filled. + */ + enum AVPixelFormat *valid_hw_formats; + + /** + * A list of possible values for sw_format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is + * not known. + */ + enum AVPixelFormat *valid_sw_formats; + + /** + * The minimum size of frames in this hw_frames_ctx. + * (Zero if not known.) + */ + int min_width; + int min_height; + + /** + * The maximum size of frames in this hw_frames_ctx. + * (INT_MAX if not known / no limit.) + */ + int max_width; + int max_height; +} AVHWFramesConstraints; + +/** + * Allocate a HW-specific configuration structure for a given HW device. + * After use, the user must free all members as required by the specific + * hardware structure being used, then free the structure itself with + * av_free(). + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @return The newly created HW-specific configuration structure on + * success or NULL on failure. + */ +void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); + +/** + * Get the constraints on HW frames given a device and the HW-specific + * configuration to be used with that device. If no HW-specific + * configuration is provided, returns the maximum possible capabilities + * of the device. + * + * @param ref a reference to the associated AVHWDeviceContext. + * @param hwconfig a filled HW-specific configuration structure, or NULL + * to return the maximum possible capabilities of the device. + * @return AVHWFramesConstraints structure describing the constraints + * on the device, or NULL if not available. + */ +AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, + const void *hwconfig); + +/** + * Free an AVHWFrameConstraints structure. + * + * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. + */ +void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); + + +/** + * Flags to apply to frame mappings. + */ +enum { + /** + * The mapping must be readable. + */ + AV_HWFRAME_MAP_READ = 1 << 0, + /** + * The mapping must be writeable. + */ + AV_HWFRAME_MAP_WRITE = 1 << 1, + /** + * The mapped frame will be overwritten completely in subsequent + * operations, so the current frame data need not be loaded. Any values + * which are not overwritten are unspecified. + */ + AV_HWFRAME_MAP_OVERWRITE = 1 << 2, + /** + * The mapping must be direct. That is, there must not be any copying in + * the map or unmap steps. Note that performance of direct mappings may + * be much lower than normal memory. + */ + AV_HWFRAME_MAP_DIRECT = 1 << 3, +}; + +/** + * Map a hardware frame. + * + * This has a number of different possible effects, depending on the format + * and origin of the src and dst frames. On input, src should be a usable + * frame with valid buffers and dst should be blank (typically as just created + * by av_frame_alloc()). src should have an associated hwframe context, and + * dst may optionally have a format and associated hwframe context. + * + * If src was created by mapping a frame from the hwframe context of dst, + * then this function undoes the mapping - dst is replaced by a reference to + * the frame that src was originally mapped from. + * + * If both src and dst have an associated hwframe context, then this function + * attempts to map the src frame from its hardware context to that of dst and + * then fill dst with appropriate data to be usable there. This will only be + * possible if the hwframe contexts and associated devices are compatible - + * given compatible devices, av_hwframe_ctx_create_derived() can be used to + * create a hwframe context for dst in which mapping should be possible. + * + * If src has a hwframe context but dst does not, then the src frame is + * mapped to normal memory and should thereafter be usable as a normal frame. + * If the format is set on dst, then the mapping will attempt to create dst + * with that format and fail if it is not possible. If format is unset (is + * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate + * format to use is (probably the sw_format of the src hwframe context). + * + * A return value of AVERROR(ENOSYS) indicates that the mapping is not + * possible with the given arguments and hwframe setup, while other return + * values indicate that it failed somehow. + * + * @param dst Destination frame, to contain the mapping. + * @param src Source frame, to be mapped. + * @param flags Some combination of AV_HWFRAME_MAP_* flags. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); + + +/** + * Create and initialise an AVHWFramesContext as a mapping of another existing + * AVHWFramesContext on a different device. + * + * av_hwframe_ctx_init() should not be called after this. + * + * @param derived_frame_ctx On success, a reference to the newly created + * AVHWFramesContext. + * @param derived_device_ctx A reference to the device to create the new + * AVHWFramesContext on. + * @param source_frame_ctx A reference to an existing AVHWFramesContext + * which will be mapped to the derived context. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, + enum AVPixelFormat format, + AVBufferRef *derived_device_ctx, + AVBufferRef *source_frame_ctx, + int flags); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_cuda.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_cuda.h new file mode 100644 index 0000000..81a0552 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_cuda.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_CUDA_H +#define AVUTIL_HWCONTEXT_CUDA_H + +#ifndef CUDA_VERSION +#include +#endif + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_CUDA. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CUdeviceptr. + */ + +typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal; + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; + CUstream stream; + AVCUDADeviceContextInternal *internal; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_d3d11va.h new file mode 100644 index 0000000..9f91e9b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_d3d11va.h @@ -0,0 +1,169 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_D3D11VA_H +#define AVUTIL_HWCONTEXT_D3D11VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA. + * + * The default pool implementation will be fixed-size if initial_pool_size is + * set (and allocate elements from an array texture). Otherwise it will allocate + * individual textures. Be aware that decoding requires a single array texture. + * + * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to + * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for + * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVD3D11VADeviceContext { + /** + * Device used for texture creation and access. This can also be used to + * set the libavcodec decoding device. + * + * Must be set by the user. This is the only mandatory field - the other + * device context fields are set from this and are available for convenience. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11Device *device; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11DeviceContext *device_context; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoDevice *video_device; + + /** + * If unset, this will be set from the device_context field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoContext *video_context; + + /** + * Callbacks for locking. They protect accesses to device_context and + * video_context calls. They also protect access to the internal staging + * texture (for av_hwframe_transfer_data() calls). They do NOT protect + * access to hwcontext or decoder state in general. + * + * If unset on init, the hwcontext implementation will set them to use an + * internal mutex. + * + * The underlying lock must be recursive. lock_ctx is for free use by the + * locking implementation. + */ + void (*lock)(void *lock_ctx); + void (*unlock)(void *lock_ctx); + void *lock_ctx; +} AVD3D11VADeviceContext; + +/** + * D3D11 frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + * + * This has no use outside of custom allocation, and AVFrame AVBufferRef do not + * necessarily point to an instance of this struct. + */ +typedef struct AVD3D11FrameDescriptor { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + * + * Normally stored in AVFrame.data[0]. + */ + ID3D11Texture2D *texture; + + /** + * The index into the array texture element representing the frame, or 0 + * if the texture is not an array texture. + * + * Normally stored in AVFrame.data[1] (cast from intptr_t). + */ + intptr_t index; +} AVD3D11FrameDescriptor; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVD3D11VAFramesContext { + /** + * The canonical texture used for pool allocation. If this is set to NULL + * on init, the hwframes implementation will allocate and set an array + * texture if initial_pool_size > 0. + * + * The only situation when the API user should set this is: + * - the user wants to do manual pool allocation (setting + * AVHWFramesContext.pool), instead of letting AVHWFramesContext + * allocate the pool + * - of an array texture + * - and wants it to use it for decoding + * - this has to be done before calling av_hwframe_ctx_init() + * + * Deallocating the AVHWFramesContext will always release this interface, + * and it does not matter whether it was user-allocated. + * + * This is in particular used by the libavcodec D3D11VA hwaccel, which + * requires a single array texture. It will create ID3D11VideoDecoderOutputView + * objects for each array texture element on decoder initialization. + */ + ID3D11Texture2D *texture; + + /** + * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must + * at least set D3D11_BIND_DECODER if the frames context is to be used for + * video decoding. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT BindFlags; + + /** + * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT MiscFlags; +} AVD3D11VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_drm.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_drm.h new file mode 100644 index 0000000..42709f2 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_drm.h @@ -0,0 +1,169 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_DRM_H +#define AVUTIL_HWCONTEXT_DRM_H + +#include +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_DRM. + * + * Internal frame allocation is not currently supported - all frames + * must be allocated by the user. Thus AVHWFramesContext is always + * NULL, though this may change if support for frame allocation is + * added in future. + */ + +enum { + /** + * The maximum number of layers/planes in a DRM frame. + */ + AV_DRM_MAX_PLANES = 4 +}; + +/** + * DRM object descriptor. + * + * Describes a single DRM object, addressing it as a PRIME file + * descriptor. + */ +typedef struct AVDRMObjectDescriptor { + /** + * DRM PRIME fd for the object. + */ + int fd; + /** + * Total size of the object. + * + * (This includes any parts not which do not contain image data.) + */ + size_t size; + /** + * Format modifier applied to the object (DRM_FORMAT_MOD_*). + * + * If the format modifier is unknown then this should be set to + * DRM_FORMAT_MOD_INVALID. + */ + uint64_t format_modifier; +} AVDRMObjectDescriptor; + +/** + * DRM plane descriptor. + * + * Describes a single plane of a layer, which is contained within + * a single object. + */ +typedef struct AVDRMPlaneDescriptor { + /** + * Index of the object containing this plane in the objects + * array of the enclosing frame descriptor. + */ + int object_index; + /** + * Offset within that object of this plane. + */ + ptrdiff_t offset; + /** + * Pitch (linesize) of this plane. + */ + ptrdiff_t pitch; +} AVDRMPlaneDescriptor; + +/** + * DRM layer descriptor. + * + * Describes a single layer within a frame. This has the structure + * defined by its format, and will contain one or more planes. + */ +typedef struct AVDRMLayerDescriptor { + /** + * Format of the layer (DRM_FORMAT_*). + */ + uint32_t format; + /** + * Number of planes in the layer. + * + * This must match the number of planes required by format. + */ + int nb_planes; + /** + * Array of planes in this layer. + */ + AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; +} AVDRMLayerDescriptor; + +/** + * DRM frame descriptor. + * + * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. + * It is also used by user-allocated frame pools - allocating in + * AVHWFramesContext.pool must return AVBufferRefs which contain + * an object of this type. + * + * The fields of this structure should be set such it can be + * imported directly by EGL using the EGL_EXT_image_dma_buf_import + * and EGL_EXT_image_dma_buf_import_modifiers extensions. + * (Note that the exact layout of a particular format may vary between + * platforms - we only specify that the same platform should be able + * to import it.) + * + * The total number of planes must not exceed AV_DRM_MAX_PLANES, and + * the order of the planes by increasing layer index followed by + * increasing plane index must be the same as the order which would + * be used for the data pointers in the equivalent software format. + */ +typedef struct AVDRMFrameDescriptor { + /** + * Number of DRM objects making up this frame. + */ + int nb_objects; + /** + * Array of objects making up the frame. + */ + AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; + /** + * Number of layers in the frame. + */ + int nb_layers; + /** + * Array of layers in the frame. + */ + AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; +} AVDRMFrameDescriptor; + +/** + * DRM device. + * + * Allocated as AVHWDeviceContext.hwctx. + */ +typedef struct AVDRMDeviceContext { + /** + * File descriptor of DRM device. + * + * This is used as the device to create frames on, and may also be + * used in some derivation and mapping operations. + * + * If no device is required, set to -1. + */ + int fd; +} AVDRMDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_DRM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_dxva2.h new file mode 100644 index 0000000..e1b79bc --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_dxva2.h @@ -0,0 +1,75 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_DXVA2_H +#define AVUTIL_HWCONTEXT_DXVA2_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_DXVA2. + * + * Only fixed-size pools are supported. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a pointer to IDirect3DSurface9. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVDXVA2DeviceContext { + IDirect3DDeviceManager9 *devmgr; +} AVDXVA2DeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVDXVA2FramesContext { + /** + * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or + * DXVA2_VideoDecoderRenderTarget). Must be set by the caller. + */ + DWORD surface_type; + + /** + * The surface pool. When an external pool is not provided by the caller, + * this will be managed (allocated and filled on init, freed on uninit) by + * libavutil. + */ + IDirect3DSurface9 **surfaces; + int nb_surfaces; + + /** + * Certain drivers require the decoder to be destroyed before the surfaces. + * To allow internally managed pools to work properly in such cases, this + * field is provided. + * + * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on + * it just before the internal surface pool is freed. + * + * This is for convenience only. Some code uses other methods to manage the + * decoder reference. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_mediacodec.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_mediacodec.h new file mode 100644 index 0000000..101a980 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_mediacodec.h @@ -0,0 +1,36 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_MEDIACODEC_H +#define AVUTIL_HWCONTEXT_MEDIACODEC_H + +/** + * MediaCodec details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVMediaCodecDeviceContext { + /** + * android/view/Surface handle, to be filled by the user. + * + * This is the default surface used by decoders on this device. + */ + void *surface; +} AVMediaCodecDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_qsv.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_qsv.h new file mode 100644 index 0000000..b98d611 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_qsv.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_QSV_H +#define AVUTIL_HWCONTEXT_QSV_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_QSV. + * + * This API does not support dynamic frame pools. AVHWFramesContext.pool must + * contain AVBufferRefs whose data pointer points to an mfxFrameSurface1 struct. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVQSVDeviceContext { + mfxSession session; +} AVQSVDeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVQSVFramesContext { + mfxFrameSurface1 *surfaces; + int nb_surfaces; + + /** + * A combination of MFX_MEMTYPE_* describing the frame pool. + */ + int frame_type; +} AVQSVFramesContext; + +#endif /* AVUTIL_HWCONTEXT_QSV_H */ + diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vaapi.h new file mode 100644 index 0000000..0b2e071 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vaapi.h @@ -0,0 +1,117 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VAAPI_H +#define AVUTIL_HWCONTEXT_VAAPI_H + +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VAAPI. + * + * Dynamic frame pools are supported, but note that any pool used as a render + * target is required to be of fixed size in order to be be usable as an + * argument to vaCreateContext(). + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a VASurfaceID. + */ + +enum { + /** + * The quirks field has been set by the user and should not be detected + * automatically by av_hwdevice_ctx_init(). + */ + AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), + + /** + * The driver does not support the VASurfaceAttribMemoryType attribute, + * so the surface allocation code will not try to use it. + */ + AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), + + /** + * The driver does not support surface attributes at all. + * The surface allocation code will never pass them to surface allocation, + * and the results of the vaQuerySurfaceAttributes() call will be faked. + */ + AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), +}; + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers, unless the + * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user + * may need to refer to this field when performing any later + * operations using VAAPI with the same VADisplay. + */ + unsigned int driver_quirks; +} AVVAAPIDeviceContext; + +/** + * VAAPI-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVVAAPIFramesContext { + /** + * Set by the user to apply surface attributes to all surfaces in + * the frame pool. If null, default settings are used. + */ + VASurfaceAttrib *attributes; + int nb_attributes; + /** + * The surfaces IDs of all surfaces in the pool after creation. + * Only valid if AVHWFramesContext.initial_pool_size was positive. + * These are intended to be used as the render_targets arguments to + * vaCreateContext(). + */ + VASurfaceID *surface_ids; + int nb_surfaces; +} AVVAAPIFramesContext; + +/** + * VAAPI hardware pipeline configuration details. + * + * Allocated with av_hwdevice_hwconfig_alloc(). + */ +typedef struct AVVAAPIHWConfig { + /** + * ID of a VAAPI pipeline configuration. + */ + VAConfigID config_id; +} AVVAAPIHWConfig; + +#endif /* AVUTIL_HWCONTEXT_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vdpau.h new file mode 100644 index 0000000..1b7ea1e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_vdpau.h @@ -0,0 +1,44 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VDPAU_H +#define AVUTIL_HWCONTEXT_VDPAU_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VDPAU. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a VdpVideoSurface. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVDPAUDeviceContext { + VdpDevice device; + VdpGetProcAddress *get_proc_address; +} AVVDPAUDeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_videotoolbox.h new file mode 100644 index 0000000..380918d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/hwcontext_videotoolbox.h @@ -0,0 +1,54 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H +#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H + +#include + +#include + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX. + * + * This API currently does not support frame allocation, as the raw VideoToolbox + * API does allocation, and FFmpeg itself never has the need to allocate frames. + * + * If the API user sets a custom pool, AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef. + * + * Currently AVHWDeviceContext.hwctx and AVHWFramesContext.hwctx are always + * NULL. + */ + +/** + * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. + * Returns AV_PIX_FMT_NONE if no known equivalent was found. + */ +enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); + +/** + * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format. + * Returns 0 if no known equivalent was found. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); + +#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/imgutils.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/imgutils.h new file mode 100644 index 0000000..5b790ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/imgutils.h @@ -0,0 +1,277 @@ +/* + * 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 + */ + +#ifndef AVUTIL_IMGUTILS_H +#define AVUTIL_IMGUTILS_H + +/** + * @file + * misc image utilities + * + * @addtogroup lavu_picture + * @{ + */ + +#include "avutil.h" +#include "pixdesc.h" +#include "rational.h" + +/** + * Compute the max pixel step for each plane of an image with a + * format described by pixdesc. + * + * The pixel step is the distance in bytes between the first byte of + * the group of bytes which describe a pixel component and the first + * byte of the successive group in the same plane for the same + * component. + * + * @param max_pixsteps an array which is filled with the max pixel step + * for each plane. Since a plane may contain different pixel + * components, the computed max_pixsteps[plane] is relative to the + * component in the plane with the max pixel step. + * @param max_pixstep_comps an array which is filled with the component + * for each plane which has the max pixel step. May be NULL. + */ +void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], + const AVPixFmtDescriptor *pixdesc); + +/** + * Compute the size of an image line with format pix_fmt and width + * width for the plane plane. + * + * @return the computed size in bytes + */ +int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane); + +/** + * Fill plane linesizes for an image with pixel format pix_fmt and + * width width. + * + * @param linesizes array to be filled with the linesize for each plane + * @return >= 0 in case of success, a negative error code otherwise + */ +int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width); + +/** + * Fill plane data pointers for an image with pixel format pix_fmt and + * height height. + * + * @param data pointers array to be filled with the pointer for each image plane + * @param ptr the pointer to a buffer which will contain the image + * @param linesizes the array containing the linesize for each + * plane, should be filled by av_image_fill_linesizes() + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, + uint8_t *ptr, const int linesizes[4]); + +/** + * Allocate an image with size w and h and pixel format pix_fmt, and + * fill pointers and linesizes accordingly. + * The allocated image buffer has to be freed by using + * av_freep(&pointers[0]). + * + * @param align the value to use for buffer size alignment + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum AVPixelFormat pix_fmt, int align); + +/** + * Copy image plane from src to dst. + * That is, copy "height" number of lines of "bytewidth" bytes each. + * The first byte of each successive line is separated by *_linesize + * bytes. + * + * bytewidth must be contained by both absolute values of dst_linesize + * and src_linesize, otherwise the function behavior is undefined. + * + * @param dst_linesize linesize for the image plane in dst + * @param src_linesize linesize for the image plane in src + */ +void av_image_copy_plane(uint8_t *dst, int dst_linesize, + const uint8_t *src, int src_linesize, + int bytewidth, int height); + +/** + * Copy image in src_data to dst_data. + * + * @param dst_linesizes linesizes for the image in dst_data + * @param src_linesizes linesizes for the image in src_data + */ +void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], + const uint8_t *src_data[4], const int src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy(). + * + * The data pointers and the linesizes must be aligned to the maximum required + * by the CPU architecture. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy(). + * @note On x86, the linesizes currently need to be aligned to the cacheline + * size (i.e. 64) to get improved performance. + */ +void av_image_copy_uc_from(uint8_t *dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t *src_data[4], const ptrdiff_t src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Setup the data pointers and linesizes based on the specified image + * parameters and the provided array. + * + * The fields of the given image are filled in by using the src + * address which points to the image data buffer. Depending on the + * specified pixel format, one or multiple image data pointers and + * line sizes will be set. If a planar format is specified, several + * pointers will be set pointing to the different picture planes and + * the line sizes of the different planes will be stored in the + * lines_sizes array. Call with src == NULL to get the required + * size for the src buffer. + * + * To allocate the buffer and fill in the dst_data and dst_linesize in + * one call, use av_image_alloc(). + * + * @param dst_data data pointers to be filled in + * @param dst_linesize linesizes for the image in dst_data to be filled in + * @param src buffer which will contain or contains the actual image data, can be NULL + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the value used in src for linesize alignment + * @return the size in bytes required for src, a negative error code + * in case of failure + */ +int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], + const uint8_t *src, + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Return the size in bytes of the amount of data required to store an + * image with the given parameters. + * + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the assumed linesize alignment + * @return the buffer size in bytes, a negative error code in case of failure + */ +int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Copy image data from an image into a buffer. + * + * av_image_get_buffer_size() can be used to compute the required size + * for the buffer to fill. + * + * @param dst a buffer into which picture data will be copied + * @param dst_size the size in bytes of dst + * @param src_data pointers containing the source image data + * @param src_linesize linesizes for the image in src_data + * @param pix_fmt the pixel format of the source image + * @param width the width of the source image in pixels + * @param height the height of the source image in pixels + * @param align the assumed linesize alignment for dst + * @return the number of bytes written to dst, or a negative value + * (error code) on error + */ +int av_image_copy_to_buffer(uint8_t *dst, int dst_size, + const uint8_t * const src_data[4], const int src_linesize[4], + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of the image can be addressed with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of a plane of an image with the specified pix_fmt can be addressed + * with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param max_pixels the maximum number of pixels the user wants to accept + * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown. + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx); + +/** + * Check if the given sample aspect ratio of an image is valid. + * + * It is considered invalid if the denominator is 0 or if applying the ratio + * to the image size would make the smaller dimension less than 1. If the + * sar numerator is 0, it is considered unknown and will return as valid. + * + * @param w width of the image + * @param h height of the image + * @param sar sample aspect ratio of the image + * @return 0 if valid, a negative AVERROR code otherwise + */ +int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); + +/** + * Overwrite the image data with black. This is suitable for filling a + * sub-rectangle of an image, meaning the padding between the right most pixel + * and the left most pixel on the next line will not be overwritten. For some + * formats, the image size might be rounded up due to inherent alignment. + * + * If the pixel format has alpha, the alpha is cleared to opaque. + * + * This can return an error if the pixel format is not supported. Normally, all + * non-hwaccel pixel formats should be supported. + * + * Passing NULL for dst_data is allowed. Then the function returns whether the + * operation would have succeeded. (It can return an error if the pix_fmt is + * not supported.) + * + * @param dst_data data pointers to destination image + * @param dst_linesize linesizes for the destination image + * @param pix_fmt the pixel format of the image + * @param range the color range of the image (important for colorspaces such as YUV) + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return 0 if the image data was cleared, a negative AVERROR code otherwise + */ +int av_image_fill_black(uint8_t *dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, enum AVColorRange range, + int width, int height); + +/** + * @} + */ + + +#endif /* AVUTIL_IMGUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intfloat.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intfloat.h new file mode 100644 index 0000000..fe3d7ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intfloat.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_INTFLOAT_H +#define AVUTIL_INTFLOAT_H + +#include +#include "attributes.h" + +union av_intfloat32 { + uint32_t i; + float f; +}; + +union av_intfloat64 { + uint64_t i; + double f; +}; + +/** + * Reinterpret a 32-bit integer as a float. + */ +static av_always_inline float av_int2float(uint32_t i) +{ + union av_intfloat32 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a float as a 32-bit integer. + */ +static av_always_inline uint32_t av_float2int(float f) +{ + union av_intfloat32 v; + v.f = f; + return v.i; +} + +/** + * Reinterpret a 64-bit integer as a double. + */ +static av_always_inline double av_int2double(uint64_t i) +{ + union av_intfloat64 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a double as a 64-bit integer. + */ +static av_always_inline uint64_t av_double2int(double f) +{ + union av_intfloat64 v; + v.f = f; + return v.i; +} + +#endif /* AVUTIL_INTFLOAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intreadwrite.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intreadwrite.h new file mode 100644 index 0000000..4c8413a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/intreadwrite.h @@ -0,0 +1,644 @@ +/* + * 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 + */ + +#ifndef AVUTIL_INTREADWRITE_H +#define AVUTIL_INTREADWRITE_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" +#include "bswap.h" + +typedef union { + uint64_t u64; + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8 [8]; + double f64; + float f32[2]; +} av_alias av_alias64; + +typedef union { + uint32_t u32; + uint16_t u16[2]; + uint8_t u8 [4]; + float f32; +} av_alias av_alias32; + +typedef union { + uint16_t u16; + uint8_t u8 [2]; +} av_alias av_alias16; + +/* + * Arch-specific headers can provide any combination of + * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. + * + * R/W means read/write, B/L/N means big/little/native endianness. + * The following macros require aligned access, compared to their + * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A. + * Incorrect usage may range from abysmal performance to crash + * depending on the platform. + * + * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U. + */ + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/intreadwrite.h" +#elif ARCH_AVR32 +# include "avr32/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" +#elif ARCH_PPC +# include "ppc/intreadwrite.h" +#elif ARCH_TOMI +# include "tomi/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +/* + * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. + */ + +#if AV_HAVE_BIGENDIAN + +# if defined(AV_RN16) && !defined(AV_RB16) +# define AV_RB16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RB16) +# define AV_RN16(p) AV_RB16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WB16) +# define AV_WB16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WB16) +# define AV_WN16(p, v) AV_WB16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RB24) +# define AV_RB24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RB24) +# define AV_RN24(p) AV_RB24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WB24) +# define AV_WB24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WB24) +# define AV_WN24(p, v) AV_WB24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RB32) +# define AV_RB32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RB32) +# define AV_RN32(p) AV_RB32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WB32) +# define AV_WB32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WB32) +# define AV_WN32(p, v) AV_WB32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RB48) +# define AV_RB48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RB48) +# define AV_RN48(p) AV_RB48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WB48) +# define AV_WB48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WB48) +# define AV_WN48(p, v) AV_WB48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RB64) +# define AV_RB64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RB64) +# define AV_RN64(p) AV_RB64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WB64) +# define AV_WB64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WB64) +# define AV_WN64(p, v) AV_WB64(p, v) +# endif + +#else /* AV_HAVE_BIGENDIAN */ + +# if defined(AV_RN16) && !defined(AV_RL16) +# define AV_RL16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RL16) +# define AV_RN16(p) AV_RL16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WL16) +# define AV_WL16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WL16) +# define AV_WN16(p, v) AV_WL16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RL24) +# define AV_RL24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RL24) +# define AV_RN24(p) AV_RL24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WL24) +# define AV_WL24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WL24) +# define AV_WN24(p, v) AV_WL24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RL32) +# define AV_RL32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RL32) +# define AV_RN32(p) AV_RL32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WL32) +# define AV_WL32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WL32) +# define AV_WN32(p, v) AV_WL32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RL48) +# define AV_RL48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RL48) +# define AV_RN48(p) AV_RL48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WL48) +# define AV_WL48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WL48) +# define AV_WN48(p, v) AV_WL48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RL64) +# define AV_RL64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RL64) +# define AV_RN64(p) AV_RL64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WL64) +# define AV_WL64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WL64) +# define AV_WN64(p, v) AV_WL64(p, v) +# endif + +#endif /* !AV_HAVE_BIGENDIAN */ + +/* + * Define AV_[RW]N helper macros to simplify definitions not provided + * by per-arch headers. + */ + +#if defined(__GNUC__) + +union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; +union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; +union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; + +# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) +# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) + +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64) || defined(_M_ARM64)) && AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) +# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#else + +#ifndef AV_RB16 +# define AV_RB16(x) \ + ((((const uint8_t*)(x))[0] << 8) | \ + ((const uint8_t*)(x))[1]) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RL16 +# define AV_RL16(x) \ + ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RB32 +# define AV_RB32(x) \ + (((uint32_t)((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RL32 +# define AV_RL32(x) \ + (((uint32_t)((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RB64 +# define AV_RB64(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ + ((uint8_t*)(p))[5] = (d)>>16; \ + ((uint8_t*)(p))[4] = (d)>>24; \ + ((uint8_t*)(p))[3] = (d)>>32; \ + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; \ + } while(0) +#endif + +#ifndef AV_RL64 +# define AV_RL64(x) \ + (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; \ + } while(0) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RN(s, p) AV_RB##s(p) +# define AV_WN(s, p, v) AV_WB##s(p, v) +#else +# define AV_RN(s, p) AV_RL##s(p) +# define AV_WN(s, p, v) AV_WL##s(p, v) +#endif + +#endif /* HAVE_FAST_UNALIGNED */ + +#ifndef AV_RN16 +# define AV_RN16(p) AV_RN(16, p) +#endif + +#ifndef AV_RN32 +# define AV_RN32(p) AV_RN(32, p) +#endif + +#ifndef AV_RN64 +# define AV_RN64(p) AV_RN(64, p) +#endif + +#ifndef AV_WN16 +# define AV_WN16(p, v) AV_WN(16, p, v) +#endif + +#ifndef AV_WN32 +# define AV_WN32(p, v) AV_WN(32, p, v) +#endif + +#ifndef AV_WN64 +# define AV_WN64(p, v) AV_WN(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RB(s, p) AV_RN##s(p) +# define AV_WB(s, p, v) AV_WN##s(p, v) +# define AV_RL(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) +#else +# define AV_RB(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) +# define AV_RL(s, p) AV_RN##s(p) +# define AV_WL(s, p, v) AV_WN##s(p, v) +#endif + +#define AV_RB8(x) (((const uint8_t*)(x))[0]) +#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) + +#define AV_RL8(x) AV_RB8(x) +#define AV_WL8(p, d) AV_WB8(p, d) + +#ifndef AV_RB16 +# define AV_RB16(p) AV_RB(16, p) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, v) AV_WB(16, p, v) +#endif + +#ifndef AV_RL16 +# define AV_RL16(p) AV_RL(16, p) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, v) AV_WL(16, p, v) +#endif + +#ifndef AV_RB32 +# define AV_RB32(p) AV_RB(32, p) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, v) AV_WB(32, p, v) +#endif + +#ifndef AV_RL32 +# define AV_RL32(p) AV_RL(32, p) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, v) AV_WL(32, p, v) +#endif + +#ifndef AV_RB64 +# define AV_RB64(p) AV_RB(64, p) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, v) AV_WB(64, p, v) +#endif + +#ifndef AV_RL64 +# define AV_RL64(p) AV_RL(64, p) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, v) AV_WL(64, p, v) +#endif + +#ifndef AV_RB24 +# define AV_RB24(x) \ + ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[2]) +#endif +#ifndef AV_WB24 +# define AV_WB24(p, d) do { \ + ((uint8_t*)(p))[2] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[0] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RL24 +# define AV_RL24(x) \ + ((((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL24 +# define AV_WL24(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RB48 +# define AV_RB48(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 8) | \ + (uint64_t)((const uint8_t*)(x))[5]) +#endif +#ifndef AV_WB48 +# define AV_WB48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[5] = (d); \ + ((uint8_t*)(p))[4] = (d)>>8; \ + ((uint8_t*)(p))[3] = (d)>>16; \ + ((uint8_t*)(p))[2] = (d)>>24; \ + ((uint8_t*)(p))[1] = (d)>>32; \ + ((uint8_t*)(p))[0] = (d)>>40; \ + } while(0) +#endif + +#ifndef AV_RL48 +# define AV_RL48(x) \ + (((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL48 +# define AV_WL48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + } while(0) +#endif + +/* + * The AV_[RW]NA macros access naturally aligned data + * in a type-safe way. + */ + +#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s) +#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#ifndef AV_RN16A +# define AV_RN16A(p) AV_RNA(16, p) +#endif + +#ifndef AV_RN32A +# define AV_RN32A(p) AV_RNA(32, p) +#endif + +#ifndef AV_RN64A +# define AV_RN64A(p) AV_RNA(64, p) +#endif + +#ifndef AV_WN16A +# define AV_WN16A(p, v) AV_WNA(16, p, v) +#endif + +#ifndef AV_WN32A +# define AV_WN32A(p, v) AV_WNA(32, p, v) +#endif + +#ifndef AV_WN64A +# define AV_WN64A(p, v) AV_WNA(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RLA(s, p) av_bswap##s(AV_RN##s##A(p)) +# define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v)) +#else +# define AV_RLA(s, p) AV_RN##s##A(p) +# define AV_WLA(s, p, v) AV_WN##s##A(p, v) +#endif + +#ifndef AV_RL64A +# define AV_RL64A(p) AV_RLA(64, p) +#endif +#ifndef AV_WL64A +# define AV_WL64A(p, v) AV_WLA(64, p, v) +#endif + +/* + * The AV_COPYxxU macros are suitable for copying data to/from unaligned + * memory locations. + */ + +#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); + +#ifndef AV_COPY16U +# define AV_COPY16U(d, s) AV_COPYU(16, d, s) +#endif + +#ifndef AV_COPY32U +# define AV_COPY32U(d, s) AV_COPYU(32, d, s) +#endif + +#ifndef AV_COPY64U +# define AV_COPY64U(d, s) AV_COPYU(64, d, s) +#endif + +#ifndef AV_COPY128U +# define AV_COPY128U(d, s) \ + do { \ + AV_COPY64U(d, s); \ + AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \ + } while(0) +#endif + +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) \ + (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) + +#ifndef AV_COPY16 +# define AV_COPY16(d, s) AV_COPY(16, d, s) +#endif + +#ifndef AV_COPY32 +# define AV_COPY32(d, s) AV_COPY(32, d, s) +#endif + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) + +#ifndef AV_ZERO16 +# define AV_ZERO16(d) AV_ZERO(16, d) +#endif + +#ifndef AV_ZERO32 +# define AV_ZERO32(d) AV_ZERO(32, d) +#endif + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + +#endif /* AVUTIL_INTREADWRITE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lfg.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lfg.h new file mode 100644 index 0000000..03f779a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lfg.h @@ -0,0 +1,71 @@ +/* + * Lagged Fibonacci PRNG + * Copyright (c) 2008 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LFG_H +#define AVUTIL_LFG_H + +#include + +typedef struct AVLFG { + unsigned int state[64]; + int index; +} AVLFG; + +void av_lfg_init(AVLFG *c, unsigned int seed); + +/** + * Seed the state of the ALFG using binary data. + * + * Return value: 0 on success, negative value (AVERROR) on failure. + */ +int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); + +/** + * Get the next random unsigned 32-bit number using an ALFG. + * + * Please also consider a simple LCG like state= state*1664525+1013904223, + * it may be good enough and faster for your specific use case. + */ +static inline unsigned int av_lfg_get(AVLFG *c){ + c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + return c->state[c->index++ & 63]; +} + +/** + * Get the next random unsigned 32-bit number using a MLFG. + * + * Please also consider av_lfg_get() above, it is faster. + */ +static inline unsigned int av_mlfg_get(AVLFG *c){ + unsigned int a= c->state[(c->index-55) & 63]; + unsigned int b= c->state[(c->index-24) & 63]; + return c->state[c->index++ & 63] = 2*a*b+a+b; +} + +/** + * Get the next two numbers generated by a Box-Muller Gaussian + * generator using the random numbers issued by lfg. + * + * @param out array where the two generated numbers are placed + */ +void av_bmg_get(AVLFG *lfg, double out[2]); + +#endif /* AVUTIL_LFG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/log.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/log.h new file mode 100644 index 0000000..d9554e6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/log.h @@ -0,0 +1,362 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LOG_H +#define AVUTIL_LOG_H + +#include +#include "avutil.h" +#include "attributes.h" +#include "version.h" + +typedef enum { + AV_CLASS_CATEGORY_NA = 0, + AV_CLASS_CATEGORY_INPUT, + AV_CLASS_CATEGORY_OUTPUT, + AV_CLASS_CATEGORY_MUXER, + AV_CLASS_CATEGORY_DEMUXER, + AV_CLASS_CATEGORY_ENCODER, + AV_CLASS_CATEGORY_DECODER, + AV_CLASS_CATEGORY_FILTER, + AV_CLASS_CATEGORY_BITSTREAM_FILTER, + AV_CLASS_CATEGORY_SWSCALER, + AV_CLASS_CATEGORY_SWRESAMPLER, + AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, + AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT, + AV_CLASS_CATEGORY_NB ///< not part of ABI/API +}AVClassCategory; + +#define AV_IS_INPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) + +#define AV_IS_OUTPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) + +struct AVOptionRanges; + +/** + * Describe the class of an AVClass context structure. That is an + * arbitrary struct of which the first field is a pointer to an + * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). + */ +typedef struct AVClass { + /** + * The name of the class; usually it is the same name as the + * context structure type to which the AVClass is associated. + */ + const char* class_name; + + /** + * A pointer to a function which returns the name of a context + * instance ctx associated with the class. + */ + const char* (*item_name)(void* ctx); + + /** + * a pointer to the first option specified in the class if any or NULL + * + * @see av_set_default_options() + */ + const struct AVOption *option; + + /** + * LIBAVUTIL_VERSION with which this structure was created. + * This is used to allow fields to be added without requiring major + * version bumps everywhere. + */ + + int version; + + /** + * Offset in the structure where log_level_offset is stored. + * 0 means there is no such variable + */ + int log_level_offset_offset; + + /** + * Offset in the structure where a pointer to the parent context for + * logging is stored. For example a decoder could pass its AVCodecContext + * to eval as such a parent context, which an av_log() implementation + * could then leverage to display the parent context. + * The offset can be NULL. + */ + int parent_log_context_offset; + + /** + * Return next AVOptions-enabled child or NULL + */ + void* (*child_next)(void *obj, void *prev); + + /** + * Return an AVClass corresponding to the next potential + * AVOptions-enabled child. + * + * The difference between child_next and this is that + * child_next iterates over _already existing_ objects, while + * child_class_next iterates over _all possible_ children. + */ + const struct AVClass* (*child_class_next)(const struct AVClass *prev); + + /** + * Category used for visualization (like color) + * This is only set if the category is equal for all objects using this class. + * available since version (51 << 16 | 56 << 8 | 100) + */ + AVClassCategory category; + + /** + * Callback to return the category. + * available since version (51 << 16 | 59 << 8 | 100) + */ + AVClassCategory (*get_category)(void* ctx); + + /** + * Callback to return the supported/allowed ranges. + * available since version (52.12) + */ + int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); +} AVClass; + +/** + * @addtogroup lavu_log + * + * @{ + * + * @defgroup lavu_log_constants Logging Constants + * + * @{ + */ + +/** + * Print no output. + */ +#define AV_LOG_QUIET -8 + +/** + * Something went really wrong and we will crash now. + */ +#define AV_LOG_PANIC 0 + +/** + * Something went wrong and recovery is not possible. + * For example, no header was found for a format which depends + * on headers or an illegal combination of parameters is used. + */ +#define AV_LOG_FATAL 8 + +/** + * Something went wrong and cannot losslessly be recovered. + * However, not all future data is affected. + */ +#define AV_LOG_ERROR 16 + +/** + * Something somehow does not look correct. This may or may not + * lead to problems. An example would be the use of '-vstrict -2'. + */ +#define AV_LOG_WARNING 24 + +/** + * Standard information. + */ +#define AV_LOG_INFO 32 + +/** + * Detailed information. + */ +#define AV_LOG_VERBOSE 40 + +/** + * Stuff which is only useful for libav* developers. + */ +#define AV_LOG_DEBUG 48 + +/** + * Extremely verbose debugging, useful for libav* development. + */ +#define AV_LOG_TRACE 56 + +#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) + +/** + * @} + */ + +/** + * Sets additional colors for extended debugging sessions. + * @code + av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); + @endcode + * Requires 256color terminal support. Uses outside debugging is not + * recommended. + */ +#define AV_LOG_C(x) ((x) << 8) + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct or NULL if general log. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + */ +void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); + + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_vlog(void *avcl, int level, const char *fmt, va_list vl); + +/** + * Get the current log level + * + * @see lavu_log_constants + * + * @return Current log level + */ +int av_log_get_level(void); + +/** + * Set the log level + * + * @see lavu_log_constants + * + * @param level Logging level + */ +void av_log_set_level(int level); + +/** + * Set the logging callback + * + * @note The callback must be thread safe, even if the application does not use + * threads itself as some codecs are multithreaded. + * + * @see av_log_default_callback + * + * @param callback A logging function with a compatible signature. + */ +void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); + +/** + * Default logging callback + * + * It prints the message to stderr, optionally colorizing it. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_log_default_callback(void *avcl, int level, const char *fmt, + va_list vl); + +/** + * Return the context name + * + * @param ctx The AVClass context + * + * @return The AVClass class_name + */ +const char* av_default_item_name(void* ctx); +AVClassCategory av_default_get_category(void *ptr); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line + * @param line_size size of the buffer + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + */ +void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occurred, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Skip repeated messages, this requires the user app to use av_log() instead of + * (f)printf as the 2 would otherwise interfere and lead to + * "Last message repeated x times" messages below (f)printf messages with some + * bad luck. + * Also to receive the last, "last repeated" line if any, the user app must + * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end + */ +#define AV_LOG_SKIP_REPEATED 1 + +/** + * Include the log severity in messages originating from codecs. + * + * Results in messages such as: + * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts + */ +#define AV_LOG_PRINT_LEVEL 2 + +void av_log_set_flags(int arg); +int av_log_get_flags(void); + +/** + * @} + */ + +#endif /* AVUTIL_LOG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lzo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lzo.h new file mode 100644 index 0000000..c034039 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/lzo.h @@ -0,0 +1,66 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_LZO_H +#define AVUTIL_LZO_H + +/** + * @defgroup lavu_lzo LZO + * @ingroup lavu_crypto + * + * @{ + */ + +#include + +/** @name Error flags returned by av_lzo1x_decode + * @{ */ +/// end of the input buffer reached before decoding finished +#define AV_LZO_INPUT_DEPLETED 1 +/// decoded data did not fit into output buffer +#define AV_LZO_OUTPUT_FULL 2 +/// a reference to previously decoded data was wrong +#define AV_LZO_INVALID_BACKPTR 4 +/// a non-specific error in the compressed bitstream +#define AV_LZO_ERROR 8 +/** @} */ + +#define AV_LZO_INPUT_PADDING 8 +#define AV_LZO_OUTPUT_PADDING 12 + +/** + * @brief Decodes LZO 1x compressed data. + * @param out output buffer + * @param outlen size of output buffer, number of bytes left are returned here + * @param in input buffer + * @param inlen size of input buffer, number of bytes left are returned here + * @return 0 on success, otherwise a combination of the error flags above + * + * Make sure all buffers are appropriately padded, in must provide + * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. + */ +int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +/** + * @} + */ + +#endif /* AVUTIL_LZO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/macros.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/macros.h new file mode 100644 index 0000000..2007ee5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/macros.h @@ -0,0 +1,50 @@ +/* + * 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 + * @ingroup lavu + * Utility Preprocessor macros + */ + +#ifndef AVUTIL_MACROS_H +#define AVUTIL_MACROS_H + +/** + * @addtogroup preproc_misc Preprocessor String Macros + * + * String manipulation macros + * + * @{ + */ + +#define AV_STRINGIFY(s) AV_TOSTRING(s) +#define AV_TOSTRING(s) #s + +#define AV_GLUE(a, b) a ## b +#define AV_JOIN(a, b) AV_GLUE(a, b) + +/** + * @} + */ + +#define AV_PRAGMA(s) _Pragma(#s) + +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +#endif /* AVUTIL_MACROS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mastering_display_metadata.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mastering_display_metadata.h new file mode 100644 index 0000000..c23b07c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mastering_display_metadata.h @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2016 Neil Birkbeck + * + * 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 + */ + +#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H +#define AVUTIL_MASTERING_DISPLAY_METADATA_H + +#include "frame.h" +#include "rational.h" + + +/** + * Mastering display metadata capable of representing the color volume of + * the display used to master the content (SMPTE 2086:2014). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_mastering_display_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVMasteringDisplayMetadata { + /** + * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). + */ + AVRational display_primaries[3][2]; + + /** + * CIE 1931 xy chromaticity coords of white point. + */ + AVRational white_point[2]; + + /** + * Min luminance of mastering display (cd/m^2). + */ + AVRational min_luminance; + + /** + * Max luminance of mastering display (cd/m^2). + */ + AVRational max_luminance; + + /** + * Flag indicating whether the display primaries (and white point) are set. + */ + int has_primaries; + + /** + * Flag indicating whether the luminance (min_ and max_) have been set. + */ + int has_luminance; + +} AVMasteringDisplayMetadata; + +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); + +/** + * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVMasteringDisplayMetadata structure to be filled by caller. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); + +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mathematics.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mathematics.h new file mode 100644 index 0000000..5490180 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mathematics.h @@ -0,0 +1,242 @@ +/* + * copyright (c) 2005-2012 Michael Niedermayer + * + * 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 + * @addtogroup lavu_math + * Mathematical utilities for working with timestamp and time base. + */ + +#ifndef AVUTIL_MATHEMATICS_H +#define AVUTIL_MATHEMATICS_H + +#include +#include +#include "attributes.h" +#include "rational.h" +#include "intfloat.h" + +#ifndef M_E +#define M_E 2.7182818284590452354 /* e */ +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 /* log_e 2 */ +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 /* log_e 10 */ +#endif +#ifndef M_LOG2_10 +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ +#endif +#ifndef M_PHI +#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#ifndef NAN +#define NAN av_int2float(0x7fc00000) +#endif +#ifndef INFINITY +#define INFINITY av_int2float(0x7f800000) +#endif + +/** + * @addtogroup lavu_math + * + * @{ + */ + +/** + * Rounding methods. + */ +enum AVRounding { + AV_ROUND_ZERO = 0, ///< Round toward zero. + AV_ROUND_INF = 1, ///< Round away from zero. + AV_ROUND_DOWN = 2, ///< Round toward -infinity. + AV_ROUND_UP = 3, ///< Round toward +infinity. + AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. + /** + * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through + * unchanged, avoiding special cases for #AV_NOPTS_VALUE. + * + * Unlike other values of the enumeration AVRounding, this value is a + * bitmask that must be used in conjunction with another value of the + * enumeration through a bitwise OR, in order to set behavior for normal + * cases. + * + * @code{.c} + * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling 3: + * // Calculating 3 * 1 / 2 + * // 3 / 2 is rounded up to 2 + * // => 2 + * + * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling AV_NOPTS_VALUE: + * // AV_NOPTS_VALUE == INT64_MIN + * // AV_NOPTS_VALUE is passed through + * // => AV_NOPTS_VALUE + * @endcode + */ + AV_ROUND_PASS_MINMAX = 8192, +}; + +/** + * Compute the greatest common divisor of two integer operands. + * + * @param a,b Operands + * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; + * if a == 0 and b == 0, returns 0. + */ +int64_t av_const av_gcd(int64_t a, int64_t b); + +/** + * Rescale a 64-bit integer with rounding to nearest. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow. + * + * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; + +/** + * Rescale a 64-bit integer with specified rounding. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow, and does not support different rounding methods. + * + * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() + */ +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers with specified rounding. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q() + */ +int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, + enum AVRounding rnd) av_const; + +/** + * Compare two timestamps each in its own time base. + * + * @return One of the following values: + * - -1 if `ts_a` is before `ts_b` + * - 1 if `ts_a` is after `ts_b` + * - 0 if they represent the same position + * + * @warning + * The result of the function is undefined if one of the timestamps is outside + * the `int64_t` range when represented in the other's timebase. + */ +int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); + +/** + * Compare the remainders of two integer operands divided by a common divisor. + * + * In other words, compare the least significant `log2(mod)` bits of integers + * `a` and `b`. + * + * @code{.c} + * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) + * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) + * @endcode + * + * @param a,b Operands + * @param mod Divisor; must be a power of 2 + * @return + * - a negative value if `a % mod < b % mod` + * - a positive value if `a % mod > b % mod` + * - zero if `a % mod == b % mod` + */ +int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); + +/** + * Rescale a timestamp while preserving known durations. + * + * This function is designed to be called per audio packet to scale the input + * timestamp to a different time base. Compared to a simple av_rescale_q() + * call, this function is robust against possible inconsistent frame durations. + * + * The `last` parameter is a state variable that must be preserved for all + * subsequent calls for the same stream. For the first call, `*last` should be + * initialized to #AV_NOPTS_VALUE. + * + * @param[in] in_tb Input time base + * @param[in] in_ts Input timestamp + * @param[in] fs_tb Duration time base; typically this is finer-grained + * (greater) than `in_tb` and `out_tb` + * @param[in] duration Duration till the next call to this function (i.e. + * duration of the current packet/frame) + * @param[in,out] last Pointer to a timestamp expressed in terms of + * `fs_tb`, acting as a state variable + * @param[in] out_tb Output timebase + * @return Timestamp expressed in terms of `out_tb` + * + * @note In the context of this function, "duration" is in term of samples, not + * seconds. + */ +int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); + +/** + * Add a value to a timestamp. + * + * This function guarantees that when the same value is repeatly added that + * no accumulation of rounding errors occurs. + * + * @param[in] ts Input timestamp + * @param[in] ts_tb Input timestamp time base + * @param[in] inc Value to be added + * @param[in] inc_tb Time base of `inc` + */ +int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); + + +/** + * @} + */ + +#endif /* AVUTIL_MATHEMATICS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/md5.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/md5.h new file mode 100644 index 0000000..ca72ccb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/md5.h @@ -0,0 +1,98 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_md5 + * Public header for MD5 hash function implementation. + */ + +#ifndef AVUTIL_MD5_H +#define AVUTIL_MD5_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_md5 MD5 + * @ingroup lavu_hash + * MD5 hash function implementation. + * + * @{ + */ + +extern const int av_md5_size; + +struct AVMD5; + +/** + * Allocate an AVMD5 context. + */ +struct AVMD5 *av_md5_alloc(void); + +/** + * Initialize MD5 hashing. + * + * @param ctx pointer to the function context (of size av_md5_size) + */ +void av_md5_init(struct AVMD5 *ctx); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param src input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, int len); +#else +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param ctx hash function context + * @param dst buffer where output digest value is stored + */ +void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); + +/** + * Hash an array of data. + * + * @param dst The output buffer to write the digest into + * @param src The data to hash + * @param len The length of the data, in bytes + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len); +#else +void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len); +#endif + +/** + * @} + */ + +#endif /* AVUTIL_MD5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mem.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mem.h new file mode 100644 index 0000000..5fb1a02 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/mem.h @@ -0,0 +1,700 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_mem + * Memory handling functions + */ + +#ifndef AVUTIL_MEM_H +#define AVUTIL_MEM_H + +#include +#include + +#include "attributes.h" +#include "error.h" +#include "avutil.h" + +/** + * @addtogroup lavu_mem + * Utilities for manipulating memory. + * + * FFmpeg has several applications of memory that are not required of a typical + * program. For example, the computing-heavy components like video decoding and + * encoding can be sped up significantly through the use of aligned memory. + * + * However, for each of FFmpeg's applications of memory, there might not be a + * recognized or standardized API for that specific use. Memory alignment, for + * instance, varies wildly depending on operating systems, architectures, and + * compilers. Hence, this component of @ref libavutil is created to make + * dealing with memory consistently possible on all platforms. + * + * @{ + * + * @defgroup lavu_mem_macros Alignment Macros + * Helper macros for declaring aligned variables. + * @{ + */ + +/** + * @def DECLARE_ALIGNED(n,t,v) + * Declare a variable that is aligned in memory. + * + * @code{.c} + * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; + * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; + * + * // The default-alignment equivalent would be + * uint16_t aligned_int = 42; + * uint8_t aligned_array[128]; + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_ALIGNED(n,t,v) + * Declare an aligned variable appropriate for use in inline assembly code. + * + * @code{.c} + * DECLARE_ASM_ALIGNED(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_CONST(n,t,v) + * Declare a static constant aligned variable appropriate for use in inline + * assembly code. + * + * @code{.c} + * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +#if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v +#elif defined(__DJGPP__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v +#elif defined(__GNUC__) || defined(__clang__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v +#elif defined(_MSC_VER) + #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v +#else + #define DECLARE_ALIGNED(n,t,v) t v + #define DECLARE_ASM_ALIGNED(n,t,v) t v + #define DECLARE_ASM_CONST(n,t,v) static const t v +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_attrs Function Attributes + * Function attributes applicable to memory handling functions. + * + * These function attributes can help compilers emit more useful warnings, or + * generate better code. + * @{ + */ + +/** + * @def av_malloc_attrib + * Function attribute denoting a malloc-like function. + * + * @see Function attribute `malloc` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(3,1) + #define av_malloc_attrib __attribute__((__malloc__)) +#else + #define av_malloc_attrib +#endif + +/** + * @def av_alloc_size(...) + * Function attribute used on a function that allocates memory, whose size is + * given by the specified parameter(s). + * + * @code{.c} + * void *av_malloc(size_t size) av_alloc_size(1); + * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); + * @endcode + * + * @param ... One or two parameter indexes, separated by a comma + * + * @see Function attribute `alloc_size` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(4,3) + #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) +#else + #define av_alloc_size(...) +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_funcs Heap Management + * Functions responsible for allocating, freeing, and copying memory. + * + * All memory allocation functions have a built-in upper limit of `INT_MAX` + * bytes. This may be changed with av_max_alloc(), although exercise extreme + * caution when doing so. + * + * @{ + */ + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU). + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_mallocz() + */ +void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU) and zero all the bytes of the + * block. + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if it cannot be allocated + * @see av_malloc() + */ +void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block for an array with av_malloc(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of element + * @param size Size of a single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_malloc() + */ +av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size); + +/** + * Allocate a memory block for an array with av_mallocz(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of elements + * @param size Size of the single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * + * @see av_mallocz() + * @see av_malloc_array() + */ +av_alloc_size(1, 2) void *av_mallocz_array(size_t nmemb, size_t size); + +/** + * Non-inlined equivalent of av_mallocz_array(). + * + * Created for symmetry with the calloc() C function. + */ +void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; + +/** + * Allocate, reallocate, or free a block of memory. + * + * If `ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param size Size in bytes of the memory block to be allocated or + * reallocated + * + * @return Pointer to a newly-reallocated block or `NULL` if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be + * correctly aligned. + * @see av_fast_realloc() + * @see av_reallocp() + */ +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); + +/** + * Allocate, reallocate, or free a block of memory through a pointer to a + * pointer. + * + * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already allocated + * with av_realloc(), or a pointer to `NULL`. The pointer + * is updated on success, or freed on failure. + * @param[in] size Size in bytes for the memory block to be allocated or + * reallocated + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); + +/** + * Allocate, reallocate, or free a block of memory. + * + * This function does the same thing as av_realloc(), except: + * - It takes two size arguments and allocates `nelem * elsize` bytes, + * after checking the result of the multiplication for integer overflow. + * - It frees the input block in case of failure, thus avoiding the memory + * leak with the classic + * @code{.c} + * buf = realloc(buf); + * if (!buf) + * return -1; + * @endcode + * pattern. + */ +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); + +/** + * Allocate, reallocate, or free an array. + * + * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. If + * `nmemb` is zero, free the memory block pointed to by `ptr`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param nmemb Number of elements in the array + * @param size Size of the single element of the array + * + * @return Pointer to a newly-reallocated block or NULL if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + * @see av_reallocp_array() + */ +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Allocate, reallocate, or free an array through a pointer to a pointer. + * + * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. If `nmemb` is + * zero, free the memory block pointed to by `*ptr`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already + * allocated with av_realloc(), or a pointer to `NULL`. + * The pointer is updated on success, or freed on failure. + * @param[in] nmemb Number of elements + * @param[in] size Size of the single element + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +int av_reallocp_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the given buffer if it is not large enough, otherwise do nothing. + * + * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. + * + * If the given buffer is not large enough, and reallocation fails, `NULL` is + * returned and `*size` is set to 0, but the original buffer is not changed or + * freed. + * + * A typical use pattern follows: + * + * @code{.c} + * uint8_t *buf = ...; + * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); + * if (!new_buf) { + * // Allocation failed; clean up original buffer + * av_freep(&buf); + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Already allocated buffer, or `NULL` + * @param[in,out] size Pointer to the size of buffer `ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `ptr` + * @return `ptr` if the buffer is large enough, a pointer to newly reallocated + * buffer if the buffer was not large enough, or `NULL` in case of + * error + * @see av_realloc() + * @see av_fast_malloc() + */ +void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate a buffer, reusing the given one if large enough. + * + * Contrary to av_fast_realloc(), the current buffer contents might not be + * preserved and on error the old buffer is freed, thus no special handling to + * avoid memleaks is necessary. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @code{.c} + * uint8_t *buf = ...; + * av_fast_malloc(&buf, ¤t_size, size_needed); + * if (!buf) { + * // Allocation failed; buf already freed + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_realloc() + * @see av_fast_mallocz() + */ +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate and clear a buffer, reusing the given one if large enough. + * + * Like av_fast_malloc(), but all newly allocated space is initially cleared. + * Reused buffer is not cleared. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_fast_malloc() + */ +void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family. + * + * @param ptr Pointer to the memory block which should be freed. + * + * @note `ptr = NULL` is explicitly allowed. + * @note It is recommended that you use av_freep() instead, to prevent leaving + * behind dangling pointers. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family, and set the pointer pointing to it to `NULL`. + * + * @code{.c} + * uint8_t *buf = av_malloc(16); + * av_free(buf); + * // buf now contains a dangling pointer to freed memory, and accidental + * // dereference of buf will result in a use-after-free, which may be a + * // security risk. + * + * uint8_t *buf = av_malloc(16); + * av_freep(&buf); + * // buf is now NULL, and accidental dereference will only result in a + * // NULL-pointer dereference. + * @endcode + * + * @param ptr Pointer to the pointer to the memory block which should be freed + * @note `*ptr = NULL` is safe and leads to no action. + * @see av_free() + */ +void av_freep(void *ptr); + +/** + * Duplicate a string. + * + * @param s String to be duplicated + * @return Pointer to a newly-allocated string containing a + * copy of `s` or `NULL` if the string cannot be allocated + * @see av_strndup() + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Duplicate a substring of a string. + * + * @param s String to be duplicated + * @param len Maximum length of the resulting string (not counting the + * terminating byte) + * @return Pointer to a newly-allocated string containing a + * substring of `s` or `NULL` if the string cannot be allocated + */ +char *av_strndup(const char *s, size_t len) av_malloc_attrib; + +/** + * Duplicate a buffer with av_malloc(). + * + * @param p Buffer to be duplicated + * @param size Size in bytes of the buffer copied + * @return Pointer to a newly allocated buffer containing a + * copy of `p` or `NULL` if the buffer cannot be allocated + */ +void *av_memdup(const void *p, size_t size); + +/** + * Overlapping memcpy() implementation. + * + * @param dst Destination buffer + * @param back Number of bytes back to start copying (i.e. the initial size of + * the overlapping window); must be > 0 + * @param cnt Number of bytes to copy; must be >= 0 + * + * @note `cnt > back` is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of `back`. + */ +void av_memcpy_backptr(uint8_t *dst, int back, int cnt); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_dynarray Dynamic Array + * + * Utilities to make an array grow when needed. + * + * Sometimes, the programmer would want to have an array that can grow when + * needed. The libavutil dynamic array utilities fill that need. + * + * libavutil supports two systems of appending elements onto a dynamically + * allocated array, the first one storing the pointer to the value in the + * array, and the second storing the value directly. In both systems, the + * caller is responsible for maintaining a variable containing the length of + * the array, as well as freeing of the array after use. + * + * The first system stores pointers to values in a block of dynamically + * allocated memory. Since only pointers are stored, the function does not need + * to know the size of the type. Both av_dynarray_add() and + * av_dynarray_add_nofree() implement this system. + * + * @code + * type **array = NULL; //< an array of pointers to values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * av_dynarray_add(&array, &nb, &to_be_added); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * av_dynarray_add(&array, &nb, &to_be_added2); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // &to_be_added == array[0] + * // &to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * The second system stores the value directly in a block of memory. As a + * result, the function has to know the size of the type. av_dynarray2_add() + * implements this mechanism. + * + * @code + * type *array = NULL; //< an array of values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); + * if (!addr) + * return AVERROR(ENOMEM); + * memcpy(addr, &to_be_added, sizeof(to_be_added)); + * + * // Shortcut of the above. + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), + * (const void *)&to_be_added2); + * if (!addr) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // to_be_added == array[0] + * // to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * @{ + */ + +/** + * Add the pointer to an element to a dynamic array. + * + * The array to grow is supposed to be an array of pointers to + * structures, and the element to add must be a pointer to an already + * allocated structure. + * + * The array is reallocated when its size reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem Element to add + * @see av_dynarray_add_nofree(), av_dynarray2_add() + */ +void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element to a dynamic array. + * + * Function has the same functionality as av_dynarray_add(), + * but it doesn't free memory on fails. It returns error code + * instead and leave current buffer untouched. + * + * @return >=0 on success, negative otherwise + * @see av_dynarray_add(), av_dynarray2_add() + */ +av_warn_unused_result +int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element of size `elem_size` to a dynamic array. + * + * The array is reallocated when its number of elements reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem_size Size in bytes of an element in the array + * @param[in] elem_data Pointer to the data of the element to add. If + * `NULL`, the space of the newly added element is + * allocated but left uninitialized. + * + * @return Pointer to the data of the element to copy in the newly allocated + * space + * @see av_dynarray_add(), av_dynarray_add_nofree() + */ +void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, + const uint8_t *elem_data); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_misc Miscellaneous Functions + * + * Other functions related to memory allocation. + * + * @{ + */ + +/** + * Multiply two `size_t` values checking for overflow. + * + * @param[in] a,b Operands of multiplication + * @param[out] r Pointer to the result of the operation + * @return 0 on success, AVERROR(EINVAL) on overflow + */ +static inline int av_size_mult(size_t a, size_t b, size_t *r) +{ + size_t t = a * b; + /* Hack inspired from glibc: don't try the division if nelem and elsize + * are both less than sqrt(SIZE_MAX). */ + if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) + return AVERROR(EINVAL); + *r = t; + return 0; +} + +/** + * Set the maximum size that may be allocated in one block. + * + * The value specified with this function is effective for all libavutil's @ref + * lavu_mem_funcs "heap management functions." + * + * By default, the max value is defined as `INT_MAX`. + * + * @param max Value to be set as the new maximum size + * + * @warning Exercise extreme caution when using this function. Don't touch + * this if you do not understand the full consequence of doing so. + */ +void av_max_alloc(size_t max); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_MEM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/motion_vector.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/motion_vector.h new file mode 100644 index 0000000..ec29556 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/motion_vector.h @@ -0,0 +1,57 @@ +/* + * 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 + */ + +#ifndef AVUTIL_MOTION_VECTOR_H +#define AVUTIL_MOTION_VECTOR_H + +#include + +typedef struct AVMotionVector { + /** + * Where the current macroblock comes from; negative value when it comes + * from the past, positive value when it comes from the future. + * XXX: set exact relative ref frame reference instead of a +/- 1 "direction". + */ + int32_t source; + /** + * Width and height of the block. + */ + uint8_t w, h; + /** + * Absolute source position. Can be outside the frame area. + */ + int16_t src_x, src_y; + /** + * Absolute destination position. Can be outside the frame area. + */ + int16_t dst_x, dst_y; + /** + * Extra flag information. + * Currently unused. + */ + uint64_t flags; + /** + * Motion vector + * src_x = dst_x + motion_x / motion_scale + * src_y = dst_y + motion_y / motion_scale + */ + int32_t motion_x, motion_y; + uint16_t motion_scale; +} AVMotionVector; + +#endif /* AVUTIL_MOTION_VECTOR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/murmur3.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/murmur3.h new file mode 100644 index 0000000..1b09175 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/murmur3.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_murmur3 + * Public header for MurmurHash3 hash function implementation. + */ + +#ifndef AVUTIL_MURMUR3_H +#define AVUTIL_MURMUR3_H + +#include + +#include "version.h" + +/** + * @defgroup lavu_murmur3 Murmur3 + * @ingroup lavu_hash + * MurmurHash3 hash function implementation. + * + * MurmurHash3 is a non-cryptographic hash function, of which three + * incompatible versions were created by its inventor Austin Appleby: + * + * - 32-bit output + * - 128-bit output for 32-bit platforms + * - 128-bit output for 64-bit platforms + * + * FFmpeg only implements the last variant: 128-bit output designed for 64-bit + * platforms. Even though the hash function was designed for 64-bit platforms, + * the function in reality works on 32-bit systems too, only with reduced + * performance. + * + * @anchor lavu_murmur3_seedinfo + * By design, MurmurHash3 requires a seed to operate. In response to this, + * libavutil provides two functions for hash initiation, one that requires a + * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer + * as the seed, and therefore does not (av_murmur3_init()). + * + * To make hashes comparable, you should provide the same seed for all calls to + * this hash function -- if you are supplying one yourself, that is. + * + * @{ + */ + +/** + * Allocate an AVMurMur3 hash context. + * + * @return Uninitialized hash context or `NULL` in case of error + */ +struct AVMurMur3 *av_murmur3_alloc(void); + +/** + * Initialize or reinitialize an AVMurMur3 hash context with a seed. + * + * @param[out] c Hash context + * @param[in] seed Random seed + * + * @see av_murmur3_init() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed); + +/** + * Initialize or reinitialize an AVMurMur3 hash context. + * + * Equivalent to av_murmur3_init_seeded() with a built-in seed. + * + * @param[out] c Hash context + * + * @see av_murmur3_init_seeded() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init(struct AVMurMur3 *c); + +/** + * Update hash context with new data. + * + * @param[out] c Hash context + * @param[in] src Input data to update hash with + * @param[in] len Number of bytes to read from `src` + */ +#if FF_API_CRYPTO_SIZE_T +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len); +#else +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param[in,out] c Hash context + * @param[out] dst Buffer where output digest value is stored + */ +void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]); + +/** + * @} + */ + +#endif /* AVUTIL_MURMUR3_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/opt.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/opt.h new file mode 100644 index 0000000..39f4a8d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/opt.h @@ -0,0 +1,865 @@ +/* + * AVOptions + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_OPT_H +#define AVUTIL_OPT_H + +/** + * @file + * AVOptions + */ + +#include "rational.h" +#include "avutil.h" +#include "dict.h" +#include "log.h" +#include "pixfmt.h" +#include "samplefmt.h" +#include "version.h" + +/** + * @defgroup avoptions AVOptions + * @ingroup lavu_data + * @{ + * AVOptions provide a generic system to declare options on arbitrary structs + * ("objects"). An option can have a help text, a type and a range of possible + * values. Options may then be enumerated, read and written to. + * + * @section avoptions_implement Implementing AVOptions + * This section describes how to add AVOptions capabilities to a struct. + * + * All AVOptions-related information is stored in an AVClass. Therefore + * the first member of the struct should be a pointer to an AVClass describing it. + * The option field of the AVClass must be set to a NULL-terminated static array + * of AVOptions. Each AVOption must have a non-empty name, a type, a default + * value and for number-type AVOptions also a range of allowed values. It must + * also declare an offset in bytes from the start of the struct, where the field + * associated with this AVOption is located. Other fields in the AVOption struct + * should also be set when applicable, but are not required. + * + * The following example illustrates an AVOptions-enabled struct: + * @code + * typedef struct test_struct { + * const AVClass *class; + * int int_opt; + * char *str_opt; + * uint8_t *bin_opt; + * int bin_len; + * } test_struct; + * + * static const AVOption test_options[] = { + * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt), + * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX }, + * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt), + * AV_OPT_TYPE_STRING }, + * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt), + * AV_OPT_TYPE_BINARY }, + * { NULL }, + * }; + * + * static const AVClass test_class = { + * .class_name = "test class", + * .item_name = av_default_item_name, + * .option = test_options, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * @endcode + * + * Next, when allocating your struct, you must ensure that the AVClass pointer + * is set to the correct value. Then, av_opt_set_defaults() can be called to + * initialize defaults. After that the struct is ready to be used with the + * AVOptions API. + * + * When cleaning up, you may use the av_opt_free() function to automatically + * free all the allocated string and binary options. + * + * Continuing with the above example: + * + * @code + * test_struct *alloc_test_struct(void) + * { + * test_struct *ret = av_mallocz(sizeof(*ret)); + * ret->class = &test_class; + * av_opt_set_defaults(ret); + * return ret; + * } + * void free_test_struct(test_struct **foo) + * { + * av_opt_free(*foo); + * av_freep(foo); + * } + * @endcode + * + * @subsection avoptions_implement_nesting Nesting + * It may happen that an AVOptions-enabled struct contains another + * AVOptions-enabled struct as a member (e.g. AVCodecContext in + * libavcodec exports generic options, while its priv_data field exports + * codec-specific options). In such a case, it is possible to set up the + * parent struct to export a child's options. To do that, simply + * implement AVClass.child_next() and AVClass.child_class_next() in the + * parent struct's AVClass. + * Assuming that the test_struct from above now also contains a + * child_struct field: + * + * @code + * typedef struct child_struct { + * AVClass *class; + * int flags_opt; + * } child_struct; + * static const AVOption child_opts[] = { + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX }, + * { NULL }, + * }; + * static const AVClass child_class = { + * .class_name = "child class", + * .item_name = av_default_item_name, + * .option = child_opts, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * + * void *child_next(void *obj, void *prev) + * { + * test_struct *t = obj; + * if (!prev && t->child_struct) + * return t->child_struct; + * return NULL + * } + * const AVClass child_class_next(const AVClass *prev) + * { + * return prev ? NULL : &child_class; + * } + * @endcode + * Putting child_next() and child_class_next() as defined above into + * test_class will now make child_struct's options accessible through + * test_struct (again, proper setup as described above needs to be done on + * child_struct right after it is created). + * + * From the above example it might not be clear why both child_next() + * and child_class_next() are needed. The distinction is that child_next() + * iterates over actually existing objects, while child_class_next() + * iterates over all possible child classes. E.g. if an AVCodecContext + * was initialized to use a codec which has private options, then its + * child_next() will return AVCodecContext.priv_data and finish + * iterating. OTOH child_class_next() on AVCodecContext.av_class will + * iterate over all available codecs with private options. + * + * @subsection avoptions_implement_named_constants Named constants + * It is possible to create named constants for options. Simply set the unit + * field of the option the constants should apply to a string and + * create the constants themselves as options of type AV_OPT_TYPE_CONST + * with their unit field set to the same string. + * Their default_val field should contain the value of the named + * constant. + * For example, to add some named constants for the test_flags option + * above, put the following into the child_opts array: + * @code + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" }, + * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" }, + * @endcode + * + * @section avoptions_use Using AVOptions + * This section deals with accessing options in an AVOptions-enabled struct. + * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or + * AVFormatContext in libavformat. + * + * @subsection avoptions_use_examine Examining AVOptions + * The basic functions for examining options are av_opt_next(), which iterates + * over all options defined for one object, and av_opt_find(), which searches + * for an option with the given name. + * + * The situation is more complicated with nesting. An AVOptions-enabled struct + * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag + * to av_opt_find() will make the function search children recursively. + * + * For enumerating there are basically two cases. The first is when you want to + * get all options that may potentially exist on the struct and its children + * (e.g. when constructing documentation). In that case you should call + * av_opt_child_class_next() recursively on the parent struct's AVClass. The + * second case is when you have an already initialized struct with all its + * children and you want to get all options that can be actually written or read + * from it. In that case you should call av_opt_child_next() recursively (and + * av_opt_next() on each result). + * + * @subsection avoptions_use_get_set Reading and writing AVOptions + * When setting options, you often have a string read directly from the + * user. In such a case, simply passing it to av_opt_set() is enough. For + * non-string type options, av_opt_set() will parse the string according to the + * option type. + * + * Similarly av_opt_get() will read any option type and convert it to a string + * which will be returned. Do not forget that the string is allocated, so you + * have to free it with av_free(). + * + * In some cases it may be more convenient to put all options into an + * AVDictionary and call av_opt_set_dict() on it. A specific case of this + * are the format/codec open functions in lavf/lavc which take a dictionary + * filled with option as a parameter. This makes it possible to set some options + * that cannot be set otherwise, since e.g. the input file format is not known + * before the file is actually opened. + */ + +enum AVOptionType{ + AV_OPT_TYPE_FLAGS, + AV_OPT_TYPE_INT, + AV_OPT_TYPE_INT64, + AV_OPT_TYPE_DOUBLE, + AV_OPT_TYPE_FLOAT, + AV_OPT_TYPE_STRING, + AV_OPT_TYPE_RATIONAL, + AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length + AV_OPT_TYPE_DICT, + AV_OPT_TYPE_UINT64, + AV_OPT_TYPE_CONST, + AV_OPT_TYPE_IMAGE_SIZE, ///< offset must point to two consecutive integers + AV_OPT_TYPE_PIXEL_FMT, + AV_OPT_TYPE_SAMPLE_FMT, + AV_OPT_TYPE_VIDEO_RATE, ///< offset must point to AVRational + AV_OPT_TYPE_DURATION, + AV_OPT_TYPE_COLOR, + AV_OPT_TYPE_CHANNEL_LAYOUT, + AV_OPT_TYPE_BOOL, +}; + +/** + * AVOption + */ +typedef struct AVOption { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + union { + int64_t i64; + double dbl; + const char *str; + /* TODO those are unused now */ + AVRational q; + } default_val; + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +/** + * The option is intended for exporting values to the caller. + */ +#define AV_OPT_FLAG_EXPORT 64 +/** + * The option may not be set through the AVOptions API, only read. + * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. + */ +#define AV_OPT_FLAG_READONLY 128 +#define AV_OPT_FLAG_BSF_PARAM (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering +#define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering +#define AV_OPT_FLAG_DEPRECATED (1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information +//FIXME think about enc-audio, ... style flags + + /** + * The logical unit to which the option belongs. Non-constant + * options and corresponding named constants share the same + * unit. May be NULL. + */ + const char *unit; +} AVOption; + +/** + * A single allowed range of values, or a single allowed value. + */ +typedef struct AVOptionRange { + const char *str; + /** + * Value range. + * For string ranges this represents the min/max length. + * For dimensions this represents the min/max pixel count or width/height in multi-component case. + */ + double value_min, value_max; + /** + * Value's component range. + * For string this represents the unicode range for chars, 0-127 limits to ASCII. + */ + double component_min, component_max; + /** + * Range flag. + * If set to 1 the struct encodes a range, if set to 0 a single value. + */ + int is_range; +} AVOptionRange; + +/** + * List of AVOptionRange structs. + */ +typedef struct AVOptionRanges { + /** + * Array of option ranges. + * + * Most of option types use just one component. + * Following describes multi-component option types: + * + * AV_OPT_TYPE_IMAGE_SIZE: + * component index 0: range of pixel count (width * height). + * component index 1: range of width. + * component index 2: range of height. + * + * @note To obtain multi-component version of this structure, user must + * provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or + * av_opt_query_ranges_default function. + * + * Multi-component range can be read as in following example: + * + * @code + * int range_index, component_index; + * AVOptionRanges *ranges; + * AVOptionRange *range[3]; //may require more than 3 in the future. + * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE); + * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) { + * for (component_index = 0; component_index < ranges->nb_components; component_index++) + * range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index]; + * //do something with range here. + * } + * av_opt_freep_ranges(&ranges); + * @endcode + */ + AVOptionRange **range; + /** + * Number of ranges per component. + */ + int nb_ranges; + /** + * Number of componentes. + */ + int nb_components; +} AVOptionRanges; + +/** + * Show the obj options. + * + * @param req_flags requested flags for the options to show. Show only the + * options for which it is opt->flags & req_flags. + * @param rej_flags rejected flags for the options to show. Show only the + * options for which it is !(opt->flags & req_flags). + * @param av_log_obj log context to use for showing the options + */ +int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); + +/** + * Set the values of all AVOption fields to their default values. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + */ +void av_opt_set_defaults(void *s); + +/** + * Set the values of all AVOption fields to their default values. Only these + * AVOption fields for which (opt->flags & mask) == flags will have their + * default applied to s. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + * @param mask combination of AV_OPT_FLAG_* + * @param flags combination of AV_OPT_FLAG_* + */ +void av_opt_set_defaults2(void *s, int mask, int flags); + +/** + * Parse the key/value pairs list in opts. For each key/value pair + * found, stores the value in the field in ctx that is named like the + * key. ctx must be an AVClass context, storing is done using + * AVOptions. + * + * @param opts options string to parse, may be NULL + * @param key_val_sep a 0-terminated list of characters used to + * separate key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @return the number of successfully set key/value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_opt_set() if a key/value pair + * cannot be set + */ +int av_set_options_string(void *ctx, const char *opts, + const char *key_val_sep, const char *pairs_sep); + +/** + * Parse the key-value pairs list in opts. For each key=value pair found, + * set the value of the corresponding option in ctx. + * + * @param ctx the AVClass object to set options on + * @param opts the options string, key-value pairs separated by a + * delimiter + * @param shorthand a NULL-terminated array of options names for shorthand + * notation: if the first field in opts has no key part, + * the key is taken from the first element of shorthand; + * then again for the second, etc., until either opts is + * finished, shorthand is finished or a named option is + * found; after that, all options must be named + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @return the number of successfully set key=value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_set_string3() if a key/value pair + * cannot be set + * + * Options names must use only the following characters: a-z A-Z 0-9 - . / _ + * Separators must use characters distinct from option names and from each + * other. + */ +int av_opt_set_from_string(void *ctx, const char *opts, + const char *const *shorthand, + const char *key_val_sep, const char *pairs_sep); +/** + * Free all allocated objects in obj. + */ +void av_opt_free(void *obj); + +/** + * Check whether a particular flag is set in a flags field. + * + * @param field_name the name of the flag field option + * @param flag_name the name of the flag to check + * @return non-zero if the flag is set, zero if the flag isn't set, + * isn't of the right type, or the flags field doesn't exist. + */ +int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict(void *obj, struct AVDictionary **options); + + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags); + +/** + * Extract a key-value pair from the beginning of a string. + * + * @param ropts pointer to the options string, will be updated to + * point to the rest of the string (one of the pairs_sep + * or the final NUL) + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @param flags flags; see the AV_OPT_FLAG_* values below + * @param rkey parsed key; must be freed using av_free() + * @param rval parsed value; must be freed using av_free() + * + * @return >=0 for success, or a negative value corresponding to an + * AVERROR code in case of error; in particular: + * AVERROR(EINVAL) if no key is present + * + */ +int av_opt_get_key_value(const char **ropts, + const char *key_val_sep, const char *pairs_sep, + unsigned flags, + char **rkey, char **rval); + +enum { + + /** + * Accept to parse a value without a key; the key will then be returned + * as NULL. + */ + AV_OPT_FLAG_IMPLICIT_KEY = 1, +}; + +/** + * @defgroup opt_eval_funcs Evaluating option strings + * @{ + * This group of functions can be used to evaluate option strings + * and get numbers out of them. They do the same thing as av_opt_set(), + * except the result is written into the caller-supplied pointer. + * + * @param obj a struct whose first element is a pointer to AVClass. + * @param o an option for which the string is to be evaluated. + * @param val string to be evaluated. + * @param *_out value of the string will be written here. + * + * @return 0 on success, a negative number on failure. + */ +int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out); +int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out); +int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out); +int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out); +int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out); +int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out); +/** + * @} + */ + +#define AV_OPT_SEARCH_CHILDREN (1 << 0) /**< Search in possible children of the + given object first. */ +/** + * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass + * instead of a required pointer to a struct containing AVClass. This is + * useful for searching for options without needing to allocate the corresponding + * object. + */ +#define AV_OPT_SEARCH_FAKE_OBJ (1 << 1) + +/** + * In av_opt_get, return NULL if the option has a pointer type and is set to NULL, + * rather than returning an empty string. + */ +#define AV_OPT_ALLOW_NULL (1 << 2) + +/** + * Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than + * one component for certain option types. + * @see AVOptionRanges for details. + */ +#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12) + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return A pointer to the option found, or NULL if no option + * was found. + * + * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable + * directly with av_opt_set(). Use special calls which take an options + * AVDictionary (e.g. avformat_open_input()) to set options found with this + * flag. + */ +const AVOption *av_opt_find(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags); + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * @param[out] target_obj if non-NULL, an object to which the option belongs will be + * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present + * in search_flags. This parameter is ignored if search_flags contain + * AV_OPT_SEARCH_FAKE_OBJ. + * + * @return A pointer to the option found, or NULL if no option + * was found. + */ +const AVOption *av_opt_find2(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags, void **target_obj); + +/** + * Iterate over all AVOptions belonging to obj. + * + * @param obj an AVOptions-enabled struct or a double pointer to an + * AVClass describing it. + * @param prev result of the previous call to av_opt_next() on this object + * or NULL + * @return next AVOption or NULL + */ +const AVOption *av_opt_next(const void *obj, const AVOption *prev); + +/** + * Iterate over AVOptions-enabled children of obj. + * + * @param prev result of a previous call to this function or NULL + * @return next AVOptions-enabled child or NULL + */ +void *av_opt_child_next(void *obj, void *prev); + +/** + * Iterate over potential AVOptions-enabled children of parent. + * + * @param prev result of a previous call to this function or NULL + * @return AVClass corresponding to next potential child or NULL + */ +const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev); + +/** + * @defgroup opt_set_funcs Option setting functions + * @{ + * Those functions set the field of obj with the given name to value. + * + * @param[in] obj A struct whose first element is a pointer to an AVClass. + * @param[in] name the name of the field to set + * @param[in] val The value to set. In case of av_opt_set() if the field is not + * of a string type, then the given string is parsed. + * SI postfixes and some named scalars are supported. + * If the field is of a numeric type, it has to be a numeric or named + * scalar. Behavior with more than one scalar and +- infix operators + * is undefined. + * If the field is of a flags type, it has to be a sequence of numeric + * scalars or named flags separated by '+' or '-'. Prefixing a flag + * with '+' causes it to be set without affecting the other flags; + * similarly, '-' unsets a flag. + * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be set on a child of obj. + * + * @return 0 if the value has been set, or an AVERROR code in case of + * error: + * AVERROR_OPTION_NOT_FOUND if no matching option exists + * AVERROR(ERANGE) if the value is out of range + * AVERROR(EINVAL) if the value is not valid + */ +int av_opt_set (void *obj, const char *name, const char *val, int search_flags); +int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); +int av_opt_set_double (void *obj, const char *name, double val, int search_flags); +int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); +int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags); +int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags); +int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags); +int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags); +/** + * @note Any old dictionary present is discarded and replaced with a copy of the new one. The + * caller still owns val is and responsible for freeing it. + */ +int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags); + +/** + * Set a binary option to an integer list. + * + * @param obj AVClass object to set options on + * @param name name of the binary option + * @param val pointer to an integer list (must have the correct type with + * regard to the contents of the list) + * @param term list terminator (usually 0 or -1) + * @param flags search flags + */ +#define av_opt_set_int_list(obj, name, val, term, flags) \ + (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \ + AVERROR(EINVAL) : \ + av_opt_set_bin(obj, name, (const uint8_t *)(val), \ + av_int_list_length(val, term) * sizeof(*(val)), flags)) + +/** + * @} + */ + +/** + * @defgroup opt_get_funcs Option getting functions + * @{ + * Those functions get a value of the option with the given name from an object. + * + * @param[in] obj a struct whose first element is a pointer to an AVClass. + * @param[in] name name of the option to get. + * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be found in a child of obj. + * @param[out] out_val value of the option will be written here + * @return >=0 on success, a negative error code otherwise + */ +/** + * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller + * + * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the option has + * AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will be set + * to NULL instead of an allocated empty string. + */ +int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val); +int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val); +int av_opt_get_double (void *obj, const char *name, int search_flags, double *out_val); +int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out); +int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt); +int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt); +int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *ch_layout); +/** + * @param[out] out_val The returned dictionary is a copy of the actual value and must + * be freed with av_dict_free() by the caller + */ +int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); +/** + * @} + */ +/** + * Gets a pointer to the requested field in a struct. + * This function allows accessing a struct even when its fields are moved or + * renamed since the application making the access has been compiled, + * + * @returns a pointer to the field, it can be cast to the correct type and read + * or written to. + */ +void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name); + +/** + * Free an AVOptionRanges struct and set it to NULL. + */ +void av_opt_freep_ranges(AVOptionRanges **ranges); + +/** + * Get a list of allowed ranges for the given option. + * + * The returned list may depend on other fields in obj like for example profile. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_freep_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Copy options from src object into dest object. + * + * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object. + * Original memory allocated for such options is freed unless both src and dest options points to the same memory. + * + * @param dest Object to copy from + * @param src Object to copy into + * @return 0 on success, negative on error + */ +int av_opt_copy(void *dest, const void *src); + +/** + * Get a default list of allowed ranges for the given option. + * + * This list is constructed without using the AVClass.query_ranges() callback + * and can be used as fallback from within the callback. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_free_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Check if given option is set to its default value. + * + * Options o must belong to the obj. This function must not be called to check child's options state. + * @see av_opt_is_set_to_default_by_name(). + * + * @param obj AVClass object to check option on + * @param o option to be checked + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default(void *obj, const AVOption *o); + +/** + * Check if given option is set to its default value. + * + * @param obj AVClass object to check option on + * @param name option name + * @param search_flags combination of AV_OPT_SEARCH_* + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags); + + +#define AV_OPT_SERIALIZE_SKIP_DEFAULTS 0x00000001 ///< Serialize options that are not set to default values only. +#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT 0x00000002 ///< Serialize options that exactly match opt_flags only. + +/** + * Serialize object's options. + * + * Create a string containing object's serialized options. + * Such string may be passed back to av_opt_set_from_string() in order to restore option values. + * A key/value or pairs separator occurring in the serialized value or + * name string are escaped through the av_escape() function. + * + * @param[in] obj AVClass object to serialize + * @param[in] opt_flags serialize options with all the specified flags set (AV_OPT_FLAG) + * @param[in] flags combination of AV_OPT_SERIALIZE_* flags + * @param[out] buffer Pointer to buffer that will be allocated with string containg serialized options. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, + const char key_val_sep, const char pairs_sep); +/** + * @} + */ + +#endif /* AVUTIL_OPT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/parseutils.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/parseutils.h new file mode 100644 index 0000000..e66d24b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/parseutils.h @@ -0,0 +1,193 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PARSEUTILS_H +#define AVUTIL_PARSEUTILS_H + +#include + +#include "rational.h" + +/** + * @file + * misc parsing utilities + */ + +/** + * Parse str and store the parsed ratio in q. + * + * Note that a ratio with infinite (1/0) or negative value is + * considered valid, so you should check on the returned value if you + * want to exclude those values. + * + * The undefined value can be expressed using the "0:0" string. + * + * @param[in,out] q pointer to the AVRational which will contain the ratio + * @param[in] str the string to parse: it has to be a string in the format + * num:den, a float number or an expression + * @param[in] max the maximum allowed numerator and denominator + * @param[in] log_offset log level offset which is applied to the log + * level of log_ctx + * @param[in] log_ctx parent logging context + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_ratio(AVRational *q, const char *str, int max, + int log_offset, void *log_ctx); + +#define av_parse_ratio_quiet(rate, str, max) \ + av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL) + +/** + * Parse str and put in width_ptr and height_ptr the detected values. + * + * @param[in,out] width_ptr pointer to the variable which will contain the detected + * width value + * @param[in,out] height_ptr pointer to the variable which will contain the detected + * height value + * @param[in] str the string to parse: it has to be a string in the format + * width x height or a valid video size abbreviation. + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str); + +/** + * Parse str and store the detected values in *rate. + * + * @param[in,out] rate pointer to the AVRational which will contain the detected + * frame rate + * @param[in] str the string to parse: it has to be a string in the format + * rate_num / rate_den, a float number or a valid video rate abbreviation + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_rate(AVRational *rate, const char *str); + +/** + * Put the RGBA values that correspond to color_string in rgba_color. + * + * @param color_string a string specifying a color. It can be the name of + * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, + * possibly followed by "@" and a string representing the alpha + * component. + * The alpha component may be a string composed by "0x" followed by an + * hexadecimal number or a decimal number between 0.0 and 1.0, which + * represents the opacity value (0x00/0.0 means completely transparent, + * 0xff/1.0 completely opaque). + * If the alpha component is not specified then 0xff is assumed. + * The string "random" will result in a random color. + * @param slen length of the initial part of color_string containing the + * color. It can be set to -1 if color_string is a null terminated string + * containing nothing else than the color. + * @return >= 0 in case of success, a negative value in case of + * failure (for example if color_string cannot be parsed). + */ +int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, + void *log_ctx); + +/** + * Get the name of a color from the internal table of hard-coded named + * colors. + * + * This function is meant to enumerate the color names recognized by + * av_parse_color(). + * + * @param color_idx index of the requested color, starting from 0 + * @param rgbp if not NULL, will point to a 3-elements array with the color value in RGB + * @return the color name string or NULL if color_idx is not in the array + */ +const char *av_get_known_color_name(int color_idx, const uint8_t **rgb); + +/** + * Parse timestr and return in *time a corresponding number of + * microseconds. + * + * @param timeval puts here the number of microseconds corresponding + * to the string in timestr. If the string represents a duration, it + * is the number of microseconds contained in the time interval. If + * the string is a date, is the number of microseconds since 1st of + * January, 1970 up to the time of the parsed date. If timestr cannot + * be successfully parsed, set *time to INT64_MIN. + + * @param timestr a string representing a date or a duration. + * - If a date the syntax is: + * @code + * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m...]]]}|{HHMMSS[.m...]]]}}[Z] + * now + * @endcode + * If the value is "now" it takes the current time. + * Time is local time unless Z is appended, in which case it is + * interpreted as UTC. + * If the year-month-day part is not specified it takes the current + * year-month-day. + * - If a duration the syntax is: + * @code + * [-][HH:]MM:SS[.m...] + * [-]S+[.m...] + * @endcode + * @param duration flag which tells how to interpret timestr, if not + * zero timestr is interpreted as a duration, otherwise as a date + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_parse_time(int64_t *timeval, const char *timestr, int duration); + +/** + * Attempt to find a specific tag in a URL. + * + * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. + * Return 1 if found. + */ +int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); + +/** + * Simplified version of strptime + * + * Parse the input string p according to the format string fmt and + * store its results in the structure dt. + * This implementation supports only a subset of the formats supported + * by the standard strptime(). + * + * The supported input field descriptors are listed below. + * - %H: the hour as a decimal number, using a 24-hour clock, in the + * range '00' through '23' + * - %J: hours as a decimal number, in the range '0' through INT_MAX + * - %M: the minute as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %S: the second as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %Y: the year as a decimal number, using the Gregorian calendar + * - %m: the month as a decimal number, in the range '1' through '12' + * - %d: the day of the month as a decimal number, in the range '1' + * through '31' + * - %T: alias for '%H:%M:%S' + * - %%: a literal '%' + * + * @return a pointer to the first character not processed in this function + * call. In case the input string contains more characters than + * required by the format string the return value points right after + * the last consumed input character. In case the whole input string + * is consumed the return value points to the null byte at the end of + * the string. On failure NULL is returned. + */ +char *av_small_strptime(const char *p, const char *fmt, struct tm *dt); + +/** + * Convert the decomposed UTC time in tm to a time_t value. + */ +time_t av_timegm(struct tm *tm); + +#endif /* AVUTIL_PARSEUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixdesc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixdesc.h new file mode 100644 index 0000000..c055810 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixdesc.h @@ -0,0 +1,440 @@ +/* + * pixel format descriptor + * Copyright (c) 2009 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_PIXDESC_H +#define AVUTIL_PIXDESC_H + +#include + +#include "attributes.h" +#include "pixfmt.h" +#include "version.h" + +typedef struct AVComponentDescriptor { + /** + * Which of the 4 planes contains the component. + */ + int plane; + + /** + * Number of elements between 2 horizontally consecutive pixels. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int step; + + /** + * Number of elements before the component of the first pixel. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int offset; + + /** + * Number of least significant bits that must be shifted away + * to get the value. + */ + int shift; + + /** + * Number of bits in the component. + */ + int depth; + +#if FF_API_PLUS1_MINUS1 + /** deprecated, use step instead */ + attribute_deprecated int step_minus1; + + /** deprecated, use depth instead */ + attribute_deprecated int depth_minus1; + + /** deprecated, use offset instead */ + attribute_deprecated int offset_plus1; +#endif +} AVComponentDescriptor; + +/** + * Descriptor that unambiguously describes how the bits of a pixel are + * stored in the up to 4 data planes of an image. It also stores the + * subsampling factors and number of components. + * + * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV + * and all the YUV variants) AVPixFmtDescriptor just stores how values + * are stored not what these values represent. + */ +typedef struct AVPixFmtDescriptor { + const char *name; + uint8_t nb_components; ///< The number of components each pixel has, (1-4) + + /** + * Amount to shift the luma width right to find the chroma width. + * For YV12 this is 1 for example. + * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_w; + + /** + * Amount to shift the luma height right to find the chroma height. + * For YV12 this is 1 for example. + * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_h; + + /** + * Combination of AV_PIX_FMT_FLAG_... flags. + */ + uint64_t flags; + + /** + * Parameters that describe how pixels are packed. + * If the format has 1 or 2 components, then luma is 0. + * If the format has 3 or 4 components: + * if the RGB flag is set then 0 is red, 1 is green and 2 is blue; + * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V. + * + * If present, the Alpha channel is always the last component. + */ + AVComponentDescriptor comp[4]; + + /** + * Alternative comma-separated names. + */ + const char *alias; +} AVPixFmtDescriptor; + +/** + * Pixel format is big-endian. + */ +#define AV_PIX_FMT_FLAG_BE (1 << 0) +/** + * Pixel format has a palette in data[1], values are indexes in this palette. + */ +#define AV_PIX_FMT_FLAG_PAL (1 << 1) +/** + * All values of a component are bit-wise packed end to end. + */ +#define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2) +/** + * Pixel format is an HW accelerated format. + */ +#define AV_PIX_FMT_FLAG_HWACCEL (1 << 3) +/** + * At least one pixel component is not in the first data plane. + */ +#define AV_PIX_FMT_FLAG_PLANAR (1 << 4) +/** + * The pixel format contains RGB-like data (as opposed to YUV/grayscale). + */ +#define AV_PIX_FMT_FLAG_RGB (1 << 5) + +/** + * The pixel format is "pseudo-paletted". This means that it contains a + * fixed palette in the 2nd plane but the palette is fixed/constant for each + * PIX_FMT. This allows interpreting the data as if it was PAL8, which can + * in some cases be simpler. Or the data can be interpreted purely based on + * the pixel format without using the palette. + * An example of a pseudo-paletted format is AV_PIX_FMT_GRAY8 + * + * @deprecated This flag is deprecated, and will be removed. When it is removed, + * the extra palette allocation in AVFrame.data[1] is removed as well. Only + * actual paletted formats (as indicated by AV_PIX_FMT_FLAG_PAL) will have a + * palette. Starting with FFmpeg versions which have this flag deprecated, the + * extra "pseudo" palette is already ignored, and API users are not required to + * allocate a palette for AV_PIX_FMT_FLAG_PSEUDOPAL formats (it was required + * before the deprecation, though). + */ +#define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6) + +/** + * The pixel format has an alpha channel. This is set on all formats that + * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always + * straight, never pre-multiplied. + * + * If a codec or a filter does not support alpha, it should set all alpha to + * opaque, or use the equivalent pixel formats without alpha component, e.g. + * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA. + */ +#define AV_PIX_FMT_FLAG_ALPHA (1 << 7) + +/** + * The pixel format is following a Bayer pattern + */ +#define AV_PIX_FMT_FLAG_BAYER (1 << 8) + +/** + * The pixel format contains IEEE-754 floating point values. Precision (double, + * single, or half) should be determined by the pixel size (64, 32, or 16 bits). + */ +#define AV_PIX_FMT_FLAG_FLOAT (1 << 9) + +/** + * Return the number of bits per pixel used by the pixel format + * described by pixdesc. Note that this is not the same as the number + * of bits per sample. + * + * The returned number of bits refers to the number of bits actually + * used for storing the pixel information, that is padding bits are + * not counted. + */ +int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * Return the number of bits per pixel for the pixel format + * described by pixdesc, including any padding or unused bits. + */ +int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * @return a pixel format descriptor for provided pixel format or NULL if + * this pixel format is unknown. + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt); + +/** + * Iterate over all pixel format descriptors known to libavutil. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev); + +/** + * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc + * is not a valid pointer to a pixel format descriptor. + */ +enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); + +/** + * Utility function to access log2_chroma_w log2_chroma_h from + * the pixel format AVPixFmtDescriptor. + * + * @param[in] pix_fmt the pixel format + * @param[out] h_shift store log2_chroma_w (horizontal/width shift) + * @param[out] v_shift store log2_chroma_h (vertical/height shift) + * + * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format + */ +int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, + int *h_shift, int *v_shift); + +/** + * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a + * valid pixel format. + */ +int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); + +/** + * @return the name for provided color range or NULL if unknown. + */ +const char *av_color_range_name(enum AVColorRange range); + +/** + * @return the AVColorRange value for name or an AVError if not found. + */ +int av_color_range_from_name(const char *name); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the AVColorPrimaries value for name or an AVError if not found. + */ +int av_color_primaries_from_name(const char *name); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the AVColorTransferCharacteristic value for name or an AVError if not found. + */ +int av_color_transfer_from_name(const char *name); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the AVColorSpace value for name or an AVError if not found. + */ +int av_color_space_from_name(const char *name); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * @return the AVChromaLocation value for name or an AVError if not found. + */ +int av_chroma_location_from_name(const char *name); + +/** + * Return the pixel format corresponding to name. + * + * If there is no pixel format with name name, then looks for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first looks for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. + */ +enum AVPixelFormat av_get_pix_fmt(const char *name); + +/** + * Return the short name for a pixel format, NULL in case pix_fmt is + * unknown. + * + * @see av_get_pix_fmt(), av_get_pix_fmt_string() + */ +const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); + +/** + * Print in buf the string corresponding to the pixel format with + * number pix_fmt, or a header if pix_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param pix_fmt the number of the pixel format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + */ +char *av_get_pix_fmt_string(char *buf, int buf_size, + enum AVPixelFormat pix_fmt); + +/** + * Read a line from an image, and write the values of the + * pixel format component c to dst. + * + * @param data the array containing the pointers to the planes of the image + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to read + * @param y the vertical coordinate of the first pixel to read + * @param w the width of the line to read, that is the number of + * values to write to dst + * @param read_pal_component if not zero and the format is a paletted + * format writes the values corresponding to the palette + * component c in data[1] to dst, rather than the palette indexes in + * data[0]. The behavior is undefined if the format is not paletted. + * @param dst_element_size size of elements in dst array (2 or 4 byte) + */ +void av_read_image_line2(void *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component, + int dst_element_size); + +void av_read_image_line(uint16_t *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component); + +/** + * Write the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + * @param src_element_size size of elements in src array (2 or 4 byte) + */ +void av_write_image_line2(const void *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int src_element_size); + +void av_write_image_line(const uint16_t *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w); + +/** + * Utility function to swap the endianness of a pixel format. + * + * @param[in] pix_fmt the pixel format + * + * @return pixel format with swapped endianness if it exists, + * otherwise AV_PIX_FMT_NONE + */ +enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt); + +#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */ +#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */ +#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */ +#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */ +#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */ +#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */ + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, + enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +#endif /* AVUTIL_PIXDESC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixelutils.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixelutils.h new file mode 100644 index 0000000..a8dbc15 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/pixelutils.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PIXELUTILS_H +#define AVUTIL_PIXELUTILS_H + +#include +#include +#include "common.h" + +/** + * Sum of abs(src1[x] - src2[x]) + */ +typedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, + const uint8_t *src2, ptrdiff_t stride2); + +/** + * Get a potentially optimized pointer to a Sum-of-absolute-differences + * function (see the av_pixelutils_sad_fn prototype). + * + * @param w_bits 1< + * + * 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 + */ + +#ifndef AVUTIL_PIXFMT_H +#define AVUTIL_PIXFMT_H + +/** + * @file + * pixel format definitions + */ + +#include "libavutil/avconfig.h" +#include "version.h" + +#define AVPALETTE_SIZE 1024 +#define AVPALETTE_COUNT 256 + +/** + * Pixel format. + * + * @note + * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA + * color is put together as: + * (A << 24) | (R << 16) | (G << 8) | B + * This is stored as BGRA on little-endian CPU architectures and ARGB on + * big-endian CPUs. + * + * @note + * If the resolution is not a multiple of the chroma subsampling factor + * then the chroma plane resolution must be rounded up. + * + * @par + * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized + * image data is stored in AVFrame.data[0]. The palette is transported in + * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is + * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is + * also endian-specific). Note also that the individual RGB32 palette + * components stored in AVFrame.data[1] should be in the range 0..255. + * This is important as many custom PAL8 video codecs that were designed + * to run on the IBM VGA graphics adapter use 6-bit palette components. + * + * @par + * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like + * for pal8. This palette is filled in automatically by the function + * allocating the picture. + */ +enum AVPixelFormat { + AV_PIX_FMT_NONE = -1, + AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) + AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... + AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... + AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) + AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) + AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) + AV_PIX_FMT_GRAY8, ///< Y , 8bpp + AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_PAL8, ///< 8 bits with AV_PIX_FMT_RGB32 palette + AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range + AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range + AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range + AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 + AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) + AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) + AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) + AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) + AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped + + AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... + AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... + AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... + AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... + + AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian + AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian + AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) + AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range + AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) + AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian + + AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian + AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian + AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined + + AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian + AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian + AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined + +#if FF_API_VAAPI + /** @name Deprecated pixel formats */ + /**@{*/ + AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers + AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers + AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID + /**@}*/ + AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD, +#else + /** + * Hardware acceleration through VA-API, data[3] contains a + * VASurfaceID. + */ + AV_PIX_FMT_VAAPI, +#endif + + AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer + + AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha + + AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + + AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian + + /** + * The following 12 formats have the disadvantage of needing 1 format for each bit depth. + * Notice that each 9/10 bits sample is stored in 16 bits with extra padding. + * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. + */ + AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp + AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP + AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian + AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian + AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian + AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian + AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian + AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) + AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) + AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian + AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian + AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + + AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface + + AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + + AV_PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + AV_PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + + AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + + AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) + AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (little-endian) + + AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp + AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian + AV_PIX_FMT_GBRAP16LE, ///< planar GBRA 4:4:4:4 64bpp, little-endian + /** + * HW acceleration through QSV, data[3] contains a pointer to the + * mfxFrameSurface1 structure. + */ + AV_PIX_FMT_QSV, + /** + * HW acceleration though MMAL, data[3] contains a pointer to the + * MMAL_BUFFER_HEADER_T structure. + */ + AV_PIX_FMT_MMAL, + + AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + + AV_PIX_FMT_0RGB, ///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined + AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined + AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined + AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined + + AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big-endian + AV_PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little-endian + AV_PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big-endian + AV_PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little-endian + AV_PIX_FMT_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range + + AV_PIX_FMT_BAYER_BGGR8, ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_RGGB8, ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GBRG8, ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GRBG8, ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */ + + AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing + + AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + + AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox + + AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian + + AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian + + AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian + AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian + + AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec + + AV_PIX_FMT_GRAY12BE, ///< Y , 12bpp, big-endian + AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian + AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian + AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian + + AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian + AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian + + /** + * Hardware surfaces for Direct3D11. + * + * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 + * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. + * + * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the + * texture array index of the frame as intptr_t if the ID3D11Texture2D is + * an array texture (or always 0 if it's a normal texture). + */ + AV_PIX_FMT_D3D11, + + AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian + AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian + + AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian + AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian + AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian + AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + + /** + * DRM-managed buffers exposed through PRIME buffer sharing. + * + * data[0] points to an AVDRMFrameDescriptor. + */ + AV_PIX_FMT_DRM_PRIME, + /** + * Hardware surfaces for OpenCL. + * + * data[i] contain 2D image objects (typed in C as cl_mem, used + * in OpenCL as image2d_t) for each plane of the surface. + */ + AV_PIX_FMT_OPENCL, + + AV_PIX_FMT_GRAY14BE, ///< Y , 14bpp, big-endian + AV_PIX_FMT_GRAY14LE, ///< Y , 14bpp, little-endian + + AV_PIX_FMT_GRAYF32BE, ///< IEEE-754 single precision Y, 32bpp, big-endian + AV_PIX_FMT_GRAYF32LE, ///< IEEE-754 single precision Y, 32bpp, little-endian + + AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian + AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian + + AV_PIX_FMT_NV24, ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV42, ///< as above, but U and V bytes are swapped + + AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions +}; + +#if AV_HAVE_BIGENDIAN +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be +#else +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le +#endif + +#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA) +#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR) +#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA) +#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB) +#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) +#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) + +#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) +#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) +#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) +#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE) +#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) +#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) +#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) +#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE) +#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE) +#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE) +#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE) +#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE) +#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE) +#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE) +#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE) +#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE) + +#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE) +#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE) +#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE) +#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE) +#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE) +#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE) +#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE) +#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE) +#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE) +#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE) +#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE) +#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE) +#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE) +#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE) +#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE) +#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE) +#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE) + +#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE) +#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE) +#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) +#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) +#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) +#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) +#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) +#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) + +#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) +#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE) +#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) +#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) + +#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) +#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) + +#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE) + +#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) +#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) +#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) +#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) +#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) +#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) +#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE) +#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE) +#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) +#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) +#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) + +#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) +#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) +#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) +#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) +#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) + +/** + * Chromaticity coordinates of the source primaries. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. + */ +enum AVColorPrimaries { + AVCOL_PRI_RESERVED0 = 0, + AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + AVCOL_PRI_UNSPECIFIED = 2, + AVCOL_PRI_RESERVED = 3, + AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above + AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C + AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 + AVCOL_PRI_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + AVCOL_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors + AVCOL_PRI_NB ///< Not part of ABI +}; + +/** + * Color Transfer Characteristic. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. + */ +enum AVColorTransferCharacteristic { + AVCOL_TRC_RESERVED0 = 0, + AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED = 2, + AVCOL_TRC_RESERVED = 3, + AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC + AVCOL_TRC_SMPTE240M = 7, + AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics" + AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" + AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" + AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 + AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut + AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) + AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10-bit system + AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12-bit system + AVCOL_TRC_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, + AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI +}; + +/** + * YUV colorspace type. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. + */ +enum AVColorSpace { + AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) + AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + AVCOL_SPC_UNSPECIFIED = 2, + AVCOL_SPC_RESERVED = 3, + AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_SPC_SMPTE240M = 7, ///< functionally identical to above + AVCOL_SPC_YCGCO = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, + AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system + AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system + AVCOL_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + AVCOL_SPC_NB ///< Not part of ABI +}; + +/** + * MPEG vs JPEG YUV range. + */ +enum AVColorRange { + AVCOL_RANGE_UNSPECIFIED = 0, + AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges + AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges + AVCOL_RANGE_NB ///< Not part of ABI +}; + +/** + * Location of chroma samples. + * + * Illustration showing the location of the first (top left) chroma sample of the + * image, the left shows only luma, the right + * shows the location of the chroma sample, the 2 could be imagined to overlay + * each other but are drawn separately due to limitations of ASCII + * + * 1st 2nd 1st 2nd horizontal luma sample positions + * v v v v + * ______ ______ + *1st luma line > |X X ... |3 4 X ... X are luma samples, + * | |1 2 1-6 are possible chroma positions + *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position + */ +enum AVChromaLocation { + AVCHROMA_LOC_UNSPECIFIED = 0, + AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 + AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 + AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 + AVCHROMA_LOC_TOP = 4, + AVCHROMA_LOC_BOTTOMLEFT = 5, + AVCHROMA_LOC_BOTTOM = 6, + AVCHROMA_LOC_NB ///< Not part of ABI +}; + +#endif /* AVUTIL_PIXFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/random_seed.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/random_seed.h new file mode 100644 index 0000000..0462a04 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/random_seed.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009 Baptiste Coudurier + * + * 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 + */ + +#ifndef AVUTIL_RANDOM_SEED_H +#define AVUTIL_RANDOM_SEED_H + +#include +/** + * @addtogroup lavu_crypto + * @{ + */ + +/** + * Get a seed to use in conjunction with random functions. + * This function tries to provide a good seed at a best effort bases. + * Its possible to call this function multiple times if more bits are needed. + * It can be quite slow, which is why it should only be used as seed for a faster + * PRNG. The quality of the seed depends on the platform. + */ +uint32_t av_get_random_seed(void); + +/** + * @} + */ + +#endif /* AVUTIL_RANDOM_SEED_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rational.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rational.h new file mode 100644 index 0000000..5c6b67b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rational.h @@ -0,0 +1,214 @@ +/* + * rational numbers + * Copyright (c) 2003 Michael Niedermayer + * + * 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 + * @ingroup lavu_math_rational + * Utilties for rational number calculation. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_RATIONAL_H +#define AVUTIL_RATIONAL_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_math_rational AVRational + * @ingroup lavu_math + * Rational number calculation. + * + * While rational numbers can be expressed as floating-point numbers, the + * conversion process is a lossy one, so are floating-point operations. On the + * other hand, the nature of FFmpeg demands highly accurate calculation of + * timestamps. This set of rational number utilities serves as a generic + * interface for manipulating rational numbers as pairs of numerators and + * denominators. + * + * Many of the functions that operate on AVRational's have the suffix `_q`, in + * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * rational numbers. + * + * @{ + */ + +/** + * Rational number (pair of numerator and denominator). + */ +typedef struct AVRational{ + int num; ///< Numerator + int den; ///< Denominator +} AVRational; + +/** + * Create an AVRational. + * + * Useful for compilers that do not support compound literals. + * + * @note The return value is not reduced. + * @see av_reduce() + */ +static inline AVRational av_make_q(int num, int den) +{ + AVRational r = { num, den }; + return r; +} + +/** + * Compare two rationals. + * + * @param a First rational + * @param b Second rational + * + * @return One of the following values: + * - 0 if `a == b` + * - 1 if `a > b` + * - -1 if `a < b` + * - `INT_MIN` if one of the values is of the form `0 / 0` + */ +static inline int av_cmp_q(AVRational a, AVRational b){ + const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; + + if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1; + else if(b.den && a.den) return 0; + else if(a.num && b.num) return (a.num>>31) - (b.num>>31); + else return INT_MIN; +} + +/** + * Convert an AVRational to a `double`. + * @param a AVRational to convert + * @return `a` in floating-point form + * @see av_d2q() + */ +static inline double av_q2d(AVRational a){ + return a.num / (double) a.den; +} + +/** + * Reduce a fraction. + * + * This is useful for framerate calculations. + * + * @param[out] dst_num Destination numerator + * @param[out] dst_den Destination denominator + * @param[in] num Source numerator + * @param[in] den Source denominator + * @param[in] max Maximum allowed values for `dst_num` & `dst_den` + * @return 1 if the operation is exact, 0 otherwise + */ +int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); + +/** + * Multiply two rationals. + * @param b First rational + * @param c Second rational + * @return b*c + */ +AVRational av_mul_q(AVRational b, AVRational c) av_const; + +/** + * Divide one rational by another. + * @param b First rational + * @param c Second rational + * @return b/c + */ +AVRational av_div_q(AVRational b, AVRational c) av_const; + +/** + * Add two rationals. + * @param b First rational + * @param c Second rational + * @return b+c + */ +AVRational av_add_q(AVRational b, AVRational c) av_const; + +/** + * Subtract one rational from another. + * @param b First rational + * @param c Second rational + * @return b-c + */ +AVRational av_sub_q(AVRational b, AVRational c) av_const; + +/** + * Invert a rational. + * @param q value + * @return 1 / q + */ +static av_always_inline AVRational av_inv_q(AVRational q) +{ + AVRational r = { q.den, q.num }; + return r; +} + +/** + * Convert a double precision floating point number to a rational. + * + * In case of infinity, the returned value is expressed as `{1, 0}` or + * `{-1, 0}` depending on the sign. + * + * @param d `double` to convert + * @param max Maximum allowed numerator and denominator + * @return `d` in AVRational form + * @see av_q2d() + */ +AVRational av_d2q(double d, int max) av_const; + +/** + * Find which of the two rationals is closer to another rational. + * + * @param q Rational to be compared against + * @param q1,q2 Rationals to be tested + * @return One of the following values: + * - 1 if `q1` is nearer to `q` than `q2` + * - -1 if `q2` is nearer to `q` than `q1` + * - 0 if they have the same distance + */ +int av_nearer_q(AVRational q, AVRational q1, AVRational q2); + +/** + * Find the value in a list of rationals nearest a given reference rational. + * + * @param q Reference rational + * @param q_list Array of rationals terminated by `{0, 0}` + * @return Index of the nearest value found in the array + */ +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); + +/** + * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point + * format. + * + * @param q Rational to be converted + * @return Equivalent floating-point value, expressed as an unsigned 32-bit + * integer. + * @note The returned value is platform-indepedant. + */ +uint32_t av_q2intfloat(AVRational q); + +/** + * @} + */ + +#endif /* AVUTIL_RATIONAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rc4.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rc4.h new file mode 100644 index 0000000..029cd2a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/rc4.h @@ -0,0 +1,66 @@ +/* + * RC4 encryption/decryption/pseudo-random number generator + * + * 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 + */ + +#ifndef AVUTIL_RC4_H +#define AVUTIL_RC4_H + +#include + +/** + * @defgroup lavu_rc4 RC4 + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVRC4 { + uint8_t state[256]; + int x, y; +} AVRC4; + +/** + * Allocate an AVRC4 context. + */ +AVRC4 *av_rc4_alloc(void); + +/** + * @brief Initializes an AVRC4 context. + * + * @param key_bits must be a multiple of 8 + * @param decrypt 0 for encryption, 1 for decryption, currently has no effect + * @return zero on success, negative value otherwise + */ +int av_rc4_init(struct AVRC4 *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the RC4 algorithm. + * + * @param count number of bytes + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst, may be NULL + * @param iv not (yet) used for RC4, should be NULL + * @param decrypt 0 for encryption, 1 for decryption, not (yet) used + */ +void av_rc4_crypt(struct AVRC4 *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_RC4_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/replaygain.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/replaygain.h new file mode 100644 index 0000000..b49bf1a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/replaygain.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVUTIL_REPLAYGAIN_H +#define AVUTIL_REPLAYGAIN_H + +#include + +/** + * ReplayGain information (see + * http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification). + * The size of this struct is a part of the public ABI. + */ +typedef struct AVReplayGain { + /** + * Track replay gain in microbels (divide by 100000 to get the value in dB). + * Should be set to INT32_MIN when unknown. + */ + int32_t track_gain; + /** + * Peak track amplitude, with 100000 representing full scale (but values + * may overflow). 0 when unknown. + */ + uint32_t track_peak; + /** + * Same as track_gain, but for the whole album. + */ + int32_t album_gain; + /** + * Same as track_peak, but for the whole album, + */ + uint32_t album_peak; +} AVReplayGain; + +#endif /* AVUTIL_REPLAYGAIN_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ripemd.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ripemd.h new file mode 100644 index 0000000..0db6858 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/ripemd.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_ripemd + * Public header for RIPEMD hash function implementation. + */ + +#ifndef AVUTIL_RIPEMD_H +#define AVUTIL_RIPEMD_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_ripemd RIPEMD + * @ingroup lavu_hash + * RIPEMD hash function implementation. + * + * @{ + */ + +extern const int av_ripemd_size; + +struct AVRIPEMD; + +/** + * Allocate an AVRIPEMD context. + */ +struct AVRIPEMD *av_ripemd_alloc(void); + +/** + * Initialize RIPEMD hashing. + * + * @param context pointer to the function context (of size av_ripemd_size) + * @param bits number of bits in digest (128, 160, 256 or 320 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_ripemd_init(struct AVRIPEMD* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, unsigned int len); +#else +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_ripemd_final(struct AVRIPEMD* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_RIPEMD_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/samplefmt.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/samplefmt.h new file mode 100644 index 0000000..8cd43ae --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/samplefmt.h @@ -0,0 +1,272 @@ +/* + * 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 + */ + +#ifndef AVUTIL_SAMPLEFMT_H +#define AVUTIL_SAMPLEFMT_H + +#include + +#include "avutil.h" +#include "attributes.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_sampfmts Audio sample formats + * + * Audio sample format enumeration and related convenience functions. + * @{ + */ + +/** + * Audio sample formats + * + * - The data described by the sample format is always in native-endian order. + * Sample values can be expressed by native C types, hence the lack of a signed + * 24-bit sample format even though it is a common raw audio data format. + * + * - The floating-point formats are based on full volume being in the range + * [-1.0, 1.0]. Any values outside this range are beyond full volume level. + * + * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg + * (such as AVFrame in libavcodec) is as follows: + * + * @par + * For planar sample formats, each audio channel is in a separate data plane, + * and linesize is the buffer size, in bytes, for a single plane. All data + * planes must be the same size. For packed sample formats, only the first data + * plane is used, and samples for each channel are interleaved. In this case, + * linesize is the buffer size, in bytes, for the 1 plane. + * + */ +enum AVSampleFormat { + AV_SAMPLE_FMT_NONE = -1, + AV_SAMPLE_FMT_U8, ///< unsigned 8 bits + AV_SAMPLE_FMT_S16, ///< signed 16 bits + AV_SAMPLE_FMT_S32, ///< signed 32 bits + AV_SAMPLE_FMT_FLT, ///< float + AV_SAMPLE_FMT_DBL, ///< double + + AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar + AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar + AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar + AV_SAMPLE_FMT_FLTP, ///< float, planar + AV_SAMPLE_FMT_DBLP, ///< double, planar + AV_SAMPLE_FMT_S64, ///< signed 64 bits + AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar + + AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically +}; + +/** + * Return the name of sample_fmt, or NULL if sample_fmt is not + * recognized. + */ +const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); + +/** + * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE + * on error. + */ +enum AVSampleFormat av_get_sample_fmt(const char *name); + +/** + * Return the planar<->packed alternative form of the given sample format, or + * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the + * requested planar/packed format, the format returned is the same as the + * input. + */ +enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); + +/** + * Get the packed alternative form of the given sample format. + * + * If the passed sample_fmt is already in packed format, the format returned is + * the same as the input. + * + * @return the packed alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Get the planar alternative form of the given sample format. + * + * If the passed sample_fmt is already in planar format, the format returned is + * the same as the input. + * + * @return the planar alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Generate a string corresponding to the sample format with + * sample_fmt, or a header if sample_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param sample_fmt the number of the sample format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + * @return the pointer to the filled buffer or NULL if sample_fmt is + * unknown or in case of other errors + */ +char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); + +/** + * Return number of bytes per sample. + * + * @param sample_fmt the sample format + * @return number of bytes per sample or zero if unknown for the given + * sample format + */ +int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); + +/** + * Check if the sample format is planar. + * + * @param sample_fmt the sample format to inspect + * @return 1 if the sample format is planar, 0 if it is interleaved + */ +int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); + +/** + * Get the required buffer size for the given audio parameters. + * + * @param[out] linesize calculated linesize, may be NULL + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return required buffer size, or negative error code on failure + */ +int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * @} + * + * @defgroup lavu_sampmanip Samples manipulation + * + * Functions that manipulate audio samples + * @{ + */ + +/** + * Fill plane data pointers and linesize for samples with sample + * format sample_fmt. + * + * The audio_data array is filled with the pointers to the samples data planes: + * for planar, set the start point of each channel's data within the buffer, + * for packed, set the start point of the entire buffer only. + * + * The value pointed to by linesize is set to the aligned size of each + * channel's data buffer for planar layout, or to the aligned size of the + * buffer for all channels for packed layout. + * + * The buffer in buf must be big enough to contain all the samples + * (use av_samples_get_buffer_size() to compute its minimum size), + * otherwise the audio_data pointers will point to invalid data. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize calculated linesize, may be NULL + * @param buf the pointer to a buffer containing the samples + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return minimum size in bytes required for the buffer in case + * of success at the next bump + */ +int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, + const uint8_t *buf, + int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a samples buffer for nb_samples samples, and fill data pointers and + * linesize accordingly. + * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) + * Allocated data will be initialized to silence. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize aligned size for audio buffer(s), may be NULL + * @param nb_channels number of audio channels + * @param nb_samples number of samples per channel + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return the size of the allocated buffer in case of success at the next bump + * @see av_samples_fill_arrays() + * @see av_samples_alloc_array_and_samples() + */ +int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a data pointers array, samples buffer for nb_samples + * samples, and fill data pointers and linesize accordingly. + * + * This is the same as av_samples_alloc(), but also allocates the data + * pointers array. + * + * @see av_samples_alloc() + */ +int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Copy samples from src to dst. + * + * @param dst destination array of pointers to data planes + * @param src source array of pointers to data planes + * @param dst_offset offset in samples at which the data will be written to dst + * @param src_offset offset in samples at which the data will be read from src + * @param nb_samples number of samples to be copied + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, + int src_offset, int nb_samples, int nb_channels, + enum AVSampleFormat sample_fmt); + +/** + * Fill an audio buffer with silence. + * + * @param audio_data array of pointers to data planes + * @param offset offset in samples at which to start filling + * @param nb_samples number of samples to fill + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, + int nb_channels, enum AVSampleFormat sample_fmt); + +/** + * @} + * @} + */ +#endif /* AVUTIL_SAMPLEFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha.h new file mode 100644 index 0000000..c0180e5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * + * 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 + * @ingroup lavu_sha + * Public header for SHA-1 & SHA-256 hash function implementations. + */ + +#ifndef AVUTIL_SHA_H +#define AVUTIL_SHA_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha SHA + * @ingroup lavu_hash + * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA hash functions: + * + * - SHA-1: 160 bits + * - SHA-224: 224 bits, as a variant of SHA-2 + * - SHA-256: 256 bits, as a variant of SHA-2 + * + * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512. + * + * @{ + */ + +extern const int av_sha_size; + +struct AVSHA; + +/** + * Allocate an AVSHA context. + */ +struct AVSHA *av_sha_alloc(void); + +/** + * Initialize SHA-1 or SHA-2 hashing. + * + * @param context pointer to the function context (of size av_sha_size) + * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha_init(struct AVSHA* context, int bits); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, unsigned int len); +#else +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha_final(struct AVSHA* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha512.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha512.h new file mode 100644 index 0000000..bef714b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/sha512.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_sha512 + * Public header for SHA-512 implementation. + */ + +#ifndef AVUTIL_SHA512_H +#define AVUTIL_SHA512_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha512 SHA-512 + * @ingroup lavu_hash + * SHA-512 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA-2 hash functions: + * + * - SHA-512/224: 224 bits + * - SHA-512/256: 256 bits + * - SHA-384: 384 bits + * - SHA-512: 512 bits + * + * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha. + * + * @{ + */ + +extern const int av_sha512_size; + +struct AVSHA512; + +/** + * Allocate an AVSHA512 context. + */ +struct AVSHA512 *av_sha512_alloc(void); + +/** + * Initialize SHA-2 512 hashing. + * + * @param context pointer to the function context (of size av_sha512_size) + * @param bits number of bits in digest (224, 256, 384 or 512 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha512_init(struct AVSHA512* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, unsigned int len); +#else +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha512_final(struct AVSHA512* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA512_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/spherical.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/spherical.h new file mode 100644 index 0000000..cef759c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/spherical.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016 Vittorio Giovara + * + * 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 + * Spherical video + */ + +#ifndef AVUTIL_SPHERICAL_H +#define AVUTIL_SPHERICAL_H + +#include +#include + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_spherical Spherical video mapping + * @{ + */ + +/** + * @addtogroup lavu_video_spherical + * A spherical video file contains surfaces that need to be mapped onto a + * sphere. Depending on how the frame was converted, a different distortion + * transformation or surface recomposition function needs to be applied before + * the video should be mapped and displayed. + */ + +/** + * Projection of the video surface(s) on a sphere. + */ +enum AVSphericalProjection { + /** + * Video represents a sphere mapped on a flat surface using + * equirectangular projection. + */ + AV_SPHERICAL_EQUIRECTANGULAR, + + /** + * Video frame is split into 6 faces of a cube, and arranged on a + * 3x2 layout. Faces are oriented upwards for the front, left, right, + * and back faces. The up face is oriented so the top of the face is + * forwards and the down face is oriented so the top of the face is + * to the back. + */ + AV_SPHERICAL_CUBEMAP, + + /** + * Video represents a portion of a sphere mapped on a flat surface + * using equirectangular projection. The @ref bounding fields indicate + * the position of the current video in a larger surface. + */ + AV_SPHERICAL_EQUIRECTANGULAR_TILE, +}; + +/** + * This structure describes how to handle spherical videos, outlining + * information about projection, initial layout, and any other view modifier. + * + * @note The struct must be allocated with av_spherical_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVSphericalMapping { + /** + * Projection type. + */ + enum AVSphericalProjection projection; + + /** + * @name Initial orientation + * @{ + * There fields describe additional rotations applied to the sphere after + * the video frame is mapped onto it. The sphere is rotated around the + * viewer, who remains stationary. The order of transformation is always + * yaw, followed by pitch, and finally by roll. + * + * The coordinate system matches the one defined in OpenGL, where the + * forward vector (z) is coming out of screen, and it is equivalent to + * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll). + * + * A positive yaw rotates the portion of the sphere in front of the viewer + * toward their right. A positive pitch rotates the portion of the sphere + * in front of the viewer upwards. A positive roll tilts the portion of + * the sphere in front of the viewer to the viewer's right. + * + * These values are exported as 16.16 fixed point. + * + * See this equirectangular projection as example: + * + * @code{.unparsed} + * Yaw + * -180 0 180 + * 90 +-------------+-------------+ 180 + * | | | up + * P | | | y| forward + * i | ^ | | /z + * t 0 +-------------X-------------+ 0 Roll | / + * c | | | | / + * h | | | 0|/_____right + * | | | x + * -90 +-------------+-------------+ -180 + * + * X - the default camera center + * ^ - the default up vector + * @endcode + */ + int32_t yaw; ///< Rotation around the up vector [-180, 180]. + int32_t pitch; ///< Rotation around the right vector [-90, 90]. + int32_t roll; ///< Rotation around the forward vector [-180, 180]. + /** + * @} + */ + + /** + * @name Bounding rectangle + * @anchor bounding + * @{ + * These fields indicate the location of the current tile, and where + * it should be mapped relative to the original surface. They are + * exported as 0.32 fixed point, and can be converted to classic + * pixel values with av_spherical_bounds(). + * + * @code{.unparsed} + * +----------------+----------+ + * | |bound_top | + * | +--------+ | + * | bound_left |tile | | + * +<---------->| |<--->+bound_right + * | +--------+ | + * | | | + * | bound_bottom| | + * +----------------+----------+ + * @endcode + * + * If needed, the original video surface dimensions can be derived + * by adding the current stream or frame size to the related bounds, + * like in the following example: + * + * @code{c} + * original_width = tile->width + bound_left + bound_right; + * original_height = tile->height + bound_top + bound_bottom; + * @endcode + * + * @note These values are valid only for the tiled equirectangular + * projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE), + * and should be ignored in all other cases. + */ + uint32_t bound_left; ///< Distance from the left edge + uint32_t bound_top; ///< Distance from the top edge + uint32_t bound_right; ///< Distance from the right edge + uint32_t bound_bottom; ///< Distance from the bottom edge + /** + * @} + */ + + /** + * Number of pixels to pad from the edge of each cube face. + * + * @note This value is valid for only for the cubemap projection type + * (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other + * cases. + */ + uint32_t padding; +} AVSphericalMapping; + +/** + * Allocate a AVSphericalVideo structure and initialize its fields to default + * values. + * + * @return the newly allocated struct or NULL on failure + */ +AVSphericalMapping *av_spherical_alloc(size_t *size); + +/** + * Convert the @ref bounding fields from an AVSphericalVideo + * from 0.32 fixed point to pixels. + * + * @param map The AVSphericalVideo map to read bound values from. + * @param width Width of the current frame or stream. + * @param height Height of the current frame or stream. + * @param left Pixels from the left edge. + * @param top Pixels from the top edge. + * @param right Pixels from the right edge. + * @param bottom Pixels from the bottom edge. + */ +void av_spherical_tile_bounds(const AVSphericalMapping *map, + size_t width, size_t height, + size_t *left, size_t *top, + size_t *right, size_t *bottom); + +/** + * Provide a human-readable name of a given AVSphericalProjection. + * + * @param projection The input AVSphericalProjection. + * + * @return The name of the AVSphericalProjection, or "unknown". + */ +const char *av_spherical_projection_name(enum AVSphericalProjection projection); + +/** + * Get the AVSphericalProjection form a human-readable name. + * + * @param name The input string. + * + * @return The AVSphericalProjection value, or -1 if not found. + */ +int av_spherical_from_name(const char *name); +/** + * @} + * @} + */ + +#endif /* AVUTIL_SPHERICAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/stereo3d.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/stereo3d.h new file mode 100644 index 0000000..d421aac --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/stereo3d.h @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2013 Vittorio Giovara + * + * 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 + * Stereoscopic video + */ + +#ifndef AVUTIL_STEREO3D_H +#define AVUTIL_STEREO3D_H + +#include + +#include "frame.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_stereo3d Stereo3D types and functions + * @{ + */ + +/** + * @addtogroup lavu_video_stereo3d + * A stereoscopic video file consists in multiple views embedded in a single + * frame, usually describing two views of a scene. This file describes all + * possible codec-independent view arrangements. + * */ + +/** + * List of possible 3D Types + */ +enum AVStereo3DType { + /** + * Video is not stereoscopic (and metadata has to be there). + */ + AV_STEREO3D_2D, + + /** + * Views are next to each other. + * + * @code{.unparsed} + * LLLLRRRR + * LLLLRRRR + * LLLLRRRR + * ... + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE, + + /** + * Views are on top of each other. + * + * @code{.unparsed} + * LLLLLLLL + * LLLLLLLL + * RRRRRRRR + * RRRRRRRR + * @endcode + */ + AV_STEREO3D_TOPBOTTOM, + + /** + * Views are alternated temporally. + * + * @code{.unparsed} + * frame0 frame1 frame2 ... + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * ... ... ... + * @endcode + */ + AV_STEREO3D_FRAMESEQUENCE, + + /** + * Views are packed in a checkerboard-like structure per pixel. + * + * @code{.unparsed} + * LRLRLRLR + * RLRLRLRL + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_CHECKERBOARD, + + /** + * Views are next to each other, but when upscaling + * apply a checkerboard pattern. + * + * @code{.unparsed} + * LLLLRRRR L L L L R R R R + * LLLLRRRR => L L L L R R R R + * LLLLRRRR L L L L R R R R + * LLLLRRRR L L L L R R R R + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE_QUINCUNX, + + /** + * Views are packed per line, as if interlaced. + * + * @code{.unparsed} + * LLLLLLLL + * RRRRRRRR + * LLLLLLLL + * ... + * @endcode + */ + AV_STEREO3D_LINES, + + /** + * Views are packed per column. + * + * @code{.unparsed} + * LRLRLRLR + * LRLRLRLR + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_COLUMNS, +}; + +/** + * List of possible view types. + */ +enum AVStereo3DView { + /** + * Frame contains two packed views. + */ + AV_STEREO3D_VIEW_PACKED, + + /** + * Frame contains only the left view. + */ + AV_STEREO3D_VIEW_LEFT, + + /** + * Frame contains only the right view. + */ + AV_STEREO3D_VIEW_RIGHT, +}; + +/** + * Inverted views, Right/Bottom represents the left view. + */ +#define AV_STEREO3D_FLAG_INVERT (1 << 0) + +/** + * Stereo 3D type: this structure describes how two videos are packed + * within a single video surface, with additional information as needed. + * + * @note The struct must be allocated with av_stereo3d_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVStereo3D { + /** + * How views are packed within the video. + */ + enum AVStereo3DType type; + + /** + * Additional information about the frame packing. + */ + int flags; + + /** + * Determines which views are packed. + */ + enum AVStereo3DView view; +} AVStereo3D; + +/** + * Allocate an AVStereo3D structure and set its fields to default values. + * The resulting struct can be freed using av_freep(). + * + * @return An AVStereo3D filled with default values or NULL on failure. + */ +AVStereo3D *av_stereo3d_alloc(void); + +/** + * Allocate a complete AVFrameSideData and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVStereo3D structure to be filled by caller. + */ +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); + +/** + * Provide a human-readable name of a given stereo3d type. + * + * @param type The input stereo3d type value. + * + * @return The name of the stereo3d value, or "unknown". + */ +const char *av_stereo3d_type_name(unsigned int type); + +/** + * Get the AVStereo3DType form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DType value, or -1 if not found. + */ +int av_stereo3d_from_name(const char *name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_STEREO3D_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tea.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tea.h new file mode 100644 index 0000000..dd929bd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tea.h @@ -0,0 +1,71 @@ +/* + * A 32-bit implementation of the TEA algorithm + * Copyright (c) 2015 Vesselin Bontchev + * + * 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 + */ + +#ifndef AVUTIL_TEA_H +#define AVUTIL_TEA_H + +#include + +/** + * @file + * @brief Public header for libavutil TEA algorithm + * @defgroup lavu_tea TEA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_tea_size; + +struct AVTEA; + +/** + * Allocate an AVTEA context + * To free the struct: av_free(ptr) + */ +struct AVTEA *av_tea_alloc(void); + +/** + * Initialize an AVTEA context. + * + * @param ctx an AVTEA context + * @param key a key of 16 bytes used for encryption/decryption + * @param rounds the number of rounds in TEA (64 is the "standard") + */ +void av_tea_init(struct AVTEA *ctx, const uint8_t key[16], int rounds); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_tea_crypt(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_TEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/threadmessage.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/threadmessage.h new file mode 100644 index 0000000..42ce655 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/threadmessage.h @@ -0,0 +1,115 @@ +/* + * 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 + */ + +#ifndef AVUTIL_THREADMESSAGE_H +#define AVUTIL_THREADMESSAGE_H + +typedef struct AVThreadMessageQueue AVThreadMessageQueue; + +typedef enum AVThreadMessageFlags { + + /** + * Perform non-blocking operation. + * If this flag is set, send and recv operations are non-blocking and + * return AVERROR(EAGAIN) immediately if they can not proceed. + */ + AV_THREAD_MESSAGE_NONBLOCK = 1, + +} AVThreadMessageFlags; + +/** + * Allocate a new message queue. + * + * @param mq pointer to the message queue + * @param nelem maximum number of elements in the queue + * @param elsize size of each element in the queue + * @return >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if + * lavu was built without thread support + */ +int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, + unsigned nelem, + unsigned elsize); + +/** + * Free a message queue. + * + * The message queue must no longer be in use by another thread. + */ +void av_thread_message_queue_free(AVThreadMessageQueue **mq); + +/** + * Send a message on the queue. + */ +int av_thread_message_queue_send(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Receive a message from the queue. + */ +int av_thread_message_queue_recv(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Set the sending error code. + * + * If the error code is set to non-zero, av_thread_message_queue_send() will + * return it immediately. Conventional values, such as AVERROR_EOF or + * AVERROR(EAGAIN), can be used to cause the sending thread to stop or + * suspend its operation. + */ +void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, + int err); + +/** + * Set the receiving error code. + * + * If the error code is set to non-zero, av_thread_message_queue_recv() will + * return it immediately when there are no longer available messages. + * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used + * to cause the receiving thread to stop or suspend its operation. + */ +void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, + int err); + +/** + * Set the optional free message callback function which will be called if an + * operation is removing messages from the queue. + */ +void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, + void (*free_func)(void *msg)); + +/** + * Return the current number of messages in the queue. + * + * @return the current number of messages or AVERROR(ENOSYS) if lavu was built + * without thread support + */ +int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq); + +/** + * Flush the message queue + * + * This function is mostly equivalent to reading and free-ing every message + * except that it will be done in a single operation (no lock/unlock between + * reads). + */ +void av_thread_message_flush(AVThreadMessageQueue *mq); + +#endif /* AVUTIL_THREADMESSAGE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/time.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/time.h new file mode 100644 index 0000000..dc169b0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/time.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2000-2003 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 + */ + +#ifndef AVUTIL_TIME_H +#define AVUTIL_TIME_H + +#include + +/** + * Get the current time in microseconds. + */ +int64_t av_gettime(void); + +/** + * Get the current time in microseconds since some unspecified starting point. + * On platforms that support it, the time comes from a monotonic clock + * This property makes this time source ideal for measuring relative time. + * The returned values may not be monotonic on platforms where a monotonic + * clock is not available. + */ +int64_t av_gettime_relative(void); + +/** + * Indicates with a boolean result if the av_gettime_relative() time source + * is monotonic. + */ +int av_gettime_relative_is_monotonic(void); + +/** + * Sleep for a period of time. Although the duration is expressed in + * microseconds, the actual delay may be rounded to the precision of the + * system timer. + * + * @param usec Number of microseconds to sleep. + * @return zero on success or (negative) error code. + */ +int av_usleep(unsigned usec); + +#endif /* AVUTIL_TIME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timecode.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timecode.h new file mode 100644 index 0000000..37c1361 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timecode.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier + * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch + * + * 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 + * Timecode helpers header + */ + +#ifndef AVUTIL_TIMECODE_H +#define AVUTIL_TIMECODE_H + +#include +#include "rational.h" + +#define AV_TIMECODE_STR_SIZE 23 + +enum AVTimecodeFlag { + AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame + AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours + AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed +}; + +typedef struct { + int start; ///< timecode frame start (first base frame number) + uint32_t flags; ///< flags such as drop frame, +24 hours support, ... + AVRational rate; ///< frame rate in rational form + unsigned fps; ///< frame per second; must be consistent with the rate field +} AVTimecode; + +/** + * Adjust frame number for NTSC drop frame time code. + * + * @param framenum frame number to adjust + * @param fps frame per second, 30 or 60 + * @return adjusted frame number + * @warning adjustment is only valid in NTSC 29.97 and 59.94 + */ +int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); + +/** + * Convert frame number to SMPTE 12M binary representation. + * + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the SMPTE binary representation + * + * @note Frame number adjustment is automatically done in case of drop timecode, + * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). + * @note The frame number is relative to tc->start. + * @note Color frame (CF), binary group flags (BGF) and biphase mark polarity + * correction (PC) bits are set to zero. + */ +uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); + +/** + * Load timecode string in buf. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the buf parameter + * + * @note Timecode representation can be a negative timecode and have more than + * 24 hours, but will only be honored if the flags are correctly set. + * @note The frame number is relative to tc->start. + */ +char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum); + +/** + * Get the timecode string from the SMPTE timecode format. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tcsmpte the 32-bit SMPTE timecode + * @param prevent_df prevent the use of a drop flag when it is known the DF bit + * is arbitrary + * @return the buf parameter + */ +char *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df); + +/** + * Get the timecode string from the 25-bit timecode format (MPEG GOP format). + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc25bit the 25-bits timecode + * @return the buf parameter + */ +char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit); + +/** + * Init a timecode struct with the passed parameters. + * + * @param log_ctx a pointer to an arbitrary struct of which the first field + * is a pointer to an AVClass struct (used for av_log) + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param flags miscellaneous flags such as drop frame, +24 hours, ... + * (see AVTimecodeFlag) + * @param frame_start the first frame number + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); + +/** + * Parse timecode representation (hh:mm:ss[:;.]ff). + * + * @param log_ctx a pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct (used for av_log). + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param str timecode string which will determine the frame start + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); + +/** + * Check if the timecode feature is available for the given frame rate + * + * @return 0 if supported, <0 otherwise + */ +int av_timecode_check_frame_rate(AVRational rate); + +#endif /* AVUTIL_TIMECODE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timestamp.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timestamp.h new file mode 100644 index 0000000..e082f01 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/timestamp.h @@ -0,0 +1,78 @@ +/* + * 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 + * timestamp utils, mostly useful for debugging/logging purposes + */ + +#ifndef AVUTIL_TIMESTAMP_H +#define AVUTIL_TIMESTAMP_H + +#include "common.h" + +#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) +#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS +#endif + +#define AV_TS_MAX_STRING_SIZE 32 + +/** + * Fill the provided buffer with a string containing a timestamp + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @return the buffer in input + */ +static inline char *av_ts_make_string(char *buf, int64_t ts) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) + +/** + * Fill the provided buffer with a string containing a timestamp time + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @param tb the timebase of the timestamp + * @return the buffer in input + */ +static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb) + +#endif /* AVUTIL_TIMESTAMP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tree.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tree.h new file mode 100644 index 0000000..d5e0aeb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tree.h @@ -0,0 +1,138 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * A tree container. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_TREE_H +#define AVUTIL_TREE_H + +#include "attributes.h" +#include "version.h" + +/** + * @addtogroup lavu_tree AVTree + * @ingroup lavu_data + * + * Low-complexity tree container + * + * Insertion, removal, finding equal, largest which is smaller than and + * smallest which is larger than, all have O(log n) worst-case complexity. + * @{ + */ + + +struct AVTreeNode; +extern const int av_tree_node_size; + +/** + * Allocate an AVTreeNode. + */ +struct AVTreeNode *av_tree_node_alloc(void); + +/** + * Find an element. + * @param root a pointer to the root node of the tree + * @param next If next is not NULL, then next[0] will contain the previous + * element and next[1] the next element. If either does not exist, + * then the corresponding entry in next is unchanged. + * @param cmp compare function used to compare elements in the tree, + * API identical to that of Standard C's qsort + * It is guaranteed that the first and only the first argument to cmp() + * will be the key parameter to av_tree_find(), thus it could if the + * user wants, be a different type (like an opaque context). + * @return An element with cmp(key, elem) == 0 or NULL if no such element + * exists in the tree. + */ +void *av_tree_find(const struct AVTreeNode *root, void *key, + int (*cmp)(const void *key, const void *b), void *next[2]); + +/** + * Insert or remove an element. + * + * If *next is NULL, then the supplied element will be removed if it exists. + * If *next is non-NULL, then the supplied element will be inserted, unless + * it already exists in the tree. + * + * @param rootp A pointer to a pointer to the root node of the tree; note that + * the root node can change during insertions, this is required + * to keep the tree balanced. + * @param key pointer to the element key to insert in the tree + * @param next Used to allocate and free AVTreeNodes. For insertion the user + * must set it to an allocated and zeroed object of at least + * av_tree_node_size bytes size. av_tree_insert() will set it to + * NULL if it has been consumed. + * For deleting elements *next is set to NULL by the user and + * av_tree_insert() will set it to the AVTreeNode which was + * used for the removed element. + * This allows the use of flat arrays, which have + * lower overhead compared to many malloced elements. + * You might want to define a function like: + * @code + * void *tree_insert(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b), + * AVTreeNode **next) + * { + * if (!*next) + * *next = av_mallocz(av_tree_node_size); + * return av_tree_insert(rootp, key, cmp, next); + * } + * void *tree_remove(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b, AVTreeNode **next)) + * { + * av_freep(next); + * return av_tree_insert(rootp, key, cmp, next); + * } + * @endcode + * @param cmp compare function used to compare elements in the tree, API identical + * to that of Standard C's qsort + * @return If no insertion happened, the found element; if an insertion or + * removal happened, then either key or NULL will be returned. + * Which one it is depends on the tree state and the implementation. You + * should make no assumptions that it's one or the other in the code. + */ +void *av_tree_insert(struct AVTreeNode **rootp, void *key, + int (*cmp)(const void *key, const void *b), + struct AVTreeNode **next); + +void av_tree_destroy(struct AVTreeNode *t); + +/** + * Apply enu(opaque, &elem) to all the elements in the tree in a given range. + * + * @param cmp a comparison function that returns < 0 for an element below the + * range, > 0 for an element above the range and == 0 for an + * element inside the range + * + * @note The cmp function should use the same ordering used to construct the + * tree. + */ +void av_tree_enumerate(struct AVTreeNode *t, void *opaque, + int (*cmp)(void *opaque, void *elem), + int (*enu)(void *opaque, void *elem)); + +/** + * @} + */ + +#endif /* AVUTIL_TREE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/twofish.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/twofish.h new file mode 100644 index 0000000..813cfec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/twofish.h @@ -0,0 +1,70 @@ +/* + * An implementation of the TwoFish algorithm + * Copyright (c) 2015 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_TWOFISH_H +#define AVUTIL_TWOFISH_H + +#include + + +/** + * @file + * @brief Public header for libavutil TWOFISH algorithm + * @defgroup lavu_twofish TWOFISH + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_twofish_size; + +struct AVTWOFISH; + +/** + * Allocate an AVTWOFISH context + * To free the struct: av_free(ptr) + */ +struct AVTWOFISH *av_twofish_alloc(void); + +/** + * Initialize an AVTWOFISH context. + * + * @param ctx an AVTWOFISH context + * @param key a key of size ranging from 1 to 32 bytes used for encryption/decryption + * @param key_bits number of keybits: 128, 192, 256 If less than the required, padded with zeroes to nearest valid value; return value is 0 if key_bits is 128/192/256, -1 if less than 0, 1 otherwise + */ +int av_twofish_init(struct AVTWOFISH *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVTWOFISH context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_twofish_crypt(struct AVTWOFISH *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_TWOFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tx.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tx.h new file mode 100644 index 0000000..b1f2d96 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/tx.h @@ -0,0 +1,81 @@ +/* + * 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 + */ + +#ifndef AVUTIL_TX_H +#define AVUTIL_TX_H + +#include +#include + +typedef struct AVTXContext AVTXContext; + +typedef struct AVComplexFloat { + float re, im; +} AVComplexFloat; + +enum AVTXType { + /** + * Standard complex to complex FFT with sample data type AVComplexFloat. + * Scaling currently unsupported + */ + AV_TX_FLOAT_FFT = 0, + /** + * Standard MDCT with sample data type of float and a scale type of + * float. Length is the frame size, not the window size (which is 2x frame) + */ + AV_TX_FLOAT_MDCT = 1, +}; + +/** + * Function pointer to a function to perform the transform. + * + * @note Using a different context than the one allocated during av_tx_init() + * is not allowed. + * + * @param s the transform context + * @param out the output array + * @param in the input array + * @param stride the input or output stride (depending on transform direction) + * in bytes, currently implemented for all MDCT transforms + */ +typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride); + +/** + * Initialize a transform context with the given configuration + * Currently power of two lengths from 4 to 131072 are supported, along with + * any length decomposable to a power of two and either 3, 5 or 15. + * + * @param ctx the context to allocate, will be NULL on error + * @param tx pointer to the transform function pointer to set + * @param type type the type of transform + * @param inv whether to do an inverse or a forward transform + * @param len the size of the transform in samples + * @param scale pointer to the value to scale the output if supported by type + * @param flags currently unused + * + * @return 0 on success, negative error code on failure + */ +int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, + int inv, int len, const void *scale, uint64_t flags); + +/** + * Frees a context and sets ctx to NULL, does nothing when ctx == NULL + */ +void av_tx_uninit(AVTXContext **ctx); + +#endif /* AVUTIL_TX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/version.h new file mode 100644 index 0000000..24ca8ab --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/version.h @@ -0,0 +1,139 @@ +/* + * copyright (c) 2003 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 + * @ingroup lavu + * Libavutil version macros + */ + +#ifndef AVUTIL_VERSION_H +#define AVUTIL_VERSION_H + +#include "macros.h" + +/** + * @addtogroup version_utils + * + * Useful to check and match library version in order to maintain + * backward compatibility. + * + * The FFmpeg libraries follow a versioning sheme very similar to + * Semantic Versioning (http://semver.org/) + * The difference is that the component called PATCH is called MICRO in FFmpeg + * and its value is reset to 100 instead of 0 to keep it above or equal to 100. + * Also we do not increase MICRO for every bugfix or change in git master. + * + * Prior to FFmpeg 3.2 point releases did not change any lib version number to + * avoid aliassing different git master checkouts. + * Starting with FFmpeg 3.2, the released library versions will occupy + * a separate MAJOR.MINOR that is not used on the master development branch. + * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 + * for the release and master will continue at 55.12.100 after it. Each new + * point release will then bump the MICRO improving the usefulness of the lib + * versions. + * + * @{ + */ + +#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c)) +#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c +#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) + +/** + * Extract version components from the full ::AV_VERSION_INT int as returned + * by functions like ::avformat_version() and ::avcodec_version() + */ +#define AV_VERSION_MAJOR(a) ((a) >> 16) +#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) +#define AV_VERSION_MICRO(a) ((a) & 0xFF) + +/** + * @} + */ + +/** + * @defgroup lavu_ver Version and Build diagnostics + * + * Macros and function useful to check at compiletime and at runtime + * which version of libavutil is in use. + * + * @{ + */ + +#define LIBAVUTIL_VERSION_MAJOR 56 +#define LIBAVUTIL_VERSION_MINOR 31 +#define LIBAVUTIL_VERSION_MICRO 100 + +#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT + +#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) + +/** + * @defgroup lavu_depr_guards Deprecation Guards + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + * @{ + */ + +#ifndef FF_API_VAAPI +#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_FRAME_QP +#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PLUS1_MINUS1 +#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_ERROR_FRAME +#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PKT_PTS +#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_CRYPTO_SIZE_T +#define FF_API_CRYPTO_SIZE_T (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_FRAME_GET_SET +#define FF_API_FRAME_GET_SET (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PSEUDOPAL +#define FF_API_PSEUDOPAL (LIBAVUTIL_VERSION_MAJOR < 57) +#endif + + +/** + * @} + * @} + */ + +#endif /* AVUTIL_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/xtea.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/xtea.h new file mode 100644 index 0000000..735427c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libavutil/xtea.h @@ -0,0 +1,94 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_XTEA_H +#define AVUTIL_XTEA_H + +#include + +/** + * @file + * @brief Public header for libavutil XTEA algorithm + * @defgroup lavu_xtea XTEA + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVXTEA { + uint32_t key[16]; +} AVXTEA; + +/** + * Allocate an AVXTEA context. + */ +AVXTEA *av_xtea_alloc(void); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as big endian 32 bit numbers + */ +void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as little endian 32 bit numbers + */ +void av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in big endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in little endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_XTEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/postprocess.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/postprocess.h new file mode 100644 index 0000000..348ee7c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/postprocess.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 + */ + +#ifndef POSTPROC_POSTPROCESS_H +#define POSTPROC_POSTPROCESS_H + +/** + * @file + * @ingroup lpp + * external API header + */ + +/** + * @defgroup lpp libpostproc + * Video postprocessing library. + * + * @{ + */ + +#include "libpostproc/version.h" + +/** + * Return the LIBPOSTPROC_VERSION_INT constant. + */ +unsigned postproc_version(void); + +/** + * Return the libpostproc build-time configuration. + */ +const char *postproc_configuration(void); + +/** + * Return the libpostproc license. + */ +const char *postproc_license(void); + +#define PP_QUALITY_MAX 6 + +#include + +typedef void pp_context; +typedef void pp_mode; + +#if LIBPOSTPROC_VERSION_INT < (52<<16) +typedef pp_context pp_context_t; +typedef pp_mode pp_mode_t; +extern const char *const pp_help; ///< a simple help text +#else +extern const char pp_help[]; ///< a simple help text +#endif + +void pp_postprocess(const uint8_t * src[3], const int srcStride[3], + uint8_t * dst[3], const int dstStride[3], + int horizontalSize, int verticalSize, + const int8_t *QP_store, int QP_stride, + pp_mode *mode, pp_context *ppContext, int pict_type); + + +/** + * Return a pp_mode or NULL if an error occurred. + * + * @param name the string after "-pp" on the command line + * @param quality a number from 0 to PP_QUALITY_MAX + */ +pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality); +void pp_free_mode(pp_mode *mode); + +pp_context *pp_get_context(int width, int height, int flags); +void pp_free_context(pp_context *ppContext); + +#define PP_CPU_CAPS_MMX 0x80000000 +#define PP_CPU_CAPS_MMX2 0x20000000 +#define PP_CPU_CAPS_3DNOW 0x40000000 +#define PP_CPU_CAPS_ALTIVEC 0x10000000 +#define PP_CPU_CAPS_AUTO 0x00080000 + +#define PP_FORMAT 0x00000008 +#define PP_FORMAT_420 (0x00000011|PP_FORMAT) +#define PP_FORMAT_422 (0x00000001|PP_FORMAT) +#define PP_FORMAT_411 (0x00000002|PP_FORMAT) +#define PP_FORMAT_444 (0x00000000|PP_FORMAT) +#define PP_FORMAT_440 (0x00000010|PP_FORMAT) + +#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale + +/** + * @} + */ + +#endif /* POSTPROC_POSTPROCESS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/version.h new file mode 100644 index 0000000..fa6d12c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libpostproc/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef POSTPROC_VERSION_H +#define POSTPROC_VERSION_H + +/** + * @file + * Libpostproc version macros + */ + +#include "libavutil/avutil.h" + +#define LIBPOSTPROC_VERSION_MAJOR 55 +#define LIBPOSTPROC_VERSION_MINOR 5 +#define LIBPOSTPROC_VERSION_MICRO 100 + +#define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_VERSION AV_VERSION(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_BUILD LIBPOSTPROC_VERSION_INT + +#define LIBPOSTPROC_IDENT "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) + +#endif /* POSTPROC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/swresample.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/swresample.h new file mode 100644 index 0000000..c7b84fb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/swresample.h @@ -0,0 +1,579 @@ +/* + * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_SWRESAMPLE_H +#define SWRESAMPLE_SWRESAMPLE_H + +/** + * @file + * @ingroup lswr + * libswresample public header + */ + +/** + * @defgroup lswr libswresample + * @{ + * + * Audio resampling, sample format conversion and mixing library. + * + * Interaction with lswr is done through SwrContext, which is + * allocated with swr_alloc() or swr_alloc_set_opts(). It is opaque, so all parameters + * must be set with the @ref avoptions API. + * + * The first thing you will need to do in order to use lswr is to allocate + * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts(). If you + * are using the former, you must set options through the @ref avoptions API. + * The latter function provides the same feature, but it allows you to set some + * common options in the same statement. + * + * For example the following code will setup conversion from planar float sample + * format to interleaved signed 16-bit integer, downsampling from 48kHz to + * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing + * matrix). This is using the swr_alloc() function. + * @code + * SwrContext *swr = swr_alloc(); + * av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); + * av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + * av_opt_set_int(swr, "in_sample_rate", 48000, 0); + * av_opt_set_int(swr, "out_sample_rate", 44100, 0); + * av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); + * av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + * @endcode + * + * The same job can be done using swr_alloc_set_opts() as well: + * @code + * SwrContext *swr = swr_alloc_set_opts(NULL, // we're allocating a new context + * AV_CH_LAYOUT_STEREO, // out_ch_layout + * AV_SAMPLE_FMT_S16, // out_sample_fmt + * 44100, // out_sample_rate + * AV_CH_LAYOUT_5POINT1, // in_ch_layout + * AV_SAMPLE_FMT_FLTP, // in_sample_fmt + * 48000, // in_sample_rate + * 0, // log_offset + * NULL); // log_ctx + * @endcode + * + * Once all values have been set, it must be initialized with swr_init(). If + * you need to change the conversion parameters, you can change the parameters + * using @ref AVOptions, as described above in the first example; or by using + * swr_alloc_set_opts(), but with the first argument the allocated context. + * You must then call swr_init() again. + * + * The conversion itself is done by repeatedly calling swr_convert(). + * Note that the samples may get buffered in swr if you provide insufficient + * output space or if sample rate conversion is done, which requires "future" + * samples. Samples that do not require future input can be retrieved at any + * time by using swr_convert() (in_count can be set to 0). + * At the end of conversion the resampling buffer can be flushed by calling + * swr_convert() with NULL in and 0 in_count. + * + * The samples used in the conversion process can be managed with the libavutil + * @ref lavu_sampmanip "samples manipulation" API, including av_samples_alloc() + * function used in the following example. + * + * The delay between input and output, can at any time be found by using + * swr_get_delay(). + * + * The following code demonstrates the conversion loop assuming the parameters + * from above and caller-defined functions get_input() and handle_output(): + * @code + * uint8_t **input; + * int in_samples; + * + * while (get_input(&input, &in_samples)) { + * uint8_t *output; + * int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) + + * in_samples, 44100, 48000, AV_ROUND_UP); + * av_samples_alloc(&output, NULL, 2, out_samples, + * AV_SAMPLE_FMT_S16, 0); + * out_samples = swr_convert(swr, &output, out_samples, + * input, in_samples); + * handle_output(output, out_samples); + * av_freep(&output); + * } + * @endcode + * + * When the conversion is finished, the conversion + * context and everything associated with it must be freed with swr_free(). + * A swr_close() function is also available, but it exists mainly for + * compatibility with libavresample, and is not required to be called. + * + * There will be no memory leak if the data is not completely flushed before + * swr_free(). + */ + +#include +#include "libavutil/channel_layout.h" +#include "libavutil/frame.h" +#include "libavutil/samplefmt.h" + +#include "libswresample/version.h" + +/** + * @name Option constants + * These constants are used for the @ref avoptions interface for lswr. + * @{ + * + */ + +#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate +//TODO use int resample ? +//long term TODO can we enable this dynamically? + +/** Dithering algorithms */ +enum SwrDitherType { + SWR_DITHER_NONE = 0, + SWR_DITHER_RECTANGULAR, + SWR_DITHER_TRIANGULAR, + SWR_DITHER_TRIANGULAR_HIGHPASS, + + SWR_DITHER_NS = 64, ///< not part of API/ABI + SWR_DITHER_NS_LIPSHITZ, + SWR_DITHER_NS_F_WEIGHTED, + SWR_DITHER_NS_MODIFIED_E_WEIGHTED, + SWR_DITHER_NS_IMPROVED_E_WEIGHTED, + SWR_DITHER_NS_SHIBATA, + SWR_DITHER_NS_LOW_SHIBATA, + SWR_DITHER_NS_HIGH_SHIBATA, + SWR_DITHER_NB, ///< not part of API/ABI +}; + +/** Resampling Engines */ +enum SwrEngine { + SWR_ENGINE_SWR, /**< SW Resampler */ + SWR_ENGINE_SOXR, /**< SoX Resampler */ + SWR_ENGINE_NB, ///< not part of API/ABI +}; + +/** Resampling Filter Types */ +enum SwrFilterType { + SWR_FILTER_TYPE_CUBIC, /**< Cubic */ + SWR_FILTER_TYPE_BLACKMAN_NUTTALL, /**< Blackman Nuttall windowed sinc */ + SWR_FILTER_TYPE_KAISER, /**< Kaiser windowed sinc */ +}; + +/** + * @} + */ + +/** + * The libswresample context. Unlike libavcodec and libavformat, this structure + * is opaque. This means that if you would like to set options, you must use + * the @ref avoptions API and cannot directly set values to members of the + * structure. + */ +typedef struct SwrContext SwrContext; + +/** + * Get the AVClass for SwrContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + * @return the AVClass of SwrContext + */ +const AVClass *swr_get_class(void); + +/** + * @name SwrContext constructor functions + * @{ + */ + +/** + * Allocate SwrContext. + * + * If you use this function you will need to set the parameters (manually or + * with swr_alloc_set_opts()) before calling swr_init(). + * + * @see swr_alloc_set_opts(), swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc(void); + +/** + * Initialize context after user parameters have been set. + * @note The context must be configured using the AVOption API. + * + * @see av_opt_set_int() + * @see av_opt_set_dict() + * + * @param[in,out] s Swr context to initialize + * @return AVERROR error code in case of failure. + */ +int swr_init(struct SwrContext *s); + +/** + * Check whether an swr context has been initialized or not. + * + * @param[in] s Swr context to check + * @see swr_init() + * @return positive if it has been initialized, 0 if not initialized + */ +int swr_is_initialized(struct SwrContext *s); + +/** + * Allocate SwrContext if needed and set/reset common parameters. + * + * This function does not require s to be allocated with swr_alloc(). On the + * other hand, swr_alloc() can use swr_alloc_set_opts() to set the parameters + * on the allocated context. + * + * @param s existing Swr context if available, or NULL if not + * @param out_ch_layout output channel layout (AV_CH_LAYOUT_*) + * @param out_sample_fmt output sample format (AV_SAMPLE_FMT_*). + * @param out_sample_rate output sample rate (frequency in Hz) + * @param in_ch_layout input channel layout (AV_CH_LAYOUT_*) + * @param in_sample_fmt input sample format (AV_SAMPLE_FMT_*). + * @param in_sample_rate input sample rate (frequency in Hz) + * @param log_offset logging level offset + * @param log_ctx parent logging context, can be NULL + * + * @see swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, + int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, + int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, + int log_offset, void *log_ctx); + +/** + * @} + * + * @name SwrContext destructor functions + * @{ + */ + +/** + * Free the given SwrContext and set the pointer to NULL. + * + * @param[in] s a pointer to a pointer to Swr context + */ +void swr_free(struct SwrContext **s); + +/** + * Closes the context so that swr_is_initialized() returns 0. + * + * The context can be brought back to life by running swr_init(), + * swr_init() can also be used without swr_close(). + * This function is mainly provided for simplifying the usecase + * where one tries to support libavresample and libswresample. + * + * @param[in,out] s Swr context to be closed + */ +void swr_close(struct SwrContext *s); + +/** + * @} + * + * @name Core conversion functions + * @{ + */ + +/** Convert audio. + * + * in and in_count can be set to 0 to flush the last few samples out at the + * end. + * + * If more input is provided than output space, then the input will be buffered. + * You can avoid this buffering by using swr_get_out_samples() to retrieve an + * upper bound on the required number of output samples for the given number of + * input samples. Conversion will run directly without copying whenever possible. + * + * @param s allocated Swr context, with parameters set + * @param out output buffers, only the first one need be set in case of packed audio + * @param out_count amount of space available for output in samples per channel + * @param in input buffers, only the first one need to be set in case of packed audio + * @param in_count number of input samples available in one channel + * + * @return number of samples output per channel, negative value on error + */ +int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, + const uint8_t **in , int in_count); + +/** + * Convert the next timestamp from input to output + * timestamps are in 1/(in_sample_rate * out_sample_rate) units. + * + * @note There are 2 slightly differently behaving modes. + * @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX) + * in this case timestamps will be passed through with delays compensated + * @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX) + * in this case the output timestamps will match output sample numbers. + * See ffmpeg-resampler(1) for the two modes of compensation. + * + * @param s[in] initialized Swr context + * @param pts[in] timestamp for the next input sample, INT64_MIN if unknown + * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are + * function used internally for timestamp compensation. + * @return the output timestamp for the next output sample + */ +int64_t swr_next_pts(struct SwrContext *s, int64_t pts); + +/** + * @} + * + * @name Low-level option setting functions + * These functons provide a means to set low-level options that is not possible + * with the AVOption API. + * @{ + */ + +/** + * Activate resampling compensation ("soft" compensation). This function is + * internally called when needed in swr_next_pts(). + * + * @param[in,out] s allocated Swr context. If it is not initialized, + * or SWR_FLAG_RESAMPLE is not set, swr_init() is + * called with the flag set. + * @param[in] sample_delta delta in PTS per sample + * @param[in] compensation_distance number of samples to compensate for + * @return >= 0 on success, AVERROR error codes if: + * @li @c s is NULL, + * @li @c compensation_distance is less than 0, + * @li @c compensation_distance is 0 but sample_delta is not, + * @li compensation unsupported by resampler, or + * @li swr_init() fails when called. + */ +int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance); + +/** + * Set a customized input channel mapping. + * + * @param[in,out] s allocated Swr context, not yet initialized + * @param[in] channel_map customized input channel mapping (array of channel + * indexes, -1 for a muted channel) + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); + +/** + * Generate a channel mixing matrix. + * + * This function is the one used internally by libswresample for building the + * default mixing matrix. It is made public just as a utility function for + * building custom matrices. + * + * @param in_layout input channel layout + * @param out_layout output channel layout + * @param center_mix_level mix level for the center channel + * @param surround_mix_level mix level for the surround channel(s) + * @param lfe_mix_level mix level for the low-frequency effects channel + * @param rematrix_maxval if 1.0, coefficients will be normalized to prevent + * overflow. if INT_MAX, coefficients will not be + * normalized. + * @param[out] matrix mixing coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o. + * @param stride distance between adjacent input channels in the + * matrix array + * @param matrix_encoding matrixed stereo downmix mode (e.g. dplii) + * @param log_ctx parent logging context, can be NULL + * @return 0 on success, negative AVERROR code on failure + */ +int swr_build_matrix(uint64_t in_layout, uint64_t out_layout, + double center_mix_level, double surround_mix_level, + double lfe_mix_level, double rematrix_maxval, + double rematrix_volume, double *matrix, + int stride, enum AVMatrixEncoding matrix_encoding, + void *log_ctx); + +/** + * Set a customized remix matrix. + * + * @param s allocated Swr context, not yet initialized + * @param matrix remix coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o + * @param stride offset between lines of the matrix + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride); + +/** + * @} + * + * @name Sample handling functions + * @{ + */ + +/** + * Drops the specified number of output samples. + * + * This function, along with swr_inject_silence(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_drop_output(struct SwrContext *s, int count); + +/** + * Injects the specified number of silence samples. + * + * This function, along with swr_drop_output(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_inject_silence(struct SwrContext *s, int count); + +/** + * Gets the delay the next input sample will experience relative to the next output sample. + * + * Swresample can buffer data if more input has been provided than available + * output space, also converting between sample rates needs a delay. + * This function returns the sum of all such delays. + * The exact delay is not necessarily an integer value in either input or + * output sample rate. Especially when downsampling by a large value, the + * output sample rate may be a poor choice to represent the delay, similarly + * for upsampling and the input sample rate. + * + * @param s swr context + * @param base timebase in which the returned delay will be: + * @li if it's set to 1 the returned delay is in seconds + * @li if it's set to 1000 the returned delay is in milliseconds + * @li if it's set to the input sample rate then the returned + * delay is in input samples + * @li if it's set to the output sample rate then the returned + * delay is in output samples + * @li if it's the least common multiple of in_sample_rate and + * out_sample_rate then an exact rounding-free delay will be + * returned + * @returns the delay in 1 / @c base units. + */ +int64_t swr_get_delay(struct SwrContext *s, int64_t base); + +/** + * Find an upper bound on the number of samples that the next swr_convert + * call will output, if called with in_samples of input samples. This + * depends on the internal state, and anything changing the internal state + * (like further swr_convert() calls) will may change the number of samples + * swr_get_out_samples() returns for the same number of input samples. + * + * @param in_samples number of input samples. + * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts() + * or swr_set_compensation() invalidates this limit + * @note it is recommended to pass the correct available buffer size + * to all functions like swr_convert() even if swr_get_out_samples() + * indicates that less would be used. + * @returns an upper bound on the number of samples that the next swr_convert + * will output or a negative value to indicate an error + */ +int swr_get_out_samples(struct SwrContext *s, int in_samples); + +/** + * @} + * + * @name Configuration accessors + * @{ + */ + +/** + * Return the @ref LIBSWRESAMPLE_VERSION_INT constant. + * + * This is useful to check if the build-time libswresample has the same version + * as the run-time one. + * + * @returns the unsigned int-typed version + */ +unsigned swresample_version(void); + +/** + * Return the swr build-time configuration. + * + * @returns the build-time @c ./configure flags + */ +const char *swresample_configuration(void); + +/** + * Return the swr license. + * + * @returns the license of libswresample, determined at build-time + */ +const char *swresample_license(void); + +/** + * @} + * + * @name AVFrame based API + * @{ + */ + +/** + * Convert the samples in the input AVFrame and write them to the output AVFrame. + * + * Input and output AVFrames must have channel_layout, sample_rate and format set. + * + * If the output AVFrame does not have the data pointers allocated the nb_samples + * field will be set using av_frame_get_buffer() + * is called to allocate the frame. + * + * The output AVFrame can be NULL or have fewer allocated samples than required. + * In this case, any remaining samples not written to the output will be added + * to an internal FIFO buffer, to be returned at the next call to this function + * or to swr_convert(). + * + * If converting sample rate, there may be data remaining in the internal + * resampling delay buffer. swr_get_delay() tells the number of + * remaining samples. To get this data as output, call this function or + * swr_convert() with NULL input. + * + * If the SwrContext configuration does not match the output and + * input AVFrame settings the conversion does not take place and depending on + * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED + * or the result of a bitwise-OR of them is returned. + * + * @see swr_delay() + * @see swr_convert() + * @see swr_get_delay() + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure or nonmatching + * configuration. + */ +int swr_convert_frame(SwrContext *swr, + AVFrame *output, const AVFrame *input); + +/** + * Configure or reconfigure the SwrContext using the information + * provided by the AVFrames. + * + * The original resampling context is reset even on failure. + * The function calls swr_close() internally if the context is open. + * + * @see swr_close(); + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure. + */ +int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in); + +/** + * @} + * @} + */ + +#endif /* SWRESAMPLE_SWRESAMPLE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/version.h new file mode 100644 index 0000000..a0b361b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswresample/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_VERSION_H +#define SWRESAMPLE_VERSION_H + +/** + * @file + * Libswresample version macros + */ + +#include "libavutil/avutil.h" + +#define LIBSWRESAMPLE_VERSION_MAJOR 3 +#define LIBSWRESAMPLE_VERSION_MINOR 5 +#define LIBSWRESAMPLE_VERSION_MICRO 100 + +#define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_VERSION AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_BUILD LIBSWRESAMPLE_VERSION_INT + +#define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) + +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/swscale.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/swscale.h new file mode 100644 index 0000000..7713f51 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/swscale.h @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2001-2011 Michael Niedermayer + * + * 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 + */ + +#ifndef SWSCALE_SWSCALE_H +#define SWSCALE_SWSCALE_H + +/** + * @file + * @ingroup libsws + * external API header + */ + +#include + +#include "libavutil/avutil.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "version.h" + +/** + * @defgroup libsws libswscale + * Color conversion and scaling library. + * + * @{ + * + * Return the LIBSWSCALE_VERSION_INT constant. + */ +unsigned swscale_version(void); + +/** + * Return the libswscale build-time configuration. + */ +const char *swscale_configuration(void); + +/** + * Return the libswscale license. + */ +const char *swscale_license(void); + +/* values for the flags, the stuff on the command line is different */ +#define SWS_FAST_BILINEAR 1 +#define SWS_BILINEAR 2 +#define SWS_BICUBIC 4 +#define SWS_X 8 +#define SWS_POINT 0x10 +#define SWS_AREA 0x20 +#define SWS_BICUBLIN 0x40 +#define SWS_GAUSS 0x80 +#define SWS_SINC 0x100 +#define SWS_LANCZOS 0x200 +#define SWS_SPLINE 0x400 + +#define SWS_SRC_V_CHR_DROP_MASK 0x30000 +#define SWS_SRC_V_CHR_DROP_SHIFT 16 + +#define SWS_PARAM_DEFAULT 123456 + +#define SWS_PRINT_INFO 0x1000 + +//the following 3 flags are not completely implemented +//internal chrominance subsampling info +#define SWS_FULL_CHR_H_INT 0x2000 +//input subsampling info +#define SWS_FULL_CHR_H_INP 0x4000 +#define SWS_DIRECT_BGR 0x8000 +#define SWS_ACCURATE_RND 0x40000 +#define SWS_BITEXACT 0x80000 +#define SWS_ERROR_DIFFUSION 0x800000 + +#define SWS_MAX_REDUCE_CUTOFF 0.002 + +#define SWS_CS_ITU709 1 +#define SWS_CS_FCC 4 +#define SWS_CS_ITU601 5 +#define SWS_CS_ITU624 5 +#define SWS_CS_SMPTE170M 5 +#define SWS_CS_SMPTE240M 7 +#define SWS_CS_DEFAULT 5 +#define SWS_CS_BT2020 9 + +/** + * Return a pointer to yuv<->rgb coefficients for the given colorspace + * suitable for sws_setColorspaceDetails(). + * + * @param colorspace One of the SWS_CS_* macros. If invalid, + * SWS_CS_DEFAULT is used. + */ +const int *sws_getCoefficients(int colorspace); + +// when used for filters they must have an odd number of elements +// coeffs cannot be shared between vectors +typedef struct SwsVector { + double *coeff; ///< pointer to the list of coefficients + int length; ///< number of coefficients in the vector +} SwsVector; + +// vectors can be shared +typedef struct SwsFilter { + SwsVector *lumH; + SwsVector *lumV; + SwsVector *chrH; + SwsVector *chrV; +} SwsFilter; + +struct SwsContext; + +/** + * Return a positive value if pix_fmt is a supported input format, 0 + * otherwise. + */ +int sws_isSupportedInput(enum AVPixelFormat pix_fmt); + +/** + * Return a positive value if pix_fmt is a supported output format, 0 + * otherwise. + */ +int sws_isSupportedOutput(enum AVPixelFormat pix_fmt); + +/** + * @param[in] pix_fmt the pixel format + * @return a positive value if an endianness conversion for pix_fmt is + * supported, 0 otherwise. + */ +int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt); + +/** + * Allocate an empty SwsContext. This must be filled and passed to + * sws_init_context(). For filling see AVOptions, options.c and + * sws_setColorspaceDetails(). + */ +struct SwsContext *sws_alloc_context(void); + +/** + * Initialize the swscaler context sws_context. + * + * @return zero or positive value on success, a negative value on + * error + */ +av_warn_unused_result +int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter); + +/** + * Free the swscaler context swsContext. + * If swsContext is NULL, then does nothing. + */ +void sws_freeContext(struct SwsContext *swsContext); + +/** + * Allocate and return an SwsContext. You need it to perform + * scaling/conversion operations using sws_scale(). + * + * @param srcW the width of the source image + * @param srcH the height of the source image + * @param srcFormat the source image format + * @param dstW the width of the destination image + * @param dstH the height of the destination image + * @param dstFormat the destination image format + * @param flags specify which algorithm and options to use for rescaling + * @param param extra parameters to tune the used scaler + * For SWS_BICUBIC param[0] and [1] tune the shape of the basis + * function, param[0] tunes f(1) and param[1] f´(1) + * For SWS_GAUSS param[0] tunes the exponent and thus cutoff + * frequency + * For SWS_LANCZOS param[0] tunes the width of the window function + * @return a pointer to an allocated context, or NULL in case of error + * @note this function is to be removed after a saner alternative is + * written + */ +struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Scale the image slice in srcSlice and put the resulting scaled + * slice in the image in dst. A slice is a sequence of consecutive + * rows in an image. + * + * Slices have to be provided in sequential order, either in + * top-bottom or bottom-top order. If slices are provided in + * non-sequential order the behavior of the function is undefined. + * + * @param c the scaling context previously created with + * sws_getContext() + * @param srcSlice the array containing the pointers to the planes of + * the source slice + * @param srcStride the array containing the strides for each plane of + * the source image + * @param srcSliceY the position in the source image of the slice to + * process, that is the number (counted starting from + * zero) in the image of the first row of the slice + * @param srcSliceH the height of the source slice, that is the number + * of rows in the slice + * @param dst the array containing the pointers to the planes of + * the destination image + * @param dstStride the array containing the strides for each plane of + * the destination image + * @return the height of the output slice + */ +int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], + const int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *const dst[], const int dstStride[]); + +/** + * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) + * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) + * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x] + * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x] + * @param brightness 16.16 fixed point brightness correction + * @param contrast 16.16 fixed point contrast correction + * @param saturation 16.16 fixed point saturation correction + * @return -1 if not supported + */ +int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], + int srcRange, const int table[4], int dstRange, + int brightness, int contrast, int saturation); + +/** + * @return -1 if not supported + */ +int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, + int *srcRange, int **table, int *dstRange, + int *brightness, int *contrast, int *saturation); + +/** + * Allocate and return an uninitialized vector with length coefficients. + */ +SwsVector *sws_allocVec(int length); + +/** + * Return a normalized Gaussian curve used to filter stuff + * quality = 3 is high quality, lower is lower quality. + */ +SwsVector *sws_getGaussianVec(double variance, double quality); + +/** + * Scale all the coefficients of a by the scalar value. + */ +void sws_scaleVec(SwsVector *a, double scalar); + +/** + * Scale all the coefficients of a so that their sum equals height. + */ +void sws_normalizeVec(SwsVector *a, double height); + +#if FF_API_SWS_VECTOR +attribute_deprecated SwsVector *sws_getConstVec(double c, int length); +attribute_deprecated SwsVector *sws_getIdentityVec(void); +attribute_deprecated void sws_convVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_addVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_subVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_shiftVec(SwsVector *a, int shift); +attribute_deprecated SwsVector *sws_cloneVec(SwsVector *a); +attribute_deprecated void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); +#endif + +void sws_freeVec(SwsVector *a); + +SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, + float lumaSharpen, float chromaSharpen, + float chromaHShift, float chromaVShift, + int verbose); +void sws_freeFilter(SwsFilter *filter); + +/** + * Check if context can be reused, otherwise reallocate a new one. + * + * If context is NULL, just calls sws_getContext() to get a new + * context. Otherwise, checks if the parameters are the ones already + * saved in context. If that is the case, returns the current + * context. Otherwise, frees context and gets a new context with + * the new parameters. + * + * Be warned that srcFilter and dstFilter are not checked, they + * are assumed to remain the same. + */ +struct SwsContext *sws_getCachedContext(struct SwsContext *context, + int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 32 bits. + * + * The output frame will have the same packed format as the palette. + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 24 bits. + * + * With the palette format "ABCD", the destination frame ends up with the format "ABC". + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Get the AVClass for swsContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *sws_get_class(void); + +/** + * @} + */ + +#endif /* SWSCALE_SWSCALE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/version.h new file mode 100644 index 0000000..acb289d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/libswscale/version.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef SWSCALE_VERSION_H +#define SWSCALE_VERSION_H + +/** + * @file + * swscale version macros + */ + +#include "libavutil/version.h" + +#define LIBSWSCALE_VERSION_MAJOR 5 +#define LIBSWSCALE_VERSION_MINOR 5 +#define LIBSWSCALE_VERSION_MICRO 100 + +#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_VERSION AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_BUILD LIBSWSCALE_VERSION_INT + +#define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_SWS_VECTOR +#define FF_API_SWS_VECTOR (LIBSWSCALE_VERSION_MAJOR < 6) +#endif + +#endif /* SWSCALE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxdefs.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxdefs.h new file mode 100644 index 0000000..c2cb52a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxdefs.h @@ -0,0 +1,112 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxdefs.h + +\* ****************************************************************************** */ +#ifndef __MFXDEFS_H__ +#define __MFXDEFS_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if defined( _WIN32 ) || defined ( _WIN64 ) + #define __INT64 __int64 + #define __UINT64 unsigned __int64 +#else + #define __INT64 long long + #define __UINT64 unsigned long long +#endif + +#define MFX_INFINITE 0xFFFFFFFF + +typedef unsigned char mfxU8; +typedef char mfxI8; +typedef short mfxI16; +typedef unsigned short mfxU16; +typedef unsigned int mfxU32; +typedef int mfxI32; +#if defined( _WIN32 ) || defined ( _WIN64 ) +typedef unsigned long mfxUL32; +typedef long mfxL32; +#else +typedef unsigned int mfxUL32; +typedef int mfxL32; +#endif +typedef float mfxF32; +typedef double mfxF64; +typedef __UINT64 mfxU64; +typedef __INT64 mfxI64; +typedef void* mfxHDL; +typedef mfxHDL mfxMemId; +typedef void* mfxThreadTask; + +typedef struct { + mfxI16 x; + mfxI16 y; +} mfxI16Pair; + +typedef struct { + mfxHDL first; + mfxHDL second; +} mfxHDLPair; + + +/*********************************************************************************\ +Error message +\*********************************************************************************/ +typedef enum +{ + /* no error */ + MFX_ERR_NONE = 0, /* no error */ + + /* reserved for unexpected errors */ + MFX_ERR_UNKNOWN = -1, /* unknown error. */ + + /* error codes <0 */ + MFX_ERR_NULL_PTR = -2, /* null pointer */ + MFX_ERR_UNSUPPORTED = -3, /* undeveloped feature */ + MFX_ERR_MEMORY_ALLOC = -4, /* failed to allocate memory */ + MFX_ERR_NOT_ENOUGH_BUFFER = -5, /* insufficient buffer at input/output */ + MFX_ERR_INVALID_HANDLE = -6, /* invalid handle */ + MFX_ERR_LOCK_MEMORY = -7, /* failed to lock the memory block */ + MFX_ERR_NOT_INITIALIZED = -8, /* member function called before initialization */ + MFX_ERR_NOT_FOUND = -9, /* the specified object is not found */ + MFX_ERR_MORE_DATA = -10, /* expect more data at input */ + MFX_ERR_MORE_SURFACE = -11, /* expect more surface at output */ + MFX_ERR_ABORTED = -12, /* operation aborted */ + MFX_ERR_DEVICE_LOST = -13, /* lose the HW acceleration device */ + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM = -14, /* incompatible video parameters */ + MFX_ERR_INVALID_VIDEO_PARAM = -15, /* invalid video parameters */ + MFX_ERR_UNDEFINED_BEHAVIOR = -16, /* undefined behavior */ + MFX_ERR_DEVICE_FAILED = -17, /* device operation failure */ + MFX_ERR_MORE_BITSTREAM = -18, /* expect more bitstream buffers at output */ + + /* warnings >0 */ + MFX_WRN_IN_EXECUTION = 1, /* the previous asynchrous operation is in execution */ + MFX_WRN_DEVICE_BUSY = 2, /* the HW acceleration device is busy */ + MFX_WRN_VIDEO_PARAM_CHANGED = 3, /* the video parameters are changed during decoding */ + MFX_WRN_PARTIAL_ACCELERATION = 4, /* SW is used */ + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM = 5, /* incompatible video parameters */ + MFX_WRN_VALUE_NOT_CHANGED = 6, /* the value is saturated based on its valid range */ + MFX_WRN_OUT_OF_RANGE = 7, /* the value is out of valid range */ + + /* threading statuses */ + MFX_TASK_DONE = MFX_ERR_NONE, /* task has been completed */ + MFX_TASK_WORKING = 8, /* there is some more work to do */ + MFX_TASK_BUSY = 9 /* task is waiting for resources */ + +} mfxStatus; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MFXDEFS_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxjpeg.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxjpeg.h new file mode 100644 index 0000000..5b8ab27 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxjpeg.h @@ -0,0 +1,45 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxjpeg.h + +*******************************************************************************/ +#ifndef __MFX_JPEG_H__ +#define __MFX_JPEG_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* CodecId */ +enum { + MFX_CODEC_JPEG = MFX_MAKEFOURCC('J','P','E','G') +}; + +/* CodecProfile, CodecLevel */ +enum +{ + MFX_PROFILE_JPEG_BASELINE = 1 +}; + +enum +{ + MFX_ROTATION_0 = 0, + MFX_ROTATION_90 = 1, + MFX_ROTATION_180 = 2, + MFX_ROTATION_270 = 3 +}; + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif // __MFX_JPEG_H__ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxmvc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxmvc.h new file mode 100644 index 0000000..af74465 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxmvc.h @@ -0,0 +1,91 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxmvc.h + +*******************************************************************************/ +#ifndef __MFXMVC_H__ +#define __MFXMVC_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* CodecProfile, CodecLevel */ +enum { + /* MVC profiles */ + MFX_PROFILE_AVC_MULTIVIEW_HIGH =118, + MFX_PROFILE_AVC_STEREO_HIGH =128 +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_MVC_SEQ_DESC = MFX_MAKEFOURCC('M','V','C','D'), + MFX_EXTBUFF_MVC_TARGET_VIEWS = MFX_MAKEFOURCC('M','V','C','T') +}; + +typedef struct { + mfxU16 ViewId; + + mfxU16 NumAnchorRefsL0; + mfxU16 NumAnchorRefsL1; + mfxU16 AnchorRefL0[16]; + mfxU16 AnchorRefL1[16]; + + mfxU16 NumNonAnchorRefsL0; + mfxU16 NumNonAnchorRefsL1; + mfxU16 NonAnchorRefL0[16]; + mfxU16 NonAnchorRefL1[16]; +} mfxMVCViewDependency; + +typedef struct { + mfxU16 TemporalId; /* operation point temporal ID */ + mfxU16 LevelIdc; + + mfxU16 NumViews; /* total number of views, including "depend on" views */ + mfxU16 NumTargetViews; /* number of the output views for the current operation point */ + mfxU16 *TargetViewId; /* array of target view ID, it points to mfxExtMVCSeqDesc::ViewId, set by SDK */ +} mfxMVCOperationPoint; + +typedef struct { + mfxExtBuffer Header; + + mfxU32 NumView; /* number of view in the stream, set by SDK */ + mfxU32 NumViewAlloc; /* number of allocated elements, set by application */ + mfxMVCViewDependency *View; /* view ID and list of views used as reference for this view, allocated by application */ + + mfxU32 NumViewId; /* num of views IDs, to simplify copying, set by SDK */ + mfxU32 NumViewIdAlloc; /* number of allocated elements, set by application */ + mfxU16 *ViewId; /* allocated by application */ + + mfxU32 NumOP; /* number of operation points in OP array, set by SDK */ + mfxU32 NumOPAlloc; /* number of allocated elements in OP array, set by application */ + mfxMVCOperationPoint *OP; /* allocated by application */ + + mfxU16 NumRefsTotal; /* total number of reference frames in the sequence */ + mfxU32 Reserved[16]; + +} mfxExtMVCSeqDesc; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 TemporalId; + mfxU32 NumView; /* number of view to decode */ + mfxU16 ViewId[1024]; +} mfxExtMVCTargetViews ; + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin++.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin++.h new file mode 100644 index 0000000..b62c9b9 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin++.h @@ -0,0 +1,55 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2011 Intel Corporation. All Rights Reserved. + + +File Name: mfxplugin++.h + +\* ****************************************************************************** */ + +#ifndef __MFXPLUGINPLUSPLUS_H +#define __MFXPLUGINPLUSPLUS_H + +#include "mfxvideo.h" +#include "mfxplugin.h" + +class MFXPlugin +{ +public: + virtual mfxStatus mfxPluginInit(mfxCoreInterface *core) = 0; + virtual mfxStatus mfxPluginClose() = 0; + virtual mfxStatus mfxGetPluginParam(mfxPluginParam *par) = 0; + virtual mfxStatus mfxSubmit(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) = 0; + virtual mfxStatus mfxExecute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a) = 0; + virtual mfxStatus mfxFreeResources(mfxThreadTask task, mfxStatus sts) = 0; +}; + +/* Class adapter between "C" structure mfxPlugin and C++ interface MFXPlugin */ +class MFXPluginAdapter : public mfxPlugin +{ +public: + MFXPluginAdapter(MFXPlugin *pPlugin) + { + pthis = pPlugin; + PluginInit = MFXPluginAdapter::_PluginInit; + PluginClose = MFXPluginAdapter::_PluginClose; + GetPluginParam = MFXPluginAdapter::_GetPluginParam; + Submit = MFXPluginAdapter::_Submit; + Execute = MFXPluginAdapter::_Execute; + FreeResources = MFXPluginAdapter::_FreeResources; + } + +private: + static mfxStatus _PluginInit(mfxHDL pthis, mfxCoreInterface *core) { return ((MFXPlugin*)pthis)->mfxPluginInit(core); } + static mfxStatus _PluginClose(mfxHDL pthis) { return ((MFXPlugin*)pthis)->mfxPluginClose(); } + static mfxStatus _GetPluginParam(mfxHDL pthis, mfxPluginParam *par) { return ((MFXPlugin*)pthis)->mfxGetPluginParam(par); } + static mfxStatus _Submit(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) { return ((MFXPlugin*)pthis)->mfxSubmit(in, in_num, out, out_num, task); } + static mfxStatus _Execute(mfxHDL pthis, mfxThreadTask task, mfxU32 thread_id, mfxU32 call_count) { return ((MFXPlugin*)pthis)->mfxExecute(task, thread_id, call_count); } + static mfxStatus _FreeResources(mfxHDL pthis, mfxThreadTask task, mfxStatus sts) { return ((MFXPlugin*)pthis)->mfxFreeResources(task, sts); } +}; + +#endif // __MFXPLUGINPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin.h new file mode 100644 index 0000000..bfb7547 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxplugin.h @@ -0,0 +1,90 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2011 Intel Corporation. All Rights Reserved. + +File Name: mfxplugin.h + +*******************************************************************************/ +#ifndef __MFXPLUGIN_H__ +#define __MFXPLUGIN_H__ +#include "mfxvideo.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +typedef enum { + MFX_THREADPOLICY_SERIAL = 0, + MFX_THREADPOLICY_PARALLEL = 1 +} mfxThreadPolicy; + +typedef struct mfxPluginParam { + mfxU32 reserved[14]; + mfxThreadPolicy ThreadPolicy; + mfxU32 MaxThreadNum; +} mfxPluginParam; + +typedef struct mfxCoreParam{ + mfxU32 reserved[13]; + mfxIMPL Impl; + mfxVersion Version; + mfxU32 NumWorkingThread; +} mfxCoreParam; + +typedef struct mfxCoreInterface { + mfxHDL pthis; + + mfxHDL reserved1[2]; + mfxFrameAllocator FrameAllocator; + mfxBufferAllocator reserved3; + + mfxStatus (MFX_CDECL *GetCoreParam)(mfxHDL pthis, mfxCoreParam *par); + mfxStatus (MFX_CDECL *GetHandle) (mfxHDL pthis, mfxHandleType type, mfxHDL *handle); + mfxStatus (MFX_CDECL *IncreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *DecreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *CopyFrame) (mfxHDL pthis, mfxFrameSurface1 *dst, mfxFrameSurface1 *src); + mfxStatus (MFX_CDECL *CopyBuffer)(mfxHDL pthis, mfxU8 *dst, mfxU32 size, mfxFrameSurface1 *src); + + mfxStatus (MFX_CDECL *MapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + mfxStatus (MFX_CDECL *UnmapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + + mfxStatus (MFX_CDECL *GetRealSurface)(mfxHDL pthis, mfxFrameSurface1 *op_surf, mfxFrameSurface1 **surf); + mfxStatus (MFX_CDECL *GetOpaqueSurface)(mfxHDL pthis, mfxFrameSurface1 *surf, mfxFrameSurface1 **op_surf); + + mfxHDL reserved4[4]; +} mfxCoreInterface; + +typedef struct mfxPlugin{ + mfxHDL pthis; + + mfxStatus (MFX_CDECL *PluginInit) (mfxHDL pthis, mfxCoreInterface *core); + mfxStatus (MFX_CDECL *PluginClose) (mfxHDL pthis); + + mfxStatus (MFX_CDECL *GetPluginParam)(mfxHDL pthis, mfxPluginParam *par); + + mfxStatus (MFX_CDECL *Submit)(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task); + mfxStatus (MFX_CDECL *Execute)(mfxHDL pthis, mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); + mfxStatus (MFX_CDECL *FreeResources)(mfxHDL pthis, mfxThreadTask task, mfxStatus sts); + + mfxHDL reserved[9]; +} mfxPlugin; + + + +mfxStatus MFX_CDECL MFXVideoUSER_Register(mfxSession session, mfxU32 type, const mfxPlugin *par); +mfxStatus MFX_CDECL MFXVideoUSER_Unregister(mfxSession session, mfxU32 type); + +mfxStatus MFX_CDECL MFXVideoUSER_ProcessFrameAsync(mfxSession session, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif /* __MFXPLUGIN_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxstructures.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxstructures.h new file mode 100644 index 0000000..13e362b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxstructures.h @@ -0,0 +1,763 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxstructures.h + +*******************************************************************************/ +#ifndef __MFXSTRUCTURES_H__ +#define __MFXSTRUCTURES_H__ +#include "mfxdefs.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" { +#endif + +#define MFX_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24)) + +/* Extended Configuration Header Structure */ +typedef struct { + mfxU32 BufferId; + mfxU32 BufferSz; +} mfxExtBuffer; + +/* Frame ID for SVC and MVC */ +typedef struct { + mfxU16 TemporalId; + mfxU16 PriorityId; + union { + struct { + mfxU16 DependencyId; + mfxU16 QualityId; + }; + struct { + mfxU16 ViewId; + }; + }; +} mfxFrameId; + +/* Frame Info */ +typedef struct { + mfxU32 reserved[6]; + mfxFrameId FrameId; + + mfxU32 FourCC; + mfxU16 Width; + mfxU16 Height; + + mfxU16 CropX; + mfxU16 CropY; + mfxU16 CropW; + mfxU16 CropH; + + mfxU32 FrameRateExtN; + mfxU32 FrameRateExtD; + mfxU16 reserved3; + + mfxU16 AspectRatioW; + mfxU16 AspectRatioH; + + mfxU16 PicStruct; + mfxU16 ChromaFormat; + mfxU16 reserved2; +} mfxFrameInfo; + +/* FourCC */ +enum { + MFX_FOURCC_NV12 = MFX_MAKEFOURCC('N','V','1','2'), /* Native Format */ + MFX_FOURCC_YV12 = MFX_MAKEFOURCC('Y','V','1','2'), + MFX_FOURCC_YUY2 = MFX_MAKEFOURCC('Y','U','Y','2'), + MFX_FOURCC_RGB3 = MFX_MAKEFOURCC('R','G','B','3'), /* RGB24 */ + MFX_FOURCC_RGB4 = MFX_MAKEFOURCC('R','G','B','4'), /* RGB32 */ + MFX_FOURCC_P8 = 41 /* D3DFMT_P8 */ +}; + +/* PicStruct */ +enum { + MFX_PICSTRUCT_UNKNOWN =0x00, + MFX_PICSTRUCT_PROGRESSIVE =0x01, + MFX_PICSTRUCT_FIELD_TFF =0x02, + MFX_PICSTRUCT_FIELD_BFF =0x04, + + MFX_PICSTRUCT_FIELD_REPEATED=0x10, /* first field repeated, pic_struct=5 or 6 in H.264 */ + MFX_PICSTRUCT_FRAME_DOUBLING=0x20, /* pic_struct=7 in H.264 */ + MFX_PICSTRUCT_FRAME_TRIPLING=0x40 /* pic_struct=8 in H.264 */ +}; + +/* ColorFormat */ +enum { + MFX_CHROMAFORMAT_MONOCHROME =0, + MFX_CHROMAFORMAT_YUV420 =1, + MFX_CHROMAFORMAT_YUV422 =2, + MFX_CHROMAFORMAT_YUV444 =3, + MFX_CHROMAFORMAT_YUV400 = MFX_CHROMAFORMAT_MONOCHROME, + MFX_CHROMAFORMAT_YUV411 = 4, + MFX_CHROMAFORMAT_YUV422H = MFX_CHROMAFORMAT_YUV422, + MFX_CHROMAFORMAT_YUV422V = 5 + +}; + +enum { + MFX_TIMESTAMP_UNKNOWN = -1 +}; + +enum { + MFX_FRAMEORDER_UNKNOWN = -1 +}; + +/* DataFlag in mfxFrameData */ +enum { + MFX_FRAMEDATA_ORIGINAL_TIMESTAMP = 0x0001 +}; + +/* Corrupted in mfxFrameData */ +enum { + MFX_CORRUPTION_MINOR = 0x0001, + MFX_CORRUPTION_MAJOR = 0x0002, + MFX_CORRUPTION_REFERENCE_FRAME = 0x0010, + MFX_CORRUPTION_REFERENCE_LIST = 0x0020 +}; + +/* Frame Data Info */ +typedef struct { + mfxU32 reserved[8]; + + mfxU64 TimeStamp; + mfxU32 FrameOrder; + mfxU16 Locked; + mfxU16 Pitch; + + /* color planes */ + union { + mfxU8 *Y; + mfxU8 *R; + }; + union { + mfxU8 *UV; /* for UV merged formats */ + mfxU8 *VU; /* for VU merged formats */ + mfxU8 *CbCr; /* for CbCr merged formats */ + mfxU8 *CrCb; /* for CrCb merged formats */ + mfxU8 *Cb; + mfxU8 *U; + mfxU8 *G; + }; + union { + mfxU8 *Cr; + mfxU8 *V; + mfxU8 *B; + }; + mfxU8 *A; + mfxMemId MemId; + + /* Additional Flags */ + mfxU16 Corrupted; + mfxU16 DataFlag; +} mfxFrameData; + +/* Frame Surface */ +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxFrameData Data; +} mfxFrameSurface1; + +enum { + MFX_TIMESTAMPCALC_UNKNOWN = 0, + MFX_TIMESTAMPCALC_TELECINE = 1, +}; + +/* Transcoding Info */ +typedef struct { + mfxU32 reserved[7]; + + mfxU16 reserved4; + mfxU16 BRCParamMultiplier; + + mfxFrameInfo FrameInfo; + mfxU32 CodecId; + mfxU16 CodecProfile; + mfxU16 CodecLevel; + mfxU16 NumThread; + + union { + struct { /* MPEG-2/H.264 Encoding Options */ + mfxU16 TargetUsage; + + mfxU16 GopPicSize; + mfxU16 GopRefDist; + mfxU16 GopOptFlag; + mfxU16 IdrInterval; + + mfxU16 RateControlMethod; + union { + mfxU16 InitialDelayInKB; + mfxU16 QPI; + mfxU16 Accuracy; + }; + mfxU16 BufferSizeInKB; + union { + mfxU16 TargetKbps; + mfxU16 QPP; + }; + union { + mfxU16 MaxKbps; + mfxU16 QPB; + mfxU16 Convergence; + }; + + mfxU16 NumSlice; + mfxU16 NumRefFrame; + mfxU16 EncodedOrder; + }; + struct { /* H.264, MPEG-2 and VC-1 Decoding Options */ + mfxU16 DecodedOrder; + mfxU16 ExtendedPicStruct; + mfxU16 TimeStampCalc; + mfxU16 reserved2[10]; + }; + struct { /* JPEG Decoding Options */ + mfxU16 JPEGChromaFormat; + mfxU16 Rotation; + mfxU16 reserved3[11]; + }; + }; +} mfxInfoMFX; + +typedef struct { + mfxU32 reserved[8]; + mfxFrameInfo In; + mfxFrameInfo Out; +} mfxInfoVPP; + +typedef struct { + mfxU32 reserved[3]; + mfxU16 reserved3; + mfxU16 AsyncDepth; + + union { + mfxInfoMFX mfx; + mfxInfoVPP vpp; + }; + mfxU16 Protected; + mfxU16 IOPattern; + mfxExtBuffer** ExtParam; + mfxU16 NumExtParam; + mfxU16 reserved2; +} mfxVideoParam; + +/* IOPattern */ +enum { + MFX_IOPATTERN_IN_VIDEO_MEMORY = 0x01, + MFX_IOPATTERN_IN_SYSTEM_MEMORY = 0x02, + MFX_IOPATTERN_IN_OPAQUE_MEMORY = 0x04, + MFX_IOPATTERN_OUT_VIDEO_MEMORY = 0x10, + MFX_IOPATTERN_OUT_SYSTEM_MEMORY = 0x20, + MFX_IOPATTERN_OUT_OPAQUE_MEMORY = 0x40 +}; + +/* CodecId */ +enum { + MFX_CODEC_AVC =MFX_MAKEFOURCC('A','V','C',' '), + MFX_CODEC_MPEG2 =MFX_MAKEFOURCC('M','P','G','2'), + MFX_CODEC_VC1 =MFX_MAKEFOURCC('V','C','1',' ') +}; + +/* CodecProfile, CodecLevel */ +enum { + MFX_PROFILE_UNKNOWN =0, + MFX_LEVEL_UNKNOWN =0, + + /* AVC Profiles & Levels */ + MFX_PROFILE_AVC_CONSTRAINT_SET0 = (0x100 << 0), + MFX_PROFILE_AVC_CONSTRAINT_SET1 = (0x100 << 1), + MFX_PROFILE_AVC_CONSTRAINT_SET2 = (0x100 << 2), + MFX_PROFILE_AVC_CONSTRAINT_SET3 = (0x100 << 3), + MFX_PROFILE_AVC_CONSTRAINT_SET4 = (0x100 << 4), + MFX_PROFILE_AVC_CONSTRAINT_SET5 = (0x100 << 5), + + MFX_PROFILE_AVC_BASELINE =66, + MFX_PROFILE_AVC_MAIN =77, + MFX_PROFILE_AVC_EXTENDED =88, + MFX_PROFILE_AVC_HIGH =100, + MFX_PROFILE_AVC_CONSTRAINED_BASELINE =MFX_PROFILE_AVC_BASELINE + MFX_PROFILE_AVC_CONSTRAINT_SET1, + MFX_PROFILE_AVC_CONSTRAINED_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4 + + MFX_PROFILE_AVC_CONSTRAINT_SET5, + MFX_PROFILE_AVC_PROGRESSIVE_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4, + + MFX_LEVEL_AVC_1 =10, + MFX_LEVEL_AVC_1b =9, + MFX_LEVEL_AVC_11 =11, + MFX_LEVEL_AVC_12 =12, + MFX_LEVEL_AVC_13 =13, + MFX_LEVEL_AVC_2 =20, + MFX_LEVEL_AVC_21 =21, + MFX_LEVEL_AVC_22 =22, + MFX_LEVEL_AVC_3 =30, + MFX_LEVEL_AVC_31 =31, + MFX_LEVEL_AVC_32 =32, + MFX_LEVEL_AVC_4 =40, + MFX_LEVEL_AVC_41 =41, + MFX_LEVEL_AVC_42 =42, + MFX_LEVEL_AVC_5 =50, + MFX_LEVEL_AVC_51 =51, + + /* MPEG-2 Profiles & Levels */ + MFX_PROFILE_MPEG2_SIMPLE =0x50, + MFX_PROFILE_MPEG2_MAIN =0x40, + MFX_PROFILE_MPEG2_HIGH =0x10, + + MFX_LEVEL_MPEG2_LOW =0xA, + MFX_LEVEL_MPEG2_MAIN =0x8, + MFX_LEVEL_MPEG2_HIGH =0x4, + MFX_LEVEL_MPEG2_HIGH1440 =0x6, + + /* VC1 Profiles & Levels */ + MFX_PROFILE_VC1_SIMPLE =(0+1), + MFX_PROFILE_VC1_MAIN =(4+1), + MFX_PROFILE_VC1_ADVANCED =(12+1), + + /* VC1 levels for simple & main profiles */ + MFX_LEVEL_VC1_LOW =(0+1), + MFX_LEVEL_VC1_MEDIAN =(2+1), + MFX_LEVEL_VC1_HIGH =(4+1), + + /* VC1 levels for the advanced profile */ + MFX_LEVEL_VC1_0 =(0x00+1), + MFX_LEVEL_VC1_1 =(0x01+1), + MFX_LEVEL_VC1_2 =(0x02+1), + MFX_LEVEL_VC1_3 =(0x03+1), + MFX_LEVEL_VC1_4 =(0x04+1) +}; + +/* GopOptFlag */ +enum { + MFX_GOP_CLOSED =1, + MFX_GOP_STRICT =2 +}; + +/* TargetUsages: from 1 to 7 inclusive */ +enum { + MFX_TARGETUSAGE_UNKNOWN =0, + MFX_TARGETUSAGE_BEST_QUALITY =1, + MFX_TARGETUSAGE_BALANCED =4, + MFX_TARGETUSAGE_BEST_SPEED =7 +}; + +/* RateControlMethod */ +enum { + MFX_RATECONTROL_CBR =1, + MFX_RATECONTROL_VBR =2, + MFX_RATECONTROL_CQP =3, + MFX_RATECONTROL_AVBR =4 +}; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved1; + mfxU16 RateDistortionOpt; /* tri-state option */ + mfxU16 MECostType; + mfxU16 MESearchType; + mfxI16Pair MVSearchWindow; + mfxU16 EndOfSequence; /* tri-state option */ + mfxU16 FramePicture; /* tri-state option */ + + union { + struct { /* AVC */ + mfxU16 CAVLC; /* tri-state option */ + mfxU16 reserved2[3]; + mfxU16 ViewOutput; /* tri-state option */ + mfxU16 NalHrdConformance; /* tri-state option */ + mfxU16 SingleSeiNalUnit; /* tri-state option */ + mfxU16 VuiVclHrdParameters; /* tri-state option */ + + mfxU16 RefPicListReordering; /* tri-state option */ + mfxU16 ResetRefList; /* tri-state option */ + mfxU16 RefPicMarkRep; /* tri-state option */ + mfxU16 FieldOutput; /* tri-state option */ + + mfxU16 IntraPredBlockSize; + mfxU16 InterPredBlockSize; + mfxU16 MVPrecision; + mfxU16 MaxDecFrameBuffering; + + mfxU16 AUDelimiter; /* tri-state option */ + mfxU16 EndOfStream; /* tri-state option */ + mfxU16 PicTimingSEI; /* tri-state option */ + mfxU16 VuiNalHrdParameters; /* tri-state option */ + }; + }; +} mfxExtCodingOption; + +/* IntraPredBlockSize/InterPredBlockSize */ +enum { + MFX_BLOCKSIZE_UNKNOWN = 0, + MFX_BLOCKSIZE_MIN_16X16 = 1, /* 16x16 */ + MFX_BLOCKSIZE_MIN_8X8 = 2, /* 16x16, 8x8 */ + MFX_BLOCKSIZE_MIN_4X4 = 3 /* 16x16, 8x8, 4x4 */ +}; + +/* MVPrecision */ +enum { + MFX_MVPRECISION_UNKNOWN = 0, + MFX_MVPRECISION_INTEGER = (1 << 0), + MFX_MVPRECISION_HALFPEL = (1 << 1), + MFX_MVPRECISION_QUARTERPEL = (1 << 2) +}; + +enum { + MFX_CODINGOPTION_UNKNOWN =0, + MFX_CODINGOPTION_ON =0x10, + MFX_CODINGOPTION_OFF =0x20 +}; + +typedef struct _mfxEncryptedData mfxEncryptedData; + +typedef struct { + union { + mfxEncryptedData* EncryptedData; + mfxU32 reserved[8]; + }; + mfxU64 TimeStamp; + mfxU8* Data; + mfxU32 DataOffset; + mfxU32 DataLength; + mfxU32 MaxLength; + + mfxU16 PicStruct; + mfxU16 FrameType; + mfxU16 DataFlag; + mfxU16 reserved2; +} mfxBitstream; + +/* Data Flag */ +enum { + MFX_BITSTREAM_COMPLETE_FRAME = 0x0001 /* the bitstream contains a complete frame or field pair of data */ +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_CODING_OPTION = MFX_MAKEFOURCC('C','D','O','P'), + MFX_EXTBUFF_CODING_OPTION_SPSPPS= MFX_MAKEFOURCC('C','O','S','P'), + MFX_EXTBUFF_VPP_DONOTUSE = MFX_MAKEFOURCC('N','U','S','E'), + MFX_EXTBUFF_VPP_AUXDATA = MFX_MAKEFOURCC('A','U','X','D'), + MFX_EXTBUFF_VPP_DENOISE = MFX_MAKEFOURCC('D','N','I','S'), + MFX_EXTBUFF_VPP_SCENE_ANALYSIS = MFX_MAKEFOURCC('S','C','L','Y'), + MFX_EXTBUFF_VPP_SCENE_CHANGE = MFX_EXTBUFF_VPP_SCENE_ANALYSIS, + MFX_EXTBUFF_VPP_PROCAMP = MFX_MAKEFOURCC('P','A','M','P'), + MFX_EXTBUFF_VPP_DETAIL = MFX_MAKEFOURCC('D','E','T',' '), + MFX_EXTBUFF_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','S','I','N'), + MFX_EXTBUFF_VPP_DOUSE = MFX_MAKEFOURCC('D','U','S','E'), + MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION = MFX_MAKEFOURCC('O','P','Q','S'), + MFX_EXTBUFF_AVC_REFLIST_CTRL = MFX_MAKEFOURCC('R','L','S','T'), + MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION = MFX_MAKEFOURCC('F','R','C',' '), + MFX_EXTBUFF_PICTURE_TIMING_SEI = MFX_MAKEFOURCC('P','T','S','E'), + MFX_EXTBUFF_AVC_TEMPORAL_LAYERS = MFX_MAKEFOURCC('A','T','M','L') +}; + +/* VPP Conf: Do not use certain algorithms */ +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32* AlgList; +} mfxExtVPPDoNotUse; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DenoiseFactor; +} mfxExtVPPDenoise; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DetailFactor; +} mfxExtVPPDetail; + +typedef struct { + mfxExtBuffer Header; + mfxF64 Brightness; + mfxF64 Contrast; + mfxF64 Hue; + mfxF64 Saturation; +} mfxExtVPPProcAmp; + +/* statistics collected for decode, encode and vpp */ +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU64 NumBit; + mfxU32 NumCachedFrame; +} mfxEncodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumSkippedFrame; + mfxU32 NumError; + mfxU32 NumCachedFrame; +} mfxDecodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumCachedFrame; +} mfxVPPStat; + +typedef struct { + mfxExtBuffer Header; + mfxU32 SpatialComplexity; + mfxU32 TemporalComplexity; + mfxU16 SceneChangeRate; + mfxU16 RepeatedFrame; +} mfxExtVppAuxData; + +typedef struct { + mfxU32 reserved[4]; + mfxU8 *Data; /* buffer pointer */ + mfxU32 NumBit; /* number of bits */ + mfxU16 Type; /* SEI message type in H.264 or user data start_code in MPEG-2 */ + mfxU16 BufSize; /* payload buffer size in bytes */ +} mfxPayload; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[5]; + mfxU16 reserved1; + + mfxU16 QP; /* per frame QP */ + + mfxU16 FrameType; + mfxU16 NumExtParam; + mfxU16 NumPayload; /* MPEG-2 user data or H.264 SEI message(s) */ + mfxU16 reserved2; + + mfxExtBuffer **ExtParam; + mfxPayload **Payload; /* for field pair, first field uses even payloads and second field uses odd payloads */ +} mfxEncodeCtrl; + +/* Buffer Memory Types */ +enum { + /* Buffer types */ + MFX_MEMTYPE_PERSISTENT_MEMORY =0x0002 +}; + +/* Frame Memory Types */ +#define MFX_MEMTYPE_BASE(x) (0xf0ff & (x)) + +enum { + MFX_MEMTYPE_DXVA2_DECODER_TARGET =0x0010, + MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET =0x0020, + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = MFX_MEMTYPE_DXVA2_DECODER_TARGET, + MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET, + MFX_MEMTYPE_SYSTEM_MEMORY =0x0040, + + MFX_MEMTYPE_FROM_ENCODE = 0x0100, + MFX_MEMTYPE_FROM_DECODE = 0x0200, + MFX_MEMTYPE_FROM_VPPIN = 0x0400, + MFX_MEMTYPE_FROM_VPPOUT = 0x0800, + + MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, + MFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, + MFX_MEMTYPE_OPAQUE_FRAME = 0x0004 +}; + +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxU16 Type; /* decoder or processor render targets */ + mfxU16 NumFrameMin; + mfxU16 NumFrameSuggested; + mfxU16 reserved2; +} mfxFrameAllocRequest; + +typedef struct { + mfxU32 reserved[4]; + mfxMemId *mids; /* the array allocated by application */ + mfxU16 NumFrameActual; + mfxU16 reserved2; +} mfxFrameAllocResponse; + +/* FrameType */ +enum { + MFX_FRAMETYPE_UNKNOWN =0x0000, + + MFX_FRAMETYPE_I =0x0001, + MFX_FRAMETYPE_P =0x0002, + MFX_FRAMETYPE_B =0x0004, + MFX_FRAMETYPE_S =0x0008, + + MFX_FRAMETYPE_REF =0x0040, + MFX_FRAMETYPE_IDR =0x0080, + + MFX_FRAMETYPE_xI =0x0100, + MFX_FRAMETYPE_xP =0x0200, + MFX_FRAMETYPE_xB =0x0400, + MFX_FRAMETYPE_xS =0x0800, + + MFX_FRAMETYPE_xREF =0x4000, + MFX_FRAMETYPE_xIDR =0x8000 +}; + +typedef enum { + MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 =1, /* IDirect3DDeviceManager9 */ + MFX_HANDLE_D3D9_DEVICE_MANAGER = MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9, + MFX_HANDLE_D3D11_DEVICE_AND_CONTEXT = 2, + MFX_HANDLE_D3D11_DEVICE = 3, + MFX_HANDLE_VA_DISPLAY = 4 +} mfxHandleType; + +typedef enum { + MFX_SKIPMODE_NOSKIP=0, + MFX_SKIPMODE_MORE=1, + MFX_SKIPMODE_LESS=2 +} mfxSkipMode; + +/* Library initialization and deinitialization */ +typedef mfxI32 mfxIMPL; +#define MFX_IMPL_BASETYPE(x) (0x00ff & (x)) + +enum { + MFX_IMPL_AUTO = 0x0000, /* Auto Selection/In or Not Supported/Out */ + MFX_IMPL_SOFTWARE = 0x0001, /* Pure Software Implementation */ + MFX_IMPL_HARDWARE = 0x0002, /* Hardware Accelerated Implementation (default device) */ + MFX_IMPL_AUTO_ANY = 0x0003, /* Auto selection of any hardware/software implementation */ + MFX_IMPL_HARDWARE_ANY = 0x0004, /* Auto selection of any hardware implementation */ + MFX_IMPL_HARDWARE2 = 0x0005, /* Hardware accelerated implementation (2nd device) */ + MFX_IMPL_HARDWARE3 = 0x0006, /* Hardware accelerated implementation (3rd device) */ + MFX_IMPL_HARDWARE4 = 0x0007, /* Hardware accelerated implementation (4th device) */ + + MFX_IMPL_VIA_ANY = 0x0100, + MFX_IMPL_VIA_D3D9 = 0x0200, + MFX_IMPL_VIA_D3D11 = 0x0300, + + MFX_IMPL_UNSUPPORTED = 0x0000 /* One of the MFXQueryIMPL returns */ +}; + +/* Version Info */ +typedef union { + struct { + mfxU16 Minor; + mfxU16 Major; + }; + mfxU32 Version; +} mfxVersion; + +typedef struct { + mfxExtBuffer Header; + mfxU8 *SPSBuffer; + mfxU8 *PPSBuffer; + mfxU16 SPSBufSize; + mfxU16 PPSBufSize; + mfxU16 SPSId; + mfxU16 PPSId; +} mfxExtCodingOptionSPSPPS; + +/* session priority */ +typedef enum +{ + MFX_PRIORITY_LOW = 0, + MFX_PRIORITY_NORMAL = 1, + MFX_PRIORITY_HIGH = 2 + +} mfxPriority; + +typedef struct { + mfxExtBuffer Header; + mfxU16 VideoFormat; + mfxU16 VideoFullRange; + mfxU16 ColourDescriptionPresent; + mfxU16 ColourPrimaries; + mfxU16 TransferCharacteristics; + mfxU16 MatrixCoefficients; +} mfxExtVideoSignalInfo; + +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32 *AlgList; +} mfxExtVPPDoUse; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[2]; + struct { + mfxFrameSurface1 **Surfaces; + mfxU32 reserved2[5]; + mfxU16 Type; + mfxU16 NumSurface; + } In, Out; +} mfxExtOpaqueSurfaceAlloc; + +typedef struct { + mfxExtBuffer Header; + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + + struct { + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 ViewId; + mfxU32 reserved[2]; + } PreferredRefList[32], RejectedRefList[16], LongTermRefList[16]; + + mfxU32 reserved[8]; +} mfxExtAVCRefListCtrl; + +enum { + MFX_FRCALGM_PRESERVE_TIMESTAMP = 1, + MFX_FRCALGM_DISTRIBUTED_TIMESTAMP = 2 +}; + +typedef struct { + mfxExtBuffer Header; + mfxU16 Algorithm; + mfxU16 reserved; + mfxU32 reserved2[15]; +} mfxExtVPPFrameRateConversion; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[14]; + + struct { + mfxU16 ClockTimestampFlag; + mfxU16 CtType; + mfxU16 NuitFieldBasedFlag; + mfxU16 CountingType; + mfxU16 FullTimestampFlag; + mfxU16 DiscontinuityFlag; + mfxU16 CntDroppedFlag; + mfxU16 NFrames; + mfxU16 SecondsFlag; + mfxU16 MinutesFlag; + mfxU16 HoursFlag; + mfxU16 SecondsValue; + mfxU16 MinutesValue; + mfxU16 HoursValue; + mfxU32 TimeOffset; + } TimeStamp[3]; +} mfxExtPictureTimingSEI; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[4]; + mfxU16 reserved2; + mfxU16 BaseLayerPID; + + struct { + mfxU16 Scale; + mfxU16 reserved[3]; + }Layer[8]; +} mfxExtAvcTemporalLayers; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo++.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo++.h new file mode 100644 index 0000000..e513b62 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo++.h @@ -0,0 +1,127 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2010 Intel Corporation. All Rights Reserved. + + +File Name: mfxvideo++.h + +\* ****************************************************************************** */ + +#ifndef __MFXVIDEOPLUSPLUS_H +#define __MFXVIDEOPLUSPLUS_H + +#include "mfxvideo.h" + +class MFXVideoSession +{ +public: + MFXVideoSession(void) { m_session = (mfxSession) 0; } + virtual ~MFXVideoSession(void) { Close(); } + + mfxStatus Init(mfxIMPL impl, mfxVersion *ver) { return MFXInit(impl, ver, &m_session); } + mfxStatus Close(void) + { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); m_session = (mfxSession) 0; + return mfxRes; + } + + mfxStatus QueryIMPL(mfxIMPL *impl) { return MFXQueryIMPL(m_session, impl); } + mfxStatus QueryVersion(mfxVersion *version) { return MFXQueryVersion(m_session, version); } + + mfxStatus JoinSession(mfxSession child_session) { return MFXJoinSession(m_session, child_session);} + mfxStatus DisjoinSession( ) { return MFXDisjoinSession(m_session);} + mfxStatus CloneSession( mfxSession *clone) { return MFXCloneSession(m_session, clone);} + mfxStatus SetPriority( mfxPriority priority) { return MFXSetPriority(m_session, priority);} + mfxStatus GetPriority( mfxPriority *priority) { return MFXGetPriority(m_session, priority);} + + mfxStatus SetBufferAllocator(mfxBufferAllocator *allocator) { return MFXVideoCORE_SetBufferAllocator(m_session, allocator); } + mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) { return MFXVideoCORE_SetFrameAllocator(m_session, allocator); } + mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) { return MFXVideoCORE_SetHandle(m_session, type, hdl); } + mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) { return MFXVideoCORE_GetHandle(m_session, type, hdl); } + + mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) { return MFXVideoCORE_SyncOperation(m_session, syncp, wait); } + + operator mfxSession (void) { return m_session; } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoENCODE +{ +public: + + MFXVideoENCODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoENCODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENCODE_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENCODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoENCODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoENCODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoENCODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoENCODE_GetVideoParam(m_session, par); } + mfxStatus GetEncodeStat(mfxEncodeStat *stat) { return MFXVideoENCODE_GetEncodeStat(m_session, stat); } + + mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) { return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE +{ +public: + + MFXVideoDECODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoDECODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoDECODE_Query(m_session, in, out); } + mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { return MFXVideoDECODE_DecodeHeader(m_session, bs, par); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoDECODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoDECODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoDECODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoDECODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoDECODE_GetVideoParam(m_session, par); } + + mfxStatus GetDecodeStat(mfxDecodeStat *stat) { return MFXVideoDECODE_GetDecodeStat(m_session, stat); } + mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) {return MFXVideoDECODE_GetPayload(m_session, ts, payload); } + mfxStatus SetSkipMode(mfxSkipMode mode) { return MFXVideoDECODE_SetSkipMode(m_session, mode); } + mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) { return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoVPP +{ +public: + + MFXVideoVPP(mfxSession session) { m_session = session; } + virtual ~MFXVideoVPP(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoVPP_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request[2]) { return MFXVideoVPP_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoVPP_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoVPP_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoVPP_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoVPP_GetVideoParam(m_session, par); } + mfxStatus GetVPPStat(mfxVPPStat *stat) { return MFXVideoVPP_GetVPPStat(m_session, stat); } + mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) { return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif // __MFXVIDEOPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo.h new file mode 100644 index 0000000..641dc7a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include/mfx/mfxvideo.h @@ -0,0 +1,117 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxvideo.h + +\* ****************************************************************************** */ +#ifndef __MFXVIDEO_H__ +#define __MFXVIDEO_H__ +#include "mfxstructures.h" + +/* This is the external include file for the Intel(R) Media Sofware Development Kit product */ +#define MFX_VERSION_MAJOR 1 +#define MFX_VERSION_MINOR 4 + +#ifdef _WIN32 + #define MFX_CDECL __cdecl + #define MFX_STDCALL __stdcall +#else + #define MFX_CDECL + #define MFX_STDCALL +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* MFXVideoCORE */ +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxU32 nbytes, mfxU16 type, mfxMemId *mid); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxU8 **ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxMemId mid); +} mfxBufferAllocator; + +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *GetHDL) (mfxHDL pthis, mfxMemId mid, mfxHDL *handle); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxFrameAllocResponse *response); +} mfxFrameAllocator; + +/* Global Functions */ +typedef struct _mfxSession *mfxSession; +mfxStatus MFX_CDECL MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session); +mfxStatus MFX_CDECL MFXClose(mfxSession session); + +mfxStatus MFX_CDECL MFXQueryIMPL(mfxSession session, mfxIMPL *impl); +mfxStatus MFX_CDECL MFXQueryVersion(mfxSession session, mfxVersion *version); + +mfxStatus MFX_CDECL MFXJoinSession(mfxSession session, mfxSession child); +mfxStatus MFX_CDECL MFXDisjoinSession(mfxSession session); +mfxStatus MFX_CDECL MFXCloneSession(mfxSession session, mfxSession *clone); +mfxStatus MFX_CDECL MFXSetPriority(mfxSession session, mfxPriority priority); +mfxStatus MFX_CDECL MFXGetPriority(mfxSession session, mfxPriority *priority); + +/* VideoCORE */ +mfxStatus MFX_CDECL MFXVideoCORE_SetBufferAllocator(mfxSession session, mfxBufferAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetFrameAllocator(mfxSession session, mfxFrameAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetHandle(mfxSession session, mfxHandleType type, mfxHDL hdl); +mfxStatus MFX_CDECL MFXVideoCORE_GetHandle(mfxSession session, mfxHandleType type, mfxHDL *hdl); + +typedef struct _mfxSyncPoint *mfxSyncPoint; +mfxStatus MFX_CDECL MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); + +/* VideoENCODE */ +mfxStatus MFX_CDECL MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoENCODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_GetEncodeStat(mfxSession session, mfxEncodeStat *stat); +mfxStatus MFX_CDECL MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp); + +/* VideoDECODE */ +mfxStatus MFX_CDECL MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoDECODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_GetDecodeStat(mfxSession session, mfxDecodeStat *stat); +mfxStatus MFX_CDECL MFXVideoDECODE_SetSkipMode(mfxSession session, mfxSkipMode mode); +mfxStatus MFX_CDECL MFXVideoDECODE_GetPayload(mfxSession session, mfxU64 *ts, mfxPayload *payload); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); + +/* VideoVPP */ +mfxStatus MFX_CDECL MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); +mfxStatus MFX_CDECL MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoVPP_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_GetVPPStat(mfxSession session, mfxVPPStat *stat); +mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/ac3_parser.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/ac3_parser.h new file mode 100644 index 0000000..ff8cc4c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/ac3_parser.h @@ -0,0 +1,36 @@ +/* + * AC-3 parser prototypes + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 Michael Niedermayer + * + * 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 + */ + +#ifndef AVCODEC_AC3_PARSER_H +#define AVCODEC_AC3_PARSER_H + +#include +#include + +/** + * Extract the bitstream ID and the frame size from AC-3 data. + */ +int av_ac3_parse_header(const uint8_t *buf, size_t size, + uint8_t *bitstream_id, uint16_t *frame_size); + + +#endif /* AVCODEC_AC3_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/adts_parser.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/adts_parser.h new file mode 100644 index 0000000..f85becd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/adts_parser.h @@ -0,0 +1,37 @@ +/* + * 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 + */ + +#ifndef AVCODEC_ADTS_PARSER_H +#define AVCODEC_ADTS_PARSER_H + +#include +#include + +#define AV_AAC_ADTS_HEADER_SIZE 7 + +/** + * Extract the number of samples and frames from AAC data. + * @param[in] buf pointer to AAC data buffer + * @param[out] samples Pointer to where number of samples is written + * @param[out] frames Pointer to where number of frames is written + * @return Returns 0 on success, error code on failure. + */ +int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, + uint8_t *frames); + +#endif /* AVCODEC_ADTS_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avcodec.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avcodec.h new file mode 100644 index 0000000..d234271 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avcodec.h @@ -0,0 +1,6228 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVCODEC_AVCODEC_H +#define AVCODEC_AVCODEC_H + +/** + * @file + * @ingroup libavc + * Libavcodec external API header + */ + +#include +#include "libavutil/samplefmt.h" +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/cpu.h" +#include "libavutil/channel_layout.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/hwcontext.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "version.h" + +/** + * @defgroup libavc libavcodec + * Encoding/Decoding Library + * + * @{ + * + * @defgroup lavc_decoding Decoding + * @{ + * @} + * + * @defgroup lavc_encoding Encoding + * @{ + * @} + * + * @defgroup lavc_codec Codecs + * @{ + * @defgroup lavc_codec_native Native Codecs + * @{ + * @} + * @defgroup lavc_codec_wrappers External library wrappers + * @{ + * @} + * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge + * @{ + * @} + * @} + * @defgroup lavc_internal Internal + * @{ + * @} + * @} + */ + +/** + * @ingroup libavc + * @defgroup lavc_encdec send/receive encoding and decoding API overview + * @{ + * + * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/ + * avcodec_receive_packet() functions provide an encode/decode API, which + * decouples input and output. + * + * The API is very similar for encoding/decoding and audio/video, and works as + * follows: + * - Set up and open the AVCodecContext as usual. + * - Send valid input: + * - For decoding, call avcodec_send_packet() to give the decoder raw + * compressed data in an AVPacket. + * - For encoding, call avcodec_send_frame() to give the encoder an AVFrame + * containing uncompressed audio or video. + * In both cases, it is recommended that AVPackets and AVFrames are + * refcounted, or libavcodec might have to copy the input data. (libavformat + * always returns refcounted AVPackets, and av_frame_get_buffer() allocates + * refcounted AVFrames.) + * - Receive output in a loop. Periodically call one of the avcodec_receive_*() + * functions and process their output: + * - For decoding, call avcodec_receive_frame(). On success, it will return + * an AVFrame containing uncompressed audio or video data. + * - For encoding, call avcodec_receive_packet(). On success, it will return + * an AVPacket with a compressed frame. + * Repeat this call until it returns AVERROR(EAGAIN) or an error. The + * AVERROR(EAGAIN) return value means that new input data is required to + * return new output. In this case, continue with sending input. For each + * input frame/packet, the codec will typically return 1 output frame/packet, + * but it can also be 0 or more than 1. + * + * At the beginning of decoding or encoding, the codec might accept multiple + * input frames/packets without returning a frame, until its internal buffers + * are filled. This situation is handled transparently if you follow the steps + * outlined above. + * + * In theory, sending input can result in EAGAIN - this should happen only if + * not all output was received. You can use this to structure alternative decode + * or encode loops other than the one suggested above. For example, you could + * try sending new input on each iteration, and try to receive output if that + * returns EAGAIN. + * + * End of stream situations. These require "flushing" (aka draining) the codec, + * as the codec might buffer multiple frames or packets internally for + * performance or out of necessity (consider B-frames). + * This is handled as follows: + * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding) + * or avcodec_send_frame() (encoding) functions. This will enter draining + * mode. + * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet() + * (encoding) in a loop until AVERROR_EOF is returned. The functions will + * not return AVERROR(EAGAIN), unless you forgot to enter draining mode. + * - Before decoding can be resumed again, the codec has to be reset with + * avcodec_flush_buffers(). + * + * Using the API as outlined above is highly recommended. But it is also + * possible to call functions outside of this rigid schema. For example, you can + * call avcodec_send_packet() repeatedly without calling + * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed + * until the codec's internal buffer has been filled up (which is typically of + * size 1 per output frame, after initial input), and then reject input with + * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to + * read at least some output. + * + * Not all codecs will follow a rigid and predictable dataflow; the only + * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on + * one end implies that a receive/send call on the other end will succeed, or + * at least will not fail with AVERROR(EAGAIN). In general, no codec will + * permit unlimited buffering of input or output. + * + * This API replaces the following legacy functions: + * - avcodec_decode_video2() and avcodec_decode_audio4(): + * Use avcodec_send_packet() to feed input to the decoder, then use + * avcodec_receive_frame() to receive decoded frames after each packet. + * Unlike with the old video decoding API, multiple frames might result from + * a packet. For audio, splitting the input packet into frames by partially + * decoding packets becomes transparent to the API user. You never need to + * feed an AVPacket to the API twice (unless it is rejected with AVERROR(EAGAIN) - then + * no data was read from the packet). + * Additionally, sending a flush/draining packet is required only once. + * - avcodec_encode_video2()/avcodec_encode_audio2(): + * Use avcodec_send_frame() to feed input to the encoder, then use + * avcodec_receive_packet() to receive encoded packets. + * Providing user-allocated buffers for avcodec_receive_packet() is not + * possible. + * - The new API does not handle subtitles yet. + * + * Mixing new and old function calls on the same AVCodecContext is not allowed, + * and will result in undefined behavior. + * + * Some codecs might require using the new API; using the old API will return + * an error when calling it. All codecs support the new API. + * + * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This + * would be an invalid state, which could put the codec user into an endless + * loop. The API has no concept of time either: it cannot happen that trying to + * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second + * later accepts the packet (with no other receive/flush API calls involved). + * The API is a strict state machine, and the passage of time is not supposed + * to influence it. Some timing-dependent behavior might still be deemed + * acceptable in certain cases. But it must never result in both send/receive + * returning EAGAIN at the same time at any point. It must also absolutely be + * avoided that the current state is "unstable" and can "flip-flop" between + * the send/receive APIs allowing progress. For example, it's not allowed that + * the codec randomly decides that it actually wants to consume a packet now + * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an + * avcodec_send_packet() call. + * @} + */ + +/** + * @defgroup lavc_core Core functions/structures. + * @ingroup libavc + * + * Basic definitions, functions for querying libavcodec capabilities, + * allocating core structures, etc. + * @{ + */ + + +/** + * Identify the syntax and semantics of the bitstream. + * The principle is roughly: + * Two decoders with the same ID can decode the same streams. + * Two encoders with the same ID can encode compatible streams. + * There may be slight deviations from the principle due to implementation + * details. + * + * If you add a codec ID to this list, add it so that + * 1. no value of an existing codec ID changes (that would break ABI), + * 2. it is as close as possible to similar codecs + * + * After adding new codec IDs, do not forget to add an entry to the codec + * descriptor list and bump libavcodec minor version. + */ +enum AVCodecID { + AV_CODEC_ID_NONE, + + /* video codecs */ + AV_CODEC_ID_MPEG1VIDEO, + AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding + AV_CODEC_ID_H261, + AV_CODEC_ID_H263, + AV_CODEC_ID_RV10, + AV_CODEC_ID_RV20, + AV_CODEC_ID_MJPEG, + AV_CODEC_ID_MJPEGB, + AV_CODEC_ID_LJPEG, + AV_CODEC_ID_SP5X, + AV_CODEC_ID_JPEGLS, + AV_CODEC_ID_MPEG4, + AV_CODEC_ID_RAWVIDEO, + AV_CODEC_ID_MSMPEG4V1, + AV_CODEC_ID_MSMPEG4V2, + AV_CODEC_ID_MSMPEG4V3, + AV_CODEC_ID_WMV1, + AV_CODEC_ID_WMV2, + AV_CODEC_ID_H263P, + AV_CODEC_ID_H263I, + AV_CODEC_ID_FLV1, + AV_CODEC_ID_SVQ1, + AV_CODEC_ID_SVQ3, + AV_CODEC_ID_DVVIDEO, + AV_CODEC_ID_HUFFYUV, + AV_CODEC_ID_CYUV, + AV_CODEC_ID_H264, + AV_CODEC_ID_INDEO3, + AV_CODEC_ID_VP3, + AV_CODEC_ID_THEORA, + AV_CODEC_ID_ASV1, + AV_CODEC_ID_ASV2, + AV_CODEC_ID_FFV1, + AV_CODEC_ID_4XM, + AV_CODEC_ID_VCR1, + AV_CODEC_ID_CLJR, + AV_CODEC_ID_MDEC, + AV_CODEC_ID_ROQ, + AV_CODEC_ID_INTERPLAY_VIDEO, + AV_CODEC_ID_XAN_WC3, + AV_CODEC_ID_XAN_WC4, + AV_CODEC_ID_RPZA, + AV_CODEC_ID_CINEPAK, + AV_CODEC_ID_WS_VQA, + AV_CODEC_ID_MSRLE, + AV_CODEC_ID_MSVIDEO1, + AV_CODEC_ID_IDCIN, + AV_CODEC_ID_8BPS, + AV_CODEC_ID_SMC, + AV_CODEC_ID_FLIC, + AV_CODEC_ID_TRUEMOTION1, + AV_CODEC_ID_VMDVIDEO, + AV_CODEC_ID_MSZH, + AV_CODEC_ID_ZLIB, + AV_CODEC_ID_QTRLE, + AV_CODEC_ID_TSCC, + AV_CODEC_ID_ULTI, + AV_CODEC_ID_QDRAW, + AV_CODEC_ID_VIXL, + AV_CODEC_ID_QPEG, + AV_CODEC_ID_PNG, + AV_CODEC_ID_PPM, + AV_CODEC_ID_PBM, + AV_CODEC_ID_PGM, + AV_CODEC_ID_PGMYUV, + AV_CODEC_ID_PAM, + AV_CODEC_ID_FFVHUFF, + AV_CODEC_ID_RV30, + AV_CODEC_ID_RV40, + AV_CODEC_ID_VC1, + AV_CODEC_ID_WMV3, + AV_CODEC_ID_LOCO, + AV_CODEC_ID_WNV1, + AV_CODEC_ID_AASC, + AV_CODEC_ID_INDEO2, + AV_CODEC_ID_FRAPS, + AV_CODEC_ID_TRUEMOTION2, + AV_CODEC_ID_BMP, + AV_CODEC_ID_CSCD, + AV_CODEC_ID_MMVIDEO, + AV_CODEC_ID_ZMBV, + AV_CODEC_ID_AVS, + AV_CODEC_ID_SMACKVIDEO, + AV_CODEC_ID_NUV, + AV_CODEC_ID_KMVC, + AV_CODEC_ID_FLASHSV, + AV_CODEC_ID_CAVS, + AV_CODEC_ID_JPEG2000, + AV_CODEC_ID_VMNC, + AV_CODEC_ID_VP5, + AV_CODEC_ID_VP6, + AV_CODEC_ID_VP6F, + AV_CODEC_ID_TARGA, + AV_CODEC_ID_DSICINVIDEO, + AV_CODEC_ID_TIERTEXSEQVIDEO, + AV_CODEC_ID_TIFF, + AV_CODEC_ID_GIF, + AV_CODEC_ID_DXA, + AV_CODEC_ID_DNXHD, + AV_CODEC_ID_THP, + AV_CODEC_ID_SGI, + AV_CODEC_ID_C93, + AV_CODEC_ID_BETHSOFTVID, + AV_CODEC_ID_PTX, + AV_CODEC_ID_TXD, + AV_CODEC_ID_VP6A, + AV_CODEC_ID_AMV, + AV_CODEC_ID_VB, + AV_CODEC_ID_PCX, + AV_CODEC_ID_SUNRAST, + AV_CODEC_ID_INDEO4, + AV_CODEC_ID_INDEO5, + AV_CODEC_ID_MIMIC, + AV_CODEC_ID_RL2, + AV_CODEC_ID_ESCAPE124, + AV_CODEC_ID_DIRAC, + AV_CODEC_ID_BFI, + AV_CODEC_ID_CMV, + AV_CODEC_ID_MOTIONPIXELS, + AV_CODEC_ID_TGV, + AV_CODEC_ID_TGQ, + AV_CODEC_ID_TQI, + AV_CODEC_ID_AURA, + AV_CODEC_ID_AURA2, + AV_CODEC_ID_V210X, + AV_CODEC_ID_TMV, + AV_CODEC_ID_V210, + AV_CODEC_ID_DPX, + AV_CODEC_ID_MAD, + AV_CODEC_ID_FRWU, + AV_CODEC_ID_FLASHSV2, + AV_CODEC_ID_CDGRAPHICS, + AV_CODEC_ID_R210, + AV_CODEC_ID_ANM, + AV_CODEC_ID_BINKVIDEO, + AV_CODEC_ID_IFF_ILBM, +#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM + AV_CODEC_ID_KGV1, + AV_CODEC_ID_YOP, + AV_CODEC_ID_VP8, + AV_CODEC_ID_PICTOR, + AV_CODEC_ID_ANSI, + AV_CODEC_ID_A64_MULTI, + AV_CODEC_ID_A64_MULTI5, + AV_CODEC_ID_R10K, + AV_CODEC_ID_MXPEG, + AV_CODEC_ID_LAGARITH, + AV_CODEC_ID_PRORES, + AV_CODEC_ID_JV, + AV_CODEC_ID_DFA, + AV_CODEC_ID_WMV3IMAGE, + AV_CODEC_ID_VC1IMAGE, + AV_CODEC_ID_UTVIDEO, + AV_CODEC_ID_BMV_VIDEO, + AV_CODEC_ID_VBLE, + AV_CODEC_ID_DXTORY, + AV_CODEC_ID_V410, + AV_CODEC_ID_XWD, + AV_CODEC_ID_CDXL, + AV_CODEC_ID_XBM, + AV_CODEC_ID_ZEROCODEC, + AV_CODEC_ID_MSS1, + AV_CODEC_ID_MSA1, + AV_CODEC_ID_TSCC2, + AV_CODEC_ID_MTS2, + AV_CODEC_ID_CLLC, + AV_CODEC_ID_MSS2, + AV_CODEC_ID_VP9, + AV_CODEC_ID_AIC, + AV_CODEC_ID_ESCAPE130, + AV_CODEC_ID_G2M, + AV_CODEC_ID_WEBP, + AV_CODEC_ID_HNM4_VIDEO, + AV_CODEC_ID_HEVC, +#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC + AV_CODEC_ID_FIC, + AV_CODEC_ID_ALIAS_PIX, + AV_CODEC_ID_BRENDER_PIX, + AV_CODEC_ID_PAF_VIDEO, + AV_CODEC_ID_EXR, + AV_CODEC_ID_VP7, + AV_CODEC_ID_SANM, + AV_CODEC_ID_SGIRLE, + AV_CODEC_ID_MVC1, + AV_CODEC_ID_MVC2, + AV_CODEC_ID_HQX, + AV_CODEC_ID_TDSC, + AV_CODEC_ID_HQ_HQA, + AV_CODEC_ID_HAP, + AV_CODEC_ID_DDS, + AV_CODEC_ID_DXV, + AV_CODEC_ID_SCREENPRESSO, + AV_CODEC_ID_RSCC, + AV_CODEC_ID_AVS2, + + AV_CODEC_ID_Y41P = 0x8000, + AV_CODEC_ID_AVRP, + AV_CODEC_ID_012V, + AV_CODEC_ID_AVUI, + AV_CODEC_ID_AYUV, + AV_CODEC_ID_TARGA_Y216, + AV_CODEC_ID_V308, + AV_CODEC_ID_V408, + AV_CODEC_ID_YUV4, + AV_CODEC_ID_AVRN, + AV_CODEC_ID_CPIA, + AV_CODEC_ID_XFACE, + AV_CODEC_ID_SNOW, + AV_CODEC_ID_SMVJPEG, + AV_CODEC_ID_APNG, + AV_CODEC_ID_DAALA, + AV_CODEC_ID_CFHD, + AV_CODEC_ID_TRUEMOTION2RT, + AV_CODEC_ID_M101, + AV_CODEC_ID_MAGICYUV, + AV_CODEC_ID_SHEERVIDEO, + AV_CODEC_ID_YLC, + AV_CODEC_ID_PSD, + AV_CODEC_ID_PIXLET, + AV_CODEC_ID_SPEEDHQ, + AV_CODEC_ID_FMVC, + AV_CODEC_ID_SCPR, + AV_CODEC_ID_CLEARVIDEO, + AV_CODEC_ID_XPM, + AV_CODEC_ID_AV1, + AV_CODEC_ID_BITPACKED, + AV_CODEC_ID_MSCC, + AV_CODEC_ID_SRGC, + AV_CODEC_ID_SVG, + AV_CODEC_ID_GDV, + AV_CODEC_ID_FITS, + AV_CODEC_ID_IMM4, + AV_CODEC_ID_PROSUMER, + AV_CODEC_ID_MWSC, + AV_CODEC_ID_WCMV, + AV_CODEC_ID_RASC, + AV_CODEC_ID_HYMT, + AV_CODEC_ID_ARBC, + AV_CODEC_ID_AGM, + AV_CODEC_ID_LSCR, + AV_CODEC_ID_VP4, + + /* various PCM "codecs" */ + AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs + AV_CODEC_ID_PCM_S16LE = 0x10000, + AV_CODEC_ID_PCM_S16BE, + AV_CODEC_ID_PCM_U16LE, + AV_CODEC_ID_PCM_U16BE, + AV_CODEC_ID_PCM_S8, + AV_CODEC_ID_PCM_U8, + AV_CODEC_ID_PCM_MULAW, + AV_CODEC_ID_PCM_ALAW, + AV_CODEC_ID_PCM_S32LE, + AV_CODEC_ID_PCM_S32BE, + AV_CODEC_ID_PCM_U32LE, + AV_CODEC_ID_PCM_U32BE, + AV_CODEC_ID_PCM_S24LE, + AV_CODEC_ID_PCM_S24BE, + AV_CODEC_ID_PCM_U24LE, + AV_CODEC_ID_PCM_U24BE, + AV_CODEC_ID_PCM_S24DAUD, + AV_CODEC_ID_PCM_ZORK, + AV_CODEC_ID_PCM_S16LE_PLANAR, + AV_CODEC_ID_PCM_DVD, + AV_CODEC_ID_PCM_F32BE, + AV_CODEC_ID_PCM_F32LE, + AV_CODEC_ID_PCM_F64BE, + AV_CODEC_ID_PCM_F64LE, + AV_CODEC_ID_PCM_BLURAY, + AV_CODEC_ID_PCM_LXF, + AV_CODEC_ID_S302M, + AV_CODEC_ID_PCM_S8_PLANAR, + AV_CODEC_ID_PCM_S24LE_PLANAR, + AV_CODEC_ID_PCM_S32LE_PLANAR, + AV_CODEC_ID_PCM_S16BE_PLANAR, + + AV_CODEC_ID_PCM_S64LE = 0x10800, + AV_CODEC_ID_PCM_S64BE, + AV_CODEC_ID_PCM_F16LE, + AV_CODEC_ID_PCM_F24LE, + AV_CODEC_ID_PCM_VIDC, + + /* various ADPCM codecs */ + AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, + AV_CODEC_ID_ADPCM_IMA_WAV, + AV_CODEC_ID_ADPCM_IMA_DK3, + AV_CODEC_ID_ADPCM_IMA_DK4, + AV_CODEC_ID_ADPCM_IMA_WS, + AV_CODEC_ID_ADPCM_IMA_SMJPEG, + AV_CODEC_ID_ADPCM_MS, + AV_CODEC_ID_ADPCM_4XM, + AV_CODEC_ID_ADPCM_XA, + AV_CODEC_ID_ADPCM_ADX, + AV_CODEC_ID_ADPCM_EA, + AV_CODEC_ID_ADPCM_G726, + AV_CODEC_ID_ADPCM_CT, + AV_CODEC_ID_ADPCM_SWF, + AV_CODEC_ID_ADPCM_YAMAHA, + AV_CODEC_ID_ADPCM_SBPRO_4, + AV_CODEC_ID_ADPCM_SBPRO_3, + AV_CODEC_ID_ADPCM_SBPRO_2, + AV_CODEC_ID_ADPCM_THP, + AV_CODEC_ID_ADPCM_IMA_AMV, + AV_CODEC_ID_ADPCM_EA_R1, + AV_CODEC_ID_ADPCM_EA_R3, + AV_CODEC_ID_ADPCM_EA_R2, + AV_CODEC_ID_ADPCM_IMA_EA_SEAD, + AV_CODEC_ID_ADPCM_IMA_EA_EACS, + AV_CODEC_ID_ADPCM_EA_XAS, + AV_CODEC_ID_ADPCM_EA_MAXIS_XA, + AV_CODEC_ID_ADPCM_IMA_ISS, + AV_CODEC_ID_ADPCM_G722, + AV_CODEC_ID_ADPCM_IMA_APC, + AV_CODEC_ID_ADPCM_VIMA, + + AV_CODEC_ID_ADPCM_AFC = 0x11800, + AV_CODEC_ID_ADPCM_IMA_OKI, + AV_CODEC_ID_ADPCM_DTK, + AV_CODEC_ID_ADPCM_IMA_RAD, + AV_CODEC_ID_ADPCM_G726LE, + AV_CODEC_ID_ADPCM_THP_LE, + AV_CODEC_ID_ADPCM_PSX, + AV_CODEC_ID_ADPCM_AICA, + AV_CODEC_ID_ADPCM_IMA_DAT4, + AV_CODEC_ID_ADPCM_MTAF, + AV_CODEC_ID_ADPCM_AGM, + + /* AMR */ + AV_CODEC_ID_AMR_NB = 0x12000, + AV_CODEC_ID_AMR_WB, + + /* RealAudio codecs*/ + AV_CODEC_ID_RA_144 = 0x13000, + AV_CODEC_ID_RA_288, + + /* various DPCM codecs */ + AV_CODEC_ID_ROQ_DPCM = 0x14000, + AV_CODEC_ID_INTERPLAY_DPCM, + AV_CODEC_ID_XAN_DPCM, + AV_CODEC_ID_SOL_DPCM, + + AV_CODEC_ID_SDX2_DPCM = 0x14800, + AV_CODEC_ID_GREMLIN_DPCM, + + /* audio codecs */ + AV_CODEC_ID_MP2 = 0x15000, + AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 + AV_CODEC_ID_AAC, + AV_CODEC_ID_AC3, + AV_CODEC_ID_DTS, + AV_CODEC_ID_VORBIS, + AV_CODEC_ID_DVAUDIO, + AV_CODEC_ID_WMAV1, + AV_CODEC_ID_WMAV2, + AV_CODEC_ID_MACE3, + AV_CODEC_ID_MACE6, + AV_CODEC_ID_VMDAUDIO, + AV_CODEC_ID_FLAC, + AV_CODEC_ID_MP3ADU, + AV_CODEC_ID_MP3ON4, + AV_CODEC_ID_SHORTEN, + AV_CODEC_ID_ALAC, + AV_CODEC_ID_WESTWOOD_SND1, + AV_CODEC_ID_GSM, ///< as in Berlin toast format + AV_CODEC_ID_QDM2, + AV_CODEC_ID_COOK, + AV_CODEC_ID_TRUESPEECH, + AV_CODEC_ID_TTA, + AV_CODEC_ID_SMACKAUDIO, + AV_CODEC_ID_QCELP, + AV_CODEC_ID_WAVPACK, + AV_CODEC_ID_DSICINAUDIO, + AV_CODEC_ID_IMC, + AV_CODEC_ID_MUSEPACK7, + AV_CODEC_ID_MLP, + AV_CODEC_ID_GSM_MS, /* as found in WAV */ + AV_CODEC_ID_ATRAC3, + AV_CODEC_ID_APE, + AV_CODEC_ID_NELLYMOSER, + AV_CODEC_ID_MUSEPACK8, + AV_CODEC_ID_SPEEX, + AV_CODEC_ID_WMAVOICE, + AV_CODEC_ID_WMAPRO, + AV_CODEC_ID_WMALOSSLESS, + AV_CODEC_ID_ATRAC3P, + AV_CODEC_ID_EAC3, + AV_CODEC_ID_SIPR, + AV_CODEC_ID_MP1, + AV_CODEC_ID_TWINVQ, + AV_CODEC_ID_TRUEHD, + AV_CODEC_ID_MP4ALS, + AV_CODEC_ID_ATRAC1, + AV_CODEC_ID_BINKAUDIO_RDFT, + AV_CODEC_ID_BINKAUDIO_DCT, + AV_CODEC_ID_AAC_LATM, + AV_CODEC_ID_QDMC, + AV_CODEC_ID_CELT, + AV_CODEC_ID_G723_1, + AV_CODEC_ID_G729, + AV_CODEC_ID_8SVX_EXP, + AV_CODEC_ID_8SVX_FIB, + AV_CODEC_ID_BMV_AUDIO, + AV_CODEC_ID_RALF, + AV_CODEC_ID_IAC, + AV_CODEC_ID_ILBC, + AV_CODEC_ID_OPUS, + AV_CODEC_ID_COMFORT_NOISE, + AV_CODEC_ID_TAK, + AV_CODEC_ID_METASOUND, + AV_CODEC_ID_PAF_AUDIO, + AV_CODEC_ID_ON2AVC, + AV_CODEC_ID_DSS_SP, + AV_CODEC_ID_CODEC2, + + AV_CODEC_ID_FFWAVESYNTH = 0x15800, + AV_CODEC_ID_SONIC, + AV_CODEC_ID_SONIC_LS, + AV_CODEC_ID_EVRC, + AV_CODEC_ID_SMV, + AV_CODEC_ID_DSD_LSBF, + AV_CODEC_ID_DSD_MSBF, + AV_CODEC_ID_DSD_LSBF_PLANAR, + AV_CODEC_ID_DSD_MSBF_PLANAR, + AV_CODEC_ID_4GV, + AV_CODEC_ID_INTERPLAY_ACM, + AV_CODEC_ID_XMA1, + AV_CODEC_ID_XMA2, + AV_CODEC_ID_DST, + AV_CODEC_ID_ATRAC3AL, + AV_CODEC_ID_ATRAC3PAL, + AV_CODEC_ID_DOLBY_E, + AV_CODEC_ID_APTX, + AV_CODEC_ID_APTX_HD, + AV_CODEC_ID_SBC, + AV_CODEC_ID_ATRAC9, + AV_CODEC_ID_HCOM, + + /* subtitle codecs */ + AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. + AV_CODEC_ID_DVD_SUBTITLE = 0x17000, + AV_CODEC_ID_DVB_SUBTITLE, + AV_CODEC_ID_TEXT, ///< raw UTF-8 text + AV_CODEC_ID_XSUB, + AV_CODEC_ID_SSA, + AV_CODEC_ID_MOV_TEXT, + AV_CODEC_ID_HDMV_PGS_SUBTITLE, + AV_CODEC_ID_DVB_TELETEXT, + AV_CODEC_ID_SRT, + + AV_CODEC_ID_MICRODVD = 0x17800, + AV_CODEC_ID_EIA_608, + AV_CODEC_ID_JACOSUB, + AV_CODEC_ID_SAMI, + AV_CODEC_ID_REALTEXT, + AV_CODEC_ID_STL, + AV_CODEC_ID_SUBVIEWER1, + AV_CODEC_ID_SUBVIEWER, + AV_CODEC_ID_SUBRIP, + AV_CODEC_ID_WEBVTT, + AV_CODEC_ID_MPL2, + AV_CODEC_ID_VPLAYER, + AV_CODEC_ID_PJS, + AV_CODEC_ID_ASS, + AV_CODEC_ID_HDMV_TEXT_SUBTITLE, + AV_CODEC_ID_TTML, + AV_CODEC_ID_ARIB_CAPTION, + + /* other specific kind of codecs (generally used for attachments) */ + AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. + AV_CODEC_ID_TTF = 0x18000, + + AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream. + AV_CODEC_ID_BINTEXT = 0x18800, + AV_CODEC_ID_XBIN, + AV_CODEC_ID_IDF, + AV_CODEC_ID_OTF, + AV_CODEC_ID_SMPTE_KLV, + AV_CODEC_ID_DVD_NAV, + AV_CODEC_ID_TIMED_ID3, + AV_CODEC_ID_BIN_DATA, + + + AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it + + AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS + * stream (only used by libavformat) */ + AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems + * stream (only used by libavformat) */ + AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. + AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket +}; + +/** + * This struct describes the properties of a single codec described by an + * AVCodecID. + * @see avcodec_descriptor_get() + */ +typedef struct AVCodecDescriptor { + enum AVCodecID id; + enum AVMediaType type; + /** + * Name of the codec described by this descriptor. It is non-empty and + * unique for each codec descriptor. It should contain alphanumeric + * characters and '_' only. + */ + const char *name; + /** + * A more descriptive name for this codec. May be NULL. + */ + const char *long_name; + /** + * Codec properties, a combination of AV_CODEC_PROP_* flags. + */ + int props; + /** + * MIME type(s) associated with the codec. + * May be NULL; if not, a NULL-terminated array of MIME types. + * The first item is always non-NULL and is the preferred MIME type. + */ + const char *const *mime_types; + /** + * If non-NULL, an array of profiles recognized for this codec. + * Terminated with FF_PROFILE_UNKNOWN. + */ + const struct AVProfile *profiles; +} AVCodecDescriptor; + +/** + * Codec uses only intra compression. + * Video and audio codecs only. + */ +#define AV_CODEC_PROP_INTRA_ONLY (1 << 0) +/** + * Codec supports lossy compression. Audio and video codecs only. + * @note a codec may support both lossy and lossless + * compression modes + */ +#define AV_CODEC_PROP_LOSSY (1 << 1) +/** + * Codec supports lossless compression. Audio and video codecs only. + */ +#define AV_CODEC_PROP_LOSSLESS (1 << 2) +/** + * Codec supports frame reordering. That is, the coded order (the order in which + * the encoded packets are output by the encoders / stored / input to the + * decoders) may be different from the presentation order of the corresponding + * frames. + * + * For codecs that do not have this property set, PTS and DTS should always be + * equal. + */ +#define AV_CODEC_PROP_REORDER (1 << 3) +/** + * Subtitle codec is bitmap based + * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field. + */ +#define AV_CODEC_PROP_BITMAP_SUB (1 << 16) +/** + * Subtitle codec is text based. + * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field. + */ +#define AV_CODEC_PROP_TEXT_SUB (1 << 17) + +/** + * @ingroup lavc_decoding + * Required number of additionally allocated bytes at the end of the input bitstream for decoding. + * This is mainly needed because some optimized bitstream readers read + * 32 or 64 bit at once and could read over the end.
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged + * MPEG bitstreams could cause overread and segfault. + */ +#define AV_INPUT_BUFFER_PADDING_SIZE 64 + +/** + * @ingroup lavc_encoding + * minimum encoding buffer size + * Used to avoid some checks during header writing. + */ +#define AV_INPUT_BUFFER_MIN_SIZE 16384 + +/** + * @ingroup lavc_decoding + */ +enum AVDiscard{ + /* We leave some space between them for extensions (drop some + * keyframes for intra-only or drop just some bidir frames). */ + AVDISCARD_NONE =-16, ///< discard nothing + AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi + AVDISCARD_NONREF = 8, ///< discard all non reference + AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames + AVDISCARD_NONINTRA= 24, ///< discard all non intra frames + AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes + AVDISCARD_ALL = 48, ///< discard all +}; + +enum AVAudioServiceType { + AV_AUDIO_SERVICE_TYPE_MAIN = 0, + AV_AUDIO_SERVICE_TYPE_EFFECTS = 1, + AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2, + AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3, + AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4, + AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5, + AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6, + AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7, + AV_AUDIO_SERVICE_TYPE_KARAOKE = 8, + AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI +}; + +/** + * @ingroup lavc_encoding + */ +typedef struct RcOverride{ + int start_frame; + int end_frame; + int qscale; // If this is 0 then quality_factor will be used instead. + float quality_factor; +} RcOverride; + +/* encoding support + These flags can be passed in AVCodecContext.flags before initialization. + Note: Not everything is supported yet. +*/ + +/** + * Allow decoders to produce frames with data planes that are not aligned + * to CPU requirements (e.g. due to cropping). + */ +#define AV_CODEC_FLAG_UNALIGNED (1 << 0) +/** + * Use fixed qscale. + */ +#define AV_CODEC_FLAG_QSCALE (1 << 1) +/** + * 4 MV per MB allowed / advanced prediction for H.263. + */ +#define AV_CODEC_FLAG_4MV (1 << 2) +/** + * Output even those frames that might be corrupted. + */ +#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3) +/** + * Use qpel MC. + */ +#define AV_CODEC_FLAG_QPEL (1 << 4) +/** + * Don't output frames whose parameters differ from first + * decoded frame in stream. + */ +#define AV_CODEC_FLAG_DROPCHANGED (1 << 5) +/** + * Use internal 2pass ratecontrol in first pass mode. + */ +#define AV_CODEC_FLAG_PASS1 (1 << 9) +/** + * Use internal 2pass ratecontrol in second pass mode. + */ +#define AV_CODEC_FLAG_PASS2 (1 << 10) +/** + * loop filter. + */ +#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11) +/** + * Only decode/encode grayscale. + */ +#define AV_CODEC_FLAG_GRAY (1 << 13) +/** + * error[?] variables will be set during encoding. + */ +#define AV_CODEC_FLAG_PSNR (1 << 15) +/** + * Input bitstream might be truncated at a random location + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG_TRUNCATED (1 << 16) +/** + * Use interlaced DCT. + */ +#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18) +/** + * Force low delay. + */ +#define AV_CODEC_FLAG_LOW_DELAY (1 << 19) +/** + * Place global headers in extradata instead of every keyframe. + */ +#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22) +/** + * Use only bitexact stuff (except (I)DCT). + */ +#define AV_CODEC_FLAG_BITEXACT (1 << 23) +/* Fx : Flag for H.263+ extra options */ +/** + * H.263 advanced intra coding / MPEG-4 AC prediction + */ +#define AV_CODEC_FLAG_AC_PRED (1 << 24) +/** + * interlaced motion estimation + */ +#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29) +#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31) + +/** + * Allow non spec compliant speedup tricks. + */ +#define AV_CODEC_FLAG2_FAST (1 << 0) +/** + * Skip bitstream encoding. + */ +#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2) +/** + * Place global headers at every keyframe instead of in extradata. + */ +#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3) + +/** + * timecode is in drop frame format. DEPRECATED!!!! + */ +#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13) + +/** + * Input bitstream might be truncated at a packet boundaries + * instead of only at frame boundaries. + */ +#define AV_CODEC_FLAG2_CHUNKS (1 << 15) +/** + * Discard cropping information from SPS. + */ +#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16) + +/** + * Show all frames before the first keyframe + */ +#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22) +/** + * Export motion vectors through frame side data + */ +#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28) +/** + * Do not skip samples and export skip information as frame side data + */ +#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29) +/** + * Do not reset ASS ReadOrder field on flush (subtitles decoding) + */ +#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30) + +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Reference Picture Selection + * Independent Segment Decoding */ +/* /Fx */ +/* codec capabilities */ + +/** + * Decoder can use draw_horiz_band callback. + */ +#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0) +/** + * Codec uses get_buffer() for allocating buffers and supports custom allocators. + * If not set, it might not use get_buffer() at all or use operations that + * assume the buffer was allocated by avcodec_default_get_buffer. + */ +#define AV_CODEC_CAP_DR1 (1 << 1) +#define AV_CODEC_CAP_TRUNCATED (1 << 3) +/** + * Encoder or decoder requires flushing with NULL input at the end in order to + * give the complete and correct output. + * + * NOTE: If this flag is not set, the codec is guaranteed to never be fed with + * with NULL data. The user can still send NULL data to the public encode + * or decode function, but libavcodec will not pass it along to the codec + * unless this flag is set. + * + * Decoders: + * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to get the delayed data until the decoder no longer + * returns frames. + * + * Encoders: + * The encoder needs to be fed with NULL data at the end of encoding until the + * encoder no longer returns data. + * + * NOTE: For encoders implementing the AVCodec.encode2() function, setting this + * flag also means that the encoder must set the pts and duration for + * each output packet. If this flag is not set, the pts and duration will + * be determined by libavcodec from the input frame. + */ +#define AV_CODEC_CAP_DELAY (1 << 5) +/** + * Codec can be fed a final frame with a smaller size. + * This can be used to prevent truncation of the last audio samples. + */ +#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6) + +/** + * Codec can output multiple frames per AVPacket + * Normally demuxers return one frame at a time, demuxers which do not do + * are connected to a parser to split what they return into proper frames. + * This flag is reserved to the very rare category of codecs which have a + * bitstream that cannot be split into frames without timeconsuming + * operations like full decoding. Demuxers carrying such bitstreams thus + * may return multiple frames in a packet. This has many disadvantages like + * prohibiting stream copy in many cases thus it should only be considered + * as a last resort. + */ +#define AV_CODEC_CAP_SUBFRAMES (1 << 8) +/** + * Codec is experimental and is thus avoided in favor of non experimental + * encoders + */ +#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9) +/** + * Codec should fill in channel configuration and samplerate instead of container + */ +#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10) +/** + * Codec supports frame-level multithreading. + */ +#define AV_CODEC_CAP_FRAME_THREADS (1 << 12) +/** + * Codec supports slice-based (or partition-based) multithreading. + */ +#define AV_CODEC_CAP_SLICE_THREADS (1 << 13) +/** + * Codec supports changed parameters at any point. + */ +#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14) +/** + * Codec supports avctx->thread_count == 0 (auto). + */ +#define AV_CODEC_CAP_AUTO_THREADS (1 << 15) +/** + * Audio encoder supports receiving a different number of samples in each call. + */ +#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16) +/** + * Decoder is not a preferred choice for probing. + * This indicates that the decoder is not a good choice for probing. + * It could for example be an expensive to spin up hardware decoder, + * or it could simply not provide a lot of useful information about + * the stream. + * A decoder marked with this flag should only be used as last resort + * choice for probing. + */ +#define AV_CODEC_CAP_AVOID_PROBING (1 << 17) +/** + * Codec is intra only. + */ +#define AV_CODEC_CAP_INTRA_ONLY 0x40000000 +/** + * Codec is lossless. + */ +#define AV_CODEC_CAP_LOSSLESS 0x80000000 + +/** + * Codec is backed by a hardware implementation. Typically used to + * identify a non-hwaccel hardware decoder. For information about hwaccels, use + * avcodec_get_hw_config() instead. + */ +#define AV_CODEC_CAP_HARDWARE (1 << 18) + +/** + * Codec is potentially backed by a hardware implementation, but not + * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the + * implementation provides some sort of internal fallback. + */ +#define AV_CODEC_CAP_HYBRID (1 << 19) + +/** + * This codec takes the reordered_opaque field from input AVFrames + * and returns it in the corresponding field in AVCodecContext after + * encoding. + */ +#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20) + +/** + * Pan Scan area. + * This specifies the area which should be displayed. + * Note there may be multiple such areas for one frame. + */ +typedef struct AVPanScan { + /** + * id + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int id; + + /** + * width and height in 1/16 pel + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int width; + int height; + + /** + * position of the top left corner in 1/16 pel for up to 3 fields/frames + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int16_t position[3][2]; +} AVPanScan; + +/** + * This structure describes the bitrate properties of an encoded bitstream. It + * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD + * parameters for H.264/HEVC. + */ +typedef struct AVCPBProperties { + /** + * Maximum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int max_bitrate; +#else + int64_t max_bitrate; +#endif + /** + * Minimum bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int min_bitrate; +#else + int64_t min_bitrate; +#endif + /** + * Average bitrate of the stream, in bits per second. + * Zero if unknown or unspecified. + */ +#if FF_API_UNSANITIZED_BITRATES + int avg_bitrate; +#else + int64_t avg_bitrate; +#endif + + /** + * The size of the buffer to which the ratecontrol is applied, in bits. + * Zero if unknown or unspecified. + */ + int buffer_size; + + /** + * The delay between the time the packet this structure is associated with + * is received and the time when it should be decoded, in periods of a 27MHz + * clock. + * + * UINT64_MAX when unknown or unspecified. + */ + uint64_t vbv_delay; +} AVCPBProperties; + +/** + * The decoder will keep a reference to the frame and may reuse it later. + */ +#define AV_GET_BUFFER_FLAG_REF (1 << 0) + +/** + * @defgroup lavc_packet AVPacket + * + * Types and functions for working with AVPacket. + * @{ + */ +enum AVPacketSideDataType { + /** + * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE + * bytes worth of palette. This side data signals that a new palette is + * present. + */ + AV_PKT_DATA_PALETTE, + + /** + * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format + * that the extradata buffer was changed and the receiving side should + * act upon it appropriately. The new extradata is embedded in the side + * data buffer and should be immediately used for processing the current + * frame or packet. + */ + AV_PKT_DATA_NEW_EXTRADATA, + + /** + * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows: + * @code + * u32le param_flags + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) + * s32le channel_count + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) + * u64le channel_layout + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) + * s32le sample_rate + * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) + * s32le width + * s32le height + * @endcode + */ + AV_PKT_DATA_PARAM_CHANGE, + + /** + * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of + * structures with info about macroblocks relevant to splitting the + * packet into smaller packets on macroblock edges (e.g. as for RFC 2190). + * That is, it does not necessarily contain info about all macroblocks, + * as long as the distance between macroblocks in the info is smaller + * than the target payload size. + * Each MB info structure is 12 bytes, and is laid out as follows: + * @code + * u32le bit offset from the start of the packet + * u8 current quantizer at the start of the macroblock + * u8 GOB number + * u16le macroblock address within the GOB + * u8 horizontal MV predictor + * u8 vertical MV predictor + * u8 horizontal MV predictor for block number 3 + * u8 vertical MV predictor for block number 3 + * @endcode + */ + AV_PKT_DATA_H263_MB_INFO, + + /** + * This side data should be associated with an audio stream and contains + * ReplayGain information in form of the AVReplayGain struct. + */ + AV_PKT_DATA_REPLAYGAIN, + + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the decoded video frames for + * correct presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_PKT_DATA_DISPLAYMATRIX, + + /** + * This side data should be associated with a video stream and contains + * Stereoscopic 3D information in form of the AVStereo3D struct. + */ + AV_PKT_DATA_STEREO3D, + + /** + * This side data should be associated with an audio stream and corresponds + * to enum AVAudioServiceType. + */ + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + + /** + * This side data contains quality related information from the encoder. + * @code + * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad). + * u8 picture type + * u8 error count + * u16 reserved + * u64le[error count] sum of squared differences between encoder in and output + * @endcode + */ + AV_PKT_DATA_QUALITY_STATS, + + /** + * This side data contains an integer value representing the stream index + * of a "fallback" track. A fallback track indicates an alternate + * track to use when the current track can not be decoded for some reason. + * e.g. no decoder available for codec. + */ + AV_PKT_DATA_FALLBACK_TRACK, + + /** + * This side data corresponds to the AVCPBProperties struct. + */ + AV_PKT_DATA_CPB_PROPERTIES, + + /** + * Recommmends skipping the specified number of samples + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_PKT_DATA_SKIP_SAMPLES, + + /** + * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that + * the packet may contain "dual mono" audio specific to Japanese DTV + * and if it is true, recommends only the selected channel to be used. + * @code + * u8 selected channels (0=mail/left, 1=sub/right, 2=both) + * @endcode + */ + AV_PKT_DATA_JP_DUALMONO, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. + */ + AV_PKT_DATA_STRINGS_METADATA, + + /** + * Subtitle event position + * @code + * u32le x1 + * u32le y1 + * u32le x2 + * u32le y2 + * @endcode + */ + AV_PKT_DATA_SUBTITLE_POSITION, + + /** + * Data found in BlockAdditional element of matroska container. There is + * no end marker for the data, so it is required to rely on the side data + * size to recognize the end. 8 byte id (as found in BlockAddId) followed + * by data. + */ + AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, + + /** + * The optional first identifier line of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_IDENTIFIER, + + /** + * The optional settings (rendering instructions) that immediately + * follow the timestamp specifier of a WebVTT cue. + */ + AV_PKT_DATA_WEBVTT_SETTINGS, + + /** + * A list of zero terminated key/value strings. There is no end marker for + * the list, so it is required to rely on the side data size to stop. This + * side data includes updated metadata which appeared in the stream. + */ + AV_PKT_DATA_METADATA_UPDATE, + + /** + * MPEGTS stream ID as uint8_t, this is required to pass the stream ID + * information from the demuxer to the corresponding muxer. + */ + AV_PKT_DATA_MPEGTS_STREAM_ID, + + /** + * Mastering display metadata (based on SMPTE-2086:2014). This metadata + * should be associated with a video stream and contains data in the form + * of the AVMasteringDisplayMetadata struct. + */ + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * This side data should be associated with a video stream and corresponds + * to the AVSphericalMapping structure. + */ + AV_PKT_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This metadata should be + * associated with a video stream and contains data in the form of the + * AVContentLightMetadata struct. + */ + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + + /** + * ATSC A53 Part 4 Closed Captions. This metadata should be associated with + * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data. + * The number of bytes of CC data is AVPacketSideData.size. + */ + AV_PKT_DATA_A53_CC, + + /** + * This side data is encryption initialization data. + * The format is not part of ABI, use av_encryption_init_info_* methods to + * access. + */ + AV_PKT_DATA_ENCRYPTION_INIT_INFO, + + /** + * This side data contains encryption info for how to decrypt the packet. + * The format is not part of ABI, use av_encryption_info_* methods to access. + */ + AV_PKT_DATA_ENCRYPTION_INFO, + + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_PKT_DATA_AFD, + + /** + * The number of side data types. + * This is not part of the public API/ABI in the sense that it may + * change when new side data types are added. + * This must stay the last enum value. + * If its value becomes huge, some code using it + * needs to be updated as it assumes it to be smaller than other limits. + */ + AV_PKT_DATA_NB +}; + +#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED + +typedef struct AVPacketSideData { + uint8_t *data; + int size; + enum AVPacketSideDataType type; +} AVPacketSideData; + +/** + * This structure stores compressed data. It is typically exported by demuxers + * and then passed as input to decoders, or received as output from encoders and + * then passed to muxers. + * + * For video, it should typically contain one compressed frame. For audio it may + * contain several compressed frames. Encoders are allowed to output empty + * packets, with no compressed data, containing only side data + * (e.g. to update some stream parameters at the end of encoding). + * + * AVPacket is one of the few structs in FFmpeg, whose size is a part of public + * ABI. Thus it may be allocated on stack and no new fields can be added to it + * without libavcodec and libavformat major bump. + * + * The semantics of data ownership depends on the buf field. + * If it is set, the packet data is dynamically allocated and is + * valid indefinitely until a call to av_packet_unref() reduces the + * reference count to 0. + * + * If the buf field is not set av_packet_ref() would make a copy instead + * of increasing the reference count. + * + * The side data is always allocated with av_malloc(), copied by + * av_packet_ref() and freed by av_packet_unref(). + * + * @see av_packet_ref + * @see av_packet_unref + */ +typedef struct AVPacket { + /** + * A reference to the reference-counted buffer where the packet data is + * stored. + * May be NULL, then the packet data is not reference-counted. + */ + AVBufferRef *buf; + /** + * Presentation timestamp in AVStream->time_base units; the time at which + * the decompressed packet will be presented to the user. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + * pts MUST be larger or equal to dts as presentation cannot happen before + * decompression, unless one wants to view hex dumps. Some formats misuse + * the terms dts and pts/cts to mean something different. Such timestamps + * must be converted to true pts/dts before they are stored in AVPacket. + */ + int64_t pts; + /** + * Decompression timestamp in AVStream->time_base units; the time at which + * the packet is decompressed. + * Can be AV_NOPTS_VALUE if it is not stored in the file. + */ + int64_t dts; + uint8_t *data; + int size; + int stream_index; + /** + * A combination of AV_PKT_FLAG values + */ + int flags; + /** + * Additional packet data that can be provided by the container. + * Packet can contain several types of side information. + */ + AVPacketSideData *side_data; + int side_data_elems; + + /** + * Duration of this packet in AVStream->time_base units, 0 if unknown. + * Equals next_pts - this_pts in presentation order. + */ + int64_t duration; + + int64_t pos; ///< byte position in stream, -1 if unknown + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated Same as the duration field, but as int64_t. This was required + * for Matroska subtitles, whose duration values could overflow when the + * duration field was still an int. + */ + attribute_deprecated + int64_t convergence_duration; +#endif +} AVPacket; +#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe +#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted +/** + * Flag is used to discard packets which are required to maintain valid + * decoder state but are not required for output and should be dropped + * after decoding. + **/ +#define AV_PKT_FLAG_DISCARD 0x0004 +/** + * The packet comes from a trusted source. + * + * Otherwise-unsafe constructs such as arbitrary pointers to data + * outside the packet may be followed. + */ +#define AV_PKT_FLAG_TRUSTED 0x0008 +/** + * Flag is used to indicate packets that contain frames that can + * be discarded by the decoder. I.e. Non-reference frames. + */ +#define AV_PKT_FLAG_DISPOSABLE 0x0010 + + +enum AVSideDataParamChangeFlags { + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, + AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002, + AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, + AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, +}; +/** + * @} + */ + +struct AVCodecInternal; + +enum AVFieldOrder { + AV_FIELD_UNKNOWN, + AV_FIELD_PROGRESSIVE, + AV_FIELD_TT, //< Top coded_first, top displayed first + AV_FIELD_BB, //< Bottom coded first, bottom displayed first + AV_FIELD_TB, //< Top coded first, bottom displayed first + AV_FIELD_BT, //< Bottom coded first, top displayed first +}; + +/** + * main external API structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user + * applications. + * The name string for AVOptions options matches the associated command line + * parameter name and can be found in libavcodec/options_table.h + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + * sizeof(AVCodecContext) must not be used outside libav*. + */ +typedef struct AVCodecContext { + /** + * information on struct for av_log + * - set by avcodec_alloc_context3 + */ + const AVClass *av_class; + int log_level_offset; + + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + const struct AVCodec *codec; + enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */ + + /** + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * A demuxer should set this to what is stored in the field used to identify the codec. + * If there are multiple such fields in a container then the demuxer should choose the one + * which maximizes the information about the used codec. + * If the codec tag field in a container is larger than 32 bits then the demuxer should + * remap the longer ID to 32 bits with a table or other structure. Alternatively a new + * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated + * first. + * - encoding: Set by user, if not then the default based on codec_id will be used. + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int codec_tag; + + void *priv_data; + + /** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + */ + struct AVCodecInternal *internal; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + + /** + * the average bitrate + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: Set by user, may be overwritten by libavcodec + * if this info is available in the stream + */ + int64_t bit_rate; + + /** + * number of bits the bitstream is allowed to diverge from the reference. + * the reference can be CBR (for CBR pass1) or VBR (for pass2) + * - encoding: Set by user; unused for constant quantizer encoding. + * - decoding: unused + */ + int bit_rate_tolerance; + + /** + * Global quality for codecs which cannot change it per frame. + * This should be proportional to MPEG-1/2/4 qscale. + * - encoding: Set by user. + * - decoding: unused + */ + int global_quality; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + + /** + * AV_CODEC_FLAG_*. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags; + + /** + * AV_CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. + */ + int flags2; + + /** + * some codecs need / can use extradata like Huffman tables. + * MJPEG: Huffman tables + * rv10: additional flags + * MPEG-4: global headers (they can be in the bitstream or here) + * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger + * than extradata_size to avoid problems if it is read with the bitstream reader. + * The bytewise contents of extradata must not depend on the architecture or CPU endianness. + * Must be allocated with the av_malloc() family of functions. + * - encoding: Set/allocated/freed by libavcodec. + * - decoding: Set/allocated/freed by user. + */ + uint8_t *extradata; + int extradata_size; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. For fixed-fps content, + * timebase should be 1/framerate and timestamp increments should be + * identically 1. + * This often, but not always is the inverse of the frame rate or field rate + * for video. 1/time_base is not the average frame rate if the frame rate is not + * constant. + * + * Like containers, elementary streams also can store timestamps, 1/time_base + * is the unit in which these timestamps are specified. + * As example of such codec time base see ISO/IEC 14496-2:2001(E) + * vop_time_increment_resolution and fixed_vop_rate + * (fixed_vop_rate == 0 implies that it is different from the framerate) + * + * - encoding: MUST be set by user. + * - decoding: the use of this field for decoding is deprecated. + * Use framerate instead. + */ + AVRational time_base; + + /** + * For some codecs, the time base is closer to the field rate than the frame rate. + * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration + * if no telecine is used ... + * + * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2. + */ + int ticks_per_frame; + + /** + * Codec delay. + * + * Encoding: Number of frames delay there will be from the encoder input to + * the decoder output. (we assume the decoder matches the spec) + * Decoding: Number of frames delay in addition to what a standard decoder + * as specified in the spec would produce. + * + * Video: + * Number of frames the decoded output will be delayed relative to the + * encoded input. + * + * Audio: + * For encoding, this field is unused (see initial_padding). + * + * For decoding, this is the number of samples the decoder needs to + * output before the decoder's output is valid. When seeking, you should + * start decoding this many samples prior to your desired seek point. + * + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int delay; + + + /* video only */ + /** + * picture width / height. + * + * @note Those fields may not match the values of the last + * AVFrame output by avcodec_decode_video2 due frame + * reordering. + * + * - encoding: MUST be set by user. + * - decoding: May be set by the user before opening the decoder if known e.g. + * from the container. Some decoders will require the dimensions + * to be set by the caller. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int width, height; + + /** + * Bitstream width / height, may be different from width/height e.g. when + * the decoded frame is cropped before being output or lowres is enabled. + * + * @note Those field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: unused + * - decoding: May be set by the user before opening the decoder if known + * e.g. from the container. During decoding, the decoder may + * overwrite those values as required while parsing the data. + */ + int coded_width, coded_height; + + /** + * the number of pictures in a group of pictures, or 0 for intra_only + * - encoding: Set by user. + * - decoding: unused + */ + int gop_size; + + /** + * Pixel format, see AV_PIX_FMT_xxx. + * May be set by the demuxer if known from headers. + * May be overridden by the decoder if it knows better. + * + * @note This field may not match the value of the last + * AVFrame output by avcodec_receive_frame() due frame + * reordering. + * + * - encoding: Set by user. + * - decoding: Set by user if known, overridden by libavcodec while + * parsing the data. + */ + enum AVPixelFormat pix_fmt; + + /** + * If non NULL, 'draw_horiz_band' is called by the libavcodec + * decoder to draw a horizontal band. It improves cache usage. Not + * all codecs can do that. You must check the codec capabilities + * beforehand. + * When multithreading is used, it may be called from multiple threads + * at the same time; threads might draw different parts of the same AVFrame, + * or multiple AVFrames, and there is no guarantee that slices will be drawn + * in order. + * The function is also used by hardware acceleration APIs. + * It is called at least once during frame decoding to pass + * the data needed for hardware render. + * In that mode instead of pixel data, AVFrame points to + * a structure specific to the acceleration API. The application + * reads the structure and can change some fields to indicate progress + * or mark state. + * - encoding: unused + * - decoding: Set by user. + * @param height the height of the slice + * @param y the y position of the slice + * @param type 1->top field, 2->bottom field, 3->frame + * @param offset offset into the AVFrame.data from which the slice should be read + */ + void (*draw_horiz_band)(struct AVCodecContext *s, + const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], + int y, int type, int height); + + /** + * callback to negotiate the pixelFormat + * @param fmt is the list of formats which are supported by the codec, + * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. + * The first is always the native one. + * @note The callback may be called again immediately if initialization for + * the selected (hardware-accelerated) pixel format failed. + * @warning Behavior is undefined if the callback returns a value not + * in the fmt list of formats. + * @return the chosen format + * - encoding: unused + * - decoding: Set by user, if not set the native format will be chosen. + */ + enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + + /** + * maximum number of B-frames between non-B-frames + * Note: The output will be delayed by max_b_frames+1 relative to the input. + * - encoding: Set by user. + * - decoding: unused + */ + int max_b_frames; + + /** + * qscale factor between IP and B-frames + * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_factor; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_frame_strategy; +#endif + + /** + * qscale offset between IP and B-frames + * - encoding: Set by user. + * - decoding: unused + */ + float b_quant_offset; + + /** + * Size of the frame reordering buffer in the decoder. + * For MPEG-2 it is 1 IPB or 0 low delay IP. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int has_b_frames; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int mpeg_quant; +#endif + + /** + * qscale factor between P- and I-frames + * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset). + * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset). + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_factor; + + /** + * qscale offset between P and I-frames + * - encoding: Set by user. + * - decoding: unused + */ + float i_quant_offset; + + /** + * luminance masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float lumi_masking; + + /** + * temporary complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float temporal_cplx_masking; + + /** + * spatial complexity masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float spatial_cplx_masking; + + /** + * p block masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float p_masking; + + /** + * darkness masking (0-> disabled) + * - encoding: Set by user. + * - decoding: unused + */ + float dark_masking; + + /** + * slice count + * - encoding: Set by libavcodec. + * - decoding: Set by user (or 0). + */ + int slice_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int prediction_method; +#define FF_PRED_LEFT 0 +#define FF_PRED_PLANE 1 +#define FF_PRED_MEDIAN 2 +#endif + + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + + /** + * sample aspect ratio (0 if unknown) + * That is the width of a pixel divided by the height of the pixel. + * Numerator and denominator must be relatively prime and smaller than 256 for some video standards. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVRational sample_aspect_ratio; + + /** + * motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_cmp; + /** + * subpixel motion estimation comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_sub_cmp; + /** + * macroblock comparison function (not supported yet) + * - encoding: Set by user. + * - decoding: unused + */ + int mb_cmp; + /** + * interlaced DCT comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int ildct_cmp; +#define FF_CMP_SAD 0 +#define FF_CMP_SSE 1 +#define FF_CMP_SATD 2 +#define FF_CMP_DCT 3 +#define FF_CMP_PSNR 4 +#define FF_CMP_BIT 5 +#define FF_CMP_RD 6 +#define FF_CMP_ZERO 7 +#define FF_CMP_VSAD 8 +#define FF_CMP_VSSE 9 +#define FF_CMP_NSSE 10 +#define FF_CMP_W53 11 +#define FF_CMP_W97 12 +#define FF_CMP_DCTMAX 13 +#define FF_CMP_DCT264 14 +#define FF_CMP_MEDIAN_SAD 15 +#define FF_CMP_CHROMA 256 + + /** + * ME diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int dia_size; + + /** + * amount of previous MV predictors (2a+1 x 2a+1 square) + * - encoding: Set by user. + * - decoding: unused + */ + int last_predictor_count; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int pre_me; +#endif + + /** + * motion estimation prepass comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int me_pre_cmp; + + /** + * ME prepass diamond size & shape + * - encoding: Set by user. + * - decoding: unused + */ + int pre_dia_size; + + /** + * subpel ME quality + * - encoding: Set by user. + * - decoding: unused + */ + int me_subpel_quality; + + /** + * maximum motion estimation search range in subpel units + * If 0 then no limit. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_range; + + /** + * slice flags + * - encoding: unused + * - decoding: Set by user. + */ + int slice_flags; +#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display +#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics) +#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1) + + /** + * macroblock decision mode + * - encoding: Set by user. + * - decoding: unused + */ + int mb_decision; +#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp +#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits +#define FF_MB_DECISION_RD 2 ///< rate distortion + + /** + * custom intra quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *intra_matrix; + + /** + * custom inter quantization matrix + * Must be allocated with the av_malloc() family of functions, and will be freed in + * avcodec_free_context(). + * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL. + * - decoding: Set/allocated/freed by libavcodec. + */ + uint16_t *inter_matrix; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int scenechange_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int noise_reduction; +#endif + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: Set by libavcodec + */ + int intra_dc_precision; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + + /** + * minimum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB Lagrange multiplier + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + +#if FF_API_PRIVATE_OPT + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int me_penalty_compensation; +#endif + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int brd_scale; +#endif + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int chromaoffset; +#endif + + /** + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + int mv0_threshold; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int b_sensitivity; +#endif + + /** + * Chromaticity coordinates of the source primaries. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorPrimaries color_primaries; + + /** + * Color Transfer Characteristic. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by user. + */ + enum AVFieldOrder field_order; + + /* audio only */ + int sample_rate; ///< samples per second + int channels; ///< number of audio channels + + /** + * audio sample format + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< sample format + + /* The following data should not be initialized. */ + /** + * Number of samples per channel in an audio frame. + * + * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame + * except the last must contain exactly frame_size samples per channel. + * May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the + * frame size is not restricted. + * - decoding: may be set by some decoders to indicate constant frame size + */ + int frame_size; + + /** + * Frame counter, set by libavcodec. + * + * - decoding: total number of frames returned from the decoder so far. + * - encoding: total number of frames passed to the encoder so far. + * + * @note the counter is not incremented if encoding/decoding resulted in + * an error. + */ + int frame_number; + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + + /** + * Audio channel layout. + * - encoding: set by user. + * - decoding: set by user, may be overwritten by libavcodec. + */ + uint64_t channel_layout; + + /** + * Request decoder to use this channel layout if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + */ + uint64_t request_channel_layout; + + /** + * Type of service that the audio stream conveys. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVAudioServiceType audio_service_type; + + /** + * desired sample format + * - encoding: Not used. + * - decoding: Set by user. + * Decoder will decode to this format if it can. + */ + enum AVSampleFormat request_sample_fmt; + + /** + * This callback is called at the beginning of each frame to get data + * buffer(s) for it. There may be one contiguous buffer for all the data or + * there may be a buffer per each data plane or anything in between. What + * this means is, you may set however many entries in buf[] you feel necessary. + * Each buffer must be reference-counted using the AVBuffer API (see description + * of buf[] below). + * + * The following fields will be set in the frame before this callback is + * called: + * - format + * - width, height (video only) + * - sample_rate, channel_layout, nb_samples (audio only) + * Their values may differ from the corresponding values in + * AVCodecContext. This callback must use the frame values, not the codec + * context values, to calculate the required buffer size. + * + * This callback must fill the following fields in the frame: + * - data[] + * - linesize[] + * - extended_data: + * * if the data is planar audio with more than 8 channels, then this + * callback must allocate and fill extended_data to contain all pointers + * to all data planes. data[] must hold as many pointers as it can. + * extended_data must be allocated with av_malloc() and will be freed in + * av_frame_unref(). + * * otherwise extended_data must point to data + * - buf[] must contain one or more pointers to AVBufferRef structures. Each of + * the frame's data and extended_data pointers must be contained in these. That + * is, one AVBufferRef for each allocated chunk of memory, not necessarily one + * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(), + * and av_buffer_ref(). + * - extended_buf and nb_extended_buf must be allocated with av_malloc() by + * this callback and filled with the extra buffers if there are more + * buffers than buf[] can hold. extended_buf will be freed in + * av_frame_unref(). + * + * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call + * avcodec_default_get_buffer2() instead of providing buffers allocated by + * some other means. + * + * Each data plane must be aligned to the maximum required by the target + * CPU. + * + * @see avcodec_default_get_buffer2() + * + * Video: + * + * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused + * (read and/or written to if it is writable) later by libavcodec. + * + * avcodec_align_dimensions2() should be used to find the required width and + * height, as they normally need to be rounded up to the next multiple of 16. + * + * Some decoders do not support linesizes changing between frames. + * + * If frame multithreading is used and thread_safe_callbacks is set, + * this callback may be called from a different thread, but not from more + * than one at once. Does not need to be reentrant. + * + * @see avcodec_align_dimensions2() + * + * Audio: + * + * Decoders request a buffer of a particular size by setting + * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may, + * however, utilize only part of the buffer by setting AVFrame.nb_samples + * to a smaller value in the output frame. + * + * As a convenience, av_samples_get_buffer_size() and + * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2() + * functions to find the required data size and to fill data pointers and + * linesize. In AVFrame.linesize, only linesize[0] may be set for audio + * since all planes must be the same size. + * + * @see av_samples_get_buffer_size(), av_samples_fill_arrays() + * + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags); + + /** + * If non-zero, the decoded audio and video frames returned from + * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted + * and are valid indefinitely. The caller must free them with + * av_frame_unref() when they are not needed anymore. + * Otherwise, the decoded frames must not be freed by the caller and are + * only valid until the next decode call. + * + * This is always automatically enabled if avcodec_receive_frame() is used. + * + * - encoding: unused + * - decoding: set by the caller before avcodec_open2(). + */ + attribute_deprecated + int refcounted_frames; + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + int rc_override_count; + RcOverride *rc_override; + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: Set by user, may be overwritten by libavcodec. + */ + int64_t rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int64_t rc_min_rate; + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + +#if FF_API_CODER_TYPE +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 +#define FF_CODER_TYPE_RAW 2 +#define FF_CODER_TYPE_RLE 3 + /** + * @deprecated use encoder private options instead + */ + attribute_deprecated + int coder_type; +#endif /* FF_API_CODER_TYPE */ + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int context_model; +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_threshold; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_factor; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_exp; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int frame_skip_cmp; +#endif /* FF_API_PRIVATE_OPT */ + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int min_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int max_prediction_order; + + /** @deprecated use encoder private options instead */ + attribute_deprecated + int64_t timecode_frame_start; +#endif + +#if FF_API_RTP_CALLBACK + /** + * @deprecated unused + */ + /* The RTP callback: This function is called */ + /* every time the encoder has a packet to send. */ + /* It depends on the encoder if the data starts */ + /* with a Start Code (it should). H.263 does. */ + /* mb_nb contains the number of macroblocks */ + /* encoded in the RTP payload. */ + attribute_deprecated + void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb); +#endif + +#if FF_API_PRIVATE_OPT + /** @deprecated use encoder private options instead */ + attribute_deprecated + int rtp_payload_size; /* The size of the RTP payload: the coder will */ + /* do its best to deliver a chunk with size */ + /* below rtp_payload_size, the chunk will start */ + /* with a start code on some codecs like H.263. */ + /* This doesn't take account of any particular */ + /* headers inside the transmitted RTP payload. */ +#endif + +#if FF_API_STAT_BITS + /* statistics, used for 2-pass encoding */ + attribute_deprecated + int mv_bits; + attribute_deprecated + int header_bits; + attribute_deprecated + int i_tex_bits; + attribute_deprecated + int p_tex_bits; + attribute_deprecated + int i_count; + attribute_deprecated + int p_count; + attribute_deprecated + int skip_count; + attribute_deprecated + int misc_bits; + + /** @deprecated this field is unused */ + attribute_deprecated + int frame_bits; +#endif + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + int workaround_bugs; +#define FF_BUG_AUTODETECT 1 ///< autodetection +#define FF_BUG_XVID_ILACE 4 +#define FF_BUG_UMP4 8 +#define FF_BUG_NO_PADDING 16 +#define FF_BUG_AMV 32 +#define FF_BUG_QPEL_CHROMA 64 +#define FF_BUG_STD_QPEL 128 +#define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 +#define FF_BUG_HPEL_CHROMA 2048 +#define FF_BUG_DC_CLIP 4096 +#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders. +#define FF_BUG_TRUNCATED 16384 +#define FF_BUG_IEDGE 32768 + + /** + * strictly follow the standard (MPEG-4, ...). + * - encoding: Set by user. + * - decoding: Set by user. + * Setting this to STRICT or higher means the encoder and decoder will + * generally do stupid things, whereas setting it to unofficial or lower + * will mean the encoder might produce output that is not supported by all + * spec-compliant decoders. Decoders don't differentiate between normal, + * unofficial and experimental (that is, they always try to decode things + * when they can) unless they are explicitly asked to behave stupidly + * (=strictly conform to the specs) + */ + int strict_std_compliance; +#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software. +#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences. +#define FF_COMPLIANCE_NORMAL 0 +#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions +#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things. + + /** + * error concealment flags + * - encoding: unused + * - decoding: Set by user. + */ + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 +#define FF_EC_FAVOR_INTER 256 + + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug; +#define FF_DEBUG_PICT_INFO 1 +#define FF_DEBUG_RC 2 +#define FF_DEBUG_BITSTREAM 4 +#define FF_DEBUG_MB_TYPE 8 +#define FF_DEBUG_QP 16 +#if FF_API_DEBUG_MV +/** + * @deprecated this option does nothing + */ +#define FF_DEBUG_MV 32 +#endif +#define FF_DEBUG_DCT_COEFF 0x00000040 +#define FF_DEBUG_SKIP 0x00000080 +#define FF_DEBUG_STARTCODE 0x00000100 +#define FF_DEBUG_ER 0x00000400 +#define FF_DEBUG_MMCO 0x00000800 +#define FF_DEBUG_BUGS 0x00001000 +#if FF_API_DEBUG_MV +#define FF_DEBUG_VIS_QP 0x00002000 +#define FF_DEBUG_VIS_MB_TYPE 0x00004000 +#endif +#define FF_DEBUG_BUFFERS 0x00008000 +#define FF_DEBUG_THREADS 0x00010000 +#define FF_DEBUG_GREEN_MD 0x00800000 +#define FF_DEBUG_NOMC 0x01000000 + +#if FF_API_DEBUG_MV + /** + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 // visualize forward predicted MVs of P-frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 // visualize forward predicted MVs of B-frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 // visualize backward predicted MVs of B-frames +#endif + + /** + * Error recognition; may misdetect some more or less valid parts as errors. + * - encoding: unused + * - decoding: Set by user. + */ + int err_recognition; + +/** + * Verify checksums embedded in the bitstream (could be of either encoded or + * decoded data, depending on the codec) and print an error message on mismatch. + * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the + * decoder returning an error. + */ +#define AV_EF_CRCCHECK (1<<0) +#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations +#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length +#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection + +#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue +#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors +#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors +#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder should not do as an error + + + /** + * opaque 64-bit number (generally a PTS) that will be reordered and + * output in AVFrame.reordered_opaque + * - encoding: Set by libavcodec to the reordered_opaque of the input + * frame corresponding to the last returned packet. Only + * supported by encoders with the + * AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability. + * - decoding: Set by user. + */ + int64_t reordered_opaque; + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + const struct AVHWAccel *hwaccel; + + /** + * Hardware accelerator context. + * For some hardware accelerators, a global context needs to be + * provided by the user. In that case, this holds display-dependent + * data FFmpeg cannot instantiate itself. Please refer to the + * FFmpeg HW accelerator documentation to know how to fill this + * is. e.g. for VA API, this is a struct vaapi_context. + * - encoding: unused + * - decoding: Set by user + */ + void *hwaccel_context; + + /** + * error + * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR. + * - decoding: unused + */ + uint64_t error[AV_NUM_DATA_POINTERS]; + + /** + * DCT algorithm, see FF_DCT_* below + * - encoding: Set by user. + * - decoding: unused + */ + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 + + /** + * IDCT algorithm, see FF_IDCT_* below. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#define FF_IDCT_SIMPLEARM 10 +#define FF_IDCT_XVID 14 +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#define FF_IDCT_FAAN 20 +#define FF_IDCT_SIMPLENEON 22 +#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */ +#define FF_IDCT_SIMPLEAUTO 128 + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + +#if FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + +#if FF_API_CODED_FRAME + /** + * the picture in the bitstream + * - encoding: Set by libavcodec. + * - decoding: unused + * + * @deprecated use the quality factor packet side data instead + */ + attribute_deprecated AVFrame *coded_frame; +#endif + + /** + * thread count + * is used to decide how many independent tasks should be passed to execute() + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_count; + + /** + * Which multithreading methods to use. + * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread, + * so clients which cannot provide future frames should not use it. + * + * - encoding: Set by user, otherwise the default is used. + * - decoding: Set by user, otherwise the default is used. + */ + int thread_type; +#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once +#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once + + /** + * Which multithreading methods are in use by the codec. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int active_thread_type; + + /** + * Set by the client if its custom get_buffer() callback can be called + * synchronously from another thread, which allows faster multithreaded decoding. + * draw_horiz_band() will be called from other threads regardless of this setting. + * Ignored if the default get_buffer() is used. + * - encoding: Set by user. + * - decoding: Set by user. + */ + int thread_safe_callbacks; + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * @param count the number of things to execute + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); + + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. + * @param c context passed also to func + * @param count the number of things to execute + * @param arg2 argument passed unchanged to func + * @param ret return values of executed functions, must have space for "count" values. May be NULL. + * @param func function that will be called count times, with jobnr from 0 to count-1. + * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no + * two instances of func executing at the same time will have the same threadnr. + * @return always 0 currently, but code should handle a future improvement where when any call to func + * returns < 0 no further calls to func may be done and < 0 is returned. + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + + /** + * noise vs. sse weight for the nsse comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int nsse_weight; + + /** + * profile + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int profile; +#define FF_PROFILE_UNKNOWN -99 +#define FF_PROFILE_RESERVED -100 + +#define FF_PROFILE_AAC_MAIN 0 +#define FF_PROFILE_AAC_LOW 1 +#define FF_PROFILE_AAC_SSR 2 +#define FF_PROFILE_AAC_LTP 3 +#define FF_PROFILE_AAC_HE 4 +#define FF_PROFILE_AAC_HE_V2 28 +#define FF_PROFILE_AAC_LD 22 +#define FF_PROFILE_AAC_ELD 38 +#define FF_PROFILE_MPEG2_AAC_LOW 128 +#define FF_PROFILE_MPEG2_AAC_HE 131 + +#define FF_PROFILE_DNXHD 0 +#define FF_PROFILE_DNXHR_LB 1 +#define FF_PROFILE_DNXHR_SQ 2 +#define FF_PROFILE_DNXHR_HQ 3 +#define FF_PROFILE_DNXHR_HQX 4 +#define FF_PROFILE_DNXHR_444 5 + +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 +#define FF_PROFILE_DTS_EXPRESS 70 + +#define FF_PROFILE_MPEG2_422 0 +#define FF_PROFILE_MPEG2_HIGH 1 +#define FF_PROFILE_MPEG2_SS 2 +#define FF_PROFILE_MPEG2_SNR_SCALABLE 3 +#define FF_PROFILE_MPEG2_MAIN 4 +#define FF_PROFILE_MPEG2_SIMPLE 5 + +#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag +#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag + +#define FF_PROFILE_H264_BASELINE 66 +#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED) +#define FF_PROFILE_H264_MAIN 77 +#define FF_PROFILE_H264_EXTENDED 88 +#define FF_PROFILE_H264_HIGH 100 +#define FF_PROFILE_H264_HIGH_10 110 +#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_MULTIVIEW_HIGH 118 +#define FF_PROFILE_H264_HIGH_422 122 +#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_STEREO_HIGH 128 +#define FF_PROFILE_H264_HIGH_444 144 +#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244 +#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA) +#define FF_PROFILE_H264_CAVLC_444 44 + +#define FF_PROFILE_VC1_SIMPLE 0 +#define FF_PROFILE_VC1_MAIN 1 +#define FF_PROFILE_VC1_COMPLEX 2 +#define FF_PROFILE_VC1_ADVANCED 3 + +#define FF_PROFILE_MPEG4_SIMPLE 0 +#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1 +#define FF_PROFILE_MPEG4_CORE 2 +#define FF_PROFILE_MPEG4_MAIN 3 +#define FF_PROFILE_MPEG4_N_BIT 4 +#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5 +#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6 +#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7 +#define FF_PROFILE_MPEG4_HYBRID 8 +#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9 +#define FF_PROFILE_MPEG4_CORE_SCALABLE 10 +#define FF_PROFILE_MPEG4_ADVANCED_CODING 11 +#define FF_PROFILE_MPEG4_ADVANCED_CORE 12 +#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13 +#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14 +#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15 + +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1 +#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2 +#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768 +#define FF_PROFILE_JPEG2000_DCINEMA_2K 3 +#define FF_PROFILE_JPEG2000_DCINEMA_4K 4 + +#define FF_PROFILE_VP9_0 0 +#define FF_PROFILE_VP9_1 1 +#define FF_PROFILE_VP9_2 2 +#define FF_PROFILE_VP9_3 3 + +#define FF_PROFILE_HEVC_MAIN 1 +#define FF_PROFILE_HEVC_MAIN_10 2 +#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define FF_PROFILE_HEVC_REXT 4 + +#define FF_PROFILE_AV1_MAIN 0 +#define FF_PROFILE_AV1_HIGH 1 +#define FF_PROFILE_AV1_PROFESSIONAL 2 + +#define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0 +#define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1 +#define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2 +#define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3 +#define FF_PROFILE_MJPEG_JPEG_LS 0xf7 + +#define FF_PROFILE_SBC_MSBC 1 + +#define FF_PROFILE_PRORES_PROXY 0 +#define FF_PROFILE_PRORES_LT 1 +#define FF_PROFILE_PRORES_STANDARD 2 +#define FF_PROFILE_PRORES_HQ 3 +#define FF_PROFILE_PRORES_4444 4 +#define FF_PROFILE_PRORES_XQ 5 + +#define FF_PROFILE_ARIB_PROFILE_A 0 +#define FF_PROFILE_ARIB_PROFILE_C 1 + + /** + * level + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int level; +#define FF_LEVEL_UNKNOWN -99 + + /** + * Skip loop filtering for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_loop_filter; + + /** + * Skip IDCT/dequantization for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_idct; + + /** + * Skip decoding for selected frames. + * - encoding: unused + * - decoding: Set by user. + */ + enum AVDiscard skip_frame; + + /** + * Header containing style information for text subtitles. + * For SUBTITLE_ASS subtitle type, it should contain the whole ASS + * [Script Info] and [V4+ Styles] section, plus the [Events] line and + * the Format line following. It shouldn't include any Dialogue line. + * - encoding: Set/allocated/freed by user (before avcodec_open2()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; + +#if FF_API_VBV_DELAY + /** + * VBV delay coded in the last frame (in periods of a 27 MHz clock). + * Used for compliant TS muxing. + * - encoding: Set by libavcodec. + * - decoding: unused. + * @deprecated this value is now exported as a part of + * AV_PKT_DATA_CPB_PROPERTIES packet side data + */ + attribute_deprecated + uint64_t vbv_delay; +#endif + +#if FF_API_SIDEDATA_ONLY_PKT + /** + * Encoding only and set by default. Allow encoders to output packets + * that do not contain any encoded data, only side data. + * + * Some encoders need to output such packets, e.g. to update some stream + * parameters at the end of encoding. + * + * @deprecated this field disables the default behaviour and + * it is kept only for compatibility. + */ + attribute_deprecated + int side_data_only_packets; +#endif + + /** + * Audio only. The number of "priming" samples (padding) inserted by the + * encoder at the beginning of the audio. I.e. this number of leading + * decoded samples must be discarded by the caller to get the original audio + * without leading padding. + * + * - decoding: unused + * - encoding: Set by libavcodec. The timestamps on the output packets are + * adjusted by the encoder so that they always refer to the + * first sample of the data actually contained in the packet, + * including any added padding. E.g. if the timebase is + * 1/samplerate and the timestamp of the first input sample is + * 0, the timestamp of the first output packet will be + * -initial_padding. + */ + int initial_padding; + + /** + * - decoding: For codecs that store a framerate value in the compressed + * bitstream, the decoder may export it here. { 0, 1} when + * unknown. + * - encoding: May be used to signal the framerate of CFR content to an + * encoder. + */ + AVRational framerate; + + /** + * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx. + * - encoding: unused. + * - decoding: Set by libavcodec before calling get_format() + */ + enum AVPixelFormat sw_pix_fmt; + + /** + * Timebase in which pkt_dts/pts and AVPacket.dts/pts are. + * - encoding unused. + * - decoding set by user. + */ + AVRational pkt_timebase; + + /** + * AVCodecDescriptor + * - encoding: unused. + * - decoding: set by libavcodec. + */ + const AVCodecDescriptor *codec_descriptor; + +#if !FF_API_LOWRES + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; +#endif + + /** + * Current statistics for PTS correction. + * - decoding: maintained and used by libavcodec, not intended to be used by user apps + * - encoding: unused + */ + int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far + int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far + int64_t pts_correction_last_pts; /// PTS of the last frame + int64_t pts_correction_last_dts; /// DTS of the last frame + + /** + * Character encoding of the input subtitles file. + * - decoding: set by user + * - encoding: unused + */ + char *sub_charenc; + + /** + * Subtitles character encoding mode. Formats or codecs might be adjusting + * this setting (if they are doing the conversion themselves for instance). + * - decoding: set by libavcodec + * - encoding: unused + */ + int sub_charenc_mode; +#define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance) +#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself +#define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv +#define FF_SUB_CHARENC_MODE_IGNORE 2 ///< neither convert the subtitles, nor check them for valid UTF-8 + + /** + * Skip processing alpha if supported by codec. + * Note that if the format uses pre-multiplied alpha (common with VP6, + * and recommended due to better video quality/compression) + * the image will look as if alpha-blended onto a black background. + * However for formats that do not use pre-multiplied alpha + * there might be serious artefacts (though e.g. libswscale currently + * assumes pre-multiplied alpha anyway). + * + * - decoding: set by user + * - encoding: unused + */ + int skip_alpha; + + /** + * Number of samples to skip after a discontinuity + * - decoding: unused + * - encoding: set by libavcodec + */ + int seek_preroll; + +#if !FF_API_DEBUG_MV + /** + * debug motion vectors + * - encoding: Set by user. + * - decoding: Set by user. + */ + int debug_mv; +#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames +#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames +#endif + + /** + * custom intra quantization matrix + * - encoding: Set by user, can be NULL. + * - decoding: unused. + */ + uint16_t *chroma_intra_matrix; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - encoding: Set by user. + * - decoding: Set by user. + */ + uint8_t *dump_separator; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * Properties of the stream that gets decoded + * - encoding: unused + * - decoding: set by libavcodec + */ + unsigned properties; +#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001 +#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 + + /** + * Additional data associated with the entire coded stream. + * + * - decoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). + */ + AVPacketSideData *coded_side_data; + int nb_coded_side_data; + + /** + * A reference to the AVHWFramesContext describing the input (for encoding) + * or output (decoding) frames. The reference is set by the caller and + * afterwards owned (and freed) by libavcodec - it should never be read by + * the caller after being set. + * + * - decoding: This field should be set by the caller from the get_format() + * callback. The previous reference (if any) will always be + * unreffed by libavcodec before the get_format() call. + * + * If the default get_buffer2() is used with a hwaccel pixel + * format, then this AVHWFramesContext will be used for + * allocating the frame buffers. + * + * - encoding: For hardware encoders configured to use a hwaccel pixel + * format, this field should be set by the caller to a reference + * to the AVHWFramesContext describing input frames. + * AVHWFramesContext.format must be equal to + * AVCodecContext.pix_fmt. + * + * This field should be set before avcodec_open2() is called. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Control the form of AVSubtitle.rects[N]->ass + * - decoding: set by user + * - encoding: unused + */ + int sub_text_format; +#define FF_SUB_TEXT_FMT_ASS 0 +#if FF_API_ASS_TIMING +#define FF_SUB_TEXT_FMT_ASS_WITH_TIMINGS 1 +#endif + + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + * + * - decoding: unused + * - encoding: unused + */ + int trailing_padding; + + /** + * The number of pixels per image to maximally accept. + * + * - decoding: set by user + * - encoding: set by user + */ + int64_t max_pixels; + + /** + * A reference to the AVHWDeviceContext describing the device which will + * be used by a hardware encoder/decoder. The reference is set by the + * caller and afterwards owned (and freed) by libavcodec. + * + * This should be used if either the codec device does not require + * hardware frames or any that are used are to be allocated internally by + * libavcodec. If the user wishes to supply any of the frames used as + * encoder input or decoder output then hw_frames_ctx should be used + * instead. When hw_frames_ctx is set in get_format() for a decoder, this + * field will be ignored while decoding the associated stream segment, but + * may again be used on a following one after another get_format() call. + * + * For both encoders and decoders this field should be set before + * avcodec_open2() is called and must not be written to thereafter. + * + * Note that some decoders may require this field to be set initially in + * order to support hw_frames_ctx at all - in that case, all frames + * contexts used must be created on the same device. + */ + AVBufferRef *hw_device_ctx; + + /** + * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated + * decoding (if active). + * - encoding: unused + * - decoding: Set by user (either before avcodec_open2(), or in the + * AVCodecContext.get_format callback) + */ + int hwaccel_flags; + + /** + * Video decoding only. Certain video codecs support cropping, meaning that + * only a sub-rectangle of the decoded frame is intended for display. This + * option controls how cropping is handled by libavcodec. + * + * When set to 1 (the default), libavcodec will apply cropping internally. + * I.e. it will modify the output frame width/height fields and offset the + * data pointers (only by as much as possible while preserving alignment, or + * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that + * the frames output by the decoder refer only to the cropped area. The + * crop_* fields of the output frames will be zero. + * + * When set to 0, the width/height fields of the output frames will be set + * to the coded dimensions and the crop_* fields will describe the cropping + * rectangle. Applying the cropping is left to the caller. + * + * @warning When hardware acceleration with opaque output frames is used, + * libavcodec is unable to apply cropping from the top/left border. + * + * @note when this option is set to zero, the width/height fields of the + * AVCodecContext and output AVFrames have different meanings. The codec + * context fields store display dimensions (with the coded dimensions in + * coded_width/height), while the frame fields store the coded dimensions + * (with the display dimensions being determined by the crop_* fields). + */ + int apply_cropping; + + /* + * Video decoding only. Sets the number of extra hardware frames which + * the decoder will allocate for use by the caller. This must be set + * before avcodec_open2() is called. + * + * Some hardware decoders require all frames that they will use for + * output to be defined in advance before decoding starts. For such + * decoders, the hardware frame pool must therefore be of a fixed size. + * The extra frames set here are on top of any number that the decoder + * needs internally in order to operate normally (for example, frames + * used as reference pictures). + */ + int extra_hw_frames; + + /** + * The percentage of damaged samples to discard a frame. + * + * - decoding: set by user + * - encoding: unused + */ + int discard_damaged_percentage; +} AVCodecContext; + +#if FF_API_CODEC_GET_SET +/** + * Accessors for some AVCodecContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val); + +attribute_deprecated +const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc); + +attribute_deprecated +unsigned av_codec_get_codec_properties(const AVCodecContext *avctx); + +#if FF_API_LOWRES +attribute_deprecated +int av_codec_get_lowres(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_lowres(AVCodecContext *avctx, int val); +#endif + +attribute_deprecated +int av_codec_get_seek_preroll(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_seek_preroll(AVCodecContext *avctx, int val); + +attribute_deprecated +uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx); +attribute_deprecated +void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val); +#endif + +/** + * AVProfile. + */ +typedef struct AVProfile { + int profile; + const char *name; ///< short name for the profile +} AVProfile; + +enum { + /** + * The codec supports this format via the hw_device_ctx interface. + * + * When selecting this format, AVCodecContext.hw_device_ctx should + * have been set to a device of the specified type before calling + * avcodec_open2(). + */ + AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01, + /** + * The codec supports this format via the hw_frames_ctx interface. + * + * When selecting this format for a decoder, + * AVCodecContext.hw_frames_ctx should be set to a suitable frames + * context inside the get_format() callback. The frames context + * must have been created on a device of the specified type. + */ + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02, + /** + * The codec supports this format by some internal method. + * + * This format can be selected without any additional configuration - + * no device or frames context is required. + */ + AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04, + /** + * The codec supports this format by some ad-hoc method. + * + * Additional settings and/or function calls are required. See the + * codec-specific documentation for details. (Methods requiring + * this sort of configuration are deprecated and others should be + * used in preference.) + */ + AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08, +}; + +typedef struct AVCodecHWConfig { + /** + * A hardware pixel format which the codec can use. + */ + enum AVPixelFormat pix_fmt; + /** + * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible + * setup methods which can be used with this configuration. + */ + int methods; + /** + * The device type associated with the configuration. + * + * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and + * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused. + */ + enum AVHWDeviceType device_type; +} AVCodecHWConfig; + +typedef struct AVCodecDefault AVCodecDefault; + +struct AVSubtitle; + +/** + * AVCodec. + */ +typedef struct AVCodec { + /** + * Name of the codec implementation. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + * This is the primary way to find a codec from the user perspective. + */ + const char *name; + /** + * Descriptive name for the codec, meant to be more human readable than name. + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *long_name; + enum AVMediaType type; + enum AVCodecID id; + /** + * Codec capabilities. + * see AV_CODEC_CAP_* + */ + int capabilities; + const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} + const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 + const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 + const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 + const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 + uint8_t max_lowres; ///< maximum value for lowres supported by the decoder + const AVClass *priv_class; ///< AVClass for the private context + const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} + + /** + * Group name of the codec implementation. + * This is a short symbolic name of the wrapper backing this codec. A + * wrapper uses some kind of external implementation for the codec, such + * as an external library, or a codec implementation provided by the OS or + * the hardware. + * If this field is NULL, this is a builtin, libavcodec native codec. + * If non-NULL, this will be the suffix in AVCodec.name in most cases + * (usually AVCodec.name will be of the form "_"). + */ + const char *wrapper_name; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int priv_data_size; + struct AVCodec *next; + /** + * @name Frame-level threading support functions + * @{ + */ + /** + * If defined, called on thread contexts when they are created. + * If the codec allocates writable tables in init(), re-allocate them here. + * priv_data will be set to a copy of the original. + */ + int (*init_thread_copy)(AVCodecContext *); + /** + * Copy necessary context variables from a previous thread context to the current one. + * If not defined, the next thread will start automatically; otherwise, the codec + * must call ff_thread_finish_setup(). + * + * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. + */ + int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); + /** @} */ + + /** + * Private codec-specific defaults. + */ + const AVCodecDefault *defaults; + + /** + * Initialize codec static data, called from avcodec_register(). + * + * This is not intended for time consuming operations as it is + * run for every codec regardless of that codec being used. + */ + void (*init_static_data)(struct AVCodec *codec); + + int (*init)(AVCodecContext *); + int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size, + const struct AVSubtitle *sub); + /** + * Encode data to an AVPacket. + * + * @param avctx codec context + * @param avpkt output AVPacket (may contain a user-provided buffer) + * @param[in] frame AVFrame containing the raw data to be encoded + * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a + * non-empty packet was returned in avpkt. + * @return 0 on success, negative error code on failure + */ + int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, + int *got_packet_ptr); + int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); + int (*close)(AVCodecContext *); + /** + * Encode API with decoupled packet/frame dataflow. The API is the + * same as the avcodec_ prefixed APIs (avcodec_send_frame() etc.), except + * that: + * - never called if the codec is closed or the wrong type, + * - if AV_CODEC_CAP_DELAY is not set, drain frames are never sent, + * - only one drain frame is ever passed down, + */ + int (*send_frame)(AVCodecContext *avctx, const AVFrame *frame); + int (*receive_packet)(AVCodecContext *avctx, AVPacket *avpkt); + + /** + * Decode API with decoupled packet/frame dataflow. This function is called + * to get one output frame. It should call ff_decode_get_packet() to obtain + * input data. + */ + int (*receive_frame)(AVCodecContext *avctx, AVFrame *frame); + /** + * Flush buffers. + * Will be called when seeking + */ + void (*flush)(AVCodecContext *); + /** + * Internal codec capabilities. + * See FF_CODEC_CAP_* in internal.h + */ + int caps_internal; + + /** + * Decoding only, a comma-separated list of bitstream filters to apply to + * packets before decoding. + */ + const char *bsfs; + + /** + * Array of pointers to hardware configurations supported by the codec, + * or NULL if no hardware supported. The array is terminated by a NULL + * pointer. + * + * The user can only access this field via avcodec_get_hw_config(). + */ + const struct AVCodecHWConfigInternal **hw_configs; +} AVCodec; + +#if FF_API_CODEC_GET_SET +attribute_deprecated +int av_codec_get_max_lowres(const AVCodec *codec); +#endif + +struct MpegEncContext; + +/** + * Retrieve supported hardware configurations for a codec. + * + * Values of index from zero to some maximum return the indexed configuration + * descriptor; all other values return NULL. If the codec does not support + * any hardware configurations then it will always return NULL. + */ +const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index); + +/** + * @defgroup lavc_hwaccel AVHWAccel + * + * @note Nothing in this structure should be accessed by the user. At some + * point in future it will not be externally visible at all. + * + * @{ + */ +typedef struct AVHWAccel { + /** + * Name of the hardware accelerated codec. + * The name is globally unique among encoders and among decoders (but an + * encoder and a decoder can share the same name). + */ + const char *name; + + /** + * Type of codec implemented by the hardware accelerator. + * + * See AVMEDIA_TYPE_xxx + */ + enum AVMediaType type; + + /** + * Codec implemented by the hardware accelerator. + * + * See AV_CODEC_ID_xxx + */ + enum AVCodecID id; + + /** + * Supported pixel format. + * + * Only hardware accelerated formats are supported here. + */ + enum AVPixelFormat pix_fmt; + + /** + * Hardware accelerated codec capabilities. + * see AV_HWACCEL_CODEC_CAP_* + */ + int capabilities; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Allocate a custom buffer + */ + int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame); + + /** + * Called at the beginning of each frame or field picture. + * + * Meaningful frame information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * + * Note that buf can be NULL along with buf_size set to 0. + * Otherwise, this means the whole frame is available at this point. + * + * @param avctx the codec context + * @param buf the frame data buffer base + * @param buf_size the size of the frame in bytes + * @return zero if successful, a negative value otherwise + */ + int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for parameter data (SPS/PPS/VPS etc). + * + * Useful for hardware decoders which keep persistent state about the + * video parameters, and need to receive any changes to update that state. + * + * @param avctx the codec context + * @param type the nal unit type + * @param buf the nal unit data buffer + * @param buf_size the size of the nal unit in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size); + + /** + * Callback for each slice. + * + * Meaningful slice information (codec specific) is guaranteed to + * be parsed at this point. This function is mandatory. + * The only exception is XvMC, that works on MB level. + * + * @param avctx the codec context + * @param buf the slice data buffer base + * @param buf_size the size of the slice in bytes + * @return zero if successful, a negative value otherwise + */ + int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); + + /** + * Called at the end of each frame or field picture. + * + * The whole picture is parsed at this point and can now be sent + * to the hardware accelerator. This function is mandatory. + * + * @param avctx the codec context + * @return zero if successful, a negative value otherwise + */ + int (*end_frame)(AVCodecContext *avctx); + + /** + * Size of per-frame hardware accelerator private data. + * + * Private data is allocated with av_mallocz() before + * AVCodecContext.get_buffer() and deallocated after + * AVCodecContext.release_buffer(). + */ + int frame_priv_data_size; + + /** + * Called for every Macroblock in a slice. + * + * XvMC uses it to replace the ff_mpv_reconstruct_mb(). + * Instead of decoding to raw picture, MB parameters are + * stored in an array provided by the video driver. + * + * @param s the mpeg context + */ + void (*decode_mb)(struct MpegEncContext *s); + + /** + * Initialize the hwaccel private data. + * + * This will be called from ff_get_format(), after hwaccel and + * hwaccel_context are set and the hwaccel private data in AVCodecInternal + * is allocated. + */ + int (*init)(AVCodecContext *avctx); + + /** + * Uninitialize the hwaccel private data. + * + * This will be called from get_format() or avcodec_close(), after hwaccel + * and hwaccel_context are already uninitialized. + */ + int (*uninit)(AVCodecContext *avctx); + + /** + * Size of the private data to allocate in + * AVCodecInternal.hwaccel_priv_data. + */ + int priv_data_size; + + /** + * Internal hwaccel capabilities. + */ + int caps_internal; + + /** + * Fill the given hw_frames context with current codec parameters. Called + * from get_format. Refer to avcodec_get_hw_frames_parameters() for + * details. + * + * This CAN be called before AVHWAccel.init is called, and you must assume + * that avctx->hwaccel_priv_data is invalid. + */ + int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); +} AVHWAccel; + +/** + * HWAccel is experimental and is thus avoided in favor of non experimental + * codecs + */ +#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200 + +/** + * Hardware acceleration should be used for decoding even if the codec level + * used is unknown or higher than the maximum supported level reported by the + * hardware driver. + * + * It's generally a good idea to pass this flag unless you have a specific + * reason not to, as hardware tends to under-report supported levels. + */ +#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0) + +/** + * Hardware acceleration can output YUV pixel formats with a different chroma + * sampling than 4:2:0 and/or other than 8 bits per component. + */ +#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1) + +/** + * Hardware acceleration should still be attempted for decoding when the + * codec profile does not match the reported capabilities of the hardware. + * + * For example, this can be used to try to decode baseline profile H.264 + * streams in hardware - it will often succeed, because many streams marked + * as baseline profile actually conform to constrained baseline profile. + * + * @warning If the stream is actually not supported then the behaviour is + * undefined, and may include returning entirely incorrect output + * while indicating success. + */ +#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2) + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @defgroup lavc_picture AVPicture + * + * Functions for working with AVPicture + * @{ + */ + +/** + * Picture data structure. + * + * Up to four components can be stored into it, the last component is + * alpha. + * @deprecated use AVFrame or imgutils functions instead + */ +typedef struct AVPicture { + attribute_deprecated + uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes + attribute_deprecated + int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line +} AVPicture; + +/** + * @} + */ +#endif + +enum AVSubtitleType { + SUBTITLE_NONE, + + SUBTITLE_BITMAP, ///< A bitmap, pict will be set + + /** + * Plain text, the text field must be set by the decoder and is + * authoritative. ass and pict fields may contain approximations. + */ + SUBTITLE_TEXT, + + /** + * Formatted text, the ass field must be set by the decoder and is + * authoritative. pict and text fields may contain approximations. + */ + SUBTITLE_ASS, +}; + +#define AV_SUBTITLE_FLAG_FORCED 0x00000001 + +typedef struct AVSubtitleRect { + int x; ///< top left corner of pict, undefined when pict is not set + int y; ///< top left corner of pict, undefined when pict is not set + int w; ///< width of pict, undefined when pict is not set + int h; ///< height of pict, undefined when pict is not set + int nb_colors; ///< number of colors in pict, undefined when pict is not set + +#if FF_API_AVPICTURE + /** + * @deprecated unused + */ + attribute_deprecated + AVPicture pict; +#endif + /** + * data+linesize for the bitmap of this subtitle. + * Can be set for text/ass as well once they are rendered. + */ + uint8_t *data[4]; + int linesize[4]; + + enum AVSubtitleType type; + + char *text; ///< 0 terminated plain UTF-8 text + + /** + * 0 terminated ASS/SSA compatible event line. + * The presentation of this is unaffected by the other values in this + * struct. + */ + char *ass; + + int flags; +} AVSubtitleRect; + +typedef struct AVSubtitle { + uint16_t format; /* 0 = graphics */ + uint32_t start_display_time; /* relative to packet pts, in ms */ + uint32_t end_display_time; /* relative to packet pts, in ms */ + unsigned num_rects; + AVSubtitleRect **rects; + int64_t pts; ///< Same as packet pts, in AV_TIME_BASE +} AVSubtitle; + +/** + * This struct describes the properties of an encoded stream. + * + * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must + * be allocated with avcodec_parameters_alloc() and freed with + * avcodec_parameters_free(). + */ +typedef struct AVCodecParameters { + /** + * General type of the encoded data. + */ + enum AVMediaType codec_type; + /** + * Specific type of the encoded data (the codec used). + */ + enum AVCodecID codec_id; + /** + * Additional information about the codec (corresponds to the AVI FOURCC). + */ + uint32_t codec_tag; + + /** + * Extra binary data needed for initializing the decoder, codec-dependent. + * + * Must be allocated with av_malloc() and will be freed by + * avcodec_parameters_free(). The allocated size of extradata must be at + * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding + * bytes zeroed. + */ + uint8_t *extradata; + /** + * Size of the extradata content in bytes. + */ + int extradata_size; + + /** + * - video: the pixel format, the value corresponds to enum AVPixelFormat. + * - audio: the sample format, the value corresponds to enum AVSampleFormat. + */ + int format; + + /** + * The average bitrate of the encoded data (in bits per second). + */ + int64_t bit_rate; + + /** + * The number of bits per sample in the codedwords. + * + * This is basically the bitrate per sample. It is mandatory for a bunch of + * formats to actually decode them. It's the number of bits for one sample in + * the actual coded bitstream. + * + * This could be for example 4 for ADPCM + * For PCM formats this matches bits_per_raw_sample + * Can be 0 + */ + int bits_per_coded_sample; + + /** + * This is the number of valid bits in each output sample. If the + * sample format has more bits, the least significant bits are additional + * padding bits, which are always 0. Use right shifts to reduce the sample + * to its actual size. For example, audio formats with 24 bit samples will + * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32. + * To get the original sample use "(int32_t)sample >> 8"." + * + * For ADPCM this might be 12 or 16 or similar + * Can be 0 + */ + int bits_per_raw_sample; + + /** + * Codec-specific bitstream restrictions that the stream conforms to. + */ + int profile; + int level; + + /** + * Video only. The dimensions of the video frame in pixels. + */ + int width; + int height; + + /** + * Video only. The aspect ratio (width / height) which a single pixel + * should have when displayed. + * + * When the aspect ratio is unknown / undefined, the numerator should be + * set to 0 (the denominator may have any value). + */ + AVRational sample_aspect_ratio; + + /** + * Video only. The order of the fields in interlaced video. + */ + enum AVFieldOrder field_order; + + /** + * Video only. Additional colorspace characteristics. + */ + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace color_space; + enum AVChromaLocation chroma_location; + + /** + * Video only. Number of delayed frames. + */ + int video_delay; + + /** + * Audio only. The channel layout bitmask. May be 0 if the channel layout is + * unknown or unspecified, otherwise the number of bits set must be equal to + * the channels field. + */ + uint64_t channel_layout; + /** + * Audio only. The number of audio channels. + */ + int channels; + /** + * Audio only. The number of audio samples per second. + */ + int sample_rate; + /** + * Audio only. The number of bytes per coded audio frame, required by some + * formats. + * + * Corresponds to nBlockAlign in WAVEFORMATEX. + */ + int block_align; + /** + * Audio only. Audio frame size, if known. Required by some formats to be static. + */ + int frame_size; + + /** + * Audio only. The amount of padding (in samples) inserted by the encoder at + * the beginning of the audio. I.e. this number of leading decoded samples + * must be discarded by the caller to get the original audio without leading + * padding. + */ + int initial_padding; + /** + * Audio only. The amount of padding (in samples) appended by the encoder to + * the end of the audio. I.e. this number of decoded samples must be + * discarded by the caller from the end of the stream to get the original + * audio without any trailing padding. + */ + int trailing_padding; + /** + * Audio only. Number of samples to skip after a discontinuity. + */ + int seek_preroll; +} AVCodecParameters; + +/** + * Iterate over all registered codecs. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec or NULL when the iteration is + * finished + */ +const AVCodec *av_codec_iterate(void **opaque); + +#if FF_API_NEXT +/** + * If c is NULL, returns the first registered codec, + * if c is non-NULL, returns the next registered codec after c, + * or NULL if c is the last one. + */ +attribute_deprecated +AVCodec *av_codec_next(const AVCodec *c); +#endif + +/** + * Return the LIBAVCODEC_VERSION_INT constant. + */ +unsigned avcodec_version(void); + +/** + * Return the libavcodec build-time configuration. + */ +const char *avcodec_configuration(void); + +/** + * Return the libavcodec license. + */ +const char *avcodec_license(void); + +#if FF_API_NEXT +/** + * Register the codec codec and initialize libavcodec. + * + * @warning either this function or avcodec_register_all() must be called + * before any other libavcodec functions. + * + * @see avcodec_register_all() + */ +attribute_deprecated +void avcodec_register(AVCodec *codec); + +/** + * Register all the codecs, parsers and bitstream filters which were enabled at + * configuration time. If you do not call this function you can select exactly + * which formats you want to support, by using the individual registration + * functions. + * + * @see avcodec_register + * @see av_register_codec_parser + * @see av_register_bitstream_filter + */ +attribute_deprecated +void avcodec_register_all(void); +#endif + +/** + * Allocate an AVCodecContext and set its fields to default values. The + * resulting struct should be freed with avcodec_free_context(). + * + * @param codec if non-NULL, allocate private data and initialize defaults + * for the given codec. It is illegal to then call avcodec_open2() + * with a different codec. + * If NULL, then the codec-specific defaults won't be initialized, + * which may result in suboptimal default settings (this is + * important mainly for encoders, e.g. libx264). + * + * @return An AVCodecContext filled with default values or NULL on failure. + */ +AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); + +/** + * Free the codec context and everything associated with it and write NULL to + * the provided pointer. + */ +void avcodec_free_context(AVCodecContext **avctx); + +#if FF_API_GET_CONTEXT_DEFAULTS +/** + * @deprecated This function should not be used, as closing and opening a codec + * context multiple time is not supported. A new codec context should be + * allocated for each new use. + */ +int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec); +#endif + +/** + * Get the AVClass for AVCodecContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_class(void); + +#if FF_API_COPY_CONTEXT +/** + * Get the AVClass for AVFrame. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_frame_class(void); + +/** + * Get the AVClass for AVSubtitleRect. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avcodec_get_subtitle_rect_class(void); + +/** + * Copy the settings of the source AVCodecContext into the destination + * AVCodecContext. The resulting destination codec context will be + * unopened, i.e. you are required to call avcodec_open2() before you + * can use this AVCodecContext to decode/encode video/audio data. + * + * @param dest target codec context, should be initialized with + * avcodec_alloc_context3(NULL), but otherwise uninitialized + * @param src source codec context + * @return AVERROR() on error (e.g. memory allocation error), 0 on success + * + * @deprecated The semantics of this function are ill-defined and it should not + * be used. If you need to transfer the stream parameters from one codec context + * to another, use an intermediate AVCodecParameters instance and the + * avcodec_parameters_from_context() / avcodec_parameters_to_context() + * functions. + */ +attribute_deprecated +int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src); +#endif + +/** + * Allocate a new AVCodecParameters and set its fields to default values + * (unknown/invalid/0). The returned struct must be freed with + * avcodec_parameters_free(). + */ +AVCodecParameters *avcodec_parameters_alloc(void); + +/** + * Free an AVCodecParameters instance and everything associated with it and + * write NULL to the supplied pointer. + */ +void avcodec_parameters_free(AVCodecParameters **par); + +/** + * Copy the contents of src to dst. Any allocated fields in dst are freed and + * replaced with newly allocated duplicates of the corresponding fields in src. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src); + +/** + * Fill the parameters struct based on the values from the supplied codec + * context. Any allocated fields in par are freed and replaced with duplicates + * of the corresponding fields in codec. + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int avcodec_parameters_from_context(AVCodecParameters *par, + const AVCodecContext *codec); + +/** + * Fill the codec context based on the values from the supplied codec + * parameters. Any allocated fields in codec that have a corresponding field in + * par are freed and replaced with duplicates of the corresponding field in par. + * Fields in codec that do not have a counterpart in par are not touched. + * + * @return >= 0 on success, a negative AVERROR code on failure. + */ +int avcodec_parameters_to_context(AVCodecContext *codec, + const AVCodecParameters *par); + +/** + * Initialize the AVCodecContext to use the given AVCodec. Prior to using this + * function the context has to be allocated with avcodec_alloc_context3(). + * + * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), + * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for + * retrieving a codec. + * + * @warning This function is not thread safe! + * + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). + * + * @code + * avcodec_register_all(); + * av_dict_set(&opts, "b", "2.5M", 0); + * codec = avcodec_find_decoder(AV_CODEC_ID_H264); + * if (!codec) + * exit(1); + * + * context = avcodec_alloc_context3(codec); + * + * if (avcodec_open2(context, codec, opts) < 0) + * exit(1); + * @endcode + * + * @param avctx The context to initialize. + * @param codec The codec to open this context for. If a non-NULL codec has been + * previously passed to avcodec_alloc_context3() or + * for this context, then this parameter MUST be either NULL or + * equal to the previously passed codec. + * @param options A dictionary filled with AVCodecContext and codec-private options. + * On return this object will be filled with options that were not found. + * + * @return zero on success, a negative value on error + * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), + * av_dict_set(), av_opt_find(). + */ +int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); + +/** + * Close a given AVCodecContext and free all the data associated with it + * (but not the AVCodecContext itself). + * + * Calling this function on an AVCodecContext that hasn't been opened will free + * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL + * codec. Subsequent calls will do nothing. + * + * @note Do not use this function. Use avcodec_free_context() to destroy a + * codec context (either open or closed). Opening and closing a codec context + * multiple times is not supported anymore -- use multiple codec contexts + * instead. + */ +int avcodec_close(AVCodecContext *avctx); + +/** + * Free all allocated data in the given subtitle struct. + * + * @param sub AVSubtitle to free. + */ +void avsubtitle_free(AVSubtitle *sub); + +/** + * @} + */ + +/** + * @addtogroup lavc_packet + * @{ + */ + +/** + * Allocate an AVPacket and set its fields to default values. The resulting + * struct must be freed using av_packet_free(). + * + * @return An AVPacket filled with default values or NULL on failure. + * + * @note this only allocates the AVPacket itself, not the data buffers. Those + * must be allocated through other means such as av_new_packet. + * + * @see av_new_packet + */ +AVPacket *av_packet_alloc(void); + +/** + * Create a new packet that references the same data as src. + * + * This is a shortcut for av_packet_alloc()+av_packet_ref(). + * + * @return newly created AVPacket on success, NULL on error. + * + * @see av_packet_alloc + * @see av_packet_ref + */ +AVPacket *av_packet_clone(const AVPacket *src); + +/** + * Free the packet, if the packet is reference counted, it will be + * unreferenced first. + * + * @param pkt packet to be freed. The pointer will be set to NULL. + * @note passing NULL is a no-op. + */ +void av_packet_free(AVPacket **pkt); + +/** + * Initialize optional fields of a packet with default values. + * + * Note, this does not touch the data and size members, which have to be + * initialized separately. + * + * @param pkt packet + */ +void av_init_packet(AVPacket *pkt); + +/** + * Allocate the payload of a packet and initialize its fields with + * default values. + * + * @param pkt packet + * @param size wanted payload size + * @return 0 if OK, AVERROR_xxx otherwise + */ +int av_new_packet(AVPacket *pkt, int size); + +/** + * Reduce packet size, correctly zeroing padding + * + * @param pkt packet + * @param size new size + */ +void av_shrink_packet(AVPacket *pkt, int size); + +/** + * Increase packet size, correctly zeroing padding + * + * @param pkt packet + * @param grow_by number of bytes by which to increase the size of the packet + */ +int av_grow_packet(AVPacket *pkt, int grow_by); + +/** + * Initialize a reference-counted packet from av_malloc()ed data. + * + * @param pkt packet to be initialized. This function will set the data, size, + * and buf fields, all others are left untouched. + * @param data Data allocated by av_malloc() to be used as packet data. If this + * function returns successfully, the data is owned by the underlying AVBuffer. + * The caller may not access the data through other means. + * @param size size of data in bytes, without the padding. I.e. the full buffer + * size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size); + +#if FF_API_AVPACKET_OLD_API +/** + * @warning This is a hack - the packet memory allocation stuff is broken. The + * packet is allocated if it was not really allocated. + * + * @deprecated Use av_packet_ref or av_packet_make_refcounted + */ +attribute_deprecated +int av_dup_packet(AVPacket *pkt); +/** + * Copy packet, including contents + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_ref + */ +attribute_deprecated +int av_copy_packet(AVPacket *dst, const AVPacket *src); + +/** + * Copy packet side data + * + * @return 0 on success, negative AVERROR on fail + * + * @deprecated Use av_packet_copy_props + */ +attribute_deprecated +int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src); + +/** + * Free a packet. + * + * @deprecated Use av_packet_unref + * + * @param pkt packet to free + */ +attribute_deprecated +void av_free_packet(AVPacket *pkt); +#endif +/** + * Allocate new information of a packet. + * + * @param pkt packet + * @param type side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Wrap an existing array as a packet side data. + * + * @param pkt packet + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * pkt. + * @param size side information size + * @return a non-negative number on success, a negative AVERROR code on + * failure. On failure, the packet is unchanged and the data remains + * owned by the caller. + */ +int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Shrink the already allocated side data buffer + * + * @param pkt packet + * @param type side information type + * @param size new side information size + * @return 0 on success, < 0 on failure + */ +int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, + int size); + +/** + * Get side information from packet. + * + * @param pkt packet + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, + int *size); + +#if FF_API_MERGE_SD_API +attribute_deprecated +int av_packet_merge_side_data(AVPacket *pkt); + +attribute_deprecated +int av_packet_split_side_data(AVPacket *pkt); +#endif + +const char *av_packet_side_data_name(enum AVPacketSideDataType type); + +/** + * Pack a dictionary for use in side_data. + * + * @param dict The dictionary to pack. + * @param size pointer to store the size of the returned data + * @return pointer to data if successful, NULL otherwise + */ +uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size); +/** + * Unpack a dictionary from side_data. + * + * @param data data from side_data + * @param size size of the data + * @param dict the metadata storage dictionary + * @return 0 on success, < 0 on failure + */ +int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict); + + +/** + * Convenience function to free all the side data stored. + * All the other fields stay untouched. + * + * @param pkt packet + */ +void av_packet_free_side_data(AVPacket *pkt); + +/** + * Setup a new reference to the data described by a given packet + * + * If src is reference-counted, setup dst as a new reference to the + * buffer in src. Otherwise allocate a new buffer in dst and copy the + * data from src into it. + * + * All the other fields are copied from src. + * + * @see av_packet_unref + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_packet_ref(AVPacket *dst, const AVPacket *src); + +/** + * Wipe the packet. + * + * Unreference the buffer referenced by the packet and reset the + * remaining packet fields to their default values. + * + * @param pkt The packet to be unreferenced. + */ +void av_packet_unref(AVPacket *pkt); + +/** + * Move every field in src to dst and reset src. + * + * @see av_packet_unref + * + * @param src Source packet, will be reset + * @param dst Destination packet + */ +void av_packet_move_ref(AVPacket *dst, AVPacket *src); + +/** + * Copy only "properties" fields from src to dst. + * + * Properties for the purpose of this function are all the fields + * beside those related to the packet data (buf, data, size) + * + * @param dst Destination packet + * @param src Source packet + * + * @return 0 on success AVERROR on failure. + */ +int av_packet_copy_props(AVPacket *dst, const AVPacket *src); + +/** + * Ensure the data described by a given packet is reference counted. + * + * @note This function does not ensure that the reference will be writable. + * Use av_packet_make_writable instead for that purpose. + * + * @see av_packet_ref + * @see av_packet_make_writable + * + * @param pkt packet whose data should be made reference counted. + * + * @return 0 on success, a negative AVERROR on error. On failure, the + * packet is unchanged. + */ +int av_packet_make_refcounted(AVPacket *pkt); + +/** + * Create a writable reference for the data described by a given packet, + * avoiding data copy if possible. + * + * @param pkt Packet whose data should be made writable. + * + * @return 0 on success, a negative AVERROR on failure. On failure, the + * packet is unchanged. + */ +int av_packet_make_writable(AVPacket *pkt); + +/** + * Convert valid timing fields (timestamps / durations) in a packet from one + * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be + * ignored. + * + * @param pkt packet on which the conversion will be performed + * @param tb_src source timebase, in which the timing fields in pkt are + * expressed + * @param tb_dst destination timebase, to which the timing fields will be + * converted + */ +void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); + +/** + * @} + */ + +/** + * @addtogroup lavc_decoding + * @{ + */ + +/** + * Find a registered decoder with a matching codec ID. + * + * @param id AVCodecID of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder(enum AVCodecID id); + +/** + * Find a registered decoder with the specified name. + * + * @param name name of the requested decoder + * @return A decoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_decoder_by_name(const char *name); + +/** + * The default callback for AVCodecContext.get_buffer2(). It is made public so + * it can be called by custom get_buffer2() implementations for decoders without + * AV_CODEC_CAP_DR1 set. + */ +int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you do not use any horizontal + * padding. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height); + +/** + * Modify width and height values so that they will result in a memory + * buffer that is acceptable for the codec if you also ensure that all + * line sizes are a multiple of the respective linesize_align[i]. + * + * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened. + */ +void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, + int linesize_align[AV_NUM_DATA_POINTERS]); + +/** + * Converts AVChromaLocation to swscale x/y chroma position. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos); + +/** + * Converts swscale x/y chroma position to AVChromaLocation. + * + * The positions represent the chroma (0,0) position in a coordinates system + * with luma (0,0) representing the origin and luma(1,1) representing 256,256 + * + * @param xpos horizontal chroma sample position + * @param ypos vertical chroma sample position + */ +enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos); + +/** + * Decode the audio frame of size avpkt->size from avpkt->data into frame. + * + * Some decoders may support multiple frames in a single AVPacket. Such + * decoders would then just decode the first frame and the return value would be + * less than the packet size. In this case, avcodec_decode_audio4 has to be + * called again with an AVPacket containing the remaining data in order to + * decode the second frame, etc... Even if no frames are returned, the packet + * needs to be fed to the decoder with remaining data until it is completely + * consumed or an error occurs. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning samples. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no samples will be returned. + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] frame The AVFrame in which to store decoded audio samples. + * The decoder will allocate a buffer for the decoded frame by + * calling the AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is + * non-zero. Note that this field being set to zero + * does not mean that an error has occurred. For + * decoders with AV_CODEC_CAP_DELAY set, no given decode + * call is guaranteed to produce a frame. + * @param[in] avpkt The input AVPacket containing the input buffer. + * At least avpkt->data and avpkt->size should be set. Some + * decoders might also require additional fields to be set. + * @return A negative error code is returned if an error occurred during + * decoding, otherwise the number of bytes consumed from the input + * AVPacket is returned. + * +* @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, + int *got_frame_ptr, const AVPacket *avpkt); + +/** + * Decode the video frame of size avpkt->size from avpkt->data into picture. + * Some decoders may support multiple frames in a single AVPacket, such + * decoders would then just decode the first frame. + * + * @warning The input buffer must be AV_INPUT_BUFFER_PADDING_SIZE larger than + * the actual read bytes because some optimized bitstream readers read 32 or 64 + * bits at once and could read over the end. + * + * @warning The end of the input buffer buf should be set to 0 to ensure that + * no overreading happens for damaged MPEG streams. + * + * @note Codecs which have the AV_CODEC_CAP_DELAY capability set have a delay + * between input and output, these need to be fed with avpkt->data=NULL, + * avpkt->size=0 at the end to return the remaining frames. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] picture The AVFrame in which the decoded video frame will be stored. + * Use av_frame_alloc() to get an AVFrame. The codec will + * allocate memory for the actual bitmap by calling the + * AVCodecContext.get_buffer2() callback. + * When AVCodecContext.refcounted_frames is set to 1, the frame is + * reference counted and the returned reference belongs to the + * caller. The caller must release the frame using av_frame_unref() + * when the frame is no longer needed. The caller may safely write + * to the frame if av_frame_is_writable() returns 1. + * When AVCodecContext.refcounted_frames is set to 0, the returned + * reference belongs to the decoder and is valid only until the + * next call to this function or until closing or flushing the + * decoder. The caller may not write to it. + * + * @param[in] avpkt The input AVPacket containing the input buffer. + * You can create such packet with av_init_packet() and by then setting + * data and size, some decoders might in addition need other fields like + * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least + * fields possible. + * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero. + * @return On error a negative value is returned, otherwise the number of bytes + * used or zero if no frame could be decompressed. + * + * @deprecated Use avcodec_send_packet() and avcodec_receive_frame(). + */ +attribute_deprecated +int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, + int *got_picture_ptr, + const AVPacket *avpkt); + +/** + * Decode a subtitle message. + * Return a negative value on error, otherwise return the number of bytes used. + * If no subtitle could be decompressed, got_sub_ptr is zero. + * Otherwise, the subtitle is stored in *sub. + * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for + * simplicity, because the performance difference is expect to be negligible + * and reusing a get_buffer written for video codecs would probably perform badly + * due to a potentially very different allocation pattern. + * + * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input + * and output. This means that for some packets they will not immediately + * produce decoded output and need to be flushed at the end of decoding to get + * all the decoded data. Flushing is done by calling this function with packets + * with avpkt->data set to NULL and avpkt->size set to 0 until it stops + * returning subtitles. It is safe to flush even those decoders that are not + * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx the codec context + * @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored, + * must be freed with avsubtitle_free if *got_sub_ptr is set. + * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero. + * @param[in] avpkt The input AVPacket containing the input buffer. + */ +int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, + int *got_sub_ptr, + AVPacket *avpkt); + +/** + * Supply raw packet data as input to a decoder. + * + * Internally, this call will copy relevant AVCodecContext fields, which can + * influence decoding per-packet, and apply them when the packet is actually + * decoded. (For example AVCodecContext.skip_frame, which might direct the + * decoder to drop the frame contained by the packet sent with this function.) + * + * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE + * larger than the actual read bytes because some optimized bitstream + * readers read 32 or 64 bits at once and could read over the end. + * + * @warning Do not mix this API with the legacy API (like avcodec_decode_video2()) + * on the same AVCodecContext. It will return unexpected results now + * or in future libavcodec versions. + * + * @note The AVCodecContext MUST have been opened with @ref avcodec_open2() + * before packets may be fed to the decoder. + * + * @param avctx codec context + * @param[in] avpkt The input AVPacket. Usually, this will be a single video + * frame, or several complete audio frames. + * Ownership of the packet remains with the caller, and the + * decoder will not write to the packet. The decoder may create + * a reference to the packet data (or copy it if the packet is + * not reference-counted). + * Unlike with older APIs, the packet is always fully consumed, + * and if it contains multiple frames (e.g. some audio codecs), + * will require you to call avcodec_receive_frame() multiple + * times afterwards before you can send a new packet. + * It can be NULL (or an AVPacket with data set to NULL and + * size set to 0); in this case, it is considered a flush + * packet, which signals the end of the stream. Sending the + * first flush packet will return success. Subsequent ones are + * unnecessary and will return AVERROR_EOF. If the decoder + * still has frames buffered, it will return them after sending + * a flush packet. + * + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_frame() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the decoder has been flushed, and no new packets can + * be sent to it (also returned if more than 1 flush + * packet is sent) + * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); + +/** + * Return decoded output data from a decoder. + * + * @param avctx codec context + * @param frame This will be set to a reference-counted video or audio + * frame (depending on the decoder type) allocated by the + * decoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * + * @return + * 0: success, a frame was returned + * AVERROR(EAGAIN): output is not available in this state - user must try + * to send new input + * AVERROR_EOF: the decoder has been fully flushed, and there will be + * no more output frames + * AVERROR(EINVAL): codec not opened, or it is an encoder + * AVERROR_INPUT_CHANGED: current decoded frame has changed parameters + * with respect to first decoded frame. Applicable + * when flag AV_CODEC_FLAG_DROPCHANGED is set. + * other negative values: legitimate decoding errors + */ +int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); + +/** + * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet() + * to retrieve buffered output packets. + * + * @param avctx codec context + * @param[in] frame AVFrame containing the raw audio or video frame to be encoded. + * Ownership of the frame remains with the caller, and the + * encoder will not write to the frame. The encoder may create + * a reference to the frame data (or copy it if the frame is + * not reference-counted). + * It can be NULL, in which case it is considered a flush + * packet. This signals the end of the stream. If the encoder + * still has packets buffered, it will return them after this + * call. Once flushing mode has been entered, additional flush + * packets are ignored, and sending frames will return + * AVERROR_EOF. + * + * For audio: + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): input is not accepted in the current state - user + * must read output with avcodec_receive_packet() (once + * all output is read, the packet should be resent, and + * the call will not fail with EAGAIN). + * AVERROR_EOF: the encoder has been flushed, and no new frames can + * be sent to it + * AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a + * decoder, or requires flush + * AVERROR(ENOMEM): failed to add packet to internal queue, or similar + * other errors: legitimate decoding errors + */ +int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); + +/** + * Read encoded data from the encoder. + * + * @param avctx codec context + * @param avpkt This will be set to a reference-counted packet allocated by the + * encoder. Note that the function will always call + * av_frame_unref(frame) before doing anything else. + * @return 0 on success, otherwise negative error code: + * AVERROR(EAGAIN): output is not available in the current state - user + * must try to send input + * AVERROR_EOF: the encoder has been fully flushed, and there will be + * no more output packets + * AVERROR(EINVAL): codec not opened, or it is an encoder + * other errors: legitimate decoding errors + */ +int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt); + +/** + * Create and return a AVHWFramesContext with values adequate for hardware + * decoding. This is meant to get called from the get_format callback, and is + * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx. + * This API is for decoding with certain hardware acceleration modes/APIs only. + * + * The returned AVHWFramesContext is not initialized. The caller must do this + * with av_hwframe_ctx_init(). + * + * Calling this function is not a requirement, but makes it simpler to avoid + * codec or hardware API specific details when manually allocating frames. + * + * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx, + * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes + * it unnecessary to call this function or having to care about + * AVHWFramesContext initialization at all. + * + * There are a number of requirements for calling this function: + * + * - It must be called from get_format with the same avctx parameter that was + * passed to get_format. Calling it outside of get_format is not allowed, and + * can trigger undefined behavior. + * - The function is not always supported (see description of return values). + * Even if this function returns successfully, hwaccel initialization could + * fail later. (The degree to which implementations check whether the stream + * is actually supported varies. Some do this check only after the user's + * get_format callback returns.) + * - The hw_pix_fmt must be one of the choices suggested by get_format. If the + * user decides to use a AVHWFramesContext prepared with this API function, + * the user must return the same hw_pix_fmt from get_format. + * - The device_ref passed to this function must support the given hw_pix_fmt. + * - After calling this API function, it is the user's responsibility to + * initialize the AVHWFramesContext (returned by the out_frames_ref parameter), + * and to set AVCodecContext.hw_frames_ctx to it. If done, this must be done + * before returning from get_format (this is implied by the normal + * AVCodecContext.hw_frames_ctx API rules). + * - The AVHWFramesContext parameters may change every time time get_format is + * called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So + * you are inherently required to go through this process again on every + * get_format call. + * - It is perfectly possible to call this function without actually using + * the resulting AVHWFramesContext. One use-case might be trying to reuse a + * previously initialized AVHWFramesContext, and calling this API function + * only to test whether the required frame parameters have changed. + * - Fields that use dynamically allocated values of any kind must not be set + * by the user unless setting them is explicitly allowed by the documentation. + * If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque, + * the new free callback must call the potentially set previous free callback. + * This API call may set any dynamically allocated fields, including the free + * callback. + * + * The function will set at least the following fields on AVHWFramesContext + * (potentially more, depending on hwaccel API): + * + * - All fields set by av_hwframe_ctx_alloc(). + * - Set the format field to hw_pix_fmt. + * - Set the sw_format field to the most suited and most versatile format. (An + * implication is that this will prefer generic formats over opaque formats + * with arbitrary restrictions, if possible.) + * - Set the width/height fields to the coded frame size, rounded up to the + * API-specific minimum alignment. + * - Only _if_ the hwaccel requires a pre-allocated pool: set the initial_pool_size + * field to the number of maximum reference surfaces possible with the codec, + * plus 1 surface for the user to work (meaning the user can safely reference + * at most 1 decoded surface at a time), plus additional buffering introduced + * by frame threading. If the hwaccel does not require pre-allocation, the + * field is left to 0, and the decoder will allocate new surfaces on demand + * during decoding. + * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying + * hardware API. + * + * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but + * with basic frame parameters set. + * + * The function is stateless, and does not change the AVCodecContext or the + * device_ref AVHWDeviceContext. + * + * @param avctx The context which is currently calling get_format, and which + * implicitly contains all state needed for filling the returned + * AVHWFramesContext properly. + * @param device_ref A reference to the AVHWDeviceContext describing the device + * which will be used by the hardware decoder. + * @param hw_pix_fmt The hwaccel format you are going to return from get_format. + * @param out_frames_ref On success, set to a reference to an _uninitialized_ + * AVHWFramesContext, created from the given device_ref. + * Fields will be set to values required for decoding. + * Not changed if an error is returned. + * @return zero on success, a negative value on error. The following error codes + * have special semantics: + * AVERROR(ENOENT): the decoder does not support this functionality. Setup + * is always manual, or it is a decoder which does not + * support setting AVCodecContext.hw_frames_ctx at all, + * or it is a software format. + * AVERROR(EINVAL): it is known that hardware decoding is not supported for + * this configuration, or the device_ref is not supported + * for the hwaccel referenced by hw_pix_fmt. + */ +int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, + AVBufferRef *device_ref, + enum AVPixelFormat hw_pix_fmt, + AVBufferRef **out_frames_ref); + + + +/** + * @defgroup lavc_parsing Frame parsing + * @{ + */ + +enum AVPictureStructure { + AV_PICTURE_STRUCTURE_UNKNOWN, //< unknown + AV_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field + AV_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field + AV_PICTURE_STRUCTURE_FRAME, //< coded as frame +}; + +typedef struct AVCodecParserContext { + void *priv_data; + struct AVCodecParser *parser; + int64_t frame_offset; /* offset of the current frame */ + int64_t cur_offset; /* current offset + (incremented by each av_parser_parse()) */ + int64_t next_frame_offset; /* offset of the next frame */ + /* video info */ + int pict_type; /* XXX: Put it back in AVCodecContext. */ + /** + * This field is used for proper frame duration computation in lavf. + * It signals, how much longer the frame duration of the current frame + * is compared to normal frame duration. + * + * frame_duration = (1 + repeat_pict) * time_base + * + * It is used by codecs like H.264 to display telecined material. + */ + int repeat_pict; /* XXX: Put it back in AVCodecContext. */ + int64_t pts; /* pts of the current frame */ + int64_t dts; /* dts of the current frame */ + + /* private data */ + int64_t last_pts; + int64_t last_dts; + int fetch_timestamp; + +#define AV_PARSER_PTS_NB 4 + int cur_frame_start_index; + int64_t cur_frame_offset[AV_PARSER_PTS_NB]; + int64_t cur_frame_pts[AV_PARSER_PTS_NB]; + int64_t cur_frame_dts[AV_PARSER_PTS_NB]; + + int flags; +#define PARSER_FLAG_COMPLETE_FRAMES 0x0001 +#define PARSER_FLAG_ONCE 0x0002 +/// Set if the parser has a valid file offset +#define PARSER_FLAG_FETCHED_OFFSET 0x0004 +#define PARSER_FLAG_USE_CODEC_TS 0x1000 + + int64_t offset; ///< byte offset from starting packet start + int64_t cur_frame_end[AV_PARSER_PTS_NB]; + + /** + * Set by parser to 1 for key frames and 0 for non-key frames. + * It is initialized to -1, so if the parser doesn't set this flag, + * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames + * will be used. + */ + int key_frame; + +#if FF_API_CONVERGENCE_DURATION + /** + * @deprecated unused + */ + attribute_deprecated + int64_t convergence_duration; +#endif + + // Timestamp generation support: + /** + * Synchronization point for start of timestamp generation. + * + * Set to >0 for sync point, 0 for no sync point and <0 for undefined + * (default). + * + * For example, this corresponds to presence of H.264 buffering period + * SEI message. + */ + int dts_sync_point; + + /** + * Offset of the current timestamp against last timestamp sync point in + * units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain a valid timestamp offset. + * + * Note that the timestamp of sync point has usually a nonzero + * dts_ref_dts_delta, which refers to the previous sync point. Offset of + * the next frame after timestamp sync point will be usually 1. + * + * For example, this corresponds to H.264 cpb_removal_delay. + */ + int dts_ref_dts_delta; + + /** + * Presentation delay of current frame in units of AVCodecContext.time_base. + * + * Set to INT_MIN when dts_sync_point unused. Otherwise, it must + * contain valid non-negative timestamp delta (presentation time of a frame + * must not lie in the past). + * + * This delay represents the difference between decoding and presentation + * time of the frame. + * + * For example, this corresponds to H.264 dpb_output_delay. + */ + int pts_dts_delta; + + /** + * Position of the packet in file. + * + * Analogous to cur_frame_pts/dts + */ + int64_t cur_frame_pos[AV_PARSER_PTS_NB]; + + /** + * Byte position of currently parsed frame in stream. + */ + int64_t pos; + + /** + * Previous frame byte position. + */ + int64_t last_pos; + + /** + * Duration of the current frame. + * For audio, this is in units of 1 / AVCodecContext.sample_rate. + * For all other types, this is in units of AVCodecContext.time_base. + */ + int duration; + + enum AVFieldOrder field_order; + + /** + * Indicate whether a picture is coded as a frame, top field or bottom field. + * + * For example, H.264 field_pic_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag + * equal to 1 and bottom_field_flag equal to 0 corresponds to + * AV_PICTURE_STRUCTURE_TOP_FIELD. + */ + enum AVPictureStructure picture_structure; + + /** + * Picture number incremented in presentation or output order. + * This field may be reinitialized at the first picture of a new sequence. + * + * For example, this corresponds to H.264 PicOrderCnt. + */ + int output_picture_number; + + /** + * Dimensions of the decoded video intended for presentation. + */ + int width; + int height; + + /** + * Dimensions of the coded video. + */ + int coded_width; + int coded_height; + + /** + * The format of the coded data, corresponds to enum AVPixelFormat for video + * and for enum AVSampleFormat for audio. + * + * Note that a decoder can have considerable freedom in how exactly it + * decodes the data, so the format reported here might be different from the + * one returned by a decoder. + */ + int format; +} AVCodecParserContext; + +typedef struct AVCodecParser { + int codec_ids[5]; /* several codec IDs are permitted */ + int priv_data_size; + int (*parser_init)(AVCodecParserContext *s); + /* This callback never returns an error, a negative value means that + * the frame start was in a previous packet. */ + int (*parser_parse)(AVCodecParserContext *s, + AVCodecContext *avctx, + const uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size); + void (*parser_close)(AVCodecParserContext *s); + int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); + struct AVCodecParser *next; +} AVCodecParser; + +/** + * Iterate over all registered codec parsers. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered codec parser or NULL when the iteration is + * finished + */ +const AVCodecParser *av_parser_iterate(void **opaque); + +attribute_deprecated +AVCodecParser *av_parser_next(const AVCodecParser *c); + +attribute_deprecated +void av_register_codec_parser(AVCodecParser *parser); +AVCodecParserContext *av_parser_init(int codec_id); + +/** + * Parse a packet. + * + * @param s parser context. + * @param avctx codec context. + * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished. + * @param poutbuf_size set to size of parsed buffer or zero if not yet finished. + * @param buf input buffer. + * @param buf_size buffer size in bytes without the padding. I.e. the full buffer + size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. + To signal EOF, this should be 0 (so that the last frame + can be output). + * @param pts input presentation timestamp. + * @param dts input decoding timestamp. + * @param pos input byte position in stream. + * @return the number of bytes of the input bitstream used. + * + * Example: + * @code + * while(in_len){ + * len = av_parser_parse2(myparser, AVCodecContext, &data, &size, + * in_data, in_len, + * pts, dts, pos); + * in_data += len; + * in_len -= len; + * + * if(size) + * decode_frame(data, size); + * } + * @endcode + */ +int av_parser_parse2(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts, + int64_t pos); + +/** + * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed + * @deprecated use AVBitStreamFilter + */ +int av_parser_change(AVCodecParserContext *s, + AVCodecContext *avctx, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +void av_parser_close(AVCodecParserContext *s); + +/** + * @} + * @} + */ + +/** + * @addtogroup lavc_encoding + * @{ + */ + +/** + * Find a registered encoder with a matching codec ID. + * + * @param id AVCodecID of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder(enum AVCodecID id); + +/** + * Find a registered encoder with the specified name. + * + * @param name name of the requested encoder + * @return An encoder if one was found, NULL otherwise. + */ +AVCodec *avcodec_find_encoder_by_name(const char *name); + +/** + * Encode a frame of audio. + * + * Takes input samples from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay, split, and combine input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. If avpkt->data and + * avpkt->size are set, avpkt->destruct must also be set. All + * other AVPacket fields will be reset by the encoder using + * av_init_packet(). If avpkt->data is NULL, the encoder will + * allocate it. The encoder will set avpkt->size to the size + * of the output packet. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw audio data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame + * can have any number of samples. + * If it is not set, frame->nb_samples must be equal to + * avctx->frame_size for all frames except the last. + * The final frame may be smaller than avctx->frame_size. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +/** + * Encode a frame of video. + * + * Takes input raw video data from frame and writes the next output packet, if + * available, to avpkt. The output packet does not necessarily contain data for + * the most recent frame, as encoders can delay and reorder input frames + * internally as needed. + * + * @param avctx codec context + * @param avpkt output AVPacket. + * The user can supply an output buffer by setting + * avpkt->data and avpkt->size prior to calling the + * function, but if the size of the user-provided data is not + * large enough, encoding will fail. All other AVPacket fields + * will be reset by the encoder using av_init_packet(). If + * avpkt->data is NULL, the encoder will allocate it. + * The encoder will set avpkt->size to the size of the + * output packet. The returned data (if any) belongs to the + * caller, he is responsible for freeing it. + * + * If this function fails or produces no output, avpkt will be + * freed using av_packet_unref(). + * @param[in] frame AVFrame containing the raw video data to be encoded. + * May be NULL when flushing an encoder that has the + * AV_CODEC_CAP_DELAY capability set. + * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the + * output packet is non-empty, and to 0 if it is + * empty. If the function returns an error, the + * packet can be assumed to be invalid, and the + * value of got_packet_ptr is undefined and should + * not be used. + * @return 0 on success, negative error code on failure + * + * @deprecated use avcodec_send_frame()/avcodec_receive_packet() instead + */ +attribute_deprecated +int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr); + +int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, + const AVSubtitle *sub); + + +/** + * @} + */ + +#if FF_API_AVPICTURE +/** + * @addtogroup lavc_picture + * @{ + */ + +/** + * @deprecated unused + */ +attribute_deprecated +int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +void avpicture_free(AVPicture *picture); + +/** + * @deprecated use av_image_fill_arrays() instead. + */ +attribute_deprecated +int avpicture_fill(AVPicture *picture, const uint8_t *ptr, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated use av_image_copy_to_buffer() instead. + */ +attribute_deprecated +int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt, + int width, int height, + unsigned char *dest, int dest_size); + +/** + * @deprecated use av_image_get_buffer_size() instead. + */ +attribute_deprecated +int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated av_image_copy() instead. + */ +attribute_deprecated +void av_picture_copy(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_crop(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int top_band, int left_band); + +/** + * @deprecated unused + */ +attribute_deprecated +int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt, + int padtop, int padbottom, int padleft, int padright, int *color); + +/** + * @} + */ +#endif + +/** + * @defgroup lavc_misc Utility functions + * @ingroup libavc + * + * Miscellaneous utility functions related to both encoding and decoding + * (or neither). + * @{ + */ + +/** + * @defgroup lavc_misc_pixfmt Pixel formats + * + * Functions for working with pixel formats. + * @{ + */ + +#if FF_API_GETCHROMA +/** + * @deprecated Use av_pix_fmt_get_chroma_sub_sample + */ + +attribute_deprecated +void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift); +#endif + +/** + * Return a value representing the fourCC code associated to the + * pixel format pix_fmt, or 0 if no associated fourCC code can be + * found. + */ +unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt); + +/** + * @deprecated see av_get_pix_fmt_loss() + */ +int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Find the best pixel format to convert to given a certain source pixel + * format. When converting from one pixel format to another, information loss + * may occur. For example, when converting from RGB24 to GRAY, the color + * information will be lost. Similarly, other losses occur when converting from + * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of + * the given pixel formats should be used to suffer the least amount of loss. + * The pixel formats from which it chooses one, are determined by the + * pix_fmt_list parameter. + * + * + * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur. + * @return The best pixel format to convert to or -1 if none was found. + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list, + enum AVPixelFormat src_pix_fmt, + int has_alpha, int *loss_ptr); + +/** + * @deprecated see av_find_best_pix_fmt_of_2() + */ +enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +attribute_deprecated +enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt); + +/** + * @} + */ + +#if FF_API_TAG_STRING +/** + * Put a string representing the codec tag codec_tag in buf. + * + * @param buf buffer to place codec tag in + * @param buf_size size in bytes of buf + * @param codec_tag codec tag to assign + * @return the length of the string that would have been generated if + * enough space had been available, excluding the trailing null + * + * @deprecated see av_fourcc_make_string() and av_fourcc2str(). + */ +attribute_deprecated +size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag); +#endif + +void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode); + +/** + * Return a name for the specified profile, if available. + * + * @param codec the codec that is searched for the given profile + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + */ +const char *av_get_profile_name(const AVCodec *codec, int profile); + +/** + * Return a name for the specified profile, if available. + * + * @param codec_id the ID of the codec to which the requested profile belongs + * @param profile the profile value for which a name is requested + * @return A name for the profile if found, NULL otherwise. + * + * @note unlike av_get_profile_name(), which searches a list of profiles + * supported by a specific decoder or encoder implementation, this + * function searches the list of profiles from the AVCodecDescriptor + */ +const char *avcodec_profile_name(enum AVCodecID codec_id, int profile); + +int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); +int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); +//FIXME func typedef + +/** + * Fill AVFrame audio data and linesize pointers. + * + * The buffer buf must be a preallocated buffer with a size big enough + * to contain the specified samples amount. The filled AVFrame data + * pointers will point to this buffer. + * + * AVFrame extended_data channel pointers are allocated if necessary for + * planar audio. + * + * @param frame the AVFrame + * frame->nb_samples must be set prior to calling the + * function. This function fills in frame->data, + * frame->extended_data, frame->linesize[0]. + * @param nb_channels channel count + * @param sample_fmt sample format + * @param buf buffer to use for frame data + * @param buf_size size of buffer + * @param align plane size sample alignment (0 = default) + * @return >=0 on success, negative error code on failure + * @todo return the size in bytes required to store the samples in + * case of success, at the next libavutil bump + */ +int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, + enum AVSampleFormat sample_fmt, const uint8_t *buf, + int buf_size, int align); + +/** + * Reset the internal decoder state / flush internal buffers. Should be called + * e.g. when seeking or when switching to a different stream. + * + * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0), + * this invalidates the frames previously returned from the decoder. When + * refcounted frames are used, the decoder just releases any references it might + * keep internally, but the caller's reference remains valid. + */ +void avcodec_flush_buffers(AVCodecContext *avctx); + +/** + * Return codec bits per sample. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return the PCM codec associated with a sample format. + * @param be endianness, 0 for little, 1 for big, + * -1 (or anything else) for native + * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE + */ +enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be); + +/** + * Return codec bits per sample. + * Only return non-zero if the bits per sample is exactly correct, not an + * approximation. + * + * @param[in] codec_id the codec + * @return Number of bits per sample or zero if unknown for the given codec. + */ +int av_get_exact_bits_per_sample(enum AVCodecID codec_id); + +/** + * Return audio frame duration. + * + * @param avctx codec context + * @param frame_bytes size of the frame, or 0 if unknown + * @return frame duration, in samples, if known. 0 if not able to + * determine. + */ +int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes); + +/** + * This function is the same as av_get_audio_frame_duration(), except it works + * with AVCodecParameters instead of an AVCodecContext. + */ +int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes); + +#if FF_API_OLD_BSF +typedef struct AVBitStreamFilterContext { + void *priv_data; + const struct AVBitStreamFilter *filter; + AVCodecParserContext *parser; + struct AVBitStreamFilterContext *next; + /** + * Internal default arguments, used if NULL is passed to av_bitstream_filter_filter(). + * Not for access by library users. + */ + char *args; +} AVBitStreamFilterContext; +#endif + +typedef struct AVBSFInternal AVBSFInternal; + +/** + * The bitstream filter state. + * + * This struct must be allocated with av_bsf_alloc() and freed with + * av_bsf_free(). + * + * The fields in the struct will only be changed (by the caller or by the + * filter) as described in their documentation, and are to be considered + * immutable otherwise. + */ +typedef struct AVBSFContext { + /** + * A class for logging and AVOptions + */ + const AVClass *av_class; + + /** + * The bitstream filter this context is an instance of. + */ + const struct AVBitStreamFilter *filter; + + /** + * Opaque libavcodec internal data. Must not be touched by the caller in any + * way. + */ + AVBSFInternal *internal; + + /** + * Opaque filter-specific private data. If filter->priv_class is non-NULL, + * this is an AVOptions-enabled struct. + */ + void *priv_data; + + /** + * Parameters of the input stream. This field is allocated in + * av_bsf_alloc(), it needs to be filled by the caller before + * av_bsf_init(). + */ + AVCodecParameters *par_in; + + /** + * Parameters of the output stream. This field is allocated in + * av_bsf_alloc(), it is set by the filter in av_bsf_init(). + */ + AVCodecParameters *par_out; + + /** + * The timebase used for the timestamps of the input packets. Set by the + * caller before av_bsf_init(). + */ + AVRational time_base_in; + + /** + * The timebase used for the timestamps of the output packets. Set by the + * filter in av_bsf_init(). + */ + AVRational time_base_out; +} AVBSFContext; + +typedef struct AVBitStreamFilter { + const char *name; + + /** + * A list of codec ids supported by the filter, terminated by + * AV_CODEC_ID_NONE. + * May be NULL, in that case the bitstream filter works with any codec id. + */ + const enum AVCodecID *codec_ids; + + /** + * A class for the private data, used to declare bitstream filter private + * AVOptions. This field is NULL for bitstream filters that do not declare + * any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavcodec generic + * code to this class. + */ + const AVClass *priv_class; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavcodec and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + int priv_data_size; + int (*init)(AVBSFContext *ctx); + int (*filter)(AVBSFContext *ctx, AVPacket *pkt); + void (*close)(AVBSFContext *ctx); + void (*flush)(AVBSFContext *ctx); +} AVBitStreamFilter; + +#if FF_API_OLD_BSF +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use the new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +void av_register_bitstream_filter(AVBitStreamFilter *bsf); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_get_by_name(), av_bsf_alloc(), and av_bsf_init() + * from the new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +AVBitStreamFilterContext *av_bitstream_filter_init(const char *name); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_send_packet() and av_bsf_receive_packet() from the + * new bitstream filtering API (using AVBSFContext). + */ +attribute_deprecated +int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, + AVCodecContext *avctx, const char *args, + uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, int keyframe); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_free() from the new bitstream filtering API (using + * AVBSFContext). + */ +attribute_deprecated +void av_bitstream_filter_close(AVBitStreamFilterContext *bsf); +/** + * @deprecated the old bitstream filtering API (using AVBitStreamFilterContext) + * is deprecated. Use av_bsf_iterate() from the new bitstream filtering API (using + * AVBSFContext). + */ +attribute_deprecated +const AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f); +#endif + +/** + * @return a bitstream filter with the specified name or NULL if no such + * bitstream filter exists. + */ +const AVBitStreamFilter *av_bsf_get_by_name(const char *name); + +/** + * Iterate over all registered bitstream filters. + * + * @param opaque a pointer where libavcodec will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered bitstream filter or NULL when the iteration is + * finished + */ +const AVBitStreamFilter *av_bsf_iterate(void **opaque); +#if FF_API_NEXT +attribute_deprecated +const AVBitStreamFilter *av_bsf_next(void **opaque); +#endif + +/** + * Allocate a context for a given bitstream filter. The caller must fill in the + * context parameters as described in the documentation and then call + * av_bsf_init() before sending any data to the filter. + * + * @param filter the filter for which to allocate an instance. + * @param ctx a pointer into which the pointer to the newly-allocated context + * will be written. It must be freed with av_bsf_free() after the + * filtering is done. + * + * @return 0 on success, a negative AVERROR code on failure + */ +int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx); + +/** + * Prepare the filter for use, after all the parameters and options have been + * set. + */ +int av_bsf_init(AVBSFContext *ctx); + +/** + * Submit a packet for filtering. + * + * After sending each packet, the filter must be completely drained by calling + * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or + * AVERROR_EOF. + * + * @param pkt the packet to filter. The bitstream filter will take ownership of + * the packet and reset the contents of pkt. pkt is not touched if an error occurs. + * This parameter may be NULL, which signals the end of the stream (i.e. no more + * packets will be sent). That will cause the filter to output any packets it + * may have buffered internally. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Retrieve a filtered packet. + * + * @param[out] pkt this struct will be filled with the contents of the filtered + * packet. It is owned by the caller and must be freed using + * av_packet_unref() when it is no longer needed. + * This parameter should be "clean" (i.e. freshly allocated + * with av_packet_alloc() or unreffed with av_packet_unref()) + * when this function is called. If this function returns + * successfully, the contents of pkt will be completely + * overwritten by the returned data. On failure, pkt is not + * touched. + * + * @return 0 on success. AVERROR(EAGAIN) if more packets need to be sent to the + * filter (using av_bsf_send_packet()) to get more output. AVERROR_EOF if there + * will be no further output from the filter. Another negative AVERROR value if + * an error occurs. + * + * @note one input packet may result in several output packets, so after sending + * a packet with av_bsf_send_packet(), this function needs to be called + * repeatedly until it stops returning 0. It is also possible for a filter to + * output fewer packets than were sent to it, so this function may return + * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call. + */ +int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); + +/** + * Reset the internal bitstream filter state / flush internal buffers. + */ +void av_bsf_flush(AVBSFContext *ctx); + +/** + * Free a bitstream filter context and everything associated with it; write NULL + * into the supplied pointer. + */ +void av_bsf_free(AVBSFContext **ctx); + +/** + * Get the AVClass for AVBSFContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *av_bsf_get_class(void); + +/** + * Structure for chain/list of bitstream filters. + * Empty list can be allocated by av_bsf_list_alloc(). + */ +typedef struct AVBSFList AVBSFList; + +/** + * Allocate empty list of bitstream filters. + * The list must be later freed by av_bsf_list_free() + * or finalized by av_bsf_list_finalize(). + * + * @return Pointer to @ref AVBSFList on success, NULL in case of failure + */ +AVBSFList *av_bsf_list_alloc(void); + +/** + * Free list of bitstream filters. + * + * @param lst Pointer to pointer returned by av_bsf_list_alloc() + */ +void av_bsf_list_free(AVBSFList **lst); + +/** + * Append bitstream filter to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf Filter context to be appended + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf); + +/** + * Construct new bitstream filter context given it's name and options + * and append it to the list of bitstream filters. + * + * @param lst List to append to + * @param bsf_name Name of the bitstream filter + * @param options Options for the bitstream filter, can be set to NULL + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options); +/** + * Finalize list of bitstream filters. + * + * This function will transform @ref AVBSFList to single @ref AVBSFContext, + * so the whole chain of bitstream filters can be treated as single filter + * freshly allocated by av_bsf_alloc(). + * If the call is successful, @ref AVBSFList structure is freed and lst + * will be set to NULL. In case of failure, caller is responsible for + * freeing the structure by av_bsf_list_free() + * + * @param lst Filter list structure to be transformed + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf); + +/** + * Parse string describing list of bitstream filters and create single + * @ref AVBSFContext describing the whole chain of bitstream filters. + * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly + * allocated by av_bsf_alloc(). + * + * @param str String describing chain of bitstream filters in format + * `bsf1[=opt1=val1:opt2=val2][,bsf2]` + * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure + * representing the chain of bitstream filters + * + * @return >=0 on success, negative AVERROR in case of failure + */ +int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf); + +/** + * Get null/pass-through bitstream filter. + * + * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter + * + * @return + */ +int av_bsf_get_null_filter(AVBSFContext **bsf); + +/* memory */ + +/** + * Same behaviour av_fast_malloc but the buffer has additional + * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0. + * + * In addition the whole buffer will initially and after resizes + * be 0-initialized so that no uninitialized data will ever appear. + */ +void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Same behaviour av_fast_padded_malloc except that buffer will always + * be 0-initialized after call. + */ +void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Encode extradata length to a buffer. Used by xiph codecs. + * + * @param s buffer to write to; must be at least (v/255+1) bytes long + * @param v size of extradata in bytes + * @return number of bytes written to the buffer. + */ +unsigned int av_xiphlacing(unsigned char *s, unsigned int v); + +#if FF_API_USER_VISIBLE_AVHWACCEL +/** + * Register the hardware accelerator hwaccel. + * + * @deprecated This function doesn't do anything. + */ +attribute_deprecated +void av_register_hwaccel(AVHWAccel *hwaccel); + +/** + * If hwaccel is NULL, returns the first registered hardware accelerator, + * if hwaccel is non-NULL, returns the next registered hardware accelerator + * after hwaccel, or NULL if hwaccel is the last one. + * + * @deprecated AVHWaccel structures contain no user-serviceable parts, so + * this function should not be used. + */ +attribute_deprecated +AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); +#endif + +#if FF_API_LOCKMGR +/** + * Lock operation used by lockmgr + * + * @deprecated Deprecated together with av_lockmgr_register(). + */ +enum AVLockOp { + AV_LOCK_CREATE, ///< Create a mutex + AV_LOCK_OBTAIN, ///< Lock the mutex + AV_LOCK_RELEASE, ///< Unlock the mutex + AV_LOCK_DESTROY, ///< Free mutex resources +}; + +/** + * Register a user provided lock manager supporting the operations + * specified by AVLockOp. The "mutex" argument to the function points + * to a (void *) where the lockmgr should store/get a pointer to a user + * allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the + * value left by the last call for all other ops. If the lock manager is + * unable to perform the op then it should leave the mutex in the same + * state as when it was called and return a non-zero value. However, + * when called with AV_LOCK_DESTROY the mutex will always be assumed to + * have been successfully destroyed. If av_lockmgr_register succeeds + * it will return a non-negative value, if it fails it will return a + * negative value and destroy all mutex and unregister all callbacks. + * av_lockmgr_register is not thread-safe, it must be called from a + * single thread before any calls which make use of locking are used. + * + * @param cb User defined callback. av_lockmgr_register invokes calls + * to this callback and the previously registered callback. + * The callback will be used to create more than one mutex + * each of which must be backed by its own underlying locking + * mechanism (i.e. do not use a single static object to + * implement your lock manager). If cb is set to NULL the + * lockmgr will be unregistered. + * + * @deprecated This function does nothing, and always returns 0. Be sure to + * build with thread support to get basic thread safety. + */ +attribute_deprecated +int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); +#endif + +/** + * Get the type of the given codec. + */ +enum AVMediaType avcodec_get_type(enum AVCodecID codec_id); + +/** + * Get the name of a codec. + * @return a static string identifying the codec; never NULL + */ +const char *avcodec_get_name(enum AVCodecID id); + +/** + * @return a positive value if s is open (i.e. avcodec_open2() was called on it + * with no corresponding avcodec_close()), 0 otherwise. + */ +int avcodec_is_open(AVCodecContext *s); + +/** + * @return a non-zero number if codec is an encoder, zero otherwise + */ +int av_codec_is_encoder(const AVCodec *codec); + +/** + * @return a non-zero number if codec is a decoder, zero otherwise + */ +int av_codec_is_decoder(const AVCodec *codec); + +/** + * @return descriptor for given codec ID or NULL if no descriptor exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id); + +/** + * Iterate over all codec descriptors known to libavcodec. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev); + +/** + * @return codec descriptor with the given name or NULL if no such descriptor + * exists. + */ +const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name); + +/** + * Allocate a CPB properties structure and initialize its fields to default + * values. + * + * @param size if non-NULL, the size of the allocated struct will be written + * here. This is useful for embedding it in side data. + * + * @return the newly allocated struct or NULL on failure + */ +AVCPBProperties *av_cpb_properties_alloc(size_t *size); + +/** + * @} + */ + +#endif /* AVCODEC_AVCODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avdct.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avdct.h new file mode 100644 index 0000000..272422e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avdct.h @@ -0,0 +1,84 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVDCT_H +#define AVCODEC_AVDCT_H + +#include "libavutil/opt.h" + +/** + * AVDCT context. + * @note function pointers can be NULL if the specific features have been + * disabled at build time. + */ +typedef struct AVDCT { + const AVClass *av_class; + + void (*idct)(int16_t *block /* align 16 */); + + /** + * IDCT input permutation. + * Several optimized IDCTs need a permutated input (relative to the + * normal order of the reference IDCT). + * This permutation must be performed before the idct_put/add. + * Note, normally this can be merged with the zigzag/alternate scan
+ * An example to avoid confusion: + * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...) + * - (x -> reference DCT -> reference IDCT -> x) + * - (x -> reference DCT -> simple_mmx_perm = idct_permutation + * -> simple_idct_mmx -> x) + * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant + * -> simple_idct_mmx -> ...) + */ + uint8_t idct_permutation[64]; + + void (*fdct)(int16_t *block /* align 16 */); + + + /** + * DCT algorithm. + * must use AVOptions to set this field. + */ + int dct_algo; + + /** + * IDCT algorithm. + * must use AVOptions to set this field. + */ + int idct_algo; + + void (*get_pixels)(int16_t *block /* align 16 */, + const uint8_t *pixels /* align 8 */, + ptrdiff_t line_size); + + int bits_per_sample; +} AVDCT; + +/** + * Allocates a AVDCT context. + * This needs to be initialized with avcodec_dct_init() after optionally + * configuring it with AVOptions. + * + * To free it use av_free() + */ +AVDCT *avcodec_dct_alloc(void); +int avcodec_dct_init(AVDCT *); + +const AVClass *avcodec_dct_get_class(void); + +#endif /* AVCODEC_AVDCT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avfft.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avfft.h new file mode 100644 index 0000000..0c0f9b8 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/avfft.h @@ -0,0 +1,118 @@ +/* + * 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 + */ + +#ifndef AVCODEC_AVFFT_H +#define AVCODEC_AVFFT_H + +/** + * @file + * @ingroup lavc_fft + * FFT functions + */ + +/** + * @defgroup lavc_fft FFT functions + * @ingroup lavc_misc + * + * @{ + */ + +typedef float FFTSample; + +typedef struct FFTComplex { + FFTSample re, im; +} FFTComplex; + +typedef struct FFTContext FFTContext; + +/** + * Set up a complex FFT. + * @param nbits log2 of the length of the input array + * @param inverse if 0 perform the forward transform, if 1 perform the inverse + */ +FFTContext *av_fft_init(int nbits, int inverse); + +/** + * Do the permutation needed BEFORE calling ff_fft_calc(). + */ +void av_fft_permute(FFTContext *s, FFTComplex *z); + +/** + * Do a complex FFT with the parameters defined in av_fft_init(). The + * input data must be permuted before. No 1.0/sqrt(n) normalization is done. + */ +void av_fft_calc(FFTContext *s, FFTComplex *z); + +void av_fft_end(FFTContext *s); + +FFTContext *av_mdct_init(int nbits, int inverse, double scale); +void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input); +void av_mdct_end(FFTContext *s); + +/* Real Discrete Fourier Transform */ + +enum RDFTransformType { + DFT_R2C, + IDFT_C2R, + IDFT_R2C, + DFT_C2R, +}; + +typedef struct RDFTContext RDFTContext; + +/** + * Set up a real FFT. + * @param nbits log2 of the length of the input array + * @param trans the type of transform + */ +RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans); +void av_rdft_calc(RDFTContext *s, FFTSample *data); +void av_rdft_end(RDFTContext *s); + +/* Discrete Cosine Transform */ + +typedef struct DCTContext DCTContext; + +enum DCTTransformType { + DCT_II = 0, + DCT_III, + DCT_I, + DST_I, +}; + +/** + * Set up DCT. + * + * @param nbits size of the input array: + * (1 << nbits) for DCT-II, DCT-III and DST-I + * (1 << nbits) + 1 for DCT-I + * @param type the type of transform + * + * @note the first element of the input of DST-I is ignored + */ +DCTContext *av_dct_init(int nbits, enum DCTTransformType type); +void av_dct_calc(DCTContext *s, FFTSample *data); +void av_dct_end (DCTContext *s); + +/** + * @} + */ + +#endif /* AVCODEC_AVFFT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/d3d11va.h new file mode 100644 index 0000000..6816b6c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/d3d11va.h @@ -0,0 +1,112 @@ +/* + * Direct3D11 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * copyright (c) 2015 Steve Lhomme + * + * 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 + */ + +#ifndef AVCODEC_D3D11VA_H +#define AVCODEC_D3D11VA_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_d3d11va + * Public libavcodec D3D11VA header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for Direct3D11 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for Direct3D11 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the Direct3D11 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + * + * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. + */ +typedef struct AVD3D11VAContext { + /** + * D3D11 decoder object + */ + ID3D11VideoDecoder *decoder; + + /** + * D3D11 VideoContext + */ + ID3D11VideoContext *video_context; + + /** + * D3D11 configuration used to create the decoder + */ + D3D11_VIDEO_DECODER_CONFIG *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + ID3D11VideoDecoderOutputView **surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; + + /** + * Mutex to access video_context + */ + HANDLE context_mutex; +} AVD3D11VAContext; + +/** + * Allocate an AVD3D11VAContext. + * + * @return Newly-allocated AVD3D11VAContext or NULL on failure. + */ +AVD3D11VAContext *av_d3d11va_alloc_context(void); + +/** + * @} + */ + +#endif /* AVCODEC_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dirac.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dirac.h new file mode 100644 index 0000000..e6d9d34 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dirac.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007 Marco Gerards + * Copyright (C) 2009 David Conrad + * Copyright (C) 2011 Jordi Ortiz + * + * 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 + */ + +#ifndef AVCODEC_DIRAC_H +#define AVCODEC_DIRAC_H + +/** + * @file + * Interface to Dirac Decoder/Encoder + * @author Marco Gerards + * @author David Conrad + * @author Jordi Ortiz + */ + +#include "avcodec.h" + +/** + * The spec limits the number of wavelet decompositions to 4 for both + * level 1 (VC-2) and 128 (long-gop default). + * 5 decompositions is the maximum before >16-bit buffers are needed. + * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting + * the others to 4 decompositions (or 3 for the fidelity filter). + * + * We use this instead of MAX_DECOMPOSITIONS to save some memory. + */ +#define MAX_DWT_LEVELS 5 + +/** + * Parse code values: + * + * Dirac Specification -> + * 9.6.1 Table 9.1 + * + * VC-2 Specification -> + * 10.4.1 Table 10.1 + */ + +enum DiracParseCodes { + DIRAC_PCODE_SEQ_HEADER = 0x00, + DIRAC_PCODE_END_SEQ = 0x10, + DIRAC_PCODE_AUX = 0x20, + DIRAC_PCODE_PAD = 0x30, + DIRAC_PCODE_PICTURE_CODED = 0x08, + DIRAC_PCODE_PICTURE_RAW = 0x48, + DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8, + DIRAC_PCODE_PICTURE_HQ = 0xE8, + DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A, + DIRAC_PCODE_INTER_NOREF_CO2 = 0x09, + DIRAC_PCODE_INTER_REF_CO1 = 0x0D, + DIRAC_PCODE_INTER_REF_CO2 = 0x0E, + DIRAC_PCODE_INTRA_REF_CO = 0x0C, + DIRAC_PCODE_INTRA_REF_RAW = 0x4C, + DIRAC_PCODE_INTRA_REF_PICT = 0xCC, + DIRAC_PCODE_MAGIC = 0x42424344, +}; + +typedef struct DiracVersionInfo { + int major; + int minor; +} DiracVersionInfo; + +typedef struct AVDiracSeqHeader { + unsigned width; + unsigned height; + uint8_t chroma_format; ///< 0: 444 1: 422 2: 420 + + uint8_t interlaced; + uint8_t top_field_first; + + uint8_t frame_rate_index; ///< index into dirac_frame_rate[] + uint8_t aspect_ratio_index; ///< index into dirac_aspect_ratio[] + + uint16_t clean_width; + uint16_t clean_height; + uint16_t clean_left_offset; + uint16_t clean_right_offset; + + uint8_t pixel_range_index; ///< index into dirac_pixel_range_presets[] + uint8_t color_spec_index; ///< index into dirac_color_spec_presets[] + + int profile; + int level; + + AVRational framerate; + AVRational sample_aspect_ratio; + + enum AVPixelFormat pix_fmt; + enum AVColorRange color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_trc; + enum AVColorSpace colorspace; + + DiracVersionInfo version; + int bit_depth; +} AVDiracSeqHeader; + +/** + * Parse a Dirac sequence header. + * + * @param dsh this function will allocate and fill an AVDiracSeqHeader struct + * and write it into this pointer. The caller must free it with + * av_free(). + * @param buf the data buffer + * @param buf_size the size of the data buffer in bytes + * @param log_ctx if non-NULL, this function will log errors here + * @return 0 on success, a negative AVERROR code on failure + */ +int av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh, + const uint8_t *buf, size_t buf_size, + void *log_ctx); + +#endif /* AVCODEC_DIRAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dv_profile.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dv_profile.h new file mode 100644 index 0000000..9380a66 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dv_profile.h @@ -0,0 +1,83 @@ +/* + * 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 + */ + +#ifndef AVCODEC_DV_PROFILE_H +#define AVCODEC_DV_PROFILE_H + +#include + +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" +#include "avcodec.h" + +/* minimum number of bytes to read from a DV stream in order to + * determine the profile */ +#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */ + + +/* + * AVDVProfile is used to express the differences between various + * DV flavors. For now it's primarily used for differentiating + * 525/60 and 625/50, but the plans are to use it for various + * DV specs as well (e.g. SMPTE314M vs. IEC 61834). + */ +typedef struct AVDVProfile { + int dsf; /* value of the dsf in the DV header */ + int video_stype; /* stype for VAUX source pack */ + int frame_size; /* total size of one frame in bytes */ + int difseg_size; /* number of DIF segments per DIF channel */ + int n_difchan; /* number of DIF channels per frame */ + AVRational time_base; /* 1/framerate */ + int ltc_divisor; /* FPS from the LTS standpoint */ + int height; /* picture height in pixels */ + int width; /* picture width in pixels */ + AVRational sar[2]; /* sample aspect ratios for 4:3 and 16:9 */ + enum AVPixelFormat pix_fmt; /* picture pixel format */ + int bpm; /* blocks per macroblock */ + const uint8_t *block_sizes; /* AC block sizes, in bits */ + int audio_stride; /* size of audio_shuffle table */ + int audio_min_samples[3]; /* min amount of audio samples */ + /* for 48kHz, 44.1kHz and 32kHz */ + int audio_samples_dist[5]; /* how many samples are supposed to be */ + /* in each frame in a 5 frames window */ + const uint8_t (*audio_shuffle)[9]; /* PCM shuffling table */ +} AVDVProfile; + +/** + * Get a DV profile for the provided compressed frame. + * + * @param sys the profile used for the previous frame, may be NULL + * @param frame the compressed data buffer + * @param buf_size size of the buffer in bytes + * @return the DV profile for the supplied data or NULL on failure + */ +const AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys, + const uint8_t *frame, unsigned buf_size); + +/** + * Get a DV profile for the provided stream parameters. + */ +const AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt); + +/** + * Get a DV profile for the provided stream parameters. + * The frame rate is used as a best-effort parameter. + */ +const AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate); + +#endif /* AVCODEC_DV_PROFILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dxva2.h new file mode 100644 index 0000000..22c9399 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/dxva2.h @@ -0,0 +1,93 @@ +/* + * DXVA2 HW acceleration + * + * copyright (c) 2009 Laurent Aimar + * + * 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 + */ + +#ifndef AVCODEC_DXVA2_H +#define AVCODEC_DXVA2_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_dxva2 + * Public libavcodec DXVA2 header. + */ + +#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0602 +#endif + +#include +#include +#include + +/** + * @defgroup lavc_codec_hwaccel_dxva2 DXVA2 + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards +#define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO 2 ///< Work around for DXVA2 and old Intel GPUs with ClearVideo interface + +/** + * This structure is used to provides the necessary configurations and data + * to the DXVA2 FFmpeg HWAccel implementation. + * + * The application must make it available as AVCodecContext.hwaccel_context. + */ +struct dxva_context { + /** + * DXVA2 decoder object + */ + IDirectXVideoDecoder *decoder; + + /** + * DXVA2 configuration used to create the decoder + */ + const DXVA2_ConfigPictureDecode *cfg; + + /** + * The number of surface in the surface array + */ + unsigned surface_count; + + /** + * The array of Direct3D surfaces used to create the decoder + */ + LPDIRECT3DSURFACE9 *surface; + + /** + * A bit field configuring the workarounds needed for using the decoder + */ + uint64_t workaround; + + /** + * Private to the FFmpeg AVHWAccel implementation + */ + unsigned report_id; +}; + +/** + * @} + */ + +#endif /* AVCODEC_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/jni.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/jni.h new file mode 100644 index 0000000..dd99e92 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/jni.h @@ -0,0 +1,46 @@ +/* + * JNI public API functions + * + * Copyright (c) 2015-2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_JNI_H +#define AVCODEC_JNI_H + +/* + * Manually set a Java virtual machine which will be used to retrieve the JNI + * environment. Once a Java VM is set it cannot be changed afterwards, meaning + * you can call multiple times av_jni_set_java_vm with the same Java VM pointer + * however it will error out if you try to set a different Java VM. + * + * @param vm Java virtual machine + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int av_jni_set_java_vm(void *vm, void *log_ctx); + +/* + * Get the Java virtual machine which has been set with av_jni_set_java_vm. + * + * @param vm Java virtual machine + * @return a pointer to the Java virtual machine + */ +void *av_jni_get_java_vm(void *log_ctx); + +#endif /* AVCODEC_JNI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/mediacodec.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/mediacodec.h new file mode 100644 index 0000000..4c8545d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/mediacodec.h @@ -0,0 +1,101 @@ +/* + * Android MediaCodec public API + * + * Copyright (c) 2016 Matthieu Bouron + * + * 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 + */ + +#ifndef AVCODEC_MEDIACODEC_H +#define AVCODEC_MEDIACODEC_H + +#include "libavcodec/avcodec.h" + +/** + * This structure holds a reference to a android/view/Surface object that will + * be used as output by the decoder. + * + */ +typedef struct AVMediaCodecContext { + + /** + * android/view/Surface object reference. + */ + void *surface; + +} AVMediaCodecContext; + +/** + * Allocate and initialize a MediaCodec context. + * + * When decoding with MediaCodec is finished, the caller must free the + * MediaCodec context with av_mediacodec_default_free. + * + * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise + */ +AVMediaCodecContext *av_mediacodec_alloc_context(void); + +/** + * Convenience function that sets up the MediaCodec context. + * + * @param avctx codec context + * @param ctx MediaCodec context to initialize + * @param surface reference to an android/view/Surface + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface); + +/** + * This function must be called to free the MediaCodec context initialized with + * av_mediacodec_default_init(). + * + * @param avctx codec context + */ +void av_mediacodec_default_free(AVCodecContext *avctx); + +/** + * Opaque structure representing a MediaCodec buffer to render. + */ +typedef struct MediaCodecBuffer AVMediaCodecBuffer; + +/** + * Release a MediaCodec buffer and render it to the surface that is associated + * with the decoder. This function should only be called once on a given + * buffer, once released the underlying buffer returns to the codec, thus + * subsequent calls to this function will have no effect. + * + * @param buffer the buffer to render + * @param render 1 to release and render the buffer to the surface or 0 to + * discard the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render); + +/** + * Release a MediaCodec buffer and render it at the given time to the surface + * that is associated with the decoder. The timestamp must be within one second + * of the current java/lang/System#nanoTime() (which is implemented using + * CLOCK_MONOTONIC on Android). See the Android MediaCodec documentation + * of android/media/MediaCodec#releaseOutputBuffer(int,long) for more details. + * + * @param buffer the buffer to render + * @param time timestamp in nanoseconds of when to render the buffer + * @return 0 on success, < 0 otherwise + */ +int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time); + +#endif /* AVCODEC_MEDIACODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/qsv.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/qsv.h new file mode 100644 index 0000000..b77158e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/qsv.h @@ -0,0 +1,107 @@ +/* + * Intel MediaSDK QSV public API + * + * 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 + */ + +#ifndef AVCODEC_QSV_H +#define AVCODEC_QSV_H + +#include + +#include "libavutil/buffer.h" + +/** + * This struct is used for communicating QSV parameters between libavcodec and + * the caller. It is managed by the caller and must be assigned to + * AVCodecContext.hwaccel_context. + * - decoding: hwaccel_context must be set on return from the get_format() + * callback + * - encoding: hwaccel_context must be set before avcodec_open2() + */ +typedef struct AVQSVContext { + /** + * If non-NULL, the session to use for encoding or decoding. + * Otherwise, libavcodec will try to create an internal session. + */ + mfxSession session; + + /** + * The IO pattern to use. + */ + int iopattern; + + /** + * Extra buffers to pass to encoder or decoder initialization. + */ + mfxExtBuffer **ext_buffers; + int nb_ext_buffers; + + /** + * Encoding only. If this field is set to non-zero by the caller, libavcodec + * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to + * the encoder initialization. This only makes sense if iopattern is also + * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY. + * + * The number of allocated opaque surfaces will be the sum of the number + * required by the encoder and the user-provided value nb_opaque_surfaces. + * The array of the opaque surfaces will be exported to the caller through + * the opaque_surfaces field. + */ + int opaque_alloc; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. Before + * calling avcodec_open2(), the caller should set this field to the number + * of extra opaque surfaces to allocate beyond what is required by the + * encoder. + * + * On return from avcodec_open2(), this field will be set by libavcodec to + * the total number of allocated opaque surfaces. + */ + int nb_opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be used by libavcodec to export the + * array of the allocated opaque surfaces to the caller, so they can be + * passed to other parts of the pipeline. + * + * The buffer reference exported here is owned and managed by libavcodec, + * the callers should make their own reference with av_buffer_ref() and free + * it with av_buffer_unref() when it is no longer needed. + * + * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1. + */ + AVBufferRef *opaque_surfaces; + + /** + * Encoding only, and only if opaque_alloc is set to non-zero. On return + * from avcodec_open2(), this field will be set to the surface type used in + * the opaque allocation request. + */ + int opaque_alloc_type; +} AVQSVContext; + +/** + * Allocate a new context. + * + * It must be freed by the caller with av_free(). + */ +AVQSVContext *av_qsv_alloc_context(void); + +#endif /* AVCODEC_QSV_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vaapi.h new file mode 100644 index 0000000..2cf7da5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vaapi.h @@ -0,0 +1,86 @@ +/* + * Video Acceleration API (shared data between FFmpeg and the video player) + * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 + * + * Copyright (C) 2008-2009 Splitted-Desktop Systems + * + * 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 + */ + +#ifndef AVCODEC_VAAPI_H +#define AVCODEC_VAAPI_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vaapi + * Public libavcodec VA API header. + */ + +#include +#include "libavutil/attributes.h" +#include "version.h" + +#if FF_API_STRUCT_VAAPI_CONTEXT + +/** + * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding + * @ingroup lavc_codec_hwaccel + * @{ + */ + +/** + * This structure is used to share data between the FFmpeg library and + * the client video application. + * This shall be zero-allocated and available as + * AVCodecContext.hwaccel_context. All user members can be set once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * Deprecated: use AVCodecContext.hw_frames_ctx instead. + */ +struct attribute_deprecated vaapi_context { + /** + * Window system dependent data + * + * - encoding: unused + * - decoding: Set by user + */ + void *display; + + /** + * Configuration ID + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t config_id; + + /** + * Context ID (video decode pipeline) + * + * - encoding: unused + * - decoding: Set by user + */ + uint32_t context_id; +}; + +/* @} */ + +#endif /* FF_API_STRUCT_VAAPI_CONTEXT */ + +#endif /* AVCODEC_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vdpau.h new file mode 100644 index 0000000..4d99943 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vdpau.h @@ -0,0 +1,176 @@ +/* + * The Video Decode and Presentation API for UNIX (VDPAU) is used for + * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1. + * + * Copyright (C) 2008 NVIDIA + * + * 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 + */ + +#ifndef AVCODEC_VDPAU_H +#define AVCODEC_VDPAU_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_vdpau + * Public libavcodec VDPAU header. + */ + + +/** + * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer + * @ingroup lavc_codec_hwaccel + * + * VDPAU hardware acceleration has two modules + * - VDPAU decoding + * - VDPAU presentation + * + * The VDPAU decoding module parses all headers using FFmpeg + * parsing mechanisms and uses VDPAU for the actual decoding. + * + * As per the current implementation, the actual decoding + * and rendering (API calls) are done as part of the VDPAU + * presentation (vo_vdpau.c) module. + * + * @{ + */ + +#include + +#include "libavutil/avconfig.h" +#include "libavutil/attributes.h" + +#include "avcodec.h" +#include "version.h" + +struct AVCodecContext; +struct AVFrame; + +typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *, + const VdpPictureInfo *, uint32_t, + const VdpBitstreamBuffer *); + +/** + * This structure is used to share data between the libavcodec library and + * the client video application. + * The user shall allocate the structure via the av_alloc_vdpau_hwaccel + * function and make it available as + * AVCodecContext.hwaccel_context. Members can be set by the user once + * during initialization or through each AVCodecContext.get_buffer() + * function call. In any case, they must be valid prior to calling + * decoding functions. + * + * The size of this structure is not a part of the public ABI and must not + * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an + * AVVDPAUContext. + */ +typedef struct AVVDPAUContext { + /** + * VDPAU decoder handle + * + * Set by user. + */ + VdpDecoder decoder; + + /** + * VDPAU decoder render callback + * + * Set by the user. + */ + VdpDecoderRender *render; + + AVVDPAU_Render2 render2; +} AVVDPAUContext; + +/** + * @brief allocation function for AVVDPAUContext + * + * Allows extending the struct without breaking API/ABI + */ +AVVDPAUContext *av_alloc_vdpaucontext(void); + +AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *); +void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2); + +/** + * Associate a VDPAU device with a codec context for hardware acceleration. + * This function is meant to be called from the get_format() codec callback, + * or earlier. It can also be called after avcodec_flush_buffers() to change + * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent + * display preemption). + * + * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes + * successfully. + * + * @param avctx decoding context whose get_format() callback is invoked + * @param device VDPAU device handle to use for hardware acceleration + * @param get_proc_address VDPAU device driver + * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags + * + * @return 0 on success, an AVERROR code on failure. + */ +int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device, + VdpGetProcAddress *get_proc_address, unsigned flags); + +/** + * Gets the parameters to create an adequate VDPAU video surface for the codec + * context using VDPAU hardware decoding acceleration. + * + * @note Behavior is undefined if the context was not successfully bound to a + * VDPAU device using av_vdpau_bind_context(). + * + * @param avctx the codec context being used for decoding the stream + * @param type storage space for the VDPAU video surface chroma type + * (or NULL to ignore) + * @param width storage space for the VDPAU video surface pixel width + * (or NULL to ignore) + * @param height storage space for the VDPAU video surface pixel height + * (or NULL to ignore) + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type, + uint32_t *width, uint32_t *height); + +/** + * Allocate an AVVDPAUContext. + * + * @return Newly-allocated AVVDPAUContext or NULL on failure. + */ +AVVDPAUContext *av_vdpau_alloc_context(void); + +#if FF_API_VDPAU_PROFILE +/** + * Get a decoder profile that should be used for initializing a VDPAU decoder. + * Should be called from the AVCodecContext.get_format() callback. + * + * @deprecated Use av_vdpau_bind_context() instead. + * + * @param avctx the codec context being used for decoding the stream + * @param profile a pointer into which the result will be written on success. + * The contents of profile are undefined if this function returns + * an error. + * + * @return 0 on success (non-negative), a negative AVERROR on failure. + */ +attribute_deprecated +int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile); +#endif + +/* @}*/ + +#endif /* AVCODEC_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/version.h new file mode 100644 index 0000000..3331d47 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/version.h @@ -0,0 +1,140 @@ +/* + * 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 + */ + +#ifndef AVCODEC_VERSION_H +#define AVCODEC_VERSION_H + +/** + * @file + * @ingroup libavc + * Libavcodec version macros. + */ + +#include "libavutil/version.h" + +#define LIBAVCODEC_VERSION_MAJOR 58 +#define LIBAVCODEC_VERSION_MINOR 54 +#define LIBAVCODEC_VERSION_MICRO 100 + +#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \ + LIBAVCODEC_VERSION_MINOR, \ + LIBAVCODEC_VERSION_MICRO) +#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT + +#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + */ + +#ifndef FF_API_LOWRES +#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_DEBUG_MV +#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58) +#endif +#ifndef FF_API_AVCTX_TIMEBASE +#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODED_FRAME +#define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_SIDEDATA_ONLY_PKT +#define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VDPAU_PROFILE +#define FF_API_VDPAU_PROFILE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CONVERGENCE_DURATION +#define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPICTURE +#define FF_API_AVPICTURE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVPACKET_OLD_API +#define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_RTP_CALLBACK +#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_VBV_DELAY +#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODER_TYPE +#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STAT_BITS +#define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_PRIVATE_OPT +#define FF_API_PRIVATE_OPT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_ASS_TIMING +#define FF_API_ASS_TIMING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_BSF +#define FF_API_OLD_BSF (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_COPY_CONTEXT +#define FF_API_COPY_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GET_CONTEXT_DEFAULTS +#define FF_API_GET_CONTEXT_DEFAULTS (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NVENC_OLD_NAME +#define FF_API_NVENC_OLD_NAME (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_STRUCT_VAAPI_CONTEXT +#define FF_API_STRUCT_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_MERGE_SD_API +#define FF_API_MERGE_SD_API (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_TAG_STRING +#define FF_API_TAG_STRING (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_GETCHROMA +#define FF_API_GETCHROMA (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_CODEC_GET_SET +#define FF_API_CODEC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_USER_VISIBLE_AVHWACCEL +#define FF_API_USER_VISIBLE_AVHWACCEL (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LOCKMGR +#define FF_API_LOCKMGR (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVCODEC_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_UNSANITIZED_BITRATES +#define FF_API_UNSANITIZED_BITRATES (LIBAVCODEC_VERSION_MAJOR < 59) +#endif + + +#endif /* AVCODEC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/videotoolbox.h new file mode 100644 index 0000000..af2db0d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/videotoolbox.h @@ -0,0 +1,127 @@ +/* + * Videotoolbox hardware acceleration + * + * copyright (c) 2012 Sebastien Zwickert + * + * 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 + */ + +#ifndef AVCODEC_VIDEOTOOLBOX_H +#define AVCODEC_VIDEOTOOLBOX_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_videotoolbox + * Public libavcodec Videotoolbox header. + */ + +#include + +#define Picture QuickdrawPicture +#include +#undef Picture + +#include "libavcodec/avcodec.h" + +/** + * This struct holds all the information that needs to be passed + * between the caller and libavcodec for initializing Videotoolbox decoding. + * Its size is not a part of the public ABI, it must be allocated with + * av_videotoolbox_alloc_context() and freed with av_free(). + */ +typedef struct AVVideotoolboxContext { + /** + * Videotoolbox decompression session object. + * Created and freed the caller. + */ + VTDecompressionSessionRef session; + + /** + * The output callback that must be passed to the session. + * Set by av_videottoolbox_default_init() + */ + VTDecompressionOutputCallback output_callback; + + /** + * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames. + * set by the caller. If this is set to 0, then no specific format is + * requested from the decoder, and its native format is output. + */ + OSType cv_pix_fmt_type; + + /** + * CoreMedia Format Description that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + CMVideoFormatDescriptionRef cm_fmt_desc; + + /** + * CoreMedia codec type that Videotoolbox will use to create the decompression session. + * Set by the caller. + */ + int cm_codec_type; +} AVVideotoolboxContext; + +/** + * Allocate and initialize a Videotoolbox context. + * + * This function should be called from the get_format() callback when the caller + * selects the AV_PIX_FMT_VIDETOOLBOX format. The caller must then create + * the decoder object (using the output callback provided by libavcodec) that + * will be used for Videotoolbox-accelerated decoding. + * + * When decoding with Videotoolbox is finished, the caller must destroy the decoder + * object and free the Videotoolbox context using av_free(). + * + * @return the newly allocated context or NULL on failure + */ +AVVideotoolboxContext *av_videotoolbox_alloc_context(void); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init(AVCodecContext *avctx); + +/** + * This is a convenience function that creates and sets up the Videotoolbox context using + * an internal implementation. + * + * @param avctx the corresponding codec context + * @param vtctx the Videotoolbox context to use + * + * @return >= 0 on success, a negative AVERROR code on failure + */ +int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx); + +/** + * This function must be called to free the Videotoolbox context initialized with + * av_videotoolbox_default_init(). + * + * @param avctx the corresponding codec context + */ +void av_videotoolbox_default_free(AVCodecContext *avctx); + +/** + * @} + */ + +#endif /* AVCODEC_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vorbis_parser.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vorbis_parser.h new file mode 100644 index 0000000..789932a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/vorbis_parser.h @@ -0,0 +1,74 @@ +/* + * 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 + * A public API for Vorbis parsing + * + * Determines the duration for each packet. + */ + +#ifndef AVCODEC_VORBIS_PARSER_H +#define AVCODEC_VORBIS_PARSER_H + +#include + +typedef struct AVVorbisParseContext AVVorbisParseContext; + +/** + * Allocate and initialize the Vorbis parser using headers in the extradata. + */ +AVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata, + int extradata_size); + +/** + * Free the parser and everything associated with it. + */ +void av_vorbis_parse_free(AVVorbisParseContext **s); + +#define VORBIS_FLAG_HEADER 0x00000001 +#define VORBIS_FLAG_COMMENT 0x00000002 +#define VORBIS_FLAG_SETUP 0x00000004 + +/** + * Get the duration for a Vorbis packet. + * + * If @p flags is @c NULL, + * special frames are considered invalid. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + * @param flags flags for special frames + */ +int av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size, int *flags); + +/** + * Get the duration for a Vorbis packet. + * + * @param s Vorbis parser context + * @param buf buffer containing a Vorbis frame + * @param buf_size size of the buffer + */ +int av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf, + int buf_size); + +void av_vorbis_parse_reset(AVVorbisParseContext *s); + +#endif /* AVCODEC_VORBIS_PARSER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/xvmc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/xvmc.h new file mode 100644 index 0000000..465ee78 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavcodec/xvmc.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2003 Ivan Kalvachev + * + * 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 + */ + +#ifndef AVCODEC_XVMC_H +#define AVCODEC_XVMC_H + +/** + * @file + * @ingroup lavc_codec_hwaccel_xvmc + * Public libavcodec XvMC header. + */ + +#include + +#include "libavutil/attributes.h" +#include "version.h" +#include "avcodec.h" + +/** + * @defgroup lavc_codec_hwaccel_xvmc XvMC + * @ingroup lavc_codec_hwaccel + * + * @{ + */ + +#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct + the number is 1337 speak for the letters IDCT MCo (motion compensation) */ + +struct attribute_deprecated xvmc_pix_fmt { + /** The field contains the special constant value AV_XVMC_ID. + It is used as a test that the application correctly uses the API, + and that there is no corruption caused by pixel routines. + - application - set during initialization + - libavcodec - unchanged + */ + int xvmc_id; + + /** Pointer to the block array allocated by XvMCCreateBlocks(). + The array has to be freed by XvMCDestroyBlocks(). + Each group of 64 values represents one data block of differential + pixel information (in MoCo mode) or coefficients for IDCT. + - application - set the pointer during initialization + - libavcodec - fills coefficients/pixel data into the array + */ + short* data_blocks; + + /** Pointer to the macroblock description array allocated by + XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks(). + - application - set the pointer during initialization + - libavcodec - fills description data into the array + */ + XvMCMacroBlock* mv_blocks; + + /** Number of macroblock descriptions that can be stored in the mv_blocks + array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_mv_blocks; + + /** Number of blocks that can be stored at once in the data_blocks array. + - application - set during initialization + - libavcodec - unchanged + */ + int allocated_data_blocks; + + /** Indicate that the hardware would interpret data_blocks as IDCT + coefficients and perform IDCT on them. + - application - set during initialization + - libavcodec - unchanged + */ + int idct; + + /** In MoCo mode it indicates that intra macroblocks are assumed to be in + unsigned format; same as the XVMC_INTRA_UNSIGNED flag. + - application - set during initialization + - libavcodec - unchanged + */ + int unsigned_intra; + + /** Pointer to the surface allocated by XvMCCreateSurface(). + It has to be freed by XvMCDestroySurface() on application exit. + It identifies the frame and its state on the video hardware. + - application - set during initialization + - libavcodec - unchanged + */ + XvMCSurface* p_surface; + +/** Set by the decoder before calling ff_draw_horiz_band(), + needed by the XvMCRenderSurface function. */ +//@{ + /** Pointer to the surface used as past reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_past_surface; + + /** Pointer to the surface used as future reference + - application - unchanged + - libavcodec - set + */ + XvMCSurface* p_future_surface; + + /** top/bottom field or frame + - application - unchanged + - libavcodec - set + */ + unsigned int picture_structure; + + /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence + - application - unchanged + - libavcodec - set + */ + unsigned int flags; +//}@ + + /** Number of macroblock descriptions in the mv_blocks array + that have already been passed to the hardware. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may increment it + with filled_mb_block_num or zero both. + - libavcodec - unchanged + */ + int start_mv_blocks_num; + + /** Number of new macroblock descriptions in the mv_blocks array (after + start_mv_blocks_num) that are filled by libavcodec and have to be + passed to the hardware. + - application - zeroes it on get_buffer() or after successful + ff_draw_horiz_band(). + - libavcodec - increment with one of each stored MB + */ + int filled_mv_blocks_num; + + /** Number of the next free data block; one data block consists of + 64 short values in the data_blocks array. + All blocks before this one have already been claimed by placing their + position into the corresponding block description structure field, + that are part of the mv_blocks array. + - application - zeroes it on get_buffer(). + A successful ff_draw_horiz_band() may zero it together + with start_mb_blocks_num. + - libavcodec - each decoded macroblock increases it by the number + of coded blocks it contains. + */ + int next_free_data_block_num; +}; + +/** + * @} + */ + +#endif /* AVCODEC_XVMC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/avdevice.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/avdevice.h new file mode 100644 index 0000000..ee94624 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/avdevice.h @@ -0,0 +1,514 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_AVDEVICE_H +#define AVDEVICE_AVDEVICE_H + +#include "version.h" + +/** + * @file + * @ingroup lavd + * Main libavdevice API header + */ + +/** + * @defgroup lavd libavdevice + * Special devices muxing/demuxing library. + * + * Libavdevice is a complementary library to @ref libavf "libavformat". It + * provides various "special" platform-specific muxers and demuxers, e.g. for + * grabbing devices, audio capture and playback etc. As a consequence, the + * (de)muxers in libavdevice are of the AVFMT_NOFILE type (they use their own + * I/O functions). The filename passed to avformat_open_input() often does not + * refer to an actually existing file, but has some special device-specific + * meaning - e.g. for xcbgrab it is the display name. + * + * To use libavdevice, simply call avdevice_register_all() to register all + * compiled muxers and demuxers. They all use standard libavformat API. + * + * @{ + */ + +#include "libavutil/log.h" +#include "libavutil/opt.h" +#include "libavutil/dict.h" +#include "libavformat/avformat.h" + +/** + * Return the LIBAVDEVICE_VERSION_INT constant. + */ +unsigned avdevice_version(void); + +/** + * Return the libavdevice build-time configuration. + */ +const char *avdevice_configuration(void); + +/** + * Return the libavdevice license. + */ +const char *avdevice_license(void); + +/** + * Initialize libavdevice and register all the input and output devices. + */ +void avdevice_register_all(void); + +/** + * Audio input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_audio_device_next(AVInputFormat *d); + +/** + * Video input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_video_device_next(AVInputFormat *d); + +/** + * Audio output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); + +/** + * Video output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); + +typedef struct AVDeviceRect { + int x; /**< x coordinate of top left corner */ + int y; /**< y coordinate of top left corner */ + int width; /**< width */ + int height; /**< height */ +} AVDeviceRect; + +/** + * Message types used by avdevice_app_to_dev_control_message(). + */ +enum AVAppToDevMessageType { + /** + * Dummy message. + */ + AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), + + /** + * Window size change message. + * + * Message is sent to the device every time the application changes the size + * of the window device renders to. + * Message should also be sent right after window is created. + * + * data: AVDeviceRect: new window size. + */ + AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), + + /** + * Repaint request message. + * + * Message is sent to the device when window has to be repainted. + * + * data: AVDeviceRect: area required to be repainted. + * NULL: whole area is required to be repainted. + */ + AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A'), + + /** + * Request pause/play. + * + * Application requests pause/unpause playback. + * Mostly usable with devices that have internal buffer. + * By default devices are not paused. + * + * data: NULL + */ + AV_APP_TO_DEV_PAUSE = MKBETAG('P', 'A', 'U', ' '), + AV_APP_TO_DEV_PLAY = MKBETAG('P', 'L', 'A', 'Y'), + AV_APP_TO_DEV_TOGGLE_PAUSE = MKBETAG('P', 'A', 'U', 'T'), + + /** + * Volume control message. + * + * Set volume level. It may be device-dependent if volume + * is changed per stream or system wide. Per stream volume + * change is expected when possible. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_APP_TO_DEV_SET_VOLUME = MKBETAG('S', 'V', 'O', 'L'), + + /** + * Mute control messages. + * + * Change mute state. It may be device-dependent if mute status + * is changed per stream or system wide. Per stream mute status + * change is expected when possible. + * + * data: NULL. + */ + AV_APP_TO_DEV_MUTE = MKBETAG(' ', 'M', 'U', 'T'), + AV_APP_TO_DEV_UNMUTE = MKBETAG('U', 'M', 'U', 'T'), + AV_APP_TO_DEV_TOGGLE_MUTE = MKBETAG('T', 'M', 'U', 'T'), + + /** + * Get volume/mute messages. + * + * Force the device to send AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED or + * AV_DEV_TO_APP_MUTE_STATE_CHANGED command respectively. + * + * data: NULL. + */ + AV_APP_TO_DEV_GET_VOLUME = MKBETAG('G', 'V', 'O', 'L'), + AV_APP_TO_DEV_GET_MUTE = MKBETAG('G', 'M', 'U', 'T'), +}; + +/** + * Message types used by avdevice_dev_to_app_control_message(). + */ +enum AVDevToAppMessageType { + /** + * Dummy message. + */ + AV_DEV_TO_APP_NONE = MKBETAG('N','O','N','E'), + + /** + * Create window buffer message. + * + * Device requests to create a window buffer. Exact meaning is device- + * and application-dependent. Message is sent before rendering first + * frame and all one-shot initializations should be done here. + * Application is allowed to ignore preferred window buffer size. + * + * @note: Application is obligated to inform about window buffer size + * with AV_APP_TO_DEV_WINDOW_SIZE message. + * + * data: AVDeviceRect: preferred size of the window buffer. + * NULL: no preferred size of the window buffer. + */ + AV_DEV_TO_APP_CREATE_WINDOW_BUFFER = MKBETAG('B','C','R','E'), + + /** + * Prepare window buffer message. + * + * Device requests to prepare a window buffer for rendering. + * Exact meaning is device- and application-dependent. + * Message is sent before rendering of each frame. + * + * data: NULL. + */ + AV_DEV_TO_APP_PREPARE_WINDOW_BUFFER = MKBETAG('B','P','R','E'), + + /** + * Display window buffer message. + * + * Device requests to display a window buffer. + * Message is sent when new frame is ready to be displayed. + * Usually buffers need to be swapped in handler of this message. + * + * data: NULL. + */ + AV_DEV_TO_APP_DISPLAY_WINDOW_BUFFER = MKBETAG('B','D','I','S'), + + /** + * Destroy window buffer message. + * + * Device requests to destroy a window buffer. + * Message is sent when device is about to be destroyed and window + * buffer is not required anymore. + * + * data: NULL. + */ + AV_DEV_TO_APP_DESTROY_WINDOW_BUFFER = MKBETAG('B','D','E','S'), + + /** + * Buffer fullness status messages. + * + * Device signals buffer overflow/underflow. + * + * data: NULL. + */ + AV_DEV_TO_APP_BUFFER_OVERFLOW = MKBETAG('B','O','F','L'), + AV_DEV_TO_APP_BUFFER_UNDERFLOW = MKBETAG('B','U','F','L'), + + /** + * Buffer readable/writable. + * + * Device informs that buffer is readable/writable. + * When possible, device informs how many bytes can be read/write. + * + * @warning Device may not inform when number of bytes than can be read/write changes. + * + * data: int64_t: amount of bytes available to read/write. + * NULL: amount of bytes available to read/write is not known. + */ + AV_DEV_TO_APP_BUFFER_READABLE = MKBETAG('B','R','D',' '), + AV_DEV_TO_APP_BUFFER_WRITABLE = MKBETAG('B','W','R',' '), + + /** + * Mute state change message. + * + * Device informs that mute state has changed. + * + * data: int: 0 for not muted state, non-zero for muted state. + */ + AV_DEV_TO_APP_MUTE_STATE_CHANGED = MKBETAG('C','M','U','T'), + + /** + * Volume level change message. + * + * Device informs that volume level has changed. + * + * data: double: new volume with range of 0.0 - 1.0. + */ + AV_DEV_TO_APP_VOLUME_LEVEL_CHANGED = MKBETAG('C','V','O','L'), +}; + +/** + * Send control message from application to device. + * + * @param s device context. + * @param type message type. + * @param data message data. Exact type depends on message type. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when device doesn't implement handler of the message. + */ +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, + enum AVAppToDevMessageType type, + void *data, size_t data_size); + +/** + * Send control message from device to application. + * + * @param s device context. + * @param type message type. + * @param data message data. Can be NULL. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when application doesn't implement handler of the message. + */ +int avdevice_dev_to_app_control_message(struct AVFormatContext *s, + enum AVDevToAppMessageType type, + void *data, size_t data_size); + +/** + * Following API allows user to probe device capabilities (supported codecs, + * pixel formats, sample formats, resolutions, channel counts, etc). + * It is build on top op AVOption API. + * Queried capabilities make it possible to set up converters of video or audio + * parameters that fit to the device. + * + * List of capabilities that can be queried: + * - Capabilities valid for both audio and video devices: + * - codec: supported audio/video codecs. + * type: AV_OPT_TYPE_INT (AVCodecID value) + * - Capabilities valid for audio devices: + * - sample_format: supported sample formats. + * type: AV_OPT_TYPE_INT (AVSampleFormat value) + * - sample_rate: supported sample rates. + * type: AV_OPT_TYPE_INT + * - channels: supported number of channels. + * type: AV_OPT_TYPE_INT + * - channel_layout: supported channel layouts. + * type: AV_OPT_TYPE_INT64 + * - Capabilities valid for video devices: + * - pixel_format: supported pixel formats. + * type: AV_OPT_TYPE_INT (AVPixelFormat value) + * - window_size: supported window sizes (describes size of the window size presented to the user). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - frame_size: supported frame sizes (describes size of provided video frames). + * type: AV_OPT_TYPE_IMAGE_SIZE + * - fps: supported fps values + * type: AV_OPT_TYPE_RATIONAL + * + * Value of the capability may be set by user using av_opt_set() function + * and AVDeviceCapabilitiesQuery object. Following queries will + * limit results to the values matching already set capabilities. + * For example, setting a codec may impact number of formats or fps values + * returned during next query. Setting invalid value may limit results to zero. + * + * Example of the usage basing on opengl output device: + * + * @code + * AVFormatContext *oc = NULL; + * AVDeviceCapabilitiesQuery *caps = NULL; + * AVOptionRanges *ranges; + * int ret; + * + * if ((ret = avformat_alloc_output_context2(&oc, NULL, "opengl", NULL)) < 0) + * goto fail; + * if (avdevice_capabilities_create(&caps, oc, NULL) < 0) + * goto fail; + * + * //query codecs + * if (av_opt_query_ranges(&ranges, caps, "codec", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick codec here and set it + * av_opt_set(caps, "codec", AV_CODEC_ID_RAWVIDEO, 0); + * + * //query format + * if (av_opt_query_ranges(&ranges, caps, "pixel_format", AV_OPT_MULTI_COMPONENT_RANGE)) < 0) + * goto fail; + * //pick format here and set it + * av_opt_set(caps, "pixel_format", AV_PIX_FMT_YUV420P, 0); + * + * //query and set more capabilities + * + * fail: + * //clean up code + * avdevice_capabilities_free(&query, oc); + * avformat_free_context(oc); + * @endcode + */ + +/** + * Structure describes device capabilities. + * + * It is used by devices in conjunction with av_device_capabilities AVOption table + * to implement capabilities probing API based on AVOption API. Should not be used directly. + */ +typedef struct AVDeviceCapabilitiesQuery { + const AVClass *av_class; + AVFormatContext *device_context; + enum AVCodecID codec; + enum AVSampleFormat sample_format; + enum AVPixelFormat pixel_format; + int sample_rate; + int channels; + int64_t channel_layout; + int window_width; + int window_height; + int frame_width; + int frame_height; + AVRational fps; +} AVDeviceCapabilitiesQuery; + +/** + * AVOption table used by devices to implement device capabilities API. Should not be used by a user. + */ +extern const AVOption av_device_capabilities[]; + +/** + * Initialize capabilities probing API based on AVOption API. + * + * avdevice_capabilities_free() must be called when query capabilities API is + * not used anymore. + * + * @param[out] caps Device capabilities data. Pointer to a NULL pointer must be passed. + * @param s Context of the device. + * @param device_options An AVDictionary filled with device-private options. + * On return this parameter will be destroyed and replaced with a dict + * containing options that were not found. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * + * @return >= 0 on success, negative otherwise. + */ +int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, + AVDictionary **device_options); + +/** + * Free resources created by avdevice_capabilities_create() + * + * @param caps Device capabilities data to be freed. + * @param s Context of the device. + */ +void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); + +/** + * Structure describes basic parameters of the device. + */ +typedef struct AVDeviceInfo { + char *device_name; /**< device name, format depends on device */ + char *device_description; /**< human friendly name */ +} AVDeviceInfo; + +/** + * List of devices. + */ +typedef struct AVDeviceInfoList { + AVDeviceInfo **devices; /**< list of autodetected devices */ + int nb_devices; /**< number of autodetected devices */ + int default_device; /**< index of default device or -1 if no default */ +} AVDeviceInfoList; + +/** + * List devices. + * + * Returns available device names and their parameters. + * + * @note: Some devices may accept system-dependent device names that cannot be + * autodetected. The list returned by this function cannot be assumed to + * be always completed. + * + * @param s device context. + * @param[out] device_list list of autodetected devices. + * @return count of autodetected devices, negative on error. + */ +int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_list); + +/** + * Convenient function to free result of avdevice_list_devices(). + * + * @param devices device list to be freed. + */ +void avdevice_free_list_devices(AVDeviceInfoList **device_list); + +/** + * List devices. + * + * Returns available device names and their parameters. + * These are convinient wrappers for avdevice_list_devices(). + * Device context is allocated and deallocated internally. + * + * @param device device format. May be NULL if device name is set. + * @param device_name device name. May be NULL if device format is set. + * @param device_options An AVDictionary filled with device-private options. May be NULL. + * The same options must be passed later to avformat_write_header() for output + * devices or avformat_open_input() for input devices, or at any other place + * that affects device-private options. + * @param[out] device_list list of autodetected devices + * @return count of autodetected devices, negative on error. + * @note device argument takes precedence over device_name when both are set. + */ +int avdevice_list_input_sources(struct AVInputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); +int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, + AVDictionary *device_options, AVDeviceInfoList **device_list); + +/** + * @} + */ + +#endif /* AVDEVICE_AVDEVICE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/version.h new file mode 100644 index 0000000..840cefa --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavdevice/version.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVDEVICE_VERSION_H +#define AVDEVICE_VERSION_H + +/** + * @file + * @ingroup lavd + * Libavdevice version macros + */ + +#include "libavutil/version.h" + +#define LIBAVDEVICE_VERSION_MAJOR 58 +#define LIBAVDEVICE_VERSION_MINOR 8 +#define LIBAVDEVICE_VERSION_MICRO 100 + +#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_VERSION AV_VERSION(LIBAVDEVICE_VERSION_MAJOR, \ + LIBAVDEVICE_VERSION_MINOR, \ + LIBAVDEVICE_VERSION_MICRO) +#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT + +#define LIBAVDEVICE_IDENT "Lavd" AV_STRINGIFY(LIBAVDEVICE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#endif /* AVDEVICE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/avfilter.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/avfilter.h new file mode 100644 index 0000000..9d70e71 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/avfilter.h @@ -0,0 +1,1168 @@ +/* + * filter layer + * Copyright (c) 2007 Bobby Bingham + * + * 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 + */ + +#ifndef AVFILTER_AVFILTER_H +#define AVFILTER_AVFILTER_H + +/** + * @file + * @ingroup lavfi + * Main libavfilter public API header + */ + +/** + * @defgroup lavfi libavfilter + * Graph-based frame editing library. + * + * @{ + */ + +#include + +#include "libavutil/attributes.h" +#include "libavutil/avutil.h" +#include "libavutil/buffer.h" +#include "libavutil/dict.h" +#include "libavutil/frame.h" +#include "libavutil/log.h" +#include "libavutil/samplefmt.h" +#include "libavutil/pixfmt.h" +#include "libavutil/rational.h" + +#include "libavfilter/version.h" + +/** + * Return the LIBAVFILTER_VERSION_INT constant. + */ +unsigned avfilter_version(void); + +/** + * Return the libavfilter build-time configuration. + */ +const char *avfilter_configuration(void); + +/** + * Return the libavfilter license. + */ +const char *avfilter_license(void); + +typedef struct AVFilterContext AVFilterContext; +typedef struct AVFilterLink AVFilterLink; +typedef struct AVFilterPad AVFilterPad; +typedef struct AVFilterFormats AVFilterFormats; + +/** + * Get the number of elements in a NULL-terminated array of AVFilterPads (e.g. + * AVFilter.inputs/outputs). + */ +int avfilter_pad_count(const AVFilterPad *pads); + +/** + * Get the name of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array it; is the caller's + * responsibility to ensure the index is valid + * + * @return name of the pad_idx'th pad in pads + */ +const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx); + +/** + * Get the type of an AVFilterPad. + * + * @param pads an array of AVFilterPads + * @param pad_idx index of the pad in the array; it is the caller's + * responsibility to ensure the index is valid + * + * @return type of the pad_idx'th pad in pads + */ +enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx); + +/** + * The number of the filter inputs is not determined just by AVFilter.inputs. + * The filter might add additional inputs during initialization depending on the + * options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_INPUTS (1 << 0) +/** + * The number of the filter outputs is not determined just by AVFilter.outputs. + * The filter might add additional outputs during initialization depending on + * the options supplied to it. + */ +#define AVFILTER_FLAG_DYNAMIC_OUTPUTS (1 << 1) +/** + * The filter supports multithreading by splitting frames into multiple parts + * and processing them concurrently. + */ +#define AVFILTER_FLAG_SLICE_THREADS (1 << 2) +/** + * Some filters support a generic "enable" expression option that can be used + * to enable or disable a filter in the timeline. Filters supporting this + * option have this flag set. When the enable expression is false, the default + * no-op filter_frame() function is called in place of the filter_frame() + * callback defined on each input pad, thus the frame is passed unchanged to + * the next filters. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC (1 << 16) +/** + * Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will + * have its filter_frame() callback(s) called as usual even when the enable + * expression is false. The filter will disable filtering within the + * filter_frame() callback(s) itself, for example executing code depending on + * the AVFilterContext->is_disabled value. + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL (1 << 17) +/** + * Handy mask to test whether the filter supports or no the timeline feature + * (internally or generically). + */ +#define AVFILTER_FLAG_SUPPORT_TIMELINE (AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL) + +/** + * Filter definition. This defines the pads a filter contains, and all the + * callback functions used to interact with the filter. + */ +typedef struct AVFilter { + /** + * Filter name. Must be non-NULL and unique among filters. + */ + const char *name; + + /** + * A description of the filter. May be NULL. + * + * You should use the NULL_IF_CONFIG_SMALL() macro to define it. + */ + const char *description; + + /** + * List of inputs, terminated by a zeroed element. + * + * NULL if there are no (static) inputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in + * this list. + */ + const AVFilterPad *inputs; + /** + * List of outputs, terminated by a zeroed element. + * + * NULL if there are no (static) outputs. Instances of filters with + * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in + * this list. + */ + const AVFilterPad *outputs; + + /** + * A class for the private data, used to declare filter private AVOptions. + * This field is NULL for filters that do not declare any options. + * + * If this field is non-NULL, the first member of the filter private data + * must be a pointer to AVClass, which will be set by libavfilter generic + * code to this class. + */ + const AVClass *priv_class; + + /** + * A combination of AVFILTER_FLAG_* + */ + int flags; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + + /** + * Filter pre-initialization function + * + * This callback will be called immediately after the filter context is + * allocated, to allow allocating and initing sub-objects. + * + * If this callback is not NULL, the uninit callback will be called on + * allocation failure. + * + * @return 0 on success, + * AVERROR code on failure (but the code will be + * dropped and treated as ENOMEM by the calling code) + */ + int (*preinit)(AVFilterContext *ctx); + + /** + * Filter initialization function. + * + * This callback will be called only once during the filter lifetime, after + * all the options have been set, but before links between filters are + * established and format negotiation is done. + * + * Basic filter initialization should be done here. Filters with dynamic + * inputs and/or outputs should create those inputs/outputs here based on + * provided options. No more changes to this filter's inputs/outputs can be + * done after this callback. + * + * This callback must not assume that the filter links exist or frame + * parameters are known. + * + * @ref AVFilter.uninit "uninit" is guaranteed to be called even if + * initialization fails, so this callback does not have to clean up on + * failure. + * + * @return 0 on success, a negative AVERROR on failure + */ + int (*init)(AVFilterContext *ctx); + + /** + * Should be set instead of @ref AVFilter.init "init" by the filters that + * want to pass a dictionary of AVOptions to nested contexts that are + * allocated during init. + * + * On return, the options dict should be freed and replaced with one that + * contains all the options which could not be processed by this filter (or + * with NULL if all the options were processed). + * + * Otherwise the semantics is the same as for @ref AVFilter.init "init". + */ + int (*init_dict)(AVFilterContext *ctx, AVDictionary **options); + + /** + * Filter uninitialization function. + * + * Called only once right before the filter is freed. Should deallocate any + * memory held by the filter, release any buffer references, etc. It does + * not need to deallocate the AVFilterContext.priv memory itself. + * + * This callback may be called even if @ref AVFilter.init "init" was not + * called or failed, so it must be prepared to handle such a situation. + */ + void (*uninit)(AVFilterContext *ctx); + + /** + * Query formats supported by the filter on its inputs and outputs. + * + * This callback is called after the filter is initialized (so the inputs + * and outputs are fixed), shortly before the format negotiation. This + * callback may be called more than once. + * + * This callback must set AVFilterLink.out_formats on every input link and + * AVFilterLink.in_formats on every output link to a list of pixel/sample + * formats that the filter supports on that link. For audio links, this + * filter must also set @ref AVFilterLink.in_samplerates "in_samplerates" / + * @ref AVFilterLink.out_samplerates "out_samplerates" and + * @ref AVFilterLink.in_channel_layouts "in_channel_layouts" / + * @ref AVFilterLink.out_channel_layouts "out_channel_layouts" analogously. + * + * This callback may be NULL for filters with one input, in which case + * libavfilter assumes that it supports all input formats and preserves + * them on output. + * + * @return zero on success, a negative value corresponding to an + * AVERROR code otherwise + */ + int (*query_formats)(AVFilterContext *); + + int priv_size; ///< size of private data to allocate for the filter + + int flags_internal; ///< Additional flags for avfilter internal use only. + + /** + * Used by the filter registration system. Must not be touched by any other + * code. + */ + struct AVFilter *next; + + /** + * Make the filter instance process a command. + * + * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. + * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be + * time consuming then a filter should treat it like an unsupported command + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ + int (*process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags); + + /** + * Filter initialization function, alternative to the init() + * callback. Args contains the user-supplied parameters, opaque is + * used for providing binary data. + */ + int (*init_opaque)(AVFilterContext *ctx, void *opaque); + + /** + * Filter activation function. + * + * Called when any processing is needed from the filter, instead of any + * filter_frame and request_frame on pads. + * + * The function must examine inlinks and outlinks and perform a single + * step of processing. If there is nothing to do, the function must do + * nothing and not return an error. If more steps are or may be + * possible, it must use ff_filter_set_ready() to schedule another + * activation. + */ + int (*activate)(AVFilterContext *ctx); +} AVFilter; + +/** + * Process multiple parts of the frame concurrently. + */ +#define AVFILTER_THREAD_SLICE (1 << 0) + +typedef struct AVFilterInternal AVFilterInternal; + +/** An instance of a filter */ +struct AVFilterContext { + const AVClass *av_class; ///< needed for av_log() and filters common options + + const AVFilter *filter; ///< the AVFilter of which this is an instance + + char *name; ///< name of this filter instance + + AVFilterPad *input_pads; ///< array of input pads + AVFilterLink **inputs; ///< array of pointers to input links + unsigned nb_inputs; ///< number of input pads + + AVFilterPad *output_pads; ///< array of output pads + AVFilterLink **outputs; ///< array of pointers to output links + unsigned nb_outputs; ///< number of output pads + + void *priv; ///< private data for use by the filter + + struct AVFilterGraph *graph; ///< filtergraph this filter belongs to + + /** + * Type of multithreading being allowed/used. A combination of + * AVFILTER_THREAD_* flags. + * + * May be set by the caller before initializing the filter to forbid some + * or all kinds of multithreading for this filter. The default is allowing + * everything. + * + * When the filter is initialized, this field is combined using bit AND with + * AVFilterGraph.thread_type to get the final mask used for determining + * allowed threading types. I.e. a threading type needs to be set in both + * to be allowed. + * + * After the filter is initialized, libavfilter sets this field to the + * threading type that is actually used (0 for no multithreading). + */ + int thread_type; + + /** + * An opaque struct for libavfilter internal use. + */ + AVFilterInternal *internal; + + struct AVFilterCommand *command_queue; + + char *enable_str; ///< enable expression string + void *enable; ///< parsed expression (AVExpr*) + double *var_values; ///< variable values for the enable expression + int is_disabled; ///< the enabled state from the last expression evaluation + + /** + * For filters which will create hardware frames, sets the device the + * filter should create them in. All other filters will ignore this field: + * in particular, a filter which consumes or processes hardware frames will + * instead use the hw_frames_ctx field in AVFilterLink to carry the + * hardware context information. + */ + AVBufferRef *hw_device_ctx; + + /** + * Max number of threads allowed in this filter instance. + * If <= 0, its value is ignored. + * Overrides global number of threads set per filter graph. + */ + int nb_threads; + + /** + * Ready status of the filter. + * A non-0 value means that the filter needs activating; + * a higher value suggests a more urgent activation. + */ + unsigned ready; + + /** + * Sets the number of extra hardware frames which the filter will + * allocate on its output links for use in following filters or by + * the caller. + * + * Some hardware filters require all frames that they will use for + * output to be defined in advance before filtering starts. For such + * filters, any hardware frame pools used for output must therefore be + * of fixed size. The extra frames set here are on top of any number + * that the filter needs internally in order to operate normally. + * + * This field must be set before the graph containing this filter is + * configured. + */ + int extra_hw_frames; +}; + +/** + * A link between two filters. This contains pointers to the source and + * destination filters between which this link exists, and the indexes of + * the pads involved. In addition, this link also contains the parameters + * which have been negotiated and agreed upon between the filter, such as + * image dimensions, format, etc. + * + * Applications must not normally access the link structure directly. + * Use the buffersrc and buffersink API instead. + * In the future, access to the header may be reserved for filters + * implementation. + */ +struct AVFilterLink { + AVFilterContext *src; ///< source filter + AVFilterPad *srcpad; ///< output pad on the source filter + + AVFilterContext *dst; ///< dest filter + AVFilterPad *dstpad; ///< input pad on the dest filter + + enum AVMediaType type; ///< filter media type + + /* These parameters apply only to video */ + int w; ///< agreed upon image width + int h; ///< agreed upon image height + AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio + /* These parameters apply only to audio */ + uint64_t channel_layout; ///< channel layout of current buffer (see libavutil/channel_layout.h) + int sample_rate; ///< samples per second + + int format; ///< agreed upon media format + + /** + * Define the time base used by the PTS of the frames/samples + * which will pass through this link. + * During the configuration stage, each filter is supposed to + * change only the output timebase, while the timebase of the + * input link is assumed to be an unchangeable property. + */ + AVRational time_base; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavfilter and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + /** + * Lists of formats and channel layouts supported by the input and output + * filters respectively. These lists are used for negotiating the format + * to actually be used, which will be loaded into the format and + * channel_layout members, above, when chosen. + * + */ + AVFilterFormats *in_formats; + AVFilterFormats *out_formats; + + /** + * Lists of channel layouts and sample rates used for automatic + * negotiation. + */ + AVFilterFormats *in_samplerates; + AVFilterFormats *out_samplerates; + struct AVFilterChannelLayouts *in_channel_layouts; + struct AVFilterChannelLayouts *out_channel_layouts; + + /** + * Audio only, the destination filter sets this to a non-zero value to + * request that buffers with the given number of samples should be sent to + * it. AVFilterPad.needs_fifo must also be set on the corresponding input + * pad. + * Last buffer before EOF will be padded with silence. + */ + int request_samples; + + /** stage of the initialization of the link properties (dimensions, etc) */ + enum { + AVLINK_UNINIT = 0, ///< not started + AVLINK_STARTINIT, ///< started, but incomplete + AVLINK_INIT ///< complete + } init_state; + + /** + * Graph the filter belongs to. + */ + struct AVFilterGraph *graph; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in link time_base units. + */ + int64_t current_pts; + + /** + * Current timestamp of the link, as defined by the most recent + * frame(s), in AV_TIME_BASE units. + */ + int64_t current_pts_us; + + /** + * Index in the age array. + */ + int age_index; + + /** + * Frame rate of the stream on the link, or 1/0 if unknown or variable; + * if left to 0/0, will be automatically copied from the first input + * of the source filter if it exists. + * + * Sources should set it to the best estimation of the real frame rate. + * If the source frame rate is unknown or variable, set this to 1/0. + * Filters should update it if necessary depending on their function. + * Sinks can use it to set a default output frame rate. + * It is similar to the r_frame_rate field in AVStream. + */ + AVRational frame_rate; + + /** + * Buffer partially filled with samples to achieve a fixed/minimum size. + */ + AVFrame *partial_buf; + + /** + * Size of the partial buffer to allocate. + * Must be between min_samples and max_samples. + */ + int partial_buf_size; + + /** + * Minimum number of samples to filter at once. If filter_frame() is + * called with fewer samples, it will accumulate them in partial_buf. + * This field and the related ones must not be changed after filtering + * has started. + * If 0, all related fields are ignored. + */ + int min_samples; + + /** + * Maximum number of samples to filter at once. If filter_frame() is + * called with more samples, it will split them. + */ + int max_samples; + + /** + * Number of channels. + */ + int channels; + + /** + * Link processing flags. + */ + unsigned flags; + + /** + * Number of past frames sent through the link. + */ + int64_t frame_count_in, frame_count_out; + + /** + * A pointer to a FFFramePool struct. + */ + void *frame_pool; + + /** + * True if a frame is currently wanted on the output of this filter. + * Set when ff_request_frame() is called by the output, + * cleared when a frame is filtered. + */ + int frame_wanted_out; + + /** + * For hwaccel pixel formats, this should be a reference to the + * AVHWFramesContext describing the frames. + */ + AVBufferRef *hw_frames_ctx; + +#ifndef FF_INTERNAL_FIELDS + + /** + * Internal structure members. + * The fields below this limit are internal for libavfilter's use + * and must in no way be accessed by applications. + */ + char reserved[0xF000]; + +#else /* FF_INTERNAL_FIELDS */ + + /** + * Queue of frames waiting to be filtered. + */ + FFFrameQueue fifo; + + /** + * If set, the source filter can not generate a frame as is. + * The goal is to avoid repeatedly calling the request_frame() method on + * the same link. + */ + int frame_blocked_in; + + /** + * Link input status. + * If not zero, all attempts of filter_frame will fail with the + * corresponding code. + */ + int status_in; + + /** + * Timestamp of the input status change. + */ + int64_t status_in_pts; + + /** + * Link output status. + * If not zero, all attempts of request_frame will fail with the + * corresponding code. + */ + int status_out; + +#endif /* FF_INTERNAL_FIELDS */ + +}; + +/** + * Link two filters together. + * + * @param src the source filter + * @param srcpad index of the output pad on the source filter + * @param dst the destination filter + * @param dstpad index of the input pad on the destination filter + * @return zero on success + */ +int avfilter_link(AVFilterContext *src, unsigned srcpad, + AVFilterContext *dst, unsigned dstpad); + +/** + * Free the link in *link, and set its pointer to NULL. + */ +void avfilter_link_free(AVFilterLink **link); + +#if FF_API_FILTER_GET_SET +/** + * Get the number of channels of a link. + * @deprecated Use av_buffersink_get_channels() + */ +attribute_deprecated +int avfilter_link_get_channels(AVFilterLink *link); +#endif + +/** + * Set the closed field of a link. + * @deprecated applications are not supposed to mess with links, they should + * close the sinks. + */ +attribute_deprecated +void avfilter_link_set_closed(AVFilterLink *link, int closed); + +/** + * Negotiate the media format, dimensions, etc of all inputs to a filter. + * + * @param filter the filter to negotiate the properties for its inputs + * @return zero on successful negotiation + */ +int avfilter_config_links(AVFilterContext *filter); + +#define AVFILTER_CMD_FLAG_ONE 1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically +#define AVFILTER_CMD_FLAG_FAST 2 ///< Only execute command when its fast (like a video out that supports contrast adjustment in hw) + +/** + * Make the filter instance process a command. + * It is recommended to use avfilter_graph_send_command(). + */ +int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Iterate over all registered filters. + * + * @param opaque a pointer where libavfilter will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered filter or NULL when the iteration is + * finished + */ +const AVFilter *av_filter_iterate(void **opaque); + +#if FF_API_NEXT +/** Initialize the filter system. Register all builtin filters. */ +attribute_deprecated +void avfilter_register_all(void); + +/** + * Register a filter. This is only needed if you plan to use + * avfilter_get_by_name later to lookup the AVFilter structure by name. A + * filter can still by instantiated with avfilter_graph_alloc_filter even if it + * is not registered. + * + * @param filter the filter to register + * @return 0 if the registration was successful, a negative value + * otherwise + */ +attribute_deprecated +int avfilter_register(AVFilter *filter); + +/** + * Iterate over all registered filters. + * @return If prev is non-NULL, next registered filter after prev or NULL if + * prev is the last filter. If prev is NULL, return the first registered filter. + */ +attribute_deprecated +const AVFilter *avfilter_next(const AVFilter *prev); +#endif + +/** + * Get a filter definition matching the given name. + * + * @param name the filter name to find + * @return the filter definition, if any matching one is registered. + * NULL if none found. + */ +const AVFilter *avfilter_get_by_name(const char *name); + + +/** + * Initialize a filter with the supplied parameters. + * + * @param ctx uninitialized filter context to initialize + * @param args Options to initialize the filter with. This must be a + * ':'-separated list of options in the 'key=value' form. + * May be NULL if the options have been set directly using the + * AVOptions API or there are no options that need to be set. + * @return 0 on success, a negative AVERROR on failure + */ +int avfilter_init_str(AVFilterContext *ctx, const char *args); + +/** + * Initialize a filter with the supplied dictionary of options. + * + * @param ctx uninitialized filter context to initialize + * @param options An AVDictionary filled with options for this filter. On + * return this parameter will be destroyed and replaced with + * a dict containing options that were not found. This dictionary + * must be freed by the caller. + * May be NULL, then this function is equivalent to + * avfilter_init_str() with the second parameter set to NULL. + * @return 0 on success, a negative AVERROR on failure + * + * @note This function and avfilter_init_str() do essentially the same thing, + * the difference is in manner in which the options are passed. It is up to the + * calling code to choose whichever is more preferable. The two functions also + * behave differently when some of the provided options are not declared as + * supported by the filter. In such a case, avfilter_init_str() will fail, but + * this function will leave those extra options in the options AVDictionary and + * continue as usual. + */ +int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options); + +/** + * Free a filter context. This will also remove the filter from its + * filtergraph's list of filters. + * + * @param filter the filter to free + */ +void avfilter_free(AVFilterContext *filter); + +/** + * Insert a filter in the middle of an existing link. + * + * @param link the link into which the filter should be inserted + * @param filt the filter to be inserted + * @param filt_srcpad_idx the input pad on the filter to connect + * @param filt_dstpad_idx the output pad on the filter to connect + * @return zero on success + */ +int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, + unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); + +/** + * @return AVClass for AVFilterContext. + * + * @see av_opt_find(). + */ +const AVClass *avfilter_get_class(void); + +typedef struct AVFilterGraphInternal AVFilterGraphInternal; + +/** + * A function pointer passed to the @ref AVFilterGraph.execute callback to be + * executed multiple times, possibly in parallel. + * + * @param ctx the filter context the job belongs to + * @param arg an opaque parameter passed through from @ref + * AVFilterGraph.execute + * @param jobnr the index of the job being executed + * @param nb_jobs the total number of jobs + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_action_func)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); + +/** + * A function executing multiple jobs, possibly in parallel. + * + * @param ctx the filter context to which the jobs belong + * @param func the function to be called multiple times + * @param arg the argument to be passed to func + * @param ret a nb_jobs-sized array to be filled with return values from each + * invocation of func + * @param nb_jobs the number of jobs to execute + * + * @return 0 on success, a negative AVERROR on error + */ +typedef int (avfilter_execute_func)(AVFilterContext *ctx, avfilter_action_func *func, + void *arg, int *ret, int nb_jobs); + +typedef struct AVFilterGraph { + const AVClass *av_class; + AVFilterContext **filters; + unsigned nb_filters; + + char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters +#if FF_API_LAVR_OPTS + attribute_deprecated char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters +#endif + + /** + * Type of multithreading allowed for filters in this graph. A combination + * of AVFILTER_THREAD_* flags. + * + * May be set by the caller at any point, the setting will apply to all + * filters initialized after that. The default is allowing everything. + * + * When a filter in this graph is initialized, this field is combined using + * bit AND with AVFilterContext.thread_type to get the final mask used for + * determining allowed threading types. I.e. a threading type needs to be + * set in both to be allowed. + */ + int thread_type; + + /** + * Maximum number of threads used by filters in this graph. May be set by + * the caller before adding any filters to the filtergraph. Zero (the + * default) means that the number of threads is determined automatically. + */ + int nb_threads; + + /** + * Opaque object for libavfilter internal use. + */ + AVFilterGraphInternal *internal; + + /** + * Opaque user data. May be set by the caller to an arbitrary value, e.g. to + * be used from callbacks like @ref AVFilterGraph.execute. + * Libavfilter will not touch this field in any way. + */ + void *opaque; + + /** + * This callback may be set by the caller immediately after allocating the + * graph and before adding any filters to it, to provide a custom + * multithreading implementation. + * + * If set, filters with slice threading capability will call this callback + * to execute multiple jobs in parallel. + * + * If this field is left unset, libavfilter will use its internal + * implementation, which may or may not be multithreaded depending on the + * platform and build options. + */ + avfilter_execute_func *execute; + + char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions + + /** + * Private fields + * + * The following fields are for internal use only. + * Their type, offset, number and semantic can change without notice. + */ + + AVFilterLink **sink_links; + int sink_links_count; + + unsigned disable_auto_convert; +} AVFilterGraph; + +/** + * Allocate a filter graph. + * + * @return the allocated filter graph on success or NULL. + */ +AVFilterGraph *avfilter_graph_alloc(void); + +/** + * Create a new filter instance in a filter graph. + * + * @param graph graph in which the new filter will be used + * @param filter the filter to create an instance of + * @param name Name to give to the new instance (will be copied to + * AVFilterContext.name). This may be used by the caller to identify + * different filters, libavfilter itself assigns no semantics to + * this parameter. May be NULL. + * + * @return the context of the newly created filter instance (note that it is + * also retrievable directly through AVFilterGraph.filters or with + * avfilter_graph_get_filter()) on success or NULL on failure. + */ +AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, + const AVFilter *filter, + const char *name); + +/** + * Get a filter instance identified by instance name from graph. + * + * @param graph filter graph to search through. + * @param name filter instance name (should be unique in the graph). + * @return the pointer to the found filter instance or NULL if it + * cannot be found. + */ +AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); + +/** + * Create and add a filter instance into an existing graph. + * The filter instance is created from the filter filt and inited + * with the parameters args and opaque. + * + * In case of success put in *filt_ctx the pointer to the created + * filter instance, otherwise set *filt_ctx to NULL. + * + * @param name the instance name to give to the created filter instance + * @param graph_ctx the filter graph + * @return a negative AVERROR error code in case of failure, a non + * negative value otherwise + */ +int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, + const char *name, const char *args, void *opaque, + AVFilterGraph *graph_ctx); + +/** + * Enable or disable automatic format conversion inside the graph. + * + * Note that format conversion can still happen inside explicitly inserted + * scale and aresample filters. + * + * @param flags any of the AVFILTER_AUTO_CONVERT_* constants + */ +void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags); + +enum { + AVFILTER_AUTO_CONVERT_ALL = 0, /**< all automatic conversions enabled */ + AVFILTER_AUTO_CONVERT_NONE = -1, /**< all automatic conversions disabled */ +}; + +/** + * Check validity and configure all the links and formats in the graph. + * + * @param graphctx the filter graph + * @param log_ctx context used for logging + * @return >= 0 in case of success, a negative AVERROR code otherwise + */ +int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx); + +/** + * Free a graph, destroy its links, and set *graph to NULL. + * If *graph is NULL, do nothing. + */ +void avfilter_graph_free(AVFilterGraph **graph); + +/** + * A linked-list of the inputs/outputs of the filter chain. + * + * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(), + * where it is used to communicate open (unlinked) inputs and outputs from and + * to the caller. + * This struct specifies, per each not connected pad contained in the graph, the + * filter context and the pad index required for establishing a link. + */ +typedef struct AVFilterInOut { + /** unique name for this input/output in the list */ + char *name; + + /** filter context associated to this input/output */ + AVFilterContext *filter_ctx; + + /** index of the filt_ctx pad to use for linking */ + int pad_idx; + + /** next input/input in the list, NULL if this is the last */ + struct AVFilterInOut *next; +} AVFilterInOut; + +/** + * Allocate a single AVFilterInOut entry. + * Must be freed with avfilter_inout_free(). + * @return allocated AVFilterInOut on success, NULL on failure. + */ +AVFilterInOut *avfilter_inout_alloc(void); + +/** + * Free the supplied list of AVFilterInOut and set *inout to NULL. + * If *inout is NULL, do nothing. + */ +void avfilter_inout_free(AVFilterInOut **inout); + +/** + * Add a graph described by a string to a graph. + * + * @note The caller must provide the lists of inputs and outputs, + * which therefore must be known before calling the function. + * + * @note The inputs parameter describes inputs of the already existing + * part of the graph; i.e. from the point of view of the newly created + * part, they are outputs. Similarly the outputs parameter describes + * outputs of the already existing filters, which are provided as + * inputs to the parsed filters. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs linked list to the inputs of the graph + * @param outputs linked list to the outputs of the graph + * @return zero on success, a negative AVERROR code on error + */ +int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, + AVFilterInOut *inputs, AVFilterInOut *outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * In the graph filters description, if the input label of the first + * filter is not specified, "in" is assumed; if the output label of + * the last filter is not specified, "out" is assumed. + * + * @param graph the filter graph where to link the parsed graph context + * @param filters string to be parsed + * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. + * If non-NULL, *inputs is updated to contain the list of open inputs + * after the parsing, should be freed with avfilter_inout_free(). + * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. + * If non-NULL, *outputs is updated to contain the list of open outputs + * after the parsing, should be freed with avfilter_inout_free(). + * @return non negative on success, a negative AVERROR code on error + */ +int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, AVFilterInOut **outputs, + void *log_ctx); + +/** + * Add a graph described by a string to a graph. + * + * @param[in] graph the filter graph where to link the parsed graph context + * @param[in] filters string to be parsed + * @param[out] inputs a linked list of all free (unlinked) inputs of the + * parsed graph will be returned here. It is to be freed + * by the caller using avfilter_inout_free(). + * @param[out] outputs a linked list of all free (unlinked) outputs of the + * parsed graph will be returned here. It is to be freed by the + * caller using avfilter_inout_free(). + * @return zero on success, a negative AVERROR code on error + * + * @note This function returns the inputs and outputs that are left + * unlinked after parsing the graph and the caller then deals with + * them. + * @note This function makes no reference whatsoever to already + * existing parts of the graph and the inputs parameter will on return + * contain inputs of the newly parsed part of the graph. Analogously + * the outputs parameter will contain outputs of the newly created + * filters. + */ +int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, + AVFilterInOut **inputs, + AVFilterInOut **outputs); + +/** + * Send a command to one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to send, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param res a buffer with size res_size where the filter(s) can return a response. + * + * @returns >=0 on success otherwise an error code. + * AVERROR(ENOSYS) on unsupported commands + */ +int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags); + +/** + * Queue a command for one or more filter instances. + * + * @param graph the filter graph + * @param target the filter(s) to which the command should be sent + * "all" sends to all filters + * otherwise it can be a filter or filter instance name + * which will send the command to all matching filters. + * @param cmd the command to sent, for handling simplicity all commands must be alphanumeric only + * @param arg the argument for the command + * @param ts time at which the command should be sent to the filter + * + * @note As this executes commands after this function returns, no return code + * from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported. + */ +int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts); + + +/** + * Dump a graph into a human-readable string representation. + * + * @param graph the graph to dump + * @param options formatting options; currently ignored + * @return a string, or NULL in case of memory allocation failure; + * the string must be freed using av_free + */ +char *avfilter_graph_dump(AVFilterGraph *graph, const char *options); + +/** + * Request a frame on the oldest sink link. + * + * If the request returns AVERROR_EOF, try the next. + * + * Note that this function is not meant to be the sole scheduling mechanism + * of a filtergraph, only a convenience function to help drain a filtergraph + * in a balanced way under normal circumstances. + * + * Also note that AVERROR_EOF does not mean that frames did not arrive on + * some of the sinks during the process. + * When there are multiple sink links, in case the requested link + * returns an EOF, this may cause a filter to flush pending frames + * which are sent to another sink link, although unrequested. + * + * @return the return value of ff_request_frame(), + * or AVERROR_EOF if all links returned AVERROR_EOF + */ +int avfilter_graph_request_oldest(AVFilterGraph *graph); + +/** + * @} + */ + +#endif /* AVFILTER_AVFILTER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersink.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersink.h new file mode 100644 index 0000000..3c846bb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersink.h @@ -0,0 +1,165 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSINK_H +#define AVFILTER_BUFFERSINK_H + +/** + * @file + * @ingroup lavfi_buffersink + * memory buffer sink API for audio and video + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersink Buffer sink API + * @ingroup lavfi + * @{ + */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a buffersink or abuffersink filter context. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * @param flags a combination of AV_BUFFERSINK_FLAG_* flags + * + * @return >= 0 in for success, a negative AVERROR code for failure. + */ +int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); + +/** + * Tell av_buffersink_get_buffer_ref() to read video/samples buffer + * reference, but not remove it from the buffer. This is useful if you + * need only to read a video/samples buffer, without to fetch it. + */ +#define AV_BUFFERSINK_FLAG_PEEK 1 + +/** + * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. + * If a frame is already buffered, it is read (and removed from the buffer), + * but if no frame is present, return AVERROR(EAGAIN). + */ +#define AV_BUFFERSINK_FLAG_NO_REQUEST 2 + +/** + * Struct to use for initializing a buffersink context. + */ +typedef struct AVBufferSinkParams { + const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE +} AVBufferSinkParams; + +/** + * Create an AVBufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVBufferSinkParams *av_buffersink_params_alloc(void); + +/** + * Struct to use for initializing an abuffersink context. + */ +typedef struct AVABufferSinkParams { + const enum AVSampleFormat *sample_fmts; ///< list of allowed sample formats, terminated by AV_SAMPLE_FMT_NONE + const int64_t *channel_layouts; ///< list of allowed channel layouts, terminated by -1 + const int *channel_counts; ///< list of allowed channel counts, terminated by -1 + int all_channel_counts; ///< if not 0, accept any channel count or layout + int *sample_rates; ///< list of allowed sample rates, terminated by -1 +} AVABufferSinkParams; + +/** + * Create an AVABufferSinkParams structure. + * + * Must be freed with av_free(). + */ +AVABufferSinkParams *av_abuffersink_params_alloc(void); + +/** + * Set the frame size for an audio buffer sink. + * + * All calls to av_buffersink_get_buffer_ref will return a buffer with + * exactly the specified number of samples, or AVERROR(EAGAIN) if there is + * not enough. The last buffer at EOF will be padded with 0. + */ +void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); + +/** + * @defgroup lavfi_buffersink_accessors Buffer sink accessors + * Get the properties of the stream + * @{ + */ + +enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); +AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); +int av_buffersink_get_format (const AVFilterContext *ctx); + +AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); +int av_buffersink_get_w (const AVFilterContext *ctx); +int av_buffersink_get_h (const AVFilterContext *ctx); +AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); + +int av_buffersink_get_channels (const AVFilterContext *ctx); +uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); +int av_buffersink_get_sample_rate (const AVFilterContext *ctx); + +AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx); + +/** @} */ + +/** + * Get a frame with filtered data from sink and put it in frame. + * + * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * + * @return + * - >= 0 if a frame was successfully returned. + * - AVERROR(EAGAIN) if no frames are available at this point; more + * input frames must be added to the filtergraph to get more output. + * - AVERROR_EOF if there will be no more output frames on this sink. + * - A different negative AVERROR code in other failure cases. + */ +int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Same as av_buffersink_get_frame(), but with the ability to specify the number + * of samples read. This function is less efficient than + * av_buffersink_get_frame(), because it copies the data around. + * + * @param ctx pointer to a context of the abuffersink AVFilter. + * @param frame pointer to an allocated frame that will be filled with data. + * The data must be freed using av_frame_unref() / av_frame_free() + * frame will contain exactly nb_samples audio samples, except at + * the end of stream, when it can contain less than nb_samples. + * + * @return The return codes have the same meaning as for + * av_buffersink_get_frame(). + * + * @warning do not mix this function with av_buffersink_get_frame(). Use only one or + * the other with a single sink, not both. + */ +int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSINK_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersrc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersrc.h new file mode 100644 index 0000000..08fbd18 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/buffersrc.h @@ -0,0 +1,209 @@ +/* + * 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 + */ + +#ifndef AVFILTER_BUFFERSRC_H +#define AVFILTER_BUFFERSRC_H + +/** + * @file + * @ingroup lavfi_buffersrc + * Memory buffer source API. + */ + +#include "avfilter.h" + +/** + * @defgroup lavfi_buffersrc Buffer source API + * @ingroup lavfi + * @{ + */ + +enum { + + /** + * Do not check for format changes. + */ + AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, + + /** + * Immediately push the frame to the output. + */ + AV_BUFFERSRC_FLAG_PUSH = 4, + + /** + * Keep a reference to the frame. + * If the frame if reference-counted, create a new reference; otherwise + * copy the frame data. + */ + AV_BUFFERSRC_FLAG_KEEP_REF = 8, + +}; + +/** + * Get the number of failed requests. + * + * A failed request is when the request_frame method is called while no + * frame is present in the buffer. + * The number is reset when a frame is added. + */ +unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src); + +/** + * This structure contains the parameters describing the frames that will be + * passed to this filter. + * + * It should be allocated with av_buffersrc_parameters_alloc() and freed with + * av_free(). All the allocated fields in it remain owned by the caller. + */ +typedef struct AVBufferSrcParameters { + /** + * video: the pixel format, value corresponds to enum AVPixelFormat + * audio: the sample format, value corresponds to enum AVSampleFormat + */ + int format; + /** + * The timebase to be used for the timestamps on the input frames. + */ + AVRational time_base; + + /** + * Video only, the display dimensions of the input frames. + */ + int width, height; + + /** + * Video only, the sample (pixel) aspect ratio. + */ + AVRational sample_aspect_ratio; + + /** + * Video only, the frame rate of the input video. This field must only be + * set to a non-zero value if input stream has a known constant framerate + * and should be left at its initial value if the framerate is variable or + * unknown. + */ + AVRational frame_rate; + + /** + * Video with a hwaccel pixel format only. This should be a reference to an + * AVHWFramesContext instance describing the input frames. + */ + AVBufferRef *hw_frames_ctx; + + /** + * Audio only, the audio sampling rate in samples per second. + */ + int sample_rate; + + /** + * Audio only, the audio channel layout + */ + uint64_t channel_layout; +} AVBufferSrcParameters; + +/** + * Allocate a new AVBufferSrcParameters instance. It should be freed by the + * caller with av_free(). + */ +AVBufferSrcParameters *av_buffersrc_parameters_alloc(void); + +/** + * Initialize the buffersrc or abuffersrc filter with the provided parameters. + * This function may be called multiple times, the later calls override the + * previous ones. Some of the parameters may also be set through AVOptions, then + * whatever method is used last takes precedence. + * + * @param ctx an instance of the buffersrc or abuffersrc filter + * @param param the stream parameters. The frames later passed to this filter + * must conform to those parameters. All the allocated fields in + * param remain owned by the caller, libavfilter will make internal + * copies or references when necessary. + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will make a new reference to it. Otherwise the frame data will be + * copied. + * + * @return 0 on success, a negative AVERROR on error + * + * This function is equivalent to av_buffersrc_add_frame_flags() with the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * @param ctx an instance of the buffersrc filter + * @param frame frame to be added. If the frame is reference counted, this + * function will take ownership of the reference(s) and reset the frame. + * Otherwise the frame data will be copied. If this function returns an error, + * the input frame is not touched. + * + * @return 0 on success, a negative AVERROR on error. + * + * @note the difference between this function and av_buffersrc_write_frame() is + * that av_buffersrc_write_frame() creates a new reference to the input frame, + * while this function takes ownership of the reference passed to it. + * + * This function is equivalent to av_buffersrc_add_frame_flags() without the + * AV_BUFFERSRC_FLAG_KEEP_REF flag. + */ +av_warn_unused_result +int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame); + +/** + * Add a frame to the buffer source. + * + * By default, if the frame is reference-counted, this function will take + * ownership of the reference(s) and reset the frame. This can be controlled + * using the flags. + * + * If this function returns an error, the input frame is not touched. + * + * @param buffer_src pointer to a buffer source context + * @param frame a frame, or NULL to mark EOF + * @param flags a combination of AV_BUFFERSRC_FLAG_* + * @return >= 0 in case of success, a negative AVERROR code + * in case of failure + */ +av_warn_unused_result +int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src, + AVFrame *frame, int flags); + +/** + * Close the buffer source after EOF. + * + * This is similar to passing NULL to av_buffersrc_add_frame_flags() + * except it takes the timestamp of the EOF, i.e. the timestamp of the end + * of the last frame. + */ +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags); + +/** + * @} + */ + +#endif /* AVFILTER_BUFFERSRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/version.h new file mode 100644 index 0000000..cc5b23b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavfilter/version.h @@ -0,0 +1,66 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFILTER_VERSION_H +#define AVFILTER_VERSION_H + +/** + * @file + * @ingroup lavfi + * Libavfilter version macros + */ + +#include "libavutil/version.h" + +#define LIBAVFILTER_VERSION_MAJOR 7 +#define LIBAVFILTER_VERSION_MINOR 57 +#define LIBAVFILTER_VERSION_MICRO 100 + + +#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_VERSION AV_VERSION(LIBAVFILTER_VERSION_MAJOR, \ + LIBAVFILTER_VERSION_MINOR, \ + LIBAVFILTER_VERSION_MICRO) +#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT + +#define LIBAVFILTER_IDENT "Lavfi" AV_STRINGIFY(LIBAVFILTER_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_OLD_FILTER_OPTS_ERROR +#define FF_API_OLD_FILTER_OPTS_ERROR (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_LAVR_OPTS +#define FF_API_LAVR_OPTS (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_FILTER_GET_SET +#define FF_API_FILTER_GET_SET (LIBAVFILTER_VERSION_MAJOR < 8) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFILTER_VERSION_MAJOR < 8) +#endif + +#endif /* AVFILTER_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avformat.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avformat.h new file mode 100644 index 0000000..6eb329f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avformat.h @@ -0,0 +1,3092 @@ +/* + * copyright (c) 2001 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 + */ + +#ifndef AVFORMAT_AVFORMAT_H +#define AVFORMAT_AVFORMAT_H + +/** + * @file + * @ingroup libavf + * Main libavformat public API header + */ + +/** + * @defgroup libavf libavformat + * I/O and Muxing/Demuxing Library + * + * Libavformat (lavf) is a library for dealing with various media container + * formats. Its main two purposes are demuxing - i.e. splitting a media file + * into component streams, and the reverse process of muxing - writing supplied + * data in a specified container format. It also has an @ref lavf_io + * "I/O module" which supports a number of protocols for accessing the data (e.g. + * file, tcp, http and others). + * Unless you are absolutely sure you won't use libavformat's network + * capabilities, you should also call avformat_network_init(). + * + * A supported input format is described by an AVInputFormat struct, conversely + * an output format is described by AVOutputFormat. You can iterate over all + * input/output formats using the av_demuxer_iterate / av_muxer_iterate() functions. + * The protocols layer is not part of the public API, so you can only get the names + * of supported protocols with the avio_enum_protocols() function. + * + * Main lavf structure used for both muxing and demuxing is AVFormatContext, + * which exports all information about the file being read or written. As with + * most Libavformat structures, its size is not part of public ABI, so it cannot be + * allocated on stack or directly with av_malloc(). To create an + * AVFormatContext, use avformat_alloc_context() (some functions, like + * avformat_open_input() might do that for you). + * + * Most importantly an AVFormatContext contains: + * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat + * "output" format. It is either autodetected or set by user for input; + * always set by user for output. + * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all + * elementary streams stored in the file. AVStreams are typically referred to + * using their index in this array. + * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or + * set by user for input, always set by user for output (unless you are dealing + * with an AVFMT_NOFILE format). + * + * @section lavf_options Passing options to (de)muxers + * It is possible to configure lavf muxers and demuxers using the @ref avoptions + * mechanism. Generic (format-independent) libavformat options are provided by + * AVFormatContext, they can be examined from a user program by calling + * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass + * from avformat_get_class()). Private (format-specific) options are provided by + * AVFormatContext.priv_data if and only if AVInputFormat.priv_class / + * AVOutputFormat.priv_class of the corresponding format struct is non-NULL. + * Further options may be provided by the @ref AVFormatContext.pb "I/O context", + * if its AVClass is non-NULL, and the protocols layer. See the discussion on + * nesting in @ref avoptions documentation to learn how to access those. + * + * @section urls + * URL strings in libavformat are made of a scheme/protocol, a ':', and a + * scheme specific string. URLs without a scheme and ':' used for local files + * are supported but deprecated. "file:" should be used for local files. + * + * It is important that the scheme string is not taken from untrusted + * sources without checks. + * + * Note that some schemes/protocols are quite powerful, allowing access to + * both local and remote files, parts of them, concatenations of them, local + * audio and video devices and so on. + * + * @{ + * + * @defgroup lavf_decoding Demuxing + * @{ + * Demuxers read a media file and split it into chunks of data (@em packets). A + * @ref AVPacket "packet" contains one or more encoded frames which belongs to a + * single elementary stream. In the lavf API this process is represented by the + * avformat_open_input() function for opening a file, av_read_frame() for + * reading a single packet and finally avformat_close_input(), which does the + * cleanup. + * + * @section lavf_decoding_open Opening a media file + * The minimum information required to open a file is its URL, which + * is passed to avformat_open_input(), as in the following code: + * @code + * const char *url = "file:in.mp3"; + * AVFormatContext *s = NULL; + * int ret = avformat_open_input(&s, url, NULL, NULL); + * if (ret < 0) + * abort(); + * @endcode + * The above code attempts to allocate an AVFormatContext, open the + * specified file (autodetecting the format) and read the header, exporting the + * information stored there into s. Some formats do not have a header or do not + * store enough information there, so it is recommended that you call the + * avformat_find_stream_info() function which tries to read and decode a few + * frames to find missing information. + * + * In some cases you might want to preallocate an AVFormatContext yourself with + * avformat_alloc_context() and do some tweaking on it before passing it to + * avformat_open_input(). One such case is when you want to use custom functions + * for reading input data instead of lavf internal I/O layer. + * To do that, create your own AVIOContext with avio_alloc_context(), passing + * your reading callbacks to it. Then set the @em pb field of your + * AVFormatContext to newly created AVIOContext. + * + * Since the format of the opened file is in general not known until after + * avformat_open_input() has returned, it is not possible to set demuxer private + * options on a preallocated context. Instead, the options should be passed to + * avformat_open_input() wrapped in an AVDictionary: + * @code + * AVDictionary *options = NULL; + * av_dict_set(&options, "video_size", "640x480", 0); + * av_dict_set(&options, "pixel_format", "rgb24", 0); + * + * if (avformat_open_input(&s, url, NULL, &options) < 0) + * abort(); + * av_dict_free(&options); + * @endcode + * This code passes the private options 'video_size' and 'pixel_format' to the + * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it + * cannot know how to interpret raw video data otherwise. If the format turns + * out to be something different than raw video, those options will not be + * recognized by the demuxer and therefore will not be applied. Such unrecognized + * options are then returned in the options dictionary (recognized options are + * consumed). The calling program can handle such unrecognized options as it + * wishes, e.g. + * @code + * AVDictionaryEntry *e; + * if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) { + * fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key); + * abort(); + * } + * @endcode + * + * After you have finished reading the file, you must close it with + * avformat_close_input(). It will free everything associated with the file. + * + * @section lavf_decoding_read Reading from an opened file + * Reading data from an opened AVFormatContext is done by repeatedly calling + * av_read_frame() on it. Each call, if successful, will return an AVPacket + * containing encoded data for one AVStream, identified by + * AVPacket.stream_index. This packet may be passed straight into the libavcodec + * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the + * caller wishes to decode the data. + * + * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be + * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for + * pts/dts, 0 for duration) if the stream does not provide them. The timing + * information will be in AVStream.time_base units, i.e. it has to be + * multiplied by the timebase to convert them to seconds. + * + * If AVPacket.buf is set on the returned packet, then the packet is + * allocated dynamically and the user may keep it indefinitely. + * Otherwise, if AVPacket.buf is NULL, the packet data is backed by a + * static storage somewhere inside the demuxer and the packet is only valid + * until the next av_read_frame() call or closing the file. If the caller + * requires a longer lifetime, av_packet_make_refcounted() will ensure that + * the data is reference counted, copying the data if necessary. + * In both cases, the packet must be freed with av_packet_unref() when it is no + * longer needed. + * + * @section lavf_decoding_seek Seeking + * @} + * + * @defgroup lavf_encoding Muxing + * @{ + * Muxers take encoded data in the form of @ref AVPacket "AVPackets" and write + * it into files or other output bytestreams in the specified container format. + * + * The main API functions for muxing are avformat_write_header() for writing the + * file header, av_write_frame() / av_interleaved_write_frame() for writing the + * packets and av_write_trailer() for finalizing the file. + * + * At the beginning of the muxing process, the caller must first call + * avformat_alloc_context() to create a muxing context. The caller then sets up + * the muxer by filling the various fields in this context: + * + * - The @ref AVFormatContext.oformat "oformat" field must be set to select the + * muxer that will be used. + * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb + * "pb" field must be set to an opened IO context, either returned from + * avio_open2() or a custom one. + * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must + * be created with the avformat_new_stream() function. The caller should fill + * the @ref AVStream.codecpar "stream codec parameters" information, such as the + * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id + * "id" and other parameters (e.g. width / height, the pixel or sample format, + * etc.) as known. The @ref AVStream.time_base "stream timebase" should + * be set to the timebase that the caller desires to use for this stream (note + * that the timebase actually used by the muxer can be different, as will be + * described later). + * - It is advised to manually initialize only the relevant fields in + * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during + * remuxing: there is no guarantee that the codec context values remain valid + * for both input and output format contexts. + * - The caller may fill in additional information, such as @ref + * AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream" + * metadata, @ref AVFormatContext.chapters "chapters", @ref + * AVFormatContext.programs "programs", etc. as described in the + * AVFormatContext documentation. Whether such information will actually be + * stored in the output depends on what the container format and the muxer + * support. + * + * When the muxing context is fully set up, the caller must call + * avformat_write_header() to initialize the muxer internals and write the file + * header. Whether anything actually is written to the IO context at this step + * depends on the muxer, but this function must always be called. Any muxer + * private options must be passed in the options parameter to this function. + * + * The data is then sent to the muxer by repeatedly calling av_write_frame() or + * av_interleaved_write_frame() (consult those functions' documentation for + * discussion on the difference between them; only one of them may be used with + * a single muxing context, they should not be mixed). Do note that the timing + * information on the packets sent to the muxer must be in the corresponding + * AVStream's timebase. That timebase is set by the muxer (in the + * avformat_write_header() step) and may be different from the timebase + * requested by the caller. + * + * Once all the data has been written, the caller must call av_write_trailer() + * to flush any buffered packets and finalize the output file, then close the IO + * context (if any) and finally free the muxing context with + * avformat_free_context(). + * @} + * + * @defgroup lavf_io I/O Read/Write + * @{ + * @section lavf_io_dirlist Directory listing + * The directory listing API makes it possible to list files on remote servers. + * + * Some of possible use cases: + * - an "open file" dialog to choose files from a remote location, + * - a recursive media finder providing a player with an ability to play all + * files from a given directory. + * + * @subsection lavf_io_dirlist_open Opening a directory + * At first, a directory needs to be opened by calling avio_open_dir() + * supplied with a URL and, optionally, ::AVDictionary containing + * protocol-specific parameters. The function returns zero or positive + * integer and allocates AVIODirContext on success. + * + * @code + * AVIODirContext *ctx = NULL; + * if (avio_open_dir(&ctx, "smb://example.com/some_dir", NULL) < 0) { + * fprintf(stderr, "Cannot open directory.\n"); + * abort(); + * } + * @endcode + * + * This code tries to open a sample directory using smb protocol without + * any additional parameters. + * + * @subsection lavf_io_dirlist_read Reading entries + * Each directory's entry (i.e. file, another directory, anything else + * within ::AVIODirEntryType) is represented by AVIODirEntry. + * Reading consecutive entries from an opened AVIODirContext is done by + * repeatedly calling avio_read_dir() on it. Each call returns zero or + * positive integer if successful. Reading can be stopped right after the + * NULL entry has been read -- it means there are no entries left to be + * read. The following code reads all entries from a directory associated + * with ctx and prints their names to standard output. + * @code + * AVIODirEntry *entry = NULL; + * for (;;) { + * if (avio_read_dir(ctx, &entry) < 0) { + * fprintf(stderr, "Cannot list directory.\n"); + * abort(); + * } + * if (!entry) + * break; + * printf("%s\n", entry->name); + * avio_free_directory_entry(&entry); + * } + * @endcode + * @} + * + * @defgroup lavf_codec Demuxers + * @{ + * @defgroup lavf_codec_native Native Demuxers + * @{ + * @} + * @defgroup lavf_codec_wrappers External library wrappers + * @{ + * @} + * @} + * @defgroup lavf_protos I/O Protocols + * @{ + * @} + * @defgroup lavf_internal Internal + * @{ + * @} + * @} + */ + +#include +#include /* FILE */ +#include "libavcodec/avcodec.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "avio.h" +#include "libavformat/version.h" + +struct AVFormatContext; + +struct AVDeviceInfoList; +struct AVDeviceCapabilitiesQuery; + +/** + * @defgroup metadata_api Public Metadata API + * @{ + * @ingroup libavf + * The metadata API allows libavformat to export metadata tags to a client + * application when demuxing. Conversely it allows a client application to + * set metadata when muxing. + * + * Metadata is exported or set as pairs of key/value strings in the 'metadata' + * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs + * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg, + * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata + * exported by demuxers isn't checked to be valid UTF-8 in most cases. + * + * Important concepts to keep in mind: + * - Keys are unique; there can never be 2 tags with the same key. This is + * also meant semantically, i.e., a demuxer should not knowingly produce + * several keys that are literally different but semantically identical. + * E.g., key=Author5, key=Author6. In this example, all authors must be + * placed in the same tag. + * - Metadata is flat, not hierarchical; there are no subtags. If you + * want to store, e.g., the email address of the child of producer Alice + * and actor Bob, that could have key=alice_and_bobs_childs_email_address. + * - Several modifiers can be applied to the tag name. This is done by + * appending a dash character ('-') and the modifier name in the order + * they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng. + * - language -- a tag whose value is localized for a particular language + * is appended with the ISO 639-2/B 3-letter language code. + * For example: Author-ger=Michael, Author-eng=Mike + * The original/default language is in the unqualified "Author" tag. + * A demuxer should set a default if it sets any translated tag. + * - sorting -- a modified version of a tag that should be used for + * sorting will have '-sort' appended. E.g. artist="The Beatles", + * artist-sort="Beatles, The". + * - Some protocols and demuxers support metadata updates. After a successful + * call to av_read_packet(), AVFormatContext.event_flags or AVStream.event_flags + * will be updated to indicate if metadata changed. In order to detect metadata + * changes on a stream, you need to loop through all streams in the AVFormatContext + * and check their individual event_flags. + * + * - Demuxers attempt to export metadata in a generic format, however tags + * with no generic equivalents are left as they are stored in the container. + * Follows a list of generic tag names: + * + @verbatim + album -- name of the set this work belongs to + album_artist -- main creator of the set/album, if different from artist. + e.g. "Various Artists" for compilation albums. + artist -- main creator of the work + comment -- any additional description of the file. + composer -- who composed the work, if different from artist. + copyright -- name of copyright holder. + creation_time-- date when the file was created, preferably in ISO 8601. + date -- date when the work was created, preferably in ISO 8601. + disc -- number of a subset, e.g. disc in a multi-disc collection. + encoder -- name/settings of the software/hardware that produced the file. + encoded_by -- person/group who created the file. + filename -- original name of the file. + genre -- . + language -- main language in which the work is performed, preferably + in ISO 639-2 format. Multiple languages can be specified by + separating them with commas. + performer -- artist who performed the work, if different from artist. + E.g for "Also sprach Zarathustra", artist would be "Richard + Strauss" and performer "London Philharmonic Orchestra". + publisher -- name of the label/publisher. + service_name -- name of the service in broadcasting (channel name). + service_provider -- name of the service provider in broadcasting. + title -- name of the work. + track -- number of this work in the set, can be in form current/total. + variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of + @endverbatim + * + * Look in the examples section for an application example how to use the Metadata API. + * + * @} + */ + +/* packet functions */ + + +/** + * Allocate and read the payload of a packet and initialize its + * fields with default values. + * + * @param s associated IO context + * @param pkt packet + * @param size desired payload size + * @return >0 (read size) if OK, AVERROR_xxx otherwise + */ +int av_get_packet(AVIOContext *s, AVPacket *pkt, int size); + + +/** + * Read data and append it to the current content of the AVPacket. + * If pkt->size is 0 this is identical to av_get_packet. + * Note that this uses av_grow_packet and thus involves a realloc + * which is inefficient. Thus this function should only be used + * when there is no reasonable way to know (an upper bound of) + * the final size. + * + * @param s associated IO context + * @param pkt packet + * @param size amount of data to read + * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data + * will not be lost even if an error occurs. + */ +int av_append_packet(AVIOContext *s, AVPacket *pkt, int size); + +/*************************************************/ +/* input/output formats */ + +struct AVCodecTag; + +/** + * This structure contains the data a format has to probe a file. + */ +typedef struct AVProbeData { + const char *filename; + unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ + int buf_size; /**< Size of buf except extra allocated bytes */ + const char *mime_type; /**< mime_type, when known. */ +} AVProbeData; + +#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4) +#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1) + +#define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension +#define AVPROBE_SCORE_MIME 75 ///< score for file mime type +#define AVPROBE_SCORE_MAX 100 ///< maximum score + +#define AVPROBE_PADDING_SIZE 32 ///< extra allocated bytes at the end of the probe buffer + +/// Demuxer will use avio_open, no opened file should be provided by the caller. +#define AVFMT_NOFILE 0x0001 +#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */ +#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */ +#define AVFMT_GLOBALHEADER 0x0040 /**< Format wants global header. */ +#define AVFMT_NOTIMESTAMPS 0x0080 /**< Format does not need / have any timestamps. */ +#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */ +#define AVFMT_TS_DISCONT 0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */ +#define AVFMT_VARIABLE_FPS 0x0400 /**< Format allows variable fps. */ +#define AVFMT_NODIMENSIONS 0x0800 /**< Format does not need width/height */ +#define AVFMT_NOSTREAMS 0x1000 /**< Format does not require any streams */ +#define AVFMT_NOBINSEARCH 0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */ +#define AVFMT_NOGENSEARCH 0x4000 /**< Format does not allow to fall back on generic search */ +#define AVFMT_NO_BYTE_SEEK 0x8000 /**< Format does not allow seeking by bytes */ +#define AVFMT_ALLOW_FLUSH 0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */ +#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly + increasing timestamps, but they must + still be monotonic */ +#define AVFMT_TS_NEGATIVE 0x40000 /**< Format allows muxing negative + timestamps. If not set the timestamp + will be shifted in av_write_frame and + av_interleaved_write_frame so they + start from 0. + The user or muxer can override this through + AVFormatContext.avoid_negative_ts + */ + +#define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */ + +/** + * @addtogroup lavf_encoding + * @{ + */ +typedef struct AVOutputFormat { + const char *name; + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + const char *mime_type; + const char *extensions; /**< comma-separated filename extensions */ + /* output support */ + enum AVCodecID audio_codec; /**< default audio codec */ + enum AVCodecID video_codec; /**< default video codec */ + enum AVCodecID subtitle_codec; /**< default subtitle codec */ + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, + * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS, + * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, + * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE + */ + int flags; + + /** + * List of supported codec_id-codec_tag pairs, ordered by "better + * choice first". The arrays are all terminated by AV_CODEC_ID_NONE. + */ + const struct AVCodecTag * const *codec_tag; + + + const AVClass *priv_class; ///< AVClass for the private context + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + /** + * The ff_const59 define is not part of the public API and will + * be removed without further warning. + */ +#if FF_API_AVIOFORMAT +#define ff_const59 +#else +#define ff_const59 const +#endif + ff_const59 struct AVOutputFormat *next; + /** + * size of private data so that it can be allocated in the wrapper + */ + int priv_data_size; + + int (*write_header)(struct AVFormatContext *); + /** + * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags, + * pkt can be NULL in order to flush data buffered in the muxer. + * When flushing, return 0 if there still is more data to flush, + * or 1 if everything was flushed and there is no more buffered + * data. + */ + int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); + int (*write_trailer)(struct AVFormatContext *); + /** + * Currently only used to set pixel format if not YUV420P. + */ + int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, + AVPacket *in, int flush); + /** + * Test if the given codec can be stored in this container. + * + * @return 1 if the codec is supported, 0 if it is not. + * A negative number if unknown. + * MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC + */ + int (*query_codec)(enum AVCodecID id, int std_compliance); + + void (*get_output_timestamp)(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + /** + * Allows sending messages from application to device. + */ + int (*control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + + /** + * Write an uncoded AVFrame. + * + * See av_write_uncoded_frame() for details. + * + * The library will free *frame afterwards, but the muxer can prevent it + * by setting the pointer to NULL. + */ + int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index, + AVFrame **frame, unsigned flags); + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + enum AVCodecID data_codec; /**< default data codec */ + /** + * Initialize format. May allocate data here, and set any AVFormatContext or + * AVStream parameters that need to be set before packets are sent. + * This method must not write output. + * + * Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure + * + * Any allocations made here must be freed in deinit(). + */ + int (*init)(struct AVFormatContext *); + /** + * Deinitialize format. If present, this is called whenever the muxer is being + * destroyed, regardless of whether or not the header has been written. + * + * If a trailer is being written, this is called after write_trailer(). + * + * This is called if init() fails as well. + */ + void (*deinit)(struct AVFormatContext *); + /** + * Set up any necessary bitstream filtering and extract any extra data needed + * for the global header. + * Return 0 if more packets from this stream must be checked; 1 if not. + */ + int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt); +} AVOutputFormat; +/** + * @} + */ + +/** + * @addtogroup lavf_decoding + * @{ + */ +typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ + const char *name; + + /** + * Descriptive name for the format, meant to be more human-readable + * than name. You should use the NULL_IF_CONFIG_SMALL() macro + * to define it. + */ + const char *long_name; + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, + * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, + * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS. + */ + int flags; + + /** + * If extensions are defined, then no probe is done. You should + * usually not use extension format guessing because it is not + * reliable enough + */ + const char *extensions; + + const struct AVCodecTag * const *codec_tag; + + const AVClass *priv_class; ///< AVClass for the private context + + /** + * Comma-separated list of mime types. + * It is used check for matching mime types while probing. + * @see av_probe_input_format2 + */ + const char *mime_type; + + /***************************************************************** + * No fields below this line are part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + ff_const59 struct AVInputFormat *next; + + /** + * Raw demuxers store their codec ID here. + */ + int raw_codec_id; + + /** + * Size of private data so that it can be allocated in the wrapper. + */ + int priv_data_size; + + /** + * Tell if a given file has a chance of being parsed as this format. + * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes + * big so you do not have to check for that unless you need more. + */ + int (*read_probe)(const AVProbeData *); + + /** + * Read the format header and initialize the AVFormatContext + * structure. Return 0 if OK. 'avformat_new_stream' should be + * called to create new streams. + */ + int (*read_header)(struct AVFormatContext *); + + /** + * Read one packet and put it in 'pkt'. pts and flags are also + * set. 'avformat_new_stream' can be called only if the flag + * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a + * background thread). + * @return 0 on success, < 0 on error. + * When returning an error, pkt must not have been allocated + * or must be freed before returning + */ + int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); + + /** + * Close the stream. The AVFormatContext and AVStreams are not + * freed by this function + */ + int (*read_close)(struct AVFormatContext *); + + /** + * Seek to a given timestamp relative to the frames in + * stream component stream_index. + * @param stream_index Must not be -1. + * @param flags Selects which direction should be preferred if no exact + * match is available. + * @return >= 0 on success (but not necessarily the new offset) + */ + int (*read_seek)(struct AVFormatContext *, + int stream_index, int64_t timestamp, int flags); + + /** + * Get the next timestamp in stream[stream_index].time_base units. + * @return the timestamp or AV_NOPTS_VALUE if an error occurred + */ + int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, + int64_t *pos, int64_t pos_limit); + + /** + * Start/resume playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_play)(struct AVFormatContext *); + + /** + * Pause playing - only meaningful if using a network-based format + * (RTSP). + */ + int (*read_pause)(struct AVFormatContext *); + + /** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + */ + int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + + /** + * Returns device list with it properties. + * @see avdevice_list_devices() for more details. + */ + int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); + + /** + * Initialize device capabilities submodule. + * @see avdevice_capabilities_create() for more details. + */ + int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); + + /** + * Free device capabilities submodule. + * @see avdevice_capabilities_free() for more details. + */ + int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); +} AVInputFormat; +/** + * @} + */ + +enum AVStreamParseType { + AVSTREAM_PARSE_NONE, + AVSTREAM_PARSE_FULL, /**< full parsing and repack */ + AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */ + AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */ + AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */ + AVSTREAM_PARSE_FULL_RAW, /**< full parsing and repack with timestamp and position generation by parser for raw + this assumes that each packet in the file contains no demuxer level headers and + just codec level data, otherwise position generation would fail */ +}; + +typedef struct AVIndexEntry { + int64_t pos; + int64_t timestamp; /**< + * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available + * when seeking to this entry. That means preferable PTS on keyframe based formats. + * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better + * is known + */ +#define AVINDEX_KEYFRAME 0x0001 +#define AVINDEX_DISCARD_FRAME 0x0002 /** + * Flag is used to indicate which frame should be discarded after decoding. + */ + int flags:2; + int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment). + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */ +} AVIndexEntry; + +#define AV_DISPOSITION_DEFAULT 0x0001 +#define AV_DISPOSITION_DUB 0x0002 +#define AV_DISPOSITION_ORIGINAL 0x0004 +#define AV_DISPOSITION_COMMENT 0x0008 +#define AV_DISPOSITION_LYRICS 0x0010 +#define AV_DISPOSITION_KARAOKE 0x0020 + +/** + * Track should be used during playback by default. + * Useful for subtitle track that should be displayed + * even when user did not explicitly ask for subtitles. + */ +#define AV_DISPOSITION_FORCED 0x0040 +#define AV_DISPOSITION_HEARING_IMPAIRED 0x0080 /**< stream for hearing impaired audiences */ +#define AV_DISPOSITION_VISUAL_IMPAIRED 0x0100 /**< stream for visual impaired audiences */ +#define AV_DISPOSITION_CLEAN_EFFECTS 0x0200 /**< stream without voice */ +/** + * The stream is stored in the file as an attached picture/"cover art" (e.g. + * APIC frame in ID3v2). The first (usually only) packet associated with it + * will be returned among the first few packets read from the file unless + * seeking takes place. It can also be accessed at any time in + * AVStream.attached_pic. + */ +#define AV_DISPOSITION_ATTACHED_PIC 0x0400 +/** + * The stream is sparse, and contains thumbnail images, often corresponding + * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC. + */ +#define AV_DISPOSITION_TIMED_THUMBNAILS 0x0800 + +typedef struct AVStreamInternal AVStreamInternal; + +/** + * To specify text track kind (different from subtitles default). + */ +#define AV_DISPOSITION_CAPTIONS 0x10000 +#define AV_DISPOSITION_DESCRIPTIONS 0x20000 +#define AV_DISPOSITION_METADATA 0x40000 +#define AV_DISPOSITION_DEPENDENT 0x80000 ///< dependent audio stream (mix_type=0 in mpegts) +#define AV_DISPOSITION_STILL_IMAGE 0x100000 ///< still images in video stream (still_picture_flag=1 in mpegts) + +/** + * Options for behavior on timestamp wrap detection. + */ +#define AV_PTS_WRAP_IGNORE 0 ///< ignore the wrap +#define AV_PTS_WRAP_ADD_OFFSET 1 ///< add the format specific offset on wrap detection +#define AV_PTS_WRAP_SUB_OFFSET -1 ///< subtract the format specific offset on wrap detection + +/** + * Stream structure. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVStream) must not be used outside libav*. + */ +typedef struct AVStream { + int index; /**< stream index in AVFormatContext */ + /** + * Format-specific stream ID. + * decoding: set by libavformat + * encoding: set by the user, replaced by libavformat if left unset + */ + int id; +#if FF_API_LAVF_AVCTX + /** + * @deprecated use the codecpar struct instead + */ + attribute_deprecated + AVCodecContext *codec; +#endif + void *priv_data; + + /** + * This is the fundamental unit of time (in seconds) in terms + * of which frame timestamps are represented. + * + * decoding: set by libavformat + * encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the desired timebase. In + * avformat_write_header(), the muxer will overwrite this field + * with the timebase that will actually be used for the timestamps + * written into the file (which may or may not be related to the + * user-provided one, depending on the format). + */ + AVRational time_base; + + /** + * Decoding: pts of the first frame of the stream in presentation order, in stream time base. + * Only set this if you are absolutely 100% sure that the value you set + * it to really is the pts of the first frame. + * This may be undefined (AV_NOPTS_VALUE). + * @note The ASF header does NOT contain a correct start_time the ASF + * demuxer must NOT set this. + */ + int64_t start_time; + + /** + * Decoding: duration of the stream, in stream time base. + * If a source file does not specify a duration, but does specify + * a bitrate, this value will be estimated from bitrate and file size. + * + * Encoding: May be set by the caller before avformat_write_header() to + * provide a hint to the muxer about the estimated duration. + */ + int64_t duration; + + int64_t nb_frames; ///< number of frames in this stream if known or 0 + + int disposition; /**< AV_DISPOSITION_* bit field */ + + enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed. + + /** + * sample aspect ratio (0 if unknown) + * - encoding: Set by user. + * - decoding: Set by libavformat. + */ + AVRational sample_aspect_ratio; + + AVDictionary *metadata; + + /** + * Average framerate + * + * - demuxing: May be set by libavformat when creating the stream or in + * avformat_find_stream_info(). + * - muxing: May be set by the caller before avformat_write_header(). + */ + AVRational avg_frame_rate; + + /** + * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet + * will contain the attached picture. + * + * decoding: set by libavformat, must not be modified by the caller. + * encoding: unused + */ + AVPacket attached_pic; + + /** + * An array of side data that applies to the whole stream (i.e. the + * container does not allow it to change between packets). + * + * There may be no overlap between the side data in this array and side data + * in the packets. I.e. a given side data is either exported by the muxer + * (demuxing) / set by the caller (muxing) in this array, then it never + * appears in the packets, or the side data is exported / sent through + * the packets (always in the first packet where the value becomes known or + * changes), then it does not appear in this array. + * + * - demuxing: Set by libavformat when the stream is created. + * - muxing: May be set by the caller before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + * + * @see av_format_inject_global_side_data() + */ + AVPacketSideData *side_data; + /** + * The number of elements in the AVStream.side_data array. + */ + int nb_side_data; + + /** + * Flags for the user to detect events happening on the stream. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVSTREAM_EVENT_FLAG_*. + */ + int event_flags; +#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * Real base framerate of the stream. + * This is the lowest framerate with which all timestamps can be + * represented accurately (it is the least common multiple of all + * framerates in the stream). Note, this value is just a guess! + * For example, if the time base is 1/90000 and all frames have either + * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1. + */ + AVRational r_frame_rate; + +#if FF_API_LAVF_FFSERVER + /** + * String containing pairs of key and values describing recommended encoder configuration. + * Pairs are separated by ','. + * Keys are separated from values by '='. + * + * @deprecated unused + */ + attribute_deprecated + char *recommended_encoder_configuration; +#endif + + /** + * Codec parameters associated with this stream. Allocated and freed by + * libavformat in avformat_new_stream() and avformat_free_context() + * respectively. + * + * - demuxing: filled by libavformat on stream creation or in + * avformat_find_stream_info() + * - muxing: filled by the caller before avformat_write_header() + */ + AVCodecParameters *codecpar; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * Internal note: be aware that physically removing these fields + * will break ABI. Replace removed fields with dummy fields, and + * add new fields to AVStreamInternal. + ***************************************************************** + */ + +#define MAX_STD_TIMEBASES (30*12+30+3+6) + /** + * Stream information used internally by avformat_find_stream_info() + */ + struct { + int64_t last_dts; + int64_t duration_gcd; + int duration_count; + int64_t rfps_duration_sum; + double (*duration_error)[2][MAX_STD_TIMEBASES]; + int64_t codec_info_duration; + int64_t codec_info_duration_fields; + int frame_delay_evidence; + + /** + * 0 -> decoder has not been searched for yet. + * >0 -> decoder found + * <0 -> decoder with codec_id == -found_decoder has not been found + */ + int found_decoder; + + int64_t last_duration; + + /** + * Those are used for average framerate estimation. + */ + int64_t fps_first_dts; + int fps_first_dts_idx; + int64_t fps_last_dts; + int fps_last_dts_idx; + + } *info; + + int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */ + + // Timestamp generation support: + /** + * Timestamp corresponding to the last dts sync point. + * + * Initialized when AVCodecParserContext.dts_sync_point >= 0 and + * a DTS is received from the underlying container. Otherwise set to + * AV_NOPTS_VALUE by default. + */ + int64_t first_dts; + int64_t cur_dts; + int64_t last_IP_pts; + int last_IP_duration; + + /** + * Number of packets to buffer for codec probing + */ + int probe_packets; + + /** + * Number of frames that have been demuxed during avformat_find_stream_info() + */ + int codec_info_nb_frames; + + /* av_read_frame() support */ + enum AVStreamParseType need_parsing; + struct AVCodecParserContext *parser; + + /** + * last packet in packet_buffer for this stream when muxing. + */ + struct AVPacketList *last_in_packet_buffer; + AVProbeData probe_data; +#define MAX_REORDER_DELAY 16 + int64_t pts_buffer[MAX_REORDER_DELAY+1]; + + AVIndexEntry *index_entries; /**< Only used if the format does not + support seeking natively. */ + int nb_index_entries; + unsigned int index_entries_allocated_size; + + /** + * Stream Identifier + * This is the MPEG-TS stream identifier +1 + * 0 means unknown + */ + int stream_identifier; + + /** + * Details of the MPEG-TS program which created this stream. + */ + int program_num; + int pmt_version; + int pmt_stream_idx; + + int64_t interleaver_chunk_size; + int64_t interleaver_chunk_duration; + + /** + * stream probing state + * -1 -> probing finished + * 0 -> no probing requested + * rest -> perform probing with request_probe being the minimum score to accept. + * NOT PART OF PUBLIC API + */ + int request_probe; + /** + * Indicates that everything up to the next keyframe + * should be discarded. + */ + int skip_to_keyframe; + + /** + * Number of samples to skip at the start of the frame decoded from the next packet. + */ + int skip_samples; + + /** + * If not 0, the number of samples that should be skipped from the start of + * the stream (the samples are removed from packets with pts==0, which also + * assumes negative timestamps do not happen). + * Intended for use with formats such as mp3 with ad-hoc gapless audio + * support. + */ + int64_t start_skip_samples; + + /** + * If not 0, the first audio sample that should be discarded from the stream. + * This is broken by design (needs global sample count), but can't be + * avoided for broken by design formats such as mp3 with ad-hoc gapless + * audio support. + */ + int64_t first_discard_sample; + + /** + * The sample after last sample that is intended to be discarded after + * first_discard_sample. Works on frame boundaries only. Used to prevent + * early EOF if the gapless info is broken (considered concatenated mp3s). + */ + int64_t last_discard_sample; + + /** + * Number of internally decoded frames, used internally in libavformat, do not access + * its lifetime differs from info which is why it is not in that structure. + */ + int nb_decoded_frames; + + /** + * Timestamp offset added to timestamps before muxing + * NOT PART OF PUBLIC API + */ + int64_t mux_ts_offset; + + /** + * Internal data to check for wrapping of the time stamp + */ + int64_t pts_wrap_reference; + + /** + * Options for behavior, when a wrap is detected. + * + * Defined by AV_PTS_WRAP_ values. + * + * If correction is enabled, there are two possibilities: + * If the first time stamp is near the wrap point, the wrap offset + * will be subtracted, which will create negative time stamps. + * Otherwise the offset will be added. + */ + int pts_wrap_behavior; + + /** + * Internal data to prevent doing update_initial_durations() twice + */ + int update_initial_durations_done; + + /** + * Internal data to generate dts from pts + */ + int64_t pts_reorder_error[MAX_REORDER_DELAY+1]; + uint8_t pts_reorder_error_count[MAX_REORDER_DELAY+1]; + + /** + * Internal data to analyze DTS and detect faulty mpeg streams + */ + int64_t last_dts_for_order_check; + uint8_t dts_ordered; + uint8_t dts_misordered; + + /** + * Internal data to inject global side data + */ + int inject_global_side_data; + + /** + * display aspect ratio (0 if unknown) + * - encoding: unused + * - decoding: Set by libavformat to calculate sample_aspect_ratio internally + */ + AVRational display_aspect_ratio; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVStreamInternal *internal; +} AVStream; + +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVStream fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +AVRational av_stream_get_r_frame_rate(const AVStream *s); +attribute_deprecated +void av_stream_set_r_frame_rate(AVStream *s, AVRational r); +#if FF_API_LAVF_FFSERVER +attribute_deprecated +char* av_stream_get_recommended_encoder_configuration(const AVStream *s); +attribute_deprecated +void av_stream_set_recommended_encoder_configuration(AVStream *s, char *configuration); +#endif +#endif + +struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); + +/** + * Returns the pts of the last muxed packet + its duration + * + * the retuned value is undefined when used with a demuxer. + */ +int64_t av_stream_get_end_pts(const AVStream *st); + +#define AV_PROGRAM_RUNNING 1 + +/** + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVProgram) must not be used outside libav*. + */ +typedef struct AVProgram { + int id; + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; + AVDictionary *metadata; + + int program_num; + int pmt_pid; + int pcr_pid; + int pmt_version; + + /***************************************************************** + * All fields below this line are not part of the public API. They + * may not be used outside of libavformat and can be changed and + * removed at will. + * New public fields should be added right above. + ***************************************************************** + */ + int64_t start_time; + int64_t end_time; + + int64_t pts_wrap_reference; ///< reference dts for wrap detection + int pts_wrap_behavior; ///< behavior on wrap detection +} AVProgram; + +#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present + (streams are added dynamically) */ +#define AVFMTCTX_UNSEEKABLE 0x0002 /**< signal that the stream is definitely + not seekable, and attempts to call the + seek function will fail. For some + network protocols (e.g. HLS), this can + change dynamically at runtime. */ + +typedef struct AVChapter { + int id; ///< unique ID to identify the chapter + AVRational time_base; ///< time base in which the start/end timestamps are specified + int64_t start, end; ///< chapter start/end time in time_base units + AVDictionary *metadata; +} AVChapter; + + +/** + * Callback used by devices to communicate with application. + */ +typedef int (*av_format_control_message)(struct AVFormatContext *s, int type, + void *data, size_t data_size); + +typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * The duration of a video can be estimated through various ways, and this enum can be used + * to know how the duration was estimated. + */ +enum AVDurationEstimationMethod { + AVFMT_DURATION_FROM_PTS, ///< Duration accurately estimated from PTSes + AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration + AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate) +}; + +typedef struct AVFormatInternal AVFormatInternal; + +/** + * Format I/O context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVFormatContext) must not be used outside libav*, use + * avformat_alloc_context() to create an AVFormatContext. + * + * Fields can be accessed through AVOptions (av_opt*), + * the name string used matches the associated command line parameter name and + * can be found in libavformat/options_table.h. + * The AVOption/command line parameter names differ in some cases from the C + * structure field names for historic reasons or brevity. + */ +typedef struct AVFormatContext { + /** + * A class for logging and @ref avoptions. Set by avformat_alloc_context(). + * Exports (de)muxer private options if they exist. + */ + const AVClass *av_class; + + /** + * The input container format. + * + * Demuxing only, set by avformat_open_input(). + */ + ff_const59 struct AVInputFormat *iformat; + + /** + * The output container format. + * + * Muxing only, must be set by the caller before avformat_write_header(). + */ + ff_const59 struct AVOutputFormat *oformat; + + /** + * Format private data. This is an AVOptions-enabled struct + * if and only if iformat/oformat.priv_class is not NULL. + * + * - muxing: set by avformat_write_header() + * - demuxing: set by avformat_open_input() + */ + void *priv_data; + + /** + * I/O context. + * + * - demuxing: either set by the user before avformat_open_input() (then + * the user must close it manually) or set by avformat_open_input(). + * - muxing: set by the user before avformat_write_header(). The caller must + * take care of closing / freeing the IO context. + * + * Do NOT set this field if AVFMT_NOFILE flag is set in + * iformat/oformat.flags. In such a case, the (de)muxer will handle + * I/O in some other way and this field will be NULL. + */ + AVIOContext *pb; + + /* stream info */ + /** + * Flags signalling stream properties. A combination of AVFMTCTX_*. + * Set by libavformat. + */ + int ctx_flags; + + /** + * Number of elements in AVFormatContext.streams. + * + * Set by avformat_new_stream(), must not be modified by any other code. + */ + unsigned int nb_streams; + /** + * A list of all streams in the file. New streams are created with + * avformat_new_stream(). + * + * - demuxing: streams are created by libavformat in avformat_open_input(). + * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also + * appear in av_read_frame(). + * - muxing: streams are created by the user before avformat_write_header(). + * + * Freed by libavformat in avformat_free_context(). + */ + AVStream **streams; + +#if FF_API_FORMAT_FILENAME + /** + * input or output filename + * + * - demuxing: set by avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * @deprecated Use url instead. + */ + attribute_deprecated + char filename[1024]; +#endif + + /** + * input or output URL. Unlike the old filename field, this field has no + * length restriction. + * + * - demuxing: set by avformat_open_input(), initialized to an empty + * string if url parameter was NULL in avformat_open_input(). + * - muxing: may be set by the caller before calling avformat_write_header() + * (or avformat_init_output() if that is called first) to a string + * which is freeable by av_free(). Set to an empty string if it + * was NULL in avformat_init_output(). + * + * Freed by libavformat in avformat_free_context(). + */ + char *url; + + /** + * Position of the first frame of the component, in + * AV_TIME_BASE fractional seconds. NEVER set this value directly: + * It is deduced from the AVStream values. + * + * Demuxing only, set by libavformat. + */ + int64_t start_time; + + /** + * Duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also do not set any of them. This is deduced from the + * AVStream values if not set. + * + * Demuxing only, set by libavformat. + */ + int64_t duration; + + /** + * Total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ + int64_t bit_rate; + + unsigned int packet_size; + int max_delay; + + /** + * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*. + * Set by the user before avformat_open_input() / avformat_write_header(). + */ + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< Generate missing pts even if it requires parsing future frames. +#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index. +#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input. +#define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS +#define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container +#define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled +#define AVFMT_FLAG_NOBUFFER 0x0040 ///< Do not buffer frames when possible +#define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it. +#define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted +#define AVFMT_FLAG_FLUSH_PACKETS 0x0200 ///< Flush the AVIOContext every packet. +/** + * When muxing, try to avoid writing any random/volatile data to the output. + * This includes any random IDs, real-time timestamps/dates, muxer version, etc. + * + * This flag is mainly intended for testing. + */ +#define AVFMT_FLAG_BITEXACT 0x0400 +#if FF_API_LAVF_MP4A_LATM +#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Deprecated, does nothing. +#endif +#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down) +#define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted) +#if FF_API_LAVF_KEEPSIDE_FLAG +#define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Deprecated, does nothing. +#endif +#define AVFMT_FLAG_FAST_SEEK 0x80000 ///< Enable fast, but inaccurate seeks for some formats +#define AVFMT_FLAG_SHORTEST 0x100000 ///< Stop muxing when the shortest stream stops. +#define AVFMT_FLAG_AUTO_BSF 0x200000 ///< Add bitstream filters as requested by the muxer + + /** + * Maximum size of the data read from input for determining + * the input container format. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int64_t probesize; + + /** + * Maximum duration (in AV_TIME_BASE units) of the data read + * from input in avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + * Can be set to 0 to let avformat choose using a heuristic. + */ + int64_t max_analyze_duration; + + const uint8_t *key; + int keylen; + + unsigned int nb_programs; + AVProgram **programs; + + /** + * Forced video codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID video_codec_id; + + /** + * Forced audio codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID audio_codec_id; + + /** + * Forced subtitle codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID subtitle_codec_id; + + /** + * Maximum amount of memory in bytes to use for the index of each stream. + * If the index exceeds this size, entries will be discarded as + * needed to maintain a smaller size. This can lead to slower or less + * accurate seeking (depends on demuxer). + * Demuxers for which a full in-memory index is mandatory will ignore + * this. + * - muxing: unused + * - demuxing: set by user + */ + unsigned int max_index_size; + + /** + * Maximum amount of memory in bytes to use for buffering frames + * obtained from realtime capture devices. + */ + unsigned int max_picture_buffer; + + /** + * Number of chapters in AVChapter array. + * When muxing, chapters are normally written in the file header, + * so nb_chapters should normally be initialized before write_header + * is called. Some muxers (e.g. mov and mkv) can also write chapters + * in the trailer. To write chapters in the trailer, nb_chapters + * must be zero when write_header is called and non-zero when + * write_trailer is called. + * - muxing: set by user + * - demuxing: set by libavformat + */ + unsigned int nb_chapters; + AVChapter **chapters; + + /** + * Metadata that applies to the whole file. + * + * - demuxing: set by libavformat in avformat_open_input() + * - muxing: may be set by the caller before avformat_write_header() + * + * Freed by libavformat in avformat_free_context(). + */ + AVDictionary *metadata; + + /** + * Start time of the stream in real world time, in microseconds + * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the + * stream was captured at this real world time. + * - muxing: Set by the caller before avformat_write_header(). If set to + * either 0 or AV_NOPTS_VALUE, then the current wall-time will + * be used. + * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that + * the value may become known after some number of frames + * have been received. + */ + int64_t start_time_realtime; + + /** + * The number of frames used for determining the framerate in + * avformat_find_stream_info(). + * Demuxing only, set by the caller before avformat_find_stream_info(). + */ + int fps_probe_size; + + /** + * Error recognition; higher values will detect more errors but may + * misdetect some more or less valid parts as errors. + * Demuxing only, set by the caller before avformat_open_input(). + */ + int error_recognition; + + /** + * Custom interrupt callbacks for the I/O layer. + * + * demuxing: set by the user before avformat_open_input(). + * muxing: set by the user before avformat_write_header() + * (mainly useful for AVFMT_NOFILE formats). The callback + * should also be passed to avio_open2() if it's used to + * open the file. + */ + AVIOInterruptCB interrupt_callback; + + /** + * Flags to enable debugging. + */ + int debug; +#define FF_FDEBUG_TS 0x0001 + + /** + * Maximum buffering duration for interleaving. + * + * To ensure all the streams are interleaved correctly, + * av_interleaved_write_frame() will wait until it has at least one packet + * for each stream before actually writing any packets to the output file. + * When some streams are "sparse" (i.e. there are large gaps between + * successive packets), this can result in excessive buffering. + * + * This field specifies the maximum difference between the timestamps of the + * first and the last packet in the muxing queue, above which libavformat + * will output a packet regardless of whether it has queued a packet for all + * the streams. + * + * Muxing only, set by the caller before avformat_write_header(). + */ + int64_t max_interleave_delta; + + /** + * Allow non-standard and experimental extension + * @see AVCodecContext.strict_std_compliance + */ + int strict_std_compliance; + + /** + * Flags for the user to detect events happening on the file. Flags must + * be cleared by the user once the event has been handled. + * A combination of AVFMT_EVENT_FLAG_*. + */ + int event_flags; +#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata. + + /** + * Maximum number of packets to read while waiting for the first timestamp. + * Decoding only. + */ + int max_ts_probe; + + /** + * Avoid negative timestamps during muxing. + * Any value of the AVFMT_AVOID_NEG_TS_* constants. + * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use) + * - muxing: Set by user + * - demuxing: unused + */ + int avoid_negative_ts; +#define AVFMT_AVOID_NEG_TS_AUTO -1 ///< Enabled when required by target format +#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative +#define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 ///< Shift timestamps so that they start at 0 + + /** + * Transport stream id. + * This will be moved into demuxer private options. Thus no API/ABI compatibility + */ + int ts_id; + + /** + * Audio preload in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int audio_preload; + + /** + * Max chunk time in microseconds. + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_duration; + + /** + * Max chunk size in bytes + * Note, not all formats support this and unpredictable things may happen if it is used when not supported. + * - encoding: Set by user + * - decoding: unused + */ + int max_chunk_size; + + /** + * forces the use of wallclock timestamps as pts/dts of packets + * This has undefined results in the presence of B frames. + * - encoding: unused + * - decoding: Set by user + */ + int use_wallclock_as_timestamps; + + /** + * avio flags, used to force AVIO_FLAG_DIRECT. + * - encoding: unused + * - decoding: Set by user + */ + int avio_flags; + + /** + * The duration field can be estimated through various ways, and this field can be used + * to know how the duration was estimated. + * - encoding: unused + * - decoding: Read by user + */ + enum AVDurationEstimationMethod duration_estimation_method; + + /** + * Skip initial bytes when opening stream + * - encoding: unused + * - decoding: Set by user + */ + int64_t skip_initial_bytes; + + /** + * Correct single timestamp overflows + * - encoding: unused + * - decoding: Set by user + */ + unsigned int correct_ts_overflow; + + /** + * Force seeking to any (also non key) frames. + * - encoding: unused + * - decoding: Set by user + */ + int seek2any; + + /** + * Flush the I/O context after each packet. + * - encoding: Set by user + * - decoding: unused + */ + int flush_packets; + + /** + * format probing score. + * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes + * the format. + * - encoding: unused + * - decoding: set by avformat, read by user + */ + int probe_score; + + /** + * number of bytes to read maximally to identify format. + * - encoding: unused + * - decoding: set by user + */ + int format_probesize; + + /** + * ',' separated list of allowed decoders. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *codec_whitelist; + + /** + * ',' separated list of allowed demuxers. + * If NULL then all are allowed + * - encoding: unused + * - decoding: set by user + */ + char *format_whitelist; + + /** + * An opaque field for libavformat internal usage. + * Must not be accessed in any way by callers. + */ + AVFormatInternal *internal; + + /** + * IO repositioned flag. + * This is set by avformat when the underlaying IO context read pointer + * is repositioned, for example when doing byte based seeking. + * Demuxers can use the flag to detect such changes. + */ + int io_repositioned; + + /** + * Forced video codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *video_codec; + + /** + * Forced audio codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *audio_codec; + + /** + * Forced subtitle codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *subtitle_codec; + + /** + * Forced data codec. + * This allows forcing a specific decoder, even when there are multiple with + * the same codec_id. + * Demuxing: Set by user + */ + AVCodec *data_codec; + + /** + * Number of bytes to be written as padding in a metadata header. + * Demuxing: Unused. + * Muxing: Set by user via av_format_set_metadata_header_padding. + */ + int metadata_header_padding; + + /** + * User data. + * This is a place for some private data of the user. + */ + void *opaque; + + /** + * Callback used by devices to communicate with application. + */ + av_format_control_message control_message_cb; + + /** + * Output timestamp offset, in microseconds. + * Muxing: set by user + */ + int64_t output_ts_offset; + + /** + * dump format separator. + * can be ", " or "\n " or anything else + * - muxing: Set by user. + * - demuxing: Set by user. + */ + uint8_t *dump_separator; + + /** + * Forced Data codec_id. + * Demuxing: Set by user. + */ + enum AVCodecID data_codec_id; + +#if FF_API_OLD_OPEN_CALLBACKS + /** + * Called to open further IO contexts when needed for demuxing. + * + * This can be set by the user application to perform security checks on + * the URLs before opening them. + * The function should behave like avio_open2(), AVFormatContext is provided + * as contextual information and to reach AVFormatContext.opaque. + * + * If NULL then some simple checks are used together with avio_open2(). + * + * Must not be accessed directly from outside avformat. + * @See av_format_set_open_cb() + * + * Demuxing: Set by user. + * + * @deprecated Use io_open and io_close. + */ + attribute_deprecated + int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); +#endif + + /** + * ',' separated list of allowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_whitelist; + + /** + * A callback for opening new IO streams. + * + * Whenever a muxer or a demuxer needs to open an IO stream (typically from + * avformat_open_input() for demuxers, but for certain formats can happen at + * other times as well), it will call this callback to obtain an IO context. + * + * @param s the format context + * @param pb on success, the newly opened IO context should be returned here + * @param url the url to open + * @param flags a combination of AVIO_FLAG_* + * @param options a dictionary of additional options, with the same + * semantics as in avio_open2() + * @return 0 on success, a negative AVERROR code on failure + * + * @note Certain muxers and demuxers do nesting, i.e. they open one or more + * additional internal format contexts. Thus the AVFormatContext pointer + * passed to this callback may be different from the one facing the caller. + * It will, however, have the same 'opaque' field. + */ + int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, + int flags, AVDictionary **options); + + /** + * A callback for closing the streams opened with AVFormatContext.io_open(). + */ + void (*io_close)(struct AVFormatContext *s, AVIOContext *pb); + + /** + * ',' separated list of disallowed protocols. + * - encoding: unused + * - decoding: set by user + */ + char *protocol_blacklist; + + /** + * The maximum number of streams. + * - encoding: unused + * - decoding: set by user + */ + int max_streams; + + /** + * Skip duration calcuation in estimate_timings_from_pts. + * - encoding: unused + * - decoding: set by user + */ + int skip_estimate_duration_from_pts; +} AVFormatContext; + +#if FF_API_FORMAT_GET_SET +/** + * Accessors for some AVFormatContext fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +int av_format_get_probe_score(const AVFormatContext *s); +attribute_deprecated +AVCodec * av_format_get_video_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_video_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_audio_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +AVCodec * av_format_get_data_codec(const AVFormatContext *s); +attribute_deprecated +void av_format_set_data_codec(AVFormatContext *s, AVCodec *c); +attribute_deprecated +int av_format_get_metadata_header_padding(const AVFormatContext *s); +attribute_deprecated +void av_format_set_metadata_header_padding(AVFormatContext *s, int c); +attribute_deprecated +void * av_format_get_opaque(const AVFormatContext *s); +attribute_deprecated +void av_format_set_opaque(AVFormatContext *s, void *opaque); +attribute_deprecated +av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); +attribute_deprecated +void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); +#if FF_API_OLD_OPEN_CALLBACKS +attribute_deprecated AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); +attribute_deprecated void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); +#endif +#endif + +/** + * This function will cause global side data to be injected in the next packet + * of each stream as well as after any subsequent seek. + */ +void av_format_inject_global_side_data(AVFormatContext *s); + +/** + * Returns the method used to set ctx->duration. + * + * @return AVFMT_DURATION_FROM_PTS, AVFMT_DURATION_FROM_STREAM, or AVFMT_DURATION_FROM_BITRATE. + */ +enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); + +typedef struct AVPacketList { + AVPacket pkt; + struct AVPacketList *next; +} AVPacketList; + + +/** + * @defgroup lavf_core Core functions + * @ingroup libavf + * + * Functions for querying libavformat capabilities, allocating core structures, + * etc. + * @{ + */ + +/** + * Return the LIBAVFORMAT_VERSION_INT constant. + */ +unsigned avformat_version(void); + +/** + * Return the libavformat build-time configuration. + */ +const char *avformat_configuration(void); + +/** + * Return the libavformat license. + */ +const char *avformat_license(void); + +#if FF_API_NEXT +/** + * Initialize libavformat and register all the muxers, demuxers and + * protocols. If you do not call this function, then you can select + * exactly which formats you want to support. + * + * @see av_register_input_format() + * @see av_register_output_format() + */ +attribute_deprecated +void av_register_all(void); + +attribute_deprecated +void av_register_input_format(AVInputFormat *format); +attribute_deprecated +void av_register_output_format(AVOutputFormat *format); +#endif + +/** + * Do global initialization of network libraries. This is optional, + * and not recommended anymore. + * + * This functions only exists to work around thread-safety issues + * with older GnuTLS or OpenSSL libraries. If libavformat is linked + * to newer versions of those libraries, or if you do not use them, + * calling this function is unnecessary. Otherwise, you need to call + * this function before any other threads using them are started. + * + * This function will be deprecated once support for older GnuTLS and + * OpenSSL libraries is removed, and this function has no purpose + * anymore. + */ +int avformat_network_init(void); + +/** + * Undo the initialization done by avformat_network_init. Call it only + * once for each time you called avformat_network_init. + */ +int avformat_network_deinit(void); + +#if FF_API_NEXT +/** + * If f is NULL, returns the first registered input format, + * if f is non-NULL, returns the next registered input format after f + * or NULL if f is the last one. + */ +attribute_deprecated +AVInputFormat *av_iformat_next(const AVInputFormat *f); + +/** + * If f is NULL, returns the first registered output format, + * if f is non-NULL, returns the next registered output format after f + * or NULL if f is the last one. + */ +attribute_deprecated +AVOutputFormat *av_oformat_next(const AVOutputFormat *f); +#endif + +/** + * Iterate over all registered muxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered muxer or NULL when the iteration is + * finished + */ +const AVOutputFormat *av_muxer_iterate(void **opaque); + +/** + * Iterate over all registered demuxers. + * + * @param opaque a pointer where libavformat will store the iteration state. Must + * point to NULL to start the iteration. + * + * @return the next registered demuxer or NULL when the iteration is + * finished + */ +const AVInputFormat *av_demuxer_iterate(void **opaque); + +/** + * Allocate an AVFormatContext. + * avformat_free_context() can be used to free the context and everything + * allocated by the framework within it. + */ +AVFormatContext *avformat_alloc_context(void); + +/** + * Free an AVFormatContext and all its streams. + * @param s context to free + */ +void avformat_free_context(AVFormatContext *s); + +/** + * Get the AVClass for AVFormatContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *avformat_get_class(void); + +/** + * Add a new stream to a media file. + * + * When demuxing, it is called by the demuxer in read_header(). If the + * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also + * be called in read_packet(). + * + * When muxing, should be called by the user before avformat_write_header(). + * + * User is required to call avcodec_close() and avformat_free_context() to + * clean up the allocation by avformat_new_stream(). + * + * @param s media file handle + * @param c If non-NULL, the AVCodecContext corresponding to the new stream + * will be initialized to use this codec. This is needed for e.g. codec-specific + * defaults to be set, so codec should be provided if it is known. + * + * @return newly created stream or NULL on error. + */ +AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); + +/** + * Wrap an existing array as stream side data. + * + * @param st stream + * @param type side information type + * @param data the side data array. It must be allocated with the av_malloc() + * family of functions. The ownership of the data is transferred to + * st. + * @param size side information size + * @return zero on success, a negative AVERROR code on failure. On failure, + * the stream is unchanged and the data remains owned by the caller. + */ +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size); + +/** + * Allocate new information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size side information size + * @return pointer to fresh allocated data or NULL otherwise + */ +uint8_t *av_stream_new_side_data(AVStream *stream, + enum AVPacketSideDataType type, int size); +/** + * Get side information from stream. + * + * @param stream stream + * @param type desired side information type + * @param size pointer for side information size to store (optional) + * @return pointer to data if present or NULL otherwise + */ +uint8_t *av_stream_get_side_data(const AVStream *stream, + enum AVPacketSideDataType type, int *size); + +AVProgram *av_new_program(AVFormatContext *s, int id); + +/** + * @} + */ + + +/** + * Allocate an AVFormatContext for an output format. + * avformat_free_context() can be used to free the context and + * everything allocated by the framework within it. + * + * @param *ctx is set to the created format context, or to NULL in + * case of failure + * @param oformat format to use for allocating the context, if NULL + * format_name and filename are used instead + * @param format_name the name of output format to use for allocating the + * context, if NULL filename is used instead + * @param filename the name of the filename to use for allocating the + * context, may be NULL + * @return >= 0 in case of success, a negative AVERROR code in case of + * failure + */ +int avformat_alloc_output_context2(AVFormatContext **ctx, ff_const59 AVOutputFormat *oformat, + const char *format_name, const char *filename); + +/** + * @addtogroup lavf_decoding + * @{ + */ + +/** + * Find AVInputFormat based on the short name of the input format. + */ +ff_const59 AVInputFormat *av_find_input_format(const char *short_name); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + */ +ff_const59 AVInputFormat *av_probe_input_format(ff_const59 AVProbeData *pd, int is_opened); + +/** + * Guess the file format. + * + * @param pd data to be probed + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_max A probe score larger that this is required to accept a + * detection, the variable is set to the actual detection + * score afterwards. + * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended + * to retry with a larger probe buffer. + */ +ff_const59 AVInputFormat *av_probe_input_format2(ff_const59 AVProbeData *pd, int is_opened, int *score_max); + +/** + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_ret The score of the best detection. + */ +ff_const59 AVInputFormat *av_probe_input_format3(ff_const59 AVProbeData *pd, int is_opened, int *score_ret); + +/** + * Probe a bytestream to determine the input format. Each time a probe returns + * with a score that is too low, the probe buffer size is increased and another + * attempt is made. When the maximum probe size is reached, the input format + * with the highest score is returned. + * + * @param pb the bytestream to probe + * @param fmt the input format is put here + * @param url the url of the stream + * @param logctx the log context + * @param offset the offset within the bytestream to probe from + * @param max_probe_size the maximum probe buffer size (zero for default) + * @return the score in case of success, a negative value corresponding to an + * the maximal score is AVPROBE_SCORE_MAX + * AVERROR code otherwise + */ +int av_probe_input_buffer2(AVIOContext *pb, ff_const59 AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Like av_probe_input_buffer2() but returns 0 on success + */ +int av_probe_input_buffer(AVIOContext *pb, ff_const59 AVInputFormat **fmt, + const char *url, void *logctx, + unsigned int offset, unsigned int max_probe_size); + +/** + * Open an input stream and read the header. The codecs are not opened. + * The stream must be closed with avformat_close_input(). + * + * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context). + * May be a pointer to NULL, in which case an AVFormatContext is allocated by this + * function and written into ps. + * Note that a user-supplied AVFormatContext will be freed on failure. + * @param url URL of the stream to open. + * @param fmt If non-NULL, this parameter forces a specific input format. + * Otherwise the format is autodetected. + * @param options A dictionary filled with AVFormatContext and demuxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return 0 on success, a negative AVERROR on failure. + * + * @note If you want to use custom IO, preallocate the format context and set its pb field. + */ +int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); + +attribute_deprecated +int av_demuxer_open(AVFormatContext *ic); + +/** + * Read packets of a media file to get stream information. This + * is useful for file formats with no headers such as MPEG. This + * function also computes the real framerate in case of MPEG-2 repeat + * frame mode. + * The logical file position is not changed by this function; + * examined packets may be buffered for later processing. + * + * @param ic media file handle + * @param options If non-NULL, an ic.nb_streams long array of pointers to + * dictionaries, where i-th member contains options for + * codec corresponding to i-th stream. + * On return each dictionary will be filled with options that were not found. + * @return >=0 if OK, AVERROR_xxx on error + * + * @note this function isn't guaranteed to open all the codecs, so + * options being non-empty at return is a perfectly normal behavior. + * + * @todo Let the user decide somehow what information is needed so that + * we do not waste time getting stuff the user does not need. + */ +int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options); + +/** + * Find the programs which belong to a given stream. + * + * @param ic media file handle + * @param last the last found program, the search will start after this + * program, or from the beginning if it is NULL + * @param s stream index + * @return the next program which belongs to s, NULL if no program is found or + * the last program is not among the programs of ic. + */ +AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s); + +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx); + +/** + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + */ +int av_find_best_stream(AVFormatContext *ic, + enum AVMediaType type, + int wanted_stream_nb, + int related_stream, + AVCodec **decoder_ret, + int flags); + +/** + * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. + * + * If pkt->buf is NULL, then the packet is valid until the next + * av_read_frame() or until avformat_close_input(). Otherwise the packet + * is valid indefinitely. In both cases the packet must be freed with + * av_packet_unref when it is no longer needed. For video, the packet contains + * exactly one frame. For audio, it contains an integer number of frames if each + * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames + * have a variable size (e.g. MPEG audio), then it contains one frame. + * + * pkt->pts, pkt->dts and pkt->duration are always set to correct + * values in AVStream.time_base units (and guessed if the format cannot + * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format + * has B-frames, so it is better to rely on pkt->dts if you do not + * decompress the payload. + * + * @return 0 if OK, < 0 on error or end of file + */ +int av_read_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Seek to the keyframe at timestamp. + * 'timestamp' in 'stream_index'. + * + * @param s media file handle + * @param stream_index If stream_index is (-1), a default + * stream is selected, and timestamp is automatically converted + * from AV_TIME_BASE units to the stream specific time_base. + * @param timestamp Timestamp in AVStream.time_base units + * or, if no stream is specified, in AV_TIME_BASE units. + * @param flags flags which select direction and seeking mode + * @return >= 0 on success + */ +int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, + int flags); + +/** + * Seek to timestamp ts. + * Seeking will be done so that the point from which all active streams + * can be presented successfully will be closest to ts and within min/max_ts. + * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL. + * + * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and + * are the file position (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames + * in the stream with stream_index (this may not be supported by all demuxers). + * Otherwise all timestamps are in units of the stream selected by stream_index + * or if stream_index is -1, in AV_TIME_BASE units. + * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as + * keyframes (this may not be supported by all demuxers). + * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored. + * + * @param s media file handle + * @param stream_index index of the stream which is used as time base reference + * @param min_ts smallest acceptable timestamp + * @param ts target timestamp + * @param max_ts largest acceptable timestamp + * @param flags flags + * @return >=0 on success, error code otherwise + * + * @note This is part of the new seek API which is still under construction. + * Thus do not use this yet. It may change at any time, do not expect + * ABI compatibility yet! + */ +int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); + +/** + * Discard all internally buffered data. This can be useful when dealing with + * discontinuities in the byte stream. Generally works only with formats that + * can resync. This includes headerless formats like MPEG-TS/TS but should also + * work with NUT, Ogg and in a limited way AVI for example. + * + * The set of streams, the detected duration, stream parameters and codecs do + * not change when calling this function. If you want a complete reset, it's + * better to open a new AVFormatContext. + * + * This does not flush the AVIOContext (s->pb). If necessary, call + * avio_flush(s->pb) before calling this function. + * + * @param s media file handle + * @return >=0 on success, error code otherwise + */ +int avformat_flush(AVFormatContext *s); + +/** + * Start playing a network-based stream (e.g. RTSP stream) at the + * current position. + */ +int av_read_play(AVFormatContext *s); + +/** + * Pause a network-based stream (e.g. RTSP stream). + * + * Use av_read_play() to resume it. + */ +int av_read_pause(AVFormatContext *s); + +/** + * Close an opened input AVFormatContext. Free it and all its contents + * and set *s to NULL. + */ +void avformat_close_input(AVFormatContext **s); +/** + * @} + */ + +#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward +#define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +#define AVSEEK_FLAG_ANY 4 ///< seek to any frame, even non-keyframes +#define AVSEEK_FLAG_FRAME 8 ///< seeking based on frame number + +/** + * @addtogroup lavf_encoding + * @{ + */ + +#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header +#define AVSTREAM_INIT_IN_INIT_OUTPUT 1 ///< stream parameters initialized in avformat_init_output + +/** + * Allocate the stream private data and write the stream header to + * an output media file. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec had not already been fully initialized in avformat_init, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec had already been fully initialized in avformat_init, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output. + */ +av_warn_unused_result +int avformat_write_header(AVFormatContext *s, AVDictionary **options); + +/** + * Allocate the stream private data and initialize the codec, but do not write the header. + * May optionally be used before avformat_write_header to initialize stream parameters + * before actually writing the header. + * If using this function, do not pass the same options to avformat_write_header. + * + * @param s Media file handle, must be allocated with avformat_alloc_context(). + * Its oformat field must be set to the desired output format; + * Its pb field must be set to an already opened AVIOContext. + * @param options An AVDictionary filled with AVFormatContext and muxer-private options. + * On return this parameter will be destroyed and replaced with a dict containing + * options that were not found. May be NULL. + * + * @return AVSTREAM_INIT_IN_WRITE_HEADER on success if the codec requires avformat_write_header to fully initialize, + * AVSTREAM_INIT_IN_INIT_OUTPUT on success if the codec has been fully initialized, + * negative AVERROR on failure. + * + * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header. + */ +av_warn_unused_result +int avformat_init_output(AVFormatContext *s, AVDictionary **options); + +/** + * Write a packet to an output media file. + * + * This function passes the packet directly to the muxer, without any buffering + * or reordering. The caller is responsible for correctly interleaving the + * packets if the format requires it. Callers that want libavformat to handle + * the interleaving should call av_interleaved_write_frame() instead of this + * function. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. Note that unlike + * av_interleaved_write_frame(), this function does not take + * ownership of the packet passed to it (though some muxers may make + * an internal reference to the input packet). + *
+ * This parameter can be NULL (at any time, not just at the end), in + * order to immediately flush data buffered within the muxer, for + * muxers that buffer up data internally before writing it to the + * output. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets passed to this function must be strictly + * increasing when compared in their respective timebases (unless the + * output format is flagged with the AVFMT_TS_NONSTRICT, then they + * merely have to be nondecreasing). @ref AVPacket.duration + * "duration") should also be set if known. + * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush + * + * @see av_interleaved_write_frame() + */ +int av_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write a packet to an output media file ensuring correct interleaving. + * + * This function will buffer the packets internally as needed to make sure the + * packets in the output file are properly interleaved in the order of + * increasing dts. Callers doing their own interleaving should call + * av_write_frame() instead of this function. + * + * Using this function instead of av_write_frame() can give muxers advance + * knowledge of future packets, improving e.g. the behaviour of the mp4 + * muxer for VFR content in fragmenting mode. + * + * @param s media file handle + * @param pkt The packet containing the data to be written. + *
+ * If the packet is reference-counted, this function will take + * ownership of this reference and unreference it later when it sees + * fit. + * The caller must not access the data through this reference after + * this function returns. If the packet is not reference-counted, + * libavformat will make a copy. + *
+ * This parameter can be NULL (at any time, not just at the end), to + * flush the interleaving queues. + *
+ * Packet's @ref AVPacket.stream_index "stream_index" field must be + * set to the index of the corresponding stream in @ref + * AVFormatContext.streams "s->streams". + *
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts") + * must be set to correct values in the stream's timebase (unless the + * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then + * they can be set to AV_NOPTS_VALUE). + * The dts for subsequent packets in one stream must be strictly + * increasing (unless the output format is flagged with the + * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing). + * @ref AVPacket.duration "duration") should also be set if known. + * + * @return 0 on success, a negative AVERROR on error. Libavformat will always + * take care of freeing the packet, even if this function fails. + * + * @see av_write_frame(), AVFormatContext.max_interleave_delta + */ +int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); + +/** + * Write an uncoded frame to an output media file. + * + * The frame must be correctly interleaved according to the container + * specification; if not, then av_interleaved_write_frame() must be used. + * + * See av_interleaved_write_frame() for details. + */ +int av_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Write an uncoded frame to an output media file. + * + * If the muxer supports it, this function makes it possible to write an AVFrame + * structure directly, without encoding it into a packet. + * It is mostly useful for devices and similar special muxers that use raw + * video or PCM data and will not serialize it into a byte stream. + * + * To test whether it is possible to use it with a given muxer and stream, + * use av_write_uncoded_frame_query(). + * + * The caller gives up ownership of the frame and must not access it + * afterwards. + * + * @return >=0 for success, a negative code on error + */ +int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index, + AVFrame *frame); + +/** + * Test whether a muxer supports uncoded frame. + * + * @return >=0 if an uncoded frame can be written to that muxer and stream, + * <0 if not + */ +int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index); + +/** + * Write the stream trailer to an output media file and free the + * file private data. + * + * May only be called after a successful call to avformat_write_header. + * + * @param s media file handle + * @return 0 if OK, AVERROR_xxx on error + */ +int av_write_trailer(AVFormatContext *s); + +/** + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if + * there is no match. + * + * @param short_name if non-NULL checks if short_name matches with the + * names of the registered formats + * @param filename if non-NULL checks if filename terminates with the + * extensions of the registered formats + * @param mime_type if non-NULL checks if mime_type matches with the + * MIME type of the registered formats + */ +ff_const59 AVOutputFormat *av_guess_format(const char *short_name, + const char *filename, + const char *mime_type); + +/** + * Guess the codec ID based upon muxer and filename. + */ +enum AVCodecID av_guess_codec(ff_const59 AVOutputFormat *fmt, const char *short_name, + const char *filename, const char *mime_type, + enum AVMediaType type); + +/** + * Get timing information for the data currently output. + * The exact meaning of "currently output" depends on the format. + * It is mostly relevant for devices that have an internal buffer and/or + * work in real time. + * @param s media file handle + * @param stream stream in the media file + * @param[out] dts DTS of the last packet output for the stream, in stream + * time_base units + * @param[out] wall absolute time when that packet whas output, + * in microsecond + * @return 0 if OK, AVERROR(ENOSYS) if the format does not support it + * Note: some formats or devices may not allow to measure dts and wall + * atomically. + */ +int av_get_output_timestamp(struct AVFormatContext *s, int stream, + int64_t *dts, int64_t *wall); + + +/** + * @} + */ + + +/** + * @defgroup lavf_misc Utility functions + * @ingroup libavf + * @{ + * + * Miscellaneous utility functions related to both muxing and demuxing + * (or neither). + */ + +/** + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump(FILE *f, const uint8_t *buf, int size); + +/** + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2 + */ +void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size); + +/** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st); + + +/** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload True if the payload must be displayed, too. + * @param st AVStream that the packet belongs to + */ +void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload, + const AVStream *st); + +/** + * Get the AVCodecID for the given codec tag tag. + * If no codec id is found returns AV_CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param tag codec tag to match to a codec ID + */ +enum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); + +/** + * Get the codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec ID to match to a codec tag + */ +unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id); + +/** + * Get the codec tag for the given codec id. + * + * @param tags list of supported codec_id - codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + * @param id codec id that should be searched for in the list + * @param tag A pointer to the found tag + * @return 0 if id was not found in tags, > 0 if it was found + */ +int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id, + unsigned int *tag); + +int av_find_default_stream_index(AVFormatContext *s); + +/** + * Get the index for a specific timestamp. + * + * @param st stream that the timestamp belongs to + * @param timestamp timestamp to retrieve the index for + * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond + * to the timestamp which is <= the requested one, if backward + * is 0, then it will be >= + * if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise + * @return < 0 if no such timestamp could be found + */ +int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); + +/** + * Add an index entry into a sorted list. Update the entry if the list + * already contains it. + * + * @param timestamp timestamp in the time base of the given stream + */ +int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, + int size, int distance, int flags); + + +/** + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + */ +void av_url_split(char *proto, int proto_size, + char *authorization, int authorization_size, + char *hostname, int hostname_size, + int *port_ptr, + char *path, int path_size, + const char *url); + + +/** + * Print detailed information about the input or output format, such as + * duration, bitrate, streams, container, programs, metadata, side data, + * codec and time base. + * + * @param ic the context to analyze + * @param index index of the stream to dump information about + * @param url the URL to print, such as source or destination file + * @param is_output Select whether the specified context is an input(0) or output(1) + */ +void av_dump_format(AVFormatContext *ic, + int index, + const char *url, + int is_output); + + +#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d + +/** + * Return in 'buf' the path with '%d' replaced by a number. + * + * Also handles the '%0nd' format where 'n' is the total number + * of digits and '%%'. + * + * @param buf destination buffer + * @param buf_size destination buffer size + * @param path numbered sequence string + * @param number frame number + * @param flags AV_FRAME_FILENAME_FLAGS_* + * @return 0 if OK, -1 on format error + */ +int av_get_frame_filename2(char *buf, int buf_size, + const char *path, int number, int flags); + +int av_get_frame_filename(char *buf, int buf_size, + const char *path, int number); + +/** + * Check whether filename actually is a numbered sequence generator. + * + * @param filename possible numbered sequence string + * @return 1 if a valid numbered sequence string, 0 otherwise + */ +int av_filename_number_test(const char *filename); + +/** + * Generate an SDP for an RTP session. + * + * Note, this overwrites the id values of AVStreams in the muxer contexts + * for getting unique dynamic payload types. + * + * @param ac array of AVFormatContexts describing the RTP streams. If the + * array is composed by only one context, such context can contain + * multiple AVStreams (one AVStream per RTP stream). Otherwise, + * all the contexts in the array (an AVCodecContext per RTP stream) + * must contain only one AVStream. + * @param n_files number of AVCodecContexts contained in ac + * @param buf buffer where the SDP will be stored (must be allocated by + * the caller) + * @param size the size of the buffer + * @return 0 if OK, AVERROR_xxx on error + */ +int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size); + +/** + * Return a positive value if the given filename has one of the given + * extensions, 0 otherwise. + * + * @param filename file name to check against the given extensions + * @param extensions a comma-separated list of filename extensions + */ +int av_match_ext(const char *filename, const char *extensions); + +/** + * Test if the given container can store a codec. + * + * @param ofmt container to check for compatibility + * @param codec_id codec to potentially store in container + * @param std_compliance standards compliance level, one of FF_COMPLIANCE_* + * + * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot. + * A negative number if this information is not available. + */ +int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id, + int std_compliance); + +/** + * @defgroup riff_fourcc RIFF FourCCs + * @{ + * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are + * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the + * following code: + * @code + * uint32_t tag = MKTAG('H', '2', '6', '4'); + * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 }; + * enum AVCodecID id = av_codec_get_id(table, tag); + * @endcode + */ +/** + * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_video_tags(void); +/** + * @return the table mapping RIFF FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_riff_audio_tags(void); +/** + * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_video_tags(void); +/** + * @return the table mapping MOV FourCCs for audio to AVCodecID. + */ +const struct AVCodecTag *avformat_get_mov_audio_tags(void); + +/** + * @} + */ + +/** + * Guess the sample aspect ratio of a frame, based on both the stream and the + * frame aspect ratio. + * + * Since the frame aspect ratio is set by the codec but the stream aspect ratio + * is set by the demuxer, these two may not be equal. This function tries to + * return the value that you should use if you would like to display the frame. + * + * Basic logic is to use the stream aspect ratio if it is set to something sane + * otherwise use the frame aspect ratio. This way a container setting, which is + * usually easy to modify can override the coded value in the frames. + * + * @param format the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame with the aspect ratio to be determined + * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea + */ +AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame); + +/** + * Guess the frame rate, based on both the container and codec information. + * + * @param ctx the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame for which the frame rate should be determined, may be NULL + * @return the guessed (valid) frame rate, 0/1 if no idea + */ +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame); + +/** + * Check if the stream st contained in s is matched by the stream specifier + * spec. + * + * See the "stream specifiers" chapter in the documentation for the syntax + * of spec. + * + * @return >0 if st is matched by spec; + * 0 if st is not matched by spec; + * AVERROR code if spec is invalid + * + * @note A stream specifier can match several streams in the format. + */ +int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, + const char *spec); + +int avformat_queue_attached_pictures(AVFormatContext *s); + +#if FF_API_OLD_BSF +/** + * Apply a list of bitstream filters to a packet. + * + * @param codec AVCodecContext, usually from an AVStream + * @param pkt the packet to apply filters to. If, on success, the returned + * packet has size == 0 and side_data_elems == 0, it indicates that + * the packet should be dropped + * @param bsfc a NULL-terminated list of filters to apply + * @return >=0 on success; + * AVERROR code on failure + */ +attribute_deprecated +int av_apply_bitstream_filters(AVCodecContext *codec, AVPacket *pkt, + AVBitStreamFilterContext *bsfc); +#endif + +enum AVTimebaseSource { + AVFMT_TBCF_AUTO = -1, + AVFMT_TBCF_DECODER, + AVFMT_TBCF_DEMUXER, +#if FF_API_R_FRAME_RATE + AVFMT_TBCF_R_FRAMERATE, +#endif +}; + +/** + * Transfer internal timing information from one stream to another. + * + * This function is useful when doing stream copy. + * + * @param ofmt target output format for ost + * @param ost output stream which needs timings copy and adjustments + * @param ist reference input stream to copy timings from + * @param copy_tb define from where the stream codec timebase needs to be imported + */ +int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt, + AVStream *ost, const AVStream *ist, + enum AVTimebaseSource copy_tb); + +/** + * Get the internal codec timebase from a stream. + * + * @param st input stream to extract the timebase from + */ +AVRational av_stream_get_codec_timebase(const AVStream *st); + +/** + * @} + */ + +#endif /* AVFORMAT_AVFORMAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avio.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avio.h new file mode 100644 index 0000000..dcb8dcd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/avio.h @@ -0,0 +1,861 @@ +/* + * copyright (c) 2001 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 + */ +#ifndef AVFORMAT_AVIO_H +#define AVFORMAT_AVIO_H + +/** + * @file + * @ingroup lavf_io + * Buffered I/O operations + */ + +#include + +#include "libavutil/common.h" +#include "libavutil/dict.h" +#include "libavutil/log.h" + +#include "libavformat/version.h" + +/** + * Seeking works like for a local file. + */ +#define AVIO_SEEKABLE_NORMAL (1 << 0) + +/** + * Seeking by timestamp with avio_seek_time() is possible. + */ +#define AVIO_SEEKABLE_TIME (1 << 1) + +/** + * Callback for checking whether to abort blocking functions. + * AVERROR_EXIT is returned in this case by the interrupted + * function. During blocking operations, callback is called with + * opaque as parameter. If the callback returns 1, the + * blocking operation will be aborted. + * + * No members can be added to this struct without a major bump, if + * new elements have been added after this struct in AVFormatContext + * or AVIOContext. + */ +typedef struct AVIOInterruptCB { + int (*callback)(void*); + void *opaque; +} AVIOInterruptCB; + +/** + * Directory entry types. + */ +enum AVIODirEntryType { + AVIO_ENTRY_UNKNOWN, + AVIO_ENTRY_BLOCK_DEVICE, + AVIO_ENTRY_CHARACTER_DEVICE, + AVIO_ENTRY_DIRECTORY, + AVIO_ENTRY_NAMED_PIPE, + AVIO_ENTRY_SYMBOLIC_LINK, + AVIO_ENTRY_SOCKET, + AVIO_ENTRY_FILE, + AVIO_ENTRY_SERVER, + AVIO_ENTRY_SHARE, + AVIO_ENTRY_WORKGROUP, +}; + +/** + * Describes single entry of the directory. + * + * Only name and type fields are guaranteed be set. + * Rest of fields are protocol or/and platform dependent and might be unknown. + */ +typedef struct AVIODirEntry { + char *name; /**< Filename */ + int type; /**< Type of the entry */ + int utf8; /**< Set to 1 when name is encoded with UTF-8, 0 otherwise. + Name can be encoded with UTF-8 even though 0 is set. */ + int64_t size; /**< File size in bytes, -1 if unknown. */ + int64_t modification_timestamp; /**< Time of last modification in microseconds since unix + epoch, -1 if unknown. */ + int64_t access_timestamp; /**< Time of last access in microseconds since unix epoch, + -1 if unknown. */ + int64_t status_change_timestamp; /**< Time of last status change in microseconds since unix + epoch, -1 if unknown. */ + int64_t user_id; /**< User ID of owner, -1 if unknown. */ + int64_t group_id; /**< Group ID of owner, -1 if unknown. */ + int64_t filemode; /**< Unix file mode, -1 if unknown. */ +} AVIODirEntry; + +typedef struct AVIODirContext { + struct URLContext *url_context; +} AVIODirContext; + +/** + * Different data types that can be returned via the AVIO + * write_data_type callback. + */ +enum AVIODataMarkerType { + /** + * Header data; this needs to be present for the stream to be decodeable. + */ + AVIO_DATA_MARKER_HEADER, + /** + * A point in the output bytestream where a decoder can start decoding + * (i.e. a keyframe). A demuxer/decoder given the data flagged with + * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, + * should give decodeable results. + */ + AVIO_DATA_MARKER_SYNC_POINT, + /** + * A point in the output bytestream where a demuxer can start parsing + * (for non self synchronizing bytestream formats). That is, any + * non-keyframe packet start point. + */ + AVIO_DATA_MARKER_BOUNDARY_POINT, + /** + * This is any, unlabelled data. It can either be a muxer not marking + * any positions at all, it can be an actual boundary/sync point + * that the muxer chooses not to mark, or a later part of a packet/fragment + * that is cut into multiple write callbacks due to limited IO buffer size. + */ + AVIO_DATA_MARKER_UNKNOWN, + /** + * Trailer data, which doesn't contain actual content, but only for + * finalizing the output file. + */ + AVIO_DATA_MARKER_TRAILER, + /** + * A point in the output bytestream where the underlying AVIOContext might + * flush the buffer depending on latency or buffering requirements. Typically + * means the end of a packet. + */ + AVIO_DATA_MARKER_FLUSH_POINT, +}; + +/** + * Bytestream IO Context. + * New fields can be added to the end with minor version bumps. + * Removal, reordering and changes to existing fields require a major + * version bump. + * sizeof(AVIOContext) must not be used outside libav*. + * + * @note None of the function pointers in AVIOContext should be called + * directly, they should only be set by the client application + * when implementing custom I/O. Normally these are set to the + * function pointers specified in avio_alloc_context() + */ +typedef struct AVIOContext { + /** + * A class for private options. + * + * If this AVIOContext is created by avio_open2(), av_class is set and + * passes the options down to protocols. + * + * If this AVIOContext is manually allocated, then av_class may be set by + * the caller. + * + * warning -- this field can be NULL, be sure to not pass this AVIOContext + * to any av_opt_* functions in that case. + */ + const AVClass *av_class; + + /* + * The following shows the relationship between buffer, buf_ptr, + * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing + * (since AVIOContext is used for both): + * + ********************************************************************************** + * READING + ********************************************************************************** + * + * | buffer_size | + * |---------------------------------------| + * | | + * + * buffer buf_ptr buf_end + * +---------------+-----------------------+ + * |/ / / / / / / /|/ / / / / / /| | + * read buffer: |/ / consumed / | to be read /| | + * |/ / / / / / / /|/ / / / / / /| | + * +---------------+-----------------------+ + * + * pos + * +-------------------------------------------+-----------------+ + * input file: | | | + * +-------------------------------------------+-----------------+ + * + * + ********************************************************************************** + * WRITING + ********************************************************************************** + * + * | buffer_size | + * |--------------------------------------| + * | | + * + * buf_ptr_max + * buffer (buf_ptr) buf_end + * +-----------------------+--------------+ + * |/ / / / / / / / / / / /| | + * write buffer: | / / to be flushed / / | | + * |/ / / / / / / / / / / /| | + * +-----------------------+--------------+ + * buf_ptr can be in this + * due to a backward seek + * + * pos + * +-------------+----------------------------------------------+ + * output file: | | | + * +-------------+----------------------------------------------+ + * + */ + unsigned char *buffer; /**< Start of the buffer. */ + int buffer_size; /**< Maximum buffer size */ + unsigned char *buf_ptr; /**< Current position in the buffer */ + unsigned char *buf_end; /**< End of the data, may be less than + buffer+buffer_size if the read function returned + less data than requested, e.g. for streams where + no more data has been received yet. */ + void *opaque; /**< A private pointer, passed to the read/write/seek/... + functions. */ + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); + int64_t (*seek)(void *opaque, int64_t offset, int whence); + int64_t pos; /**< position in the file of the current buffer */ + int eof_reached; /**< true if was unable to read due to error or eof */ + int write_flag; /**< true if open for writing */ + int max_packet_size; + unsigned long checksum; + unsigned char *checksum_ptr; + unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); + int error; /**< contains the error code or 0 if no error happened */ + /** + * Pause or resume playback for network streaming protocols - e.g. MMS. + */ + int (*read_pause)(void *opaque, int pause); + /** + * Seek to a given timestamp in stream with the specified stream_index. + * Needed for some network streaming protocols which don't support seeking + * to byte position. + */ + int64_t (*read_seek)(void *opaque, int stream_index, + int64_t timestamp, int flags); + /** + * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. + */ + int seekable; + + /** + * max filesize, used to limit allocations + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t maxsize; + + /** + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ + int direct; + + /** + * Bytes read statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int64_t bytes_read; + + /** + * seek statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int seek_count; + + /** + * writeout statistic + * This field is internal to libavformat and access from outside is not allowed. + */ + int writeout_count; + + /** + * Original buffer size + * used internally after probing and ensure seekback to reset the buffer size + * This field is internal to libavformat and access from outside is not allowed. + */ + int orig_buffer_size; + + /** + * Threshold to favor readahead over seek. + * This is current internal only, do not use from outside. + */ + int short_seek_threshold; + + /** + * ',' separated list of allowed protocols. + */ + const char *protocol_whitelist; + + /** + * ',' separated list of disallowed protocols. + */ + const char *protocol_blacklist; + + /** + * A callback that is used instead of write_packet. + */ + int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); + /** + * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, + * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly + * small chunks of data returned from the callback). + */ + int ignore_boundary_point; + + /** + * Internal, not meant to be used from outside of AVIOContext. + */ + enum AVIODataMarkerType current_type; + int64_t last_time; + + /** + * A callback that is used instead of short_seek_threshold. + * This is current internal only, do not use from outside. + */ + int (*short_seek_get)(void *opaque); + + int64_t written; + + /** + * Maximum reached position before a backward seek in the write buffer, + * used keeping track of already written data for a later flush. + */ + unsigned char *buf_ptr_max; + + /** + * Try to buffer at least this amount of data before flushing it + */ + int min_packet_size; +} AVIOContext; + +/** + * Return the name of the protocol that will handle the passed URL. + * + * NULL is returned if no protocol could be found for the given URL. + * + * @return Name of the protocol or NULL. + */ +const char *avio_find_protocol_name(const char *url); + +/** + * Return AVIO_FLAG_* access flags corresponding to the access permissions + * of the resource in url, or a negative value corresponding to an + * AVERROR code in case of failure. The returned access flags are + * masked by the value in flags. + * + * @note This function is intrinsically unsafe, in the sense that the + * checked resource may change its existence or permission status from + * one call to another. Thus you should not trust the returned value, + * unless you are sure that no other processes are accessing the + * checked resource. + */ +int avio_check(const char *url, int flags); + +/** + * Move or rename a resource. + * + * @note url_src and url_dst should share the same protocol and authority. + * + * @param url_src url to resource to be moved + * @param url_dst new url to resource if the operation succeeded + * @return >=0 on success or negative on error. + */ +int avpriv_io_move(const char *url_src, const char *url_dst); + +/** + * Delete a resource. + * + * @param url resource to be deleted. + * @return >=0 on success or negative on error. + */ +int avpriv_io_delete(const char *url); + +/** + * Open directory for reading. + * + * @param s directory read context. Pointer to a NULL pointer must be passed. + * @param url directory to be listed. + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dictionary + * containing options that were not found. May be NULL. + * @return >=0 on success or negative on error. + */ +int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options); + +/** + * Get next directory entry. + * + * Returned entry must be freed with avio_free_directory_entry(). In particular + * it may outlive AVIODirContext. + * + * @param s directory read context. + * @param[out] next next entry or NULL when no more entries. + * @return >=0 on success or negative on error. End of list is not considered an + * error. + */ +int avio_read_dir(AVIODirContext *s, AVIODirEntry **next); + +/** + * Close directory. + * + * @note Entries created using avio_read_dir() are not deleted and must be + * freeded with avio_free_directory_entry(). + * + * @param s directory read context. + * @return >=0 on success or negative on error. + */ +int avio_close_dir(AVIODirContext **s); + +/** + * Free entry allocated by avio_read_dir(). + * + * @param entry entry to be freed. + */ +void avio_free_directory_entry(AVIODirEntry **entry); + +/** + * Allocate and initialize an AVIOContext for buffered I/O. It must be later + * freed with avio_context_free(). + * + * @param buffer Memory block for input/output operations via AVIOContext. + * The buffer must be allocated with av_malloc() and friends. + * It may be freed and replaced with a new buffer by libavformat. + * AVIOContext.buffer holds the buffer currently in use, + * which must be later freed with av_free(). + * @param buffer_size The buffer size is very important for performance. + * For protocols with fixed blocksize it should be set to this blocksize. + * For others a typical size is a cache page, e.g. 4kb. + * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. + * @param opaque An opaque pointer to user-specific data. + * @param read_packet A function for refilling the buffer, may be NULL. + * For stream protocols, must never return 0 but rather + * a proper AVERROR code. + * @param write_packet A function for writing the buffer contents, may be NULL. + * The function may not change the input buffers content. + * @param seek A function for seeking to specified byte position, may be NULL. + * + * @return Allocated AVIOContext or NULL on failure. + */ +AVIOContext *avio_alloc_context( + unsigned char *buffer, + int buffer_size, + int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + int64_t (*seek)(void *opaque, int64_t offset, int whence)); + +/** + * Free the supplied IO context and everything associated with it. + * + * @param s Double pointer to the IO context. This function will write NULL + * into s. + */ +void avio_context_free(AVIOContext **s); + +void avio_w8(AVIOContext *s, int b); +void avio_write(AVIOContext *s, const unsigned char *buf, int size); +void avio_wl64(AVIOContext *s, uint64_t val); +void avio_wb64(AVIOContext *s, uint64_t val); +void avio_wl32(AVIOContext *s, unsigned int val); +void avio_wb32(AVIOContext *s, unsigned int val); +void avio_wl24(AVIOContext *s, unsigned int val); +void avio_wb24(AVIOContext *s, unsigned int val); +void avio_wl16(AVIOContext *s, unsigned int val); +void avio_wb16(AVIOContext *s, unsigned int val); + +/** + * Write a NULL-terminated string. + * @return number of bytes written. + */ +int avio_put_str(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16LE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16le(AVIOContext *s, const char *str); + +/** + * Convert an UTF-8 string to UTF-16BE and write it. + * @param s the AVIOContext + * @param str NULL-terminated UTF-8 string + * + * @return number of bytes written. + */ +int avio_put_str16be(AVIOContext *s, const char *str); + +/** + * Mark the written bytestream as a specific type. + * + * Zero-length ranges are omitted from the output. + * + * @param time the stream time the current bytestream pos corresponds to + * (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not + * applicable + * @param type the kind of data written starting at the current pos + */ +void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); + +/** + * ORing this as the "whence" parameter to a seek function causes it to + * return the filesize without seeking anywhere. Supporting this is optional. + * If it is not supported then the seek function will return <0. + */ +#define AVSEEK_SIZE 0x10000 + +/** + * Passing this flag as the "whence" parameter to a seek function causes it to + * seek by any means (like reopening and linear reading) or other normally unreasonable + * means that can be extremely slow. + * This may be ignored by the seek code. + */ +#define AVSEEK_FORCE 0x20000 + +/** + * fseek() equivalent for AVIOContext. + * @return new position or AVERROR. + */ +int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); + +/** + * Skip given number of bytes forward + * @return new position or AVERROR. + */ +int64_t avio_skip(AVIOContext *s, int64_t offset); + +/** + * ftell() equivalent for AVIOContext. + * @return position or AVERROR. + */ +static av_always_inline int64_t avio_tell(AVIOContext *s) +{ + return avio_seek(s, 0, SEEK_CUR); +} + +/** + * Get the filesize. + * @return filesize or AVERROR + */ +int64_t avio_size(AVIOContext *s); + +/** + * Similar to feof() but also returns nonzero on read errors. + * @return non zero if and only if at end of file or a read error happened when reading. + */ +int avio_feof(AVIOContext *s); + +/** @warning Writes up to 4 KiB per call */ +int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Force flushing of buffered data. + * + * For write streams, force the buffered data to be immediately written to the output, + * without to wait to fill the internal buffer. + * + * For read streams, discard all currently buffered data, and advance the + * reported file position to that of the underlying stream. This does not + * read new data, and does not perform any seeks. + */ +void avio_flush(AVIOContext *s); + +/** + * Read size bytes from AVIOContext into buf. + * @return number of bytes read or AVERROR + */ +int avio_read(AVIOContext *s, unsigned char *buf, int size); + +/** + * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed + * to read fewer bytes than requested. The missing bytes can be read in the next + * call. This always tries to read at least 1 byte. + * Useful to reduce latency in certain cases. + * @return number of bytes read or AVERROR + */ +int avio_read_partial(AVIOContext *s, unsigned char *buf, int size); + +/** + * @name Functions for reading from AVIOContext + * @{ + * + * @note return 0 if EOF, so you cannot use it if EOF handling is + * necessary + */ +int avio_r8 (AVIOContext *s); +unsigned int avio_rl16(AVIOContext *s); +unsigned int avio_rl24(AVIOContext *s); +unsigned int avio_rl32(AVIOContext *s); +uint64_t avio_rl64(AVIOContext *s); +unsigned int avio_rb16(AVIOContext *s); +unsigned int avio_rb24(AVIOContext *s); +unsigned int avio_rb32(AVIOContext *s); +uint64_t avio_rb64(AVIOContext *s); +/** + * @} + */ + +/** + * Read a string from pb into buf. The reading will terminate when either + * a NULL character was encountered, maxlen bytes have been read, or nothing + * more can be read from pb. The result is guaranteed to be NULL-terminated, it + * will be truncated if buf is too small. + * Note that the string is not interpreted or validated in any way, it + * might get truncated in the middle of a sequence for multi-byte encodings. + * + * @return number of bytes read (is always <= maxlen). + * If reading ends on EOF or error, the return value will be one more than + * bytes actually read. + */ +int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); + +/** + * Read a UTF-16 string from pb and convert it to UTF-8. + * The reading will terminate when either a null or invalid character was + * encountered or maxlen bytes have been read. + * @return number of bytes read (is always <= maxlen) + */ +int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); +int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); + + +/** + * @name URL open modes + * The flags argument to avio_open must be one of the following + * constants, optionally ORed with other flags. + * @{ + */ +#define AVIO_FLAG_READ 1 /**< read-only */ +#define AVIO_FLAG_WRITE 2 /**< write-only */ +#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE) /**< read-write pseudo flag */ +/** + * @} + */ + +/** + * Use non-blocking mode. + * If this flag is set, operations on the context will return + * AVERROR(EAGAIN) if they can not be performed immediately. + * If this flag is not set, operations on the context will never return + * AVERROR(EAGAIN). + * Note that this flag does not affect the opening/connecting of the + * context. Connecting a protocol will always block if necessary (e.g. on + * network protocols) but never hang (e.g. on busy devices). + * Warning: non-blocking protocols is work-in-progress; this flag may be + * silently ignored. + */ +#define AVIO_FLAG_NONBLOCK 8 + +/** + * Use direct mode. + * avio_read and avio_write should if possible be satisfied directly + * instead of going through a buffer, and avio_seek will always + * call the underlying seek function directly. + */ +#define AVIO_FLAG_DIRECT 0x8000 + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open(AVIOContext **s, const char *url, int flags); + +/** + * Create and initialize a AVIOContext for accessing the + * resource indicated by url. + * @note When the resource indicated by url has been opened in + * read+write mode, the AVIOContext can be used only for writing. + * + * @param s Used to return the pointer to the created AVIOContext. + * In case of failure the pointed to value is set to NULL. + * @param url resource to access + * @param flags flags which control how the resource indicated by url + * is to be opened + * @param int_cb an interrupt callback to be used at the protocols level + * @param options A dictionary filled with protocol-private options. On return + * this parameter will be destroyed and replaced with a dict containing options + * that were not found. May be NULL. + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code in case of failure + */ +int avio_open2(AVIOContext **s, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + +/** + * Close the resource accessed by the AVIOContext s and free it. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_closep + */ +int avio_close(AVIOContext *s); + +/** + * Close the resource accessed by the AVIOContext *s, free it + * and set the pointer pointing to it to NULL. + * This function can only be used if s was opened by avio_open(). + * + * The internal buffer is automatically flushed before closing the + * resource. + * + * @return 0 on success, an AVERROR < 0 on error. + * @see avio_close + */ +int avio_closep(AVIOContext **s); + + +/** + * Open a write only memory stream. + * + * @param s new IO context + * @return zero if no error. + */ +int avio_open_dyn_buf(AVIOContext **s); + +/** + * Return the written size and a pointer to the buffer. + * The AVIOContext stream is left intact. + * The buffer must NOT be freed. + * No padding is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Return the written size and a pointer to the buffer. The buffer + * must be freed with av_free(). + * Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer. + * + * @param s IO context + * @param pbuffer pointer to a byte buffer + * @return the length of the byte buffer + */ +int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer); + +/** + * Iterate through names of available protocols. + * + * @param opaque A private pointer representing current protocol. + * It must be a pointer to NULL on first iteration and will + * be updated by successive calls to avio_enum_protocols. + * @param output If set to 1, iterate over output protocols, + * otherwise over input protocols. + * + * @return A static string containing the name of current protocol or NULL + */ +const char *avio_enum_protocols(void **opaque, int output); + +/** + * Pause and resume playing - only meaningful if using a network streaming + * protocol (e.g. MMS). + * + * @param h IO context from which to call the read_pause function pointer + * @param pause 1 for pause, 0 for resume + */ +int avio_pause(AVIOContext *h, int pause); + +/** + * Seek to a given timestamp relative to some component stream. + * Only meaningful if using a network streaming protocol (e.g. MMS.). + * + * @param h IO context from which to call the seek function pointers + * @param stream_index The stream index that the timestamp is relative to. + * If stream_index is (-1) the timestamp should be in AV_TIME_BASE + * units from the beginning of the presentation. + * If a stream_index >= 0 is used and the protocol does not support + * seeking based on component streams, the call will fail. + * @param timestamp timestamp in AVStream.time_base units + * or if there is no stream specified then in AV_TIME_BASE units. + * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE + * and AVSEEK_FLAG_ANY. The protocol may silently ignore + * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will + * fail if used and not supported. + * @return >= 0 on success + * @see AVInputFormat::read_seek + */ +int64_t avio_seek_time(AVIOContext *h, int stream_index, + int64_t timestamp, int flags); + +/* Avoid a warning. The header can not be included because it breaks c++. */ +struct AVBPrint; + +/** + * Read contents of h into print buffer, up to max_size bytes, or up to EOF. + * + * @return 0 for success (max_size bytes read or EOF reached), negative error + * code otherwise + */ +int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); + +/** + * Accept and allocate a client context on a server context. + * @param s the server context + * @param c the client context, must be unallocated + * @return >= 0 on success or a negative value corresponding + * to an AVERROR on failure + */ +int avio_accept(AVIOContext *s, AVIOContext **c); + +/** + * Perform one step of the protocol handshake to accept a new client. + * This function must be called on a client returned by avio_accept() before + * using it as a read/write context. + * It is separate from avio_accept() because it may block. + * A step of the handshake is defined by places where the application may + * decide to change the proceedings. + * For example, on a protocol with a request header and a reply header, each + * one can constitute a step because the application may use the parameters + * from the request to change parameters in the reply; or each individual + * chunk of the request can constitute a step. + * If the handshake is already finished, avio_handshake() does nothing and + * returns 0 immediately. + * + * @param c the client context to perform the handshake on + * @return 0 on a complete and successful handshake + * > 0 if the handshake progressed, but is not complete + * < 0 for an AVERROR code + */ +int avio_handshake(AVIOContext *c); +#endif /* AVFORMAT_AVIO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/version.h new file mode 100644 index 0000000..22ed534 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavformat/version.h @@ -0,0 +1,114 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef AVFORMAT_VERSION_H +#define AVFORMAT_VERSION_H + +/** + * @file + * @ingroup libavf + * Libavformat version macros + */ + +#include "libavutil/version.h" + +// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) +// Also please add any ticket numbers that you believe might be affected here +#define LIBAVFORMAT_VERSION_MAJOR 58 +#define LIBAVFORMAT_VERSION_MINOR 29 +#define LIBAVFORMAT_VERSION_MICRO 100 + +#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_VERSION AV_VERSION(LIBAVFORMAT_VERSION_MAJOR, \ + LIBAVFORMAT_VERSION_MINOR, \ + LIBAVFORMAT_VERSION_MICRO) +#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT + +#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + */ +#ifndef FF_API_COMPUTE_PKT_FIELDS2 +#define FF_API_COMPUTE_PKT_FIELDS2 (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_OPEN_CALLBACKS +#define FF_API_OLD_OPEN_CALLBACKS (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_AVCTX +#define FF_API_LAVF_AVCTX (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HTTP_USER_AGENT +#define FF_API_HTTP_USER_AGENT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HLS_WRAP +#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_HLS_USE_LOCALTIME +#define FF_API_HLS_USE_LOCALTIME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_KEEPSIDE_FLAG +#define FF_API_LAVF_KEEPSIDE_FLAG (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_ROTATE_API +#define FF_API_OLD_ROTATE_API (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_GET_SET +#define FF_API_FORMAT_GET_SET (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_AVIO_EOF_0 +#define FF_API_OLD_AVIO_EOF_0 (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_FFSERVER +#define FF_API_LAVF_FFSERVER (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_FORMAT_FILENAME +#define FF_API_FORMAT_FILENAME (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_OLD_RTSP_OPTIONS +#define FF_API_OLD_RTSP_OPTIONS (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_NEXT +#define FF_API_NEXT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_DASH_MIN_SEG_DURATION +#define FF_API_DASH_MIN_SEG_DURATION (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_LAVF_MP4A_LATM +#define FF_API_LAVF_MP4A_LATM (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif +#ifndef FF_API_AVIOFORMAT +#define FF_API_AVIOFORMAT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif + + +#ifndef FF_API_R_FRAME_RATE +#define FF_API_R_FRAME_RATE 1 +#endif +#endif /* AVFORMAT_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/adler32.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/adler32.h new file mode 100644 index 0000000..a1f035b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/adler32.h @@ -0,0 +1,60 @@ +/* + * copyright (c) 2006 Mans Rullgard + * + * 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 + * @ingroup lavu_adler32 + * Public header for Adler-32 hash function implementation. + */ + +#ifndef AVUTIL_ADLER32_H +#define AVUTIL_ADLER32_H + +#include +#include "attributes.h" + +/** + * @defgroup lavu_adler32 Adler-32 + * @ingroup lavu_hash + * Adler-32 hash function implementation. + * + * @{ + */ + +/** + * Calculate the Adler32 checksum of a buffer. + * + * Passing the return value to a subsequent av_adler32_update() call + * allows the checksum of multiple buffers to be calculated as though + * they were concatenated. + * + * @param adler initial checksum value + * @param buf pointer to input buffer + * @param len size of input buffer + * @return updated checksum + */ +unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, + unsigned int len) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_ADLER32_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes.h new file mode 100644 index 0000000..09efbda --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes.h @@ -0,0 +1,65 @@ +/* + * copyright (c) 2007 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AES_H +#define AVUTIL_AES_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_aes AES + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_aes_size; + +struct AVAES; + +/** + * Allocate an AVAES context. + */ +struct AVAES *av_aes_alloc(void); + +/** + * Initialize an AVAES context. + * @param key_bits 128, 192 or 256 + * @param decrypt 0 for encryption, 1 for decryption + */ +int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * @param count number of 16 byte blocks + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_AES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes_ctr.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes_ctr.h new file mode 100644 index 0000000..e4aae12 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/aes_ctr.h @@ -0,0 +1,88 @@ +/* + * AES-CTR cipher + * Copyright (c) 2015 Eran Kornblau + * + * 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 + */ + +#ifndef AVUTIL_AES_CTR_H +#define AVUTIL_AES_CTR_H + +#include + +#include "attributes.h" +#include "version.h" + +#define AES_CTR_KEY_SIZE (16) +#define AES_CTR_IV_SIZE (8) + +struct AVAESCTR; + +/** + * Allocate an AVAESCTR context. + */ +struct AVAESCTR *av_aes_ctr_alloc(void); + +/** + * Initialize an AVAESCTR context. + * @param key encryption key, must have a length of AES_CTR_KEY_SIZE + */ +int av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key); + +/** + * Release an AVAESCTR context. + */ +void av_aes_ctr_free(struct AVAESCTR *a); + +/** + * Process a buffer using a previously initialized context. + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param size the size of src and dst + */ +void av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size); + +/** + * Get the current iv + */ +const uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a); + +/** + * Generate a random iv + */ +void av_aes_ctr_set_random_iv(struct AVAESCTR *a); + +/** + * Forcefully change the 8-byte iv + */ +void av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Forcefully change the "full" 16-byte iv, including the counter + */ +void av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t* iv); + +/** + * Increment the top 64 bit of the iv (performed after each frame) + */ +void av_aes_ctr_increment_iv(struct AVAESCTR *a); + +/** + * @} + */ + +#endif /* AVUTIL_AES_CTR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/attributes.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/attributes.h new file mode 100644 index 0000000..ced108a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/attributes.h @@ -0,0 +1,167 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * Macro definitions for various function/variable attributes + */ + +#ifndef AVUTIL_ATTRIBUTES_H +#define AVUTIL_ATTRIBUTES_H + +#ifdef __GNUC__ +# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y)) +# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y)) +#else +# define AV_GCC_VERSION_AT_LEAST(x,y) 0 +# define AV_GCC_VERSION_AT_MOST(x,y) 0 +#endif + +#ifndef av_always_inline +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_always_inline __attribute__((always_inline)) inline +#elif defined(_MSC_VER) +# define av_always_inline __forceinline +#else +# define av_always_inline inline +#endif +#endif + +#ifndef av_extern_inline +#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__) +# define av_extern_inline extern inline +#else +# define av_extern_inline inline +#endif +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,4) +# define av_warn_unused_result __attribute__((warn_unused_result)) +#else +# define av_warn_unused_result +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define av_noinline __attribute__((noinline)) +#elif defined(_MSC_VER) +# define av_noinline __declspec(noinline) +#else +# define av_noinline +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_pure __attribute__((pure)) +#else +# define av_pure +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__) +# define av_const __attribute__((const)) +#else +# define av_const +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__) +# define av_cold __attribute__((cold)) +#else +# define av_cold +#endif + +#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__) +# define av_flatten __attribute__((flatten)) +#else +# define av_flatten +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,1) +# define attribute_deprecated __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define attribute_deprecated __declspec(deprecated) +#else +# define attribute_deprecated +#endif + +/** + * Disable warnings about deprecated features + * This is useful for sections of code kept for backward compatibility and + * scheduled for removal. + */ +#ifndef AV_NOWARN_DEPRECATED +#if AV_GCC_VERSION_AT_LEAST(4,6) +# define AV_NOWARN_DEPRECATED(code) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \ + code \ + _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +# define AV_NOWARN_DEPRECATED(code) \ + __pragma(warning(push)) \ + __pragma(warning(disable : 4996)) \ + code; \ + __pragma(warning(pop)) +#else +# define AV_NOWARN_DEPRECATED(code) code +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_unused __attribute__((unused)) +#else +# define av_unused +#endif + +/** + * Mark a variable as used and prevent the compiler from optimizing it + * away. This is useful for variables accessed only from inline + * assembler without the compiler being aware. + */ +#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__) +# define av_used __attribute__((used)) +#else +# define av_used +#endif + +#if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__) +# define av_alias __attribute__((may_alias)) +#else +# define av_alias +#endif + +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) +# define av_uninit(x) x=x +#else +# define av_uninit(x) x +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define av_builtin_constant_p __builtin_constant_p +# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos))) +#else +# define av_builtin_constant_p(x) 0 +# define av_printf_format(fmtpos, attrpos) +#endif + +#if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__) +# define av_noreturn __attribute__((noreturn)) +#else +# define av_noreturn +#endif + +#endif /* AVUTIL_ATTRIBUTES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/audio_fifo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/audio_fifo.h new file mode 100644 index 0000000..d8a9194 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/audio_fifo.h @@ -0,0 +1,187 @@ +/* + * Audio FIFO + * Copyright (c) 2012 Justin Ruggles + * + * 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 + * Audio FIFO Buffer + */ + +#ifndef AVUTIL_AUDIO_FIFO_H +#define AVUTIL_AUDIO_FIFO_H + +#include "avutil.h" +#include "fifo.h" +#include "samplefmt.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_audiofifo Audio FIFO Buffer + * @{ + */ + +/** + * Context for an Audio FIFO Buffer. + * + * - Operates at the sample level rather than the byte level. + * - Supports multiple channels with either planar or packed sample format. + * - Automatic reallocation when writing to a full buffer. + */ +typedef struct AVAudioFifo AVAudioFifo; + +/** + * Free an AVAudioFifo. + * + * @param af AVAudioFifo to free + */ +void av_audio_fifo_free(AVAudioFifo *af); + +/** + * Allocate an AVAudioFifo. + * + * @param sample_fmt sample format + * @param channels number of channels + * @param nb_samples initial allocation size, in samples + * @return newly allocated AVAudioFifo, or NULL on error + */ +AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, + int nb_samples); + +/** + * Reallocate an AVAudioFifo. + * + * @param af AVAudioFifo to reallocate + * @param nb_samples new allocation size, in samples + * @return 0 if OK, or negative AVERROR code on failure + */ +av_warn_unused_result +int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples); + +/** + * Write data to an AVAudioFifo. + * + * The AVAudioFifo will be reallocated automatically if the available space + * is less than nb_samples. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to write to + * @param data audio data plane pointers + * @param nb_samples number of samples to write + * @return number of samples actually written, or negative AVERROR + * code on failure. If successful, the number of samples + * actually written will always be nb_samples. + */ +int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Peek data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to peek + * @param offset offset from current read position + * @return number of samples actually peek, or negative AVERROR code + * on failure. The number of samples actually peek will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_peek_at(AVAudioFifo *af, void **data, int nb_samples, int offset); + +/** + * Read data from an AVAudioFifo. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param af AVAudioFifo to read from + * @param data audio data plane pointers + * @param nb_samples number of samples to read + * @return number of samples actually read, or negative AVERROR code + * on failure. The number of samples actually read will not + * be greater than nb_samples, and will only be less than + * nb_samples if av_audio_fifo_size is less than nb_samples. + */ +int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples); + +/** + * Drain data from an AVAudioFifo. + * + * Removes the data without reading it. + * + * @param af AVAudioFifo to drain + * @param nb_samples number of samples to drain + * @return 0 if OK, or negative AVERROR code on failure + */ +int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples); + +/** + * Reset the AVAudioFifo buffer. + * + * This empties all data in the buffer. + * + * @param af AVAudioFifo to reset + */ +void av_audio_fifo_reset(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for reading. + * + * @param af the AVAudioFifo to query + * @return number of samples available for reading + */ +int av_audio_fifo_size(AVAudioFifo *af); + +/** + * Get the current number of samples in the AVAudioFifo available for writing. + * + * @param af the AVAudioFifo to query + * @return number of samples available for writing + */ +int av_audio_fifo_space(AVAudioFifo *af); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_AUDIO_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avassert.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avassert.h new file mode 100644 index 0000000..9abeade --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avassert.h @@ -0,0 +1,75 @@ +/* + * copyright (c) 2010 Michael Niedermayer + * + * 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 + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_AVASSERT_H +#define AVUTIL_AVASSERT_H + +#include +#include "avutil.h" +#include "log.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do { \ + if (!(cond)) { \ + av_log(NULL, AV_LOG_PANIC, "Assertion %s failed at %s:%d\n", \ + AV_STRINGIFY(cond), __FILE__, __LINE__); \ + abort(); \ + } \ +} while (0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speed loss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert0(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert0(cond) +#define av_assert2_fpu() av_assert0_fpu() +#else +#define av_assert2(cond) ((void)0) +#define av_assert2_fpu() ((void)0) +#endif + +/** + * Assert that floating point operations can be executed. + * + * This will av_assert0() that the cpu is not in MMX state on X86 + */ +void av_assert0_fpu(void); + +#endif /* AVUTIL_AVASSERT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avconfig.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avconfig.h new file mode 100644 index 0000000..c289fbb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avconfig.h @@ -0,0 +1,6 @@ +/* Generated by ffmpeg configure */ +#ifndef AVUTIL_AVCONFIG_H +#define AVUTIL_AVCONFIG_H +#define AV_HAVE_BIGENDIAN 0 +#define AV_HAVE_FAST_UNALIGNED 1 +#endif /* AVUTIL_AVCONFIG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avstring.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avstring.h new file mode 100644 index 0000000..37dd4e2 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avstring.h @@ -0,0 +1,413 @@ +/* + * Copyright (c) 2007 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_AVSTRING_H +#define AVUTIL_AVSTRING_H + +#include +#include +#include "attributes.h" + +/** + * @addtogroup lavu_string + * @{ + */ + +/** + * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to + * the address of the first character in str after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_strstart(const char *str, const char *pfx, const char **ptr); + +/** + * Return non-zero if pfx is a prefix of str independent of case. If + * it is, *ptr is set to the address of the first character in str + * after the prefix. + * + * @param str input string + * @param pfx prefix to test + * @param ptr updated if the prefix is matched inside str + * @return non-zero if the prefix matches, zero otherwise + */ +int av_stristart(const char *str, const char *pfx, const char **ptr); + +/** + * Locate the first case-independent occurrence in the string haystack + * of the string needle. A zero-length string needle is considered to + * match at the start of haystack. + * + * This function is a case-insensitive version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_stristr(const char *haystack, const char *needle); + +/** + * Locate the first occurrence of the string needle in the string haystack + * where not more than hay_length characters are searched. A zero-length + * string needle is considered to match at the start of haystack. + * + * This function is a length-limited version of the standard strstr(). + * + * @param haystack string to search in + * @param needle string to search for + * @param hay_length length of string to search in + * @return pointer to the located match within haystack + * or a null pointer if no match + */ +char *av_strnstr(const char *haystack, const char *needle, size_t hay_length); + +/** + * Copy the string src to dst, but no more than size - 1 bytes, and + * null-terminate dst. + * + * This function is the same as BSD strlcpy(). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the length of src + * + * @warning since the return value is the length of src, src absolutely + * _must_ be a properly 0-terminated string, otherwise this will read beyond + * the end of the buffer and possibly crash. + */ +size_t av_strlcpy(char *dst, const char *src, size_t size); + +/** + * Append the string src to the string dst, but to a total length of + * no more than size - 1 bytes, and null-terminate dst. + * + * This function is similar to BSD strlcat(), but differs when + * size <= strlen(dst). + * + * @param dst destination buffer + * @param src source string + * @param size size of destination buffer + * @return the total length of src and dst + * + * @warning since the return value use the length of src and dst, these + * absolutely _must_ be a properly 0-terminated strings, otherwise this + * will read beyond the end of the buffer and possibly crash. + */ +size_t av_strlcat(char *dst, const char *src, size_t size); + +/** + * Append output to a string, according to a format. Never write out of + * the destination buffer, and always put a terminating 0 within + * the buffer. + * @param dst destination buffer (string to which the output is + * appended) + * @param size total size of the destination buffer + * @param fmt printf-compatible format string, specifying how the + * following parameters are used + * @return the length of the string that would have been generated + * if enough space had been available + */ +size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4); + +/** + * Get the count of continuous non zero chars starting from the beginning. + * + * @param len maximum number of characters to check in the string, that + * is the maximum value which is returned by the function + */ +static inline size_t av_strnlen(const char *s, size_t len) +{ + size_t i; + for (i = 0; i < len && s[i]; i++) + ; + return i; +} + +/** + * Print arguments following specified format into a large enough auto + * allocated buffer. It is similar to GNU asprintf(). + * @param fmt printf-compatible format string, specifying how the + * following parameters are used. + * @return the allocated string + * @note You have to free the string yourself with av_free(). + */ +char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2); + +/** + * Convert a number to an av_malloced string. + */ +char *av_d2str(double d); + +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + +/** + * Split the string into several tokens which can be accessed by + * successive calls to av_strtok(). + * + * A token is defined as a sequence of characters not belonging to the + * set specified in delim. + * + * On the first call to av_strtok(), s should point to the string to + * parse, and the value of saveptr is ignored. In subsequent calls, s + * should be NULL, and saveptr should be unchanged since the previous + * call. + * + * This function is similar to strtok_r() defined in POSIX.1. + * + * @param s the string to parse, may be NULL + * @param delim 0-terminated list of token delimiters, must be non-NULL + * @param saveptr user-provided pointer which points to stored + * information necessary for av_strtok() to continue scanning the same + * string. saveptr is updated to point to the next character after the + * first delimiter found, or to NULL if the string was terminated + * @return the found token, or NULL when no token is found + */ +char *av_strtok(char *s, const char *delim, char **saveptr); + +/** + * Locale-independent conversion of ASCII isdigit. + */ +static inline av_const int av_isdigit(int c) +{ + return c >= '0' && c <= '9'; +} + +/** + * Locale-independent conversion of ASCII isgraph. + */ +static inline av_const int av_isgraph(int c) +{ + return c > 32 && c < 127; +} + +/** + * Locale-independent conversion of ASCII isspace. + */ +static inline av_const int av_isspace(int c) +{ + return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || + c == '\v'; +} + +/** + * Locale-independent conversion of ASCII characters to uppercase. + */ +static inline av_const int av_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII characters to lowercase. + */ +static inline av_const int av_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + c ^= 0x20; + return c; +} + +/** + * Locale-independent conversion of ASCII isxdigit. + */ +static inline av_const int av_isxdigit(int c) +{ + c = av_tolower(c); + return av_isdigit(c) || (c >= 'a' && c <= 'f'); +} + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strcasecmp(const char *a, const char *b); + +/** + * Locale-independent case-insensitive compare. + * @note This means only ASCII-range characters are case-insensitive + */ +int av_strncasecmp(const char *a, const char *b, size_t n); + +/** + * Locale-independent strings replace. + * @note This means only ASCII-range characters are replace + */ +char *av_strireplace(const char *str, const char *from, const char *to); + +/** + * Thread safe basename. + * @param path the path, on DOS both \ and / are considered separators. + * @return pointer to the basename substring. + */ +const char *av_basename(const char *path); + +/** + * Thread safe dirname. + * @param path the path, on DOS both \ and / are considered separators. + * @return the path with the separator replaced by the string terminator or ".". + * @note the function may change the input string. + */ +const char *av_dirname(char *path); + +/** + * Match instances of a name in a comma-separated list of names. + * List entries are checked from the start to the end of the names list, + * the first match ends further processing. If an entry prefixed with '-' + * matches, then 0 is returned. The "ALL" list entry is considered to + * match all names. + * + * @param name Name to look for. + * @param names List of names. + * @return 1 on match, 0 otherwise. + */ +int av_match_name(const char *name, const char *names); + +/** + * Append path component to the existing path. + * Path separator '/' is placed between when needed. + * Resulting string have to be freed with av_free(). + * @param path base path + * @param component component to be appended + * @return new path or NULL on error. + */ +char *av_append_path_component(const char *path, const char *component); + +enum AVEscapeMode { + AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. + AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. + AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. +}; + +/** + * Consider spaces special and escape them even in the middle of the + * string. + * + * This is equivalent to adding the whitespace characters to the special + * characters lists, except it is guaranteed to use the exact same list + * of whitespace characters as the rest of libavutil. + */ +#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0) + +/** + * Escape only specified special characters. + * Without this flag, escape also any characters that may be considered + * special by av_get_token(), such as the single quote. + */ +#define AV_ESCAPE_FLAG_STRICT (1 << 1) + +/** + * Escape string in src, and put the escaped string in an allocated + * string in *dst, which must be freed with av_free(). + * + * @param dst pointer where an allocated string is put + * @param src string to escape, must be non-NULL + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_ macros + * @return the length of the allocated string, or a negative error code in case of error + * @see av_bprint_escape() + */ +av_warn_unused_result +int av_escape(char **dst, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES 1 ///< accept codepoints over 0x10FFFF +#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS 2 ///< accept non-characters - 0xFFFE and 0xFFFF +#define AV_UTF8_FLAG_ACCEPT_SURROGATES 4 ///< accept UTF-16 surrogates codes +#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML + +#define AV_UTF8_FLAG_ACCEPT_ALL \ + AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES + +/** + * Read and decode a single UTF-8 code point (character) from the + * buffer in *buf, and update *buf to point to the next byte to + * decode. + * + * In case of an invalid byte sequence, the pointer will be updated to + * the next byte after the invalid sequence and the function will + * return an error code. + * + * Depending on the specified flags, the function will also fail in + * case the decoded code point does not belong to a valid range. + * + * @note For speed-relevant code a carefully implemented use of + * GET_UTF8() may be preferred. + * + * @param codep pointer used to return the parsed code in case of success. + * The value in *codep is set even in case the range check fails. + * @param bufp pointer to the address the first byte of the sequence + * to decode, updated by the function to point to the + * byte next after the decoded sequence + * @param buf_end pointer to the end of the buffer, points to the next + * byte past the last in the buffer. This is used to + * avoid buffer overreads (in case of an unfinished + * UTF-8 sequence towards the end of the buffer). + * @param flags a collection of AV_UTF8_FLAG_* flags + * @return >= 0 in case a sequence was successfully read, a negative + * value in case of invalid sequence + */ +av_warn_unused_result +int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, + unsigned int flags); + +/** + * Check if a name is in a list. + * @returns 0 if not found, or the 1 based index where it has been found in the + * list. + */ +int av_match_list(const char *name, const char *list, char separator); + +/** + * See libc sscanf manual for more information. + * Locale-independent sscanf implementation. + */ +int av_sscanf(const char *string, const char *format, ...); + +/** + * @} + */ + +#endif /* AVUTIL_AVSTRING_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avutil.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avutil.h new file mode 100644 index 0000000..4d63315 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/avutil.h @@ -0,0 +1,365 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_AVUTIL_H +#define AVUTIL_AVUTIL_H + +/** + * @file + * @ingroup lavu + * Convenience header that includes @ref lavu "libavutil"'s core. + */ + +/** + * @mainpage + * + * @section ffmpeg_intro Introduction + * + * This document describes the usage of the different libraries + * provided by FFmpeg. + * + * @li @ref libavc "libavcodec" encoding/decoding library + * @li @ref lavfi "libavfilter" graph-based frame editing library + * @li @ref libavf "libavformat" I/O and muxing/demuxing library + * @li @ref lavd "libavdevice" special devices muxing/demuxing library + * @li @ref lavu "libavutil" common utility library + * @li @ref lswr "libswresample" audio resampling, format conversion and mixing + * @li @ref lpp "libpostproc" post processing library + * @li @ref libsws "libswscale" color conversion and scaling library + * + * @section ffmpeg_versioning Versioning and compatibility + * + * Each of the FFmpeg libraries contains a version.h header, which defines a + * major, minor and micro version number with the + * LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO} macros. The major version + * number is incremented with backward incompatible changes - e.g. removing + * parts of the public API, reordering public struct members, etc. The minor + * version number is incremented for backward compatible API changes or major + * new features - e.g. adding a new public function or a new decoder. The micro + * version number is incremented for smaller changes that a calling program + * might still want to check for - e.g. changing behavior in a previously + * unspecified situation. + * + * FFmpeg guarantees backward API and ABI compatibility for each library as long + * as its major version number is unchanged. This means that no public symbols + * will be removed or renamed. Types and names of the public struct members and + * values of public macros and enums will remain the same (unless they were + * explicitly declared as not part of the public API). Documented behavior will + * not change. + * + * In other words, any correct program that works with a given FFmpeg snapshot + * should work just as well without any changes with any later snapshot with the + * same major versions. This applies to both rebuilding the program against new + * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program + * links against. + * + * However, new public symbols may be added and new members may be appended to + * public structs whose size is not part of public ABI (most public structs in + * FFmpeg). New macros and enum values may be added. Behavior in undocumented + * situations may change slightly (and be documented). All those are accompanied + * by an entry in doc/APIchanges and incrementing either the minor or micro + * version number. + */ + +/** + * @defgroup lavu libavutil + * Common code shared across all FFmpeg libraries. + * + * @note + * libavutil is designed to be modular. In most cases, in order to use the + * functions provided by one component of libavutil you must explicitly include + * the specific header containing that feature. If you are only using + * media-related components, you could simply include libavutil/avutil.h, which + * brings in most of the "core" components. + * + * @{ + * + * @defgroup lavu_crypto Crypto and Hashing + * + * @{ + * @} + * + * @defgroup lavu_math Mathematics + * @{ + * + * @} + * + * @defgroup lavu_string String Manipulation + * + * @{ + * + * @} + * + * @defgroup lavu_mem Memory Management + * + * @{ + * + * @} + * + * @defgroup lavu_data Data Structures + * @{ + * + * @} + * + * @defgroup lavu_video Video related + * + * @{ + * + * @} + * + * @defgroup lavu_audio Audio related + * + * @{ + * + * @} + * + * @defgroup lavu_error Error Codes + * + * @{ + * + * @} + * + * @defgroup lavu_log Logging Facility + * + * @{ + * + * @} + * + * @defgroup lavu_misc Other + * + * @{ + * + * @defgroup preproc_misc Preprocessor String Macros + * + * @{ + * + * @} + * + * @defgroup version_utils Library Version Macros + * + * @{ + * + * @} + */ + + +/** + * @addtogroup lavu_ver + * @{ + */ + +/** + * Return the LIBAVUTIL_VERSION_INT constant. + */ +unsigned avutil_version(void); + +/** + * Return an informative version string. This usually is the actual release + * version number or a git commit description. This string has no fixed format + * and can change any time. It should never be parsed by code. + */ +const char *av_version_info(void); + +/** + * Return the libavutil build-time configuration. + */ +const char *avutil_configuration(void); + +/** + * Return the libavutil license. + */ +const char *avutil_license(void); + +/** + * @} + */ + +/** + * @addtogroup lavu_media Media Type + * @brief Media Type + */ + +enum AVMediaType { + AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA + AVMEDIA_TYPE_VIDEO, + AVMEDIA_TYPE_AUDIO, + AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous + AVMEDIA_TYPE_SUBTITLE, + AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse + AVMEDIA_TYPE_NB +}; + +/** + * Return a string describing the media_type enum, NULL if media_type + * is unknown. + */ +const char *av_get_media_type_string(enum AVMediaType media_type); + +/** + * @defgroup lavu_const Constants + * @{ + * + * @defgroup lavu_enc Encoding specific + * + * @note those definition should move to avcodec + * @{ + */ + +#define FF_LAMBDA_SHIFT 7 +#define FF_LAMBDA_SCALE (1< + +/** + * @defgroup lavu_base64 Base64 + * @ingroup lavu_crypto + * @{ + */ + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in)) + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Calculate the output size in bytes needed to decode a base64 string + * with length x to a data buffer. + */ +#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4) + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the out buffer (including the + * null terminator), must be at least AV_BASE64_SIZE(in_size) + * @param in input buffer containing the data to encode + * @param in_size size in bytes of the in buffer + * @return out or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes to a + * null-terminated string. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + + /** + * @} + */ + +#endif /* AVUTIL_BASE64_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/blowfish.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/blowfish.h new file mode 100644 index 0000000..9e289a4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/blowfish.h @@ -0,0 +1,82 @@ +/* + * Blowfish algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_BLOWFISH_H +#define AVUTIL_BLOWFISH_H + +#include + +/** + * @defgroup lavu_blowfish Blowfish + * @ingroup lavu_crypto + * @{ + */ + +#define AV_BF_ROUNDS 16 + +typedef struct AVBlowfish { + uint32_t p[AV_BF_ROUNDS + 2]; + uint32_t s[4][256]; +} AVBlowfish; + +/** + * Allocate an AVBlowfish context. + */ +AVBlowfish *av_blowfish_alloc(void); + +/** + * Initialize an AVBlowfish context. + * + * @param ctx an AVBlowfish context + * @param key a key + * @param key_len length of the key + */ +void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param xl left four bytes halves of input to be encrypted + * @param xr right four bytes halves of input to be encrypted + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_BLOWFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bprint.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bprint.h new file mode 100644 index 0000000..c09b1ac --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bprint.h @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2012 Nicolas George + * + * 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 + */ + +#ifndef AVUTIL_BPRINT_H +#define AVUTIL_BPRINT_H + +#include + +#include "attributes.h" +#include "avstring.h" + +/** + * Define a structure with extra padding to a fixed size + * This helps ensuring binary compatibility with future versions. + */ + +#define FF_PAD_STRUCTURE(name, size, ...) \ +struct ff_pad_helper_##name { __VA_ARGS__ }; \ +typedef struct name { \ + __VA_ARGS__ \ + char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \ +} name; + +/** + * Buffer to print data progressively + * + * The string buffer grows as necessary and is always 0-terminated. + * The content of the string is never accessed, and thus is + * encoding-agnostic and can even hold binary data. + * + * Small buffers are kept in the structure itself, and thus require no + * memory allocation at all (unless the contents of the buffer is needed + * after the structure goes out of scope). This is almost as lightweight as + * declaring a local "char buf[512]". + * + * The length of the string can go beyond the allocated size: the buffer is + * then truncated, but the functions still keep account of the actual total + * length. + * + * In other words, buf->len can be greater than buf->size and records the + * total length of what would have been to the buffer if there had been + * enough memory. + * + * Append operations do not need to be tested for failure: if a memory + * allocation fails, data stop being appended to the buffer, but the length + * is still updated. This situation can be tested with + * av_bprint_is_complete(). + * + * The size_max field determines several possible behaviours: + * + * size_max = -1 (= UINT_MAX) or any large value will let the buffer be + * reallocated as necessary, with an amortized linear cost. + * + * size_max = 0 prevents writing anything to the buffer: only the total + * length is computed. The write operations can then possibly be repeated in + * a buffer with exactly the necessary size + * (using size_init = size_max = len + 1). + * + * size_max = 1 is automatically replaced by the exact size available in the + * structure itself, thus ensuring no dynamic memory allocation. The + * internal buffer is large enough to hold a reasonable paragraph of text, + * such as the current paragraph. + */ + +FF_PAD_STRUCTURE(AVBPrint, 1024, + char *str; /**< string so far */ + unsigned len; /**< length so far */ + unsigned size; /**< allocated memory */ + unsigned size_max; /**< maximum allocated memory */ + char reserved_internal_buffer[1]; +) + +/** + * Convenience macros for special values for av_bprint_init() size_max + * parameter. + */ +#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1) +#define AV_BPRINT_SIZE_AUTOMATIC 1 +#define AV_BPRINT_SIZE_COUNT_ONLY 0 + +/** + * Init a print buffer. + * + * @param buf buffer to init + * @param size_init initial size (including the final 0) + * @param size_max maximum size; + * 0 means do not write anything, just count the length; + * 1 is replaced by the maximum value for automatic storage; + * any large value means that the internal buffer will be + * reallocated as needed up to that limit; -1 is converted to + * UINT_MAX, the largest limit possible. + * Check also AV_BPRINT_SIZE_* macros. + */ +void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max); + +/** + * Init a print buffer using a pre-existing buffer. + * + * The buffer will not be reallocated. + * + * @param buf buffer structure to init + * @param buffer byte buffer to use for the string data + * @param size size of buffer + */ +void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size); + +/** + * Append a formatted string to a print buffer. + */ +void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3); + +/** + * Append a formatted string to a print buffer. + */ +void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg); + +/** + * Append char c n times to a print buffer. + */ +void av_bprint_chars(AVBPrint *buf, char c, unsigned n); + +/** + * Append data to a print buffer. + * + * param buf bprint buffer to use + * param data pointer to data + * param size size of data + */ +void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size); + +struct tm; +/** + * Append a formatted date and time to a print buffer. + * + * param buf bprint buffer to use + * param fmt date and time format string, see strftime() + * param tm broken-down time structure to translate + * + * @note due to poor design of the standard strftime function, it may + * produce poor results if the format string expands to a very long text and + * the bprint buffer is near the limit stated by the size_max option. + */ +void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm); + +/** + * Allocate bytes in the buffer for external use. + * + * @param[in] buf buffer structure + * @param[in] size required size + * @param[out] mem pointer to the memory area + * @param[out] actual_size size of the memory area after allocation; + * can be larger or smaller than size + */ +void av_bprint_get_buffer(AVBPrint *buf, unsigned size, + unsigned char **mem, unsigned *actual_size); + +/** + * Reset the string to "" but keep internal allocated data. + */ +void av_bprint_clear(AVBPrint *buf); + +/** + * Test if the print buffer is complete (not truncated). + * + * It may have been truncated due to a memory allocation failure + * or the size_max limit (compare size and size_max if necessary). + */ +static inline int av_bprint_is_complete(const AVBPrint *buf) +{ + return buf->len < buf->size; +} + +/** + * Finalize a print buffer. + * + * The print buffer can no longer be used afterwards, + * but the len and size fields are still valid. + * + * @arg[out] ret_str if not NULL, used to return a permanent copy of the + * buffer contents, or NULL if memory allocation fails; + * if NULL, the buffer is discarded and freed + * @return 0 for success or error code (probably AVERROR(ENOMEM)) + */ +int av_bprint_finalize(AVBPrint *buf, char **ret_str); + +/** + * Escape the content in src and append it to dstbuf. + * + * @param dstbuf already inited destination bprint buffer + * @param src string containing the text to escape + * @param special_chars string containing the special characters which + * need to be escaped, can be NULL + * @param mode escape mode to employ, see AV_ESCAPE_MODE_* macros. + * Any unknown value for mode will be considered equivalent to + * AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without + * notice. + * @param flags flags which control how to escape, see AV_ESCAPE_FLAG_* macros + */ +void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, + enum AVEscapeMode mode, int flags); + +#endif /* AVUTIL_BPRINT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bswap.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bswap.h new file mode 100644 index 0000000..91cb795 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/bswap.h @@ -0,0 +1,109 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * byte swapping routines + */ + +#ifndef AVUTIL_BSWAP_H +#define AVUTIL_BSWAP_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_AARCH64 +# include "aarch64/bswap.h" +#elif ARCH_ARM +# include "arm/bswap.h" +#elif ARCH_AVR32 +# include "avr32/bswap.h" +#elif ARCH_SH4 +# include "sh4/bswap.h" +#elif ARCH_X86 +# include "x86/bswap.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + +#ifndef av_bswap16 +static av_always_inline av_const uint16_t av_bswap16(uint16_t x) +{ + x= (x>>8) | (x<<8); + return x; +} +#endif + +#ifndef av_bswap32 +static av_always_inline av_const uint32_t av_bswap32(uint32_t x) +{ + return AV_BSWAP32C(x); +} +#endif + +#ifndef av_bswap64 +static inline uint64_t av_const av_bswap64(uint64_t x) +{ + return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32); +} +#endif + +// be2ne ... big-endian to native-endian +// le2ne ... little-endian to native-endian + +#if AV_HAVE_BIGENDIAN +#define av_be2ne16(x) (x) +#define av_be2ne32(x) (x) +#define av_be2ne64(x) (x) +#define av_le2ne16(x) av_bswap16(x) +#define av_le2ne32(x) av_bswap32(x) +#define av_le2ne64(x) av_bswap64(x) +#define AV_BE2NEC(s, x) (x) +#define AV_LE2NEC(s, x) AV_BSWAPC(s, x) +#else +#define av_be2ne16(x) av_bswap16(x) +#define av_be2ne32(x) av_bswap32(x) +#define av_be2ne64(x) av_bswap64(x) +#define av_le2ne16(x) (x) +#define av_le2ne32(x) (x) +#define av_le2ne64(x) (x) +#define AV_BE2NEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2NEC(s, x) (x) +#endif + +#define AV_BE2NE16C(x) AV_BE2NEC(16, x) +#define AV_BE2NE32C(x) AV_BE2NEC(32, x) +#define AV_BE2NE64C(x) AV_BE2NEC(64, x) +#define AV_LE2NE16C(x) AV_LE2NEC(16, x) +#define AV_LE2NE32C(x) AV_LE2NEC(32, x) +#define AV_LE2NE64C(x) AV_LE2NEC(64, x) + +#endif /* AVUTIL_BSWAP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/buffer.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/buffer.h new file mode 100644 index 0000000..73b6bd0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/buffer.h @@ -0,0 +1,291 @@ +/* + * 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 + * @ingroup lavu_buffer + * refcounted data buffer API + */ + +#ifndef AVUTIL_BUFFER_H +#define AVUTIL_BUFFER_H + +#include + +/** + * @defgroup lavu_buffer AVBuffer + * @ingroup lavu_data + * + * @{ + * AVBuffer is an API for reference-counted data buffers. + * + * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer + * represents the data buffer itself; it is opaque and not meant to be accessed + * by the caller directly, but only through AVBufferRef. However, the caller may + * e.g. compare two AVBuffer pointers to check whether two different references + * are describing the same data buffer. AVBufferRef represents a single + * reference to an AVBuffer and it is the object that may be manipulated by the + * caller directly. + * + * There are two functions provided for creating a new AVBuffer with a single + * reference -- av_buffer_alloc() to just allocate a new buffer, and + * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing + * reference, additional references may be created with av_buffer_ref(). + * Use av_buffer_unref() to free a reference (this will automatically free the + * data once all the references are freed). + * + * The convention throughout this API and the rest of FFmpeg is such that the + * buffer is considered writable if there exists only one reference to it (and + * it has not been marked as read-only). The av_buffer_is_writable() function is + * provided to check whether this is true and av_buffer_make_writable() will + * automatically create a new writable buffer when necessary. + * Of course nothing prevents the calling code from violating this convention, + * however that is safe only when all the existing references are under its + * control. + * + * @note Referencing and unreferencing the buffers is thread-safe and thus + * may be done from multiple threads simultaneously without any need for + * additional locking. + * + * @note Two different references to the same buffer can point to different + * parts of the buffer (i.e. their AVBufferRef.data will not be equal). + */ + +/** + * A reference counted buffer type. It is opaque and is meant to be used through + * references (AVBufferRef). + */ +typedef struct AVBuffer AVBuffer; + +/** + * A reference to a data buffer. + * + * The size of this struct is not a part of the public ABI and it is not meant + * to be allocated directly. + */ +typedef struct AVBufferRef { + AVBuffer *buffer; + + /** + * The data buffer. It is considered writable if and only if + * this is the only reference to the buffer, in which case + * av_buffer_is_writable() returns 1. + */ + uint8_t *data; + /** + * Size of data in bytes. + */ + int size; +} AVBufferRef; + +/** + * Allocate an AVBuffer of the given size using av_malloc(). + * + * @return an AVBufferRef of given size or NULL when out of memory + */ +AVBufferRef *av_buffer_alloc(int size); + +/** + * Same as av_buffer_alloc(), except the returned buffer will be initialized + * to zero. + */ +AVBufferRef *av_buffer_allocz(int size); + +/** + * Always treat the buffer as read-only, even when it has only one + * reference. + */ +#define AV_BUFFER_FLAG_READONLY (1 << 0) + +/** + * Create an AVBuffer from an existing array. + * + * If this function is successful, data is owned by the AVBuffer. The caller may + * only access data through the returned AVBufferRef and references derived from + * it. + * If this function fails, data is left untouched. + * @param data data array + * @param size size of data in bytes + * @param free a callback for freeing this buffer's data + * @param opaque parameter to be got for processing or passed to free + * @param flags a combination of AV_BUFFER_FLAG_* + * + * @return an AVBufferRef referring to data on success, NULL on failure. + */ +AVBufferRef *av_buffer_create(uint8_t *data, int size, + void (*free)(void *opaque, uint8_t *data), + void *opaque, int flags); + +/** + * Default free callback, which calls av_free() on the buffer data. + * This function is meant to be passed to av_buffer_create(), not called + * directly. + */ +void av_buffer_default_free(void *opaque, uint8_t *data); + +/** + * Create a new reference to an AVBuffer. + * + * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on + * failure. + */ +AVBufferRef *av_buffer_ref(AVBufferRef *buf); + +/** + * Free a given reference and automatically free the buffer if there are no more + * references to it. + * + * @param buf the reference to be freed. The pointer is set to NULL on return. + */ +void av_buffer_unref(AVBufferRef **buf); + +/** + * @return 1 if the caller may write to the data referred to by buf (which is + * true if and only if buf is the only reference to the underlying AVBuffer). + * Return 0 otherwise. + * A positive answer is valid until av_buffer_ref() is called on buf. + */ +int av_buffer_is_writable(const AVBufferRef *buf); + +/** + * @return the opaque parameter set by av_buffer_create. + */ +void *av_buffer_get_opaque(const AVBufferRef *buf); + +int av_buffer_get_ref_count(const AVBufferRef *buf); + +/** + * Create a writable reference from a given buffer reference, avoiding data copy + * if possible. + * + * @param buf buffer reference to make writable. On success, buf is either left + * untouched, or it is unreferenced and a new writable AVBufferRef is + * written in its place. On failure, buf is left untouched. + * @return 0 on success, a negative AVERROR on failure. + */ +int av_buffer_make_writable(AVBufferRef **buf); + +/** + * Reallocate a given buffer. + * + * @param buf a buffer reference to reallocate. On success, buf will be + * unreferenced and a new reference with the required size will be + * written in its place. On failure buf will be left untouched. *buf + * may be NULL, then a new buffer is allocated. + * @param size required new buffer size. + * @return 0 on success, a negative AVERROR on failure. + * + * @note the buffer is actually reallocated with av_realloc() only if it was + * initially allocated through av_buffer_realloc(NULL) and there is only one + * reference to it (i.e. the one passed to this function). In all other cases + * a new buffer is allocated and the data is copied. + */ +int av_buffer_realloc(AVBufferRef **buf, int size); + +/** + * @} + */ + +/** + * @defgroup lavu_bufferpool AVBufferPool + * @ingroup lavu_data + * + * @{ + * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers. + * + * Frequently allocating and freeing large buffers may be slow. AVBufferPool is + * meant to solve this in cases when the caller needs a set of buffers of the + * same size (the most obvious use case being buffers for raw video or audio + * frames). + * + * At the beginning, the user must call av_buffer_pool_init() to create the + * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to + * get a reference to a new buffer, similar to av_buffer_alloc(). This new + * reference works in all aspects the same way as the one created by + * av_buffer_alloc(). However, when the last reference to this buffer is + * unreferenced, it is returned to the pool instead of being freed and will be + * reused for subsequent av_buffer_pool_get() calls. + * + * When the caller is done with the pool and no longer needs to allocate any new + * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable. + * Once all the buffers are released, it will automatically be freed. + * + * Allocating and releasing buffers with this API is thread-safe as long as + * either the default alloc callback is used, or the user-supplied one is + * thread-safe. + */ + +/** + * The buffer pool. This structure is opaque and not meant to be accessed + * directly. It is allocated with av_buffer_pool_init() and freed with + * av_buffer_pool_uninit(). + */ +typedef struct AVBufferPool AVBufferPool; + +/** + * Allocate and initialize a buffer pool. + * + * @param size size of each buffer in this pool + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. May be NULL, then the default allocator will be used + * (av_buffer_alloc()). + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)); + +/** + * Allocate and initialize a buffer pool with a more complex allocator. + * + * @param size size of each buffer in this pool + * @param opaque arbitrary user data used by the allocator + * @param alloc a function that will be used to allocate new buffers when the + * pool is empty. + * @param pool_free a function that will be called immediately before the pool + * is freed. I.e. after av_buffer_pool_uninit() is called + * by the caller and all the frames are returned to the pool + * and freed. It is intended to uninitialize the user opaque + * data. + * @return newly created buffer pool on success, NULL on error. + */ +AVBufferPool *av_buffer_pool_init2(int size, void *opaque, + AVBufferRef* (*alloc)(void *opaque, int size), + void (*pool_free)(void *opaque)); + +/** + * Mark the pool as being available for freeing. It will actually be freed only + * once all the allocated buffers associated with the pool are released. Thus it + * is safe to call this function while some of the allocated buffers are still + * in use. + * + * @param pool pointer to the pool to be freed. It will be set to NULL. + */ +void av_buffer_pool_uninit(AVBufferPool **pool); + +/** + * Allocate a new AVBuffer, reusing an old buffer from the pool when available. + * This function may be called simultaneously from multiple threads. + * + * @return a reference to the new buffer on success, NULL on error. + */ +AVBufferRef *av_buffer_pool_get(AVBufferPool *pool); + +/** + * @} + */ + +#endif /* AVUTIL_BUFFER_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/camellia.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/camellia.h new file mode 100644 index 0000000..e674c9b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/camellia.h @@ -0,0 +1,70 @@ +/* + * An implementation of the CAMELLIA algorithm as mentioned in RFC3713 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAMELLIA_H +#define AVUTIL_CAMELLIA_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAMELLIA algorithm + * @defgroup lavu_camellia CAMELLIA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_camellia_size; + +struct AVCAMELLIA; + +/** + * Allocate an AVCAMELLIA context + * To free the struct: av_free(ptr) + */ +struct AVCAMELLIA *av_camellia_alloc(void); + +/** + * Initialize an AVCAMELLIA context. + * + * @param ctx an AVCAMELLIA context + * @param key a key of 16, 24, 32 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 128, 192, 256 + */ +int av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAMELLIA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_CAMELLIA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cast5.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cast5.h new file mode 100644 index 0000000..ad5b347 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cast5.h @@ -0,0 +1,80 @@ +/* + * An implementation of the CAST128 algorithm as mentioned in RFC2144 + * Copyright (c) 2014 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_CAST5_H +#define AVUTIL_CAST5_H + +#include + + +/** + * @file + * @brief Public header for libavutil CAST5 algorithm + * @defgroup lavu_cast5 CAST5 + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_cast5_size; + +struct AVCAST5; + +/** + * Allocate an AVCAST5 context + * To free the struct: av_free(ptr) + */ +struct AVCAST5 *av_cast5_alloc(void); +/** + * Initialize an AVCAST5 context. + * + * @param ctx an AVCAST5 context + * @param key a key of 5,6,...16 bytes used for encryption/decryption + * @param key_bits number of keybits: possible are 40,48,...,128 + * @return 0 on success, less than 0 on failure + */ +int av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVCAST5 context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); +/** + * @} + */ +#endif /* AVUTIL_CAST5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/channel_layout.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/channel_layout.h new file mode 100644 index 0000000..50bb8f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/channel_layout.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2006 Michael Niedermayer + * Copyright (c) 2008 Peter Ross + * + * 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 + */ + +#ifndef AVUTIL_CHANNEL_LAYOUT_H +#define AVUTIL_CHANNEL_LAYOUT_H + +#include + +/** + * @file + * audio channel layout utility functions + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup channel_masks Audio channel masks + * + * A channel layout is a 64-bits integer with a bit set for every channel. + * The number of bits set must be equal to the number of channels. + * The value 0 means that the channel layout is not known. + * @note this data structure is not powerful enough to handle channels + * combinations that have the same channel multiple times, such as + * dual-mono. + * + * @{ + */ +#define AV_CH_FRONT_LEFT 0x00000001 +#define AV_CH_FRONT_RIGHT 0x00000002 +#define AV_CH_FRONT_CENTER 0x00000004 +#define AV_CH_LOW_FREQUENCY 0x00000008 +#define AV_CH_BACK_LEFT 0x00000010 +#define AV_CH_BACK_RIGHT 0x00000020 +#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040 +#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080 +#define AV_CH_BACK_CENTER 0x00000100 +#define AV_CH_SIDE_LEFT 0x00000200 +#define AV_CH_SIDE_RIGHT 0x00000400 +#define AV_CH_TOP_CENTER 0x00000800 +#define AV_CH_TOP_FRONT_LEFT 0x00001000 +#define AV_CH_TOP_FRONT_CENTER 0x00002000 +#define AV_CH_TOP_FRONT_RIGHT 0x00004000 +#define AV_CH_TOP_BACK_LEFT 0x00008000 +#define AV_CH_TOP_BACK_CENTER 0x00010000 +#define AV_CH_TOP_BACK_RIGHT 0x00020000 +#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix. +#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT. +#define AV_CH_WIDE_LEFT 0x0000000080000000ULL +#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL +#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL +#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL +#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL + +/** Channel mask value used for AVCodecContext.request_channel_layout + to indicate that the user requests the channel order of the decoder output + to be the native codec channel order. */ +#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL + +/** + * @} + * @defgroup channel_mask_c Audio channel layouts + * @{ + * */ +#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) +#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) +#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT) +#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER) +#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY) +#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER) +#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT) +#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT) +#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT) + +enum AVMatrixEncoding { + AV_MATRIX_ENCODING_NONE, + AV_MATRIX_ENCODING_DOLBY, + AV_MATRIX_ENCODING_DPLII, + AV_MATRIX_ENCODING_DPLIIX, + AV_MATRIX_ENCODING_DPLIIZ, + AV_MATRIX_ENCODING_DOLBYEX, + AV_MATRIX_ENCODING_DOLBYHEADPHONE, + AV_MATRIX_ENCODING_NB +}; + +/** + * Return a channel layout id that matches name, or 0 if no match is found. + * + * name can be one or several of the following notations, + * separated by '+' or '|': + * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0, + * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix); + * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC, + * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR); + * - a number of channels, in decimal, followed by 'c', yielding + * the default channel layout for that number of channels (@see + * av_get_default_channel_layout); + * - a channel layout mask, in hexadecimal starting with "0x" (see the + * AV_CH_* macros). + * + * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7" + */ +uint64_t av_get_channel_layout(const char *name); + +/** + * Return a channel layout and the number of channels based on the specified name. + * + * This function is similar to (@see av_get_channel_layout), but can also parse + * unknown channel layout specifications. + * + * @param[in] name channel layout specification string + * @param[out] channel_layout parsed channel layout (0 if unknown) + * @param[out] nb_channels number of channels + * + * @return 0 on success, AVERROR(EINVAL) if the parsing fails. + */ +int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels); + +/** + * Return a description of a channel layout. + * If nb_channels is <= 0, it is guessed from the channel_layout. + * + * @param buf put here the string containing the channel layout + * @param buf_size size in bytes of the buffer + */ +void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); + +struct AVBPrint; +/** + * Append a description of a channel layout to a bprint buffer. + */ +void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout); + +/** + * Return the number of channels in the channel layout. + */ +int av_get_channel_layout_nb_channels(uint64_t channel_layout); + +/** + * Return default channel layout for a given number of channels. + */ +int64_t av_get_default_channel_layout(int nb_channels); + +/** + * Get the index of a channel in channel_layout. + * + * @param channel a channel layout describing exactly one channel which must be + * present in channel_layout. + * + * @return index of channel in channel_layout on success, a negative AVERROR + * on error. + */ +int av_get_channel_layout_channel_index(uint64_t channel_layout, + uint64_t channel); + +/** + * Get the channel with the given index in channel_layout. + */ +uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index); + +/** + * Get the name of a given channel. + * + * @return channel name on success, NULL on error. + */ +const char *av_get_channel_name(uint64_t channel); + +/** + * Get the description of a given channel. + * + * @param channel a channel layout with a single channel + * @return channel description on success, NULL on error + */ +const char *av_get_channel_description(uint64_t channel); + +/** + * Get the value and name of a standard channel layout. + * + * @param[in] index index in an internal list, starting at 0 + * @param[out] layout channel layout mask + * @param[out] name name of the layout + * @return 0 if the layout exists, + * <0 if index is beyond the limits + */ +int av_get_standard_channel_layout(unsigned index, uint64_t *layout, + const char **name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_CHANNEL_LAYOUT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/common.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/common.h new file mode 100644 index 0000000..8db0291 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/common.h @@ -0,0 +1,560 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * common internal and external API header + */ + +#ifndef AVUTIL_COMMON_H +#define AVUTIL_COMMON_H + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) +#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "attributes.h" +#include "macros.h" +#include "version.h" +#include "libavutil/avconfig.h" + +#if AV_HAVE_BIGENDIAN +# define AV_NE(be, le) (be) +#else +# define AV_NE(be, le) (le) +#endif + +//rounded division & shift +#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) +/* assume b>0 */ +#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) +/* Fast a/(1<=0 and b>=0 */ +#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ + : ((a) + (1<<(b)) - 1) >> (b)) +/* Backwards compat. */ +#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT + +#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) +#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) + +/** + * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they + * are not representable as absolute values of their type. This is the same + * as with *abs() + * @see FFNABS() + */ +#define FFABS(a) ((a) >= 0 ? (a) : (-(a))) +#define FFSIGN(a) ((a) > 0 ? 1 : -1) + +/** + * Negative Absolute value. + * this works for all integers of all types. + * As with many macros, this evaluates its argument twice, it thus must not have + * a sideeffect, that is FFNABS(x++) has undefined behavior. + */ +#define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) + +/** + * Comparator. + * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0 + * if x == y. This is useful for instance in a qsort comparator callback. + * Furthermore, compilers are able to optimize this to branchless code, and + * there is no risk of overflow with signed types. + * As with many macros, this evaluates its argument multiple times, it thus + * must not have a side-effect. + */ +#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y))) + +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) + +#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) + +/* misc math functions */ + +#ifdef HAVE_AV_CONFIG_H +# include "config.h" +# include "intmath.h" +#endif + +/* Pull in unguarded fallback defines at the end of this file. */ +#include "common.h" + +#ifndef av_log2 +av_const int av_log2(unsigned v); +#endif + +#ifndef av_log2_16bit +av_const int av_log2_16bit(unsigned v); +#endif + +/** + * Clip a signed integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int av_clip_c(int a, int amin, int amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed 64bit integer value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a signed integer value into the 0-255 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint8_t av_clip_uint8_c(int a) +{ + if (a&(~0xFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -128,127 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int8_t av_clip_int8_c(int a) +{ + if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; + else return a; +} + +/** + * Clip a signed integer value into the 0-65535 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const uint16_t av_clip_uint16_c(int a) +{ + if (a&(~0xFFFF)) return (~a)>>31; + else return a; +} + +/** + * Clip a signed integer value into the -32768,32767 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int16_t av_clip_int16_c(int a) +{ + if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; + else return a; +} + +/** + * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. + * @param a value to clip + * @return clipped value + */ +static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) +{ + if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); + else return (int32_t)a; +} + +/** + * Clip a signed integer into the -(2^p),(2^p-1) range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const int av_clip_intp2_c(int a, int p) +{ + if (((unsigned)a + (1 << p)) & ~((2 << p) - 1)) + return (a >> 31) ^ ((1 << p) - 1); + else + return a; +} + +/** + * Clip a signed integer to an unsigned power of two range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) +{ + if (a & ~((1<> 31 & ((1<= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** + * Clip a double value into the amin-amax range. + * @param a value to clip + * @param amin minimum value of the clip range + * @param amax maximum value of the clip range + * @return clipped value + */ +static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) +{ +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 + if (amin > amax) abort(); +#endif + if (a < amin) return amin; + else if (a > amax) return amax; + else return a; +} + +/** Compute ceil(log2(x)). + * @param x value used to compute ceil(log2(x)) + * @return computed ceiling of log2(x) + */ +static av_always_inline av_const int av_ceil_log2_c(int x) +{ + return av_log2((x - 1) << 1); +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount_c(uint32_t x) +{ + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +} + +/** + * Count number of bits set to one in x + * @param x value to count bits of + * @return the number of bits set to one in x + */ +static av_always_inline av_const int av_popcount64_c(uint64_t x) +{ + return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); +} + +static av_always_inline av_const int av_parity_c(uint32_t v) +{ + return av_popcount(v) & 1; +} + +#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) +#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) + +/** + * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_BYTE Expression reading one byte from the input. + * Evaluated up to 7 times (4 for the currently + * assigned Unicode range). With a memory buffer + * input, this could be *ptr++. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + * + * @warning ERROR should not contain a loop control statement which + * could interact with the internal while loop, and should force an + * exit from the macro code (e.g. through a goto or a return) in order + * to prevent undefined results. + */ +#define GET_UTF8(val, GET_BYTE, ERROR)\ + val= (GET_BYTE);\ + {\ + uint32_t top = (val & 128) >> 1;\ + if ((val & 0xc0) == 0x80 || val >= 0xFE)\ + ERROR\ + while (val & top) {\ + int tmp= (GET_BYTE) - 128;\ + if(tmp>>6)\ + ERROR\ + val= (val<<6) + tmp;\ + top <<= 5;\ + }\ + val &= (top << 1) - 1;\ + } + +/** + * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. + * + * @param val Output value, must be an lvalue of type uint32_t. + * @param GET_16BIT Expression returning two bytes of UTF-16 data converted + * to native byte order. Evaluated one or two times. + * @param ERROR Expression to be evaluated on invalid input, + * typically a goto statement. + */ +#define GET_UTF16(val, GET_16BIT, ERROR)\ + val = GET_16BIT;\ + {\ + unsigned int hi = val - 0xD800;\ + if (hi < 0x800) {\ + val = GET_16BIT - 0xDC00;\ + if (val > 0x3FFU || hi > 0x3FFU)\ + ERROR\ + val += (hi<<10) + 0x10000;\ + }\ + }\ + +/** + * @def PUT_UTF8(val, tmp, PUT_BYTE) + * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint8_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_BYTE. + * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. + * It could be a function or a statement, and uses tmp as the input byte. + * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be + * executed up to 4 times for values in the valid UTF-8 range and up to + * 7 times in the general case, depending on the length of the converted + * Unicode character. + */ +#define PUT_UTF8(val, tmp, PUT_BYTE)\ + {\ + int bytes, shift;\ + uint32_t in = val;\ + if (in < 0x80) {\ + tmp = in;\ + PUT_BYTE\ + } else {\ + bytes = (av_log2(in) + 4) / 5;\ + shift = (bytes - 1) * 6;\ + tmp = (256 - (256 >> bytes)) | (in >> shift);\ + PUT_BYTE\ + while (shift >= 6) {\ + shift -= 6;\ + tmp = 0x80 | ((in >> shift) & 0x3f);\ + PUT_BYTE\ + }\ + }\ + } + +/** + * @def PUT_UTF16(val, tmp, PUT_16BIT) + * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). + * @param val is an input-only argument and should be of type uint32_t. It holds + * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If + * val is given as a function it is executed only once. + * @param tmp is a temporary variable and should be of type uint16_t. It + * represents an intermediate value during conversion that is to be + * output by PUT_16BIT. + * @param PUT_16BIT writes the converted UTF-16 data to any proper destination + * in desired endianness. It could be a function or a statement, and uses tmp + * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" + * PUT_BYTE will be executed 1 or 2 times depending on input character. + */ +#define PUT_UTF16(val, tmp, PUT_16BIT)\ + {\ + uint32_t in = val;\ + if (in < 0x10000) {\ + tmp = in;\ + PUT_16BIT\ + } else {\ + tmp = 0xD800 | ((in - 0x10000) >> 10);\ + PUT_16BIT\ + tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ + PUT_16BIT\ + }\ + }\ + + + +#include "mem.h" + +#ifdef HAVE_AV_CONFIG_H +# include "internal.h" +#endif /* HAVE_AV_CONFIG_H */ + +#endif /* AVUTIL_COMMON_H */ + +/* + * The following definitions are outside the multiple inclusion guard + * to ensure they are immediately available in intmath.h. + */ + +#ifndef av_ceil_log2 +# define av_ceil_log2 av_ceil_log2_c +#endif +#ifndef av_clip +# define av_clip av_clip_c +#endif +#ifndef av_clip64 +# define av_clip64 av_clip64_c +#endif +#ifndef av_clip_uint8 +# define av_clip_uint8 av_clip_uint8_c +#endif +#ifndef av_clip_int8 +# define av_clip_int8 av_clip_int8_c +#endif +#ifndef av_clip_uint16 +# define av_clip_uint16 av_clip_uint16_c +#endif +#ifndef av_clip_int16 +# define av_clip_int16 av_clip_int16_c +#endif +#ifndef av_clipl_int32 +# define av_clipl_int32 av_clipl_int32_c +#endif +#ifndef av_clip_intp2 +# define av_clip_intp2 av_clip_intp2_c +#endif +#ifndef av_clip_uintp2 +# define av_clip_uintp2 av_clip_uintp2_c +#endif +#ifndef av_mod_uintp2 +# define av_mod_uintp2 av_mod_uintp2_c +#endif +#ifndef av_sat_add32 +# define av_sat_add32 av_sat_add32_c +#endif +#ifndef av_sat_dadd32 +# define av_sat_dadd32 av_sat_dadd32_c +#endif +#ifndef av_sat_sub32 +# define av_sat_sub32 av_sat_sub32_c +#endif +#ifndef av_sat_dsub32 +# define av_sat_dsub32 av_sat_dsub32_c +#endif +#ifndef av_clipf +# define av_clipf av_clipf_c +#endif +#ifndef av_clipd +# define av_clipd av_clipd_c +#endif +#ifndef av_popcount +# define av_popcount av_popcount_c +#endif +#ifndef av_popcount64 +# define av_popcount64 av_popcount64_c +#endif +#ifndef av_parity +# define av_parity av_parity_c +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cpu.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cpu.h new file mode 100644 index 0000000..8bb9eb6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/cpu.h @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2000, 2001, 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 + */ + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#include + +#include "attributes.h" + +#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX +#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions +#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster + ///< than regular MMX/SSE (e.g. Core1) +#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster +#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower +#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions +#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer) +#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions +#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions +#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction +#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used +#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions +#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1 +#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2 +#define AV_CPU_FLAG_AVX512 0x100000 ///< AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used + +#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard +#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06 +#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07 + +#define AV_CPU_FLAG_ARMV5TE (1 << 0) +#define AV_CPU_FLAG_ARMV6 (1 << 1) +#define AV_CPU_FLAG_ARMV6T2 (1 << 2) +#define AV_CPU_FLAG_VFP (1 << 3) +#define AV_CPU_FLAG_VFPV3 (1 << 4) +#define AV_CPU_FLAG_NEON (1 << 5) +#define AV_CPU_FLAG_ARMV8 (1 << 6) +#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations +#define AV_CPU_FLAG_SETEND (1 <<16) + +/** + * Return the flags which specify extensions supported by the CPU. + * The returned value is affected by av_force_cpu_flags() if that was used + * before. So av_get_cpu_flags() can easily be used in an application to + * detect the enabled cpu flags. + */ +int av_get_cpu_flags(void); + +/** + * Disables cpu detection and forces the specified flags. + * -1 is a special case that disables forcing of specific flags. + */ +void av_force_cpu_flags(int flags); + +/** + * Set a mask on flags returned by av_get_cpu_flags(). + * This function is mainly useful for testing. + * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible + */ +attribute_deprecated void av_set_cpu_flags_mask(int mask); + +/** + * Parse CPU flags from a string. + * + * The returned flags contain the specified flags as well as related unspecified flags. + * + * This function exists only for compatibility with libav. + * Please use av_parse_cpu_caps() when possible. + * @return a combination of AV_CPU_* flags, negative on error. + */ +attribute_deprecated +int av_parse_cpu_flags(const char *s); + +/** + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that. + * + * @return negative on error. + */ +int av_parse_cpu_caps(unsigned *flags, const char *s); + +/** + * @return the number of logical CPU cores present. + */ +int av_cpu_count(void); + +/** + * Get the maximum data alignment that may be required by FFmpeg. + * + * Note that this is affected by the build configuration and the CPU flags mask, + * so e.g. if the CPU supports AVX, but libavutil has been built with + * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through + * av_set_cpu_flags_mask(), then this function will behave as if AVX is not + * present. + */ +size_t av_cpu_max_align(void); + +#endif /* AVUTIL_CPU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/crc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/crc.h new file mode 100644 index 0000000..47e22b4 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/crc.h @@ -0,0 +1,100 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_crc32 + * Public header for CRC hash function implementation. + */ + +#ifndef AVUTIL_CRC_H +#define AVUTIL_CRC_H + +#include +#include +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_crc32 CRC + * @ingroup lavu_hash + * CRC (Cyclic Redundancy Check) hash function implementation. + * + * This module supports numerous CRC polynomials, in addition to the most + * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available + * polynomials. + * + * @{ + */ + +typedef uint32_t AVCRC; + +typedef enum { + AV_CRC_8_ATM, + AV_CRC_16_ANSI, + AV_CRC_16_CCITT, + AV_CRC_32_IEEE, + AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ + AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ + AV_CRC_24_IEEE, + AV_CRC_8_EBU, + AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ +}AVCRCId; + +/** + * Initialize a CRC table. + * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 + * @param le If 1, the lowest bit represents the coefficient for the highest + * exponent of the corresponding polynomial (both for poly and + * actual CRC). + * If 0, you must swap the CRC parameter and the result of av_crc + * if you need the standard representation (can be simplified in + * most cases to e.g. bswap16): + * av_bswap32(crc << (32-bits)) + * @param bits number of bits for the CRC + * @param poly generator polynomial without the x**bits coefficient, in the + * representation as specified by le + * @param ctx_size size of ctx in bytes + * @return <0 on failure + */ +int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); + +/** + * Get an initialized standard CRC table. + * @param crc_id ID of a standard CRC + * @return a pointer to the CRC table or NULL on failure + */ +const AVCRC *av_crc_get_table(AVCRCId crc_id); + +/** + * Calculate the CRC of a block. + * @param crc CRC of previous blocks if any or initial value for CRC + * @return CRC updated with the data from the given block + * + * @see av_crc_init() "le" parameter + */ +uint32_t av_crc(const AVCRC *ctx, uint32_t crc, + const uint8_t *buffer, size_t length) av_pure; + +/** + * @} + */ + +#endif /* AVUTIL_CRC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/des.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/des.h new file mode 100644 index 0000000..4cf11f5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/des.h @@ -0,0 +1,77 @@ +/* + * DES encryption/decryption + * Copyright (c) 2007 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_DES_H +#define AVUTIL_DES_H + +#include + +/** + * @defgroup lavu_des DES + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVDES { + uint64_t round_keys[3][16]; + int triple_des; +} AVDES; + +/** + * Allocate an AVDES context. + */ +AVDES *av_des_alloc(void); + +/** + * @brief Initializes an AVDES context. + * + * @param key_bits must be 64 or 192 + * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption + * @return zero on success, negative value otherwise + */ +int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + * @param iv initialization vector for CBC mode, if NULL then ECB will be used, + * must be 8-byte aligned + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @brief Calculates CBC-MAC using the DES algorithm. + * + * @param count number of 8 byte blocks + * @param dst destination array, can be equal to src, must be 8-byte aligned + * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL + */ +void av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count); + +/** + * @} + */ + +#endif /* AVUTIL_DES_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/dict.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/dict.h new file mode 100644 index 0000000..118f1f0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/dict.h @@ -0,0 +1,200 @@ +/* + * 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 + * Public dictionary API. + * @deprecated + * AVDictionary is provided for compatibility with libav. It is both in + * implementation as well as API inefficient. It does not scale and is + * extremely slow with large dictionaries. + * It is recommended that new code uses our tree container from tree.c/h + * where applicable, which uses AVL trees to achieve O(log n) performance. + */ + +#ifndef AVUTIL_DICT_H +#define AVUTIL_DICT_H + +#include + +#include "version.h" + +/** + * @addtogroup lavu_dict AVDictionary + * @ingroup lavu_data + * + * @brief Simple key:value store + * + * @{ + * Dictionaries are used for storing key:value pairs. To create + * an AVDictionary, simply pass an address of a NULL pointer to + * av_dict_set(). NULL can be used as an empty dictionary wherever + * a pointer to an AVDictionary is required. + * Use av_dict_get() to retrieve an entry or iterate over all + * entries and finally av_dict_free() to free the dictionary + * and all its contents. + * + @code + AVDictionary *d = NULL; // "create" an empty dictionary + AVDictionaryEntry *t = NULL; + + av_dict_set(&d, "foo", "bar", 0); // add an entry + + char *k = av_strdup("key"); // if your strings are already allocated, + char *v = av_strdup("value"); // you can avoid copying them like this + av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); + + while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) { + <....> // iterate over all entries in d + } + av_dict_free(&d); + @endcode + */ + +#define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */ +#define AV_DICT_IGNORE_SUFFIX 2 /**< Return first entry in a dictionary whose first part corresponds to the search key, + ignoring the suffix of the found key string. Only relevant in av_dict_get(). */ +#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been + allocated with av_malloc() or another memory allocation function. */ +#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries. +#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no + delimiter is added, the strings are simply concatenated. */ +#define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ + +typedef struct AVDictionaryEntry { + char *key; + char *value; +} AVDictionaryEntry; + +typedef struct AVDictionary AVDictionary; + +/** + * Get a dictionary entry with matching key. + * + * The returned entry key or value must not be changed, or it will + * cause undefined behavior. + * + * To iterate through all the dictionary entries, you can set the matching key + * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag. + * + * @param prev Set to the previous matching element to find the next. + * If set to NULL the first matching element is returned. + * @param key matching key + * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved + * @return found entry or NULL in case no matching entry was found in the dictionary + */ +AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, + const AVDictionaryEntry *prev, int flags); + +/** + * Get number of entries in dictionary. + * + * @param m dictionary + * @return number of entries in dictionary + */ +int av_dict_count(const AVDictionary *m); + +/** + * Set the given entry in *pm, overwriting an existing entry. + * + * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set, + * these arguments will be freed on error. + * + * Warning: Adding a new entry to a dictionary invalidates all existing entries + * previously returned with av_dict_get. + * + * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL + * a dictionary struct is allocated and put in *pm. + * @param key entry key to add to *pm (will either be av_strduped or added as a new key depending on flags) + * @param value entry value to add to *pm (will be av_strduped or added as a new key depending on flags). + * Passing a NULL value will cause an existing entry to be deleted. + * @return >= 0 on success otherwise an error code <0 + */ +int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags); + +/** + * Convenience wrapper for av_dict_set that converts the value to a string + * and stores it. + * + * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error. + */ +int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags); + +/** + * Parse the key/value pairs list and add the parsed entries to a dictionary. + * + * In case of failure, all the successfully set entries are stored in + * *pm. You may need to manually free the created dictionary. + * + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @param flags flags to use when adding to dictionary. + * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL + * are ignored since the key/value tokens will always + * be duplicated. + * @return 0 on success, negative AVERROR code on failure + */ +int av_dict_parse_string(AVDictionary **pm, const char *str, + const char *key_val_sep, const char *pairs_sep, + int flags); + +/** + * Copy entries from one AVDictionary struct into another. + * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL, + * this function will allocate a struct for you and put it in *dst + * @param src pointer to source AVDictionary struct + * @param flags flags to use when setting entries in *dst + * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag + * @return 0 on success, negative AVERROR code on failure. If dst was allocated + * by this function, callers should free the associated memory. + */ +int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags); + +/** + * Free all the memory allocated for an AVDictionary struct + * and all keys and values. + */ +void av_dict_free(AVDictionary **m); + +/** + * Get dictionary entries as a string. + * + * Create a string containing dictionary's entries. + * Such string may be passed back to av_dict_parse_string(). + * @note String is escaped with backslashes ('\'). + * + * @param[in] m dictionary + * @param[out] buffer Pointer to buffer that will be allocated with string containg entries. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_dict_get_string(const AVDictionary *m, char **buffer, + const char key_val_sep, const char pairs_sep); + +/** + * @} + */ + +#endif /* AVUTIL_DICT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/display.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/display.h new file mode 100644 index 0000000..515adad --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/display.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2014 Vittorio Giovara + * + * 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 + * Display matrix + */ + +#ifndef AVUTIL_DISPLAY_H +#define AVUTIL_DISPLAY_H + +#include +#include "common.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_display Display transformation matrix functions + * @{ + */ + +/** + * @addtogroup lavu_video_display + * The display transformation matrix specifies an affine transformation that + * should be applied to video frames for correct presentation. It is compatible + * with the matrices stored in the ISO/IEC 14496-12 container format. + * + * The data is a 3x3 matrix represented as a 9-element array: + * + * @code{.unparsed} + * | a b u | + * (a, b, u, c, d, v, x, y, w) -> | c d v | + * | x y w | + * @endcode + * + * All numbers are stored in native endianness, as 16.16 fixed-point values, + * except for u, v and w, which are stored as 2.30 fixed-point values. + * + * The transformation maps a point (p, q) in the source (pre-transformation) + * frame to the point (p', q') in the destination (post-transformation) frame as + * follows: + * + * @code{.unparsed} + * | a b u | + * (p, q, 1) . | c d v | = z * (p', q', 1) + * | x y w | + * @endcode + * + * The transformation can also be more explicitly written in components as + * follows: + * + * @code{.unparsed} + * p' = (a * p + c * q + x) / z; + * q' = (b * p + d * q + y) / z; + * z = u * p + v * q + w + * @endcode + */ + +/** + * Extract the rotation component of the transformation matrix. + * + * @param matrix the transformation matrix + * @return the angle (in degrees) by which the transformation rotates the frame + * counterclockwise. The angle will be in range [-180.0, 180.0], + * or NaN if the matrix is singular. + * + * @note floating point numbers are inherently inexact, so callers are + * recommended to round the return value to nearest integer before use. + */ +double av_display_rotation_get(const int32_t matrix[9]); + +/** + * Initialize a transformation matrix describing a pure counterclockwise + * rotation by the specified angle (in degrees). + * + * @param matrix an allocated transformation matrix (will be fully overwritten + * by this function) + * @param angle rotation angle in degrees. + */ +void av_display_rotation_set(int32_t matrix[9], double angle); + +/** + * Flip the input matrix horizontally and/or vertically. + * + * @param matrix an allocated transformation matrix + * @param hflip whether the matrix should be flipped horizontally + * @param vflip whether the matrix should be flipped vertically + */ +void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_DISPLAY_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/downmix_info.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/downmix_info.h new file mode 100644 index 0000000..221cf5b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/downmix_info.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2014 Tim Walker + * + * 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 + */ + +#ifndef AVUTIL_DOWNMIX_INFO_H +#define AVUTIL_DOWNMIX_INFO_H + +#include "frame.h" + +/** + * @file + * audio downmix medatata + */ + +/** + * @addtogroup lavu_audio + * @{ + */ + +/** + * @defgroup downmix_info Audio downmix metadata + * @{ + */ + +/** + * Possible downmix types. + */ +enum AVDownmixType { + AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */ + AV_DOWNMIX_TYPE_LORO, /**< Lo/Ro 2-channel downmix (Stereo). */ + AV_DOWNMIX_TYPE_LTRT, /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */ + AV_DOWNMIX_TYPE_DPLII, /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */ + AV_DOWNMIX_TYPE_NB /**< Number of downmix types. Not part of ABI. */ +}; + +/** + * This structure describes optional metadata relevant to a downmix procedure. + * + * All fields are set by the decoder to the value indicated in the audio + * bitstream (if present), or to a "sane" default otherwise. + */ +typedef struct AVDownmixInfo { + /** + * Type of downmix preferred by the mastering engineer. + */ + enum AVDownmixType preferred_downmix_type; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during a regular downmix. + */ + double center_mix_level; + + /** + * Absolute scale factor representing the nominal level of the center + * channel during an Lt/Rt compatible downmix. + */ + double center_mix_level_ltrt; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during a regular downmix. + */ + double surround_mix_level; + + /** + * Absolute scale factor representing the nominal level of the surround + * channels during an Lt/Rt compatible downmix. + */ + double surround_mix_level_ltrt; + + /** + * Absolute scale factor representing the level at which the LFE data is + * mixed into L/R channels during downmixing. + */ + double lfe_mix_level; +} AVDownmixInfo; + +/** + * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing. + * + * If the side data is absent, it is created and added to the frame. + * + * @param frame the frame for which the side data is to be obtained or created + * + * @return the AVDownmixInfo structure to be edited by the caller, or NULL if + * the structure cannot be allocated. + */ +AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame); + +/** + * @} + */ + +/** + * @} + */ + +#endif /* AVUTIL_DOWNMIX_INFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/encryption_info.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/encryption_info.h new file mode 100644 index 0000000..8fe7ebf --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/encryption_info.h @@ -0,0 +1,205 @@ +/** + * 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 + */ + +#ifndef AVUTIL_ENCRYPTION_INFO_H +#define AVUTIL_ENCRYPTION_INFO_H + +#include +#include + +typedef struct AVSubsampleEncryptionInfo { + /** The number of bytes that are clear. */ + unsigned int bytes_of_clear_data; + + /** + * The number of bytes that are protected. If using pattern encryption, + * the pattern applies to only the protected bytes; if not using pattern + * encryption, all these bytes are encrypted. + */ + unsigned int bytes_of_protected_data; +} AVSubsampleEncryptionInfo; + +/** + * This describes encryption info for a packet. This contains frame-specific + * info for how to decrypt the packet before passing it to the decoder. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInfo { + /** The fourcc encryption scheme, in big-endian byte order. */ + uint32_t scheme; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are encrypted. + */ + uint32_t crypt_byte_block; + + /** + * Only used for pattern encryption. This is the number of 16-byte blocks + * that are clear. + */ + uint32_t skip_byte_block; + + /** + * The ID of the key used to encrypt the packet. This should always be + * 16 bytes long, but may be changed in the future. + */ + uint8_t *key_id; + uint32_t key_id_size; + + /** + * The initialization vector. This may have been zero-filled to be the + * correct block size. This should always be 16 bytes long, but may be + * changed in the future. + */ + uint8_t *iv; + uint32_t iv_size; + + /** + * An array of subsample encryption info specifying how parts of the sample + * are encrypted. If there are no subsamples, then the whole sample is + * encrypted. + */ + AVSubsampleEncryptionInfo *subsamples; + uint32_t subsample_count; +} AVEncryptionInfo; + +/** + * This describes info used to initialize an encryption key system. + * + * The size of this struct is not part of the public ABI. + */ +typedef struct AVEncryptionInitInfo { + /** + * A unique identifier for the key system this is for, can be NULL if it + * is not known. This should always be 16 bytes, but may change in the + * future. + */ + uint8_t* system_id; + uint32_t system_id_size; + + /** + * An array of key IDs this initialization data is for. All IDs are the + * same length. Can be NULL if there are no known key IDs. + */ + uint8_t** key_ids; + /** The number of key IDs. */ + uint32_t num_key_ids; + /** + * The number of bytes in each key ID. This should always be 16, but may + * change in the future. + */ + uint32_t key_id_size; + + /** + * Key-system specific initialization data. This data is copied directly + * from the file and the format depends on the specific key system. This + * can be NULL if there is no initialization data; in that case, there + * will be at least one key ID. + */ + uint8_t* data; + uint32_t data_size; + + /** + * An optional pointer to the next initialization info in the list. + */ + struct AVEncryptionInitInfo *next; +} AVEncryptionInitInfo; + +/** + * Allocates an AVEncryptionInfo structure and sub-pointers to hold the given + * number of subsamples. This will allocate pointers for the key ID, IV, + * and subsample entries, set the size members, and zero-initialize the rest. + * + * @param subsample_count The number of subsamples. + * @param key_id_size The number of bytes in the key ID, should be 16. + * @param iv_size The number of bytes in the IV, should be 16. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size); + +/** + * Allocates an AVEncryptionInfo structure with a copy of the given data. + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_clone(const AVEncryptionInfo *info); + +/** + * Frees the given encryption info object. This MUST NOT be used to free the + * side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_info_free(AVEncryptionInfo *info); + +/** + * Creates a copy of the AVEncryptionInfo that is contained in the given side + * data. The resulting object should be passed to av_encryption_info_free() + * when done. + * + * @return The new AVEncryptionInfo structure, or NULL on error. + */ +AVEncryptionInfo *av_encryption_info_get_side_data(const uint8_t *side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * info. The resulting pointer should be either freed using av_free or given + * to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_info_add_side_data( + const AVEncryptionInfo *info, size_t *side_data_size); + + +/** + * Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the + * given sizes. This will allocate pointers and set all the fields. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_alloc( + uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size); + +/** + * Frees the given encryption init info object. This MUST NOT be used to free + * the side-data data pointer, that should use normal side-data methods. + */ +void av_encryption_init_info_free(AVEncryptionInitInfo* info); + +/** + * Creates a copy of the AVEncryptionInitInfo that is contained in the given + * side data. The resulting object should be passed to + * av_encryption_init_info_free() when done. + * + * @return The new AVEncryptionInitInfo structure, or NULL on error. + */ +AVEncryptionInitInfo *av_encryption_init_info_get_side_data( + const uint8_t* side_data, size_t side_data_size); + +/** + * Allocates and initializes side data that holds a copy of the given encryption + * init info. The resulting pointer should be either freed using av_free or + * given to av_packet_add_side_data(). + * + * @return The new side-data pointer, or NULL. + */ +uint8_t *av_encryption_init_info_add_side_data( + const AVEncryptionInitInfo *info, size_t *side_data_size); + +#endif /* AVUTIL_ENCRYPTION_INFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/error.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/error.h new file mode 100644 index 0000000..71df4da --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/error.h @@ -0,0 +1,126 @@ +/* + * 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 + * error code definitions + */ + +#ifndef AVUTIL_ERROR_H +#define AVUTIL_ERROR_H + +#include +#include + +/** + * @addtogroup lavu_error + * + * @{ + */ + + +/* error handling */ +#if EDOM > 0 +#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions. +#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value. +#else +/* Some platforms have E* and errno already negated. */ +#define AVERROR(e) (e) +#define AVUNERROR(e) (e) +#endif + +#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) + +#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found +#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2 +#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small +#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found +#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found +#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found +#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file +#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted +#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library +#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found +#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input +#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found +#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found +#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome +#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found + +#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< Stream not found +/** + * This is semantically identical to AVERROR_BUG + * it has been introduced in Libav after our AVERROR_BUG and with a modified value. + */ +#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ') +#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library +#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it. +#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED) +#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED) +/* HTTP & RTSP errors */ +#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0') +#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1') +#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3') +#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4') +#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X') +#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X') + +#define AV_ERROR_MAX_STRING_SIZE 64 + +/** + * Put a description of the AVERROR code errnum in errbuf. + * In case of failure the global variable errno is set to indicate the + * error. Even in case of failure av_strerror() will print a generic + * error message indicating the errnum provided to errbuf. + * + * @param errnum error code to describe + * @param errbuf buffer to which description is written + * @param errbuf_size the size in bytes of errbuf + * @return 0 on success, a negative value if a description for errnum + * cannot be found + */ +int av_strerror(int errnum, char *errbuf, size_t errbuf_size); + +/** + * Fill the provided buffer with a string containing an error string + * corresponding to the AVERROR code errnum. + * + * @param errbuf a buffer + * @param errbuf_size size in bytes of errbuf + * @param errnum error code to describe + * @return the buffer in input, filled with the error description + * @see av_strerror() + */ +static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum) +{ + av_strerror(errnum, errbuf, errbuf_size); + return errbuf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_err2str(errnum) \ + av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum) + +/** + * @} + */ + +#endif /* AVUTIL_ERROR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/eval.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/eval.h new file mode 100644 index 0000000..dacd22b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/eval.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2002 Michael Niedermayer + * + * 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 + * simple arithmetic expression evaluator + */ + +#ifndef AVUTIL_EVAL_H +#define AVUTIL_EVAL_H + +#include "avutil.h" + +typedef struct AVExpr AVExpr; + +/** + * Parse and evaluate an expression. + * Note, this is significantly slower than av_expr_eval(). + * + * @param res a pointer to a double where is put the result value of + * the expression, or NAN in case of error + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param const_values a zero terminated array of values for the identifiers from const_names + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse_and_eval(double *res, const char *s, + const char * const *const_names, const double *const_values, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + void *opaque, int log_offset, void *log_ctx); + +/** + * Parse an expression. + * + * @param expr a pointer where is put an AVExpr containing the parsed + * value in case of successful parsing, or NULL otherwise. + * The pointed to AVExpr must be freed with av_expr_free() by the user + * when it is not needed anymore. + * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" + * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} + * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers + * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument + * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers + * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments + * @param log_ctx parent logging context + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_expr_parse(AVExpr **expr, const char *s, + const char * const *const_names, + const char * const *func1_names, double (* const *funcs1)(void *, double), + const char * const *func2_names, double (* const *funcs2)(void *, double, double), + int log_offset, void *log_ctx); + +/** + * Evaluate a previously parsed expression. + * + * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names + * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 + * @return the value of the expression + */ +double av_expr_eval(AVExpr *e, const double *const_values, void *opaque); + +/** + * Free a parsed expression previously created with av_expr_parse(). + */ +void av_expr_free(AVExpr *e); + +/** + * Parse the string in numstr and return its value as a double. If + * the string is empty, contains only whitespaces, or does not contain + * an initial substring that has the expected syntax for a + * floating-point number, no conversion is performed. In this case, + * returns a value of zero and the value returned in tail is the value + * of numstr. + * + * @param numstr a string representing a number, may contain one of + * the International System number postfixes, for example 'K', 'M', + * 'G'. If 'i' is appended after the postfix, powers of 2 are used + * instead of powers of 10. The 'B' postfix multiplies the value by + * 8, and can be appended after another postfix or used alone. This + * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix. + * @param tail if non-NULL puts here the pointer to the char next + * after the last parsed character + */ +double av_strtod(const char *numstr, char **tail); + +#endif /* AVUTIL_EVAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ffversion.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ffversion.h new file mode 100644 index 0000000..4690884 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ffversion.h @@ -0,0 +1,5 @@ +/* Automatically generated by version.sh, do not manually edit! */ +#ifndef AVUTIL_FFVERSION_H +#define AVUTIL_FFVERSION_H +#define FFMPEG_VERSION "4.2.1" +#endif /* AVUTIL_FFVERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/fifo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/fifo.h new file mode 100644 index 0000000..dc7bc6f --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/fifo.h @@ -0,0 +1,179 @@ +/* + * 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 + * a very simple circular buffer FIFO implementation + */ + +#ifndef AVUTIL_FIFO_H +#define AVUTIL_FIFO_H + +#include +#include "avutil.h" +#include "attributes.h" + +typedef struct AVFifoBuffer { + uint8_t *buffer; + uint8_t *rptr, *wptr, *end; + uint32_t rndx, wndx; +} AVFifoBuffer; + +/** + * Initialize an AVFifoBuffer. + * @param size of FIFO + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc(unsigned int size); + +/** + * Initialize an AVFifoBuffer. + * @param nmemb number of elements + * @param size size of the single element + * @return AVFifoBuffer or NULL in case of memory allocation failure + */ +AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size); + +/** + * Free an AVFifoBuffer. + * @param f AVFifoBuffer to free + */ +void av_fifo_free(AVFifoBuffer *f); + +/** + * Free an AVFifoBuffer and reset pointer to NULL. + * @param f AVFifoBuffer to free + */ +void av_fifo_freep(AVFifoBuffer **f); + +/** + * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied. + * @param f AVFifoBuffer to reset + */ +void av_fifo_reset(AVFifoBuffer *f); + +/** + * Return the amount of data in bytes in the AVFifoBuffer, that is the + * amount of data you can read from it. + * @param f AVFifoBuffer to read from + * @return size + */ +int av_fifo_size(const AVFifoBuffer *f); + +/** + * Return the amount of space in bytes in the AVFifoBuffer, that is the + * amount of data you can write into it. + * @param f AVFifoBuffer to write into + * @return size + */ +int av_fifo_space(const AVFifoBuffer *f); + +/** + * Feed data at specific position from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param offset offset from current read position + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * Similar as av_fifo_gereric_read but without discarding data. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from an AVFifoBuffer to a user-supplied callback. + * @param f AVFifoBuffer to read from + * @param buf_size number of bytes to read + * @param func generic read function + * @param dest data destination + */ +int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)); + +/** + * Feed data from a user-supplied callback to an AVFifoBuffer. + * @param f AVFifoBuffer to write to + * @param src data source; non-const since it may be used as a + * modifiable context by the function defined in func + * @param size number of bytes to write + * @param func generic write function; the first parameter is src, + * the second is dest_buf, the third is dest_buf_size. + * func must return the number of bytes written to dest_buf, or <= 0 to + * indicate no more data available to write. + * If func is NULL, src is interpreted as a simple byte array for source data. + * @return the number of bytes written to the FIFO + */ +int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)); + +/** + * Resize an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * + * @param f AVFifoBuffer to resize + * @param size new AVFifoBuffer size in bytes + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size); + +/** + * Enlarge an AVFifoBuffer. + * In case of reallocation failure, the old FIFO is kept unchanged. + * The new fifo size may be larger than the requested size. + * + * @param f AVFifoBuffer to resize + * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size() + * @return <0 for failure, >=0 otherwise + */ +int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space); + +/** + * Read and discard the specified amount of data from an AVFifoBuffer. + * @param f AVFifoBuffer to read from + * @param size amount of data to read in bytes + */ +void av_fifo_drain(AVFifoBuffer *f, int size); + +/** + * Return a pointer to the data stored in a FIFO buffer at a certain offset. + * The FIFO buffer is not modified. + * + * @param f AVFifoBuffer to peek at, f must be non-NULL + * @param offs an offset in bytes, its absolute value must be less + * than the used buffer size or the returned pointer will + * point outside to the buffer data. + * The used buffer size can be checked with av_fifo_size(). + */ +static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs) +{ + uint8_t *ptr = f->rptr + offs; + if (ptr >= f->end) + ptr = f->buffer + (ptr - f->end); + else if (ptr < f->buffer) + ptr = f->end - (f->buffer - ptr); + return ptr; +} + +#endif /* AVUTIL_FIFO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/file.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/file.h new file mode 100644 index 0000000..3ef4a60 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/file.h @@ -0,0 +1,71 @@ +/* + * 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 + */ + +#ifndef AVUTIL_FILE_H +#define AVUTIL_FILE_H + +#include + +#include "avutil.h" + +/** + * @file + * Misc file utilities. + */ + +/** + * Read the file with name filename, and put its content in a newly + * allocated buffer or map it with mmap() when available. + * In case of success set *bufptr to the read or mmapped buffer, and + * *size to the size in bytes of the buffer in *bufptr. + * Unlike mmap this function succeeds with zero sized files, in this + * case *bufptr will be set to NULL and *size will be set to 0. + * The returned buffer must be released with av_file_unmap(). + * + * @param log_offset loglevel offset used for logging + * @param log_ctx context used for logging + * @return a non negative number in case of success, a negative value + * corresponding to an AVERROR error code in case of failure + */ +av_warn_unused_result +int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, + int log_offset, void *log_ctx); + +/** + * Unmap or free the buffer bufptr created by av_file_map(). + * + * @param size size in bytes of bufptr, must be the same as returned + * by av_file_map() + */ +void av_file_unmap(uint8_t *bufptr, size_t size); + +/** + * Wrapper to work around the lack of mkstemp() on mingw. + * Also, tries to create file in /tmp first, if possible. + * *prefix can be a character constant; *filename will be allocated internally. + * @return file descriptor of opened file (or negative value corresponding to an + * AVERROR code on error) + * and opened file name in **filename. + * @note On very old libcs it is necessary to set a secure umask before + * calling this, av_tempfile() can't call umask itself as it is used in + * libraries and could interfere with the calling application. + * @deprecated as fd numbers cannot be passed saftely between libs on some platforms + */ +int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx); + +#endif /* AVUTIL_FILE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/frame.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/frame.h new file mode 100644 index 0000000..5d3231e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/frame.h @@ -0,0 +1,971 @@ +/* + * 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 + * @ingroup lavu_frame + * reference-counted frame API + */ + +#ifndef AVUTIL_FRAME_H +#define AVUTIL_FRAME_H + +#include +#include + +#include "avutil.h" +#include "buffer.h" +#include "dict.h" +#include "rational.h" +#include "samplefmt.h" +#include "pixfmt.h" +#include "version.h" + + +/** + * @defgroup lavu_frame AVFrame + * @ingroup lavu_data + * + * @{ + * AVFrame is an abstraction for reference-counted raw multimedia data. + */ + +enum AVFrameSideDataType { + /** + * The data is the AVPanScan struct defined in libavcodec. + */ + AV_FRAME_DATA_PANSCAN, + /** + * ATSC A53 Part 4 Closed Captions. + * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data. + * The number of bytes of CC data is AVFrameSideData.size. + */ + AV_FRAME_DATA_A53_CC, + /** + * Stereoscopic 3d metadata. + * The data is the AVStereo3D struct defined in libavutil/stereo3d.h. + */ + AV_FRAME_DATA_STEREO3D, + /** + * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h. + */ + AV_FRAME_DATA_MATRIXENCODING, + /** + * Metadata relevant to a downmix procedure. + * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h. + */ + AV_FRAME_DATA_DOWNMIX_INFO, + /** + * ReplayGain information in the form of the AVReplayGain struct. + */ + AV_FRAME_DATA_REPLAYGAIN, + /** + * This side data contains a 3x3 transformation matrix describing an affine + * transformation that needs to be applied to the frame for correct + * presentation. + * + * See libavutil/display.h for a detailed description of the data. + */ + AV_FRAME_DATA_DISPLAYMATRIX, + /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_FRAME_DATA_AFD, + /** + * Motion vectors exported by some codecs (on demand through the export_mvs + * flag set in the libavcodec AVCodecContext flags2 option). + * The data is the AVMotionVector struct defined in + * libavutil/motion_vector.h. + */ + AV_FRAME_DATA_MOTION_VECTORS, + /** + * Recommmends skipping the specified number of samples. This is exported + * only if the "skip_manual" AVOption is set in libavcodec. + * This has the same format as AV_PKT_DATA_SKIP_SAMPLES. + * @code + * u32le number of samples to skip from start of this packet + * u32le number of samples to skip from end of this packet + * u8 reason for start skip + * u8 reason for end skip (0=padding silence, 1=convergence) + * @endcode + */ + AV_FRAME_DATA_SKIP_SAMPLES, + /** + * This side data must be associated with an audio frame and corresponds to + * enum AVAudioServiceType defined in avcodec.h. + */ + AV_FRAME_DATA_AUDIO_SERVICE_TYPE, + /** + * Mastering display metadata associated with a video frame. The payload is + * an AVMasteringDisplayMetadata type and contains information about the + * mastering display color volume. + */ + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + /** + * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer. + * This is set on the first frame of a GOP that has a temporal reference of 0. + */ + AV_FRAME_DATA_GOP_TIMECODE, + + /** + * The data represents the AVSphericalMapping structure defined in + * libavutil/spherical.h. + */ + AV_FRAME_DATA_SPHERICAL, + + /** + * Content light level (based on CTA-861.3). This payload contains data in + * the form of the AVContentLightMetadata struct. + */ + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + + /** + * The data contains an ICC profile as an opaque octet buffer following the + * format described by ISO 15076-1 with an optional name defined in the + * metadata key entry "name". + */ + AV_FRAME_DATA_ICC_PROFILE, + +#if FF_API_FRAME_QP + /** + * Implementation-specific description of the format of AV_FRAME_QP_TABLE_DATA. + * The contents of this side data are undocumented and internal; use + * av_frame_set_qp_table() and av_frame_get_qp_table() to access this in a + * meaningful way instead. + */ + AV_FRAME_DATA_QP_TABLE_PROPERTIES, + + /** + * Raw QP table data. Its format is described by + * AV_FRAME_DATA_QP_TABLE_PROPERTIES. Use av_frame_set_qp_table() and + * av_frame_get_qp_table() to access this instead. + */ + AV_FRAME_DATA_QP_TABLE_DATA, +#endif + + /** + * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t + * where the first uint32_t describes how many (1-3) of the other timecodes are used. + * The timecode format is described in the av_timecode_get_smpte_from_framenum() + * function in libavutil/timecode.c. + */ + AV_FRAME_DATA_S12M_TIMECODE, + + /** + * HDR dynamic metadata associated with a video frame. The payload is + * an AVDynamicHDRPlus type and contains information for color + * volume transform - application 4 of SMPTE 2094-40:2016 standard. + */ + AV_FRAME_DATA_DYNAMIC_HDR_PLUS, + + /** + * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of + * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size. + */ + AV_FRAME_DATA_REGIONS_OF_INTEREST, +}; + +enum AVActiveFormatDescription { + AV_AFD_SAME = 8, + AV_AFD_4_3 = 9, + AV_AFD_16_9 = 10, + AV_AFD_14_9 = 11, + AV_AFD_4_3_SP_14_9 = 13, + AV_AFD_16_9_SP_14_9 = 14, + AV_AFD_SP_4_3 = 15, +}; + + +/** + * Structure to hold side data for an AVFrame. + * + * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + */ +typedef struct AVFrameSideData { + enum AVFrameSideDataType type; + uint8_t *data; + int size; + AVDictionary *metadata; + AVBufferRef *buf; +} AVFrameSideData; + +/** + * Structure describing a single Region Of Interest. + * + * When multiple regions are defined in a single side-data block, they + * should be ordered from most to least important - some encoders are only + * capable of supporting a limited number of distinct regions, so will have + * to truncate the list. + * + * When overlapping regions are defined, the first region containing a given + * area of the frame applies. + */ +typedef struct AVRegionOfInterest { + /** + * Must be set to the size of this data structure (that is, + * sizeof(AVRegionOfInterest)). + */ + uint32_t self_size; + /** + * Distance in pixels from the top edge of the frame to the top and + * bottom edges and from the left edge of the frame to the left and + * right edges of the rectangle defining this region of interest. + * + * The constraints on a region are encoder dependent, so the region + * actually affected may be slightly larger for alignment or other + * reasons. + */ + int top; + int bottom; + int left; + int right; + /** + * Quantisation offset. + * + * Must be in the range -1 to +1. A value of zero indicates no quality + * change. A negative value asks for better quality (less quantisation), + * while a positive value asks for worse quality (greater quantisation). + * + * The range is calibrated so that the extreme values indicate the + * largest possible offset - if the rest of the frame is encoded with the + * worst possible quality, an offset of -1 indicates that this region + * should be encoded with the best possible quality anyway. Intermediate + * values are then interpolated in some codec-dependent way. + * + * For example, in 10-bit H.264 the quantisation parameter varies between + * -12 and 51. A typical qoffset value of -1/10 therefore indicates that + * this region should be encoded with a QP around one-tenth of the full + * range better than the rest of the frame. So, if most of the frame + * were to be encoded with a QP of around 30, this region would get a QP + * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3). + * An extreme value of -1 would indicate that this region should be + * encoded with the best possible quality regardless of the treatment of + * the rest of the frame - that is, should be encoded at a QP of -12. + */ + AVRational qoffset; +} AVRegionOfInterest; + +/** + * This structure describes decoded (raw) audio or video data. + * + * AVFrame must be allocated using av_frame_alloc(). Note that this only + * allocates the AVFrame itself, the buffers for the data must be managed + * through other means (see below). + * AVFrame must be freed with av_frame_free(). + * + * AVFrame is typically allocated once and then reused multiple times to hold + * different data (e.g. a single AVFrame to hold frames received from a + * decoder). In such a case, av_frame_unref() will free any references held by + * the frame and reset it to its original clean state before it + * is reused again. + * + * The data described by an AVFrame is usually reference counted through the + * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / + * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at + * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, + * every single data plane must be contained in one of the buffers in + * AVFrame.buf or AVFrame.extended_buf. + * There may be a single buffer for all the data, or one separate buffer for + * each plane, or anything in between. + * + * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added + * to the end with a minor bump. + * + * Fields can be accessed through AVOptions, the name string used, matches the + * C structure field name for fields accessible through AVOptions. The AVClass + * for AVFrame can be obtained from avcodec_get_frame_class() + */ +typedef struct AVFrame { +#define AV_NUM_DATA_POINTERS 8 + /** + * pointer to the picture/channel planes. + * This might be different from the first allocated byte + * + * Some decoders access areas outside 0,0 - width,height, please + * see avcodec_align_dimensions2(). Some filters and swscale can read + * up to 16 bytes beyond the planes, if these filters are to be used, + * then 16 extra bytes must be allocated. + * + * NOTE: Except for hwaccel formats, pointers not needed by the format + * MUST be set to NULL. + */ + uint8_t *data[AV_NUM_DATA_POINTERS]; + + /** + * For video, size in bytes of each picture line. + * For audio, size in bytes of each plane. + * + * For audio, only linesize[0] may be set. For planar audio, each channel + * plane must be the same size. + * + * For video the linesizes should be multiples of the CPUs alignment + * preference, this is 16 or 32 for modern desktop CPUs. + * Some code requires such alignment other code can be slower without + * correct alignment, for yet other it makes no difference. + * + * @note The linesize may be larger than the size of usable data -- there + * may be extra padding present for performance reasons. + */ + int linesize[AV_NUM_DATA_POINTERS]; + + /** + * pointers to the data planes/channels. + * + * For video, this should simply point to data[]. + * + * For planar audio, each channel has a separate data pointer, and + * linesize[0] contains the size of each channel buffer. + * For packed audio, there is just one data pointer, and linesize[0] + * contains the total size of the buffer for all channels. + * + * Note: Both data and extended_data should always be set in a valid frame, + * but for planar audio with more channels that can fit in data, + * extended_data must be used in order to access all channels. + */ + uint8_t **extended_data; + + /** + * @name Video dimensions + * Video frames only. The coded dimensions (in pixels) of the video frame, + * i.e. the size of the rectangle that contains some well-defined values. + * + * @note The part of the frame intended for display/presentation is further + * restricted by the @ref cropping "Cropping rectangle". + * @{ + */ + int width, height; + /** + * @} + */ + + /** + * number of audio samples (per channel) described by this frame + */ + int nb_samples; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum AVPixelFormat for video frames, + * enum AVSampleFormat for audio) + */ + int format; + + /** + * 1 -> keyframe, 0-> not + */ + int key_frame; + + /** + * Picture type of the frame. + */ + enum AVPictureType pict_type; + + /** + * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. + */ + AVRational sample_aspect_ratio; + + /** + * Presentation timestamp in time_base units (time when frame should be shown to user). + */ + int64_t pts; + +#if FF_API_PKT_PTS + /** + * PTS copied from the AVPacket that was decoded to produce this frame. + * @deprecated use the pts field instead + */ + attribute_deprecated + int64_t pkt_pts; +#endif + + /** + * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used) + * This is also the Presentation time of this AVFrame calculated from + * only AVPacket.dts values without pts values. + */ + int64_t pkt_dts; + + /** + * picture number in bitstream order + */ + int coded_picture_number; + /** + * picture number in display order + */ + int display_picture_number; + + /** + * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) + */ + int quality; + + /** + * for some private data of the user + */ + void *opaque; + +#if FF_API_ERROR_FRAME + /** + * @deprecated unused + */ + attribute_deprecated + uint64_t error[AV_NUM_DATA_POINTERS]; +#endif + + /** + * When decoding, this signals how much the picture must be delayed. + * extra_delay = repeat_pict / (2*fps) + */ + int repeat_pict; + + /** + * The content of the picture is interlaced. + */ + int interlaced_frame; + + /** + * If the content is interlaced, is top field displayed first. + */ + int top_field_first; + + /** + * Tell user application that palette has changed from previous frame. + */ + int palette_has_changed; + + /** + * reordered opaque 64 bits (generally an integer or a double precision float + * PTS but can be anything). + * The user sets AVCodecContext.reordered_opaque to represent the input at + * that time, + * the decoder reorders values as needed and sets AVFrame.reordered_opaque + * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque + */ + int64_t reordered_opaque; + + /** + * Sample rate of the audio data. + */ + int sample_rate; + + /** + * Channel layout of the audio data. + */ + uint64_t channel_layout; + + /** + * AVBuffer references backing the data for this frame. If all elements of + * this array are NULL, then this frame is not reference counted. This array + * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must + * also be non-NULL for all j < i. + * + * There may be at most one AVBuffer per data plane, so for video this array + * always contains all the references. For planar audio with more than + * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in + * this array. Then the extra AVBufferRef pointers are stored in the + * extended_buf array. + */ + AVBufferRef *buf[AV_NUM_DATA_POINTERS]; + + /** + * For planar audio which requires more than AV_NUM_DATA_POINTERS + * AVBufferRef pointers, this array will hold all the references which + * cannot fit into AVFrame.buf. + * + * Note that this is different from AVFrame.extended_data, which always + * contains all the pointers. This array only contains the extra pointers, + * which cannot fit into AVFrame.buf. + * + * This array is always allocated using av_malloc() by whoever constructs + * the frame. It is freed in av_frame_unref(). + */ + AVBufferRef **extended_buf; + /** + * Number of elements in extended_buf. + */ + int nb_extended_buf; + + AVFrameSideData **side_data; + int nb_side_data; + +/** + * @defgroup lavu_frame_flags AV_FRAME_FLAGS + * @ingroup lavu_frame + * Flags describing additional frame properties. + * + * @{ + */ + +/** + * The frame data may be corrupted, e.g. due to decoding errors. + */ +#define AV_FRAME_FLAG_CORRUPT (1 << 0) +/** + * A flag to mark the frames which need to be decoded, but shouldn't be output. + */ +#define AV_FRAME_FLAG_DISCARD (1 << 2) +/** + * @} + */ + + /** + * Frame flags, a combination of @ref lavu_frame_flags + */ + int flags; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + enum AVColorPrimaries color_primaries; + + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + enum AVChromaLocation chroma_location; + + /** + * frame timestamp estimated using various heuristics, in stream time base + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int64_t best_effort_timestamp; + + /** + * reordered pos from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_pos; + + /** + * duration of the corresponding packet, expressed in + * AVStream->time_base units, 0 if unknown. + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_duration; + + /** + * metadata. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + AVDictionary *metadata; + + /** + * decode error flags of the frame, set to a combination of + * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there + * were errors during the decoding. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int decode_error_flags; +#define FF_DECODE_ERROR_INVALID_BITSTREAM 1 +#define FF_DECODE_ERROR_MISSING_REFERENCE 2 +#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE 4 +#define FF_DECODE_ERROR_DECODE_SLICES 8 + + /** + * number of audio channels, only used for audio. + * - encoding: unused + * - decoding: Read by user. + */ + int channels; + + /** + * size of the corresponding packet containing the compressed + * frame. + * It is set to a negative value if unknown. + * - encoding: unused + * - decoding: set by libavcodec, read by user. + */ + int pkt_size; + +#if FF_API_FRAME_QP + /** + * QP table + */ + attribute_deprecated + int8_t *qscale_table; + /** + * QP store stride + */ + attribute_deprecated + int qstride; + + attribute_deprecated + int qscale_type; + + attribute_deprecated + AVBufferRef *qp_table_buf; +#endif + /** + * For hwaccel-format frames, this should be a reference to the + * AVHWFramesContext describing the frame. + */ + AVBufferRef *hw_frames_ctx; + + /** + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. + * + * This is unrelated to the opaque field, although it serves a similar + * purpose. + */ + AVBufferRef *opaque_ref; + + /** + * @anchor cropping + * @name Cropping + * Video frames only. The number of pixels to discard from the the + * top/bottom/left/right border of the frame to obtain the sub-rectangle of + * the frame intended for presentation. + * @{ + */ + size_t crop_top; + size_t crop_bottom; + size_t crop_left; + size_t crop_right; + /** + * @} + */ + + /** + * AVBufferRef for internal use by a single libav* library. + * Must not be used to transfer data between libraries. + * Has to be NULL when ownership of the frame leaves the respective library. + * + * Code outside the FFmpeg libs should never check or change the contents of the buffer ref. + * + * FFmpeg calls av_buffer_unref() on it when the frame is unreferenced. + * av_frame_copy_props() calls create a new reference with av_buffer_ref() + * for the target frame's private_ref field. + */ + AVBufferRef *private_ref; +} AVFrame; + +#if FF_API_FRAME_GET_SET +/** + * Accessors for some AVFrame fields. These used to be provided for ABI + * compatibility, and do not need to be used anymore. + */ +attribute_deprecated +int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); +attribute_deprecated +void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_pkt_duration (const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_duration (AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_pkt_pos (const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); +attribute_deprecated +int64_t av_frame_get_channel_layout (const AVFrame *frame); +attribute_deprecated +void av_frame_set_channel_layout (AVFrame *frame, int64_t val); +attribute_deprecated +int av_frame_get_channels (const AVFrame *frame); +attribute_deprecated +void av_frame_set_channels (AVFrame *frame, int val); +attribute_deprecated +int av_frame_get_sample_rate (const AVFrame *frame); +attribute_deprecated +void av_frame_set_sample_rate (AVFrame *frame, int val); +attribute_deprecated +AVDictionary *av_frame_get_metadata (const AVFrame *frame); +attribute_deprecated +void av_frame_set_metadata (AVFrame *frame, AVDictionary *val); +attribute_deprecated +int av_frame_get_decode_error_flags (const AVFrame *frame); +attribute_deprecated +void av_frame_set_decode_error_flags (AVFrame *frame, int val); +attribute_deprecated +int av_frame_get_pkt_size(const AVFrame *frame); +attribute_deprecated +void av_frame_set_pkt_size(AVFrame *frame, int val); +#if FF_API_FRAME_QP +attribute_deprecated +int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type); +attribute_deprecated +int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type); +#endif +attribute_deprecated +enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame); +attribute_deprecated +void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val); +attribute_deprecated +enum AVColorRange av_frame_get_color_range(const AVFrame *frame); +attribute_deprecated +void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val); +#endif + +/** + * Get the name of a colorspace. + * @return a static string identifying the colorspace; can be NULL. + */ +const char *av_get_colorspace_name(enum AVColorSpace val); + +/** + * Allocate an AVFrame and set its fields to default values. The resulting + * struct must be freed using av_frame_free(). + * + * @return An AVFrame filled with default values or NULL on failure. + * + * @note this only allocates the AVFrame itself, not the data buffers. Those + * must be allocated through other means, e.g. with av_frame_get_buffer() or + * manually. + */ +AVFrame *av_frame_alloc(void); + +/** + * Free the frame and any dynamically allocated objects in it, + * e.g. extended_data. If the frame is reference counted, it will be + * unreferenced first. + * + * @param frame frame to be freed. The pointer will be set to NULL. + */ +void av_frame_free(AVFrame **frame); + +/** + * Set up a new reference to the data described by the source frame. + * + * Copy frame properties from src to dst and create a new reference for each + * AVBufferRef from src. + * + * If src is not reference counted, new buffers are allocated and the data is + * copied. + * + * @warning: dst MUST have been either unreferenced with av_frame_unref(dst), + * or newly allocated with av_frame_alloc() before calling this + * function, or undefined behavior will occur. + * + * @return 0 on success, a negative AVERROR on error + */ +int av_frame_ref(AVFrame *dst, const AVFrame *src); + +/** + * Create a new frame that references the same data as src. + * + * This is a shortcut for av_frame_alloc()+av_frame_ref(). + * + * @return newly created AVFrame on success, NULL on error. + */ +AVFrame *av_frame_clone(const AVFrame *src); + +/** + * Unreference all the buffers referenced by frame and reset the frame fields. + */ +void av_frame_unref(AVFrame *frame); + +/** + * Move everything contained in src to dst and reset src. + * + * @warning: dst is not unreferenced, but directly overwritten without reading + * or deallocating its contents. Call av_frame_unref(dst) manually + * before calling this function to ensure that no memory is leaked. + */ +void av_frame_move_ref(AVFrame *dst, AVFrame *src); + +/** + * Allocate new buffer(s) for audio or video data. + * + * The following fields must be set on frame before calling this function: + * - format (pixel format for video, sample format for audio) + * - width and height for video + * - nb_samples and channel_layout for audio + * + * This function will fill AVFrame.data and AVFrame.buf arrays and, if + * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. + * For planar formats, one buffer will be allocated for each plane. + * + * @warning: if frame already has been allocated, calling this function will + * leak memory. In addition, undefined behavior can occur in certain + * cases. + * + * @param frame frame in which to store the new buffers. + * @param align Required buffer size alignment. If equal to 0, alignment will be + * chosen automatically for the current CPU. It is highly + * recommended to pass 0 here unless you know what you are doing. + * + * @return 0 on success, a negative AVERROR on error. + */ +int av_frame_get_buffer(AVFrame *frame, int align); + +/** + * Check if the frame data is writable. + * + * @return A positive value if the frame data is writable (which is true if and + * only if each of the underlying buffers has only one reference, namely the one + * stored in this frame). Return 0 otherwise. + * + * If 1 is returned the answer is valid until av_buffer_ref() is called on any + * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). + * + * @see av_frame_make_writable(), av_buffer_is_writable() + */ +int av_frame_is_writable(AVFrame *frame); + +/** + * Ensure that the frame data is writable, avoiding data copy if possible. + * + * Do nothing if the frame is writable, allocate new buffers and copy the data + * if it is not. + * + * @return 0 on success, a negative AVERROR on error. + * + * @see av_frame_is_writable(), av_buffer_is_writable(), + * av_buffer_make_writable() + */ +int av_frame_make_writable(AVFrame *frame); + +/** + * Copy the frame data from src to dst. + * + * This function does not allocate anything, dst must be already initialized and + * allocated with the same parameters as src. + * + * This function only copies the frame data (i.e. the contents of the data / + * extended data arrays), not any other properties. + * + * @return >= 0 on success, a negative AVERROR on error. + */ +int av_frame_copy(AVFrame *dst, const AVFrame *src); + +/** + * Copy only "metadata" fields from src to dst. + * + * Metadata for the purpose of this function are those fields that do not affect + * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample + * aspect ratio (for video), but not width/height or channel layout. + * Side data is also copied. + */ +int av_frame_copy_props(AVFrame *dst, const AVFrame *src); + +/** + * Get the buffer reference a given data plane is stored in. + * + * @param plane index of the data plane of interest in frame->extended_data. + * + * @return the buffer reference that contains the plane or NULL if the input + * frame is not valid. + */ +AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); + +/** + * Add a new side data to a frame. + * + * @param frame a frame to which the side data should be added + * @param type type of the added side data + * @param size size of the side data + * + * @return newly added side data on success, NULL on error + */ +AVFrameSideData *av_frame_new_side_data(AVFrame *frame, + enum AVFrameSideDataType type, + int size); + +/** + * Add a new side data to a frame from an existing AVBufferRef + * + * @param frame a frame to which the side data should be added + * @param type the type of the added side data + * @param buf an AVBufferRef to add as side data. The ownership of + * the reference is transferred to the frame. + * + * @return newly added side data on success, NULL on error. On failure + * the frame is unchanged and the AVBufferRef remains owned by + * the caller. + */ +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, + enum AVFrameSideDataType type, + AVBufferRef *buf); + +/** + * @return a pointer to the side data of a given type on success, NULL if there + * is no side data with such type in this frame. + */ +AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, + enum AVFrameSideDataType type); + +/** + * If side data of the supplied type exists in the frame, free it and remove it + * from the frame. + */ +void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); + + +/** + * Flags for frame cropping. + */ +enum { + /** + * Apply the maximum possible cropping, even if it requires setting the + * AVFrame.data[] entries to unaligned pointers. Passing unaligned data + * to FFmpeg API is generally not allowed, and causes undefined behavior + * (such as crashes). You can pass unaligned data only to FFmpeg APIs that + * are explicitly documented to accept it. Use this flag only if you + * absolutely know what you are doing. + */ + AV_FRAME_CROP_UNALIGNED = 1 << 0, +}; + +/** + * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/ + * crop_bottom fields. If cropping is successful, the function will adjust the + * data pointers and the width/height fields, and set the crop fields to 0. + * + * In all cases, the cropping boundaries will be rounded to the inherent + * alignment of the pixel format. In some cases, such as for opaque hwaccel + * formats, the left/top cropping is ignored. The crop fields are set to 0 even + * if the cropping was rounded or ignored. + * + * @param frame the frame which should be cropped + * @param flags Some combination of AV_FRAME_CROP_* flags, or 0. + * + * @return >= 0 on success, a negative AVERROR on error. If the cropping fields + * were invalid, AVERROR(ERANGE) is returned, and nothing is changed. + */ +int av_frame_apply_cropping(AVFrame *frame, int flags); + +/** + * @return a string identifying the side data type + */ +const char *av_frame_side_data_name(enum AVFrameSideDataType type); + +/** + * @} + */ + +#endif /* AVUTIL_FRAME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hash.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hash.h new file mode 100644 index 0000000..7693e6b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hash.h @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_hash_generic + * Generic hashing API + */ + +#ifndef AVUTIL_HASH_H +#define AVUTIL_HASH_H + +#include + +#include "version.h" + +/** + * @defgroup lavu_hash Hash Functions + * @ingroup lavu_crypto + * Hash functions useful in multimedia. + * + * Hash functions are widely used in multimedia, from error checking and + * concealment to internal regression testing. libavutil has efficient + * implementations of a variety of hash functions that may be useful for + * FFmpeg and other multimedia applications. + * + * @{ + * + * @defgroup lavu_hash_generic Generic Hashing API + * An abstraction layer for all hash functions supported by libavutil. + * + * If your application needs to support a wide range of different hash + * functions, then the Generic Hashing API is for you. It provides a generic, + * reusable API for @ref lavu_hash "all hash functions" implemented in libavutil. + * If you just need to use one particular hash function, use the @ref lavu_hash + * "individual hash" directly. + * + * @section Sample Code + * + * A basic template for using the Generic Hashing API follows: + * + * @code + * struct AVHashContext *ctx = NULL; + * const char *hash_name = NULL; + * uint8_t *output_buf = NULL; + * + * // Select from a string returned by av_hash_names() + * hash_name = ...; + * + * // Allocate a hash context + * ret = av_hash_alloc(&ctx, hash_name); + * if (ret < 0) + * return ret; + * + * // Initialize the hash context + * av_hash_init(ctx); + * + * // Update the hash context with data + * while (data_left) { + * av_hash_update(ctx, data, size); + * } + * + * // Now we have no more data, so it is time to finalize the hash and get the + * // output. But we need to first allocate an output buffer. Note that you can + * // use any memory allocation function, including malloc(), not just + * // av_malloc(). + * output_buf = av_malloc(av_hash_get_size(ctx)); + * if (!output_buf) + * return AVERROR(ENOMEM); + * + * // Finalize the hash context. + * // You can use any of the av_hash_final*() functions provided, for other + * // output formats. If you do so, be sure to adjust the memory allocation + * // above. See the function documentation below for the exact amount of extra + * // memory needed. + * av_hash_final(ctx, output_buffer); + * + * // Free the context + * av_hash_freep(&ctx); + * @endcode + * + * @section Hash Function-Specific Information + * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be + * used. + * + * If the Murmur3 hash is selected, the default seed will be used. See @ref + * lavu_murmur3_seedinfo "Murmur3" for more information. + * + * @{ + */ + +/** + * @example ffhash.c + * This example is a simple command line application that takes one or more + * arguments. It demonstrates a typical use of the hashing API with allocation, + * initialization, updating, and finalizing. + */ + +struct AVHashContext; + +/** + * Allocate a hash context for the algorithm specified by name. + * + * @return >= 0 for success, a negative error code for failure + * + * @note The context is not initialized after a call to this function; you must + * call av_hash_init() to do so. + */ +int av_hash_alloc(struct AVHashContext **ctx, const char *name); + +/** + * Get the names of available hash algorithms. + * + * This function can be used to enumerate the algorithms. + * + * @param[in] i Index of the hash algorithm, starting from 0 + * @return Pointer to a static string or `NULL` if `i` is out of range + */ +const char *av_hash_names(int i); + +/** + * Get the name of the algorithm corresponding to the given hash context. + */ +const char *av_hash_get_name(const struct AVHashContext *ctx); + +/** + * Maximum value that av_hash_get_size() will currently return. + * + * You can use this if you absolutely want or need to use static allocation for + * the output buffer and are fine with not supporting hashes newly added to + * libavutil without recompilation. + * + * @warning + * Adding new hashes with larger sizes, and increasing the macro while doing + * so, will not be considered an ABI change. To prevent your code from + * overflowing a buffer, either dynamically allocate the output buffer with + * av_hash_get_size(), or limit your use of the Hashing API to hashes that are + * already in FFmpeg during the time of compilation. + */ +#define AV_HASH_MAX_SIZE 64 + +/** + * Get the size of the resulting hash value in bytes. + * + * The maximum value this function will currently return is available as macro + * #AV_HASH_MAX_SIZE. + * + * @param[in] ctx Hash context + * @return Size of the hash value in bytes + */ +int av_hash_get_size(const struct AVHashContext *ctx); + +/** + * Initialize or reset a hash context. + * + * @param[in,out] ctx Hash context + */ +void av_hash_init(struct AVHashContext *ctx); + +/** + * Update a hash context with additional data. + * + * @param[in,out] ctx Hash context + * @param[in] src Data to be added to the hash context + * @param[in] len Size of the additional data + */ +#if FF_API_CRYPTO_SIZE_T +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, int len); +#else +void av_hash_update(struct AVHashContext *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finalize a hash context and compute the actual hash value. + * + * The minimum size of `dst` buffer is given by av_hash_get_size() or + * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * + * @see av_hash_final_bin() provides an alternative API + */ +void av_hash_final(struct AVHashContext *ctx, uint8_t *dst); + +/** + * Finalize a hash context and store the actual hash value in a buffer. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * If `size` is smaller than the hash size (given by av_hash_get_size()), the + * hash is truncated; if size is larger, the buffer is padded with 0. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Number of bytes to write to `dst` + */ +void av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the hexadecimal representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the + * value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the string will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Finalize a hash context and store the Base64 representation of the + * actual hash value as a string. + * + * It is not safe to update or finalize a hash context again, if it has already + * been finalized. + * + * The string is always 0-terminated. + * + * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is + * the value returned by av_hash_get_size(), the string will be truncated. + * + * @param[in,out] ctx Hash context + * @param[out] dst Where the final hash value will be stored + * @param[in] size Maximum number of bytes to write to `dst` + */ +void av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size); + +/** + * Free hash context and set hash context pointer to `NULL`. + * + * @param[in,out] ctx Pointer to hash context + */ +void av_hash_freep(struct AVHashContext **ctx); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_HASH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hdr_dynamic_metadata.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hdr_dynamic_metadata.h new file mode 100644 index 0000000..2d72de5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hdr_dynamic_metadata.h @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2018 Mohammad Izadi + * + * 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 + */ + +#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H +#define AVUTIL_HDR_DYNAMIC_METADATA_H + +#include "frame.h" +#include "rational.h" + +/** + * Option for overlapping elliptical pixel selectors in an image. + */ +enum AVHDRPlusOverlapProcessOption { + AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0, + AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1, +}; + +/** + * Represents the percentile at a specific percentage in + * a distribution. + */ +typedef struct AVHDRPlusPercentile { + /** + * The percentage value corresponding to a specific percentile linearized + * RGB value in the processing window in the scene. The value shall be in + * the range of 0 to100, inclusive. + */ + uint8_t percentage; + + /** + * The linearized maxRGB value at a specific percentile in the processing + * window in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.00001. + */ + AVRational percentile; +} AVHDRPlusPercentile; + +/** + * Color transform parameters at a processing window in a dynamic metadata for + * SMPTE 2094-40. + */ +typedef struct AVHDRPlusColorTransformParams { + /** + * The relative x coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_x; + + /** + * The relative y coordinate of the top left pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 0. + */ + AVRational window_upper_left_corner_y; + + /** + * The relative x coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(width of Picture - 1). The value 1 corresponds + * to the absolute coordinate of width of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_x; + + /** + * The relative y coordinate of the bottom right pixel of the processing + * window. The value shall be in the range of 0 and 1, inclusive and + * in multiples of 1/(height of Picture - 1). The value 1 corresponds + * to the absolute coordinate of height of Picture - 1. The value for + * first processing window shall be 1. + */ + AVRational window_lower_right_corner_y; + + /** + * The x coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (width of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_x; + + /** + * The y coordinate of the center position of the concentric internal and + * external ellipses of the elliptical pixel selector in the processing + * window. The value shall be in the range of 0 to (height of Picture - 1), + * inclusive and in multiples of 1 pixel. + */ + uint16_t center_of_ellipse_y; + + /** + * The clockwise rotation angle in degree of arc with respect to the + * positive direction of the x-axis of the concentric internal and external + * ellipses of the elliptical pixel selector in the processing window. The + * value shall be in the range of 0 to 180, inclusive and in multiples of 1. + */ + uint8_t rotation_angle; + + /** + * The semi-major axis value of the internal ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_internal_ellipse; + + /** + * The semi-major axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value + * shall not be less than semimajor_axis_internal_ellipse of the current + * processing window. The value shall be in the range of 1 to 65535, + * inclusive and in multiples of 1 pixel. + */ + uint16_t semimajor_axis_external_ellipse; + + /** + * The semi-minor axis value of the external ellipse of the elliptical pixel + * selector in amount of pixels in the processing window. The value shall be + * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. + */ + uint16_t semiminor_axis_external_ellipse; + + /** + * Overlap process option indicates one of the two methods of combining + * rendered pixels in the processing window in an image with at least one + * elliptical pixel selector. For overlapping elliptical pixel selectors + * in an image, overlap_process_option shall have the same value. + */ + enum AVHDRPlusOverlapProcessOption overlap_process_option; + + /** + * The maximum of the color components of linearized RGB values in the + * processing window in the scene. The values should be in the range of 0 to + * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and + * maxscl[ 2 ] are corresponding to R, G, B color components respectively. + */ + AVRational maxscl[3]; + + /** + * The average of linearized maxRGB values in the processing window in the + * scene. The value should be in the range of 0 to 1, inclusive and in + * multiples of 0.00001. + */ + AVRational average_maxrgb; + + /** + * The number of linearized maxRGB values at given percentiles in the + * processing window in the scene. The maximum value shall be 15. + */ + uint8_t num_distribution_maxrgb_percentiles; + + /** + * The linearized maxRGB values at given percentiles in the + * processing window in the scene. + */ + AVHDRPlusPercentile distribution_maxrgb[15]; + + /** + * The fraction of selected pixels in the image that contains the brightest + * pixel in the scene. The value shall be in the range of 0 to 1, inclusive + * and in multiples of 0.001. + */ + AVRational fraction_bright_pixels; + + /** + * This flag indicates that the metadata for the tone mapping function in + * the processing window is present (for value of 1). + */ + uint8_t tone_mapping_flag; + + /** + * The x coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_x; + + /** + * The y coordinate of the separation point between the linear part and the + * curved part of the tone mapping function. The value shall be in the range + * of 0 to 1, excluding 0 and in multiples of 1/4095. + */ + AVRational knee_point_y; + + /** + * The number of the intermediate anchor parameters of the tone mapping + * function in the processing window. The maximum value shall be 15. + */ + uint8_t num_bezier_curve_anchors; + + /** + * The intermediate anchor parameters of the tone mapping function in the + * processing window in the scene. The values should be in the range of 0 + * to 1, inclusive and in multiples of 1/1023. + */ + AVRational bezier_curve_anchors[15]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. Other values are reserved for future use. + */ + uint8_t color_saturation_mapping_flag; + + /** + * The color saturation gain in the processing window in the scene. The + * value shall be in the range of 0 to 63/8, inclusive and in multiples of + * 1/8. The default value shall be 1. + */ + AVRational color_saturation_weight; +} AVHDRPlusColorTransformParams; + +/** + * This struct represents dynamic metadata for color volume transform - + * application 4 of SMPTE 2094-40:2016 standard. + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with + * av_dynamic_hdr_plus_alloc() and its size is not a part of + * the public ABI. + */ +typedef struct AVDynamicHDRPlus { + /** + * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5. + */ + uint8_t itu_t_t35_country_code; + + /** + * Application version in the application defining document in ST-2094 + * suite. The value shall be set to 0. + */ + uint8_t application_version; + + /** + * The number of processing windows. The value shall be in the range + * of 1 to 3, inclusive. + */ + uint8_t num_windows; + + /** + * The color transform parameters for every processing window. + */ + AVHDRPlusColorTransformParams params[3]; + + /** + * The nominal maximum display luminance of the targeted system display, + * in units of 0.0001 candelas per square metre. The value shall be in + * the range of 0 to 10000, inclusive. + */ + AVRational targeted_system_display_maximum_luminance; + + /** + * This flag shall be equal to 0 in bit streams conforming to this version + * of this Specification. The value 1 is reserved for future use. + */ + uint8_t targeted_system_display_actual_peak_luminance_flag; + + /** + * The number of rows in the targeted system_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_targeted_system_display_actual_peak_luminance; + + /** + * The number of columns in the + * targeted_system_display_actual_peak_luminance array. The value shall be + * in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_targeted_system_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the targeted system display. The + * values should be in the range of 0 to 1, inclusive and in multiples of + * 1/15. + */ + AVRational targeted_system_display_actual_peak_luminance[25][25]; + + /** + * This flag shall be equal to 0 in bitstreams conforming to this version of + * this Specification. The value 1 is reserved for future use. + */ + uint8_t mastering_display_actual_peak_luminance_flag; + + /** + * The number of rows in the mastering_display_actual_peak_luminance array. + * The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_rows_mastering_display_actual_peak_luminance; + + /** + * The number of columns in the mastering_display_actual_peak_luminance + * array. The value shall be in the range of 2 to 25, inclusive. + */ + uint8_t num_cols_mastering_display_actual_peak_luminance; + + /** + * The normalized actual peak luminance of the mastering display used for + * mastering the image essence. The values should be in the range of 0 to 1, + * inclusive and in multiples of 1/15. + */ + AVRational mastering_display_actual_peak_luminance[25][25]; +} AVDynamicHDRPlus; + +/** + * Allocate an AVDynamicHDRPlus structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVDynamicHDRPlus filled with default values or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); + +/** + * Allocate a complete AVDynamicHDRPlus and add it to the frame. + * @param frame The frame which side data is added to. + * + * @return The AVDynamicHDRPlus structure to be filled by caller or NULL + * on failure. + */ +AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hmac.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hmac.h new file mode 100644 index 0000000..412e950 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hmac.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2012 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 + */ + +#ifndef AVUTIL_HMAC_H +#define AVUTIL_HMAC_H + +#include + +#include "version.h" +/** + * @defgroup lavu_hmac HMAC + * @ingroup lavu_crypto + * @{ + */ + +enum AVHMACType { + AV_HMAC_MD5, + AV_HMAC_SHA1, + AV_HMAC_SHA224, + AV_HMAC_SHA256, + AV_HMAC_SHA384, + AV_HMAC_SHA512, +}; + +typedef struct AVHMAC AVHMAC; + +/** + * Allocate an AVHMAC context. + * @param type The hash function used for the HMAC. + */ +AVHMAC *av_hmac_alloc(enum AVHMACType type); + +/** + * Free an AVHMAC context. + * @param ctx The context to free, may be NULL + */ +void av_hmac_free(AVHMAC *ctx); + +/** + * Initialize an AVHMAC context with an authentication key. + * @param ctx The HMAC context + * @param key The authentication key + * @param keylen The length of the key, in bytes + */ +void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen); + +/** + * Hash data with the HMAC. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + */ +void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len); + +/** + * Finish hashing and output the HMAC digest. + * @param ctx The HMAC context + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen); + +/** + * Hash an array of data with a key. + * @param ctx The HMAC context + * @param data The data to hash + * @param len The length of the data, in bytes + * @param key The authentication key + * @param keylen The length of the key, in bytes + * @param out The output buffer to write the digest into + * @param outlen The length of the out buffer, in bytes + * @return The number of bytes written to out, or a negative error code. + */ +int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len, + const uint8_t *key, unsigned int keylen, + uint8_t *out, unsigned int outlen); + +/** + * @} + */ + +#endif /* AVUTIL_HMAC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext.h new file mode 100644 index 0000000..f5a4b62 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext.h @@ -0,0 +1,584 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_H +#define AVUTIL_HWCONTEXT_H + +#include "buffer.h" +#include "frame.h" +#include "log.h" +#include "pixfmt.h" + +enum AVHWDeviceType { + AV_HWDEVICE_TYPE_NONE, + AV_HWDEVICE_TYPE_VDPAU, + AV_HWDEVICE_TYPE_CUDA, + AV_HWDEVICE_TYPE_VAAPI, + AV_HWDEVICE_TYPE_DXVA2, + AV_HWDEVICE_TYPE_QSV, + AV_HWDEVICE_TYPE_VIDEOTOOLBOX, + AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_DRM, + AV_HWDEVICE_TYPE_OPENCL, + AV_HWDEVICE_TYPE_MEDIACODEC, +}; + +typedef struct AVHWDeviceInternal AVHWDeviceInternal; + +/** + * This struct aggregates all the (hardware/vendor-specific) "high-level" state, + * i.e. state that is not tied to a concrete processing configuration. + * E.g., in an API that supports hardware-accelerated encoding and decoding, + * this struct will (if possible) wrap the state that is common to both encoding + * and decoding and from which specific instances of encoders or decoders can be + * derived. + * + * This struct is reference-counted with the AVBuffer mechanism. The + * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field + * points to the actual AVHWDeviceContext. Further objects derived from + * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with + * specific properties) will hold an internal reference to it. After all the + * references are released, the AVHWDeviceContext itself will be freed, + * optionally invoking a user-specified callback for uninitializing the hardware + * state. + */ +typedef struct AVHWDeviceContext { + /** + * A class for logging. Set by av_hwdevice_ctx_alloc(). + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWDeviceInternal *internal; + + /** + * This field identifies the underlying API used for hardware access. + * + * This field is set when this struct is allocated and never changed + * afterwards. + */ + enum AVHWDeviceType type; + + /** + * The format-specific data, allocated and freed by libavutil along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwcontext_*.h) and filled as described in the + * documentation before calling av_hwdevice_ctx_init(). + * + * After calling av_hwdevice_ctx_init() this struct should not be modified + * by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwdevice_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + * + * @note when other objects (e.g an AVHWFramesContext) are derived from this + * struct, this callback will be invoked after all such child objects + * are fully uninitialized and their respective destructors invoked. + */ + void (*free)(struct AVHWDeviceContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; +} AVHWDeviceContext; + +typedef struct AVHWFramesInternal AVHWFramesInternal; + +/** + * This struct describes a set or pool of "hardware" frames (i.e. those with + * data not located in normal system memory). All the frames in the pool are + * assumed to be allocated in the same way and interchangeable. + * + * This struct is reference-counted with the AVBuffer mechanism and tied to a + * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor + * yields a reference, whose data field points to the actual AVHWFramesContext + * struct. + */ +typedef struct AVHWFramesContext { + /** + * A class for logging. + */ + const AVClass *av_class; + + /** + * Private data used internally by libavutil. Must not be accessed in any + * way by the caller. + */ + AVHWFramesInternal *internal; + + /** + * A reference to the parent AVHWDeviceContext. This reference is owned and + * managed by the enclosing AVHWFramesContext, but the caller may derive + * additional references from it. + */ + AVBufferRef *device_ref; + + /** + * The parent AVHWDeviceContext. This is simply a pointer to + * device_ref->data provided for convenience. + * + * Set by libavutil in av_hwframe_ctx_init(). + */ + AVHWDeviceContext *device_ctx; + + /** + * The format-specific data, allocated and freed automatically along with + * this context. + * + * Should be cast by the user to the format-specific context defined in the + * corresponding header (hwframe_*.h) and filled as described in the + * documentation before calling av_hwframe_ctx_init(). + * + * After any frames using this context are created, the contents of this + * struct should not be modified by the caller. + */ + void *hwctx; + + /** + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * + * If non-NULL, this callback will be called when the last reference to + * this context is unreferenced, immediately before it is freed. + */ + void (*free)(struct AVHWFramesContext *ctx); + + /** + * Arbitrary user data, to be used e.g. by the free() callback. + */ + void *user_opaque; + + /** + * A pool from which the frames are allocated by av_hwframe_get_buffer(). + * This field may be set by the caller before calling av_hwframe_ctx_init(). + * The buffers returned by calling av_buffer_pool_get() on this pool must + * have the properties described in the documentation in the corresponding hw + * type's header (hwcontext_*.h). The pool will be freed strictly before + * this struct's free() callback is invoked. + * + * This field may be NULL, then libavutil will attempt to allocate a pool + * internally. Note that certain device types enforce pools allocated at + * fixed size (frame count), which cannot be extended dynamically. In such a + * case, initial_pool_size must be set appropriately. + */ + AVBufferPool *pool; + + /** + * Initial size of the frame pool. If a device type does not support + * dynamically resizing the pool, then this is also the maximum pool size. + * + * May be set by the caller before calling av_hwframe_ctx_init(). Must be + * set if pool is NULL and the device type does not support dynamic pools. + */ + int initial_pool_size; + + /** + * The pixel format identifying the underlying HW surface type. + * + * Must be a hwaccel format, i.e. the corresponding descriptor must have the + * AV_PIX_FMT_FLAG_HWACCEL flag set. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + enum AVPixelFormat format; + + /** + * The pixel format identifying the actual data layout of the hardware + * frames. + * + * Must be set by the caller before calling av_hwframe_ctx_init(). + * + * @note when the underlying API does not provide the exact data layout, but + * only the colorspace/bit depth, this field should be set to the fully + * planar version of that format (e.g. for 8-bit 420 YUV it should be + * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else). + */ + enum AVPixelFormat sw_format; + + /** + * The allocated dimensions of the frames in this pool. + * + * Must be set by the user before calling av_hwframe_ctx_init(). + */ + int width, height; +} AVHWFramesContext; + +/** + * Look up an AVHWDeviceType by name. + * + * @param name String name of the device type (case-insensitive). + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name); + +/** Get the string name of an AVHWDeviceType. + * + * @param type Type from enum AVHWDeviceType. + * @return Pointer to a static string containing the name, or NULL if the type + * is not valid. + */ +const char *av_hwdevice_get_type_name(enum AVHWDeviceType type); + +/** + * Iterate over supported device types. + * + * @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type + * returned by this function in subsequent iterations. + * @return The next usable device type from enum AVHWDeviceType, or + * AV_HWDEVICE_TYPE_NONE if there are no more. + */ +enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev); + +/** + * Allocate an AVHWDeviceContext for a given hardware type. + * + * @param type the type of the hardware device to allocate. + * @return a reference to the newly created AVHWDeviceContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type); + +/** + * Finalize the device context before use. This function must be called after + * the context is filled with all the required information and before it is + * used in any way. + * + * @param ref a reference to the AVHWDeviceContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwdevice_ctx_init(AVBufferRef *ref); + +/** + * Open a device of the specified type and create an AVHWDeviceContext for it. + * + * This is a convenience function intended to cover the simple cases. Callers + * who need to fine-tune device creation/management should open the device + * manually and then wrap it in an AVHWDeviceContext using + * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init(). + * + * The returned context is already initialized and ready for use, the caller + * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of + * the created AVHWDeviceContext are set by this function and should not be + * touched by the caller. + * + * @param device_ctx On success, a reference to the newly-created device context + * will be written here. The reference is owned by the caller + * and must be released with av_buffer_unref() when no longer + * needed. On failure, NULL will be written to this pointer. + * @param type The type of the device to create. + * @param device A type-specific string identifying the device to open. + * @param opts A dictionary of additional (type-specific) options to use in + * opening the device. The dictionary remains owned by the caller. + * @param flags currently unused + * + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type, + const char *device, AVDictionary *opts, int flags); + +/** + * Create a new device of the specified type from an existing device. + * + * If the source device is a device of the target type or was originally + * derived from such a device (possibly through one or more intermediate + * devices of other types), then this will return a reference to the + * existing device of the same type as is requested. + * + * Otherwise, it will attempt to derive a new device from the given source + * device. If direct derivation to the new type is not implemented, it will + * attempt the same derivation from each ancestor of the source device in + * turn looking for an implemented derivation method. + * + * @param dst_ctx On success, a reference to the newly-created + * AVHWDeviceContext. + * @param type The type of the new device to create. + * @param src_ctx A reference to an existing AVHWDeviceContext which will be + * used to create the new device. + * @param flags Currently unused; should be set to zero. + * @return Zero on success, a negative AVERROR code on failure. + */ +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx, + enum AVHWDeviceType type, + AVBufferRef *src_ctx, int flags); + + +/** + * Allocate an AVHWFramesContext tied to a given device context. + * + * @param device_ctx a reference to a AVHWDeviceContext. This function will make + * a new reference for internal use, the one passed to the + * function remains owned by the caller. + * @return a reference to the newly created AVHWFramesContext on success or NULL + * on failure. + */ +AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx); + +/** + * Finalize the context before use. This function must be called after the + * context is filled with all the required information and before it is attached + * to any frames. + * + * @param ref a reference to the AVHWFramesContext + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_ctx_init(AVBufferRef *ref); + +/** + * Allocate a new frame attached to the given AVHWFramesContext. + * + * @param hwframe_ctx a reference to an AVHWFramesContext + * @param frame an empty (freshly allocated or unreffed) frame to be filled with + * newly allocated buffers. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure + */ +int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags); + +/** + * Copy data to or from a hw surface. At least one of dst/src must have an + * AVHWFramesContext attached. + * + * If src has an AVHWFramesContext attached, then the format of dst (if set) + * must use one of the formats returned by av_hwframe_transfer_get_formats(src, + * AV_HWFRAME_TRANSFER_DIRECTION_FROM). + * If dst has an AVHWFramesContext attached, then the format of src must use one + * of the formats returned by av_hwframe_transfer_get_formats(dst, + * AV_HWFRAME_TRANSFER_DIRECTION_TO) + * + * dst may be "clean" (i.e. with data/buf pointers unset), in which case the + * data buffers will be allocated by this function using av_frame_get_buffer(). + * If dst->format is set, then this format will be used, otherwise (when + * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen. + * + * The two frames must have matching allocated dimensions (i.e. equal to + * AVHWFramesContext.width/height), since not all device types support + * transferring a sub-rectangle of the whole surface. The display dimensions + * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but + * also have to be equal for both frames. When the display dimensions are + * smaller than the allocated dimensions, the content of the padding in the + * destination frame is unspecified. + * + * @param dst the destination frame. dst is not touched on failure. + * @param src the source frame. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR error code on failure. + */ +int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags); + +enum AVHWFrameTransferDirection { + /** + * Transfer the data from the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_FROM, + + /** + * Transfer the data to the queried hw frame. + */ + AV_HWFRAME_TRANSFER_DIRECTION_TO, +}; + +/** + * Get a list of possible source or target formats usable in + * av_hwframe_transfer_data(). + * + * @param hwframe_ctx the frame context to obtain the information for + * @param dir the direction of the transfer + * @param formats the pointer to the output format list will be written here. + * The list is terminated with AV_PIX_FMT_NONE and must be freed + * by the caller when no longer needed using av_free(). + * If this function returns successfully, the format list will + * have at least one item (not counting the terminator). + * On failure, the contents of this pointer are unspecified. + * @param flags currently unused, should be set to zero + * @return 0 on success, a negative AVERROR code on failure. + */ +int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx, + enum AVHWFrameTransferDirection dir, + enum AVPixelFormat **formats, int flags); + + +/** + * This struct describes the constraints on hardware frames attached to + * a given device with a hardware-specific configuration. This is returned + * by av_hwdevice_get_hwframe_constraints() and must be freed by + * av_hwframe_constraints_free() after use. + */ +typedef struct AVHWFramesConstraints { + /** + * A list of possible values for format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. This member will always be filled. + */ + enum AVPixelFormat *valid_hw_formats; + + /** + * A list of possible values for sw_format in the hw_frames_ctx, + * terminated by AV_PIX_FMT_NONE. Can be NULL if this information is + * not known. + */ + enum AVPixelFormat *valid_sw_formats; + + /** + * The minimum size of frames in this hw_frames_ctx. + * (Zero if not known.) + */ + int min_width; + int min_height; + + /** + * The maximum size of frames in this hw_frames_ctx. + * (INT_MAX if not known / no limit.) + */ + int max_width; + int max_height; +} AVHWFramesConstraints; + +/** + * Allocate a HW-specific configuration structure for a given HW device. + * After use, the user must free all members as required by the specific + * hardware structure being used, then free the structure itself with + * av_free(). + * + * @param device_ctx a reference to the associated AVHWDeviceContext. + * @return The newly created HW-specific configuration structure on + * success or NULL on failure. + */ +void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx); + +/** + * Get the constraints on HW frames given a device and the HW-specific + * configuration to be used with that device. If no HW-specific + * configuration is provided, returns the maximum possible capabilities + * of the device. + * + * @param ref a reference to the associated AVHWDeviceContext. + * @param hwconfig a filled HW-specific configuration structure, or NULL + * to return the maximum possible capabilities of the device. + * @return AVHWFramesConstraints structure describing the constraints + * on the device, or NULL if not available. + */ +AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref, + const void *hwconfig); + +/** + * Free an AVHWFrameConstraints structure. + * + * @param constraints The (filled or unfilled) AVHWFrameConstraints structure. + */ +void av_hwframe_constraints_free(AVHWFramesConstraints **constraints); + + +/** + * Flags to apply to frame mappings. + */ +enum { + /** + * The mapping must be readable. + */ + AV_HWFRAME_MAP_READ = 1 << 0, + /** + * The mapping must be writeable. + */ + AV_HWFRAME_MAP_WRITE = 1 << 1, + /** + * The mapped frame will be overwritten completely in subsequent + * operations, so the current frame data need not be loaded. Any values + * which are not overwritten are unspecified. + */ + AV_HWFRAME_MAP_OVERWRITE = 1 << 2, + /** + * The mapping must be direct. That is, there must not be any copying in + * the map or unmap steps. Note that performance of direct mappings may + * be much lower than normal memory. + */ + AV_HWFRAME_MAP_DIRECT = 1 << 3, +}; + +/** + * Map a hardware frame. + * + * This has a number of different possible effects, depending on the format + * and origin of the src and dst frames. On input, src should be a usable + * frame with valid buffers and dst should be blank (typically as just created + * by av_frame_alloc()). src should have an associated hwframe context, and + * dst may optionally have a format and associated hwframe context. + * + * If src was created by mapping a frame from the hwframe context of dst, + * then this function undoes the mapping - dst is replaced by a reference to + * the frame that src was originally mapped from. + * + * If both src and dst have an associated hwframe context, then this function + * attempts to map the src frame from its hardware context to that of dst and + * then fill dst with appropriate data to be usable there. This will only be + * possible if the hwframe contexts and associated devices are compatible - + * given compatible devices, av_hwframe_ctx_create_derived() can be used to + * create a hwframe context for dst in which mapping should be possible. + * + * If src has a hwframe context but dst does not, then the src frame is + * mapped to normal memory and should thereafter be usable as a normal frame. + * If the format is set on dst, then the mapping will attempt to create dst + * with that format and fail if it is not possible. If format is unset (is + * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate + * format to use is (probably the sw_format of the src hwframe context). + * + * A return value of AVERROR(ENOSYS) indicates that the mapping is not + * possible with the given arguments and hwframe setup, while other return + * values indicate that it failed somehow. + * + * @param dst Destination frame, to contain the mapping. + * @param src Source frame, to be mapped. + * @param flags Some combination of AV_HWFRAME_MAP_* flags. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags); + + +/** + * Create and initialise an AVHWFramesContext as a mapping of another existing + * AVHWFramesContext on a different device. + * + * av_hwframe_ctx_init() should not be called after this. + * + * @param derived_frame_ctx On success, a reference to the newly created + * AVHWFramesContext. + * @param derived_device_ctx A reference to the device to create the new + * AVHWFramesContext on. + * @param source_frame_ctx A reference to an existing AVHWFramesContext + * which will be mapped to the derived context. + * @param flags Some combination of AV_HWFRAME_MAP_* flags, defining the + * mapping parameters to apply to frames which are allocated + * in the derived device. + * @return Zero on success, negative AVERROR code on failure. + */ +int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, + enum AVPixelFormat format, + AVBufferRef *derived_device_ctx, + AVBufferRef *source_frame_ctx, + int flags); + +#endif /* AVUTIL_HWCONTEXT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_cuda.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_cuda.h new file mode 100644 index 0000000..81a0552 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_cuda.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_CUDA_H +#define AVUTIL_HWCONTEXT_CUDA_H + +#ifndef CUDA_VERSION +#include +#endif + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_CUDA. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CUdeviceptr. + */ + +typedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal; + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVCUDADeviceContext { + CUcontext cuda_ctx; + CUstream stream; + AVCUDADeviceContextInternal *internal; +} AVCUDADeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_CUDA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_d3d11va.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_d3d11va.h new file mode 100644 index 0000000..9f91e9b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_d3d11va.h @@ -0,0 +1,169 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_D3D11VA_H +#define AVUTIL_HWCONTEXT_D3D11VA_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA. + * + * The default pool implementation will be fixed-size if initial_pool_size is + * set (and allocate elements from an array texture). Otherwise it will allocate + * individual textures. Be aware that decoding requires a single array texture. + * + * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to + * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for + * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVD3D11VADeviceContext { + /** + * Device used for texture creation and access. This can also be used to + * set the libavcodec decoding device. + * + * Must be set by the user. This is the only mandatory field - the other + * device context fields are set from this and are available for convenience. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11Device *device; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11DeviceContext *device_context; + + /** + * If unset, this will be set from the device field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoDevice *video_device; + + /** + * If unset, this will be set from the device_context field on init. + * + * Deallocating the AVHWDeviceContext will always release this interface, + * and it does not matter whether it was user-allocated. + */ + ID3D11VideoContext *video_context; + + /** + * Callbacks for locking. They protect accesses to device_context and + * video_context calls. They also protect access to the internal staging + * texture (for av_hwframe_transfer_data() calls). They do NOT protect + * access to hwcontext or decoder state in general. + * + * If unset on init, the hwcontext implementation will set them to use an + * internal mutex. + * + * The underlying lock must be recursive. lock_ctx is for free use by the + * locking implementation. + */ + void (*lock)(void *lock_ctx); + void (*unlock)(void *lock_ctx); + void *lock_ctx; +} AVD3D11VADeviceContext; + +/** + * D3D11 frame descriptor for pool allocation. + * + * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer pointing at an object of this type describing the + * planes of the frame. + * + * This has no use outside of custom allocation, and AVFrame AVBufferRef do not + * necessarily point to an instance of this struct. + */ +typedef struct AVD3D11FrameDescriptor { + /** + * The texture in which the frame is located. The reference count is + * managed by the AVBufferRef, and destroying the reference will release + * the interface. + * + * Normally stored in AVFrame.data[0]. + */ + ID3D11Texture2D *texture; + + /** + * The index into the array texture element representing the frame, or 0 + * if the texture is not an array texture. + * + * Normally stored in AVFrame.data[1] (cast from intptr_t). + */ + intptr_t index; +} AVD3D11FrameDescriptor; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVD3D11VAFramesContext { + /** + * The canonical texture used for pool allocation. If this is set to NULL + * on init, the hwframes implementation will allocate and set an array + * texture if initial_pool_size > 0. + * + * The only situation when the API user should set this is: + * - the user wants to do manual pool allocation (setting + * AVHWFramesContext.pool), instead of letting AVHWFramesContext + * allocate the pool + * - of an array texture + * - and wants it to use it for decoding + * - this has to be done before calling av_hwframe_ctx_init() + * + * Deallocating the AVHWFramesContext will always release this interface, + * and it does not matter whether it was user-allocated. + * + * This is in particular used by the libavcodec D3D11VA hwaccel, which + * requires a single array texture. It will create ID3D11VideoDecoderOutputView + * objects for each array texture element on decoder initialization. + */ + ID3D11Texture2D *texture; + + /** + * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must + * at least set D3D11_BIND_DECODER if the frames context is to be used for + * video decoding. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT BindFlags; + + /** + * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + UINT MiscFlags; +} AVD3D11VAFramesContext; + +#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_drm.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_drm.h new file mode 100644 index 0000000..42709f2 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_drm.h @@ -0,0 +1,169 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_DRM_H +#define AVUTIL_HWCONTEXT_DRM_H + +#include +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_DRM. + * + * Internal frame allocation is not currently supported - all frames + * must be allocated by the user. Thus AVHWFramesContext is always + * NULL, though this may change if support for frame allocation is + * added in future. + */ + +enum { + /** + * The maximum number of layers/planes in a DRM frame. + */ + AV_DRM_MAX_PLANES = 4 +}; + +/** + * DRM object descriptor. + * + * Describes a single DRM object, addressing it as a PRIME file + * descriptor. + */ +typedef struct AVDRMObjectDescriptor { + /** + * DRM PRIME fd for the object. + */ + int fd; + /** + * Total size of the object. + * + * (This includes any parts not which do not contain image data.) + */ + size_t size; + /** + * Format modifier applied to the object (DRM_FORMAT_MOD_*). + * + * If the format modifier is unknown then this should be set to + * DRM_FORMAT_MOD_INVALID. + */ + uint64_t format_modifier; +} AVDRMObjectDescriptor; + +/** + * DRM plane descriptor. + * + * Describes a single plane of a layer, which is contained within + * a single object. + */ +typedef struct AVDRMPlaneDescriptor { + /** + * Index of the object containing this plane in the objects + * array of the enclosing frame descriptor. + */ + int object_index; + /** + * Offset within that object of this plane. + */ + ptrdiff_t offset; + /** + * Pitch (linesize) of this plane. + */ + ptrdiff_t pitch; +} AVDRMPlaneDescriptor; + +/** + * DRM layer descriptor. + * + * Describes a single layer within a frame. This has the structure + * defined by its format, and will contain one or more planes. + */ +typedef struct AVDRMLayerDescriptor { + /** + * Format of the layer (DRM_FORMAT_*). + */ + uint32_t format; + /** + * Number of planes in the layer. + * + * This must match the number of planes required by format. + */ + int nb_planes; + /** + * Array of planes in this layer. + */ + AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; +} AVDRMLayerDescriptor; + +/** + * DRM frame descriptor. + * + * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. + * It is also used by user-allocated frame pools - allocating in + * AVHWFramesContext.pool must return AVBufferRefs which contain + * an object of this type. + * + * The fields of this structure should be set such it can be + * imported directly by EGL using the EGL_EXT_image_dma_buf_import + * and EGL_EXT_image_dma_buf_import_modifiers extensions. + * (Note that the exact layout of a particular format may vary between + * platforms - we only specify that the same platform should be able + * to import it.) + * + * The total number of planes must not exceed AV_DRM_MAX_PLANES, and + * the order of the planes by increasing layer index followed by + * increasing plane index must be the same as the order which would + * be used for the data pointers in the equivalent software format. + */ +typedef struct AVDRMFrameDescriptor { + /** + * Number of DRM objects making up this frame. + */ + int nb_objects; + /** + * Array of objects making up the frame. + */ + AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; + /** + * Number of layers in the frame. + */ + int nb_layers; + /** + * Array of layers in the frame. + */ + AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; +} AVDRMFrameDescriptor; + +/** + * DRM device. + * + * Allocated as AVHWDeviceContext.hwctx. + */ +typedef struct AVDRMDeviceContext { + /** + * File descriptor of DRM device. + * + * This is used as the device to create frames on, and may also be + * used in some derivation and mapping operations. + * + * If no device is required, set to -1. + */ + int fd; +} AVDRMDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_DRM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_dxva2.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_dxva2.h new file mode 100644 index 0000000..e1b79bc --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_dxva2.h @@ -0,0 +1,75 @@ +/* + * 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 + */ + + +#ifndef AVUTIL_HWCONTEXT_DXVA2_H +#define AVUTIL_HWCONTEXT_DXVA2_H + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_DXVA2. + * + * Only fixed-size pools are supported. + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a pointer to IDirect3DSurface9. + */ + +#include +#include + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVDXVA2DeviceContext { + IDirect3DDeviceManager9 *devmgr; +} AVDXVA2DeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVDXVA2FramesContext { + /** + * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or + * DXVA2_VideoDecoderRenderTarget). Must be set by the caller. + */ + DWORD surface_type; + + /** + * The surface pool. When an external pool is not provided by the caller, + * this will be managed (allocated and filled on init, freed on uninit) by + * libavutil. + */ + IDirect3DSurface9 **surfaces; + int nb_surfaces; + + /** + * Certain drivers require the decoder to be destroyed before the surfaces. + * To allow internally managed pools to work properly in such cases, this + * field is provided. + * + * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on + * it just before the internal surface pool is freed. + * + * This is for convenience only. Some code uses other methods to manage the + * decoder reference. + */ + IDirectXVideoDecoder *decoder_to_release; +} AVDXVA2FramesContext; + +#endif /* AVUTIL_HWCONTEXT_DXVA2_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_mediacodec.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_mediacodec.h new file mode 100644 index 0000000..101a980 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_mediacodec.h @@ -0,0 +1,36 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_MEDIACODEC_H +#define AVUTIL_HWCONTEXT_MEDIACODEC_H + +/** + * MediaCodec details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVMediaCodecDeviceContext { + /** + * android/view/Surface handle, to be filled by the user. + * + * This is the default surface used by decoders on this device. + */ + void *surface; +} AVMediaCodecDeviceContext; + +#endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_qsv.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_qsv.h new file mode 100644 index 0000000..b98d611 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_qsv.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_QSV_H +#define AVUTIL_HWCONTEXT_QSV_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_QSV. + * + * This API does not support dynamic frame pools. AVHWFramesContext.pool must + * contain AVBufferRefs whose data pointer points to an mfxFrameSurface1 struct. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVQSVDeviceContext { + mfxSession session; +} AVQSVDeviceContext; + +/** + * This struct is allocated as AVHWFramesContext.hwctx + */ +typedef struct AVQSVFramesContext { + mfxFrameSurface1 *surfaces; + int nb_surfaces; + + /** + * A combination of MFX_MEMTYPE_* describing the frame pool. + */ + int frame_type; +} AVQSVFramesContext; + +#endif /* AVUTIL_HWCONTEXT_QSV_H */ + diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vaapi.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vaapi.h new file mode 100644 index 0000000..0b2e071 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vaapi.h @@ -0,0 +1,117 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VAAPI_H +#define AVUTIL_HWCONTEXT_VAAPI_H + +#include + +/** + * @file + * API-specific header for AV_HWDEVICE_TYPE_VAAPI. + * + * Dynamic frame pools are supported, but note that any pool used as a render + * target is required to be of fixed size in order to be be usable as an + * argument to vaCreateContext(). + * + * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs + * with the data pointer set to a VASurfaceID. + */ + +enum { + /** + * The quirks field has been set by the user and should not be detected + * automatically by av_hwdevice_ctx_init(). + */ + AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0), + /** + * The driver does not destroy parameter buffers when they are used by + * vaRenderPicture(). Additional code will be required to destroy them + * separately afterwards. + */ + AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1), + + /** + * The driver does not support the VASurfaceAttribMemoryType attribute, + * so the surface allocation code will not try to use it. + */ + AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2), + + /** + * The driver does not support surface attributes at all. + * The surface allocation code will never pass them to surface allocation, + * and the results of the vaQuerySurfaceAttributes() call will be faked. + */ + AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3), +}; + +/** + * VAAPI connection details. + * + * Allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVAAPIDeviceContext { + /** + * The VADisplay handle, to be filled by the user. + */ + VADisplay display; + /** + * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(), + * with reference to a table of known drivers, unless the + * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user + * may need to refer to this field when performing any later + * operations using VAAPI with the same VADisplay. + */ + unsigned int driver_quirks; +} AVVAAPIDeviceContext; + +/** + * VAAPI-specific data associated with a frame pool. + * + * Allocated as AVHWFramesContext.hwctx. + */ +typedef struct AVVAAPIFramesContext { + /** + * Set by the user to apply surface attributes to all surfaces in + * the frame pool. If null, default settings are used. + */ + VASurfaceAttrib *attributes; + int nb_attributes; + /** + * The surfaces IDs of all surfaces in the pool after creation. + * Only valid if AVHWFramesContext.initial_pool_size was positive. + * These are intended to be used as the render_targets arguments to + * vaCreateContext(). + */ + VASurfaceID *surface_ids; + int nb_surfaces; +} AVVAAPIFramesContext; + +/** + * VAAPI hardware pipeline configuration details. + * + * Allocated with av_hwdevice_hwconfig_alloc(). + */ +typedef struct AVVAAPIHWConfig { + /** + * ID of a VAAPI pipeline configuration. + */ + VAConfigID config_id; +} AVVAAPIHWConfig; + +#endif /* AVUTIL_HWCONTEXT_VAAPI_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vdpau.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vdpau.h new file mode 100644 index 0000000..1b7ea1e --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_vdpau.h @@ -0,0 +1,44 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VDPAU_H +#define AVUTIL_HWCONTEXT_VDPAU_H + +#include + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VDPAU. + * + * This API supports dynamic frame pools. AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a VdpVideoSurface. + */ + +/** + * This struct is allocated as AVHWDeviceContext.hwctx + */ +typedef struct AVVDPAUDeviceContext { + VdpDevice device; + VdpGetProcAddress *get_proc_address; +} AVVDPAUDeviceContext; + +/** + * AVHWFramesContext.hwctx is currently not used + */ + +#endif /* AVUTIL_HWCONTEXT_VDPAU_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_videotoolbox.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_videotoolbox.h new file mode 100644 index 0000000..380918d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/hwcontext_videotoolbox.h @@ -0,0 +1,54 @@ +/* + * 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 + */ + +#ifndef AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H +#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H + +#include + +#include + +#include "pixfmt.h" + +/** + * @file + * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX. + * + * This API currently does not support frame allocation, as the raw VideoToolbox + * API does allocation, and FFmpeg itself never has the need to allocate frames. + * + * If the API user sets a custom pool, AVHWFramesContext.pool must return + * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef. + * + * Currently AVHWDeviceContext.hwctx and AVHWFramesContext.hwctx are always + * NULL. + */ + +/** + * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat. + * Returns AV_PIX_FMT_NONE if no known equivalent was found. + */ +enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); + +/** + * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format. + * Returns 0 if no known equivalent was found. + */ +uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt); + +#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/imgutils.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/imgutils.h new file mode 100644 index 0000000..5b790ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/imgutils.h @@ -0,0 +1,277 @@ +/* + * 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 + */ + +#ifndef AVUTIL_IMGUTILS_H +#define AVUTIL_IMGUTILS_H + +/** + * @file + * misc image utilities + * + * @addtogroup lavu_picture + * @{ + */ + +#include "avutil.h" +#include "pixdesc.h" +#include "rational.h" + +/** + * Compute the max pixel step for each plane of an image with a + * format described by pixdesc. + * + * The pixel step is the distance in bytes between the first byte of + * the group of bytes which describe a pixel component and the first + * byte of the successive group in the same plane for the same + * component. + * + * @param max_pixsteps an array which is filled with the max pixel step + * for each plane. Since a plane may contain different pixel + * components, the computed max_pixsteps[plane] is relative to the + * component in the plane with the max pixel step. + * @param max_pixstep_comps an array which is filled with the component + * for each plane which has the max pixel step. May be NULL. + */ +void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4], + const AVPixFmtDescriptor *pixdesc); + +/** + * Compute the size of an image line with format pix_fmt and width + * width for the plane plane. + * + * @return the computed size in bytes + */ +int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane); + +/** + * Fill plane linesizes for an image with pixel format pix_fmt and + * width width. + * + * @param linesizes array to be filled with the linesize for each plane + * @return >= 0 in case of success, a negative error code otherwise + */ +int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width); + +/** + * Fill plane data pointers for an image with pixel format pix_fmt and + * height height. + * + * @param data pointers array to be filled with the pointer for each image plane + * @param ptr the pointer to a buffer which will contain the image + * @param linesizes the array containing the linesize for each + * plane, should be filled by av_image_fill_linesizes() + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, + uint8_t *ptr, const int linesizes[4]); + +/** + * Allocate an image with size w and h and pixel format pix_fmt, and + * fill pointers and linesizes accordingly. + * The allocated image buffer has to be freed by using + * av_freep(&pointers[0]). + * + * @param align the value to use for buffer size alignment + * @return the size in bytes required for the image buffer, a negative + * error code in case of failure + */ +int av_image_alloc(uint8_t *pointers[4], int linesizes[4], + int w, int h, enum AVPixelFormat pix_fmt, int align); + +/** + * Copy image plane from src to dst. + * That is, copy "height" number of lines of "bytewidth" bytes each. + * The first byte of each successive line is separated by *_linesize + * bytes. + * + * bytewidth must be contained by both absolute values of dst_linesize + * and src_linesize, otherwise the function behavior is undefined. + * + * @param dst_linesize linesize for the image plane in dst + * @param src_linesize linesize for the image plane in src + */ +void av_image_copy_plane(uint8_t *dst, int dst_linesize, + const uint8_t *src, int src_linesize, + int bytewidth, int height); + +/** + * Copy image in src_data to dst_data. + * + * @param dst_linesizes linesizes for the image in dst_data + * @param src_linesizes linesizes for the image in src_data + */ +void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], + const uint8_t *src_data[4], const int src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where + * available, this function will use special functionality for reading from such + * memory, which may result in greatly improved performance compared to plain + * av_image_copy(). + * + * The data pointers and the linesizes must be aligned to the maximum required + * by the CPU architecture. + * + * @note The linesize parameters have the type ptrdiff_t here, while they are + * int for av_image_copy(). + * @note On x86, the linesizes currently need to be aligned to the cacheline + * size (i.e. 64) to get improved performance. + */ +void av_image_copy_uc_from(uint8_t *dst_data[4], const ptrdiff_t dst_linesizes[4], + const uint8_t *src_data[4], const ptrdiff_t src_linesizes[4], + enum AVPixelFormat pix_fmt, int width, int height); + +/** + * Setup the data pointers and linesizes based on the specified image + * parameters and the provided array. + * + * The fields of the given image are filled in by using the src + * address which points to the image data buffer. Depending on the + * specified pixel format, one or multiple image data pointers and + * line sizes will be set. If a planar format is specified, several + * pointers will be set pointing to the different picture planes and + * the line sizes of the different planes will be stored in the + * lines_sizes array. Call with src == NULL to get the required + * size for the src buffer. + * + * To allocate the buffer and fill in the dst_data and dst_linesize in + * one call, use av_image_alloc(). + * + * @param dst_data data pointers to be filled in + * @param dst_linesize linesizes for the image in dst_data to be filled in + * @param src buffer which will contain or contains the actual image data, can be NULL + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the value used in src for linesize alignment + * @return the size in bytes required for src, a negative error code + * in case of failure + */ +int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], + const uint8_t *src, + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Return the size in bytes of the amount of data required to store an + * image with the given parameters. + * + * @param pix_fmt the pixel format of the image + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @param align the assumed linesize alignment + * @return the buffer size in bytes, a negative error code in case of failure + */ +int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Copy image data from an image into a buffer. + * + * av_image_get_buffer_size() can be used to compute the required size + * for the buffer to fill. + * + * @param dst a buffer into which picture data will be copied + * @param dst_size the size in bytes of dst + * @param src_data pointers containing the source image data + * @param src_linesize linesizes for the image in src_data + * @param pix_fmt the pixel format of the source image + * @param width the width of the source image in pixels + * @param height the height of the source image in pixels + * @param align the assumed linesize alignment for dst + * @return the number of bytes written to dst, or a negative value + * (error code) on error + */ +int av_image_copy_to_buffer(uint8_t *dst, int dst_size, + const uint8_t * const src_data[4], const int src_linesize[4], + enum AVPixelFormat pix_fmt, int width, int height, int align); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of the image can be addressed with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx); + +/** + * Check if the given dimension of an image is valid, meaning that all + * bytes of a plane of an image with the specified pix_fmt can be addressed + * with a signed int. + * + * @param w the width of the picture + * @param h the height of the picture + * @param max_pixels the maximum number of pixels the user wants to accept + * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown. + * @param log_offset the offset to sum to the log level for logging with log_ctx + * @param log_ctx the parent logging context, it may be NULL + * @return >= 0 if valid, a negative error code otherwise + */ +int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx); + +/** + * Check if the given sample aspect ratio of an image is valid. + * + * It is considered invalid if the denominator is 0 or if applying the ratio + * to the image size would make the smaller dimension less than 1. If the + * sar numerator is 0, it is considered unknown and will return as valid. + * + * @param w width of the image + * @param h height of the image + * @param sar sample aspect ratio of the image + * @return 0 if valid, a negative AVERROR code otherwise + */ +int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar); + +/** + * Overwrite the image data with black. This is suitable for filling a + * sub-rectangle of an image, meaning the padding between the right most pixel + * and the left most pixel on the next line will not be overwritten. For some + * formats, the image size might be rounded up due to inherent alignment. + * + * If the pixel format has alpha, the alpha is cleared to opaque. + * + * This can return an error if the pixel format is not supported. Normally, all + * non-hwaccel pixel formats should be supported. + * + * Passing NULL for dst_data is allowed. Then the function returns whether the + * operation would have succeeded. (It can return an error if the pix_fmt is + * not supported.) + * + * @param dst_data data pointers to destination image + * @param dst_linesize linesizes for the destination image + * @param pix_fmt the pixel format of the image + * @param range the color range of the image (important for colorspaces such as YUV) + * @param width the width of the image in pixels + * @param height the height of the image in pixels + * @return 0 if the image data was cleared, a negative AVERROR code otherwise + */ +int av_image_fill_black(uint8_t *dst_data[4], const ptrdiff_t dst_linesize[4], + enum AVPixelFormat pix_fmt, enum AVColorRange range, + int width, int height); + +/** + * @} + */ + + +#endif /* AVUTIL_IMGUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intfloat.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intfloat.h new file mode 100644 index 0000000..fe3d7ec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intfloat.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 Mans Rullgard + * + * 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 + */ + +#ifndef AVUTIL_INTFLOAT_H +#define AVUTIL_INTFLOAT_H + +#include +#include "attributes.h" + +union av_intfloat32 { + uint32_t i; + float f; +}; + +union av_intfloat64 { + uint64_t i; + double f; +}; + +/** + * Reinterpret a 32-bit integer as a float. + */ +static av_always_inline float av_int2float(uint32_t i) +{ + union av_intfloat32 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a float as a 32-bit integer. + */ +static av_always_inline uint32_t av_float2int(float f) +{ + union av_intfloat32 v; + v.f = f; + return v.i; +} + +/** + * Reinterpret a 64-bit integer as a double. + */ +static av_always_inline double av_int2double(uint64_t i) +{ + union av_intfloat64 v; + v.i = i; + return v.f; +} + +/** + * Reinterpret a double as a 64-bit integer. + */ +static av_always_inline uint64_t av_double2int(double f) +{ + union av_intfloat64 v; + v.f = f; + return v.i; +} + +#endif /* AVUTIL_INTFLOAT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intreadwrite.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intreadwrite.h new file mode 100644 index 0000000..4c8413a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/intreadwrite.h @@ -0,0 +1,644 @@ +/* + * 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 + */ + +#ifndef AVUTIL_INTREADWRITE_H +#define AVUTIL_INTREADWRITE_H + +#include +#include "libavutil/avconfig.h" +#include "attributes.h" +#include "bswap.h" + +typedef union { + uint64_t u64; + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8 [8]; + double f64; + float f32[2]; +} av_alias av_alias64; + +typedef union { + uint32_t u32; + uint16_t u16[2]; + uint8_t u8 [4]; + float f32; +} av_alias av_alias32; + +typedef union { + uint16_t u16; + uint8_t u8 [2]; +} av_alias av_alias16; + +/* + * Arch-specific headers can provide any combination of + * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros. + * Preprocessor symbols must be defined, even if these are implemented + * as inline functions. + * + * R/W means read/write, B/L/N means big/little/native endianness. + * The following macros require aligned access, compared to their + * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A. + * Incorrect usage may range from abysmal performance to crash + * depending on the platform. + * + * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U. + */ + +#ifdef HAVE_AV_CONFIG_H + +#include "config.h" + +#if ARCH_ARM +# include "arm/intreadwrite.h" +#elif ARCH_AVR32 +# include "avr32/intreadwrite.h" +#elif ARCH_MIPS +# include "mips/intreadwrite.h" +#elif ARCH_PPC +# include "ppc/intreadwrite.h" +#elif ARCH_TOMI +# include "tomi/intreadwrite.h" +#elif ARCH_X86 +# include "x86/intreadwrite.h" +#endif + +#endif /* HAVE_AV_CONFIG_H */ + +/* + * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. + */ + +#if AV_HAVE_BIGENDIAN + +# if defined(AV_RN16) && !defined(AV_RB16) +# define AV_RB16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RB16) +# define AV_RN16(p) AV_RB16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WB16) +# define AV_WB16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WB16) +# define AV_WN16(p, v) AV_WB16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RB24) +# define AV_RB24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RB24) +# define AV_RN24(p) AV_RB24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WB24) +# define AV_WB24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WB24) +# define AV_WN24(p, v) AV_WB24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RB32) +# define AV_RB32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RB32) +# define AV_RN32(p) AV_RB32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WB32) +# define AV_WB32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WB32) +# define AV_WN32(p, v) AV_WB32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RB48) +# define AV_RB48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RB48) +# define AV_RN48(p) AV_RB48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WB48) +# define AV_WB48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WB48) +# define AV_WN48(p, v) AV_WB48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RB64) +# define AV_RB64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RB64) +# define AV_RN64(p) AV_RB64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WB64) +# define AV_WB64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WB64) +# define AV_WN64(p, v) AV_WB64(p, v) +# endif + +#else /* AV_HAVE_BIGENDIAN */ + +# if defined(AV_RN16) && !defined(AV_RL16) +# define AV_RL16(p) AV_RN16(p) +# elif !defined(AV_RN16) && defined(AV_RL16) +# define AV_RN16(p) AV_RL16(p) +# endif + +# if defined(AV_WN16) && !defined(AV_WL16) +# define AV_WL16(p, v) AV_WN16(p, v) +# elif !defined(AV_WN16) && defined(AV_WL16) +# define AV_WN16(p, v) AV_WL16(p, v) +# endif + +# if defined(AV_RN24) && !defined(AV_RL24) +# define AV_RL24(p) AV_RN24(p) +# elif !defined(AV_RN24) && defined(AV_RL24) +# define AV_RN24(p) AV_RL24(p) +# endif + +# if defined(AV_WN24) && !defined(AV_WL24) +# define AV_WL24(p, v) AV_WN24(p, v) +# elif !defined(AV_WN24) && defined(AV_WL24) +# define AV_WN24(p, v) AV_WL24(p, v) +# endif + +# if defined(AV_RN32) && !defined(AV_RL32) +# define AV_RL32(p) AV_RN32(p) +# elif !defined(AV_RN32) && defined(AV_RL32) +# define AV_RN32(p) AV_RL32(p) +# endif + +# if defined(AV_WN32) && !defined(AV_WL32) +# define AV_WL32(p, v) AV_WN32(p, v) +# elif !defined(AV_WN32) && defined(AV_WL32) +# define AV_WN32(p, v) AV_WL32(p, v) +# endif + +# if defined(AV_RN48) && !defined(AV_RL48) +# define AV_RL48(p) AV_RN48(p) +# elif !defined(AV_RN48) && defined(AV_RL48) +# define AV_RN48(p) AV_RL48(p) +# endif + +# if defined(AV_WN48) && !defined(AV_WL48) +# define AV_WL48(p, v) AV_WN48(p, v) +# elif !defined(AV_WN48) && defined(AV_WL48) +# define AV_WN48(p, v) AV_WL48(p, v) +# endif + +# if defined(AV_RN64) && !defined(AV_RL64) +# define AV_RL64(p) AV_RN64(p) +# elif !defined(AV_RN64) && defined(AV_RL64) +# define AV_RN64(p) AV_RL64(p) +# endif + +# if defined(AV_WN64) && !defined(AV_WL64) +# define AV_WL64(p, v) AV_WN64(p, v) +# elif !defined(AV_WN64) && defined(AV_WL64) +# define AV_WN64(p, v) AV_WL64(p, v) +# endif + +#endif /* !AV_HAVE_BIGENDIAN */ + +/* + * Define AV_[RW]N helper macros to simplify definitions not provided + * by per-arch headers. + */ + +#if defined(__GNUC__) + +union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; +union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias; +union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias; + +# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l) +# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v)) + +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64) || defined(_M_ARM64)) && AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) +# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) + +#elif AV_HAVE_FAST_UNALIGNED + +# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s) +# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#else + +#ifndef AV_RB16 +# define AV_RB16(x) \ + ((((const uint8_t*)(x))[0] << 8) | \ + ((const uint8_t*)(x))[1]) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RL16 +# define AV_RL16(x) \ + ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, val) do { \ + uint16_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + } while(0) +#endif + +#ifndef AV_RB32 +# define AV_RB32(x) \ + (((uint32_t)((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RL32 +# define AV_RL32(x) \ + (((uint32_t)((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, val) do { \ + uint32_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + } while(0) +#endif + +#ifndef AV_RB64 +# define AV_RB64(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ + ((uint8_t*)(p))[5] = (d)>>16; \ + ((uint8_t*)(p))[4] = (d)>>24; \ + ((uint8_t*)(p))[3] = (d)>>32; \ + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; \ + } while(0) +#endif + +#ifndef AV_RL64 +# define AV_RL64(x) \ + (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, val) do { \ + uint64_t d = (val); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; \ + } while(0) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RN(s, p) AV_RB##s(p) +# define AV_WN(s, p, v) AV_WB##s(p, v) +#else +# define AV_RN(s, p) AV_RL##s(p) +# define AV_WN(s, p, v) AV_WL##s(p, v) +#endif + +#endif /* HAVE_FAST_UNALIGNED */ + +#ifndef AV_RN16 +# define AV_RN16(p) AV_RN(16, p) +#endif + +#ifndef AV_RN32 +# define AV_RN32(p) AV_RN(32, p) +#endif + +#ifndef AV_RN64 +# define AV_RN64(p) AV_RN(64, p) +#endif + +#ifndef AV_WN16 +# define AV_WN16(p, v) AV_WN(16, p, v) +#endif + +#ifndef AV_WN32 +# define AV_WN32(p, v) AV_WN(32, p, v) +#endif + +#ifndef AV_WN64 +# define AV_WN64(p, v) AV_WN(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RB(s, p) AV_RN##s(p) +# define AV_WB(s, p, v) AV_WN##s(p, v) +# define AV_RL(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v)) +#else +# define AV_RB(s, p) av_bswap##s(AV_RN##s(p)) +# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v)) +# define AV_RL(s, p) AV_RN##s(p) +# define AV_WL(s, p, v) AV_WN##s(p, v) +#endif + +#define AV_RB8(x) (((const uint8_t*)(x))[0]) +#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) + +#define AV_RL8(x) AV_RB8(x) +#define AV_WL8(p, d) AV_WB8(p, d) + +#ifndef AV_RB16 +# define AV_RB16(p) AV_RB(16, p) +#endif +#ifndef AV_WB16 +# define AV_WB16(p, v) AV_WB(16, p, v) +#endif + +#ifndef AV_RL16 +# define AV_RL16(p) AV_RL(16, p) +#endif +#ifndef AV_WL16 +# define AV_WL16(p, v) AV_WL(16, p, v) +#endif + +#ifndef AV_RB32 +# define AV_RB32(p) AV_RB(32, p) +#endif +#ifndef AV_WB32 +# define AV_WB32(p, v) AV_WB(32, p, v) +#endif + +#ifndef AV_RL32 +# define AV_RL32(p) AV_RL(32, p) +#endif +#ifndef AV_WL32 +# define AV_WL32(p, v) AV_WL(32, p, v) +#endif + +#ifndef AV_RB64 +# define AV_RB64(p) AV_RB(64, p) +#endif +#ifndef AV_WB64 +# define AV_WB64(p, v) AV_WB(64, p, v) +#endif + +#ifndef AV_RL64 +# define AV_RL64(p) AV_RL(64, p) +#endif +#ifndef AV_WL64 +# define AV_WL64(p, v) AV_WL(64, p, v) +#endif + +#ifndef AV_RB24 +# define AV_RB24(x) \ + ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[2]) +#endif +#ifndef AV_WB24 +# define AV_WB24(p, d) do { \ + ((uint8_t*)(p))[2] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[0] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RL24 +# define AV_RL24(x) \ + ((((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL24 +# define AV_WL24(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + } while(0) +#endif + +#ifndef AV_RB48 +# define AV_RB48(x) \ + (((uint64_t)((const uint8_t*)(x))[0] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 8) | \ + (uint64_t)((const uint8_t*)(x))[5]) +#endif +#ifndef AV_WB48 +# define AV_WB48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[5] = (d); \ + ((uint8_t*)(p))[4] = (d)>>8; \ + ((uint8_t*)(p))[3] = (d)>>16; \ + ((uint8_t*)(p))[2] = (d)>>24; \ + ((uint8_t*)(p))[1] = (d)>>32; \ + ((uint8_t*)(p))[0] = (d)>>40; \ + } while(0) +#endif + +#ifndef AV_RL48 +# define AV_RL48(x) \ + (((uint64_t)((const uint8_t*)(x))[5] << 40) | \ + ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ + ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) +#endif +#ifndef AV_WL48 +# define AV_WL48(p, darg) do { \ + uint64_t d = (darg); \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; \ + ((uint8_t*)(p))[4] = (d)>>32; \ + ((uint8_t*)(p))[5] = (d)>>40; \ + } while(0) +#endif + +/* + * The AV_[RW]NA macros access naturally aligned data + * in a type-safe way. + */ + +#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s) +#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v)) + +#ifndef AV_RN16A +# define AV_RN16A(p) AV_RNA(16, p) +#endif + +#ifndef AV_RN32A +# define AV_RN32A(p) AV_RNA(32, p) +#endif + +#ifndef AV_RN64A +# define AV_RN64A(p) AV_RNA(64, p) +#endif + +#ifndef AV_WN16A +# define AV_WN16A(p, v) AV_WNA(16, p, v) +#endif + +#ifndef AV_WN32A +# define AV_WN32A(p, v) AV_WNA(32, p, v) +#endif + +#ifndef AV_WN64A +# define AV_WN64A(p, v) AV_WNA(64, p, v) +#endif + +#if AV_HAVE_BIGENDIAN +# define AV_RLA(s, p) av_bswap##s(AV_RN##s##A(p)) +# define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v)) +#else +# define AV_RLA(s, p) AV_RN##s##A(p) +# define AV_WLA(s, p, v) AV_WN##s##A(p, v) +#endif + +#ifndef AV_RL64A +# define AV_RL64A(p) AV_RLA(64, p) +#endif +#ifndef AV_WL64A +# define AV_WL64A(p, v) AV_WLA(64, p, v) +#endif + +/* + * The AV_COPYxxU macros are suitable for copying data to/from unaligned + * memory locations. + */ + +#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s)); + +#ifndef AV_COPY16U +# define AV_COPY16U(d, s) AV_COPYU(16, d, s) +#endif + +#ifndef AV_COPY32U +# define AV_COPY32U(d, s) AV_COPYU(32, d, s) +#endif + +#ifndef AV_COPY64U +# define AV_COPY64U(d, s) AV_COPYU(64, d, s) +#endif + +#ifndef AV_COPY128U +# define AV_COPY128U(d, s) \ + do { \ + AV_COPY64U(d, s); \ + AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \ + } while(0) +#endif + +/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be + * naturally aligned. They may be implemented using MMX, + * so emms_c() must be called before using any float code + * afterwards. + */ + +#define AV_COPY(n, d, s) \ + (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n) + +#ifndef AV_COPY16 +# define AV_COPY16(d, s) AV_COPY(16, d, s) +#endif + +#ifndef AV_COPY32 +# define AV_COPY32(d, s) AV_COPY(32, d, s) +#endif + +#ifndef AV_COPY64 +# define AV_COPY64(d, s) AV_COPY(64, d, s) +#endif + +#ifndef AV_COPY128 +# define AV_COPY128(d, s) \ + do { \ + AV_COPY64(d, s); \ + AV_COPY64((char*)(d)+8, (char*)(s)+8); \ + } while(0) +#endif + +#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b)) + +#ifndef AV_SWAP64 +# define AV_SWAP64(a, b) AV_SWAP(64, a, b) +#endif + +#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0) + +#ifndef AV_ZERO16 +# define AV_ZERO16(d) AV_ZERO(16, d) +#endif + +#ifndef AV_ZERO32 +# define AV_ZERO32(d) AV_ZERO(32, d) +#endif + +#ifndef AV_ZERO64 +# define AV_ZERO64(d) AV_ZERO(64, d) +#endif + +#ifndef AV_ZERO128 +# define AV_ZERO128(d) \ + do { \ + AV_ZERO64(d); \ + AV_ZERO64((char*)(d)+8); \ + } while(0) +#endif + +#endif /* AVUTIL_INTREADWRITE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lfg.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lfg.h new file mode 100644 index 0000000..03f779a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lfg.h @@ -0,0 +1,71 @@ +/* + * Lagged Fibonacci PRNG + * Copyright (c) 2008 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LFG_H +#define AVUTIL_LFG_H + +#include + +typedef struct AVLFG { + unsigned int state[64]; + int index; +} AVLFG; + +void av_lfg_init(AVLFG *c, unsigned int seed); + +/** + * Seed the state of the ALFG using binary data. + * + * Return value: 0 on success, negative value (AVERROR) on failure. + */ +int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); + +/** + * Get the next random unsigned 32-bit number using an ALFG. + * + * Please also consider a simple LCG like state= state*1664525+1013904223, + * it may be good enough and faster for your specific use case. + */ +static inline unsigned int av_lfg_get(AVLFG *c){ + c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; + return c->state[c->index++ & 63]; +} + +/** + * Get the next random unsigned 32-bit number using a MLFG. + * + * Please also consider av_lfg_get() above, it is faster. + */ +static inline unsigned int av_mlfg_get(AVLFG *c){ + unsigned int a= c->state[(c->index-55) & 63]; + unsigned int b= c->state[(c->index-24) & 63]; + return c->state[c->index++ & 63] = 2*a*b+a+b; +} + +/** + * Get the next two numbers generated by a Box-Muller Gaussian + * generator using the random numbers issued by lfg. + * + * @param out array where the two generated numbers are placed + */ +void av_bmg_get(AVLFG *lfg, double out[2]); + +#endif /* AVUTIL_LFG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/log.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/log.h new file mode 100644 index 0000000..d9554e6 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/log.h @@ -0,0 +1,362 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_LOG_H +#define AVUTIL_LOG_H + +#include +#include "avutil.h" +#include "attributes.h" +#include "version.h" + +typedef enum { + AV_CLASS_CATEGORY_NA = 0, + AV_CLASS_CATEGORY_INPUT, + AV_CLASS_CATEGORY_OUTPUT, + AV_CLASS_CATEGORY_MUXER, + AV_CLASS_CATEGORY_DEMUXER, + AV_CLASS_CATEGORY_ENCODER, + AV_CLASS_CATEGORY_DECODER, + AV_CLASS_CATEGORY_FILTER, + AV_CLASS_CATEGORY_BITSTREAM_FILTER, + AV_CLASS_CATEGORY_SWSCALER, + AV_CLASS_CATEGORY_SWRESAMPLER, + AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, + AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT, + AV_CLASS_CATEGORY_NB ///< not part of ABI/API +}AVClassCategory; + +#define AV_IS_INPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT)) + +#define AV_IS_OUTPUT_DEVICE(category) \ + (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \ + ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT)) + +struct AVOptionRanges; + +/** + * Describe the class of an AVClass context structure. That is an + * arbitrary struct of which the first field is a pointer to an + * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.). + */ +typedef struct AVClass { + /** + * The name of the class; usually it is the same name as the + * context structure type to which the AVClass is associated. + */ + const char* class_name; + + /** + * A pointer to a function which returns the name of a context + * instance ctx associated with the class. + */ + const char* (*item_name)(void* ctx); + + /** + * a pointer to the first option specified in the class if any or NULL + * + * @see av_set_default_options() + */ + const struct AVOption *option; + + /** + * LIBAVUTIL_VERSION with which this structure was created. + * This is used to allow fields to be added without requiring major + * version bumps everywhere. + */ + + int version; + + /** + * Offset in the structure where log_level_offset is stored. + * 0 means there is no such variable + */ + int log_level_offset_offset; + + /** + * Offset in the structure where a pointer to the parent context for + * logging is stored. For example a decoder could pass its AVCodecContext + * to eval as such a parent context, which an av_log() implementation + * could then leverage to display the parent context. + * The offset can be NULL. + */ + int parent_log_context_offset; + + /** + * Return next AVOptions-enabled child or NULL + */ + void* (*child_next)(void *obj, void *prev); + + /** + * Return an AVClass corresponding to the next potential + * AVOptions-enabled child. + * + * The difference between child_next and this is that + * child_next iterates over _already existing_ objects, while + * child_class_next iterates over _all possible_ children. + */ + const struct AVClass* (*child_class_next)(const struct AVClass *prev); + + /** + * Category used for visualization (like color) + * This is only set if the category is equal for all objects using this class. + * available since version (51 << 16 | 56 << 8 | 100) + */ + AVClassCategory category; + + /** + * Callback to return the category. + * available since version (51 << 16 | 59 << 8 | 100) + */ + AVClassCategory (*get_category)(void* ctx); + + /** + * Callback to return the supported/allowed ranges. + * available since version (52.12) + */ + int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags); +} AVClass; + +/** + * @addtogroup lavu_log + * + * @{ + * + * @defgroup lavu_log_constants Logging Constants + * + * @{ + */ + +/** + * Print no output. + */ +#define AV_LOG_QUIET -8 + +/** + * Something went really wrong and we will crash now. + */ +#define AV_LOG_PANIC 0 + +/** + * Something went wrong and recovery is not possible. + * For example, no header was found for a format which depends + * on headers or an illegal combination of parameters is used. + */ +#define AV_LOG_FATAL 8 + +/** + * Something went wrong and cannot losslessly be recovered. + * However, not all future data is affected. + */ +#define AV_LOG_ERROR 16 + +/** + * Something somehow does not look correct. This may or may not + * lead to problems. An example would be the use of '-vstrict -2'. + */ +#define AV_LOG_WARNING 24 + +/** + * Standard information. + */ +#define AV_LOG_INFO 32 + +/** + * Detailed information. + */ +#define AV_LOG_VERBOSE 40 + +/** + * Stuff which is only useful for libav* developers. + */ +#define AV_LOG_DEBUG 48 + +/** + * Extremely verbose debugging, useful for libav* development. + */ +#define AV_LOG_TRACE 56 + +#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET) + +/** + * @} + */ + +/** + * Sets additional colors for extended debugging sessions. + * @code + av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n"); + @endcode + * Requires 256color terminal support. Uses outside debugging is not + * recommended. + */ +#define AV_LOG_C(x) ((x) << 8) + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct or NULL if general log. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + */ +void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4); + + +/** + * Send the specified message to the log if the level is less than or equal + * to the current av_log_level. By default, all logging messages are sent to + * stderr. This behavior can be altered by setting a different logging callback + * function. + * @see av_log_set_callback + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_vlog(void *avcl, int level, const char *fmt, va_list vl); + +/** + * Get the current log level + * + * @see lavu_log_constants + * + * @return Current log level + */ +int av_log_get_level(void); + +/** + * Set the log level + * + * @see lavu_log_constants + * + * @param level Logging level + */ +void av_log_set_level(int level); + +/** + * Set the logging callback + * + * @note The callback must be thread safe, even if the application does not use + * threads itself as some codecs are multithreaded. + * + * @see av_log_default_callback + * + * @param callback A logging function with a compatible signature. + */ +void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); + +/** + * Default logging callback + * + * It prints the message to stderr, optionally colorizing it. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message expressed using a @ref + * lavu_log_constants "Logging Constant". + * @param fmt The format string (printf-compatible) that specifies how + * subsequent arguments are converted to output. + * @param vl The arguments referenced by the format string. + */ +void av_log_default_callback(void *avcl, int level, const char *fmt, + va_list vl); + +/** + * Return the context name + * + * @param ctx The AVClass context + * + * @return The AVClass class_name + */ +const char* av_default_item_name(void* ctx); +AVClassCategory av_default_get_category(void *ptr); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line + * @param line_size size of the buffer + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + */ +void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Format a line of log the same way as the default callback. + * @param line buffer to receive the formatted line; + * may be NULL if line_size is 0 + * @param line_size size of the buffer; at most line_size-1 characters will + * be written to the buffer, plus one null terminator + * @param print_prefix used to store whether the prefix must be printed; + * must point to a persistent integer initially set to 1 + * @return Returns a negative value if an error occurred, otherwise returns + * the number of characters that would have been written for a + * sufficiently large buffer, not including the terminating null + * character. If the return value is not less than line_size, it means + * that the log message was truncated to fit the buffer. + */ +int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, + char *line, int line_size, int *print_prefix); + +/** + * Skip repeated messages, this requires the user app to use av_log() instead of + * (f)printf as the 2 would otherwise interfere and lead to + * "Last message repeated x times" messages below (f)printf messages with some + * bad luck. + * Also to receive the last, "last repeated" line if any, the user app must + * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end + */ +#define AV_LOG_SKIP_REPEATED 1 + +/** + * Include the log severity in messages originating from codecs. + * + * Results in messages such as: + * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts + */ +#define AV_LOG_PRINT_LEVEL 2 + +void av_log_set_flags(int arg); +int av_log_get_flags(void); + +/** + * @} + */ + +#endif /* AVUTIL_LOG_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lzo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lzo.h new file mode 100644 index 0000000..c034039 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/lzo.h @@ -0,0 +1,66 @@ +/* + * LZO 1x decompression + * copyright (c) 2006 Reimar Doeffinger + * + * 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 + */ + +#ifndef AVUTIL_LZO_H +#define AVUTIL_LZO_H + +/** + * @defgroup lavu_lzo LZO + * @ingroup lavu_crypto + * + * @{ + */ + +#include + +/** @name Error flags returned by av_lzo1x_decode + * @{ */ +/// end of the input buffer reached before decoding finished +#define AV_LZO_INPUT_DEPLETED 1 +/// decoded data did not fit into output buffer +#define AV_LZO_OUTPUT_FULL 2 +/// a reference to previously decoded data was wrong +#define AV_LZO_INVALID_BACKPTR 4 +/// a non-specific error in the compressed bitstream +#define AV_LZO_ERROR 8 +/** @} */ + +#define AV_LZO_INPUT_PADDING 8 +#define AV_LZO_OUTPUT_PADDING 12 + +/** + * @brief Decodes LZO 1x compressed data. + * @param out output buffer + * @param outlen size of output buffer, number of bytes left are returned here + * @param in input buffer + * @param inlen size of input buffer, number of bytes left are returned here + * @return 0 on success, otherwise a combination of the error flags above + * + * Make sure all buffers are appropriately padded, in must provide + * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes. + */ +int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen); + +/** + * @} + */ + +#endif /* AVUTIL_LZO_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/macros.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/macros.h new file mode 100644 index 0000000..2007ee5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/macros.h @@ -0,0 +1,50 @@ +/* + * 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 + * @ingroup lavu + * Utility Preprocessor macros + */ + +#ifndef AVUTIL_MACROS_H +#define AVUTIL_MACROS_H + +/** + * @addtogroup preproc_misc Preprocessor String Macros + * + * String manipulation macros + * + * @{ + */ + +#define AV_STRINGIFY(s) AV_TOSTRING(s) +#define AV_TOSTRING(s) #s + +#define AV_GLUE(a, b) a ## b +#define AV_JOIN(a, b) AV_GLUE(a, b) + +/** + * @} + */ + +#define AV_PRAGMA(s) _Pragma(#s) + +#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +#endif /* AVUTIL_MACROS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mastering_display_metadata.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mastering_display_metadata.h new file mode 100644 index 0000000..c23b07c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mastering_display_metadata.h @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2016 Neil Birkbeck + * + * 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 + */ + +#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H +#define AVUTIL_MASTERING_DISPLAY_METADATA_H + +#include "frame.h" +#include "rational.h" + + +/** + * Mastering display metadata capable of representing the color volume of + * the display used to master the content (SMPTE 2086:2014). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_mastering_display_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVMasteringDisplayMetadata { + /** + * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). + */ + AVRational display_primaries[3][2]; + + /** + * CIE 1931 xy chromaticity coords of white point. + */ + AVRational white_point[2]; + + /** + * Min luminance of mastering display (cd/m^2). + */ + AVRational min_luminance; + + /** + * Max luminance of mastering display (cd/m^2). + */ + AVRational max_luminance; + + /** + * Flag indicating whether the display primaries (and white point) are set. + */ + int has_primaries; + + /** + * Flag indicating whether the luminance (min_ and max_) have been set. + */ + int has_luminance; + +} AVMasteringDisplayMetadata; + +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); + +/** + * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVMasteringDisplayMetadata structure to be filled by caller. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); + +/** + * Content light level needed by to transmit HDR over HDMI (CTA-861.3). + * + * To be used as payload of a AVFrameSideData or AVPacketSideData with the + * appropriate type. + * + * @note The struct should be allocated with av_content_light_metadata_alloc() + * and its size is not a part of the public ABI. + */ +typedef struct AVContentLightMetadata { + /** + * Max content light level (cd/m^2). + */ + unsigned MaxCLL; + + /** + * Max average light level per frame (cd/m^2). + */ + unsigned MaxFALL; +} AVContentLightMetadata; + +/** + * Allocate an AVContentLightMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVContentLightMetadata filled with default values or NULL + * on failure. + */ +AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size); + +/** + * Allocate a complete AVContentLightMetadata and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVContentLightMetadata structure to be filled by caller. + */ +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame); + +#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mathematics.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mathematics.h new file mode 100644 index 0000000..5490180 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mathematics.h @@ -0,0 +1,242 @@ +/* + * copyright (c) 2005-2012 Michael Niedermayer + * + * 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 + * @addtogroup lavu_math + * Mathematical utilities for working with timestamp and time base. + */ + +#ifndef AVUTIL_MATHEMATICS_H +#define AVUTIL_MATHEMATICS_H + +#include +#include +#include "attributes.h" +#include "rational.h" +#include "intfloat.h" + +#ifndef M_E +#define M_E 2.7182818284590452354 /* e */ +#endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 /* log_e 2 */ +#endif +#ifndef M_LN10 +#define M_LN10 2.30258509299404568402 /* log_e 10 */ +#endif +#ifndef M_LOG2_10 +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ +#endif +#ifndef M_PHI +#define M_PHI 1.61803398874989484820 /* phi / golden ratio */ +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 /* pi */ +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#ifndef NAN +#define NAN av_int2float(0x7fc00000) +#endif +#ifndef INFINITY +#define INFINITY av_int2float(0x7f800000) +#endif + +/** + * @addtogroup lavu_math + * + * @{ + */ + +/** + * Rounding methods. + */ +enum AVRounding { + AV_ROUND_ZERO = 0, ///< Round toward zero. + AV_ROUND_INF = 1, ///< Round away from zero. + AV_ROUND_DOWN = 2, ///< Round toward -infinity. + AV_ROUND_UP = 3, ///< Round toward +infinity. + AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero. + /** + * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through + * unchanged, avoiding special cases for #AV_NOPTS_VALUE. + * + * Unlike other values of the enumeration AVRounding, this value is a + * bitmask that must be used in conjunction with another value of the + * enumeration through a bitwise OR, in order to set behavior for normal + * cases. + * + * @code{.c} + * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling 3: + * // Calculating 3 * 1 / 2 + * // 3 / 2 is rounded up to 2 + * // => 2 + * + * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX); + * // Rescaling AV_NOPTS_VALUE: + * // AV_NOPTS_VALUE == INT64_MIN + * // AV_NOPTS_VALUE is passed through + * // => AV_NOPTS_VALUE + * @endcode + */ + AV_ROUND_PASS_MINMAX = 8192, +}; + +/** + * Compute the greatest common divisor of two integer operands. + * + * @param a,b Operands + * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0; + * if a == 0 and b == 0, returns 0. + */ +int64_t av_const av_gcd(int64_t a, int64_t b); + +/** + * Rescale a 64-bit integer with rounding to nearest. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow. + * + * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const; + +/** + * Rescale a 64-bit integer with specified rounding. + * + * The operation is mathematically equivalent to `a * b / c`, but writing that + * directly can overflow, and does not support different rounding methods. + * + * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd() + */ +int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd() + */ +int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const; + +/** + * Rescale a 64-bit integer by 2 rational numbers with specified rounding. + * + * The operation is mathematically equivalent to `a * bq / cq`. + * + * @see av_rescale(), av_rescale_rnd(), av_rescale_q() + */ +int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, + enum AVRounding rnd) av_const; + +/** + * Compare two timestamps each in its own time base. + * + * @return One of the following values: + * - -1 if `ts_a` is before `ts_b` + * - 1 if `ts_a` is after `ts_b` + * - 0 if they represent the same position + * + * @warning + * The result of the function is undefined if one of the timestamps is outside + * the `int64_t` range when represented in the other's timebase. + */ +int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b); + +/** + * Compare the remainders of two integer operands divided by a common divisor. + * + * In other words, compare the least significant `log2(mod)` bits of integers + * `a` and `b`. + * + * @code{.c} + * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10 (0x1) < 0x02 % 0x10 (0x2) + * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02) + * @endcode + * + * @param a,b Operands + * @param mod Divisor; must be a power of 2 + * @return + * - a negative value if `a % mod < b % mod` + * - a positive value if `a % mod > b % mod` + * - zero if `a % mod == b % mod` + */ +int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod); + +/** + * Rescale a timestamp while preserving known durations. + * + * This function is designed to be called per audio packet to scale the input + * timestamp to a different time base. Compared to a simple av_rescale_q() + * call, this function is robust against possible inconsistent frame durations. + * + * The `last` parameter is a state variable that must be preserved for all + * subsequent calls for the same stream. For the first call, `*last` should be + * initialized to #AV_NOPTS_VALUE. + * + * @param[in] in_tb Input time base + * @param[in] in_ts Input timestamp + * @param[in] fs_tb Duration time base; typically this is finer-grained + * (greater) than `in_tb` and `out_tb` + * @param[in] duration Duration till the next call to this function (i.e. + * duration of the current packet/frame) + * @param[in,out] last Pointer to a timestamp expressed in terms of + * `fs_tb`, acting as a state variable + * @param[in] out_tb Output timebase + * @return Timestamp expressed in terms of `out_tb` + * + * @note In the context of this function, "duration" is in term of samples, not + * seconds. + */ +int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb); + +/** + * Add a value to a timestamp. + * + * This function guarantees that when the same value is repeatly added that + * no accumulation of rounding errors occurs. + * + * @param[in] ts Input timestamp + * @param[in] ts_tb Input timestamp time base + * @param[in] inc Value to be added + * @param[in] inc_tb Time base of `inc` + */ +int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc); + + +/** + * @} + */ + +#endif /* AVUTIL_MATHEMATICS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/md5.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/md5.h new file mode 100644 index 0000000..ca72ccb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/md5.h @@ -0,0 +1,98 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_md5 + * Public header for MD5 hash function implementation. + */ + +#ifndef AVUTIL_MD5_H +#define AVUTIL_MD5_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_md5 MD5 + * @ingroup lavu_hash + * MD5 hash function implementation. + * + * @{ + */ + +extern const int av_md5_size; + +struct AVMD5; + +/** + * Allocate an AVMD5 context. + */ +struct AVMD5 *av_md5_alloc(void); + +/** + * Initialize MD5 hashing. + * + * @param ctx pointer to the function context (of size av_md5_size) + */ +void av_md5_init(struct AVMD5 *ctx); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param src input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, int len); +#else +void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param ctx hash function context + * @param dst buffer where output digest value is stored + */ +void av_md5_final(struct AVMD5 *ctx, uint8_t *dst); + +/** + * Hash an array of data. + * + * @param dst The output buffer to write the digest into + * @param src The data to hash + * @param len The length of the data, in bytes + */ +#if FF_API_CRYPTO_SIZE_T +void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len); +#else +void av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len); +#endif + +/** + * @} + */ + +#endif /* AVUTIL_MD5_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mem.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mem.h new file mode 100644 index 0000000..5fb1a02 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/mem.h @@ -0,0 +1,700 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * @ingroup lavu_mem + * Memory handling functions + */ + +#ifndef AVUTIL_MEM_H +#define AVUTIL_MEM_H + +#include +#include + +#include "attributes.h" +#include "error.h" +#include "avutil.h" + +/** + * @addtogroup lavu_mem + * Utilities for manipulating memory. + * + * FFmpeg has several applications of memory that are not required of a typical + * program. For example, the computing-heavy components like video decoding and + * encoding can be sped up significantly through the use of aligned memory. + * + * However, for each of FFmpeg's applications of memory, there might not be a + * recognized or standardized API for that specific use. Memory alignment, for + * instance, varies wildly depending on operating systems, architectures, and + * compilers. Hence, this component of @ref libavutil is created to make + * dealing with memory consistently possible on all platforms. + * + * @{ + * + * @defgroup lavu_mem_macros Alignment Macros + * Helper macros for declaring aligned variables. + * @{ + */ + +/** + * @def DECLARE_ALIGNED(n,t,v) + * Declare a variable that is aligned in memory. + * + * @code{.c} + * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42; + * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128]; + * + * // The default-alignment equivalent would be + * uint16_t aligned_int = 42; + * uint8_t aligned_array[128]; + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_ALIGNED(n,t,v) + * Declare an aligned variable appropriate for use in inline assembly code. + * + * @code{.c} + * DECLARE_ASM_ALIGNED(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +/** + * @def DECLARE_ASM_CONST(n,t,v) + * Declare a static constant aligned variable appropriate for use in inline + * assembly code. + * + * @code{.c} + * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008); + * @endcode + * + * @param n Minimum alignment in bytes + * @param t Type of the variable (or array element) + * @param v Name of the variable + */ + +#if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v +#elif defined(__DJGPP__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v +#elif defined(__GNUC__) || defined(__clang__) + #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v + #define DECLARE_ASM_ALIGNED(n,t,v) t av_used __attribute__ ((aligned (n))) v + #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v +#elif defined(_MSC_VER) + #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_ALIGNED(n,t,v) __declspec(align(n)) t v + #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v +#else + #define DECLARE_ALIGNED(n,t,v) t v + #define DECLARE_ASM_ALIGNED(n,t,v) t v + #define DECLARE_ASM_CONST(n,t,v) static const t v +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_attrs Function Attributes + * Function attributes applicable to memory handling functions. + * + * These function attributes can help compilers emit more useful warnings, or + * generate better code. + * @{ + */ + +/** + * @def av_malloc_attrib + * Function attribute denoting a malloc-like function. + * + * @see Function attribute `malloc` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(3,1) + #define av_malloc_attrib __attribute__((__malloc__)) +#else + #define av_malloc_attrib +#endif + +/** + * @def av_alloc_size(...) + * Function attribute used on a function that allocates memory, whose size is + * given by the specified parameter(s). + * + * @code{.c} + * void *av_malloc(size_t size) av_alloc_size(1); + * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2); + * @endcode + * + * @param ... One or two parameter indexes, separated by a comma + * + * @see Function attribute `alloc_size` in GCC's documentation + */ + +#if AV_GCC_VERSION_AT_LEAST(4,3) + #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) +#else + #define av_alloc_size(...) +#endif + +/** + * @} + */ + +/** + * @defgroup lavu_mem_funcs Heap Management + * Functions responsible for allocating, freeing, and copying memory. + * + * All memory allocation functions have a built-in upper limit of `INT_MAX` + * bytes. This may be changed with av_max_alloc(), although exercise extreme + * caution when doing so. + * + * @{ + */ + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU). + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_mallocz() + */ +void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block with alignment suitable for all memory accesses + * (including vectors if available on the CPU) and zero all the bytes of the + * block. + * + * @param size Size in bytes for the memory block to be allocated + * @return Pointer to the allocated block, or `NULL` if it cannot be allocated + * @see av_malloc() + */ +void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); + +/** + * Allocate a memory block for an array with av_malloc(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of element + * @param size Size of a single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * @see av_malloc() + */ +av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size); + +/** + * Allocate a memory block for an array with av_mallocz(). + * + * The allocated memory will have size `size * nmemb` bytes. + * + * @param nmemb Number of elements + * @param size Size of the single element + * @return Pointer to the allocated block, or `NULL` if the block cannot + * be allocated + * + * @see av_mallocz() + * @see av_malloc_array() + */ +av_alloc_size(1, 2) void *av_mallocz_array(size_t nmemb, size_t size); + +/** + * Non-inlined equivalent of av_mallocz_array(). + * + * Created for symmetry with the calloc() C function. + */ +void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; + +/** + * Allocate, reallocate, or free a block of memory. + * + * If `ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param size Size in bytes of the memory block to be allocated or + * reallocated + * + * @return Pointer to a newly-reallocated block or `NULL` if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be + * correctly aligned. + * @see av_fast_realloc() + * @see av_reallocp() + */ +void *av_realloc(void *ptr, size_t size) av_alloc_size(2); + +/** + * Allocate, reallocate, or free a block of memory through a pointer to a + * pointer. + * + * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is + * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or + * shrink that block of memory according to `size`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already allocated + * with av_realloc(), or a pointer to `NULL`. The pointer + * is updated on success, or freed on failure. + * @param[in] size Size in bytes for the memory block to be allocated or + * reallocated + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +av_warn_unused_result +int av_reallocp(void *ptr, size_t size); + +/** + * Allocate, reallocate, or free a block of memory. + * + * This function does the same thing as av_realloc(), except: + * - It takes two size arguments and allocates `nelem * elsize` bytes, + * after checking the result of the multiplication for integer overflow. + * - It frees the input block in case of failure, thus avoiding the memory + * leak with the classic + * @code{.c} + * buf = realloc(buf); + * if (!buf) + * return -1; + * @endcode + * pattern. + */ +void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); + +/** + * Allocate, reallocate, or free an array. + * + * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block. If + * `nmemb` is zero, free the memory block pointed to by `ptr`. + * + * @param ptr Pointer to a memory block already allocated with + * av_realloc() or `NULL` + * @param nmemb Number of elements in the array + * @param size Size of the single element of the array + * + * @return Pointer to a newly-reallocated block or NULL if the block + * cannot be reallocated or the function is used to free the memory block + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + * @see av_reallocp_array() + */ +av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); + +/** + * Allocate, reallocate, or free an array through a pointer to a pointer. + * + * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block. If `nmemb` is + * zero, free the memory block pointed to by `*ptr`. + * + * @param[in,out] ptr Pointer to a pointer to a memory block already + * allocated with av_realloc(), or a pointer to `NULL`. + * The pointer is updated on success, or freed on failure. + * @param[in] nmemb Number of elements + * @param[in] size Size of the single element + * + * @return Zero on success, an AVERROR error code on failure + * + * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be + * correctly aligned. + */ +int av_reallocp_array(void *ptr, size_t nmemb, size_t size); + +/** + * Reallocate the given buffer if it is not large enough, otherwise do nothing. + * + * If the given buffer is `NULL`, then a new uninitialized buffer is allocated. + * + * If the given buffer is not large enough, and reallocation fails, `NULL` is + * returned and `*size` is set to 0, but the original buffer is not changed or + * freed. + * + * A typical use pattern follows: + * + * @code{.c} + * uint8_t *buf = ...; + * uint8_t *new_buf = av_fast_realloc(buf, ¤t_size, size_needed); + * if (!new_buf) { + * // Allocation failed; clean up original buffer + * av_freep(&buf); + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Already allocated buffer, or `NULL` + * @param[in,out] size Pointer to the size of buffer `ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `ptr` + * @return `ptr` if the buffer is large enough, a pointer to newly reallocated + * buffer if the buffer was not large enough, or `NULL` in case of + * error + * @see av_realloc() + * @see av_fast_malloc() + */ +void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate a buffer, reusing the given one if large enough. + * + * Contrary to av_fast_realloc(), the current buffer contents might not be + * preserved and on error the old buffer is freed, thus no special handling to + * avoid memleaks is necessary. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @code{.c} + * uint8_t *buf = ...; + * av_fast_malloc(&buf, ¤t_size, size_needed); + * if (!buf) { + * // Allocation failed; buf already freed + * return AVERROR(ENOMEM); + * } + * @endcode + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_realloc() + * @see av_fast_mallocz() + */ +void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); + +/** + * Allocate and clear a buffer, reusing the given one if large enough. + * + * Like av_fast_malloc(), but all newly allocated space is initially cleared. + * Reused buffer is not cleared. + * + * `*ptr` is allowed to be `NULL`, in which case allocation always happens if + * `size_needed` is greater than 0. + * + * @param[in,out] ptr Pointer to pointer to an already allocated buffer. + * `*ptr` will be overwritten with pointer to new + * buffer on success or `NULL` on failure + * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is + * updated to the new allocated size, in particular 0 + * in case of failure. + * @param[in] min_size Desired minimal size of buffer `*ptr` + * @see av_fast_malloc() + */ +void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family. + * + * @param ptr Pointer to the memory block which should be freed. + * + * @note `ptr = NULL` is explicitly allowed. + * @note It is recommended that you use av_freep() instead, to prevent leaving + * behind dangling pointers. + * @see av_freep() + */ +void av_free(void *ptr); + +/** + * Free a memory block which has been allocated with a function of av_malloc() + * or av_realloc() family, and set the pointer pointing to it to `NULL`. + * + * @code{.c} + * uint8_t *buf = av_malloc(16); + * av_free(buf); + * // buf now contains a dangling pointer to freed memory, and accidental + * // dereference of buf will result in a use-after-free, which may be a + * // security risk. + * + * uint8_t *buf = av_malloc(16); + * av_freep(&buf); + * // buf is now NULL, and accidental dereference will only result in a + * // NULL-pointer dereference. + * @endcode + * + * @param ptr Pointer to the pointer to the memory block which should be freed + * @note `*ptr = NULL` is safe and leads to no action. + * @see av_free() + */ +void av_freep(void *ptr); + +/** + * Duplicate a string. + * + * @param s String to be duplicated + * @return Pointer to a newly-allocated string containing a + * copy of `s` or `NULL` if the string cannot be allocated + * @see av_strndup() + */ +char *av_strdup(const char *s) av_malloc_attrib; + +/** + * Duplicate a substring of a string. + * + * @param s String to be duplicated + * @param len Maximum length of the resulting string (not counting the + * terminating byte) + * @return Pointer to a newly-allocated string containing a + * substring of `s` or `NULL` if the string cannot be allocated + */ +char *av_strndup(const char *s, size_t len) av_malloc_attrib; + +/** + * Duplicate a buffer with av_malloc(). + * + * @param p Buffer to be duplicated + * @param size Size in bytes of the buffer copied + * @return Pointer to a newly allocated buffer containing a + * copy of `p` or `NULL` if the buffer cannot be allocated + */ +void *av_memdup(const void *p, size_t size); + +/** + * Overlapping memcpy() implementation. + * + * @param dst Destination buffer + * @param back Number of bytes back to start copying (i.e. the initial size of + * the overlapping window); must be > 0 + * @param cnt Number of bytes to copy; must be >= 0 + * + * @note `cnt > back` is valid, this will copy the bytes we just copied, + * thus creating a repeating pattern with a period length of `back`. + */ +void av_memcpy_backptr(uint8_t *dst, int back, int cnt); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_dynarray Dynamic Array + * + * Utilities to make an array grow when needed. + * + * Sometimes, the programmer would want to have an array that can grow when + * needed. The libavutil dynamic array utilities fill that need. + * + * libavutil supports two systems of appending elements onto a dynamically + * allocated array, the first one storing the pointer to the value in the + * array, and the second storing the value directly. In both systems, the + * caller is responsible for maintaining a variable containing the length of + * the array, as well as freeing of the array after use. + * + * The first system stores pointers to values in a block of dynamically + * allocated memory. Since only pointers are stored, the function does not need + * to know the size of the type. Both av_dynarray_add() and + * av_dynarray_add_nofree() implement this system. + * + * @code + * type **array = NULL; //< an array of pointers to values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * av_dynarray_add(&array, &nb, &to_be_added); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * av_dynarray_add(&array, &nb, &to_be_added2); + * if (nb == 0) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // &to_be_added == array[0] + * // &to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * The second system stores the value directly in a block of memory. As a + * result, the function has to know the size of the type. av_dynarray2_add() + * implements this mechanism. + * + * @code + * type *array = NULL; //< an array of values + * int nb = 0; //< a variable to keep track of the length of the array + * + * type to_be_added = ...; + * type to_be_added2 = ...; + * + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL); + * if (!addr) + * return AVERROR(ENOMEM); + * memcpy(addr, &to_be_added, sizeof(to_be_added)); + * + * // Shortcut of the above. + * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), + * (const void *)&to_be_added2); + * if (!addr) + * return AVERROR(ENOMEM); + * + * // Now: + * // nb == 2 + * // to_be_added == array[0] + * // to_be_added2 == array[1] + * + * av_freep(&array); + * @endcode + * + * @{ + */ + +/** + * Add the pointer to an element to a dynamic array. + * + * The array to grow is supposed to be an array of pointers to + * structures, and the element to add must be a pointer to an already + * allocated structure. + * + * The array is reallocated when its size reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem Element to add + * @see av_dynarray_add_nofree(), av_dynarray2_add() + */ +void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element to a dynamic array. + * + * Function has the same functionality as av_dynarray_add(), + * but it doesn't free memory on fails. It returns error code + * instead and leave current buffer untouched. + * + * @return >=0 on success, negative otherwise + * @see av_dynarray_add(), av_dynarray2_add() + */ +av_warn_unused_result +int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); + +/** + * Add an element of size `elem_size` to a dynamic array. + * + * The array is reallocated when its number of elements reaches powers of 2. + * Therefore, the amortized cost of adding an element is constant. + * + * In case of success, the pointer to the array is updated in order to + * point to the new grown array, and the number pointed to by `nb_ptr` + * is incremented. + * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and + * `*nb_ptr` is set to 0. + * + * @param[in,out] tab_ptr Pointer to the array to grow + * @param[in,out] nb_ptr Pointer to the number of elements in the array + * @param[in] elem_size Size in bytes of an element in the array + * @param[in] elem_data Pointer to the data of the element to add. If + * `NULL`, the space of the newly added element is + * allocated but left uninitialized. + * + * @return Pointer to the data of the element to copy in the newly allocated + * space + * @see av_dynarray_add(), av_dynarray_add_nofree() + */ +void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, + const uint8_t *elem_data); + +/** + * @} + */ + +/** + * @defgroup lavu_mem_misc Miscellaneous Functions + * + * Other functions related to memory allocation. + * + * @{ + */ + +/** + * Multiply two `size_t` values checking for overflow. + * + * @param[in] a,b Operands of multiplication + * @param[out] r Pointer to the result of the operation + * @return 0 on success, AVERROR(EINVAL) on overflow + */ +static inline int av_size_mult(size_t a, size_t b, size_t *r) +{ + size_t t = a * b; + /* Hack inspired from glibc: don't try the division if nelem and elsize + * are both less than sqrt(SIZE_MAX). */ + if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) + return AVERROR(EINVAL); + *r = t; + return 0; +} + +/** + * Set the maximum size that may be allocated in one block. + * + * The value specified with this function is effective for all libavutil's @ref + * lavu_mem_funcs "heap management functions." + * + * By default, the max value is defined as `INT_MAX`. + * + * @param max Value to be set as the new maximum size + * + * @warning Exercise extreme caution when using this function. Don't touch + * this if you do not understand the full consequence of doing so. + */ +void av_max_alloc(size_t max); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_MEM_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/motion_vector.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/motion_vector.h new file mode 100644 index 0000000..ec29556 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/motion_vector.h @@ -0,0 +1,57 @@ +/* + * 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 + */ + +#ifndef AVUTIL_MOTION_VECTOR_H +#define AVUTIL_MOTION_VECTOR_H + +#include + +typedef struct AVMotionVector { + /** + * Where the current macroblock comes from; negative value when it comes + * from the past, positive value when it comes from the future. + * XXX: set exact relative ref frame reference instead of a +/- 1 "direction". + */ + int32_t source; + /** + * Width and height of the block. + */ + uint8_t w, h; + /** + * Absolute source position. Can be outside the frame area. + */ + int16_t src_x, src_y; + /** + * Absolute destination position. Can be outside the frame area. + */ + int16_t dst_x, dst_y; + /** + * Extra flag information. + * Currently unused. + */ + uint64_t flags; + /** + * Motion vector + * src_x = dst_x + motion_x / motion_scale + * src_y = dst_y + motion_y / motion_scale + */ + int32_t motion_x, motion_y; + uint16_t motion_scale; +} AVMotionVector; + +#endif /* AVUTIL_MOTION_VECTOR_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/murmur3.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/murmur3.h new file mode 100644 index 0000000..1b09175 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/murmur3.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2013 Reimar Döffinger + * + * 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 + * @ingroup lavu_murmur3 + * Public header for MurmurHash3 hash function implementation. + */ + +#ifndef AVUTIL_MURMUR3_H +#define AVUTIL_MURMUR3_H + +#include + +#include "version.h" + +/** + * @defgroup lavu_murmur3 Murmur3 + * @ingroup lavu_hash + * MurmurHash3 hash function implementation. + * + * MurmurHash3 is a non-cryptographic hash function, of which three + * incompatible versions were created by its inventor Austin Appleby: + * + * - 32-bit output + * - 128-bit output for 32-bit platforms + * - 128-bit output for 64-bit platforms + * + * FFmpeg only implements the last variant: 128-bit output designed for 64-bit + * platforms. Even though the hash function was designed for 64-bit platforms, + * the function in reality works on 32-bit systems too, only with reduced + * performance. + * + * @anchor lavu_murmur3_seedinfo + * By design, MurmurHash3 requires a seed to operate. In response to this, + * libavutil provides two functions for hash initiation, one that requires a + * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer + * as the seed, and therefore does not (av_murmur3_init()). + * + * To make hashes comparable, you should provide the same seed for all calls to + * this hash function -- if you are supplying one yourself, that is. + * + * @{ + */ + +/** + * Allocate an AVMurMur3 hash context. + * + * @return Uninitialized hash context or `NULL` in case of error + */ +struct AVMurMur3 *av_murmur3_alloc(void); + +/** + * Initialize or reinitialize an AVMurMur3 hash context with a seed. + * + * @param[out] c Hash context + * @param[in] seed Random seed + * + * @see av_murmur3_init() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed); + +/** + * Initialize or reinitialize an AVMurMur3 hash context. + * + * Equivalent to av_murmur3_init_seeded() with a built-in seed. + * + * @param[out] c Hash context + * + * @see av_murmur3_init_seeded() + * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of + * seeds for MurmurHash3. + */ +void av_murmur3_init(struct AVMurMur3 *c); + +/** + * Update hash context with new data. + * + * @param[out] c Hash context + * @param[in] src Input data to update hash with + * @param[in] len Number of bytes to read from `src` + */ +#if FF_API_CRYPTO_SIZE_T +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len); +#else +void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param[in,out] c Hash context + * @param[out] dst Buffer where output digest value is stored + */ +void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]); + +/** + * @} + */ + +#endif /* AVUTIL_MURMUR3_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/opt.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/opt.h new file mode 100644 index 0000000..39f4a8d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/opt.h @@ -0,0 +1,865 @@ +/* + * AVOptions + * copyright (c) 2005 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_OPT_H +#define AVUTIL_OPT_H + +/** + * @file + * AVOptions + */ + +#include "rational.h" +#include "avutil.h" +#include "dict.h" +#include "log.h" +#include "pixfmt.h" +#include "samplefmt.h" +#include "version.h" + +/** + * @defgroup avoptions AVOptions + * @ingroup lavu_data + * @{ + * AVOptions provide a generic system to declare options on arbitrary structs + * ("objects"). An option can have a help text, a type and a range of possible + * values. Options may then be enumerated, read and written to. + * + * @section avoptions_implement Implementing AVOptions + * This section describes how to add AVOptions capabilities to a struct. + * + * All AVOptions-related information is stored in an AVClass. Therefore + * the first member of the struct should be a pointer to an AVClass describing it. + * The option field of the AVClass must be set to a NULL-terminated static array + * of AVOptions. Each AVOption must have a non-empty name, a type, a default + * value and for number-type AVOptions also a range of allowed values. It must + * also declare an offset in bytes from the start of the struct, where the field + * associated with this AVOption is located. Other fields in the AVOption struct + * should also be set when applicable, but are not required. + * + * The following example illustrates an AVOptions-enabled struct: + * @code + * typedef struct test_struct { + * const AVClass *class; + * int int_opt; + * char *str_opt; + * uint8_t *bin_opt; + * int bin_len; + * } test_struct; + * + * static const AVOption test_options[] = { + * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt), + * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX }, + * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt), + * AV_OPT_TYPE_STRING }, + * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt), + * AV_OPT_TYPE_BINARY }, + * { NULL }, + * }; + * + * static const AVClass test_class = { + * .class_name = "test class", + * .item_name = av_default_item_name, + * .option = test_options, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * @endcode + * + * Next, when allocating your struct, you must ensure that the AVClass pointer + * is set to the correct value. Then, av_opt_set_defaults() can be called to + * initialize defaults. After that the struct is ready to be used with the + * AVOptions API. + * + * When cleaning up, you may use the av_opt_free() function to automatically + * free all the allocated string and binary options. + * + * Continuing with the above example: + * + * @code + * test_struct *alloc_test_struct(void) + * { + * test_struct *ret = av_mallocz(sizeof(*ret)); + * ret->class = &test_class; + * av_opt_set_defaults(ret); + * return ret; + * } + * void free_test_struct(test_struct **foo) + * { + * av_opt_free(*foo); + * av_freep(foo); + * } + * @endcode + * + * @subsection avoptions_implement_nesting Nesting + * It may happen that an AVOptions-enabled struct contains another + * AVOptions-enabled struct as a member (e.g. AVCodecContext in + * libavcodec exports generic options, while its priv_data field exports + * codec-specific options). In such a case, it is possible to set up the + * parent struct to export a child's options. To do that, simply + * implement AVClass.child_next() and AVClass.child_class_next() in the + * parent struct's AVClass. + * Assuming that the test_struct from above now also contains a + * child_struct field: + * + * @code + * typedef struct child_struct { + * AVClass *class; + * int flags_opt; + * } child_struct; + * static const AVOption child_opts[] = { + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX }, + * { NULL }, + * }; + * static const AVClass child_class = { + * .class_name = "child class", + * .item_name = av_default_item_name, + * .option = child_opts, + * .version = LIBAVUTIL_VERSION_INT, + * }; + * + * void *child_next(void *obj, void *prev) + * { + * test_struct *t = obj; + * if (!prev && t->child_struct) + * return t->child_struct; + * return NULL + * } + * const AVClass child_class_next(const AVClass *prev) + * { + * return prev ? NULL : &child_class; + * } + * @endcode + * Putting child_next() and child_class_next() as defined above into + * test_class will now make child_struct's options accessible through + * test_struct (again, proper setup as described above needs to be done on + * child_struct right after it is created). + * + * From the above example it might not be clear why both child_next() + * and child_class_next() are needed. The distinction is that child_next() + * iterates over actually existing objects, while child_class_next() + * iterates over all possible child classes. E.g. if an AVCodecContext + * was initialized to use a codec which has private options, then its + * child_next() will return AVCodecContext.priv_data and finish + * iterating. OTOH child_class_next() on AVCodecContext.av_class will + * iterate over all available codecs with private options. + * + * @subsection avoptions_implement_named_constants Named constants + * It is possible to create named constants for options. Simply set the unit + * field of the option the constants should apply to a string and + * create the constants themselves as options of type AV_OPT_TYPE_CONST + * with their unit field set to the same string. + * Their default_val field should contain the value of the named + * constant. + * For example, to add some named constants for the test_flags option + * above, put the following into the child_opts array: + * @code + * { "test_flags", "This is a test option of flags type.", + * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" }, + * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" }, + * @endcode + * + * @section avoptions_use Using AVOptions + * This section deals with accessing options in an AVOptions-enabled struct. + * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or + * AVFormatContext in libavformat. + * + * @subsection avoptions_use_examine Examining AVOptions + * The basic functions for examining options are av_opt_next(), which iterates + * over all options defined for one object, and av_opt_find(), which searches + * for an option with the given name. + * + * The situation is more complicated with nesting. An AVOptions-enabled struct + * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag + * to av_opt_find() will make the function search children recursively. + * + * For enumerating there are basically two cases. The first is when you want to + * get all options that may potentially exist on the struct and its children + * (e.g. when constructing documentation). In that case you should call + * av_opt_child_class_next() recursively on the parent struct's AVClass. The + * second case is when you have an already initialized struct with all its + * children and you want to get all options that can be actually written or read + * from it. In that case you should call av_opt_child_next() recursively (and + * av_opt_next() on each result). + * + * @subsection avoptions_use_get_set Reading and writing AVOptions + * When setting options, you often have a string read directly from the + * user. In such a case, simply passing it to av_opt_set() is enough. For + * non-string type options, av_opt_set() will parse the string according to the + * option type. + * + * Similarly av_opt_get() will read any option type and convert it to a string + * which will be returned. Do not forget that the string is allocated, so you + * have to free it with av_free(). + * + * In some cases it may be more convenient to put all options into an + * AVDictionary and call av_opt_set_dict() on it. A specific case of this + * are the format/codec open functions in lavf/lavc which take a dictionary + * filled with option as a parameter. This makes it possible to set some options + * that cannot be set otherwise, since e.g. the input file format is not known + * before the file is actually opened. + */ + +enum AVOptionType{ + AV_OPT_TYPE_FLAGS, + AV_OPT_TYPE_INT, + AV_OPT_TYPE_INT64, + AV_OPT_TYPE_DOUBLE, + AV_OPT_TYPE_FLOAT, + AV_OPT_TYPE_STRING, + AV_OPT_TYPE_RATIONAL, + AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length + AV_OPT_TYPE_DICT, + AV_OPT_TYPE_UINT64, + AV_OPT_TYPE_CONST, + AV_OPT_TYPE_IMAGE_SIZE, ///< offset must point to two consecutive integers + AV_OPT_TYPE_PIXEL_FMT, + AV_OPT_TYPE_SAMPLE_FMT, + AV_OPT_TYPE_VIDEO_RATE, ///< offset must point to AVRational + AV_OPT_TYPE_DURATION, + AV_OPT_TYPE_COLOR, + AV_OPT_TYPE_CHANNEL_LAYOUT, + AV_OPT_TYPE_BOOL, +}; + +/** + * AVOption + */ +typedef struct AVOption { + const char *name; + + /** + * short English help text + * @todo What about other languages? + */ + const char *help; + + /** + * The offset relative to the context structure where the option + * value is stored. It should be 0 for named constants. + */ + int offset; + enum AVOptionType type; + + /** + * the default value for scalar options + */ + union { + int64_t i64; + double dbl; + const char *str; + /* TODO those are unused now */ + AVRational q; + } default_val; + double min; ///< minimum valid value for the option + double max; ///< maximum valid value for the option + + int flags; +#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding +#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding +#define AV_OPT_FLAG_AUDIO_PARAM 8 +#define AV_OPT_FLAG_VIDEO_PARAM 16 +#define AV_OPT_FLAG_SUBTITLE_PARAM 32 +/** + * The option is intended for exporting values to the caller. + */ +#define AV_OPT_FLAG_EXPORT 64 +/** + * The option may not be set through the AVOptions API, only read. + * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. + */ +#define AV_OPT_FLAG_READONLY 128 +#define AV_OPT_FLAG_BSF_PARAM (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering +#define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering +#define AV_OPT_FLAG_DEPRECATED (1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information +//FIXME think about enc-audio, ... style flags + + /** + * The logical unit to which the option belongs. Non-constant + * options and corresponding named constants share the same + * unit. May be NULL. + */ + const char *unit; +} AVOption; + +/** + * A single allowed range of values, or a single allowed value. + */ +typedef struct AVOptionRange { + const char *str; + /** + * Value range. + * For string ranges this represents the min/max length. + * For dimensions this represents the min/max pixel count or width/height in multi-component case. + */ + double value_min, value_max; + /** + * Value's component range. + * For string this represents the unicode range for chars, 0-127 limits to ASCII. + */ + double component_min, component_max; + /** + * Range flag. + * If set to 1 the struct encodes a range, if set to 0 a single value. + */ + int is_range; +} AVOptionRange; + +/** + * List of AVOptionRange structs. + */ +typedef struct AVOptionRanges { + /** + * Array of option ranges. + * + * Most of option types use just one component. + * Following describes multi-component option types: + * + * AV_OPT_TYPE_IMAGE_SIZE: + * component index 0: range of pixel count (width * height). + * component index 1: range of width. + * component index 2: range of height. + * + * @note To obtain multi-component version of this structure, user must + * provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or + * av_opt_query_ranges_default function. + * + * Multi-component range can be read as in following example: + * + * @code + * int range_index, component_index; + * AVOptionRanges *ranges; + * AVOptionRange *range[3]; //may require more than 3 in the future. + * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE); + * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) { + * for (component_index = 0; component_index < ranges->nb_components; component_index++) + * range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index]; + * //do something with range here. + * } + * av_opt_freep_ranges(&ranges); + * @endcode + */ + AVOptionRange **range; + /** + * Number of ranges per component. + */ + int nb_ranges; + /** + * Number of componentes. + */ + int nb_components; +} AVOptionRanges; + +/** + * Show the obj options. + * + * @param req_flags requested flags for the options to show. Show only the + * options for which it is opt->flags & req_flags. + * @param rej_flags rejected flags for the options to show. Show only the + * options for which it is !(opt->flags & req_flags). + * @param av_log_obj log context to use for showing the options + */ +int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags); + +/** + * Set the values of all AVOption fields to their default values. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + */ +void av_opt_set_defaults(void *s); + +/** + * Set the values of all AVOption fields to their default values. Only these + * AVOption fields for which (opt->flags & mask) == flags will have their + * default applied to s. + * + * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass) + * @param mask combination of AV_OPT_FLAG_* + * @param flags combination of AV_OPT_FLAG_* + */ +void av_opt_set_defaults2(void *s, int mask, int flags); + +/** + * Parse the key/value pairs list in opts. For each key/value pair + * found, stores the value in the field in ctx that is named like the + * key. ctx must be an AVClass context, storing is done using + * AVOptions. + * + * @param opts options string to parse, may be NULL + * @param key_val_sep a 0-terminated list of characters used to + * separate key from value + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other + * @return the number of successfully set key/value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_opt_set() if a key/value pair + * cannot be set + */ +int av_set_options_string(void *ctx, const char *opts, + const char *key_val_sep, const char *pairs_sep); + +/** + * Parse the key-value pairs list in opts. For each key=value pair found, + * set the value of the corresponding option in ctx. + * + * @param ctx the AVClass object to set options on + * @param opts the options string, key-value pairs separated by a + * delimiter + * @param shorthand a NULL-terminated array of options names for shorthand + * notation: if the first field in opts has no key part, + * the key is taken from the first element of shorthand; + * then again for the second, etc., until either opts is + * finished, shorthand is finished or a named option is + * found; after that, all options must be named + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @return the number of successfully set key=value pairs, or a negative + * value corresponding to an AVERROR code in case of error: + * AVERROR(EINVAL) if opts cannot be parsed, + * the error code issued by av_set_string3() if a key/value pair + * cannot be set + * + * Options names must use only the following characters: a-z A-Z 0-9 - . / _ + * Separators must use characters distinct from option names and from each + * other. + */ +int av_opt_set_from_string(void *ctx, const char *opts, + const char *const *shorthand, + const char *key_val_sep, const char *pairs_sep); +/** + * Free all allocated objects in obj. + */ +void av_opt_free(void *obj); + +/** + * Check whether a particular flag is set in a flags field. + * + * @param field_name the name of the flag field option + * @param flag_name the name of the flag to check + * @return non-zero if the flag is set, zero if the flag isn't set, + * isn't of the right type, or the flags field doesn't exist. + */ +int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name); + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict(void *obj, struct AVDictionary **options); + + +/** + * Set all the options from a given dictionary on an object. + * + * @param obj a struct whose first element is a pointer to AVClass + * @param options options to process. This dictionary will be freed and replaced + * by a new one containing all options not found in obj. + * Of course this new dictionary needs to be freed by caller + * with av_dict_free(). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return 0 on success, a negative AVERROR if some option was found in obj, + * but could not be set. + * + * @see av_dict_copy() + */ +int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags); + +/** + * Extract a key-value pair from the beginning of a string. + * + * @param ropts pointer to the options string, will be updated to + * point to the rest of the string (one of the pairs_sep + * or the final NUL) + * @param key_val_sep a 0-terminated list of characters used to separate + * key from value, for example '=' + * @param pairs_sep a 0-terminated list of characters used to separate + * two pairs from each other, for example ':' or ',' + * @param flags flags; see the AV_OPT_FLAG_* values below + * @param rkey parsed key; must be freed using av_free() + * @param rval parsed value; must be freed using av_free() + * + * @return >=0 for success, or a negative value corresponding to an + * AVERROR code in case of error; in particular: + * AVERROR(EINVAL) if no key is present + * + */ +int av_opt_get_key_value(const char **ropts, + const char *key_val_sep, const char *pairs_sep, + unsigned flags, + char **rkey, char **rval); + +enum { + + /** + * Accept to parse a value without a key; the key will then be returned + * as NULL. + */ + AV_OPT_FLAG_IMPLICIT_KEY = 1, +}; + +/** + * @defgroup opt_eval_funcs Evaluating option strings + * @{ + * This group of functions can be used to evaluate option strings + * and get numbers out of them. They do the same thing as av_opt_set(), + * except the result is written into the caller-supplied pointer. + * + * @param obj a struct whose first element is a pointer to AVClass. + * @param o an option for which the string is to be evaluated. + * @param val string to be evaluated. + * @param *_out value of the string will be written here. + * + * @return 0 on success, a negative number on failure. + */ +int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out); +int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out); +int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out); +int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out); +int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out); +int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out); +/** + * @} + */ + +#define AV_OPT_SEARCH_CHILDREN (1 << 0) /**< Search in possible children of the + given object first. */ +/** + * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass + * instead of a required pointer to a struct containing AVClass. This is + * useful for searching for options without needing to allocate the corresponding + * object. + */ +#define AV_OPT_SEARCH_FAKE_OBJ (1 << 1) + +/** + * In av_opt_get, return NULL if the option has a pointer type and is set to NULL, + * rather than returning an empty string. + */ +#define AV_OPT_ALLOW_NULL (1 << 2) + +/** + * Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than + * one component for certain option types. + * @see AVOptionRanges for details. + */ +#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12) + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * + * @return A pointer to the option found, or NULL if no option + * was found. + * + * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable + * directly with av_opt_set(). Use special calls which take an options + * AVDictionary (e.g. avformat_open_input()) to set options found with this + * flag. + */ +const AVOption *av_opt_find(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags); + +/** + * Look for an option in an object. Consider only options which + * have all the specified flags set. + * + * @param[in] obj A pointer to a struct whose first element is a + * pointer to an AVClass. + * Alternatively a double pointer to an AVClass, if + * AV_OPT_SEARCH_FAKE_OBJ search flag is set. + * @param[in] name The name of the option to look for. + * @param[in] unit When searching for named constants, name of the unit + * it belongs to. + * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG). + * @param search_flags A combination of AV_OPT_SEARCH_*. + * @param[out] target_obj if non-NULL, an object to which the option belongs will be + * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present + * in search_flags. This parameter is ignored if search_flags contain + * AV_OPT_SEARCH_FAKE_OBJ. + * + * @return A pointer to the option found, or NULL if no option + * was found. + */ +const AVOption *av_opt_find2(void *obj, const char *name, const char *unit, + int opt_flags, int search_flags, void **target_obj); + +/** + * Iterate over all AVOptions belonging to obj. + * + * @param obj an AVOptions-enabled struct or a double pointer to an + * AVClass describing it. + * @param prev result of the previous call to av_opt_next() on this object + * or NULL + * @return next AVOption or NULL + */ +const AVOption *av_opt_next(const void *obj, const AVOption *prev); + +/** + * Iterate over AVOptions-enabled children of obj. + * + * @param prev result of a previous call to this function or NULL + * @return next AVOptions-enabled child or NULL + */ +void *av_opt_child_next(void *obj, void *prev); + +/** + * Iterate over potential AVOptions-enabled children of parent. + * + * @param prev result of a previous call to this function or NULL + * @return AVClass corresponding to next potential child or NULL + */ +const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev); + +/** + * @defgroup opt_set_funcs Option setting functions + * @{ + * Those functions set the field of obj with the given name to value. + * + * @param[in] obj A struct whose first element is a pointer to an AVClass. + * @param[in] name the name of the field to set + * @param[in] val The value to set. In case of av_opt_set() if the field is not + * of a string type, then the given string is parsed. + * SI postfixes and some named scalars are supported. + * If the field is of a numeric type, it has to be a numeric or named + * scalar. Behavior with more than one scalar and +- infix operators + * is undefined. + * If the field is of a flags type, it has to be a sequence of numeric + * scalars or named flags separated by '+' or '-'. Prefixing a flag + * with '+' causes it to be set without affecting the other flags; + * similarly, '-' unsets a flag. + * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be set on a child of obj. + * + * @return 0 if the value has been set, or an AVERROR code in case of + * error: + * AVERROR_OPTION_NOT_FOUND if no matching option exists + * AVERROR(ERANGE) if the value is out of range + * AVERROR(EINVAL) if the value is not valid + */ +int av_opt_set (void *obj, const char *name, const char *val, int search_flags); +int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); +int av_opt_set_double (void *obj, const char *name, double val, int search_flags); +int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); +int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags); +int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags); +int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags); +int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags); +int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags); +/** + * @note Any old dictionary present is discarded and replaced with a copy of the new one. The + * caller still owns val is and responsible for freeing it. + */ +int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags); + +/** + * Set a binary option to an integer list. + * + * @param obj AVClass object to set options on + * @param name name of the binary option + * @param val pointer to an integer list (must have the correct type with + * regard to the contents of the list) + * @param term list terminator (usually 0 or -1) + * @param flags search flags + */ +#define av_opt_set_int_list(obj, name, val, term, flags) \ + (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \ + AVERROR(EINVAL) : \ + av_opt_set_bin(obj, name, (const uint8_t *)(val), \ + av_int_list_length(val, term) * sizeof(*(val)), flags)) + +/** + * @} + */ + +/** + * @defgroup opt_get_funcs Option getting functions + * @{ + * Those functions get a value of the option with the given name from an object. + * + * @param[in] obj a struct whose first element is a pointer to an AVClass. + * @param[in] name name of the option to get. + * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN + * is passed here, then the option may be found in a child of obj. + * @param[out] out_val value of the option will be written here + * @return >=0 on success, a negative error code otherwise + */ +/** + * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller + * + * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the option has + * AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will be set + * to NULL instead of an allocated empty string. + */ +int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val); +int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val); +int av_opt_get_double (void *obj, const char *name, int search_flags, double *out_val); +int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out); +int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt); +int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt); +int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val); +int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *ch_layout); +/** + * @param[out] out_val The returned dictionary is a copy of the actual value and must + * be freed with av_dict_free() by the caller + */ +int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); +/** + * @} + */ +/** + * Gets a pointer to the requested field in a struct. + * This function allows accessing a struct even when its fields are moved or + * renamed since the application making the access has been compiled, + * + * @returns a pointer to the field, it can be cast to the correct type and read + * or written to. + */ +void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name); + +/** + * Free an AVOptionRanges struct and set it to NULL. + */ +void av_opt_freep_ranges(AVOptionRanges **ranges); + +/** + * Get a list of allowed ranges for the given option. + * + * The returned list may depend on other fields in obj like for example profile. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_freep_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Copy options from src object into dest object. + * + * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object. + * Original memory allocated for such options is freed unless both src and dest options points to the same memory. + * + * @param dest Object to copy from + * @param src Object to copy into + * @return 0 on success, negative on error + */ +int av_opt_copy(void *dest, const void *src); + +/** + * Get a default list of allowed ranges for the given option. + * + * This list is constructed without using the AVClass.query_ranges() callback + * and can be used as fallback from within the callback. + * + * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored + * AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance + * AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges + * + * The result must be freed with av_opt_free_ranges. + * + * @return number of compontents returned on success, a negative errro code otherwise + */ +int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags); + +/** + * Check if given option is set to its default value. + * + * Options o must belong to the obj. This function must not be called to check child's options state. + * @see av_opt_is_set_to_default_by_name(). + * + * @param obj AVClass object to check option on + * @param o option to be checked + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default(void *obj, const AVOption *o); + +/** + * Check if given option is set to its default value. + * + * @param obj AVClass object to check option on + * @param name option name + * @param search_flags combination of AV_OPT_SEARCH_* + * @return >0 when option is set to its default, + * 0 when option is not set its default, + * <0 on error + */ +int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags); + + +#define AV_OPT_SERIALIZE_SKIP_DEFAULTS 0x00000001 ///< Serialize options that are not set to default values only. +#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT 0x00000002 ///< Serialize options that exactly match opt_flags only. + +/** + * Serialize object's options. + * + * Create a string containing object's serialized options. + * Such string may be passed back to av_opt_set_from_string() in order to restore option values. + * A key/value or pairs separator occurring in the serialized value or + * name string are escaped through the av_escape() function. + * + * @param[in] obj AVClass object to serialize + * @param[in] opt_flags serialize options with all the specified flags set (AV_OPT_FLAG) + * @param[in] flags combination of AV_OPT_SERIALIZE_* flags + * @param[out] buffer Pointer to buffer that will be allocated with string containg serialized options. + * Buffer must be freed by the caller when is no longer needed. + * @param[in] key_val_sep character used to separate key from value + * @param[in] pairs_sep character used to separate two pairs from each other + * @return >= 0 on success, negative on error + * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same. + */ +int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, + const char key_val_sep, const char pairs_sep); +/** + * @} + */ + +#endif /* AVUTIL_OPT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/parseutils.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/parseutils.h new file mode 100644 index 0000000..e66d24b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/parseutils.h @@ -0,0 +1,193 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PARSEUTILS_H +#define AVUTIL_PARSEUTILS_H + +#include + +#include "rational.h" + +/** + * @file + * misc parsing utilities + */ + +/** + * Parse str and store the parsed ratio in q. + * + * Note that a ratio with infinite (1/0) or negative value is + * considered valid, so you should check on the returned value if you + * want to exclude those values. + * + * The undefined value can be expressed using the "0:0" string. + * + * @param[in,out] q pointer to the AVRational which will contain the ratio + * @param[in] str the string to parse: it has to be a string in the format + * num:den, a float number or an expression + * @param[in] max the maximum allowed numerator and denominator + * @param[in] log_offset log level offset which is applied to the log + * level of log_ctx + * @param[in] log_ctx parent logging context + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_ratio(AVRational *q, const char *str, int max, + int log_offset, void *log_ctx); + +#define av_parse_ratio_quiet(rate, str, max) \ + av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL) + +/** + * Parse str and put in width_ptr and height_ptr the detected values. + * + * @param[in,out] width_ptr pointer to the variable which will contain the detected + * width value + * @param[in,out] height_ptr pointer to the variable which will contain the detected + * height value + * @param[in] str the string to parse: it has to be a string in the format + * width x height or a valid video size abbreviation. + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str); + +/** + * Parse str and store the detected values in *rate. + * + * @param[in,out] rate pointer to the AVRational which will contain the detected + * frame rate + * @param[in] str the string to parse: it has to be a string in the format + * rate_num / rate_den, a float number or a valid video rate abbreviation + * @return >= 0 on success, a negative error code otherwise + */ +int av_parse_video_rate(AVRational *rate, const char *str); + +/** + * Put the RGBA values that correspond to color_string in rgba_color. + * + * @param color_string a string specifying a color. It can be the name of + * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence, + * possibly followed by "@" and a string representing the alpha + * component. + * The alpha component may be a string composed by "0x" followed by an + * hexadecimal number or a decimal number between 0.0 and 1.0, which + * represents the opacity value (0x00/0.0 means completely transparent, + * 0xff/1.0 completely opaque). + * If the alpha component is not specified then 0xff is assumed. + * The string "random" will result in a random color. + * @param slen length of the initial part of color_string containing the + * color. It can be set to -1 if color_string is a null terminated string + * containing nothing else than the color. + * @return >= 0 in case of success, a negative value in case of + * failure (for example if color_string cannot be parsed). + */ +int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, + void *log_ctx); + +/** + * Get the name of a color from the internal table of hard-coded named + * colors. + * + * This function is meant to enumerate the color names recognized by + * av_parse_color(). + * + * @param color_idx index of the requested color, starting from 0 + * @param rgbp if not NULL, will point to a 3-elements array with the color value in RGB + * @return the color name string or NULL if color_idx is not in the array + */ +const char *av_get_known_color_name(int color_idx, const uint8_t **rgb); + +/** + * Parse timestr and return in *time a corresponding number of + * microseconds. + * + * @param timeval puts here the number of microseconds corresponding + * to the string in timestr. If the string represents a duration, it + * is the number of microseconds contained in the time interval. If + * the string is a date, is the number of microseconds since 1st of + * January, 1970 up to the time of the parsed date. If timestr cannot + * be successfully parsed, set *time to INT64_MIN. + + * @param timestr a string representing a date or a duration. + * - If a date the syntax is: + * @code + * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m...]]]}|{HHMMSS[.m...]]]}}[Z] + * now + * @endcode + * If the value is "now" it takes the current time. + * Time is local time unless Z is appended, in which case it is + * interpreted as UTC. + * If the year-month-day part is not specified it takes the current + * year-month-day. + * - If a duration the syntax is: + * @code + * [-][HH:]MM:SS[.m...] + * [-]S+[.m...] + * @endcode + * @param duration flag which tells how to interpret timestr, if not + * zero timestr is interpreted as a duration, otherwise as a date + * @return >= 0 in case of success, a negative value corresponding to an + * AVERROR code otherwise + */ +int av_parse_time(int64_t *timeval, const char *timestr, int duration); + +/** + * Attempt to find a specific tag in a URL. + * + * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. + * Return 1 if found. + */ +int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); + +/** + * Simplified version of strptime + * + * Parse the input string p according to the format string fmt and + * store its results in the structure dt. + * This implementation supports only a subset of the formats supported + * by the standard strptime(). + * + * The supported input field descriptors are listed below. + * - %H: the hour as a decimal number, using a 24-hour clock, in the + * range '00' through '23' + * - %J: hours as a decimal number, in the range '0' through INT_MAX + * - %M: the minute as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %S: the second as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %Y: the year as a decimal number, using the Gregorian calendar + * - %m: the month as a decimal number, in the range '1' through '12' + * - %d: the day of the month as a decimal number, in the range '1' + * through '31' + * - %T: alias for '%H:%M:%S' + * - %%: a literal '%' + * + * @return a pointer to the first character not processed in this function + * call. In case the input string contains more characters than + * required by the format string the return value points right after + * the last consumed input character. In case the whole input string + * is consumed the return value points to the null byte at the end of + * the string. On failure NULL is returned. + */ +char *av_small_strptime(const char *p, const char *fmt, struct tm *dt); + +/** + * Convert the decomposed UTC time in tm to a time_t value. + */ +time_t av_timegm(struct tm *tm); + +#endif /* AVUTIL_PARSEUTILS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixdesc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixdesc.h new file mode 100644 index 0000000..c055810 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixdesc.h @@ -0,0 +1,440 @@ +/* + * pixel format descriptor + * Copyright (c) 2009 Michael Niedermayer + * + * 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 + */ + +#ifndef AVUTIL_PIXDESC_H +#define AVUTIL_PIXDESC_H + +#include + +#include "attributes.h" +#include "pixfmt.h" +#include "version.h" + +typedef struct AVComponentDescriptor { + /** + * Which of the 4 planes contains the component. + */ + int plane; + + /** + * Number of elements between 2 horizontally consecutive pixels. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int step; + + /** + * Number of elements before the component of the first pixel. + * Elements are bits for bitstream formats, bytes otherwise. + */ + int offset; + + /** + * Number of least significant bits that must be shifted away + * to get the value. + */ + int shift; + + /** + * Number of bits in the component. + */ + int depth; + +#if FF_API_PLUS1_MINUS1 + /** deprecated, use step instead */ + attribute_deprecated int step_minus1; + + /** deprecated, use depth instead */ + attribute_deprecated int depth_minus1; + + /** deprecated, use offset instead */ + attribute_deprecated int offset_plus1; +#endif +} AVComponentDescriptor; + +/** + * Descriptor that unambiguously describes how the bits of a pixel are + * stored in the up to 4 data planes of an image. It also stores the + * subsampling factors and number of components. + * + * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV + * and all the YUV variants) AVPixFmtDescriptor just stores how values + * are stored not what these values represent. + */ +typedef struct AVPixFmtDescriptor { + const char *name; + uint8_t nb_components; ///< The number of components each pixel has, (1-4) + + /** + * Amount to shift the luma width right to find the chroma width. + * For YV12 this is 1 for example. + * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_w; + + /** + * Amount to shift the luma height right to find the chroma height. + * For YV12 this is 1 for example. + * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) + * The note above is needed to ensure rounding up. + * This value only refers to the chroma components. + */ + uint8_t log2_chroma_h; + + /** + * Combination of AV_PIX_FMT_FLAG_... flags. + */ + uint64_t flags; + + /** + * Parameters that describe how pixels are packed. + * If the format has 1 or 2 components, then luma is 0. + * If the format has 3 or 4 components: + * if the RGB flag is set then 0 is red, 1 is green and 2 is blue; + * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V. + * + * If present, the Alpha channel is always the last component. + */ + AVComponentDescriptor comp[4]; + + /** + * Alternative comma-separated names. + */ + const char *alias; +} AVPixFmtDescriptor; + +/** + * Pixel format is big-endian. + */ +#define AV_PIX_FMT_FLAG_BE (1 << 0) +/** + * Pixel format has a palette in data[1], values are indexes in this palette. + */ +#define AV_PIX_FMT_FLAG_PAL (1 << 1) +/** + * All values of a component are bit-wise packed end to end. + */ +#define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2) +/** + * Pixel format is an HW accelerated format. + */ +#define AV_PIX_FMT_FLAG_HWACCEL (1 << 3) +/** + * At least one pixel component is not in the first data plane. + */ +#define AV_PIX_FMT_FLAG_PLANAR (1 << 4) +/** + * The pixel format contains RGB-like data (as opposed to YUV/grayscale). + */ +#define AV_PIX_FMT_FLAG_RGB (1 << 5) + +/** + * The pixel format is "pseudo-paletted". This means that it contains a + * fixed palette in the 2nd plane but the palette is fixed/constant for each + * PIX_FMT. This allows interpreting the data as if it was PAL8, which can + * in some cases be simpler. Or the data can be interpreted purely based on + * the pixel format without using the palette. + * An example of a pseudo-paletted format is AV_PIX_FMT_GRAY8 + * + * @deprecated This flag is deprecated, and will be removed. When it is removed, + * the extra palette allocation in AVFrame.data[1] is removed as well. Only + * actual paletted formats (as indicated by AV_PIX_FMT_FLAG_PAL) will have a + * palette. Starting with FFmpeg versions which have this flag deprecated, the + * extra "pseudo" palette is already ignored, and API users are not required to + * allocate a palette for AV_PIX_FMT_FLAG_PSEUDOPAL formats (it was required + * before the deprecation, though). + */ +#define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6) + +/** + * The pixel format has an alpha channel. This is set on all formats that + * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always + * straight, never pre-multiplied. + * + * If a codec or a filter does not support alpha, it should set all alpha to + * opaque, or use the equivalent pixel formats without alpha component, e.g. + * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA. + */ +#define AV_PIX_FMT_FLAG_ALPHA (1 << 7) + +/** + * The pixel format is following a Bayer pattern + */ +#define AV_PIX_FMT_FLAG_BAYER (1 << 8) + +/** + * The pixel format contains IEEE-754 floating point values. Precision (double, + * single, or half) should be determined by the pixel size (64, 32, or 16 bits). + */ +#define AV_PIX_FMT_FLAG_FLOAT (1 << 9) + +/** + * Return the number of bits per pixel used by the pixel format + * described by pixdesc. Note that this is not the same as the number + * of bits per sample. + * + * The returned number of bits refers to the number of bits actually + * used for storing the pixel information, that is padding bits are + * not counted. + */ +int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * Return the number of bits per pixel for the pixel format + * described by pixdesc, including any padding or unused bits. + */ +int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); + +/** + * @return a pixel format descriptor for provided pixel format or NULL if + * this pixel format is unknown. + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt); + +/** + * Iterate over all pixel format descriptors known to libavutil. + * + * @param prev previous descriptor. NULL to get the first descriptor. + * + * @return next descriptor or NULL after the last descriptor + */ +const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev); + +/** + * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc + * is not a valid pointer to a pixel format descriptor. + */ +enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); + +/** + * Utility function to access log2_chroma_w log2_chroma_h from + * the pixel format AVPixFmtDescriptor. + * + * @param[in] pix_fmt the pixel format + * @param[out] h_shift store log2_chroma_w (horizontal/width shift) + * @param[out] v_shift store log2_chroma_h (vertical/height shift) + * + * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format + */ +int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, + int *h_shift, int *v_shift); + +/** + * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a + * valid pixel format. + */ +int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); + +/** + * @return the name for provided color range or NULL if unknown. + */ +const char *av_color_range_name(enum AVColorRange range); + +/** + * @return the AVColorRange value for name or an AVError if not found. + */ +int av_color_range_from_name(const char *name); + +/** + * @return the name for provided color primaries or NULL if unknown. + */ +const char *av_color_primaries_name(enum AVColorPrimaries primaries); + +/** + * @return the AVColorPrimaries value for name or an AVError if not found. + */ +int av_color_primaries_from_name(const char *name); + +/** + * @return the name for provided color transfer or NULL if unknown. + */ +const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); + +/** + * @return the AVColorTransferCharacteristic value for name or an AVError if not found. + */ +int av_color_transfer_from_name(const char *name); + +/** + * @return the name for provided color space or NULL if unknown. + */ +const char *av_color_space_name(enum AVColorSpace space); + +/** + * @return the AVColorSpace value for name or an AVError if not found. + */ +int av_color_space_from_name(const char *name); + +/** + * @return the name for provided chroma location or NULL if unknown. + */ +const char *av_chroma_location_name(enum AVChromaLocation location); + +/** + * @return the AVChromaLocation value for name or an AVError if not found. + */ +int av_chroma_location_from_name(const char *name); + +/** + * Return the pixel format corresponding to name. + * + * If there is no pixel format with name name, then looks for a + * pixel format with the name corresponding to the native endian + * format of name. + * For example in a little-endian system, first looks for "gray16", + * then for "gray16le". + * + * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. + */ +enum AVPixelFormat av_get_pix_fmt(const char *name); + +/** + * Return the short name for a pixel format, NULL in case pix_fmt is + * unknown. + * + * @see av_get_pix_fmt(), av_get_pix_fmt_string() + */ +const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); + +/** + * Print in buf the string corresponding to the pixel format with + * number pix_fmt, or a header if pix_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param pix_fmt the number of the pixel format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + */ +char *av_get_pix_fmt_string(char *buf, int buf_size, + enum AVPixelFormat pix_fmt); + +/** + * Read a line from an image, and write the values of the + * pixel format component c to dst. + * + * @param data the array containing the pointers to the planes of the image + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to read + * @param y the vertical coordinate of the first pixel to read + * @param w the width of the line to read, that is the number of + * values to write to dst + * @param read_pal_component if not zero and the format is a paletted + * format writes the values corresponding to the palette + * component c in data[1] to dst, rather than the palette indexes in + * data[0]. The behavior is undefined if the format is not paletted. + * @param dst_element_size size of elements in dst array (2 or 4 byte) + */ +void av_read_image_line2(void *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component, + int dst_element_size); + +void av_read_image_line(uint16_t *dst, const uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int read_pal_component); + +/** + * Write the values from src to the pixel format component c of an + * image line. + * + * @param src array containing the values to write + * @param data the array containing the pointers to the planes of the + * image to write into. It is supposed to be zeroed. + * @param linesize the array containing the linesizes of the image + * @param desc the pixel format descriptor for the image + * @param x the horizontal coordinate of the first pixel to write + * @param y the vertical coordinate of the first pixel to write + * @param w the width of the line to write, that is the number of + * values to write to the image line + * @param src_element_size size of elements in src array (2 or 4 byte) + */ +void av_write_image_line2(const void *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w, int src_element_size); + +void av_write_image_line(const uint16_t *src, uint8_t *data[4], + const int linesize[4], const AVPixFmtDescriptor *desc, + int x, int y, int c, int w); + +/** + * Utility function to swap the endianness of a pixel format. + * + * @param[in] pix_fmt the pixel format + * + * @return pixel format with swapped endianness if it exists, + * otherwise AV_PIX_FMT_NONE + */ +enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt); + +#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */ +#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */ +#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */ +#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */ +#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */ +#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */ + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, + enum AVPixelFormat src_pix_fmt, + int has_alpha); + +/** + * Compute what kind of losses will occur when converting from one specific + * pixel format to another. + * When converting from one pixel format to another, information loss may occur. + * For example, when converting from RGB24 to GRAY, the color information will + * be lost. Similarly, other losses occur when converting from some formats to + * other formats. These losses can involve loss of chroma, but also loss of + * resolution, loss of color depth, loss due to the color space conversion, loss + * of the alpha bits or loss due to color quantization. + * av_get_fix_fmt_loss() informs you about the various types of losses + * which will occur when converting from one pixel format to another. + * + * @param[in] dst_pix_fmt destination pixel format + * @param[in] src_pix_fmt source pixel format + * @param[in] has_alpha Whether the source pixel format alpha channel is used. + * @return Combination of flags informing you what kind of losses will occur + * (maximum loss for an invalid dst_pix_fmt). + */ +enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, + enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr); + +#endif /* AVUTIL_PIXDESC_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixelutils.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixelutils.h new file mode 100644 index 0000000..a8dbc15 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/pixelutils.h @@ -0,0 +1,52 @@ +/* + * 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 + */ + +#ifndef AVUTIL_PIXELUTILS_H +#define AVUTIL_PIXELUTILS_H + +#include +#include +#include "common.h" + +/** + * Sum of abs(src1[x] - src2[x]) + */ +typedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1, + const uint8_t *src2, ptrdiff_t stride2); + +/** + * Get a potentially optimized pointer to a Sum-of-absolute-differences + * function (see the av_pixelutils_sad_fn prototype). + * + * @param w_bits 1< + * + * 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 + */ + +#ifndef AVUTIL_PIXFMT_H +#define AVUTIL_PIXFMT_H + +/** + * @file + * pixel format definitions + */ + +#include "libavutil/avconfig.h" +#include "version.h" + +#define AVPALETTE_SIZE 1024 +#define AVPALETTE_COUNT 256 + +/** + * Pixel format. + * + * @note + * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA + * color is put together as: + * (A << 24) | (R << 16) | (G << 8) | B + * This is stored as BGRA on little-endian CPU architectures and ARGB on + * big-endian CPUs. + * + * @note + * If the resolution is not a multiple of the chroma subsampling factor + * then the chroma plane resolution must be rounded up. + * + * @par + * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized + * image data is stored in AVFrame.data[0]. The palette is transported in + * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is + * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is + * also endian-specific). Note also that the individual RGB32 palette + * components stored in AVFrame.data[1] should be in the range 0..255. + * This is important as many custom PAL8 video codecs that were designed + * to run on the IBM VGA graphics adapter use 6-bit palette components. + * + * @par + * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like + * for pal8. This palette is filled in automatically by the function + * allocating the picture. + */ +enum AVPixelFormat { + AV_PIX_FMT_NONE = -1, + AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) + AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... + AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... + AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) + AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) + AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) + AV_PIX_FMT_GRAY8, ///< Y , 8bpp + AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb + AV_PIX_FMT_PAL8, ///< 8 bits with AV_PIX_FMT_RGB32 palette + AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range + AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range + AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range + AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3 + AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb) + AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb) + AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb) + AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits + AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb) + AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped + + AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB... + AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA... + AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR... + AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA... + + AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian + AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian + AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) + AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range + AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) + AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian + + AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian + AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian + AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined + + AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian + AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian + AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined + AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined + +#if FF_API_VAAPI + /** @name Deprecated pixel formats */ + /**@{*/ + AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers + AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers + AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a VASurfaceID + /**@}*/ + AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD, +#else + /** + * Hardware acceleration through VA-API, data[3] contains a + * VASurfaceID. + */ + AV_PIX_FMT_VAAPI, +#endif + + AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer + + AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined + AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined + AV_PIX_FMT_YA8, ///< 8 bits gray, 8 bits alpha + + AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8 + + AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian + AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian + + /** + * The following 12 formats have the disadvantage of needing 1 format for each bit depth. + * Notice that each 9/10 bits sample is stored in 16 bits with extra padding. + * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better. + */ + AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp + AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP + AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian + AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian + AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian + AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian + AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian + AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples) + AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples) + AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian + AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian + AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian) + AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian) + AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian) + AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian) + AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian) + + AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface + + AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0 + AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) + AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + + AV_PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + AV_PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian + AV_PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian + + AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + + AV_PIX_FMT_YA16BE, ///< 16 bits gray, 16 bits alpha (big-endian) + AV_PIX_FMT_YA16LE, ///< 16 bits gray, 16 bits alpha (little-endian) + + AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp + AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian + AV_PIX_FMT_GBRAP16LE, ///< planar GBRA 4:4:4:4 64bpp, little-endian + /** + * HW acceleration through QSV, data[3] contains a pointer to the + * mfxFrameSurface1 structure. + */ + AV_PIX_FMT_QSV, + /** + * HW acceleration though MMAL, data[3] contains a pointer to the + * MMAL_BUFFER_HEADER_T structure. + */ + AV_PIX_FMT_MMAL, + + AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer + + /** + * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers + * exactly as for system memory frames. + */ + AV_PIX_FMT_CUDA, + + AV_PIX_FMT_0RGB, ///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined + AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined + AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined + AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined + + AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian + AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian + AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian + AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian + AV_PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big-endian + AV_PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little-endian + AV_PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big-endian + AV_PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little-endian + AV_PIX_FMT_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range + + AV_PIX_FMT_BAYER_BGGR8, ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_RGGB8, ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GBRG8, ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_GRBG8, ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */ + AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */ + AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */ + AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */ + + AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing + + AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian + AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian + AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian + AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian + + AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox + + AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian + AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian + + AV_PIX_FMT_GBRAP12BE, ///< planar GBR 4:4:4:4 48bpp, big-endian + AV_PIX_FMT_GBRAP12LE, ///< planar GBR 4:4:4:4 48bpp, little-endian + + AV_PIX_FMT_GBRAP10BE, ///< planar GBR 4:4:4:4 40bpp, big-endian + AV_PIX_FMT_GBRAP10LE, ///< planar GBR 4:4:4:4 40bpp, little-endian + + AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec + + AV_PIX_FMT_GRAY12BE, ///< Y , 12bpp, big-endian + AV_PIX_FMT_GRAY12LE, ///< Y , 12bpp, little-endian + AV_PIX_FMT_GRAY10BE, ///< Y , 10bpp, big-endian + AV_PIX_FMT_GRAY10LE, ///< Y , 10bpp, little-endian + + AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian + AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian + + /** + * Hardware surfaces for Direct3D11. + * + * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11 + * hwaccel API and filtering support AV_PIX_FMT_D3D11 only. + * + * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the + * texture array index of the frame as intptr_t if the ID3D11Texture2D is + * an array texture (or always 0 if it's a normal texture). + */ + AV_PIX_FMT_D3D11, + + AV_PIX_FMT_GRAY9BE, ///< Y , 9bpp, big-endian + AV_PIX_FMT_GRAY9LE, ///< Y , 9bpp, little-endian + + AV_PIX_FMT_GBRPF32BE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, big-endian + AV_PIX_FMT_GBRPF32LE, ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp, little-endian + AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian + AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + + /** + * DRM-managed buffers exposed through PRIME buffer sharing. + * + * data[0] points to an AVDRMFrameDescriptor. + */ + AV_PIX_FMT_DRM_PRIME, + /** + * Hardware surfaces for OpenCL. + * + * data[i] contain 2D image objects (typed in C as cl_mem, used + * in OpenCL as image2d_t) for each plane of the surface. + */ + AV_PIX_FMT_OPENCL, + + AV_PIX_FMT_GRAY14BE, ///< Y , 14bpp, big-endian + AV_PIX_FMT_GRAY14LE, ///< Y , 14bpp, little-endian + + AV_PIX_FMT_GRAYF32BE, ///< IEEE-754 single precision Y, 32bpp, big-endian + AV_PIX_FMT_GRAYF32LE, ///< IEEE-754 single precision Y, 32bpp, little-endian + + AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian + AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian + AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian + + AV_PIX_FMT_NV24, ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V) + AV_PIX_FMT_NV42, ///< as above, but U and V bytes are swapped + + AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions +}; + +#if AV_HAVE_BIGENDIAN +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be +#else +# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le +#endif + +#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA) +#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR) +#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA) +#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB) +#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0) +#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0) + +#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE) +#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE) +#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE) +#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE) +#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE) +#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE) +#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE) +#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE) +#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE) +#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE) +#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE) +#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE) +#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE) +#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE) +#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE) +#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE) + +#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE) +#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE) +#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE) +#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE) +#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE) +#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE) +#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE) +#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE) +#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE) +#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE) +#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE) +#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE) +#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE) +#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE) +#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE) +#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE) +#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE) + +#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE) +#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE) +#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE) +#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE) +#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE) +#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE) +#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE) +#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE) + +#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE) +#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE) +#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE) +#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE) + +#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) +#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) + +#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE) + +#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) +#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) +#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) +#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE) +#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE) +#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE) +#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE) +#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE) +#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE) +#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE) +#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE) + +#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE) +#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE) +#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE) +#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE) +#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE) + +/** + * Chromaticity coordinates of the source primaries. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1. + */ +enum AVColorPrimaries { + AVCOL_PRI_RESERVED0 = 0, + AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + AVCOL_PRI_UNSPECIFIED = 2, + AVCOL_PRI_RESERVED = 3, + AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above + AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C + AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 + AVCOL_PRI_SMPTE428 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428, + AVCOL_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + AVCOL_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + AVCOL_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors + AVCOL_PRI_NB ///< Not part of ABI +}; + +/** + * Color Transfer Characteristic. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.2. + */ +enum AVColorTransferCharacteristic { + AVCOL_TRC_RESERVED0 = 0, + AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED = 2, + AVCOL_TRC_RESERVED = 3, + AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC + AVCOL_TRC_SMPTE240M = 7, + AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics" + AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" + AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" + AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 + AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut + AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) + AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10-bit system + AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12-bit system + AVCOL_TRC_SMPTE2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084, + AVCOL_TRC_SMPTE428 = 17, ///< SMPTE ST 428-1 + AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428, + AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + AVCOL_TRC_NB ///< Not part of ABI +}; + +/** + * YUV colorspace type. + * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.3. + */ +enum AVColorSpace { + AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) + AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + AVCOL_SPC_UNSPECIFIED = 2, + AVCOL_SPC_RESERVED = 3, + AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_SPC_SMPTE240M = 7, ///< functionally identical to above + AVCOL_SPC_YCGCO = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO, + AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system + AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system + AVCOL_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + AVCOL_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + AVCOL_SPC_NB ///< Not part of ABI +}; + +/** + * MPEG vs JPEG YUV range. + */ +enum AVColorRange { + AVCOL_RANGE_UNSPECIFIED = 0, + AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges + AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges + AVCOL_RANGE_NB ///< Not part of ABI +}; + +/** + * Location of chroma samples. + * + * Illustration showing the location of the first (top left) chroma sample of the + * image, the left shows only luma, the right + * shows the location of the chroma sample, the 2 could be imagined to overlay + * each other but are drawn separately due to limitations of ASCII + * + * 1st 2nd 1st 2nd horizontal luma sample positions + * v v v v + * ______ ______ + *1st luma line > |X X ... |3 4 X ... X are luma samples, + * | |1 2 1-6 are possible chroma positions + *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position + */ +enum AVChromaLocation { + AVCHROMA_LOC_UNSPECIFIED = 0, + AVCHROMA_LOC_LEFT = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0 + AVCHROMA_LOC_CENTER = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0 + AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 + AVCHROMA_LOC_TOP = 4, + AVCHROMA_LOC_BOTTOMLEFT = 5, + AVCHROMA_LOC_BOTTOM = 6, + AVCHROMA_LOC_NB ///< Not part of ABI +}; + +#endif /* AVUTIL_PIXFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/random_seed.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/random_seed.h new file mode 100644 index 0000000..0462a04 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/random_seed.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009 Baptiste Coudurier + * + * 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 + */ + +#ifndef AVUTIL_RANDOM_SEED_H +#define AVUTIL_RANDOM_SEED_H + +#include +/** + * @addtogroup lavu_crypto + * @{ + */ + +/** + * Get a seed to use in conjunction with random functions. + * This function tries to provide a good seed at a best effort bases. + * Its possible to call this function multiple times if more bits are needed. + * It can be quite slow, which is why it should only be used as seed for a faster + * PRNG. The quality of the seed depends on the platform. + */ +uint32_t av_get_random_seed(void); + +/** + * @} + */ + +#endif /* AVUTIL_RANDOM_SEED_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rational.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rational.h new file mode 100644 index 0000000..5c6b67b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rational.h @@ -0,0 +1,214 @@ +/* + * rational numbers + * Copyright (c) 2003 Michael Niedermayer + * + * 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 + * @ingroup lavu_math_rational + * Utilties for rational number calculation. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_RATIONAL_H +#define AVUTIL_RATIONAL_H + +#include +#include +#include "attributes.h" + +/** + * @defgroup lavu_math_rational AVRational + * @ingroup lavu_math + * Rational number calculation. + * + * While rational numbers can be expressed as floating-point numbers, the + * conversion process is a lossy one, so are floating-point operations. On the + * other hand, the nature of FFmpeg demands highly accurate calculation of + * timestamps. This set of rational number utilities serves as a generic + * interface for manipulating rational numbers as pairs of numerators and + * denominators. + * + * Many of the functions that operate on AVRational's have the suffix `_q`, in + * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all + * rational numbers. + * + * @{ + */ + +/** + * Rational number (pair of numerator and denominator). + */ +typedef struct AVRational{ + int num; ///< Numerator + int den; ///< Denominator +} AVRational; + +/** + * Create an AVRational. + * + * Useful for compilers that do not support compound literals. + * + * @note The return value is not reduced. + * @see av_reduce() + */ +static inline AVRational av_make_q(int num, int den) +{ + AVRational r = { num, den }; + return r; +} + +/** + * Compare two rationals. + * + * @param a First rational + * @param b Second rational + * + * @return One of the following values: + * - 0 if `a == b` + * - 1 if `a > b` + * - -1 if `a < b` + * - `INT_MIN` if one of the values is of the form `0 / 0` + */ +static inline int av_cmp_q(AVRational a, AVRational b){ + const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den; + + if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1; + else if(b.den && a.den) return 0; + else if(a.num && b.num) return (a.num>>31) - (b.num>>31); + else return INT_MIN; +} + +/** + * Convert an AVRational to a `double`. + * @param a AVRational to convert + * @return `a` in floating-point form + * @see av_d2q() + */ +static inline double av_q2d(AVRational a){ + return a.num / (double) a.den; +} + +/** + * Reduce a fraction. + * + * This is useful for framerate calculations. + * + * @param[out] dst_num Destination numerator + * @param[out] dst_den Destination denominator + * @param[in] num Source numerator + * @param[in] den Source denominator + * @param[in] max Maximum allowed values for `dst_num` & `dst_den` + * @return 1 if the operation is exact, 0 otherwise + */ +int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); + +/** + * Multiply two rationals. + * @param b First rational + * @param c Second rational + * @return b*c + */ +AVRational av_mul_q(AVRational b, AVRational c) av_const; + +/** + * Divide one rational by another. + * @param b First rational + * @param c Second rational + * @return b/c + */ +AVRational av_div_q(AVRational b, AVRational c) av_const; + +/** + * Add two rationals. + * @param b First rational + * @param c Second rational + * @return b+c + */ +AVRational av_add_q(AVRational b, AVRational c) av_const; + +/** + * Subtract one rational from another. + * @param b First rational + * @param c Second rational + * @return b-c + */ +AVRational av_sub_q(AVRational b, AVRational c) av_const; + +/** + * Invert a rational. + * @param q value + * @return 1 / q + */ +static av_always_inline AVRational av_inv_q(AVRational q) +{ + AVRational r = { q.den, q.num }; + return r; +} + +/** + * Convert a double precision floating point number to a rational. + * + * In case of infinity, the returned value is expressed as `{1, 0}` or + * `{-1, 0}` depending on the sign. + * + * @param d `double` to convert + * @param max Maximum allowed numerator and denominator + * @return `d` in AVRational form + * @see av_q2d() + */ +AVRational av_d2q(double d, int max) av_const; + +/** + * Find which of the two rationals is closer to another rational. + * + * @param q Rational to be compared against + * @param q1,q2 Rationals to be tested + * @return One of the following values: + * - 1 if `q1` is nearer to `q` than `q2` + * - -1 if `q2` is nearer to `q` than `q1` + * - 0 if they have the same distance + */ +int av_nearer_q(AVRational q, AVRational q1, AVRational q2); + +/** + * Find the value in a list of rationals nearest a given reference rational. + * + * @param q Reference rational + * @param q_list Array of rationals terminated by `{0, 0}` + * @return Index of the nearest value found in the array + */ +int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); + +/** + * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point + * format. + * + * @param q Rational to be converted + * @return Equivalent floating-point value, expressed as an unsigned 32-bit + * integer. + * @note The returned value is platform-indepedant. + */ +uint32_t av_q2intfloat(AVRational q); + +/** + * @} + */ + +#endif /* AVUTIL_RATIONAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rc4.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rc4.h new file mode 100644 index 0000000..029cd2a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/rc4.h @@ -0,0 +1,66 @@ +/* + * RC4 encryption/decryption/pseudo-random number generator + * + * 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 + */ + +#ifndef AVUTIL_RC4_H +#define AVUTIL_RC4_H + +#include + +/** + * @defgroup lavu_rc4 RC4 + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVRC4 { + uint8_t state[256]; + int x, y; +} AVRC4; + +/** + * Allocate an AVRC4 context. + */ +AVRC4 *av_rc4_alloc(void); + +/** + * @brief Initializes an AVRC4 context. + * + * @param key_bits must be a multiple of 8 + * @param decrypt 0 for encryption, 1 for decryption, currently has no effect + * @return zero on success, negative value otherwise + */ +int av_rc4_init(struct AVRC4 *d, const uint8_t *key, int key_bits, int decrypt); + +/** + * @brief Encrypts / decrypts using the RC4 algorithm. + * + * @param count number of bytes + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst, may be NULL + * @param iv not (yet) used for RC4, should be NULL + * @param decrypt 0 for encryption, 1 for decryption, not (yet) used + */ +void av_rc4_crypt(struct AVRC4 *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_RC4_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/replaygain.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/replaygain.h new file mode 100644 index 0000000..b49bf1a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/replaygain.h @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#ifndef AVUTIL_REPLAYGAIN_H +#define AVUTIL_REPLAYGAIN_H + +#include + +/** + * ReplayGain information (see + * http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification). + * The size of this struct is a part of the public ABI. + */ +typedef struct AVReplayGain { + /** + * Track replay gain in microbels (divide by 100000 to get the value in dB). + * Should be set to INT32_MIN when unknown. + */ + int32_t track_gain; + /** + * Peak track amplitude, with 100000 representing full scale (but values + * may overflow). 0 when unknown. + */ + uint32_t track_peak; + /** + * Same as track_gain, but for the whole album. + */ + int32_t album_gain; + /** + * Same as track_peak, but for the whole album, + */ + uint32_t album_peak; +} AVReplayGain; + +#endif /* AVUTIL_REPLAYGAIN_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ripemd.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ripemd.h new file mode 100644 index 0000000..0db6858 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/ripemd.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_ripemd + * Public header for RIPEMD hash function implementation. + */ + +#ifndef AVUTIL_RIPEMD_H +#define AVUTIL_RIPEMD_H + +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_ripemd RIPEMD + * @ingroup lavu_hash + * RIPEMD hash function implementation. + * + * @{ + */ + +extern const int av_ripemd_size; + +struct AVRIPEMD; + +/** + * Allocate an AVRIPEMD context. + */ +struct AVRIPEMD *av_ripemd_alloc(void); + +/** + * Initialize RIPEMD hashing. + * + * @param context pointer to the function context (of size av_ripemd_size) + * @param bits number of bits in digest (128, 160, 256 or 320 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_ripemd_init(struct AVRIPEMD* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, unsigned int len); +#else +void av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_ripemd_final(struct AVRIPEMD* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_RIPEMD_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/samplefmt.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/samplefmt.h new file mode 100644 index 0000000..8cd43ae --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/samplefmt.h @@ -0,0 +1,272 @@ +/* + * 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 + */ + +#ifndef AVUTIL_SAMPLEFMT_H +#define AVUTIL_SAMPLEFMT_H + +#include + +#include "avutil.h" +#include "attributes.h" + +/** + * @addtogroup lavu_audio + * @{ + * + * @defgroup lavu_sampfmts Audio sample formats + * + * Audio sample format enumeration and related convenience functions. + * @{ + */ + +/** + * Audio sample formats + * + * - The data described by the sample format is always in native-endian order. + * Sample values can be expressed by native C types, hence the lack of a signed + * 24-bit sample format even though it is a common raw audio data format. + * + * - The floating-point formats are based on full volume being in the range + * [-1.0, 1.0]. Any values outside this range are beyond full volume level. + * + * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg + * (such as AVFrame in libavcodec) is as follows: + * + * @par + * For planar sample formats, each audio channel is in a separate data plane, + * and linesize is the buffer size, in bytes, for a single plane. All data + * planes must be the same size. For packed sample formats, only the first data + * plane is used, and samples for each channel are interleaved. In this case, + * linesize is the buffer size, in bytes, for the 1 plane. + * + */ +enum AVSampleFormat { + AV_SAMPLE_FMT_NONE = -1, + AV_SAMPLE_FMT_U8, ///< unsigned 8 bits + AV_SAMPLE_FMT_S16, ///< signed 16 bits + AV_SAMPLE_FMT_S32, ///< signed 32 bits + AV_SAMPLE_FMT_FLT, ///< float + AV_SAMPLE_FMT_DBL, ///< double + + AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar + AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar + AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar + AV_SAMPLE_FMT_FLTP, ///< float, planar + AV_SAMPLE_FMT_DBLP, ///< double, planar + AV_SAMPLE_FMT_S64, ///< signed 64 bits + AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar + + AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically +}; + +/** + * Return the name of sample_fmt, or NULL if sample_fmt is not + * recognized. + */ +const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); + +/** + * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE + * on error. + */ +enum AVSampleFormat av_get_sample_fmt(const char *name); + +/** + * Return the planar<->packed alternative form of the given sample format, or + * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the + * requested planar/packed format, the format returned is the same as the + * input. + */ +enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); + +/** + * Get the packed alternative form of the given sample format. + * + * If the passed sample_fmt is already in packed format, the format returned is + * the same as the input. + * + * @return the packed alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Get the planar alternative form of the given sample format. + * + * If the passed sample_fmt is already in planar format, the format returned is + * the same as the input. + * + * @return the planar alternative form of the given sample format or + AV_SAMPLE_FMT_NONE on error. + */ +enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); + +/** + * Generate a string corresponding to the sample format with + * sample_fmt, or a header if sample_fmt is negative. + * + * @param buf the buffer where to write the string + * @param buf_size the size of buf + * @param sample_fmt the number of the sample format to print the + * corresponding info string, or a negative value to print the + * corresponding header. + * @return the pointer to the filled buffer or NULL if sample_fmt is + * unknown or in case of other errors + */ +char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); + +/** + * Return number of bytes per sample. + * + * @param sample_fmt the sample format + * @return number of bytes per sample or zero if unknown for the given + * sample format + */ +int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); + +/** + * Check if the sample format is planar. + * + * @param sample_fmt the sample format to inspect + * @return 1 if the sample format is planar, 0 if it is interleaved + */ +int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); + +/** + * Get the required buffer size for the given audio parameters. + * + * @param[out] linesize calculated linesize, may be NULL + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return required buffer size, or negative error code on failure + */ +int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * @} + * + * @defgroup lavu_sampmanip Samples manipulation + * + * Functions that manipulate audio samples + * @{ + */ + +/** + * Fill plane data pointers and linesize for samples with sample + * format sample_fmt. + * + * The audio_data array is filled with the pointers to the samples data planes: + * for planar, set the start point of each channel's data within the buffer, + * for packed, set the start point of the entire buffer only. + * + * The value pointed to by linesize is set to the aligned size of each + * channel's data buffer for planar layout, or to the aligned size of the + * buffer for all channels for packed layout. + * + * The buffer in buf must be big enough to contain all the samples + * (use av_samples_get_buffer_size() to compute its minimum size), + * otherwise the audio_data pointers will point to invalid data. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize calculated linesize, may be NULL + * @param buf the pointer to a buffer containing the samples + * @param nb_channels the number of channels + * @param nb_samples the number of samples in a single channel + * @param sample_fmt the sample format + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return minimum size in bytes required for the buffer in case + * of success at the next bump + */ +int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, + const uint8_t *buf, + int nb_channels, int nb_samples, + enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a samples buffer for nb_samples samples, and fill data pointers and + * linesize accordingly. + * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) + * Allocated data will be initialized to silence. + * + * @see enum AVSampleFormat + * The documentation for AVSampleFormat describes the data layout. + * + * @param[out] audio_data array to be filled with the pointer for each channel + * @param[out] linesize aligned size for audio buffer(s), may be NULL + * @param nb_channels number of audio channels + * @param nb_samples number of samples per channel + * @param align buffer size alignment (0 = default, 1 = no alignment) + * @return >=0 on success or a negative error code on failure + * @todo return the size of the allocated buffer in case of success at the next bump + * @see av_samples_fill_arrays() + * @see av_samples_alloc_array_and_samples() + */ +int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Allocate a data pointers array, samples buffer for nb_samples + * samples, and fill data pointers and linesize accordingly. + * + * This is the same as av_samples_alloc(), but also allocates the data + * pointers array. + * + * @see av_samples_alloc() + */ +int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, + int nb_samples, enum AVSampleFormat sample_fmt, int align); + +/** + * Copy samples from src to dst. + * + * @param dst destination array of pointers to data planes + * @param src source array of pointers to data planes + * @param dst_offset offset in samples at which the data will be written to dst + * @param src_offset offset in samples at which the data will be read from src + * @param nb_samples number of samples to be copied + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, + int src_offset, int nb_samples, int nb_channels, + enum AVSampleFormat sample_fmt); + +/** + * Fill an audio buffer with silence. + * + * @param audio_data array of pointers to data planes + * @param offset offset in samples at which to start filling + * @param nb_samples number of samples to fill + * @param nb_channels number of audio channels + * @param sample_fmt audio sample format + */ +int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, + int nb_channels, enum AVSampleFormat sample_fmt); + +/** + * @} + * @} + */ +#endif /* AVUTIL_SAMPLEFMT_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha.h new file mode 100644 index 0000000..c0180e5 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * + * 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 + * @ingroup lavu_sha + * Public header for SHA-1 & SHA-256 hash function implementations. + */ + +#ifndef AVUTIL_SHA_H +#define AVUTIL_SHA_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha SHA + * @ingroup lavu_hash + * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA hash functions: + * + * - SHA-1: 160 bits + * - SHA-224: 224 bits, as a variant of SHA-2 + * - SHA-256: 256 bits, as a variant of SHA-2 + * + * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512. + * + * @{ + */ + +extern const int av_sha_size; + +struct AVSHA; + +/** + * Allocate an AVSHA context. + */ +struct AVSHA *av_sha_alloc(void); + +/** + * Initialize SHA-1 or SHA-2 hashing. + * + * @param context pointer to the function context (of size av_sha_size) + * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha_init(struct AVSHA* context, int bits); + +/** + * Update hash value. + * + * @param ctx hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, unsigned int len); +#else +void av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha_final(struct AVSHA* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha512.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha512.h new file mode 100644 index 0000000..bef714b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/sha512.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2007 Michael Niedermayer + * Copyright (C) 2013 James Almer + * + * 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 + * @ingroup lavu_sha512 + * Public header for SHA-512 implementation. + */ + +#ifndef AVUTIL_SHA512_H +#define AVUTIL_SHA512_H + +#include +#include + +#include "attributes.h" +#include "version.h" + +/** + * @defgroup lavu_sha512 SHA-512 + * @ingroup lavu_hash + * SHA-512 (Secure Hash Algorithm) hash function implementations. + * + * This module supports the following SHA-2 hash functions: + * + * - SHA-512/224: 224 bits + * - SHA-512/256: 256 bits + * - SHA-384: 384 bits + * - SHA-512: 512 bits + * + * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha. + * + * @{ + */ + +extern const int av_sha512_size; + +struct AVSHA512; + +/** + * Allocate an AVSHA512 context. + */ +struct AVSHA512 *av_sha512_alloc(void); + +/** + * Initialize SHA-2 512 hashing. + * + * @param context pointer to the function context (of size av_sha512_size) + * @param bits number of bits in digest (224, 256, 384 or 512 bits) + * @return zero if initialization succeeded, -1 otherwise + */ +int av_sha512_init(struct AVSHA512* context, int bits); + +/** + * Update hash value. + * + * @param context hash function context + * @param data input data to update hash with + * @param len input data length + */ +#if FF_API_CRYPTO_SIZE_T +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, unsigned int len); +#else +void av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len); +#endif + +/** + * Finish hashing and output digest value. + * + * @param context hash function context + * @param digest buffer where output digest value is stored + */ +void av_sha512_final(struct AVSHA512* context, uint8_t *digest); + +/** + * @} + */ + +#endif /* AVUTIL_SHA512_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/spherical.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/spherical.h new file mode 100644 index 0000000..cef759c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/spherical.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2016 Vittorio Giovara + * + * 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 + * Spherical video + */ + +#ifndef AVUTIL_SPHERICAL_H +#define AVUTIL_SPHERICAL_H + +#include +#include + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_spherical Spherical video mapping + * @{ + */ + +/** + * @addtogroup lavu_video_spherical + * A spherical video file contains surfaces that need to be mapped onto a + * sphere. Depending on how the frame was converted, a different distortion + * transformation or surface recomposition function needs to be applied before + * the video should be mapped and displayed. + */ + +/** + * Projection of the video surface(s) on a sphere. + */ +enum AVSphericalProjection { + /** + * Video represents a sphere mapped on a flat surface using + * equirectangular projection. + */ + AV_SPHERICAL_EQUIRECTANGULAR, + + /** + * Video frame is split into 6 faces of a cube, and arranged on a + * 3x2 layout. Faces are oriented upwards for the front, left, right, + * and back faces. The up face is oriented so the top of the face is + * forwards and the down face is oriented so the top of the face is + * to the back. + */ + AV_SPHERICAL_CUBEMAP, + + /** + * Video represents a portion of a sphere mapped on a flat surface + * using equirectangular projection. The @ref bounding fields indicate + * the position of the current video in a larger surface. + */ + AV_SPHERICAL_EQUIRECTANGULAR_TILE, +}; + +/** + * This structure describes how to handle spherical videos, outlining + * information about projection, initial layout, and any other view modifier. + * + * @note The struct must be allocated with av_spherical_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVSphericalMapping { + /** + * Projection type. + */ + enum AVSphericalProjection projection; + + /** + * @name Initial orientation + * @{ + * There fields describe additional rotations applied to the sphere after + * the video frame is mapped onto it. The sphere is rotated around the + * viewer, who remains stationary. The order of transformation is always + * yaw, followed by pitch, and finally by roll. + * + * The coordinate system matches the one defined in OpenGL, where the + * forward vector (z) is coming out of screen, and it is equivalent to + * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll). + * + * A positive yaw rotates the portion of the sphere in front of the viewer + * toward their right. A positive pitch rotates the portion of the sphere + * in front of the viewer upwards. A positive roll tilts the portion of + * the sphere in front of the viewer to the viewer's right. + * + * These values are exported as 16.16 fixed point. + * + * See this equirectangular projection as example: + * + * @code{.unparsed} + * Yaw + * -180 0 180 + * 90 +-------------+-------------+ 180 + * | | | up + * P | | | y| forward + * i | ^ | | /z + * t 0 +-------------X-------------+ 0 Roll | / + * c | | | | / + * h | | | 0|/_____right + * | | | x + * -90 +-------------+-------------+ -180 + * + * X - the default camera center + * ^ - the default up vector + * @endcode + */ + int32_t yaw; ///< Rotation around the up vector [-180, 180]. + int32_t pitch; ///< Rotation around the right vector [-90, 90]. + int32_t roll; ///< Rotation around the forward vector [-180, 180]. + /** + * @} + */ + + /** + * @name Bounding rectangle + * @anchor bounding + * @{ + * These fields indicate the location of the current tile, and where + * it should be mapped relative to the original surface. They are + * exported as 0.32 fixed point, and can be converted to classic + * pixel values with av_spherical_bounds(). + * + * @code{.unparsed} + * +----------------+----------+ + * | |bound_top | + * | +--------+ | + * | bound_left |tile | | + * +<---------->| |<--->+bound_right + * | +--------+ | + * | | | + * | bound_bottom| | + * +----------------+----------+ + * @endcode + * + * If needed, the original video surface dimensions can be derived + * by adding the current stream or frame size to the related bounds, + * like in the following example: + * + * @code{c} + * original_width = tile->width + bound_left + bound_right; + * original_height = tile->height + bound_top + bound_bottom; + * @endcode + * + * @note These values are valid only for the tiled equirectangular + * projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE), + * and should be ignored in all other cases. + */ + uint32_t bound_left; ///< Distance from the left edge + uint32_t bound_top; ///< Distance from the top edge + uint32_t bound_right; ///< Distance from the right edge + uint32_t bound_bottom; ///< Distance from the bottom edge + /** + * @} + */ + + /** + * Number of pixels to pad from the edge of each cube face. + * + * @note This value is valid for only for the cubemap projection type + * (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other + * cases. + */ + uint32_t padding; +} AVSphericalMapping; + +/** + * Allocate a AVSphericalVideo structure and initialize its fields to default + * values. + * + * @return the newly allocated struct or NULL on failure + */ +AVSphericalMapping *av_spherical_alloc(size_t *size); + +/** + * Convert the @ref bounding fields from an AVSphericalVideo + * from 0.32 fixed point to pixels. + * + * @param map The AVSphericalVideo map to read bound values from. + * @param width Width of the current frame or stream. + * @param height Height of the current frame or stream. + * @param left Pixels from the left edge. + * @param top Pixels from the top edge. + * @param right Pixels from the right edge. + * @param bottom Pixels from the bottom edge. + */ +void av_spherical_tile_bounds(const AVSphericalMapping *map, + size_t width, size_t height, + size_t *left, size_t *top, + size_t *right, size_t *bottom); + +/** + * Provide a human-readable name of a given AVSphericalProjection. + * + * @param projection The input AVSphericalProjection. + * + * @return The name of the AVSphericalProjection, or "unknown". + */ +const char *av_spherical_projection_name(enum AVSphericalProjection projection); + +/** + * Get the AVSphericalProjection form a human-readable name. + * + * @param name The input string. + * + * @return The AVSphericalProjection value, or -1 if not found. + */ +int av_spherical_from_name(const char *name); +/** + * @} + * @} + */ + +#endif /* AVUTIL_SPHERICAL_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/stereo3d.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/stereo3d.h new file mode 100644 index 0000000..d421aac --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/stereo3d.h @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2013 Vittorio Giovara + * + * 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 + * Stereoscopic video + */ + +#ifndef AVUTIL_STEREO3D_H +#define AVUTIL_STEREO3D_H + +#include + +#include "frame.h" + +/** + * @addtogroup lavu_video + * @{ + * + * @defgroup lavu_video_stereo3d Stereo3D types and functions + * @{ + */ + +/** + * @addtogroup lavu_video_stereo3d + * A stereoscopic video file consists in multiple views embedded in a single + * frame, usually describing two views of a scene. This file describes all + * possible codec-independent view arrangements. + * */ + +/** + * List of possible 3D Types + */ +enum AVStereo3DType { + /** + * Video is not stereoscopic (and metadata has to be there). + */ + AV_STEREO3D_2D, + + /** + * Views are next to each other. + * + * @code{.unparsed} + * LLLLRRRR + * LLLLRRRR + * LLLLRRRR + * ... + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE, + + /** + * Views are on top of each other. + * + * @code{.unparsed} + * LLLLLLLL + * LLLLLLLL + * RRRRRRRR + * RRRRRRRR + * @endcode + */ + AV_STEREO3D_TOPBOTTOM, + + /** + * Views are alternated temporally. + * + * @code{.unparsed} + * frame0 frame1 frame2 ... + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * ... ... ... + * @endcode + */ + AV_STEREO3D_FRAMESEQUENCE, + + /** + * Views are packed in a checkerboard-like structure per pixel. + * + * @code{.unparsed} + * LRLRLRLR + * RLRLRLRL + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_CHECKERBOARD, + + /** + * Views are next to each other, but when upscaling + * apply a checkerboard pattern. + * + * @code{.unparsed} + * LLLLRRRR L L L L R R R R + * LLLLRRRR => L L L L R R R R + * LLLLRRRR L L L L R R R R + * LLLLRRRR L L L L R R R R + * @endcode + */ + AV_STEREO3D_SIDEBYSIDE_QUINCUNX, + + /** + * Views are packed per line, as if interlaced. + * + * @code{.unparsed} + * LLLLLLLL + * RRRRRRRR + * LLLLLLLL + * ... + * @endcode + */ + AV_STEREO3D_LINES, + + /** + * Views are packed per column. + * + * @code{.unparsed} + * LRLRLRLR + * LRLRLRLR + * LRLRLRLR + * ... + * @endcode + */ + AV_STEREO3D_COLUMNS, +}; + +/** + * List of possible view types. + */ +enum AVStereo3DView { + /** + * Frame contains two packed views. + */ + AV_STEREO3D_VIEW_PACKED, + + /** + * Frame contains only the left view. + */ + AV_STEREO3D_VIEW_LEFT, + + /** + * Frame contains only the right view. + */ + AV_STEREO3D_VIEW_RIGHT, +}; + +/** + * Inverted views, Right/Bottom represents the left view. + */ +#define AV_STEREO3D_FLAG_INVERT (1 << 0) + +/** + * Stereo 3D type: this structure describes how two videos are packed + * within a single video surface, with additional information as needed. + * + * @note The struct must be allocated with av_stereo3d_alloc() and + * its size is not a part of the public ABI. + */ +typedef struct AVStereo3D { + /** + * How views are packed within the video. + */ + enum AVStereo3DType type; + + /** + * Additional information about the frame packing. + */ + int flags; + + /** + * Determines which views are packed. + */ + enum AVStereo3DView view; +} AVStereo3D; + +/** + * Allocate an AVStereo3D structure and set its fields to default values. + * The resulting struct can be freed using av_freep(). + * + * @return An AVStereo3D filled with default values or NULL on failure. + */ +AVStereo3D *av_stereo3d_alloc(void); + +/** + * Allocate a complete AVFrameSideData and add it to the frame. + * + * @param frame The frame which side data is added to. + * + * @return The AVStereo3D structure to be filled by caller. + */ +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); + +/** + * Provide a human-readable name of a given stereo3d type. + * + * @param type The input stereo3d type value. + * + * @return The name of the stereo3d value, or "unknown". + */ +const char *av_stereo3d_type_name(unsigned int type); + +/** + * Get the AVStereo3DType form a human-readable name. + * + * @param name The input string. + * + * @return The AVStereo3DType value, or -1 if not found. + */ +int av_stereo3d_from_name(const char *name); + +/** + * @} + * @} + */ + +#endif /* AVUTIL_STEREO3D_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tea.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tea.h new file mode 100644 index 0000000..dd929bd --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tea.h @@ -0,0 +1,71 @@ +/* + * A 32-bit implementation of the TEA algorithm + * Copyright (c) 2015 Vesselin Bontchev + * + * 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 + */ + +#ifndef AVUTIL_TEA_H +#define AVUTIL_TEA_H + +#include + +/** + * @file + * @brief Public header for libavutil TEA algorithm + * @defgroup lavu_tea TEA + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_tea_size; + +struct AVTEA; + +/** + * Allocate an AVTEA context + * To free the struct: av_free(ptr) + */ +struct AVTEA *av_tea_alloc(void); + +/** + * Initialize an AVTEA context. + * + * @param ctx an AVTEA context + * @param key a key of 16 bytes used for encryption/decryption + * @param rounds the number of rounds in TEA (64 is the "standard") + */ +void av_tea_init(struct AVTEA *ctx, const uint8_t key[16], int rounds); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_tea_crypt(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_TEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/threadmessage.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/threadmessage.h new file mode 100644 index 0000000..42ce655 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/threadmessage.h @@ -0,0 +1,115 @@ +/* + * 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 + */ + +#ifndef AVUTIL_THREADMESSAGE_H +#define AVUTIL_THREADMESSAGE_H + +typedef struct AVThreadMessageQueue AVThreadMessageQueue; + +typedef enum AVThreadMessageFlags { + + /** + * Perform non-blocking operation. + * If this flag is set, send and recv operations are non-blocking and + * return AVERROR(EAGAIN) immediately if they can not proceed. + */ + AV_THREAD_MESSAGE_NONBLOCK = 1, + +} AVThreadMessageFlags; + +/** + * Allocate a new message queue. + * + * @param mq pointer to the message queue + * @param nelem maximum number of elements in the queue + * @param elsize size of each element in the queue + * @return >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if + * lavu was built without thread support + */ +int av_thread_message_queue_alloc(AVThreadMessageQueue **mq, + unsigned nelem, + unsigned elsize); + +/** + * Free a message queue. + * + * The message queue must no longer be in use by another thread. + */ +void av_thread_message_queue_free(AVThreadMessageQueue **mq); + +/** + * Send a message on the queue. + */ +int av_thread_message_queue_send(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Receive a message from the queue. + */ +int av_thread_message_queue_recv(AVThreadMessageQueue *mq, + void *msg, + unsigned flags); + +/** + * Set the sending error code. + * + * If the error code is set to non-zero, av_thread_message_queue_send() will + * return it immediately. Conventional values, such as AVERROR_EOF or + * AVERROR(EAGAIN), can be used to cause the sending thread to stop or + * suspend its operation. + */ +void av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq, + int err); + +/** + * Set the receiving error code. + * + * If the error code is set to non-zero, av_thread_message_queue_recv() will + * return it immediately when there are no longer available messages. + * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used + * to cause the receiving thread to stop or suspend its operation. + */ +void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq, + int err); + +/** + * Set the optional free message callback function which will be called if an + * operation is removing messages from the queue. + */ +void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq, + void (*free_func)(void *msg)); + +/** + * Return the current number of messages in the queue. + * + * @return the current number of messages or AVERROR(ENOSYS) if lavu was built + * without thread support + */ +int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq); + +/** + * Flush the message queue + * + * This function is mostly equivalent to reading and free-ing every message + * except that it will be done in a single operation (no lock/unlock between + * reads). + */ +void av_thread_message_flush(AVThreadMessageQueue *mq); + +#endif /* AVUTIL_THREADMESSAGE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/time.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/time.h new file mode 100644 index 0000000..dc169b0 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/time.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2000-2003 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 + */ + +#ifndef AVUTIL_TIME_H +#define AVUTIL_TIME_H + +#include + +/** + * Get the current time in microseconds. + */ +int64_t av_gettime(void); + +/** + * Get the current time in microseconds since some unspecified starting point. + * On platforms that support it, the time comes from a monotonic clock + * This property makes this time source ideal for measuring relative time. + * The returned values may not be monotonic on platforms where a monotonic + * clock is not available. + */ +int64_t av_gettime_relative(void); + +/** + * Indicates with a boolean result if the av_gettime_relative() time source + * is monotonic. + */ +int av_gettime_relative_is_monotonic(void); + +/** + * Sleep for a period of time. Although the duration is expressed in + * microseconds, the actual delay may be rounded to the precision of the + * system timer. + * + * @param usec Number of microseconds to sleep. + * @return zero on success or (negative) error code. + */ +int av_usleep(unsigned usec); + +#endif /* AVUTIL_TIME_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timecode.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timecode.h new file mode 100644 index 0000000..37c1361 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timecode.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier + * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch + * + * 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 + * Timecode helpers header + */ + +#ifndef AVUTIL_TIMECODE_H +#define AVUTIL_TIMECODE_H + +#include +#include "rational.h" + +#define AV_TIMECODE_STR_SIZE 23 + +enum AVTimecodeFlag { + AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame + AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours + AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed +}; + +typedef struct { + int start; ///< timecode frame start (first base frame number) + uint32_t flags; ///< flags such as drop frame, +24 hours support, ... + AVRational rate; ///< frame rate in rational form + unsigned fps; ///< frame per second; must be consistent with the rate field +} AVTimecode; + +/** + * Adjust frame number for NTSC drop frame time code. + * + * @param framenum frame number to adjust + * @param fps frame per second, 30 or 60 + * @return adjusted frame number + * @warning adjustment is only valid in NTSC 29.97 and 59.94 + */ +int av_timecode_adjust_ntsc_framenum2(int framenum, int fps); + +/** + * Convert frame number to SMPTE 12M binary representation. + * + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the SMPTE binary representation + * + * @note Frame number adjustment is automatically done in case of drop timecode, + * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). + * @note The frame number is relative to tc->start. + * @note Color frame (CF), binary group flags (BGF) and biphase mark polarity + * correction (PC) bits are set to zero. + */ +uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); + +/** + * Load timecode string in buf. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc timecode data correctly initialized + * @param framenum frame number + * @return the buf parameter + * + * @note Timecode representation can be a negative timecode and have more than + * 24 hours, but will only be honored if the flags are correctly set. + * @note The frame number is relative to tc->start. + */ +char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum); + +/** + * Get the timecode string from the SMPTE timecode format. + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tcsmpte the 32-bit SMPTE timecode + * @param prevent_df prevent the use of a drop flag when it is known the DF bit + * is arbitrary + * @return the buf parameter + */ +char *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df); + +/** + * Get the timecode string from the 25-bit timecode format (MPEG GOP format). + * + * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long + * @param tc25bit the 25-bits timecode + * @return the buf parameter + */ +char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit); + +/** + * Init a timecode struct with the passed parameters. + * + * @param log_ctx a pointer to an arbitrary struct of which the first field + * is a pointer to an AVClass struct (used for av_log) + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param flags miscellaneous flags such as drop frame, +24 hours, ... + * (see AVTimecodeFlag) + * @param frame_start the first frame number + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); + +/** + * Parse timecode representation (hh:mm:ss[:;.]ff). + * + * @param log_ctx a pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct (used for av_log). + * @param tc pointer to an allocated AVTimecode + * @param rate frame rate in rational form + * @param str timecode string which will determine the frame start + * @return 0 on success, AVERROR otherwise + */ +int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); + +/** + * Check if the timecode feature is available for the given frame rate + * + * @return 0 if supported, <0 otherwise + */ +int av_timecode_check_frame_rate(AVRational rate); + +#endif /* AVUTIL_TIMECODE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timestamp.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timestamp.h new file mode 100644 index 0000000..e082f01 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/timestamp.h @@ -0,0 +1,78 @@ +/* + * 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 + * timestamp utils, mostly useful for debugging/logging purposes + */ + +#ifndef AVUTIL_TIMESTAMP_H +#define AVUTIL_TIMESTAMP_H + +#include "common.h" + +#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64) +#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS +#endif + +#define AV_TS_MAX_STRING_SIZE 32 + +/** + * Fill the provided buffer with a string containing a timestamp + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @return the buffer in input + */ +static inline char *av_ts_make_string(char *buf, int64_t ts) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%" PRId64, ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts) + +/** + * Fill the provided buffer with a string containing a timestamp time + * representation. + * + * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE + * @param ts the timestamp to represent + * @param tb the timebase of the timestamp + * @return the buffer in input + */ +static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb) +{ + if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); + else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts); + return buf; +} + +/** + * Convenience macro, the return value should be used only directly in + * function arguments but never stand-alone. + */ +#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb) + +#endif /* AVUTIL_TIMESTAMP_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tree.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tree.h new file mode 100644 index 0000000..d5e0aeb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tree.h @@ -0,0 +1,138 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * 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 + * A tree container. + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_TREE_H +#define AVUTIL_TREE_H + +#include "attributes.h" +#include "version.h" + +/** + * @addtogroup lavu_tree AVTree + * @ingroup lavu_data + * + * Low-complexity tree container + * + * Insertion, removal, finding equal, largest which is smaller than and + * smallest which is larger than, all have O(log n) worst-case complexity. + * @{ + */ + + +struct AVTreeNode; +extern const int av_tree_node_size; + +/** + * Allocate an AVTreeNode. + */ +struct AVTreeNode *av_tree_node_alloc(void); + +/** + * Find an element. + * @param root a pointer to the root node of the tree + * @param next If next is not NULL, then next[0] will contain the previous + * element and next[1] the next element. If either does not exist, + * then the corresponding entry in next is unchanged. + * @param cmp compare function used to compare elements in the tree, + * API identical to that of Standard C's qsort + * It is guaranteed that the first and only the first argument to cmp() + * will be the key parameter to av_tree_find(), thus it could if the + * user wants, be a different type (like an opaque context). + * @return An element with cmp(key, elem) == 0 or NULL if no such element + * exists in the tree. + */ +void *av_tree_find(const struct AVTreeNode *root, void *key, + int (*cmp)(const void *key, const void *b), void *next[2]); + +/** + * Insert or remove an element. + * + * If *next is NULL, then the supplied element will be removed if it exists. + * If *next is non-NULL, then the supplied element will be inserted, unless + * it already exists in the tree. + * + * @param rootp A pointer to a pointer to the root node of the tree; note that + * the root node can change during insertions, this is required + * to keep the tree balanced. + * @param key pointer to the element key to insert in the tree + * @param next Used to allocate and free AVTreeNodes. For insertion the user + * must set it to an allocated and zeroed object of at least + * av_tree_node_size bytes size. av_tree_insert() will set it to + * NULL if it has been consumed. + * For deleting elements *next is set to NULL by the user and + * av_tree_insert() will set it to the AVTreeNode which was + * used for the removed element. + * This allows the use of flat arrays, which have + * lower overhead compared to many malloced elements. + * You might want to define a function like: + * @code + * void *tree_insert(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b), + * AVTreeNode **next) + * { + * if (!*next) + * *next = av_mallocz(av_tree_node_size); + * return av_tree_insert(rootp, key, cmp, next); + * } + * void *tree_remove(struct AVTreeNode **rootp, void *key, + * int (*cmp)(void *key, const void *b, AVTreeNode **next)) + * { + * av_freep(next); + * return av_tree_insert(rootp, key, cmp, next); + * } + * @endcode + * @param cmp compare function used to compare elements in the tree, API identical + * to that of Standard C's qsort + * @return If no insertion happened, the found element; if an insertion or + * removal happened, then either key or NULL will be returned. + * Which one it is depends on the tree state and the implementation. You + * should make no assumptions that it's one or the other in the code. + */ +void *av_tree_insert(struct AVTreeNode **rootp, void *key, + int (*cmp)(const void *key, const void *b), + struct AVTreeNode **next); + +void av_tree_destroy(struct AVTreeNode *t); + +/** + * Apply enu(opaque, &elem) to all the elements in the tree in a given range. + * + * @param cmp a comparison function that returns < 0 for an element below the + * range, > 0 for an element above the range and == 0 for an + * element inside the range + * + * @note The cmp function should use the same ordering used to construct the + * tree. + */ +void av_tree_enumerate(struct AVTreeNode *t, void *opaque, + int (*cmp)(void *opaque, void *elem), + int (*enu)(void *opaque, void *elem)); + +/** + * @} + */ + +#endif /* AVUTIL_TREE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/twofish.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/twofish.h new file mode 100644 index 0000000..813cfec --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/twofish.h @@ -0,0 +1,70 @@ +/* + * An implementation of the TwoFish algorithm + * Copyright (c) 2015 Supraja Meedinti + * + * 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 + */ + +#ifndef AVUTIL_TWOFISH_H +#define AVUTIL_TWOFISH_H + +#include + + +/** + * @file + * @brief Public header for libavutil TWOFISH algorithm + * @defgroup lavu_twofish TWOFISH + * @ingroup lavu_crypto + * @{ + */ + +extern const int av_twofish_size; + +struct AVTWOFISH; + +/** + * Allocate an AVTWOFISH context + * To free the struct: av_free(ptr) + */ +struct AVTWOFISH *av_twofish_alloc(void); + +/** + * Initialize an AVTWOFISH context. + * + * @param ctx an AVTWOFISH context + * @param key a key of size ranging from 1 to 32 bytes used for encryption/decryption + * @param key_bits number of keybits: 128, 192, 256 If less than the required, padded with zeroes to nearest valid value; return value is 0 if key_bits is 128/192/256, -1 if less than 0, 1 otherwise + */ +int av_twofish_init(struct AVTWOFISH *ctx, const uint8_t *key, int key_bits); + +/** + * Encrypt or decrypt a buffer using a previously initialized context + * + * @param ctx an AVTWOFISH context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 16 byte blocks + * @paran iv initialization vector for CBC mode, NULL for ECB mode + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_twofish_crypt(struct AVTWOFISH *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt); + +/** + * @} + */ +#endif /* AVUTIL_TWOFISH_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tx.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tx.h new file mode 100644 index 0000000..b1f2d96 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/tx.h @@ -0,0 +1,81 @@ +/* + * 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 + */ + +#ifndef AVUTIL_TX_H +#define AVUTIL_TX_H + +#include +#include + +typedef struct AVTXContext AVTXContext; + +typedef struct AVComplexFloat { + float re, im; +} AVComplexFloat; + +enum AVTXType { + /** + * Standard complex to complex FFT with sample data type AVComplexFloat. + * Scaling currently unsupported + */ + AV_TX_FLOAT_FFT = 0, + /** + * Standard MDCT with sample data type of float and a scale type of + * float. Length is the frame size, not the window size (which is 2x frame) + */ + AV_TX_FLOAT_MDCT = 1, +}; + +/** + * Function pointer to a function to perform the transform. + * + * @note Using a different context than the one allocated during av_tx_init() + * is not allowed. + * + * @param s the transform context + * @param out the output array + * @param in the input array + * @param stride the input or output stride (depending on transform direction) + * in bytes, currently implemented for all MDCT transforms + */ +typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride); + +/** + * Initialize a transform context with the given configuration + * Currently power of two lengths from 4 to 131072 are supported, along with + * any length decomposable to a power of two and either 3, 5 or 15. + * + * @param ctx the context to allocate, will be NULL on error + * @param tx pointer to the transform function pointer to set + * @param type type the type of transform + * @param inv whether to do an inverse or a forward transform + * @param len the size of the transform in samples + * @param scale pointer to the value to scale the output if supported by type + * @param flags currently unused + * + * @return 0 on success, negative error code on failure + */ +int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, + int inv, int len, const void *scale, uint64_t flags); + +/** + * Frees a context and sets ctx to NULL, does nothing when ctx == NULL + */ +void av_tx_uninit(AVTXContext **ctx); + +#endif /* AVUTIL_TX_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/version.h new file mode 100644 index 0000000..24ca8ab --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/version.h @@ -0,0 +1,139 @@ +/* + * copyright (c) 2003 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 + * @ingroup lavu + * Libavutil version macros + */ + +#ifndef AVUTIL_VERSION_H +#define AVUTIL_VERSION_H + +#include "macros.h" + +/** + * @addtogroup version_utils + * + * Useful to check and match library version in order to maintain + * backward compatibility. + * + * The FFmpeg libraries follow a versioning sheme very similar to + * Semantic Versioning (http://semver.org/) + * The difference is that the component called PATCH is called MICRO in FFmpeg + * and its value is reset to 100 instead of 0 to keep it above or equal to 100. + * Also we do not increase MICRO for every bugfix or change in git master. + * + * Prior to FFmpeg 3.2 point releases did not change any lib version number to + * avoid aliassing different git master checkouts. + * Starting with FFmpeg 3.2, the released library versions will occupy + * a separate MAJOR.MINOR that is not used on the master development branch. + * That is if we branch a release of master 55.10.123 we will bump to 55.11.100 + * for the release and master will continue at 55.12.100 after it. Each new + * point release will then bump the MICRO improving the usefulness of the lib + * versions. + * + * @{ + */ + +#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c)) +#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c +#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) + +/** + * Extract version components from the full ::AV_VERSION_INT int as returned + * by functions like ::avformat_version() and ::avcodec_version() + */ +#define AV_VERSION_MAJOR(a) ((a) >> 16) +#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8) +#define AV_VERSION_MICRO(a) ((a) & 0xFF) + +/** + * @} + */ + +/** + * @defgroup lavu_ver Version and Build diagnostics + * + * Macros and function useful to check at compiletime and at runtime + * which version of libavutil is in use. + * + * @{ + */ + +#define LIBAVUTIL_VERSION_MAJOR 56 +#define LIBAVUTIL_VERSION_MINOR 31 +#define LIBAVUTIL_VERSION_MICRO 100 + +#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \ + LIBAVUTIL_VERSION_MINOR, \ + LIBAVUTIL_VERSION_MICRO) +#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT + +#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION) + +/** + * @defgroup lavu_depr_guards Deprecation Guards + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + * + * @note, when bumping the major version it is recommended to manually + * disable each FF_API_* in its own commit instead of disabling them all + * at once through the bump. This improves the git bisect-ability of the change. + * + * @{ + */ + +#ifndef FF_API_VAAPI +#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_FRAME_QP +#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PLUS1_MINUS1 +#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_ERROR_FRAME +#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PKT_PTS +#define FF_API_PKT_PTS (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_CRYPTO_SIZE_T +#define FF_API_CRYPTO_SIZE_T (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_FRAME_GET_SET +#define FF_API_FRAME_GET_SET (LIBAVUTIL_VERSION_MAJOR < 57) +#endif +#ifndef FF_API_PSEUDOPAL +#define FF_API_PSEUDOPAL (LIBAVUTIL_VERSION_MAJOR < 57) +#endif + + +/** + * @} + * @} + */ + +#endif /* AVUTIL_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/xtea.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/xtea.h new file mode 100644 index 0000000..735427c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libavutil/xtea.h @@ -0,0 +1,94 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * 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 + */ + +#ifndef AVUTIL_XTEA_H +#define AVUTIL_XTEA_H + +#include + +/** + * @file + * @brief Public header for libavutil XTEA algorithm + * @defgroup lavu_xtea XTEA + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVXTEA { + uint32_t key[16]; +} AVXTEA; + +/** + * Allocate an AVXTEA context. + */ +AVXTEA *av_xtea_alloc(void); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as big endian 32 bit numbers + */ +void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Initialize an AVXTEA context. + * + * @param ctx an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption, + * interpreted as little endian 32 bit numbers + */ +void av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in big endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context, + * in little endian format. + * + * @param ctx an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_XTEA_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/postprocess.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/postprocess.h new file mode 100644 index 0000000..348ee7c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/postprocess.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2001-2003 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 + */ + +#ifndef POSTPROC_POSTPROCESS_H +#define POSTPROC_POSTPROCESS_H + +/** + * @file + * @ingroup lpp + * external API header + */ + +/** + * @defgroup lpp libpostproc + * Video postprocessing library. + * + * @{ + */ + +#include "libpostproc/version.h" + +/** + * Return the LIBPOSTPROC_VERSION_INT constant. + */ +unsigned postproc_version(void); + +/** + * Return the libpostproc build-time configuration. + */ +const char *postproc_configuration(void); + +/** + * Return the libpostproc license. + */ +const char *postproc_license(void); + +#define PP_QUALITY_MAX 6 + +#include + +typedef void pp_context; +typedef void pp_mode; + +#if LIBPOSTPROC_VERSION_INT < (52<<16) +typedef pp_context pp_context_t; +typedef pp_mode pp_mode_t; +extern const char *const pp_help; ///< a simple help text +#else +extern const char pp_help[]; ///< a simple help text +#endif + +void pp_postprocess(const uint8_t * src[3], const int srcStride[3], + uint8_t * dst[3], const int dstStride[3], + int horizontalSize, int verticalSize, + const int8_t *QP_store, int QP_stride, + pp_mode *mode, pp_context *ppContext, int pict_type); + + +/** + * Return a pp_mode or NULL if an error occurred. + * + * @param name the string after "-pp" on the command line + * @param quality a number from 0 to PP_QUALITY_MAX + */ +pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality); +void pp_free_mode(pp_mode *mode); + +pp_context *pp_get_context(int width, int height, int flags); +void pp_free_context(pp_context *ppContext); + +#define PP_CPU_CAPS_MMX 0x80000000 +#define PP_CPU_CAPS_MMX2 0x20000000 +#define PP_CPU_CAPS_3DNOW 0x40000000 +#define PP_CPU_CAPS_ALTIVEC 0x10000000 +#define PP_CPU_CAPS_AUTO 0x00080000 + +#define PP_FORMAT 0x00000008 +#define PP_FORMAT_420 (0x00000011|PP_FORMAT) +#define PP_FORMAT_422 (0x00000001|PP_FORMAT) +#define PP_FORMAT_411 (0x00000002|PP_FORMAT) +#define PP_FORMAT_444 (0x00000000|PP_FORMAT) +#define PP_FORMAT_440 (0x00000010|PP_FORMAT) + +#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale + +/** + * @} + */ + +#endif /* POSTPROC_POSTPROCESS_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/version.h new file mode 100644 index 0000000..fa6d12c --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libpostproc/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * 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 + */ + +#ifndef POSTPROC_VERSION_H +#define POSTPROC_VERSION_H + +/** + * @file + * Libpostproc version macros + */ + +#include "libavutil/avutil.h" + +#define LIBPOSTPROC_VERSION_MAJOR 55 +#define LIBPOSTPROC_VERSION_MINOR 5 +#define LIBPOSTPROC_VERSION_MICRO 100 + +#define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_VERSION AV_VERSION(LIBPOSTPROC_VERSION_MAJOR, \ + LIBPOSTPROC_VERSION_MINOR, \ + LIBPOSTPROC_VERSION_MICRO) +#define LIBPOSTPROC_BUILD LIBPOSTPROC_VERSION_INT + +#define LIBPOSTPROC_IDENT "postproc" AV_STRINGIFY(LIBPOSTPROC_VERSION) + +#endif /* POSTPROC_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/swresample.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/swresample.h new file mode 100644 index 0000000..c7b84fb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/swresample.h @@ -0,0 +1,579 @@ +/* + * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_SWRESAMPLE_H +#define SWRESAMPLE_SWRESAMPLE_H + +/** + * @file + * @ingroup lswr + * libswresample public header + */ + +/** + * @defgroup lswr libswresample + * @{ + * + * Audio resampling, sample format conversion and mixing library. + * + * Interaction with lswr is done through SwrContext, which is + * allocated with swr_alloc() or swr_alloc_set_opts(). It is opaque, so all parameters + * must be set with the @ref avoptions API. + * + * The first thing you will need to do in order to use lswr is to allocate + * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts(). If you + * are using the former, you must set options through the @ref avoptions API. + * The latter function provides the same feature, but it allows you to set some + * common options in the same statement. + * + * For example the following code will setup conversion from planar float sample + * format to interleaved signed 16-bit integer, downsampling from 48kHz to + * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing + * matrix). This is using the swr_alloc() function. + * @code + * SwrContext *swr = swr_alloc(); + * av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); + * av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + * av_opt_set_int(swr, "in_sample_rate", 48000, 0); + * av_opt_set_int(swr, "out_sample_rate", 44100, 0); + * av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); + * av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + * @endcode + * + * The same job can be done using swr_alloc_set_opts() as well: + * @code + * SwrContext *swr = swr_alloc_set_opts(NULL, // we're allocating a new context + * AV_CH_LAYOUT_STEREO, // out_ch_layout + * AV_SAMPLE_FMT_S16, // out_sample_fmt + * 44100, // out_sample_rate + * AV_CH_LAYOUT_5POINT1, // in_ch_layout + * AV_SAMPLE_FMT_FLTP, // in_sample_fmt + * 48000, // in_sample_rate + * 0, // log_offset + * NULL); // log_ctx + * @endcode + * + * Once all values have been set, it must be initialized with swr_init(). If + * you need to change the conversion parameters, you can change the parameters + * using @ref AVOptions, as described above in the first example; or by using + * swr_alloc_set_opts(), but with the first argument the allocated context. + * You must then call swr_init() again. + * + * The conversion itself is done by repeatedly calling swr_convert(). + * Note that the samples may get buffered in swr if you provide insufficient + * output space or if sample rate conversion is done, which requires "future" + * samples. Samples that do not require future input can be retrieved at any + * time by using swr_convert() (in_count can be set to 0). + * At the end of conversion the resampling buffer can be flushed by calling + * swr_convert() with NULL in and 0 in_count. + * + * The samples used in the conversion process can be managed with the libavutil + * @ref lavu_sampmanip "samples manipulation" API, including av_samples_alloc() + * function used in the following example. + * + * The delay between input and output, can at any time be found by using + * swr_get_delay(). + * + * The following code demonstrates the conversion loop assuming the parameters + * from above and caller-defined functions get_input() and handle_output(): + * @code + * uint8_t **input; + * int in_samples; + * + * while (get_input(&input, &in_samples)) { + * uint8_t *output; + * int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) + + * in_samples, 44100, 48000, AV_ROUND_UP); + * av_samples_alloc(&output, NULL, 2, out_samples, + * AV_SAMPLE_FMT_S16, 0); + * out_samples = swr_convert(swr, &output, out_samples, + * input, in_samples); + * handle_output(output, out_samples); + * av_freep(&output); + * } + * @endcode + * + * When the conversion is finished, the conversion + * context and everything associated with it must be freed with swr_free(). + * A swr_close() function is also available, but it exists mainly for + * compatibility with libavresample, and is not required to be called. + * + * There will be no memory leak if the data is not completely flushed before + * swr_free(). + */ + +#include +#include "libavutil/channel_layout.h" +#include "libavutil/frame.h" +#include "libavutil/samplefmt.h" + +#include "libswresample/version.h" + +/** + * @name Option constants + * These constants are used for the @ref avoptions interface for lswr. + * @{ + * + */ + +#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate +//TODO use int resample ? +//long term TODO can we enable this dynamically? + +/** Dithering algorithms */ +enum SwrDitherType { + SWR_DITHER_NONE = 0, + SWR_DITHER_RECTANGULAR, + SWR_DITHER_TRIANGULAR, + SWR_DITHER_TRIANGULAR_HIGHPASS, + + SWR_DITHER_NS = 64, ///< not part of API/ABI + SWR_DITHER_NS_LIPSHITZ, + SWR_DITHER_NS_F_WEIGHTED, + SWR_DITHER_NS_MODIFIED_E_WEIGHTED, + SWR_DITHER_NS_IMPROVED_E_WEIGHTED, + SWR_DITHER_NS_SHIBATA, + SWR_DITHER_NS_LOW_SHIBATA, + SWR_DITHER_NS_HIGH_SHIBATA, + SWR_DITHER_NB, ///< not part of API/ABI +}; + +/** Resampling Engines */ +enum SwrEngine { + SWR_ENGINE_SWR, /**< SW Resampler */ + SWR_ENGINE_SOXR, /**< SoX Resampler */ + SWR_ENGINE_NB, ///< not part of API/ABI +}; + +/** Resampling Filter Types */ +enum SwrFilterType { + SWR_FILTER_TYPE_CUBIC, /**< Cubic */ + SWR_FILTER_TYPE_BLACKMAN_NUTTALL, /**< Blackman Nuttall windowed sinc */ + SWR_FILTER_TYPE_KAISER, /**< Kaiser windowed sinc */ +}; + +/** + * @} + */ + +/** + * The libswresample context. Unlike libavcodec and libavformat, this structure + * is opaque. This means that if you would like to set options, you must use + * the @ref avoptions API and cannot directly set values to members of the + * structure. + */ +typedef struct SwrContext SwrContext; + +/** + * Get the AVClass for SwrContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + * @return the AVClass of SwrContext + */ +const AVClass *swr_get_class(void); + +/** + * @name SwrContext constructor functions + * @{ + */ + +/** + * Allocate SwrContext. + * + * If you use this function you will need to set the parameters (manually or + * with swr_alloc_set_opts()) before calling swr_init(). + * + * @see swr_alloc_set_opts(), swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc(void); + +/** + * Initialize context after user parameters have been set. + * @note The context must be configured using the AVOption API. + * + * @see av_opt_set_int() + * @see av_opt_set_dict() + * + * @param[in,out] s Swr context to initialize + * @return AVERROR error code in case of failure. + */ +int swr_init(struct SwrContext *s); + +/** + * Check whether an swr context has been initialized or not. + * + * @param[in] s Swr context to check + * @see swr_init() + * @return positive if it has been initialized, 0 if not initialized + */ +int swr_is_initialized(struct SwrContext *s); + +/** + * Allocate SwrContext if needed and set/reset common parameters. + * + * This function does not require s to be allocated with swr_alloc(). On the + * other hand, swr_alloc() can use swr_alloc_set_opts() to set the parameters + * on the allocated context. + * + * @param s existing Swr context if available, or NULL if not + * @param out_ch_layout output channel layout (AV_CH_LAYOUT_*) + * @param out_sample_fmt output sample format (AV_SAMPLE_FMT_*). + * @param out_sample_rate output sample rate (frequency in Hz) + * @param in_ch_layout input channel layout (AV_CH_LAYOUT_*) + * @param in_sample_fmt input sample format (AV_SAMPLE_FMT_*). + * @param in_sample_rate input sample rate (frequency in Hz) + * @param log_offset logging level offset + * @param log_ctx parent logging context, can be NULL + * + * @see swr_init(), swr_free() + * @return NULL on error, allocated context otherwise + */ +struct SwrContext *swr_alloc_set_opts(struct SwrContext *s, + int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, + int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, + int log_offset, void *log_ctx); + +/** + * @} + * + * @name SwrContext destructor functions + * @{ + */ + +/** + * Free the given SwrContext and set the pointer to NULL. + * + * @param[in] s a pointer to a pointer to Swr context + */ +void swr_free(struct SwrContext **s); + +/** + * Closes the context so that swr_is_initialized() returns 0. + * + * The context can be brought back to life by running swr_init(), + * swr_init() can also be used without swr_close(). + * This function is mainly provided for simplifying the usecase + * where one tries to support libavresample and libswresample. + * + * @param[in,out] s Swr context to be closed + */ +void swr_close(struct SwrContext *s); + +/** + * @} + * + * @name Core conversion functions + * @{ + */ + +/** Convert audio. + * + * in and in_count can be set to 0 to flush the last few samples out at the + * end. + * + * If more input is provided than output space, then the input will be buffered. + * You can avoid this buffering by using swr_get_out_samples() to retrieve an + * upper bound on the required number of output samples for the given number of + * input samples. Conversion will run directly without copying whenever possible. + * + * @param s allocated Swr context, with parameters set + * @param out output buffers, only the first one need be set in case of packed audio + * @param out_count amount of space available for output in samples per channel + * @param in input buffers, only the first one need to be set in case of packed audio + * @param in_count number of input samples available in one channel + * + * @return number of samples output per channel, negative value on error + */ +int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, + const uint8_t **in , int in_count); + +/** + * Convert the next timestamp from input to output + * timestamps are in 1/(in_sample_rate * out_sample_rate) units. + * + * @note There are 2 slightly differently behaving modes. + * @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX) + * in this case timestamps will be passed through with delays compensated + * @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX) + * in this case the output timestamps will match output sample numbers. + * See ffmpeg-resampler(1) for the two modes of compensation. + * + * @param s[in] initialized Swr context + * @param pts[in] timestamp for the next input sample, INT64_MIN if unknown + * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are + * function used internally for timestamp compensation. + * @return the output timestamp for the next output sample + */ +int64_t swr_next_pts(struct SwrContext *s, int64_t pts); + +/** + * @} + * + * @name Low-level option setting functions + * These functons provide a means to set low-level options that is not possible + * with the AVOption API. + * @{ + */ + +/** + * Activate resampling compensation ("soft" compensation). This function is + * internally called when needed in swr_next_pts(). + * + * @param[in,out] s allocated Swr context. If it is not initialized, + * or SWR_FLAG_RESAMPLE is not set, swr_init() is + * called with the flag set. + * @param[in] sample_delta delta in PTS per sample + * @param[in] compensation_distance number of samples to compensate for + * @return >= 0 on success, AVERROR error codes if: + * @li @c s is NULL, + * @li @c compensation_distance is less than 0, + * @li @c compensation_distance is 0 but sample_delta is not, + * @li compensation unsupported by resampler, or + * @li swr_init() fails when called. + */ +int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance); + +/** + * Set a customized input channel mapping. + * + * @param[in,out] s allocated Swr context, not yet initialized + * @param[in] channel_map customized input channel mapping (array of channel + * indexes, -1 for a muted channel) + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map); + +/** + * Generate a channel mixing matrix. + * + * This function is the one used internally by libswresample for building the + * default mixing matrix. It is made public just as a utility function for + * building custom matrices. + * + * @param in_layout input channel layout + * @param out_layout output channel layout + * @param center_mix_level mix level for the center channel + * @param surround_mix_level mix level for the surround channel(s) + * @param lfe_mix_level mix level for the low-frequency effects channel + * @param rematrix_maxval if 1.0, coefficients will be normalized to prevent + * overflow. if INT_MAX, coefficients will not be + * normalized. + * @param[out] matrix mixing coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o. + * @param stride distance between adjacent input channels in the + * matrix array + * @param matrix_encoding matrixed stereo downmix mode (e.g. dplii) + * @param log_ctx parent logging context, can be NULL + * @return 0 on success, negative AVERROR code on failure + */ +int swr_build_matrix(uint64_t in_layout, uint64_t out_layout, + double center_mix_level, double surround_mix_level, + double lfe_mix_level, double rematrix_maxval, + double rematrix_volume, double *matrix, + int stride, enum AVMatrixEncoding matrix_encoding, + void *log_ctx); + +/** + * Set a customized remix matrix. + * + * @param s allocated Swr context, not yet initialized + * @param matrix remix coefficients; matrix[i + stride * o] is + * the weight of input channel i in output channel o + * @param stride offset between lines of the matrix + * @return >= 0 on success, or AVERROR error code in case of failure. + */ +int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride); + +/** + * @} + * + * @name Sample handling functions + * @{ + */ + +/** + * Drops the specified number of output samples. + * + * This function, along with swr_inject_silence(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_drop_output(struct SwrContext *s, int count); + +/** + * Injects the specified number of silence samples. + * + * This function, along with swr_drop_output(), is called by swr_next_pts() + * if needed for "hard" compensation. + * + * @param s allocated Swr context + * @param count number of samples to be dropped + * + * @return >= 0 on success, or a negative AVERROR code on failure + */ +int swr_inject_silence(struct SwrContext *s, int count); + +/** + * Gets the delay the next input sample will experience relative to the next output sample. + * + * Swresample can buffer data if more input has been provided than available + * output space, also converting between sample rates needs a delay. + * This function returns the sum of all such delays. + * The exact delay is not necessarily an integer value in either input or + * output sample rate. Especially when downsampling by a large value, the + * output sample rate may be a poor choice to represent the delay, similarly + * for upsampling and the input sample rate. + * + * @param s swr context + * @param base timebase in which the returned delay will be: + * @li if it's set to 1 the returned delay is in seconds + * @li if it's set to 1000 the returned delay is in milliseconds + * @li if it's set to the input sample rate then the returned + * delay is in input samples + * @li if it's set to the output sample rate then the returned + * delay is in output samples + * @li if it's the least common multiple of in_sample_rate and + * out_sample_rate then an exact rounding-free delay will be + * returned + * @returns the delay in 1 / @c base units. + */ +int64_t swr_get_delay(struct SwrContext *s, int64_t base); + +/** + * Find an upper bound on the number of samples that the next swr_convert + * call will output, if called with in_samples of input samples. This + * depends on the internal state, and anything changing the internal state + * (like further swr_convert() calls) will may change the number of samples + * swr_get_out_samples() returns for the same number of input samples. + * + * @param in_samples number of input samples. + * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts() + * or swr_set_compensation() invalidates this limit + * @note it is recommended to pass the correct available buffer size + * to all functions like swr_convert() even if swr_get_out_samples() + * indicates that less would be used. + * @returns an upper bound on the number of samples that the next swr_convert + * will output or a negative value to indicate an error + */ +int swr_get_out_samples(struct SwrContext *s, int in_samples); + +/** + * @} + * + * @name Configuration accessors + * @{ + */ + +/** + * Return the @ref LIBSWRESAMPLE_VERSION_INT constant. + * + * This is useful to check if the build-time libswresample has the same version + * as the run-time one. + * + * @returns the unsigned int-typed version + */ +unsigned swresample_version(void); + +/** + * Return the swr build-time configuration. + * + * @returns the build-time @c ./configure flags + */ +const char *swresample_configuration(void); + +/** + * Return the swr license. + * + * @returns the license of libswresample, determined at build-time + */ +const char *swresample_license(void); + +/** + * @} + * + * @name AVFrame based API + * @{ + */ + +/** + * Convert the samples in the input AVFrame and write them to the output AVFrame. + * + * Input and output AVFrames must have channel_layout, sample_rate and format set. + * + * If the output AVFrame does not have the data pointers allocated the nb_samples + * field will be set using av_frame_get_buffer() + * is called to allocate the frame. + * + * The output AVFrame can be NULL or have fewer allocated samples than required. + * In this case, any remaining samples not written to the output will be added + * to an internal FIFO buffer, to be returned at the next call to this function + * or to swr_convert(). + * + * If converting sample rate, there may be data remaining in the internal + * resampling delay buffer. swr_get_delay() tells the number of + * remaining samples. To get this data as output, call this function or + * swr_convert() with NULL input. + * + * If the SwrContext configuration does not match the output and + * input AVFrame settings the conversion does not take place and depending on + * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED + * or the result of a bitwise-OR of them is returned. + * + * @see swr_delay() + * @see swr_convert() + * @see swr_get_delay() + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure or nonmatching + * configuration. + */ +int swr_convert_frame(SwrContext *swr, + AVFrame *output, const AVFrame *input); + +/** + * Configure or reconfigure the SwrContext using the information + * provided by the AVFrames. + * + * The original resampling context is reset even on failure. + * The function calls swr_close() internally if the context is open. + * + * @see swr_close(); + * + * @param swr audio resample context + * @param output output AVFrame + * @param input input AVFrame + * @return 0 on success, AVERROR on failure. + */ +int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in); + +/** + * @} + * @} + */ + +#endif /* SWRESAMPLE_SWRESAMPLE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/version.h new file mode 100644 index 0000000..a0b361b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswresample/version.h @@ -0,0 +1,45 @@ +/* + * Version macros. + * + * This file is part of libswresample + * + * libswresample 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. + * + * libswresample 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 libswresample; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SWRESAMPLE_VERSION_H +#define SWRESAMPLE_VERSION_H + +/** + * @file + * Libswresample version macros + */ + +#include "libavutil/avutil.h" + +#define LIBSWRESAMPLE_VERSION_MAJOR 3 +#define LIBSWRESAMPLE_VERSION_MINOR 5 +#define LIBSWRESAMPLE_VERSION_MICRO 100 + +#define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_VERSION AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \ + LIBSWRESAMPLE_VERSION_MINOR, \ + LIBSWRESAMPLE_VERSION_MICRO) +#define LIBSWRESAMPLE_BUILD LIBSWRESAMPLE_VERSION_INT + +#define LIBSWRESAMPLE_IDENT "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION) + +#endif /* SWRESAMPLE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/swscale.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/swscale.h new file mode 100644 index 0000000..7713f51 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/swscale.h @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2001-2011 Michael Niedermayer + * + * 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 + */ + +#ifndef SWSCALE_SWSCALE_H +#define SWSCALE_SWSCALE_H + +/** + * @file + * @ingroup libsws + * external API header + */ + +#include + +#include "libavutil/avutil.h" +#include "libavutil/log.h" +#include "libavutil/pixfmt.h" +#include "version.h" + +/** + * @defgroup libsws libswscale + * Color conversion and scaling library. + * + * @{ + * + * Return the LIBSWSCALE_VERSION_INT constant. + */ +unsigned swscale_version(void); + +/** + * Return the libswscale build-time configuration. + */ +const char *swscale_configuration(void); + +/** + * Return the libswscale license. + */ +const char *swscale_license(void); + +/* values for the flags, the stuff on the command line is different */ +#define SWS_FAST_BILINEAR 1 +#define SWS_BILINEAR 2 +#define SWS_BICUBIC 4 +#define SWS_X 8 +#define SWS_POINT 0x10 +#define SWS_AREA 0x20 +#define SWS_BICUBLIN 0x40 +#define SWS_GAUSS 0x80 +#define SWS_SINC 0x100 +#define SWS_LANCZOS 0x200 +#define SWS_SPLINE 0x400 + +#define SWS_SRC_V_CHR_DROP_MASK 0x30000 +#define SWS_SRC_V_CHR_DROP_SHIFT 16 + +#define SWS_PARAM_DEFAULT 123456 + +#define SWS_PRINT_INFO 0x1000 + +//the following 3 flags are not completely implemented +//internal chrominance subsampling info +#define SWS_FULL_CHR_H_INT 0x2000 +//input subsampling info +#define SWS_FULL_CHR_H_INP 0x4000 +#define SWS_DIRECT_BGR 0x8000 +#define SWS_ACCURATE_RND 0x40000 +#define SWS_BITEXACT 0x80000 +#define SWS_ERROR_DIFFUSION 0x800000 + +#define SWS_MAX_REDUCE_CUTOFF 0.002 + +#define SWS_CS_ITU709 1 +#define SWS_CS_FCC 4 +#define SWS_CS_ITU601 5 +#define SWS_CS_ITU624 5 +#define SWS_CS_SMPTE170M 5 +#define SWS_CS_SMPTE240M 7 +#define SWS_CS_DEFAULT 5 +#define SWS_CS_BT2020 9 + +/** + * Return a pointer to yuv<->rgb coefficients for the given colorspace + * suitable for sws_setColorspaceDetails(). + * + * @param colorspace One of the SWS_CS_* macros. If invalid, + * SWS_CS_DEFAULT is used. + */ +const int *sws_getCoefficients(int colorspace); + +// when used for filters they must have an odd number of elements +// coeffs cannot be shared between vectors +typedef struct SwsVector { + double *coeff; ///< pointer to the list of coefficients + int length; ///< number of coefficients in the vector +} SwsVector; + +// vectors can be shared +typedef struct SwsFilter { + SwsVector *lumH; + SwsVector *lumV; + SwsVector *chrH; + SwsVector *chrV; +} SwsFilter; + +struct SwsContext; + +/** + * Return a positive value if pix_fmt is a supported input format, 0 + * otherwise. + */ +int sws_isSupportedInput(enum AVPixelFormat pix_fmt); + +/** + * Return a positive value if pix_fmt is a supported output format, 0 + * otherwise. + */ +int sws_isSupportedOutput(enum AVPixelFormat pix_fmt); + +/** + * @param[in] pix_fmt the pixel format + * @return a positive value if an endianness conversion for pix_fmt is + * supported, 0 otherwise. + */ +int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt); + +/** + * Allocate an empty SwsContext. This must be filled and passed to + * sws_init_context(). For filling see AVOptions, options.c and + * sws_setColorspaceDetails(). + */ +struct SwsContext *sws_alloc_context(void); + +/** + * Initialize the swscaler context sws_context. + * + * @return zero or positive value on success, a negative value on + * error + */ +av_warn_unused_result +int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter); + +/** + * Free the swscaler context swsContext. + * If swsContext is NULL, then does nothing. + */ +void sws_freeContext(struct SwsContext *swsContext); + +/** + * Allocate and return an SwsContext. You need it to perform + * scaling/conversion operations using sws_scale(). + * + * @param srcW the width of the source image + * @param srcH the height of the source image + * @param srcFormat the source image format + * @param dstW the width of the destination image + * @param dstH the height of the destination image + * @param dstFormat the destination image format + * @param flags specify which algorithm and options to use for rescaling + * @param param extra parameters to tune the used scaler + * For SWS_BICUBIC param[0] and [1] tune the shape of the basis + * function, param[0] tunes f(1) and param[1] f´(1) + * For SWS_GAUSS param[0] tunes the exponent and thus cutoff + * frequency + * For SWS_LANCZOS param[0] tunes the width of the window function + * @return a pointer to an allocated context, or NULL in case of error + * @note this function is to be removed after a saner alternative is + * written + */ +struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Scale the image slice in srcSlice and put the resulting scaled + * slice in the image in dst. A slice is a sequence of consecutive + * rows in an image. + * + * Slices have to be provided in sequential order, either in + * top-bottom or bottom-top order. If slices are provided in + * non-sequential order the behavior of the function is undefined. + * + * @param c the scaling context previously created with + * sws_getContext() + * @param srcSlice the array containing the pointers to the planes of + * the source slice + * @param srcStride the array containing the strides for each plane of + * the source image + * @param srcSliceY the position in the source image of the slice to + * process, that is the number (counted starting from + * zero) in the image of the first row of the slice + * @param srcSliceH the height of the source slice, that is the number + * of rows in the slice + * @param dst the array containing the pointers to the planes of + * the destination image + * @param dstStride the array containing the strides for each plane of + * the destination image + * @return the height of the output slice + */ +int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], + const int srcStride[], int srcSliceY, int srcSliceH, + uint8_t *const dst[], const int dstStride[]); + +/** + * @param dstRange flag indicating the while-black range of the output (1=jpeg / 0=mpeg) + * @param srcRange flag indicating the while-black range of the input (1=jpeg / 0=mpeg) + * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x] + * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x] + * @param brightness 16.16 fixed point brightness correction + * @param contrast 16.16 fixed point contrast correction + * @param saturation 16.16 fixed point saturation correction + * @return -1 if not supported + */ +int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], + int srcRange, const int table[4], int dstRange, + int brightness, int contrast, int saturation); + +/** + * @return -1 if not supported + */ +int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, + int *srcRange, int **table, int *dstRange, + int *brightness, int *contrast, int *saturation); + +/** + * Allocate and return an uninitialized vector with length coefficients. + */ +SwsVector *sws_allocVec(int length); + +/** + * Return a normalized Gaussian curve used to filter stuff + * quality = 3 is high quality, lower is lower quality. + */ +SwsVector *sws_getGaussianVec(double variance, double quality); + +/** + * Scale all the coefficients of a by the scalar value. + */ +void sws_scaleVec(SwsVector *a, double scalar); + +/** + * Scale all the coefficients of a so that their sum equals height. + */ +void sws_normalizeVec(SwsVector *a, double height); + +#if FF_API_SWS_VECTOR +attribute_deprecated SwsVector *sws_getConstVec(double c, int length); +attribute_deprecated SwsVector *sws_getIdentityVec(void); +attribute_deprecated void sws_convVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_addVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_subVec(SwsVector *a, SwsVector *b); +attribute_deprecated void sws_shiftVec(SwsVector *a, int shift); +attribute_deprecated SwsVector *sws_cloneVec(SwsVector *a); +attribute_deprecated void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level); +#endif + +void sws_freeVec(SwsVector *a); + +SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur, + float lumaSharpen, float chromaSharpen, + float chromaHShift, float chromaVShift, + int verbose); +void sws_freeFilter(SwsFilter *filter); + +/** + * Check if context can be reused, otherwise reallocate a new one. + * + * If context is NULL, just calls sws_getContext() to get a new + * context. Otherwise, checks if the parameters are the ones already + * saved in context. If that is the case, returns the current + * context. Otherwise, frees context and gets a new context with + * the new parameters. + * + * Be warned that srcFilter and dstFilter are not checked, they + * are assumed to remain the same. + */ +struct SwsContext *sws_getCachedContext(struct SwsContext *context, + int srcW, int srcH, enum AVPixelFormat srcFormat, + int dstW, int dstH, enum AVPixelFormat dstFormat, + int flags, SwsFilter *srcFilter, + SwsFilter *dstFilter, const double *param); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 32 bits. + * + * The output frame will have the same packed format as the palette. + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Convert an 8-bit paletted frame into a frame with a color depth of 24 bits. + * + * With the palette format "ABCD", the destination frame ends up with the format "ABC". + * + * @param src source frame buffer + * @param dst destination frame buffer + * @param num_pixels number of pixels to convert + * @param palette array with [256] entries, which must match color arrangement (RGB or BGR) of src + */ +void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette); + +/** + * Get the AVClass for swsContext. It can be used in combination with + * AV_OPT_SEARCH_FAKE_OBJ for examining options. + * + * @see av_opt_find(). + */ +const AVClass *sws_get_class(void); + +/** + * @} + */ + +#endif /* SWSCALE_SWSCALE_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/version.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/version.h new file mode 100644 index 0000000..acb289d --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/libswscale/version.h @@ -0,0 +1,53 @@ +/* + * 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 + */ + +#ifndef SWSCALE_VERSION_H +#define SWSCALE_VERSION_H + +/** + * @file + * swscale version macros + */ + +#include "libavutil/version.h" + +#define LIBSWSCALE_VERSION_MAJOR 5 +#define LIBSWSCALE_VERSION_MINOR 5 +#define LIBSWSCALE_VERSION_MICRO 100 + +#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_VERSION AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \ + LIBSWSCALE_VERSION_MINOR, \ + LIBSWSCALE_VERSION_MICRO) +#define LIBSWSCALE_BUILD LIBSWSCALE_VERSION_INT + +#define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) + +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + +#ifndef FF_API_SWS_VECTOR +#define FF_API_SWS_VECTOR (LIBSWSCALE_VERSION_MAJOR < 6) +#endif + +#endif /* SWSCALE_VERSION_H */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxdefs.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxdefs.h new file mode 100644 index 0000000..c2cb52a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxdefs.h @@ -0,0 +1,112 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxdefs.h + +\* ****************************************************************************** */ +#ifndef __MFXDEFS_H__ +#define __MFXDEFS_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if defined( _WIN32 ) || defined ( _WIN64 ) + #define __INT64 __int64 + #define __UINT64 unsigned __int64 +#else + #define __INT64 long long + #define __UINT64 unsigned long long +#endif + +#define MFX_INFINITE 0xFFFFFFFF + +typedef unsigned char mfxU8; +typedef char mfxI8; +typedef short mfxI16; +typedef unsigned short mfxU16; +typedef unsigned int mfxU32; +typedef int mfxI32; +#if defined( _WIN32 ) || defined ( _WIN64 ) +typedef unsigned long mfxUL32; +typedef long mfxL32; +#else +typedef unsigned int mfxUL32; +typedef int mfxL32; +#endif +typedef float mfxF32; +typedef double mfxF64; +typedef __UINT64 mfxU64; +typedef __INT64 mfxI64; +typedef void* mfxHDL; +typedef mfxHDL mfxMemId; +typedef void* mfxThreadTask; + +typedef struct { + mfxI16 x; + mfxI16 y; +} mfxI16Pair; + +typedef struct { + mfxHDL first; + mfxHDL second; +} mfxHDLPair; + + +/*********************************************************************************\ +Error message +\*********************************************************************************/ +typedef enum +{ + /* no error */ + MFX_ERR_NONE = 0, /* no error */ + + /* reserved for unexpected errors */ + MFX_ERR_UNKNOWN = -1, /* unknown error. */ + + /* error codes <0 */ + MFX_ERR_NULL_PTR = -2, /* null pointer */ + MFX_ERR_UNSUPPORTED = -3, /* undeveloped feature */ + MFX_ERR_MEMORY_ALLOC = -4, /* failed to allocate memory */ + MFX_ERR_NOT_ENOUGH_BUFFER = -5, /* insufficient buffer at input/output */ + MFX_ERR_INVALID_HANDLE = -6, /* invalid handle */ + MFX_ERR_LOCK_MEMORY = -7, /* failed to lock the memory block */ + MFX_ERR_NOT_INITIALIZED = -8, /* member function called before initialization */ + MFX_ERR_NOT_FOUND = -9, /* the specified object is not found */ + MFX_ERR_MORE_DATA = -10, /* expect more data at input */ + MFX_ERR_MORE_SURFACE = -11, /* expect more surface at output */ + MFX_ERR_ABORTED = -12, /* operation aborted */ + MFX_ERR_DEVICE_LOST = -13, /* lose the HW acceleration device */ + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM = -14, /* incompatible video parameters */ + MFX_ERR_INVALID_VIDEO_PARAM = -15, /* invalid video parameters */ + MFX_ERR_UNDEFINED_BEHAVIOR = -16, /* undefined behavior */ + MFX_ERR_DEVICE_FAILED = -17, /* device operation failure */ + MFX_ERR_MORE_BITSTREAM = -18, /* expect more bitstream buffers at output */ + + /* warnings >0 */ + MFX_WRN_IN_EXECUTION = 1, /* the previous asynchrous operation is in execution */ + MFX_WRN_DEVICE_BUSY = 2, /* the HW acceleration device is busy */ + MFX_WRN_VIDEO_PARAM_CHANGED = 3, /* the video parameters are changed during decoding */ + MFX_WRN_PARTIAL_ACCELERATION = 4, /* SW is used */ + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM = 5, /* incompatible video parameters */ + MFX_WRN_VALUE_NOT_CHANGED = 6, /* the value is saturated based on its valid range */ + MFX_WRN_OUT_OF_RANGE = 7, /* the value is out of valid range */ + + /* threading statuses */ + MFX_TASK_DONE = MFX_ERR_NONE, /* task has been completed */ + MFX_TASK_WORKING = 8, /* there is some more work to do */ + MFX_TASK_BUSY = 9 /* task is waiting for resources */ + +} mfxStatus; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MFXDEFS_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxjpeg.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxjpeg.h new file mode 100644 index 0000000..5b8ab27 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxjpeg.h @@ -0,0 +1,45 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxjpeg.h + +*******************************************************************************/ +#ifndef __MFX_JPEG_H__ +#define __MFX_JPEG_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* CodecId */ +enum { + MFX_CODEC_JPEG = MFX_MAKEFOURCC('J','P','E','G') +}; + +/* CodecProfile, CodecLevel */ +enum +{ + MFX_PROFILE_JPEG_BASELINE = 1 +}; + +enum +{ + MFX_ROTATION_0 = 0, + MFX_ROTATION_90 = 1, + MFX_ROTATION_180 = 2, + MFX_ROTATION_270 = 3 +}; + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif // __MFX_JPEG_H__ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxmvc.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxmvc.h new file mode 100644 index 0000000..af74465 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxmvc.h @@ -0,0 +1,91 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2010 - 2011 Intel Corporation. All Rights Reserved. + +File Name: mfxmvc.h + +*******************************************************************************/ +#ifndef __MFXMVC_H__ +#define __MFXMVC_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* CodecProfile, CodecLevel */ +enum { + /* MVC profiles */ + MFX_PROFILE_AVC_MULTIVIEW_HIGH =118, + MFX_PROFILE_AVC_STEREO_HIGH =128 +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_MVC_SEQ_DESC = MFX_MAKEFOURCC('M','V','C','D'), + MFX_EXTBUFF_MVC_TARGET_VIEWS = MFX_MAKEFOURCC('M','V','C','T') +}; + +typedef struct { + mfxU16 ViewId; + + mfxU16 NumAnchorRefsL0; + mfxU16 NumAnchorRefsL1; + mfxU16 AnchorRefL0[16]; + mfxU16 AnchorRefL1[16]; + + mfxU16 NumNonAnchorRefsL0; + mfxU16 NumNonAnchorRefsL1; + mfxU16 NonAnchorRefL0[16]; + mfxU16 NonAnchorRefL1[16]; +} mfxMVCViewDependency; + +typedef struct { + mfxU16 TemporalId; /* operation point temporal ID */ + mfxU16 LevelIdc; + + mfxU16 NumViews; /* total number of views, including "depend on" views */ + mfxU16 NumTargetViews; /* number of the output views for the current operation point */ + mfxU16 *TargetViewId; /* array of target view ID, it points to mfxExtMVCSeqDesc::ViewId, set by SDK */ +} mfxMVCOperationPoint; + +typedef struct { + mfxExtBuffer Header; + + mfxU32 NumView; /* number of view in the stream, set by SDK */ + mfxU32 NumViewAlloc; /* number of allocated elements, set by application */ + mfxMVCViewDependency *View; /* view ID and list of views used as reference for this view, allocated by application */ + + mfxU32 NumViewId; /* num of views IDs, to simplify copying, set by SDK */ + mfxU32 NumViewIdAlloc; /* number of allocated elements, set by application */ + mfxU16 *ViewId; /* allocated by application */ + + mfxU32 NumOP; /* number of operation points in OP array, set by SDK */ + mfxU32 NumOPAlloc; /* number of allocated elements in OP array, set by application */ + mfxMVCOperationPoint *OP; /* allocated by application */ + + mfxU16 NumRefsTotal; /* total number of reference frames in the sequence */ + mfxU32 Reserved[16]; + +} mfxExtMVCSeqDesc; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 TemporalId; + mfxU32 NumView; /* number of view to decode */ + mfxU16 ViewId[1024]; +} mfxExtMVCTargetViews ; + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin++.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin++.h new file mode 100644 index 0000000..b62c9b9 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin++.h @@ -0,0 +1,55 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2011 Intel Corporation. All Rights Reserved. + + +File Name: mfxplugin++.h + +\* ****************************************************************************** */ + +#ifndef __MFXPLUGINPLUSPLUS_H +#define __MFXPLUGINPLUSPLUS_H + +#include "mfxvideo.h" +#include "mfxplugin.h" + +class MFXPlugin +{ +public: + virtual mfxStatus mfxPluginInit(mfxCoreInterface *core) = 0; + virtual mfxStatus mfxPluginClose() = 0; + virtual mfxStatus mfxGetPluginParam(mfxPluginParam *par) = 0; + virtual mfxStatus mfxSubmit(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) = 0; + virtual mfxStatus mfxExecute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a) = 0; + virtual mfxStatus mfxFreeResources(mfxThreadTask task, mfxStatus sts) = 0; +}; + +/* Class adapter between "C" structure mfxPlugin and C++ interface MFXPlugin */ +class MFXPluginAdapter : public mfxPlugin +{ +public: + MFXPluginAdapter(MFXPlugin *pPlugin) + { + pthis = pPlugin; + PluginInit = MFXPluginAdapter::_PluginInit; + PluginClose = MFXPluginAdapter::_PluginClose; + GetPluginParam = MFXPluginAdapter::_GetPluginParam; + Submit = MFXPluginAdapter::_Submit; + Execute = MFXPluginAdapter::_Execute; + FreeResources = MFXPluginAdapter::_FreeResources; + } + +private: + static mfxStatus _PluginInit(mfxHDL pthis, mfxCoreInterface *core) { return ((MFXPlugin*)pthis)->mfxPluginInit(core); } + static mfxStatus _PluginClose(mfxHDL pthis) { return ((MFXPlugin*)pthis)->mfxPluginClose(); } + static mfxStatus _GetPluginParam(mfxHDL pthis, mfxPluginParam *par) { return ((MFXPlugin*)pthis)->mfxGetPluginParam(par); } + static mfxStatus _Submit(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) { return ((MFXPlugin*)pthis)->mfxSubmit(in, in_num, out, out_num, task); } + static mfxStatus _Execute(mfxHDL pthis, mfxThreadTask task, mfxU32 thread_id, mfxU32 call_count) { return ((MFXPlugin*)pthis)->mfxExecute(task, thread_id, call_count); } + static mfxStatus _FreeResources(mfxHDL pthis, mfxThreadTask task, mfxStatus sts) { return ((MFXPlugin*)pthis)->mfxFreeResources(task, sts); } +}; + +#endif // __MFXPLUGINPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin.h new file mode 100644 index 0000000..bfb7547 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxplugin.h @@ -0,0 +1,90 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2011 Intel Corporation. All Rights Reserved. + +File Name: mfxplugin.h + +*******************************************************************************/ +#ifndef __MFXPLUGIN_H__ +#define __MFXPLUGIN_H__ +#include "mfxvideo.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +typedef enum { + MFX_THREADPOLICY_SERIAL = 0, + MFX_THREADPOLICY_PARALLEL = 1 +} mfxThreadPolicy; + +typedef struct mfxPluginParam { + mfxU32 reserved[14]; + mfxThreadPolicy ThreadPolicy; + mfxU32 MaxThreadNum; +} mfxPluginParam; + +typedef struct mfxCoreParam{ + mfxU32 reserved[13]; + mfxIMPL Impl; + mfxVersion Version; + mfxU32 NumWorkingThread; +} mfxCoreParam; + +typedef struct mfxCoreInterface { + mfxHDL pthis; + + mfxHDL reserved1[2]; + mfxFrameAllocator FrameAllocator; + mfxBufferAllocator reserved3; + + mfxStatus (MFX_CDECL *GetCoreParam)(mfxHDL pthis, mfxCoreParam *par); + mfxStatus (MFX_CDECL *GetHandle) (mfxHDL pthis, mfxHandleType type, mfxHDL *handle); + mfxStatus (MFX_CDECL *IncreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *DecreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *CopyFrame) (mfxHDL pthis, mfxFrameSurface1 *dst, mfxFrameSurface1 *src); + mfxStatus (MFX_CDECL *CopyBuffer)(mfxHDL pthis, mfxU8 *dst, mfxU32 size, mfxFrameSurface1 *src); + + mfxStatus (MFX_CDECL *MapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + mfxStatus (MFX_CDECL *UnmapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + + mfxStatus (MFX_CDECL *GetRealSurface)(mfxHDL pthis, mfxFrameSurface1 *op_surf, mfxFrameSurface1 **surf); + mfxStatus (MFX_CDECL *GetOpaqueSurface)(mfxHDL pthis, mfxFrameSurface1 *surf, mfxFrameSurface1 **op_surf); + + mfxHDL reserved4[4]; +} mfxCoreInterface; + +typedef struct mfxPlugin{ + mfxHDL pthis; + + mfxStatus (MFX_CDECL *PluginInit) (mfxHDL pthis, mfxCoreInterface *core); + mfxStatus (MFX_CDECL *PluginClose) (mfxHDL pthis); + + mfxStatus (MFX_CDECL *GetPluginParam)(mfxHDL pthis, mfxPluginParam *par); + + mfxStatus (MFX_CDECL *Submit)(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task); + mfxStatus (MFX_CDECL *Execute)(mfxHDL pthis, mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); + mfxStatus (MFX_CDECL *FreeResources)(mfxHDL pthis, mfxThreadTask task, mfxStatus sts); + + mfxHDL reserved[9]; +} mfxPlugin; + + + +mfxStatus MFX_CDECL MFXVideoUSER_Register(mfxSession session, mfxU32 type, const mfxPlugin *par); +mfxStatus MFX_CDECL MFXVideoUSER_Unregister(mfxSession session, mfxU32 type); + +mfxStatus MFX_CDECL MFXVideoUSER_ProcessFrameAsync(mfxSession session, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif /* __MFXPLUGIN_H__ */ diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxstructures.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxstructures.h new file mode 100644 index 0000000..13e362b --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxstructures.h @@ -0,0 +1,763 @@ +/******************************************************************************* *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxstructures.h + +*******************************************************************************/ +#ifndef __MFXSTRUCTURES_H__ +#define __MFXSTRUCTURES_H__ +#include "mfxdefs.h" + +#pragma warning(disable: 4201) + +#ifdef __cplusplus +extern "C" { +#endif + +#define MFX_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24)) + +/* Extended Configuration Header Structure */ +typedef struct { + mfxU32 BufferId; + mfxU32 BufferSz; +} mfxExtBuffer; + +/* Frame ID for SVC and MVC */ +typedef struct { + mfxU16 TemporalId; + mfxU16 PriorityId; + union { + struct { + mfxU16 DependencyId; + mfxU16 QualityId; + }; + struct { + mfxU16 ViewId; + }; + }; +} mfxFrameId; + +/* Frame Info */ +typedef struct { + mfxU32 reserved[6]; + mfxFrameId FrameId; + + mfxU32 FourCC; + mfxU16 Width; + mfxU16 Height; + + mfxU16 CropX; + mfxU16 CropY; + mfxU16 CropW; + mfxU16 CropH; + + mfxU32 FrameRateExtN; + mfxU32 FrameRateExtD; + mfxU16 reserved3; + + mfxU16 AspectRatioW; + mfxU16 AspectRatioH; + + mfxU16 PicStruct; + mfxU16 ChromaFormat; + mfxU16 reserved2; +} mfxFrameInfo; + +/* FourCC */ +enum { + MFX_FOURCC_NV12 = MFX_MAKEFOURCC('N','V','1','2'), /* Native Format */ + MFX_FOURCC_YV12 = MFX_MAKEFOURCC('Y','V','1','2'), + MFX_FOURCC_YUY2 = MFX_MAKEFOURCC('Y','U','Y','2'), + MFX_FOURCC_RGB3 = MFX_MAKEFOURCC('R','G','B','3'), /* RGB24 */ + MFX_FOURCC_RGB4 = MFX_MAKEFOURCC('R','G','B','4'), /* RGB32 */ + MFX_FOURCC_P8 = 41 /* D3DFMT_P8 */ +}; + +/* PicStruct */ +enum { + MFX_PICSTRUCT_UNKNOWN =0x00, + MFX_PICSTRUCT_PROGRESSIVE =0x01, + MFX_PICSTRUCT_FIELD_TFF =0x02, + MFX_PICSTRUCT_FIELD_BFF =0x04, + + MFX_PICSTRUCT_FIELD_REPEATED=0x10, /* first field repeated, pic_struct=5 or 6 in H.264 */ + MFX_PICSTRUCT_FRAME_DOUBLING=0x20, /* pic_struct=7 in H.264 */ + MFX_PICSTRUCT_FRAME_TRIPLING=0x40 /* pic_struct=8 in H.264 */ +}; + +/* ColorFormat */ +enum { + MFX_CHROMAFORMAT_MONOCHROME =0, + MFX_CHROMAFORMAT_YUV420 =1, + MFX_CHROMAFORMAT_YUV422 =2, + MFX_CHROMAFORMAT_YUV444 =3, + MFX_CHROMAFORMAT_YUV400 = MFX_CHROMAFORMAT_MONOCHROME, + MFX_CHROMAFORMAT_YUV411 = 4, + MFX_CHROMAFORMAT_YUV422H = MFX_CHROMAFORMAT_YUV422, + MFX_CHROMAFORMAT_YUV422V = 5 + +}; + +enum { + MFX_TIMESTAMP_UNKNOWN = -1 +}; + +enum { + MFX_FRAMEORDER_UNKNOWN = -1 +}; + +/* DataFlag in mfxFrameData */ +enum { + MFX_FRAMEDATA_ORIGINAL_TIMESTAMP = 0x0001 +}; + +/* Corrupted in mfxFrameData */ +enum { + MFX_CORRUPTION_MINOR = 0x0001, + MFX_CORRUPTION_MAJOR = 0x0002, + MFX_CORRUPTION_REFERENCE_FRAME = 0x0010, + MFX_CORRUPTION_REFERENCE_LIST = 0x0020 +}; + +/* Frame Data Info */ +typedef struct { + mfxU32 reserved[8]; + + mfxU64 TimeStamp; + mfxU32 FrameOrder; + mfxU16 Locked; + mfxU16 Pitch; + + /* color planes */ + union { + mfxU8 *Y; + mfxU8 *R; + }; + union { + mfxU8 *UV; /* for UV merged formats */ + mfxU8 *VU; /* for VU merged formats */ + mfxU8 *CbCr; /* for CbCr merged formats */ + mfxU8 *CrCb; /* for CrCb merged formats */ + mfxU8 *Cb; + mfxU8 *U; + mfxU8 *G; + }; + union { + mfxU8 *Cr; + mfxU8 *V; + mfxU8 *B; + }; + mfxU8 *A; + mfxMemId MemId; + + /* Additional Flags */ + mfxU16 Corrupted; + mfxU16 DataFlag; +} mfxFrameData; + +/* Frame Surface */ +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxFrameData Data; +} mfxFrameSurface1; + +enum { + MFX_TIMESTAMPCALC_UNKNOWN = 0, + MFX_TIMESTAMPCALC_TELECINE = 1, +}; + +/* Transcoding Info */ +typedef struct { + mfxU32 reserved[7]; + + mfxU16 reserved4; + mfxU16 BRCParamMultiplier; + + mfxFrameInfo FrameInfo; + mfxU32 CodecId; + mfxU16 CodecProfile; + mfxU16 CodecLevel; + mfxU16 NumThread; + + union { + struct { /* MPEG-2/H.264 Encoding Options */ + mfxU16 TargetUsage; + + mfxU16 GopPicSize; + mfxU16 GopRefDist; + mfxU16 GopOptFlag; + mfxU16 IdrInterval; + + mfxU16 RateControlMethod; + union { + mfxU16 InitialDelayInKB; + mfxU16 QPI; + mfxU16 Accuracy; + }; + mfxU16 BufferSizeInKB; + union { + mfxU16 TargetKbps; + mfxU16 QPP; + }; + union { + mfxU16 MaxKbps; + mfxU16 QPB; + mfxU16 Convergence; + }; + + mfxU16 NumSlice; + mfxU16 NumRefFrame; + mfxU16 EncodedOrder; + }; + struct { /* H.264, MPEG-2 and VC-1 Decoding Options */ + mfxU16 DecodedOrder; + mfxU16 ExtendedPicStruct; + mfxU16 TimeStampCalc; + mfxU16 reserved2[10]; + }; + struct { /* JPEG Decoding Options */ + mfxU16 JPEGChromaFormat; + mfxU16 Rotation; + mfxU16 reserved3[11]; + }; + }; +} mfxInfoMFX; + +typedef struct { + mfxU32 reserved[8]; + mfxFrameInfo In; + mfxFrameInfo Out; +} mfxInfoVPP; + +typedef struct { + mfxU32 reserved[3]; + mfxU16 reserved3; + mfxU16 AsyncDepth; + + union { + mfxInfoMFX mfx; + mfxInfoVPP vpp; + }; + mfxU16 Protected; + mfxU16 IOPattern; + mfxExtBuffer** ExtParam; + mfxU16 NumExtParam; + mfxU16 reserved2; +} mfxVideoParam; + +/* IOPattern */ +enum { + MFX_IOPATTERN_IN_VIDEO_MEMORY = 0x01, + MFX_IOPATTERN_IN_SYSTEM_MEMORY = 0x02, + MFX_IOPATTERN_IN_OPAQUE_MEMORY = 0x04, + MFX_IOPATTERN_OUT_VIDEO_MEMORY = 0x10, + MFX_IOPATTERN_OUT_SYSTEM_MEMORY = 0x20, + MFX_IOPATTERN_OUT_OPAQUE_MEMORY = 0x40 +}; + +/* CodecId */ +enum { + MFX_CODEC_AVC =MFX_MAKEFOURCC('A','V','C',' '), + MFX_CODEC_MPEG2 =MFX_MAKEFOURCC('M','P','G','2'), + MFX_CODEC_VC1 =MFX_MAKEFOURCC('V','C','1',' ') +}; + +/* CodecProfile, CodecLevel */ +enum { + MFX_PROFILE_UNKNOWN =0, + MFX_LEVEL_UNKNOWN =0, + + /* AVC Profiles & Levels */ + MFX_PROFILE_AVC_CONSTRAINT_SET0 = (0x100 << 0), + MFX_PROFILE_AVC_CONSTRAINT_SET1 = (0x100 << 1), + MFX_PROFILE_AVC_CONSTRAINT_SET2 = (0x100 << 2), + MFX_PROFILE_AVC_CONSTRAINT_SET3 = (0x100 << 3), + MFX_PROFILE_AVC_CONSTRAINT_SET4 = (0x100 << 4), + MFX_PROFILE_AVC_CONSTRAINT_SET5 = (0x100 << 5), + + MFX_PROFILE_AVC_BASELINE =66, + MFX_PROFILE_AVC_MAIN =77, + MFX_PROFILE_AVC_EXTENDED =88, + MFX_PROFILE_AVC_HIGH =100, + MFX_PROFILE_AVC_CONSTRAINED_BASELINE =MFX_PROFILE_AVC_BASELINE + MFX_PROFILE_AVC_CONSTRAINT_SET1, + MFX_PROFILE_AVC_CONSTRAINED_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4 + + MFX_PROFILE_AVC_CONSTRAINT_SET5, + MFX_PROFILE_AVC_PROGRESSIVE_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4, + + MFX_LEVEL_AVC_1 =10, + MFX_LEVEL_AVC_1b =9, + MFX_LEVEL_AVC_11 =11, + MFX_LEVEL_AVC_12 =12, + MFX_LEVEL_AVC_13 =13, + MFX_LEVEL_AVC_2 =20, + MFX_LEVEL_AVC_21 =21, + MFX_LEVEL_AVC_22 =22, + MFX_LEVEL_AVC_3 =30, + MFX_LEVEL_AVC_31 =31, + MFX_LEVEL_AVC_32 =32, + MFX_LEVEL_AVC_4 =40, + MFX_LEVEL_AVC_41 =41, + MFX_LEVEL_AVC_42 =42, + MFX_LEVEL_AVC_5 =50, + MFX_LEVEL_AVC_51 =51, + + /* MPEG-2 Profiles & Levels */ + MFX_PROFILE_MPEG2_SIMPLE =0x50, + MFX_PROFILE_MPEG2_MAIN =0x40, + MFX_PROFILE_MPEG2_HIGH =0x10, + + MFX_LEVEL_MPEG2_LOW =0xA, + MFX_LEVEL_MPEG2_MAIN =0x8, + MFX_LEVEL_MPEG2_HIGH =0x4, + MFX_LEVEL_MPEG2_HIGH1440 =0x6, + + /* VC1 Profiles & Levels */ + MFX_PROFILE_VC1_SIMPLE =(0+1), + MFX_PROFILE_VC1_MAIN =(4+1), + MFX_PROFILE_VC1_ADVANCED =(12+1), + + /* VC1 levels for simple & main profiles */ + MFX_LEVEL_VC1_LOW =(0+1), + MFX_LEVEL_VC1_MEDIAN =(2+1), + MFX_LEVEL_VC1_HIGH =(4+1), + + /* VC1 levels for the advanced profile */ + MFX_LEVEL_VC1_0 =(0x00+1), + MFX_LEVEL_VC1_1 =(0x01+1), + MFX_LEVEL_VC1_2 =(0x02+1), + MFX_LEVEL_VC1_3 =(0x03+1), + MFX_LEVEL_VC1_4 =(0x04+1) +}; + +/* GopOptFlag */ +enum { + MFX_GOP_CLOSED =1, + MFX_GOP_STRICT =2 +}; + +/* TargetUsages: from 1 to 7 inclusive */ +enum { + MFX_TARGETUSAGE_UNKNOWN =0, + MFX_TARGETUSAGE_BEST_QUALITY =1, + MFX_TARGETUSAGE_BALANCED =4, + MFX_TARGETUSAGE_BEST_SPEED =7 +}; + +/* RateControlMethod */ +enum { + MFX_RATECONTROL_CBR =1, + MFX_RATECONTROL_VBR =2, + MFX_RATECONTROL_CQP =3, + MFX_RATECONTROL_AVBR =4 +}; + +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved1; + mfxU16 RateDistortionOpt; /* tri-state option */ + mfxU16 MECostType; + mfxU16 MESearchType; + mfxI16Pair MVSearchWindow; + mfxU16 EndOfSequence; /* tri-state option */ + mfxU16 FramePicture; /* tri-state option */ + + union { + struct { /* AVC */ + mfxU16 CAVLC; /* tri-state option */ + mfxU16 reserved2[3]; + mfxU16 ViewOutput; /* tri-state option */ + mfxU16 NalHrdConformance; /* tri-state option */ + mfxU16 SingleSeiNalUnit; /* tri-state option */ + mfxU16 VuiVclHrdParameters; /* tri-state option */ + + mfxU16 RefPicListReordering; /* tri-state option */ + mfxU16 ResetRefList; /* tri-state option */ + mfxU16 RefPicMarkRep; /* tri-state option */ + mfxU16 FieldOutput; /* tri-state option */ + + mfxU16 IntraPredBlockSize; + mfxU16 InterPredBlockSize; + mfxU16 MVPrecision; + mfxU16 MaxDecFrameBuffering; + + mfxU16 AUDelimiter; /* tri-state option */ + mfxU16 EndOfStream; /* tri-state option */ + mfxU16 PicTimingSEI; /* tri-state option */ + mfxU16 VuiNalHrdParameters; /* tri-state option */ + }; + }; +} mfxExtCodingOption; + +/* IntraPredBlockSize/InterPredBlockSize */ +enum { + MFX_BLOCKSIZE_UNKNOWN = 0, + MFX_BLOCKSIZE_MIN_16X16 = 1, /* 16x16 */ + MFX_BLOCKSIZE_MIN_8X8 = 2, /* 16x16, 8x8 */ + MFX_BLOCKSIZE_MIN_4X4 = 3 /* 16x16, 8x8, 4x4 */ +}; + +/* MVPrecision */ +enum { + MFX_MVPRECISION_UNKNOWN = 0, + MFX_MVPRECISION_INTEGER = (1 << 0), + MFX_MVPRECISION_HALFPEL = (1 << 1), + MFX_MVPRECISION_QUARTERPEL = (1 << 2) +}; + +enum { + MFX_CODINGOPTION_UNKNOWN =0, + MFX_CODINGOPTION_ON =0x10, + MFX_CODINGOPTION_OFF =0x20 +}; + +typedef struct _mfxEncryptedData mfxEncryptedData; + +typedef struct { + union { + mfxEncryptedData* EncryptedData; + mfxU32 reserved[8]; + }; + mfxU64 TimeStamp; + mfxU8* Data; + mfxU32 DataOffset; + mfxU32 DataLength; + mfxU32 MaxLength; + + mfxU16 PicStruct; + mfxU16 FrameType; + mfxU16 DataFlag; + mfxU16 reserved2; +} mfxBitstream; + +/* Data Flag */ +enum { + MFX_BITSTREAM_COMPLETE_FRAME = 0x0001 /* the bitstream contains a complete frame or field pair of data */ +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_CODING_OPTION = MFX_MAKEFOURCC('C','D','O','P'), + MFX_EXTBUFF_CODING_OPTION_SPSPPS= MFX_MAKEFOURCC('C','O','S','P'), + MFX_EXTBUFF_VPP_DONOTUSE = MFX_MAKEFOURCC('N','U','S','E'), + MFX_EXTBUFF_VPP_AUXDATA = MFX_MAKEFOURCC('A','U','X','D'), + MFX_EXTBUFF_VPP_DENOISE = MFX_MAKEFOURCC('D','N','I','S'), + MFX_EXTBUFF_VPP_SCENE_ANALYSIS = MFX_MAKEFOURCC('S','C','L','Y'), + MFX_EXTBUFF_VPP_SCENE_CHANGE = MFX_EXTBUFF_VPP_SCENE_ANALYSIS, + MFX_EXTBUFF_VPP_PROCAMP = MFX_MAKEFOURCC('P','A','M','P'), + MFX_EXTBUFF_VPP_DETAIL = MFX_MAKEFOURCC('D','E','T',' '), + MFX_EXTBUFF_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','S','I','N'), + MFX_EXTBUFF_VPP_DOUSE = MFX_MAKEFOURCC('D','U','S','E'), + MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION = MFX_MAKEFOURCC('O','P','Q','S'), + MFX_EXTBUFF_AVC_REFLIST_CTRL = MFX_MAKEFOURCC('R','L','S','T'), + MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION = MFX_MAKEFOURCC('F','R','C',' '), + MFX_EXTBUFF_PICTURE_TIMING_SEI = MFX_MAKEFOURCC('P','T','S','E'), + MFX_EXTBUFF_AVC_TEMPORAL_LAYERS = MFX_MAKEFOURCC('A','T','M','L') +}; + +/* VPP Conf: Do not use certain algorithms */ +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32* AlgList; +} mfxExtVPPDoNotUse; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DenoiseFactor; +} mfxExtVPPDenoise; + +typedef struct { + mfxExtBuffer Header; + mfxU16 DetailFactor; +} mfxExtVPPDetail; + +typedef struct { + mfxExtBuffer Header; + mfxF64 Brightness; + mfxF64 Contrast; + mfxF64 Hue; + mfxF64 Saturation; +} mfxExtVPPProcAmp; + +/* statistics collected for decode, encode and vpp */ +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU64 NumBit; + mfxU32 NumCachedFrame; +} mfxEncodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumSkippedFrame; + mfxU32 NumError; + mfxU32 NumCachedFrame; +} mfxDecodeStat; + +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumCachedFrame; +} mfxVPPStat; + +typedef struct { + mfxExtBuffer Header; + mfxU32 SpatialComplexity; + mfxU32 TemporalComplexity; + mfxU16 SceneChangeRate; + mfxU16 RepeatedFrame; +} mfxExtVppAuxData; + +typedef struct { + mfxU32 reserved[4]; + mfxU8 *Data; /* buffer pointer */ + mfxU32 NumBit; /* number of bits */ + mfxU16 Type; /* SEI message type in H.264 or user data start_code in MPEG-2 */ + mfxU16 BufSize; /* payload buffer size in bytes */ +} mfxPayload; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[5]; + mfxU16 reserved1; + + mfxU16 QP; /* per frame QP */ + + mfxU16 FrameType; + mfxU16 NumExtParam; + mfxU16 NumPayload; /* MPEG-2 user data or H.264 SEI message(s) */ + mfxU16 reserved2; + + mfxExtBuffer **ExtParam; + mfxPayload **Payload; /* for field pair, first field uses even payloads and second field uses odd payloads */ +} mfxEncodeCtrl; + +/* Buffer Memory Types */ +enum { + /* Buffer types */ + MFX_MEMTYPE_PERSISTENT_MEMORY =0x0002 +}; + +/* Frame Memory Types */ +#define MFX_MEMTYPE_BASE(x) (0xf0ff & (x)) + +enum { + MFX_MEMTYPE_DXVA2_DECODER_TARGET =0x0010, + MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET =0x0020, + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = MFX_MEMTYPE_DXVA2_DECODER_TARGET, + MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET, + MFX_MEMTYPE_SYSTEM_MEMORY =0x0040, + + MFX_MEMTYPE_FROM_ENCODE = 0x0100, + MFX_MEMTYPE_FROM_DECODE = 0x0200, + MFX_MEMTYPE_FROM_VPPIN = 0x0400, + MFX_MEMTYPE_FROM_VPPOUT = 0x0800, + + MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, + MFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, + MFX_MEMTYPE_OPAQUE_FRAME = 0x0004 +}; + +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxU16 Type; /* decoder or processor render targets */ + mfxU16 NumFrameMin; + mfxU16 NumFrameSuggested; + mfxU16 reserved2; +} mfxFrameAllocRequest; + +typedef struct { + mfxU32 reserved[4]; + mfxMemId *mids; /* the array allocated by application */ + mfxU16 NumFrameActual; + mfxU16 reserved2; +} mfxFrameAllocResponse; + +/* FrameType */ +enum { + MFX_FRAMETYPE_UNKNOWN =0x0000, + + MFX_FRAMETYPE_I =0x0001, + MFX_FRAMETYPE_P =0x0002, + MFX_FRAMETYPE_B =0x0004, + MFX_FRAMETYPE_S =0x0008, + + MFX_FRAMETYPE_REF =0x0040, + MFX_FRAMETYPE_IDR =0x0080, + + MFX_FRAMETYPE_xI =0x0100, + MFX_FRAMETYPE_xP =0x0200, + MFX_FRAMETYPE_xB =0x0400, + MFX_FRAMETYPE_xS =0x0800, + + MFX_FRAMETYPE_xREF =0x4000, + MFX_FRAMETYPE_xIDR =0x8000 +}; + +typedef enum { + MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 =1, /* IDirect3DDeviceManager9 */ + MFX_HANDLE_D3D9_DEVICE_MANAGER = MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9, + MFX_HANDLE_D3D11_DEVICE_AND_CONTEXT = 2, + MFX_HANDLE_D3D11_DEVICE = 3, + MFX_HANDLE_VA_DISPLAY = 4 +} mfxHandleType; + +typedef enum { + MFX_SKIPMODE_NOSKIP=0, + MFX_SKIPMODE_MORE=1, + MFX_SKIPMODE_LESS=2 +} mfxSkipMode; + +/* Library initialization and deinitialization */ +typedef mfxI32 mfxIMPL; +#define MFX_IMPL_BASETYPE(x) (0x00ff & (x)) + +enum { + MFX_IMPL_AUTO = 0x0000, /* Auto Selection/In or Not Supported/Out */ + MFX_IMPL_SOFTWARE = 0x0001, /* Pure Software Implementation */ + MFX_IMPL_HARDWARE = 0x0002, /* Hardware Accelerated Implementation (default device) */ + MFX_IMPL_AUTO_ANY = 0x0003, /* Auto selection of any hardware/software implementation */ + MFX_IMPL_HARDWARE_ANY = 0x0004, /* Auto selection of any hardware implementation */ + MFX_IMPL_HARDWARE2 = 0x0005, /* Hardware accelerated implementation (2nd device) */ + MFX_IMPL_HARDWARE3 = 0x0006, /* Hardware accelerated implementation (3rd device) */ + MFX_IMPL_HARDWARE4 = 0x0007, /* Hardware accelerated implementation (4th device) */ + + MFX_IMPL_VIA_ANY = 0x0100, + MFX_IMPL_VIA_D3D9 = 0x0200, + MFX_IMPL_VIA_D3D11 = 0x0300, + + MFX_IMPL_UNSUPPORTED = 0x0000 /* One of the MFXQueryIMPL returns */ +}; + +/* Version Info */ +typedef union { + struct { + mfxU16 Minor; + mfxU16 Major; + }; + mfxU32 Version; +} mfxVersion; + +typedef struct { + mfxExtBuffer Header; + mfxU8 *SPSBuffer; + mfxU8 *PPSBuffer; + mfxU16 SPSBufSize; + mfxU16 PPSBufSize; + mfxU16 SPSId; + mfxU16 PPSId; +} mfxExtCodingOptionSPSPPS; + +/* session priority */ +typedef enum +{ + MFX_PRIORITY_LOW = 0, + MFX_PRIORITY_NORMAL = 1, + MFX_PRIORITY_HIGH = 2 + +} mfxPriority; + +typedef struct { + mfxExtBuffer Header; + mfxU16 VideoFormat; + mfxU16 VideoFullRange; + mfxU16 ColourDescriptionPresent; + mfxU16 ColourPrimaries; + mfxU16 TransferCharacteristics; + mfxU16 MatrixCoefficients; +} mfxExtVideoSignalInfo; + +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32 *AlgList; +} mfxExtVPPDoUse; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[2]; + struct { + mfxFrameSurface1 **Surfaces; + mfxU32 reserved2[5]; + mfxU16 Type; + mfxU16 NumSurface; + } In, Out; +} mfxExtOpaqueSurfaceAlloc; + +typedef struct { + mfxExtBuffer Header; + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + + struct { + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 ViewId; + mfxU32 reserved[2]; + } PreferredRefList[32], RejectedRefList[16], LongTermRefList[16]; + + mfxU32 reserved[8]; +} mfxExtAVCRefListCtrl; + +enum { + MFX_FRCALGM_PRESERVE_TIMESTAMP = 1, + MFX_FRCALGM_DISTRIBUTED_TIMESTAMP = 2 +}; + +typedef struct { + mfxExtBuffer Header; + mfxU16 Algorithm; + mfxU16 reserved; + mfxU32 reserved2[15]; +} mfxExtVPPFrameRateConversion; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[14]; + + struct { + mfxU16 ClockTimestampFlag; + mfxU16 CtType; + mfxU16 NuitFieldBasedFlag; + mfxU16 CountingType; + mfxU16 FullTimestampFlag; + mfxU16 DiscontinuityFlag; + mfxU16 CntDroppedFlag; + mfxU16 NFrames; + mfxU16 SecondsFlag; + mfxU16 MinutesFlag; + mfxU16 HoursFlag; + mfxU16 SecondsValue; + mfxU16 MinutesValue; + mfxU16 HoursValue; + mfxU32 TimeOffset; + } TimeStamp[3]; +} mfxExtPictureTimingSEI; + +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[4]; + mfxU16 reserved2; + mfxU16 BaseLayerPID; + + struct { + mfxU16 Scale; + mfxU16 reserved[3]; + }Layer[8]; +} mfxExtAvcTemporalLayers; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo++.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo++.h new file mode 100644 index 0000000..e513b62 --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo++.h @@ -0,0 +1,127 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2010 Intel Corporation. All Rights Reserved. + + +File Name: mfxvideo++.h + +\* ****************************************************************************** */ + +#ifndef __MFXVIDEOPLUSPLUS_H +#define __MFXVIDEOPLUSPLUS_H + +#include "mfxvideo.h" + +class MFXVideoSession +{ +public: + MFXVideoSession(void) { m_session = (mfxSession) 0; } + virtual ~MFXVideoSession(void) { Close(); } + + mfxStatus Init(mfxIMPL impl, mfxVersion *ver) { return MFXInit(impl, ver, &m_session); } + mfxStatus Close(void) + { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); m_session = (mfxSession) 0; + return mfxRes; + } + + mfxStatus QueryIMPL(mfxIMPL *impl) { return MFXQueryIMPL(m_session, impl); } + mfxStatus QueryVersion(mfxVersion *version) { return MFXQueryVersion(m_session, version); } + + mfxStatus JoinSession(mfxSession child_session) { return MFXJoinSession(m_session, child_session);} + mfxStatus DisjoinSession( ) { return MFXDisjoinSession(m_session);} + mfxStatus CloneSession( mfxSession *clone) { return MFXCloneSession(m_session, clone);} + mfxStatus SetPriority( mfxPriority priority) { return MFXSetPriority(m_session, priority);} + mfxStatus GetPriority( mfxPriority *priority) { return MFXGetPriority(m_session, priority);} + + mfxStatus SetBufferAllocator(mfxBufferAllocator *allocator) { return MFXVideoCORE_SetBufferAllocator(m_session, allocator); } + mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) { return MFXVideoCORE_SetFrameAllocator(m_session, allocator); } + mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) { return MFXVideoCORE_SetHandle(m_session, type, hdl); } + mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) { return MFXVideoCORE_GetHandle(m_session, type, hdl); } + + mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) { return MFXVideoCORE_SyncOperation(m_session, syncp, wait); } + + operator mfxSession (void) { return m_session; } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoENCODE +{ +public: + + MFXVideoENCODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoENCODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENCODE_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENCODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoENCODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoENCODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoENCODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoENCODE_GetVideoParam(m_session, par); } + mfxStatus GetEncodeStat(mfxEncodeStat *stat) { return MFXVideoENCODE_GetEncodeStat(m_session, stat); } + + mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) { return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE +{ +public: + + MFXVideoDECODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoDECODE(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoDECODE_Query(m_session, in, out); } + mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { return MFXVideoDECODE_DecodeHeader(m_session, bs, par); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoDECODE_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoDECODE_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoDECODE_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoDECODE_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoDECODE_GetVideoParam(m_session, par); } + + mfxStatus GetDecodeStat(mfxDecodeStat *stat) { return MFXVideoDECODE_GetDecodeStat(m_session, stat); } + mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) {return MFXVideoDECODE_GetPayload(m_session, ts, payload); } + mfxStatus SetSkipMode(mfxSkipMode mode) { return MFXVideoDECODE_SetSkipMode(m_session, mode); } + mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) { return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoVPP +{ +public: + + MFXVideoVPP(mfxSession session) { m_session = session; } + virtual ~MFXVideoVPP(void) { Close(); } + + mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoVPP_Query(m_session, in, out); } + mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request[2]) { return MFXVideoVPP_QueryIOSurf(m_session, par, request); } + mfxStatus Init(mfxVideoParam *par) { return MFXVideoVPP_Init(m_session, par); } + mfxStatus Reset(mfxVideoParam *par) { return MFXVideoVPP_Reset(m_session, par); } + mfxStatus Close(void) { return MFXVideoVPP_Close(m_session); } + + mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoVPP_GetVideoParam(m_session, par); } + mfxStatus GetVPPStat(mfxVPPStat *stat) { return MFXVideoVPP_GetVPPStat(m_session, stat); } + mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) { return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif // __MFXVIDEOPLUSPLUS_H diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo.h b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo.h new file mode 100644 index 0000000..641dc7a --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeg4/include64/mfx/mfxvideo.h @@ -0,0 +1,117 @@ +/* ****************************************************************************** *\ + +INTEL CORPORATION PROPRIETARY INFORMATION +This software is supplied under the terms of a license agreement or nondisclosure +agreement with Intel Corporation and may not be copied or disclosed except in +accordance with the terms of that agreement +Copyright(c) 2007-2012 Intel Corporation. All Rights Reserved. + +File Name: mfxvideo.h + +\* ****************************************************************************** */ +#ifndef __MFXVIDEO_H__ +#define __MFXVIDEO_H__ +#include "mfxstructures.h" + +/* This is the external include file for the Intel(R) Media Sofware Development Kit product */ +#define MFX_VERSION_MAJOR 1 +#define MFX_VERSION_MINOR 4 + +#ifdef _WIN32 + #define MFX_CDECL __cdecl + #define MFX_STDCALL __stdcall +#else + #define MFX_CDECL + #define MFX_STDCALL +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* MFXVideoCORE */ +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxU32 nbytes, mfxU16 type, mfxMemId *mid); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxU8 **ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxMemId mid); +} mfxBufferAllocator; + +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *GetHDL) (mfxHDL pthis, mfxMemId mid, mfxHDL *handle); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxFrameAllocResponse *response); +} mfxFrameAllocator; + +/* Global Functions */ +typedef struct _mfxSession *mfxSession; +mfxStatus MFX_CDECL MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session); +mfxStatus MFX_CDECL MFXClose(mfxSession session); + +mfxStatus MFX_CDECL MFXQueryIMPL(mfxSession session, mfxIMPL *impl); +mfxStatus MFX_CDECL MFXQueryVersion(mfxSession session, mfxVersion *version); + +mfxStatus MFX_CDECL MFXJoinSession(mfxSession session, mfxSession child); +mfxStatus MFX_CDECL MFXDisjoinSession(mfxSession session); +mfxStatus MFX_CDECL MFXCloneSession(mfxSession session, mfxSession *clone); +mfxStatus MFX_CDECL MFXSetPriority(mfxSession session, mfxPriority priority); +mfxStatus MFX_CDECL MFXGetPriority(mfxSession session, mfxPriority *priority); + +/* VideoCORE */ +mfxStatus MFX_CDECL MFXVideoCORE_SetBufferAllocator(mfxSession session, mfxBufferAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetFrameAllocator(mfxSession session, mfxFrameAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetHandle(mfxSession session, mfxHandleType type, mfxHDL hdl); +mfxStatus MFX_CDECL MFXVideoCORE_GetHandle(mfxSession session, mfxHandleType type, mfxHDL *hdl); + +typedef struct _mfxSyncPoint *mfxSyncPoint; +mfxStatus MFX_CDECL MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); + +/* VideoENCODE */ +mfxStatus MFX_CDECL MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoENCODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_GetEncodeStat(mfxSession session, mfxEncodeStat *stat); +mfxStatus MFX_CDECL MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp); + +/* VideoDECODE */ +mfxStatus MFX_CDECL MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoDECODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_GetDecodeStat(mfxSession session, mfxDecodeStat *stat); +mfxStatus MFX_CDECL MFXVideoDECODE_SetSkipMode(mfxSession session, mfxSkipMode mode); +mfxStatus MFX_CDECL MFXVideoDECODE_GetPayload(mfxSession session, mfxU64 *ts, mfxPayload *payload); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); + +/* VideoVPP */ +mfxStatus MFX_CDECL MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); +mfxStatus MFX_CDECL MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoVPP_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_GetVPPStat(mfxSession session, mfxVPPStat *stat); +mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avcodec.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avcodec.lib new file mode 100644 index 0000000000000000000000000000000000000000..e0f49849275f8a1552e9fb14a031ff987b78f223 GIT binary patch literal 184554 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avdevice.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avdevice.lib new file mode 100644 index 0000000000000000000000000000000000000000..438c0a3cb348d8fcf9e5e7218a423670e52fe03d GIT binary patch literal 15798 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 V<}|C6yXTdZHeUi>AyUou{{gry?<4>K literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avformat.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avformat.lib new file mode 100644 index 0000000000000000000000000000000000000000..59a39e395b06c61660eba7ac650b52709a5b4ede GIT binary patch literal 134282 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avutil.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib/avutil.lib new file mode 100644 index 0000000000000000000000000000000000000000..71ff6b4c8f70bb25be9d688fc05cc0acda224332 GIT binary patch literal 405534 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib/postproc.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib/postproc.lib new file mode 100644 index 0000000000000000000000000000000000000000..e0b7b8e98e4451477049eae63b4ab85802511dad GIT binary patch literal 9034 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 c1AIm?SdaFC6wo#hTd3e;C_(tpET3 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avcodec.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avcodec.lib new file mode 100644 index 0000000000000000000000000000000000000000..29d0e73f263554b88610e0abf42c913010f998d2 GIT binary patch literal 185506 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 WxH?{sG2&?A+%2^R*-L5U`2PbtluVfb literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avdevice.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avdevice.lib new file mode 100644 index 0000000000000000000000000000000000000000..9e943f29cca5495a1100422047c1cde9fb4d0daa GIT binary patch literal 15874 zcmeI3-HzKt6vxjdyZu;NTA)Q0m5K{X0jZ?Uc9Y#z5n7>MAR(cG__#sxx{0%EHcdj} zT`Gi7g{rC-2=xl_06YQ@Q1K*O@fehIX6%`C!^OP>Nzy!;W5Yp(%Ne6z;m+gOg`)jxQ=_B#N@^u(^ZMa!|EL=rg`L0?7ntaU1OH9{-hSYBb44IZ90lV^I2?fIg?C2sMoF^J zjf1^#5(Q(=@AtFfRGui&N4+;Zj7Eo%Hwgy^lWZ|vkS-ezSkd9(xD%KQrxoea+%)EL zNuE-o6AUJ3wX_xbXk1Dby52Yl(5Tq3AGcf(us!o9<>9~pWtohi%sBmZ{T52G-cc=V*%_I5OZxol?~_)&4`SR%?(v$6Hm zw35~rDE*@ZsH3nOu)7idgWzr?nv$=OrTxQhSX^3HU}=t9LDhKzQC7cg!cTm2U4Ugd zYhJIH{3=BuEk~-=zLds^3#2l;-;55rQDd0+O4UcU+$Orib><|SuG`+&aGcimcI;Gl zSGy06p_@dHwghm7U9CVPqW&lj4&2&pbp6OLmcb6(dfd1@nUu)j9_d25;o3%`J%Ja? z_*`n(0XNaLl62CY%GYfsy0dt3&Y(;3lXJrSJFTro7rkYp7xsfV^RFiWdrLk4AW4YR zRhv;2^-Mh^Q|*N>53@$GRXtCm*lC$*$O7pQ+mhL61+(f)xf*64qM*J+7SaRNL4h|_@<^P(=b!tC_a~O%q3vvHaADNgWZ8j)6!FX0f zf0NFXPHCqw*4dGMt#xLf)9lKI(tS3xKsg51jOyG&OP#Bs1%BlF7bg zQyEmRz@J%Tn~4)j=}f;afY;fPA8K$DFG>bgrC2knC$8%@HyPSxp0>SlUGcQX*`wS? zqteh6IZD}@Qs_5&74yH0>7tVZuBE3%&!~70x}PcBlO9xfMzYxkR@PJM1*uDU+AY+K z%sN3ewPOc0-t2stmt^&rU%yEKG!{HTVpVg5gxFGa#q) ztZ8o9(Y)ExXnuq}Tt@T0Lcu&~9xL@0(fplRr_ubttP@>z343W;n$OC9)t3WU-&dFF zSMm8NNUC?(-~3Pm4=)7Odh0W28wA#TZ&>oJd+P@jg%!iZ{HWsZa*;9>2 zik5@ZdDb+q+tIw39Tw6&%k1#9N;6;luQbV1%?^|84$U#gn|kx;i$``C`s$8(XC! zQ0Z+>t9P^lNg*?e(B_LjnRQ~caRu)&?R@b$$u|x(^7d1!&G}o*y6U{~lQ@M=HTW8j zVq9Hdg$(dTN?Y>XZ7cHIZGGMPN2H;Q{H{XGJjov@^%kv^+%@Yo@_#Vv1o>LXYtX^7^xNvM+y3h@d&cedBNrob-bHzg&oUxEE_=D)%e`v*@~KAT1y;xm zSc;U^qZiw~%f;Rfv7bl&ETflWNPhm;rqw3i;f_M_?xww+{MIL=7bvU=U+i8Q$kpbY z|Hkh8ibA;lW%9E`xZe6K;Rb~@;g-9Xiy0{MN>9^=FB9Q;pY3C9|Nj|iZtDf$dFHVn zom=i_F8F@xeAgx4x`TR__|{vW;oBgv_TQHKoh^M;{2@BCvQ_b2?(o>yb)Ku@^Zpw4 zW#n<%6&C!;$ngJB)%M%;6%GZtvLgO{1XFA9F&<5=7C`e)aMb@7vnJVYXLGT?L;aIK jo1A5T=S8JY)#YHSr^=%cyZxQye;iXS&jOv!EMfX@%j>Wy literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avfilter.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avfilter.lib new file mode 100644 index 0000000000000000000000000000000000000000..9940c2b31edcd0fa2f0bf21f24a27808cf6a5166 GIT binary patch literal 56582 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 OGD|Np&z6{=(fhV*X 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 MrPdU?33E99|4HASQ~&?~ literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avutil.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/avutil.lib new file mode 100644 index 0000000000000000000000000000000000000000..a0ec59fe0a12658d6e29ac1ca6726defdcff03b2 GIT binary patch literal 407528 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/swresample.lib b/ffmpegdemo/ffmpeg/ffmpeg4/winlib64/swresample.lib new file mode 100644 index 0000000000000000000000000000000000000000..f25b3f1c5abb3020cf09a5bec990c769a9722b86 GIT binary patch literal 18842 zcmeI4TaOzx6oAi8wzsACZZBMl0+dpqER)?Ny9-rS5LW@B2oO9JX0y5MPMb}lBwI>_ zP=yfc0}p-TnIC|7;1~3PpMZGc7a*Sa0hDv>v3=%}#1n}{qa923OpZ_NvHi`NGq#f_ zF4g+=&C7Ey7Q>-bsjgJr((2+$vFM5{o)(LxQe{zoV{HxqT!7hM0rsr{%w3l85XvbY z`CZ22zW`7?*_ZLms{j-qeN4u)zX4Dz{wU*9Z2*er56gJr4*-hK{~+VSRRD_a-!d-! z1VFLck#V&QK=I{2WxV_|0L53X$@p3kfZ`i}QS`jFzdrb)-yGDodhMpiPBFvtJGHGQ zc$>{yW2_>u@7-+n2Y$B$p674%c!4T|>9+lPvopXNqPi-B>DIfQmcOyxuMHDR4`<`| zyg_s5ZPkW-|CTAA3zbg2yVb+1h?FZdLs?pXv)1V}+gNt5=XW+Dh1Vmw^sP?w*3jz> z2TWCqDBmAoPy0i^*7k2V8%!&bA#^*}oAseL@Y~H!o%I}+5Xz9c{*af3bFXbfvN8pDOIvSHkIRooJqsYPMDO0HWimy5-!yBrw1 zwYkQ3dx64*8MIR3Y!5695mRwKIw``{wS`7)SR1V(a<0JD`wQy`#Ds8%^n5Dt9NH`y z_Tym|uZxE(;3~a}l9S%S(R#~DZyrzP6ZBNRI$}=;X7Gijg+?1~Fk0Fc-e-ZrKMw#l zW?HoyN)X6-zfm=XNL{4H`^*`o!}_Z*N{98;tk9ue2#26QML+GqtisGl9nnWbLSg1u zxRBrz)j@%D9C#K}t0%^sU~@ACo688O2!_on_Ty2i9A^J-HW$TZU_vYrn`eSCrg2JQ zQ|a>~)6=Z;e05HG>O6Wph=Kx8N_TBR^v@x2W<%CDhZ@ z$Q__r^sc0t`j`6D1a2MVHOKfC%8FDv(j5lyj7VkTz`J;2;mBCwE$AM&uDiG>5T9sy zD-}lfK5s8ftox+p10v#p87T!iGRoiW*QmzG+vT*_I-{*@SNZ(~PTKE+2>z53v_>>`#` ztMzMuVp(UTV%fE0d6~Rq3gmT2yZk)@Fv%`A0$W9gowUmxR_{2wd@ETm#_~7GdfG1I z6h&&ge3G*qeksp1&u6hOC>Yy(NeV>jfQLtBo5L-SQ60%n!**%aj_vZ2M4PewEspmj zwy!ZJc9QKDt9KmRy=1)@+qaYTG~35I_B z6~m!che-}+rLxD%c05<(JmK*>YCSdKEXFw_MIyMt&lU#%%C^F~fXBvK(Gk-z_YMTWu_IWS2oYmY3{UF7dTM zIV<-S0x-#+_=r7+chaBuoYgzdpV&;+i?Q5K*3)*GR{zra6NdwqaRW$3Y%%$_v?&G~ zEAD=|9-`Jvj4z?)Fi6h<>Ld;;?SGlTZ+@1zrUH8 ziD};74(f50yX3O$|I$o31w-+9DG;dxZ{tx>JbIs?g&Ah#TCU&a98ONvPi6z8h?-+0AdfS|*zeuJH<7%ayird_5xH`C$CnX?8yB7v%C^U1a;s zY+l^k+^2mmkkG+__b?@&mbcjO8v&`Yvw7WsU7M+0<~>-hq?O~dVY%%!)J|i2_o#6+KcdVuxhDfo4Y?OX z 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 literal 0 HcmV?d00001 diff --git a/ffmpegdemo/ffmpeg/ffmpeghead.h b/ffmpegdemo/ffmpeg/ffmpeghead.h new file mode 100644 index 0000000..933dcdb --- /dev/null +++ b/ffmpegdemo/ffmpeg/ffmpeghead.h @@ -0,0 +1,30 @@ +//必须加以下内容,否则编译不能通过,为了兼容C和C99标准 +#ifndef INT64_C +#define INT64_C +#define UINT64_C +#endif + +//引入ffmpeg头文件 +extern "C" { +#include "libavutil/opt.h" +#include "libavutil/time.h" +#include "libavutil/frame.h" +#include "libavutil/pixdesc.h" +#include "libavutil/avassert.h" +#include "libavutil/imgutils.h" +#include "libavutil/ffversion.h" +#include "libavcodec/avcodec.h" +#include "libswscale/swscale.h" + +#include "libavformat/avformat.h" +#include "libavfilter/avfilter.h" + +#ifdef ffmpegdevice +#include "libavdevice/avdevice.h" +#endif + +#ifndef gcc45 +#include "libavutil/hwcontext.h" +#include "libavutil/hwcontext_qsv.h" +#endif +} diff --git a/ffmpegdemo/ffmpegdemo.pro b/ffmpegdemo/ffmpegdemo.pro new file mode 100644 index 0000000..b90f4b2 --- /dev/null +++ b/ffmpegdemo/ffmpegdemo.pro @@ -0,0 +1,22 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = ffmpegdemo +TEMPLATE = app +MOC_DIR = temp/moc +RCC_DIR = temp/rcc +UI_DIR = temp/ui +OBJECTS_DIR = temp/obj +DESTDIR = $$PWD/../bin + +#ffmpeg3表示用ffmpeg3版本 可以改成ffmpeg4表示用ffmpeg4版本 +#qt32表示采用32位的ffmpeg 可以改成qt64表示采用64位的ffmpeg +DEFINES += ffmpeg3 qt32 +SOURCES += main.cpp widget.cpp +HEADERS += widget.h +FORMS += widget.ui +CONFIG += warn_off + +INCLUDEPATH += $$PWD/ffmpeg +include ($$PWD/ffmpeg/ffmpeg.pri) diff --git a/ffmpegdemo/main.cpp b/ffmpegdemo/main.cpp new file mode 100644 index 0000000..a741f6c --- /dev/null +++ b/ffmpegdemo/main.cpp @@ -0,0 +1,43 @@ +#pragma execution_character_set("utf-8") +#include "widget.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QFont font; + font.setFamily("MicroSoft Yahei"); + font.setPixelSize(12); + a.setFont(font); + +#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) +#if _MSC_VER + QTextCodec *codec = QTextCodec::codecForName("gbk"); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); +#endif + QTextCodec::setCodecForLocale(codec); + QTextCodec::setCodecForCStrings(codec); + QTextCodec::setCodecForTr(codec); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); + QTextCodec::setCodecForLocale(codec); +#endif + + Widget w; + w.setWindowTitle("视频流播放ffmpeg内核 (QQ: 517216493)"); + w.show(); + + //居中显示窗体 + QDesktopWidget deskWidget; + int deskWidth = deskWidget.availableGeometry().width(); + int deskHeight = deskWidget.availableGeometry().height(); + QPoint movePoint(deskWidth / 2 - w.width() / 2, deskHeight / 2 - w.height() / 2); + w.move(movePoint); + + return a.exec(); +} diff --git a/ffmpegdemo/readme.txt b/ffmpegdemo/readme.txt new file mode 100644 index 0000000..032811d --- /dev/null +++ b/ffmpegdemo/readme.txt @@ -0,0 +1,17 @@ +ԺǵýdllļƵִļͬһĿ¼ +Ӧ汾dllļصַhttps://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA ȡ: ujm7 + +շǿ汾https://blog.csdn.net/feiyangqingyun/article/details/103946731 + +2. վ㣺[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun) +3. վ㣺[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun) +4. ҳ[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun) +5. ֪ҳ[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/) + +1. ߳ʵʱ +2. ͬʱƵƵ +3. ֧Qt汾ϵͳ +4. ʹ룬չǿ +5. ѡffmpeg3ffmpeg4汾 +6. ѡ32λ64λffmpeg +7. ע;ϸ \ No newline at end of file diff --git a/ffmpegdemo/widget.cpp b/ffmpegdemo/widget.cpp new file mode 100644 index 0000000..fae6d11 --- /dev/null +++ b/ffmpegdemo/widget.cpp @@ -0,0 +1,38 @@ +#pragma execution_character_set("utf-8") +#include "widget.h" +#include "ui_widget.h" + +Widget::Widget(QWidget *parent) + : QWidget(parent) + , ui(new Ui::Widget) +{ + ui->setupUi(this); + + QStringList urls; + urls << "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"; + urls << "rtsp://admin:Admin123456@192.168.1.64:554/Streaming/Channels/102?transportmode=unicast&profile=Profile_2"; + urls << "rtsp://192.168.1.108:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif"; + urls << "rtsp://192.168.1.15:554/media/video1"; + urls << "rtsp://192.168.1.15:554/media/video2"; + urls << "rtsp://192.168.1.247:554/av0_0"; + urls << "rtsp://192.168.1.247:554/av0_1"; + ui->cboxUrl->addItems(urls); +} + +Widget::~Widget() +{ + delete ui; +} + +void Widget::on_btnOpen_clicked() +{ + if (ui->btnOpen->text() == "打开") { + ui->btnOpen->setText("关闭"); + QString url = ui->cboxUrl->currentText().trimmed(); + ui->ffmpegWidget->setUrl(url); + ui->ffmpegWidget->open(); + } else { + ui->btnOpen->setText("打开"); + ui->ffmpegWidget->close(); + } +} diff --git a/ffmpegdemo/widget.h b/ffmpegdemo/widget.h new file mode 100644 index 0000000..0d54597 --- /dev/null +++ b/ffmpegdemo/widget.h @@ -0,0 +1,24 @@ +#ifndef WIDGET_H +#define WIDGET_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class Widget; } +QT_END_NAMESPACE + +class Widget : public QWidget +{ + Q_OBJECT + +public: + Widget(QWidget *parent = 0); + ~Widget(); + +private slots: + void on_btnOpen_clicked(); + +private: + Ui::Widget *ui; +}; +#endif // WIDGET_H diff --git a/ffmpegdemo/widget.ui b/ffmpegdemo/widget.ui new file mode 100644 index 0000000..6b75261 --- /dev/null +++ b/ffmpegdemo/widget.ui @@ -0,0 +1,63 @@ + + + Widget + + + + 0 + 0 + 700 + 600 + + + + Widget + + + + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + + + + true + + + + + + + 打开 + + + + + + + + + + FFmpegWidget + QWidget +
ffmpeg.h
+ 1 +
+
+ + +
diff --git a/snap/ffmpegdemo.png b/snap/ffmpegdemo.png new file mode 100644 index 0000000000000000000000000000000000000000..e31e65eee9a16d28144cb73237cafd403d63d1f1 GIT binary patch literal 347167 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"lE{maC3A|$1oFv1}_Y(>#^Ma**nSM=EUKBm<6 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 z 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�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 +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QFont font; + font.setFamily("MicroSoft Yahei"); + font.setPixelSize(12); + a.setFont(font); + +#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) +#if _MSC_VER + QTextCodec *codec = QTextCodec::codecForName("gbk"); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); +#endif + QTextCodec::setCodecForLocale(codec); + QTextCodec::setCodecForCStrings(codec); + QTextCodec::setCodecForTr(codec); +#else + QTextCodec *codec = QTextCodec::codecForName("utf-8"); + QTextCodec::setCodecForLocale(codec); +#endif + + Widget w; + w.setWindowTitle("视频流播放vlc内核 (QQ: 517216493)"); + w.show(); + + //居中显示窗体 + QDesktopWidget deskWidget; + int deskWidth = deskWidget.availableGeometry().width(); + int deskHeight = deskWidget.availableGeometry().height(); + QPoint movePoint(deskWidth / 2 - w.width() / 2, deskHeight / 2 - w.height() / 2); + w.move(movePoint); + + return a.exec(); +} diff --git a/vlcdemo/readme.txt b/vlcdemo/readme.txt new file mode 100644 index 0000000..db5b099 --- /dev/null +++ b/vlcdemo/readme.txt @@ -0,0 +1,17 @@ +ԺǵýdllļƵִļͬһĿ¼ +Ӧ汾dllļصַhttps://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA ȡ: ujm7 + +շǿ汾https://blog.csdn.net/feiyangqingyun/article/details/103946067 + +2. վ㣺[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun) +3. վ㣺[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun) +4. ҳ[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun) +5. ֪ҳ[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/) + +1. ߳ʵʱ +2. ͬʱƵƵ +3. ֧Qt汾ϵͳ +4. ʹ룬չǿ +5. ѡvlc2vlc3汾 +6. ѡ32λ64λvlc +7. ע;ϸ \ No newline at end of file diff --git a/vlcdemo/vlc/vlc.cpp b/vlcdemo/vlc/vlc.cpp new file mode 100644 index 0000000..474a308 --- /dev/null +++ b/vlcdemo/vlc/vlc.cpp @@ -0,0 +1,193 @@ +#include "vlc.h" + +#pragma execution_character_set("utf-8") +#define TIMEMS qPrintable(QTime::currentTime().toString("HH:mm:ss zzz")) +#define STRDATETIME qPrintable(QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss")) + +VlcThread::VlcThread(QObject *parent) : QThread(parent) +{ + setObjectName("VlcThread"); + + stopped = false; + isPlay = false; + + url = "rtsp://192.168.1.200:554/1"; + + vlcInst = NULL; + vlcMedia = NULL; + vlcPlayer = NULL; + + static bool isInit = false; + if (!isInit) { + isInit = true; + qDebug() << TIMEMS << "init vlc lib ok" << " version:" << libvlc_get_version(); + } +} + +void VlcThread::run() +{ + while (!stopped) { + msleep(1); + } + + //线程结束后释放资源 + free(); + stopped = false; + isPlay = false; + //qDebug() << TIMEMS << "stop vlc thread"; +} + +void VlcThread::setUrl(const QString &url) +{ + this->url = url; +} + +void VlcThread::setOption(const QString &option) +{ + if (vlcMedia != NULL) { + QByteArray data = option.toUtf8(); + const char *arg = data.constData(); + libvlc_media_add_option(vlcMedia, arg); + } +} + +bool VlcThread::init() +{ + const char *tempArg = ""; + const char *vlc_args[9] = {"-I", "dummy", "--no-osd", "--no-stats", "--ignore-config", "--no-video-on-top", "--no-video-title-show", "--no-snapshot-preview", tempArg}; + vlcInst = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args); + if (vlcInst == NULL) { + return false; + } + + vlcMedia = libvlc_media_new_location(vlcInst, url.toUtf8().constData()); + vlcPlayer = libvlc_media_player_new_from_media(vlcMedia); + if (vlcPlayer == NULL) { + return false; + } + + //设置播放句柄 + VlcWidget *w = (VlcWidget *)this->parent(); +#if defined(Q_OS_WIN) + libvlc_media_player_set_hwnd(vlcPlayer, (void *)w->winId()); +#elif defined(Q_OS_LINUX) + libvlc_media_player_set_xwindow(vlcPlayer, w->winId()); +#elif defined(Q_OS_MAC) + libvlc_media_player_set_nsobject(vlcPlayer, (void *)w->winId()); +#endif + + //设置硬件加速 none auto any d3d11va dxva2 + setOption(QString(":avcodec-hw=%1").arg("none")); + //设置通信协议 tcp udp + setOption(QString(":rtsp-%1").arg("tcp")); + //设置缓存时间 默认500毫秒 + setOption(QString(":network-caching=%1").arg(300)); + + libvlc_media_player_play(vlcPlayer); + //qDebug() << TIMEMS << "init vlc finsh"; + return true; +} + +void VlcThread::play() +{ + isPlay = true; + this->init(); +} + +void VlcThread::pause() +{ + if (vlcPlayer != NULL) { + libvlc_media_player_pause(vlcPlayer); + } +} + +void VlcThread::next() +{ + if (vlcPlayer != NULL) { + libvlc_media_player_pause(vlcPlayer); + } +} + +void VlcThread::free() +{ + if (vlcInst != NULL) { + libvlc_release(vlcInst); + vlcInst = NULL; + } + + if (vlcMedia != NULL) { + libvlc_media_release(vlcMedia); + vlcMedia = NULL; + } + + if (vlcPlayer != NULL) { + libvlc_media_player_release(vlcPlayer); + vlcPlayer = NULL; + } + + //qDebug() << TIMEMS << "close vlc ok"; +} + +void VlcThread::stop() +{ + stopped = true; +} + +//实时视频显示窗体类 +VlcWidget::VlcWidget(QWidget *parent) : QWidget(parent) +{ + vlc = new VlcThread(this); +} + +VlcWidget::~VlcWidget() +{ + close(); +} + +void VlcWidget::setUrl(const QString &url) +{ + vlc->setUrl(url); +} + +void VlcWidget::open() +{ + //qDebug() << TIMEMS << "open video" << objectName(); + clear(); + + vlc->play(); + vlc->start(); +} + +void VlcWidget::pause() +{ + vlc->pause(); +} + +void VlcWidget::next() +{ + vlc->next(); +} + +void VlcWidget::close() +{ + //qDebug() << TIMEMS << "close video" << objectName(); + if (vlc->isRunning()) { + vlc->stop(); + vlc->quit(); + vlc->wait(3000); + } + + QTimer::singleShot(5, this, SLOT(clear())); +} + +void VlcWidget::restart() +{ + //qDebug() << TIMEMS << "restart video" << objectName(); + close(); + QTimer::singleShot(10, this, SLOT(open())); +} + +void VlcWidget::clear() +{ + update(); +} diff --git a/vlcdemo/vlc/vlc.h b/vlcdemo/vlc/vlc.h new file mode 100644 index 0000000..1d34e46 --- /dev/null +++ b/vlcdemo/vlc/vlc.h @@ -0,0 +1,84 @@ +#ifndef VLC_H +#define VLC_H + +#include +#if (QT_VERSION > QT_VERSION_CHECK(5,0,0)) +#include +#endif + +#include "vlchead.h" +class VlcWidget; + +class VlcThread : public QThread +{ + Q_OBJECT +public: + explicit VlcThread(QObject *parent = 0); + +protected: + void run(); + +private: + volatile bool stopped; //线程停止标志位 + volatile bool isPlay; //播放视频标志位 + + QString url; //视频流地址 + + libvlc_instance_t *vlcInst; //载体对象 + libvlc_media_t *vlcMedia; //媒体对象 + libvlc_media_player_t *vlcPlayer; //播放对象 + +signals: + //收到图片信号 + void receiveImage(const QImage &image); + +public slots: + //设置视频流地址 + void setUrl(const QString &url); + void setOption(const QString &option); + + //初始化视频对象 + bool init(); + //播放视频对象 + void play(); + //暂停播放 + void pause(); + //继续播放 + void next(); + //释放对象 + void free(); + //停止采集线程 + void stop(); +}; + +//实时视频显示窗体类 +class VlcWidget : public QWidget +{ + Q_OBJECT +public: + explicit VlcWidget(QWidget *parent = 0); + ~VlcWidget(); + +private: + VlcThread *vlc; //实时视频采集对象 + +public slots: + //设置视频流地址 + void setUrl(const QString &url); + + //打开设备 + void open(); + //暂停 + void pause(); + //继续 + void next(); + //关闭设备 + void close(); + //重新加载 + void restart(); + //清空 + void clear(); + +}; + +#endif // VLC_H diff --git a/vlcdemo/vlc/vlc.pri b/vlcdemo/vlc/vlc.pri new file mode 100644 index 0000000..e1fa098 --- /dev/null +++ b/vlcdemo/vlc/vlc.pri @@ -0,0 +1,30 @@ +HEADERS += $$PWD/vlchead.h +HEADERS += $$PWD/vlc.h +SOURCES += $$PWD/vlc.cpp + +#vlc3则使用vlc3的目录 +contains(DEFINES, vlc3) { +strPath = vlc3 +} else { +strPath = vlc2 +} + +#32位的库则使用32位的库的头文件和lib文件 +contains(DEFINES, qt32) { +strLib = winlib +strInclude = include +} else { +strLib = winlib64 +strInclude = include64 +} + +INCLUDEPATH += $$PWD/$$strPath/$$strInclude +INCLUDEPATH += $$PWD/$$strPath/$$strInclude/plugins + +win32 { +LIBS += -L$$PWD/$$strPath/$$strLib/ -llibvlc -llibvlccore +} + +#需要自己改为对应目录下的库 +unix:!macx {} +macx {} diff --git a/vlcdemo/vlc/vlc2/include/deprecated.h b/vlcdemo/vlc/vlc2/include/deprecated.h new file mode 100644 index 0000000..65df232 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/deprecated.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * deprecated.h: libvlc deprecated API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 7f55090fcd482489ceed9145ce2253e78fa6fd2a $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_DEPRECATED_H +#define LIBVLC_DEPRECATED_H 1 + +/** + * \file + * This file defines libvlc deprecated API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * Playlist (Deprecated) + *****************************************************************************/ +/** \defgroup libvlc_playlist LibVLC playlist (legacy) + * \ingroup libvlc + * @deprecated Use @ref libvlc_media_list instead. + * @{ + */ + +/** + * Start playing (if there is any item in the playlist). + * + * Additionnal playlist item options can be specified for addition to the + * item before it is played. + * + * \param p_instance the playlist instance + * \param i_id the item to play. If this is a negative number, the next + * item will be selected. Otherwise, the item with the given ID will be + * played + * \param i_options the number of options to add to the item + * \param ppsz_options the options to add to the item + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_playlist_play( libvlc_instance_t *p_instance, int i_id, + int i_options, char **ppsz_options ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_DEPRECATED_H */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc.h b/vlcdemo/vlc/vlc2/include/libvlc.h new file mode 100644 index 0000000..395cb65 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc.h @@ -0,0 +1,634 @@ +/***************************************************************************** + * libvlc.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 0bc0b401a553d2758abddf6f545022a6c2644405 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc external API + */ + +/** + * \defgroup libvlc LibVLC + * LibVLC is the external programming interface of the VLC media player. + * It is used to embed VLC into other applications or frameworks. + * @{ + */ + +#ifndef VLC_LIBVLC_H +#define VLC_LIBVLC_H 1 + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define LIBVLC_API __declspec(dllexport) +#elif defined (__GNUC__) && (__GNUC__ >= 4) +# define LIBVLC_API __attribute__((visibility("default"))) +#else +# define LIBVLC_API +#endif + +#ifdef __LIBVLC__ +/* Avoid unhelpful warnings from libvlc with our deprecated APIs */ +# define LIBVLC_DEPRECATED +#elif defined(__GNUC__) && \ + (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) +# define LIBVLC_DEPRECATED __attribute__((deprecated)) +#else +# define LIBVLC_DEPRECATED +#endif + +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +#include + +/** \defgroup libvlc_core LibVLC core + * \ingroup libvlc + * Before it can do anything useful, LibVLC must be initialized. + * You can create one (or more) instance(s) of LibVLC in a given process, + * with libvlc_new() and destroy them with libvlc_release(). + * + * \version Unless otherwise stated, these functions are available + * from LibVLC versions numbered 1.1.0 or more. + * Earlier versions (0.9.x and 1.0.x) are not compatible. + * @{ + */ + +/** \defgroup libvlc_error LibVLC error handling + * @{ + */ + +/** + * A human-readable error message for the last LibVLC error in the calling + * thread. The resulting string is valid until another error occurs (at least + * until the next LibVLC call). + * + * @warning + * This will be NULL if there was no error. + */ +LIBVLC_API const char *libvlc_errmsg (void); + +/** + * Clears the LibVLC error status for the current thread. This is optional. + * By default, the error status is automatically overridden when a new error + * occurs, and destroyed when the thread exits. + */ +LIBVLC_API void libvlc_clearerr (void); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param ap the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_vprinterr (const char *fmt, va_list ap); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param args the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_printerr (const char *fmt, ...); + +/**@} */ + +/** + * Create and initialize a libvlc instance. + * This functions accept a list of "command line" arguments similar to the + * main(). These arguments affect the LibVLC instance default configuration. + * + * \version + * Arguments are meant to be passed from the command line to LibVLC, just like + * VLC media player does. The list of valid arguments depends on the LibVLC + * version, the operating system and platform, and set of available LibVLC + * plugins. Invalid or unsupported arguments will cause the function to fail + * (i.e. return NULL). Also, some arguments may alter the behaviour or + * otherwise interfere with other LibVLC functions. + * + * \warning + * There is absolutely no warranty or promise of forward, backward and + * cross-platform compatibility with regards to libvlc_new() arguments. + * We recommend that you do not use them, other than when debugging. + * + * \param argc the number of arguments (should be 0) + * \param argv list of arguments (should be NULL) + * \return the libvlc instance or NULL in case of error + */ +LIBVLC_API libvlc_instance_t * +libvlc_new( int argc , const char *const *argv ); + +/** + * Decrement the reference count of a libvlc instance, and destroy it + * if it reaches zero. + * + * \param p_instance the instance to destroy + */ +LIBVLC_API void libvlc_release( libvlc_instance_t *p_instance ); + +/** + * Increments the reference count of a libvlc instance. + * The initial reference count is 1 after libvlc_new() returns. + * + * \param p_instance the instance to reference + */ +LIBVLC_API void libvlc_retain( libvlc_instance_t *p_instance ); + +/** + * Try to start a user interface for the libvlc instance. + * + * \param p_instance the instance + * \param name interface name, or NULL for default + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_add_intf( libvlc_instance_t *p_instance, const char *name ); + +/** + * Registers a callback for the LibVLC exit event. This is mostly useful if + * the VLC playlist and/or at least one interface are started with + * libvlc_playlist_play() or libvlc_add_intf() respectively. + * Typically, this function will wake up your application main loop (from + * another thread). + * + * \note This function should be called before the playlist or interface are + * started. Otherwise, there is a small race condition: the exit event could + * be raised before the handler is registered. + * + * \param p_instance LibVLC instance + * \param cb callback to invoke when LibVLC wants to exit, + * or NULL to disable the exit handler (as by default) + * \param opaque data pointer for the callback + * \warning This function and libvlc_wait() cannot be used at the same time. + */ +LIBVLC_API +void libvlc_set_exit_handler( libvlc_instance_t *p_instance, + void (*cb) (void *), void *opaque ); + +/** + * Waits until an interface causes the instance to exit. + * You should start at least one interface first, using libvlc_add_intf(). + * + * \param p_instance the instance + * \warning This function wastes one thread doing basically nothing. + * libvlc_set_exit_handler() should be used instead. + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_wait( libvlc_instance_t *p_instance ); + +/** + * Sets the application name. LibVLC passes this as the user agent string + * when a protocol requires it. + * + * \param p_instance LibVLC instance + * \param name human-readable application name, e.g. "FooBar player 1.2.3" + * \param http HTTP User Agent, e.g. "FooBar/1.2.3 Python/2.6.0" + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_set_user_agent( libvlc_instance_t *p_instance, + const char *name, const char *http ); + +/** + * Sets some meta-information about the application. + * See also libvlc_set_user_agent(). + * + * \param p_instance LibVLC instance + * \param id Java-style application identifier, e.g. "com.acme.foobar" + * \param version application version numbers, e.g. "1.2.3" + * \param icon application icon name, e.g. "foobar" + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API +void libvlc_set_app_id( libvlc_instance_t *p_instance, const char *id, + const char *version, const char *icon ); + +/** + * Retrieve libvlc version. + * + * Example: "1.1.0-git The Luggage" + * + * \return a string containing the libvlc version + */ +LIBVLC_API const char * libvlc_get_version(void); + +/** + * Retrieve libvlc compiler version. + * + * Example: "gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu6)" + * + * \return a string containing the libvlc compiler version + */ +LIBVLC_API const char * libvlc_get_compiler(void); + +/** + * Retrieve libvlc changeset. + * + * Example: "aa9bce0bc4" + * + * \return a string containing the libvlc changeset + */ +LIBVLC_API const char * libvlc_get_changeset(void); + +/** + * Frees an heap allocation returned by a LibVLC function. + * If you know you're using the same underlying C run-time as the LibVLC + * implementation, then you can call ANSI C free() directly instead. + * + * \param ptr the pointer + */ +LIBVLC_API void libvlc_free( void *ptr ); + +/** \defgroup libvlc_event LibVLC asynchronous events + * LibVLC emits asynchronous events. + * + * Several LibVLC objects (such @ref libvlc_instance_t as + * @ref libvlc_media_player_t) generate events asynchronously. Each of them + * provides @ref libvlc_event_manager_t event manager. You can subscribe to + * events with libvlc_event_attach() and unsubscribe with + * libvlc_event_detach(). + * @{ + */ + +/** + * Event manager that belongs to a libvlc object, and from whom events can + * be received. + */ +typedef struct libvlc_event_manager_t libvlc_event_manager_t; + +struct libvlc_event_t; + +/** + * Type of a LibVLC event. + */ +typedef int libvlc_event_type_t; + +/** + * Callback function notification + * \param p_event the event triggering the callback + */ +typedef void ( *libvlc_callback_t )( const struct libvlc_event_t *, void * ); + +/** + * Register for an event notification. + * + * \param p_event_manager the event manager to which you want to attach to. + * Generally it is obtained by vlc_my_object_event_manager() where + * my_object is the object you want to listen to. + * \param i_event_type the desired event to which we want to listen + * \param f_callback the function to call when i_event_type occurs + * \param user_data user provided data to carry with the event + * \return 0 on success, ENOMEM on error + */ +LIBVLC_API int libvlc_event_attach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *user_data ); + +/** + * Unregister an event notification. + * + * \param p_event_manager the event manager + * \param i_event_type the desired event to which we want to unregister + * \param f_callback the function to call when i_event_type occurs + * \param p_user_data user provided data to carry with the event + */ +LIBVLC_API void libvlc_event_detach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *p_user_data ); + +/** + * Get an event's type name. + * + * \param event_type the desired event + */ +LIBVLC_API const char * libvlc_event_type_name( libvlc_event_type_t event_type ); + +/** @} */ + +/** \defgroup libvlc_log LibVLC logging + * libvlc_log_* functions provide access to the LibVLC messages log. + * This is used for logging and debugging. + * @{ + */ + +/** + * Logging messages level. + * \note Future LibVLC versions may define new levels. + */ +enum libvlc_log_level +{ + LIBVLC_DEBUG=0, /**< Debug message */ + LIBVLC_NOTICE=2, /**< Important informational message */ + LIBVLC_WARNING=3, /**< Warning (potential error) message */ + LIBVLC_ERROR=4 /**< Error message */ +}; + +typedef struct vlc_log_t libvlc_log_t; + +/** + * Gets debugging information about a log message: the name of the VLC module + * emitting the message and the message location within the source code. + * + * The returned module name and file name will be NULL if unknown. + * The returned line number will similarly be zero if unknown. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param module module name storage (or NULL) [OUT] + * \param file source code file name storage (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_context(const libvlc_log_t *ctx, + const char **module, const char **file, unsigned *line); + +/** + * Gets VLC object information about a log message: the type name of the VLC + * object emitting the message, the object header if any and a temporaly-unique + * object identifier. This information is mainly meant for manual + * troubleshooting. + * + * The returned type name may be "generic" if unknown, but it cannot be NULL. + * The returned header will be NULL if unset; in current versions, the header + * is used to distinguish for VLM inputs. + * The returned object ID will be zero if the message is not associated with + * any VLC object. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param name object name storage (or NULL) [OUT] + * \param header object header (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_object(const libvlc_log_t *ctx, + const char **name, const char **header, uintptr_t *id); + +/** + * Callback prototype for LibVLC log message handler. + * \param data data pointer as given to libvlc_log_set() + * \param level message level (@ref enum libvlc_log_level) + * \param ctx message context (meta-information about the message) + * \param fmt printf() format string (as defined by ISO C11) + * \param args variable argument list for the format + * \note Log message handlers must be thread-safe. + * \warning The message context pointer, the format string parameters and the + * variable arguments are only valid until the callback returns. + */ +typedef void (*libvlc_log_cb)(void *data, int level, const libvlc_log_t *ctx, + const char *fmt, va_list args); + +/** + * Unsets the logging callback for a LibVLC instance. This is rarely needed: + * the callback is implicitly unset when the instance is destroyed. + * This function will wait for any pending callbacks invocation to complete + * (causing a deadlock if called from within the callback). + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_unset( libvlc_instance_t * ); + +/** + * Sets the logging callback for a LibVLC instance. + * This function is thread-safe: it will wait for any pending callbacks + * invocation to complete. + * + * \param cb callback function pointer + * \param data opaque data pointer for the callback function + * + * \note Some log messages (especially debug) are emitted by LibVLC while + * is being initialized. These messages cannot be captured with this interface. + * + * \warning A deadlock may occur if this function is called from the callback. + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set( libvlc_instance_t *, + libvlc_log_cb cb, void *data ); + + +/** + * Sets up logging to a file. + * \param p_instance libvlc instance + * \param stream FILE pointer opened for writing + * (the FILE pointer must remain valid until libvlc_log_unset()) + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set_file( libvlc_instance_t *, FILE *stream ); + +/** + * Always returns minus one. + * This function is only provided for backward compatibility. + * + * \param p_instance ignored + * \return always -1 + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_get_log_verbosity( const libvlc_instance_t *p_instance ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_instance ignored + * \param level ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_set_log_verbosity( libvlc_instance_t *p_instance, unsigned level ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_instance libvlc instance + * \return an unique pointer or NULL on error + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_t *libvlc_log_open( libvlc_instance_t *p_instance ); + +/** + * Frees memory allocated by libvlc_log_open(). + * + * \param p_log libvlc log instance or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_close( libvlc_log_t *p_log ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_log ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_log_count( const libvlc_log_t *p_log ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_log ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_clear( libvlc_log_t *p_log ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_log ignored + * \return an unique pointer or NULL on error or if the parameter was NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_iterator_t *libvlc_log_get_iterator( const libvlc_log_t *p_log ); + +/** + * Frees memory allocated by libvlc_log_get_iterator(). + * + * \param p_iter libvlc log iterator or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_iterator_free( libvlc_log_iterator_t *p_iter ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_iter ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_log_iterator_has_next( const libvlc_log_iterator_t *p_iter ); + +/** + * Always returns NULL. + * This function is only provided for backward compatibility. + * + * \param p_iter libvlc log iterator or NULL + * \param p_buf ignored + * \return always NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterator_t *p_iter, + libvlc_log_message_t *p_buf ); + +/** @} */ + +/** + * Description of a module. + */ +typedef struct libvlc_module_description_t +{ + char *psz_name; + char *psz_shortname; + char *psz_longname; + char *psz_help; + struct libvlc_module_description_t *p_next; +} libvlc_module_description_t; + +/** + * Release a list of module descriptions. + * + * \param p_list the list to be released + */ +LIBVLC_API +void libvlc_module_description_list_release( libvlc_module_description_t *p_list ); + +/** + * Returns a list of audio filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_audio_filter_list_get( libvlc_instance_t *p_instance ); + +/** + * Returns a list of video filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_video_filter_list_get( libvlc_instance_t *p_instance ); + +/** @} */ + +/** \defgroup libvlc_clock LibVLC time + * These functions provide access to the LibVLC time/clock. + * @{ + */ + +/** + * Return the current time as defined by LibVLC. The unit is the microsecond. + * Time increases monotonically (regardless of time zone changes and RTC + * adjustements). + * The origin is arbitrary but consistent across the whole system + * (e.g. the system uptim, the time since the system was booted). + * \note On systems that support it, the POSIX monotonic clock is used. + */ +LIBVLC_API +int64_t libvlc_clock(void); + +/** + * Return the delay (in microseconds) until a certain timestamp. + * \param pts timestamp + * \return negative if timestamp is in the past, + * positive if it is in the future + */ +static inline int64_t libvlc_delay(int64_t pts) +{ + return pts - libvlc_clock(); +} + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_events.h b/vlcdemo/vlc/vlc2/include/libvlc_events.h new file mode 100644 index 0000000..7b29cd3 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_events.h @@ -0,0 +1,253 @@ +/***************************************************************************** + * libvlc_events.h: libvlc_events external API structure + ***************************************************************************** + * Copyright (C) 1998-2010 VLC authors and VideoLAN + * $Id $ + * + * Authors: Filippo Carone + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_EVENTS_H +#define LIBVLC_EVENTS_H 1 + +/** + * \file + * This file defines libvlc_event external API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \ingroup libvlc_event + * @{ + */ + +/** + * Event types + */ +enum libvlc_event_e { + /* Append new event types at the end of a category. + * Do not remove, insert or re-order any entry. + * Keep this in sync with lib/event.c:libvlc_event_type_name(). */ + libvlc_MediaMetaChanged=0, + libvlc_MediaSubItemAdded, + libvlc_MediaDurationChanged, + libvlc_MediaParsedChanged, + libvlc_MediaFreed, + libvlc_MediaStateChanged, + libvlc_MediaSubItemTreeAdded, + + libvlc_MediaPlayerMediaChanged=0x100, + libvlc_MediaPlayerNothingSpecial, + libvlc_MediaPlayerOpening, + libvlc_MediaPlayerBuffering, + libvlc_MediaPlayerPlaying, + libvlc_MediaPlayerPaused, + libvlc_MediaPlayerStopped, + libvlc_MediaPlayerForward, + libvlc_MediaPlayerBackward, + libvlc_MediaPlayerEndReached, + libvlc_MediaPlayerEncounteredError, + libvlc_MediaPlayerTimeChanged, + libvlc_MediaPlayerPositionChanged, + libvlc_MediaPlayerSeekableChanged, + libvlc_MediaPlayerPausableChanged, + libvlc_MediaPlayerTitleChanged, + libvlc_MediaPlayerSnapshotTaken, + libvlc_MediaPlayerLengthChanged, + libvlc_MediaPlayerVout, + libvlc_MediaPlayerScrambledChanged, + libvlc_MediaPlayerCorked = libvlc_MediaPlayerScrambledChanged + 3 + 1, + libvlc_MediaPlayerUncorked, + libvlc_MediaPlayerMuted, + libvlc_MediaPlayerUnmuted, + libvlc_MediaPlayerAudioVolume, + + libvlc_MediaListItemAdded=0x200, + libvlc_MediaListWillAddItem, + libvlc_MediaListItemDeleted, + libvlc_MediaListWillDeleteItem, + + libvlc_MediaListViewItemAdded=0x300, + libvlc_MediaListViewWillAddItem, + libvlc_MediaListViewItemDeleted, + libvlc_MediaListViewWillDeleteItem, + + libvlc_MediaListPlayerPlayed=0x400, + libvlc_MediaListPlayerNextItemSet, + libvlc_MediaListPlayerStopped, + + libvlc_MediaDiscovererStarted=0x500, + libvlc_MediaDiscovererEnded, + + libvlc_VlmMediaAdded=0x600, + libvlc_VlmMediaRemoved, + libvlc_VlmMediaChanged, + libvlc_VlmMediaInstanceStarted, + libvlc_VlmMediaInstanceStopped, + libvlc_VlmMediaInstanceStatusInit, + libvlc_VlmMediaInstanceStatusOpening, + libvlc_VlmMediaInstanceStatusPlaying, + libvlc_VlmMediaInstanceStatusPause, + libvlc_VlmMediaInstanceStatusEnd, + libvlc_VlmMediaInstanceStatusError +}; + +/** + * A LibVLC event + */ +typedef struct libvlc_event_t +{ + int type; /**< Event type (see @ref libvlc_event_e) */ + void *p_obj; /**< Object emitting the event */ + union + { + /* media descriptor */ + struct + { + libvlc_meta_t meta_type; + } media_meta_changed; + struct + { + libvlc_media_t * new_child; + } media_subitem_added; + struct + { + int64_t new_duration; + } media_duration_changed; + struct + { + int new_status; + } media_parsed_changed; + struct + { + libvlc_media_t * md; + } media_freed; + struct + { + libvlc_state_t new_state; + } media_state_changed; + struct + { + libvlc_media_t * item; + } media_subitemtree_added; + + /* media instance */ + struct + { + float new_cache; + } media_player_buffering; + struct + { + float new_position; + } media_player_position_changed; + struct + { + libvlc_time_t new_time; + } media_player_time_changed; + struct + { + int new_title; + } media_player_title_changed; + struct + { + int new_seekable; + } media_player_seekable_changed; + struct + { + int new_pausable; + } media_player_pausable_changed; + struct + { + int new_scrambled; + } media_player_scrambled_changed; + struct + { + int new_count; + } media_player_vout; + + /* media list */ + struct + { + libvlc_media_t * item; + int index; + } media_list_item_added; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_add_item; + struct + { + libvlc_media_t * item; + int index; + } media_list_item_deleted; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_delete_item; + + /* media list player */ + struct + { + libvlc_media_t * item; + } media_list_player_next_item_set; + + /* snapshot taken */ + struct + { + char* psz_filename ; + } media_player_snapshot_taken ; + + /* Length changed */ + struct + { + libvlc_time_t new_length; + } media_player_length_changed; + + /* VLM media */ + struct + { + const char * psz_media_name; + const char * psz_instance_name; + } vlm_media_event; + + /* Extra MediaPlayer */ + struct + { + libvlc_media_t * new_media; + } media_player_media_changed; + + struct + { + float volume; + } media_player_audio_volume; + } u; /**< Type-dependent event description */ +} libvlc_event_t; + + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_media.h b/vlcdemo/vlc/vlc2/include/libvlc_media.h new file mode 100644 index 0000000..e3e9913 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_media.h @@ -0,0 +1,609 @@ +/***************************************************************************** + * libvlc_media.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 948230a3f17569091b982038ec2c66b48e1a4398 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media external API + */ + +#ifndef VLC_LIBVLC_MEDIA_H +#define VLC_LIBVLC_MEDIA_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media LibVLC media + * \ingroup libvlc + * @ref libvlc_media_t is an abstract representation of a playable media. + * It consists of a media location and various optional meta data. + * @{ + */ + +typedef struct libvlc_media_t libvlc_media_t; + +/** defgroup libvlc_meta LibVLC meta data + * \ingroup libvlc_media + * @{ + */ + +/** Meta data types */ +typedef enum libvlc_meta_t { + libvlc_meta_Title, + libvlc_meta_Artist, + libvlc_meta_Genre, + libvlc_meta_Copyright, + libvlc_meta_Album, + libvlc_meta_TrackNumber, + libvlc_meta_Description, + libvlc_meta_Rating, + libvlc_meta_Date, + libvlc_meta_Setting, + libvlc_meta_URL, + libvlc_meta_Language, + libvlc_meta_NowPlaying, + libvlc_meta_Publisher, + libvlc_meta_EncodedBy, + libvlc_meta_ArtworkURL, + libvlc_meta_TrackID, + libvlc_meta_TrackTotal, + libvlc_meta_Director, + libvlc_meta_Season, + libvlc_meta_Episode, + libvlc_meta_ShowName, + libvlc_meta_Actors + /* Add new meta types HERE */ +} libvlc_meta_t; + +/** @}*/ + +/** + * Note the order of libvlc_state_t enum must match exactly the order of + * \see mediacontrol_PlayerStatus, \see input_state_e enums, + * and VideoLAN.LibVLC.State (at bindings/cil/src/media.cs). + * + * Expected states by web plugins are: + * IDLE/CLOSE=0, OPENING=1, BUFFERING=2, PLAYING=3, PAUSED=4, + * STOPPING=5, ENDED=6, ERROR=7 + */ +typedef enum libvlc_state_t +{ + libvlc_NothingSpecial=0, + libvlc_Opening, + libvlc_Buffering, + libvlc_Playing, + libvlc_Paused, + libvlc_Stopped, + libvlc_Ended, + libvlc_Error +} libvlc_state_t; + +enum +{ + libvlc_media_option_trusted = 0x2, + libvlc_media_option_unique = 0x100 +}; + +typedef enum libvlc_track_type_t +{ + libvlc_track_unknown = -1, + libvlc_track_audio = 0, + libvlc_track_video = 1, + libvlc_track_text = 2 +} libvlc_track_type_t; + +/** defgroup libvlc_media_stats_t LibVLC media statistics + * \ingroup libvlc_media + * @{ + */ +typedef struct libvlc_media_stats_t +{ + /* Input */ + int i_read_bytes; + float f_input_bitrate; + + /* Demux */ + int i_demux_read_bytes; + float f_demux_bitrate; + int i_demux_corrupted; + int i_demux_discontinuity; + + /* Decoders */ + int i_decoded_video; + int i_decoded_audio; + + /* Video Output */ + int i_displayed_pictures; + int i_lost_pictures; + + /* Audio output */ + int i_played_abuffers; + int i_lost_abuffers; + + /* Stream output */ + int i_sent_packets; + int i_sent_bytes; + float f_send_bitrate; +} libvlc_media_stats_t; +/** @}*/ + +typedef struct libvlc_media_track_info_t +{ + /* Codec fourcc */ + uint32_t i_codec; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + struct { + /* Audio specific */ + unsigned i_channels; + unsigned i_rate; + } audio; + struct { + /* Video specific */ + unsigned i_height; + unsigned i_width; + } video; + } u; + +} libvlc_media_track_info_t; + + +typedef struct libvlc_audio_track_t +{ + unsigned i_channels; + unsigned i_rate; +} libvlc_audio_track_t; + +typedef struct libvlc_video_track_t +{ + unsigned i_height; + unsigned i_width; + unsigned i_sar_num; + unsigned i_sar_den; + unsigned i_frame_rate_num; + unsigned i_frame_rate_den; +} libvlc_video_track_t; + +typedef struct libvlc_subtitle_track_t +{ + char *psz_encoding; +} libvlc_subtitle_track_t; + +typedef struct libvlc_media_track_t +{ + /* Codec fourcc */ + uint32_t i_codec; + uint32_t i_original_fourcc; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + libvlc_audio_track_t *audio; + libvlc_video_track_t *video; + libvlc_subtitle_track_t *subtitle; + }; + + unsigned int i_bitrate; + char *psz_language; + char *psz_description; + +} libvlc_media_track_t; + + +/** + * Create a media with a certain given media resource location, + * for instance a valid URL. + * + * \note To refer to a local file with this function, + * the file://... URI syntax must be used (see IETF RFC3986). + * We recommend using libvlc_media_new_path() instead when dealing with + * local files. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_mrl the media location + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_location( + libvlc_instance_t *p_instance, + const char * psz_mrl ); + +/** + * Create a media for a certain file path. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param path local filesystem path + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_path( + libvlc_instance_t *p_instance, + const char *path ); + +/** + * Create a media for an already open file descriptor. + * The file descriptor shall be open for reading (or reading and writing). + * + * Regular file descriptors, pipe read descriptors and character device + * descriptors (including TTYs) are supported on all platforms. + * Block device descriptors are supported where available. + * Directory descriptors are supported on systems that provide fdopendir(). + * Sockets are supported on all platforms where they are file descriptors, + * i.e. all except Windows. + * + * \note This library will not automatically close the file descriptor + * under any circumstance. Nevertheless, a file descriptor can usually only be + * rendered once in a media player. To render it a second time, the file + * descriptor should probably be rewound to the beginning with lseek(). + * + * \see libvlc_media_release + * + * \version LibVLC 1.1.5 and later. + * + * \param p_instance the instance + * \param fd open file descriptor + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_fd( + libvlc_instance_t *p_instance, + int fd ); + + +/** + * Create a media as an empty node with a given name. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_name the name of the node + * \return the new empty media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_as_node( + libvlc_instance_t *p_instance, + const char * psz_name ); + +/** + * Add an option to the media. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * \note The options are listed in 'vlc --long-help' from the command line, + * e.g. "-sout-all". Keep in mind that available options and their semantics + * vary across LibVLC versions and builds. + * \warning Not all options affects libvlc_media_t objects: + * Specifically, due to architectural issues most audio and video options, + * such as text renderer options, have no effects on an individual media. + * These options must be set through libvlc_new() instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + */ +LIBVLC_API void libvlc_media_add_option( + libvlc_media_t *p_md, + const char * psz_options ); + +/** + * Add an option to the media with configurable flags. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * The options are detailed in vlc --long-help, for instance + * "--sout-all". Note that all options are not usable on medias: + * specifically, due to architectural issues, video-related options + * such as text renderer options cannot be set on a single media. They + * must be set on the whole libvlc instance instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + * \param i_flags the flags for this option + */ +LIBVLC_API void libvlc_media_add_option_flag( + libvlc_media_t *p_md, + const char * psz_options, + unsigned i_flags ); + + +/** + * Retain a reference to a media descriptor object (libvlc_media_t). Use + * libvlc_media_release() to decrement the reference count of a + * media descriptor object. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_retain( libvlc_media_t *p_md ); + +/** + * Decrement the reference count of a media descriptor object. If the + * reference count is 0, then libvlc_media_release() will release the + * media descriptor object. It will send out an libvlc_MediaFreed event + * to all listeners. If the media descriptor object has been released it + * should not be used again. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_release( libvlc_media_t *p_md ); + + +/** + * Get the media resource locator (mrl) from a media descriptor object + * + * \param p_md a media descriptor object + * \return string with mrl of media descriptor object + */ +LIBVLC_API char *libvlc_media_get_mrl( libvlc_media_t *p_md ); + +/** + * Duplicate a media descriptor object. + * + * \param p_md a media descriptor object. + */ +LIBVLC_API libvlc_media_t *libvlc_media_duplicate( libvlc_media_t *p_md ); + +/** + * Read the meta of the media. + * + * If the media has not yet been parsed this will return NULL. + * + * This methods automatically calls libvlc_media_parse_async(), so after calling + * it you may receive a libvlc_MediaMetaChanged event. If you prefer a synchronous + * version ensure that you call libvlc_media_parse() before get_meta(). + * + * \see libvlc_media_parse + * \see libvlc_media_parse_async + * \see libvlc_MediaMetaChanged + * + * \param p_md the media descriptor + * \param e_meta the meta to read + * \return the media's meta + */ +LIBVLC_API char *libvlc_media_get_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta ); + +/** + * Set the meta of the media (this function will not save the meta, call + * libvlc_media_save_meta in order to save the meta) + * + * \param p_md the media descriptor + * \param e_meta the meta to write + * \param psz_value the media's meta + */ +LIBVLC_API void libvlc_media_set_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta, + const char *psz_value ); + + +/** + * Save the meta previously set + * + * \param p_md the media desriptor + * \return true if the write operation was successful + */ +LIBVLC_API int libvlc_media_save_meta( libvlc_media_t *p_md ); + + +/** + * Get current state of media descriptor object. Possible media states + * are defined in libvlc_structures.c ( libvlc_NothingSpecial=0, + * libvlc_Opening, libvlc_Buffering, libvlc_Playing, libvlc_Paused, + * libvlc_Stopped, libvlc_Ended, + * libvlc_Error). + * + * \see libvlc_state_t + * \param p_md a media descriptor object + * \return state of media descriptor object + */ +LIBVLC_API libvlc_state_t libvlc_media_get_state( + libvlc_media_t *p_md ); + + +/** + * Get the current statistics about the media + * \param p_md: media descriptor object + * \param p_stats: structure that contain the statistics about the media + * (this structure must be allocated by the caller) + * \return true if the statistics are available, false otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_get_stats( libvlc_media_t *p_md, + libvlc_media_stats_t *p_stats ); + +/* The following method uses libvlc_media_list_t, however, media_list usage is optionnal + * and this is here for convenience */ +#define VLC_FORWARD_DECLARE_OBJECT(a) struct a + +/** + * Get subitems of media descriptor object. This will increment + * the reference count of supplied media descriptor object. Use + * libvlc_media_list_release() to decrement the reference counting. + * + * \param p_md media descriptor object + * \return list of media descriptor subitems or NULL + */ +LIBVLC_API VLC_FORWARD_DECLARE_OBJECT(libvlc_media_list_t *) +libvlc_media_subitems( libvlc_media_t *p_md ); + +/** + * Get event manager from media descriptor object. + * NOTE: this function doesn't increment reference counting. + * + * \param p_md a media descriptor object + * \return event manager object + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_event_manager( libvlc_media_t *p_md ); + +/** + * Get duration (in ms) of media descriptor object item. + * + * \param p_md media descriptor object + * \return duration of media item or -1 on error + */ +LIBVLC_API libvlc_time_t + libvlc_media_get_duration( libvlc_media_t *p_md ); + +/** + * Parse a media. + * + * This fetches (local) meta data and tracks information. + * The method is synchronous. + * + * \see libvlc_media_parse_async + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_API void +libvlc_media_parse( libvlc_media_t *p_md ); + +/** + * Parse a media. + * + * This fetches (local) meta data and tracks information. + * The method is the asynchronous of libvlc_media_parse(). + * + * To track when this is over you can listen to libvlc_MediaParsedChanged + * event. However if the media was already parsed you will not receive this + * event. + * + * \see libvlc_media_parse + * \see libvlc_MediaParsedChanged + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_API void +libvlc_media_parse_async( libvlc_media_t *p_md ); + +/** + * Get Parsed status for media descriptor object. + * + * \see libvlc_MediaParsedChanged + * + * \param p_md media descriptor object + * \return true if media object has been parsed otherwise it returns false + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_is_parsed( libvlc_media_t *p_md ); + +/** + * Sets media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + * \param p_new_user_data pointer to user data + */ +LIBVLC_API void + libvlc_media_set_user_data( libvlc_media_t *p_md, void *p_new_user_data ); + +/** + * Get media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + */ +LIBVLC_API void *libvlc_media_get_user_data( libvlc_media_t *p_md ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \deprecated Use libvlc_media_tracks_get instead + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed by the caller) [OUT] + * + * \return the number of Elementary Streams + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_media_get_tracks_info( libvlc_media_t *p_md, + libvlc_media_track_info_t **tracks ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \version LibVLC 2.1.0 and later. + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed with libvlc_media_tracks_release + by the caller) [OUT] + * + * \return the number of Elementary Streams (zero on error) + */ +LIBVLC_API +unsigned libvlc_media_tracks_get( libvlc_media_t *p_md, + libvlc_media_track_t ***tracks ); + + +/** + * Release media descriptor's elementary streams description array + * + * \version LibVLC 2.1.0 and later. + * + * \param p_tracks tracks info array to release + * \param i_count number of elements in the array + */ +LIBVLC_API +void libvlc_media_tracks_release( libvlc_media_track_t **p_tracks, + unsigned i_count ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_H */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_media_discoverer.h b/vlcdemo/vlc/vlc2/include/libvlc_media_discoverer.h new file mode 100644 index 0000000..3883419 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_media_discoverer.h @@ -0,0 +1,111 @@ +/***************************************************************************** + * libvlc_media_discoverer.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: cf263b0536d9b19e725e039f12ef20eaa392fec3 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media_discoverer external API + */ + +#ifndef VLC_LIBVLC_MEDIA_DISCOVERER_H +#define VLC_LIBVLC_MEDIA_DISCOVERER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_discoverer LibVLC media discovery + * \ingroup libvlc + * LibVLC media discovery finds available media via various means. + * This corresponds to the service discovery functionality in VLC media player. + * Different plugins find potential medias locally (e.g. user media directory), + * from peripherals (e.g. video capture device), on the local network + * (e.g. SAP) or on the Internet (e.g. Internet radios). + * @{ + */ + +typedef struct libvlc_media_discoverer_t libvlc_media_discoverer_t; + +/** + * Discover media service by name. + * + * \param p_inst libvlc instance + * \param psz_name service name + * \return media discover object or NULL in case of error + */ +LIBVLC_API libvlc_media_discoverer_t * +libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, + const char * psz_name ); + +/** + * Release media discover object. If the reference count reaches 0, then + * the object will be released. + * + * \param p_mdis media service discover object + */ +LIBVLC_API void libvlc_media_discoverer_release( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media service discover object its localized name. + * + * \param p_mdis media discover object + * \return localized name + */ +LIBVLC_API char * libvlc_media_discoverer_localized_name( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media service discover media list. + * + * \param p_mdis media service discover object + * \return list of media items + */ +LIBVLC_API libvlc_media_list_t * libvlc_media_discoverer_media_list( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get event manager from media service discover object. + * + * \param p_mdis media service discover object + * \return event manager object. + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_discoverer_event_manager( libvlc_media_discoverer_t * p_mdis ); + +/** + * Query if media service discover object is running. + * + * \param p_mdis media service discover object + * \return true if running, false if not + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_discoverer_is_running( libvlc_media_discoverer_t * p_mdis ); + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_media_library.h b/vlcdemo/vlc/vlc2/include/libvlc_media_library.h new file mode 100644 index 0000000..4134c07 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_media_library.h @@ -0,0 +1,99 @@ +/***************************************************************************** + * libvlc_media_library.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: fa7094a6a8aac42607490c9982d9f4d082c2794c $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media_library external API + */ + +#ifndef VLC_LIBVLC_MEDIA_LIBRARY_H +#define VLC_LIBVLC_MEDIA_LIBRARY_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_library LibVLC media library + * \ingroup libvlc + * @{ + */ + +typedef struct libvlc_media_library_t libvlc_media_library_t; + +/** + * Create an new Media Library object + * + * \param p_instance the libvlc instance + * \return a new object or NULL on error + */ +LIBVLC_API libvlc_media_library_t * + libvlc_media_library_new( libvlc_instance_t * p_instance ); + +/** + * Release media library object. This functions decrements the + * reference count of the media library object. If it reaches 0, + * then the object will be released. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_release( libvlc_media_library_t * p_mlib ); + +/** + * Retain a reference to a media library object. This function will + * increment the reference counting for this object. Use + * libvlc_media_library_release() to decrement the reference count. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_retain( libvlc_media_library_t * p_mlib ); + +/** + * Load media library. + * + * \param p_mlib media library object + * \return 0 on success, -1 on error + */ +LIBVLC_API int + libvlc_media_library_load( libvlc_media_library_t * p_mlib ); + +/** + * Get media library subitems. + * + * \param p_mlib media library object + * \return media list subitems + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_library_media_list( libvlc_media_library_t * p_mlib ); + + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_media_list.h b/vlcdemo/vlc/vlc2/include/libvlc_media_list.h new file mode 100644 index 0000000..6330c6f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_media_list.h @@ -0,0 +1,209 @@ +/***************************************************************************** + * libvlc_media_list.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 015824bf54e656cc67838452c7e99a00a452af6e $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_H +#define LIBVLC_MEDIA_LIST_H 1 + +/** + * \file + * This file defines libvlc_media_list API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_list LibVLC media list + * \ingroup libvlc + * A LibVLC media list holds multiple @ref libvlc_media_t media descriptors. + * @{ + */ + +typedef struct libvlc_media_list_t libvlc_media_list_t; + +/** + * Create an empty media list. + * + * \param p_instance libvlc instance + * \return empty media list, or NULL on error + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_list_new( libvlc_instance_t *p_instance ); + +/** + * Release media list created with libvlc_media_list_new(). + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_release( libvlc_media_list_t *p_ml ); + +/** + * Retain reference to a media list + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_retain( libvlc_media_list_t *p_ml ); + +LIBVLC_DEPRECATED int + libvlc_media_list_add_file_content( libvlc_media_list_t * p_ml, + const char * psz_uri ); + +/** + * Associate media instance with this media list instance. + * If another media instance was present it will be released. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance to add + */ +LIBVLC_API void +libvlc_media_list_set_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Get media instance from this media list instance. This action will increase + * the refcount on the media instance. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \return media instance + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_media( libvlc_media_list_t *p_ml ); + +/** + * Add media instance to media list + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_add_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Insert media instance in media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_insert_media( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md, int i_pos ); + +/** + * Remove media instance from media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the list is read-only or the item was not found + */ +LIBVLC_API int +libvlc_media_list_remove_index( libvlc_media_list_t *p_ml, int i_pos ); + +/** + * Get count on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \return number of items in media list + */ +LIBVLC_API int + libvlc_media_list_count( libvlc_media_list_t *p_ml ); + +/** + * List media instance in media list at a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return media instance at position i_pos, or NULL if not found. + * In case of success, libvlc_media_retain() is called to increase the refcount + * on the media. + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_item_at_index( libvlc_media_list_t *p_ml, int i_pos ); +/** + * Find index position of List media instance in media list. + * Warning: the function will return the first matched position. + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance + * \return position of media instance or -1 if media not found + */ +LIBVLC_API int + libvlc_media_list_index_of_item( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md ); + +/** + * This indicates if this media list is read-only from a user point of view + * + * \param p_ml media list instance + * \return 1 on readonly, 0 on readwrite + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_is_readonly( libvlc_media_list_t * p_ml ); + +/** + * Get lock on media list items + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_lock( libvlc_media_list_t *p_ml ); + +/** + * Release lock on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_unlock( libvlc_media_list_t *p_ml ); + +/** + * Get libvlc_event_manager from this media list instance. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_ml a media list instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_event_manager( libvlc_media_list_t *p_ml ); + +/** @} media_list */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_MEDIA_LIST_H */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_media_list_player.h b/vlcdemo/vlc/vlc2/include/libvlc_media_list_player.h new file mode 100644 index 0000000..5fa3285 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_media_list_player.h @@ -0,0 +1,224 @@ +/***************************************************************************** + * libvlc_media_list_player.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: c95ad972c7dcf380ef62e60d821af726848dae48 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_PLAYER_H +#define LIBVLC_MEDIA_LIST_PLAYER_H 1 + +/** + * \file + * This file defines libvlc_media_list_player API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * Media List Player + *****************************************************************************/ +/** \defgroup libvlc_media_list_player LibVLC media list player + * \ingroup libvlc + * The LibVLC media list player plays a @ref libvlc_media_list_t list of media, + * in a certain order. + * This is required to especially support playlist files. + * The normal @ref libvlc_media_player_t LibVLC media player can only play a + * single media, and does not handle playlist files properly. + * @{ + */ + +typedef struct libvlc_media_list_player_t libvlc_media_list_player_t; + +/** + * Defines playback modes for playlist. + */ +typedef enum libvlc_playback_mode_t +{ + libvlc_playback_mode_default, + libvlc_playback_mode_loop, + libvlc_playback_mode_repeat +} libvlc_playback_mode_t; + +/** + * Create new media_list_player. + * + * \param p_instance libvlc instance + * \return media list player instance or NULL on error + */ +LIBVLC_API libvlc_media_list_player_t * + libvlc_media_list_player_new( libvlc_instance_t * p_instance ); + +/** + * Release a media_list_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_list_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_release( libvlc_media_list_player_t * p_mlp ); + +/** + * Retain a reference to a media player list object. Use + * libvlc_media_list_player_release() to decrement reference count. + * + * \param p_mlp media player list object + */ +LIBVLC_API void + libvlc_media_list_player_retain( libvlc_media_list_player_t *p_mlp ); + +/** + * Return the event manager of this media_list_player. + * + * \param p_mlp media list player instance + * \return the event manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_player_event_manager(libvlc_media_list_player_t * p_mlp); + +/** + * Replace media player in media_list_player with this instance. + * + * \param p_mlp media list player instance + * \param p_mi media player instance + */ +LIBVLC_API void + libvlc_media_list_player_set_media_player( + libvlc_media_list_player_t * p_mlp, + libvlc_media_player_t * p_mi ); + +/** + * Set the media list associated with the player + * + * \param p_mlp media list player instance + * \param p_mlist list of media + */ +LIBVLC_API void + libvlc_media_list_player_set_media_list( + libvlc_media_list_player_t * p_mlp, + libvlc_media_list_t * p_mlist ); + +/** + * Play media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_play(libvlc_media_list_player_t * p_mlp); + +/** + * Toggle pause (or resume) media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_pause(libvlc_media_list_player_t * p_mlp); + +/** + * Is media list playing? + * + * \param p_mlp media list player instance + * \return true for playing and false for not playing + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_player_is_playing( libvlc_media_list_player_t * p_mlp ); + +/** + * Get current libvlc_state of media list player + * + * \param p_mlp media list player instance + * \return libvlc_state_t for media list player + */ +LIBVLC_API libvlc_state_t + libvlc_media_list_player_get_state( libvlc_media_list_player_t * p_mlp ); + +/** + * Play media list item at position index + * + * \param p_mlp media list player instance + * \param i_index index in media list to play + * \return 0 upon success -1 if the item wasn't found + */ +LIBVLC_API +int libvlc_media_list_player_play_item_at_index(libvlc_media_list_player_t * p_mlp, + int i_index); + +/** + * Play the given media item + * + * \param p_mlp media list player instance + * \param p_md the media instance + * \return 0 upon success, -1 if the media is not part of the media list + */ +LIBVLC_API +int libvlc_media_list_player_play_item(libvlc_media_list_player_t * p_mlp, + libvlc_media_t * p_md); + +/** + * Stop playing media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_stop( libvlc_media_list_player_t * p_mlp); + +/** + * Play next item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no next item + */ +LIBVLC_API +int libvlc_media_list_player_next(libvlc_media_list_player_t * p_mlp); + +/** + * Play previous item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no previous item + */ +LIBVLC_API +int libvlc_media_list_player_previous(libvlc_media_list_player_t * p_mlp); + + + +/** + * Sets the playback mode for the playlist + * + * \param p_mlp media list player instance + * \param e_mode playback mode specification + */ +LIBVLC_API +void libvlc_media_list_player_set_playback_mode(libvlc_media_list_player_t * p_mlp, + libvlc_playback_mode_t e_mode ); + +/** @} media_list_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* LIBVLC_MEDIA_LIST_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_media_player.h b/vlcdemo/vlc/vlc2/include/libvlc_media_player.h new file mode 100644 index 0000000..00afa61 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_media_player.h @@ -0,0 +1,1881 @@ +/***************************************************************************** + * libvlc_media_player.h: libvlc_media_player external API + ***************************************************************************** + * Copyright (C) 1998-2010 VLC authors and VideoLAN + * $Id: 94bf7e8c4461896ff0d22b7c86ce6d3f9854eb17 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media_player external API + */ + +#ifndef VLC_LIBVLC_MEDIA_PLAYER_H +#define VLC_LIBVLC_MEDIA_PLAYER_H 1 + +# ifdef __cplusplus +extern "C" { +# else +# include +# endif + +/***************************************************************************** + * Media Player + *****************************************************************************/ +/** \defgroup libvlc_media_player LibVLC media player + * \ingroup libvlc + * A LibVLC media player plays one media (usually in a custom drawable). + * @{ + */ + +typedef struct libvlc_media_player_t libvlc_media_player_t; + +/** + * Description for video, audio tracks and subtitles. It contains + * id, name (description string) and pointer to next record. + */ +typedef struct libvlc_track_description_t +{ + int i_id; + char *psz_name; + struct libvlc_track_description_t *p_next; + +} libvlc_track_description_t; + +/** + * Description for audio output. It contains + * name, description and pointer to next record. + */ +typedef struct libvlc_audio_output_t +{ + char *psz_name; + char *psz_description; + struct libvlc_audio_output_t *p_next; + +} libvlc_audio_output_t; + +/** + * Description for audio output device. + */ +typedef struct libvlc_audio_output_device_t +{ + struct libvlc_audio_output_device_t *p_next; /**< Next entry in list */ + char *psz_device; /**< Device identifier string */ + char *psz_description; /**< User-friendly device description */ + /* More fields may be added here in later versions */ +} libvlc_audio_output_device_t; + +/** + * Rectangle type for video geometry + */ +typedef struct libvlc_rectangle_t +{ + int top, left; + int bottom, right; +} libvlc_rectangle_t; + +/** + * Marq options definition + */ +typedef enum libvlc_video_marquee_option_t { + libvlc_marquee_Enable = 0, + libvlc_marquee_Text, /** string argument */ + libvlc_marquee_Color, + libvlc_marquee_Opacity, + libvlc_marquee_Position, + libvlc_marquee_Refresh, + libvlc_marquee_Size, + libvlc_marquee_Timeout, + libvlc_marquee_X, + libvlc_marquee_Y +} libvlc_video_marquee_option_t; + +/** + * Navigation mode + */ +typedef enum libvlc_navigate_mode_t +{ + libvlc_navigate_activate = 0, + libvlc_navigate_up, + libvlc_navigate_down, + libvlc_navigate_left, + libvlc_navigate_right +} libvlc_navigate_mode_t; + +/** + * Enumeration of values used to set position (e.g. of video title). + */ +typedef enum libvlc_position_t { + libvlc_position_disable=-1, + libvlc_position_center, + libvlc_position_left, + libvlc_position_right, + libvlc_position_top, + libvlc_position_top_left, + libvlc_position_top_right, + libvlc_position_bottom, + libvlc_position_bottom_left, + libvlc_position_bottom_right +} libvlc_position_t; + +/** + * Opaque equalizer handle. + * + * Equalizer settings can be applied to a media player. + */ +typedef struct libvlc_equalizer_t libvlc_equalizer_t; + +/** + * Create an empty Media Player object + * + * \param p_libvlc_instance the libvlc instance in which the Media Player + * should be created. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new( libvlc_instance_t *p_libvlc_instance ); + +/** + * Create a Media Player object from a Media + * + * \param p_md the media. Afterwards the p_md can be safely + * destroyed. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new_from_media( libvlc_media_t *p_md ); + +/** + * Release a media_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mi the Media Player to free + */ +LIBVLC_API void libvlc_media_player_release( libvlc_media_player_t *p_mi ); + +/** + * Retain a reference to a media player object. Use + * libvlc_media_player_release() to decrement reference count. + * + * \param p_mi media player object + */ +LIBVLC_API void libvlc_media_player_retain( libvlc_media_player_t *p_mi ); + +/** + * Set the media that will be used by the media_player. If any, + * previous md will be released. + * + * \param p_mi the Media Player + * \param p_md the Media. Afterwards the p_md can be safely + * destroyed. + */ +LIBVLC_API void libvlc_media_player_set_media( libvlc_media_player_t *p_mi, + libvlc_media_t *p_md ); + +/** + * Get the media used by the media_player. + * + * \param p_mi the Media Player + * \return the media associated with p_mi, or NULL if no + * media is associated + */ +LIBVLC_API libvlc_media_t * libvlc_media_player_get_media( libvlc_media_player_t *p_mi ); + +/** + * Get the Event Manager from which the media player send event. + * + * \param p_mi the Media Player + * \return the event manager associated with p_mi + */ +LIBVLC_API libvlc_event_manager_t * libvlc_media_player_event_manager ( libvlc_media_player_t *p_mi ); + +/** + * is_playing + * + * \param p_mi the Media Player + * \return 1 if the media player is playing, 0 otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_playing ( libvlc_media_player_t *p_mi ); + +/** + * Play + * + * \param p_mi the Media Player + * \return 0 if playback started (and was already started), or -1 on error. + */ +LIBVLC_API int libvlc_media_player_play ( libvlc_media_player_t *p_mi ); + +/** + * Pause or resume (no effect if there is no media) + * + * \param mp the Media Player + * \param do_pause play/resume if zero, pause if non-zero + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API void libvlc_media_player_set_pause ( libvlc_media_player_t *mp, + int do_pause ); + +/** + * Toggle pause (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_pause ( libvlc_media_player_t *p_mi ); + +/** + * Stop (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_stop ( libvlc_media_player_t *p_mi ); + +/** + * Callback prototype to allocate and lock a picture buffer. + * + * Whenever a new video frame needs to be decoded, the lock callback is + * invoked. Depending on the video chroma, one or three pixel planes of + * adequate dimensions must be returned via the second parameter. Those + * planes must be aligned on 32-bytes boundaries. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param planes start address of the pixel planes (LibVLC allocates the array + * of void pointers, this callback must initialize the array) [OUT] + * \return a private pointer for the display and unlock callbacks to identify + * the picture buffers + */ +typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes); + +/** + * Callback prototype to unlock a picture buffer. + * + * When the video frame decoding is complete, the unlock callback is invoked. + * This callback might not be needed at all. It is only an indication that the + * application can now read the pixel values if it needs to. + * + * \warning A picture buffer is unlocked after the picture is decoded, + * but before the picture is displayed. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + * \param planes pixel planes as defined by the @ref libvlc_video_lock_cb + * callback (this parameter is only for convenience) [IN] + */ +typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture, + void *const *planes); + +/** + * Callback prototype to display a picture. + * + * When the video frame needs to be shown, as determined by the media playback + * clock, the display callback is invoked. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + */ +typedef void (*libvlc_video_display_cb)(void *opaque, void *picture); + +/** + * Callback prototype to configure picture buffers format. + * This callback gets the format of the video as output by the video decoder + * and the chain of video filters (if any). It can opt to change any parameter + * as it needs. In that case, LibVLC will attempt to convert the video format + * (rescaling and chroma conversion) but these operations can be CPU intensive. + * + * \param opaque pointer to the private pointer passed to + * libvlc_video_set_callbacks() [IN/OUT] + * \param chroma pointer to the 4 bytes video format identifier [IN/OUT] + * \param width pointer to the pixel width [IN/OUT] + * \param height pointer to the pixel height [IN/OUT] + * \param pitches table of scanline pitches in bytes for each pixel plane + * (the table is allocated by LibVLC) [OUT] + * \param lines table of scanlines count for each plane [OUT] + * \return the number of picture buffers allocated, 0 indicates failure + * + * \note + * For each pixels plane, the scanline pitch must be bigger than or equal to + * the number of bytes per pixel multiplied by the pixel width. + * Similarly, the number of scanlines must be bigger than of equal to + * the pixel height. + * Furthermore, we recommend that pitches and lines be multiple of 32 + * to not break assumption that might be made by various optimizations + * in the video decoders, video filters and/or video converters. + */ +typedef unsigned (*libvlc_video_format_cb)(void **opaque, char *chroma, + unsigned *width, unsigned *height, + unsigned *pitches, + unsigned *lines); + +/** + * Callback prototype to configure picture buffers format. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() + * (and possibly modified by @ref libvlc_video_format_cb) [IN] + */ +typedef void (*libvlc_video_cleanup_cb)(void *opaque); + + +/** + * Set callbacks and private data to render decoded video to a custom area + * in memory. + * Use libvlc_video_set_format() or libvlc_video_set_format_callbacks() + * to configure the decoded format. + * + * \param mp the media player + * \param lock callback to lock video memory (must not be NULL) + * \param unlock callback to unlock video memory (or NULL if not needed) + * \param display callback to display video (or NULL if not needed) + * \param opaque private pointer for the three callbacks (as first parameter) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_video_set_callbacks( libvlc_media_player_t *mp, + libvlc_video_lock_cb lock, + libvlc_video_unlock_cb unlock, + libvlc_video_display_cb display, + void *opaque ); + +/** + * Set decoded video chroma and dimensions. + * This only works in combination with libvlc_video_set_callbacks(), + * and is mutually exclusive with libvlc_video_set_format_callbacks(). + * + * \param mp the media player + * \param chroma a four-characters string identifying the chroma + * (e.g. "RV32" or "YUYV") + * \param width pixel width + * \param height pixel height + * \param pitch line pitch (in bytes) + * \version LibVLC 1.1.1 or later + * \bug All pixel planes are expected to have the same pitch. + * To use the YCbCr color space with chrominance subsampling, + * consider using libvlc_video_set_format_callbacks() instead. + */ +LIBVLC_API +void libvlc_video_set_format( libvlc_media_player_t *mp, const char *chroma, + unsigned width, unsigned height, + unsigned pitch ); + +/** + * Set decoded video chroma and dimensions. This only works in combination with + * libvlc_video_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the video format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_video_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_video_format_cb setup, + libvlc_video_cleanup_cb cleanup ); + +/** + * Set the NSView handler where the media player should render its video output. + * + * Use the vout called "macosx". + * + * The drawable is an NSObject that follow the VLCOpenGLVideoViewEmbedding + * protocol: + * + * @begincode + * \@protocol VLCOpenGLVideoViewEmbedding + * - (void)addVoutSubview:(NSView *)view; + * - (void)removeVoutSubview:(NSView *)view; + * \@end + * @endcode + * + * Or it can be an NSView object. + * + * If you want to use it along with Qt4 see the QMacCocoaViewContainer. Then + * the following code should work: + * @begincode + * { + * NSView *video = [[NSView alloc] init]; + * QMacCocoaViewContainer *container = new QMacCocoaViewContainer(video, parent); + * libvlc_media_player_set_nsobject(mp, video); + * [video release]; + * } + * @endcode + * + * You can find a live example in VLCVideoView in VLCKit.framework. + * + * \param p_mi the Media Player + * \param drawable the drawable that is either an NSView or an object following + * the VLCOpenGLVideoViewEmbedding protocol. + */ +LIBVLC_API void libvlc_media_player_set_nsobject ( libvlc_media_player_t *p_mi, void * drawable ); + +/** + * Get the NSView handler previously set with libvlc_media_player_set_nsobject(). + * + * \param p_mi the Media Player + * \return the NSView handler or 0 if none where set + */ +LIBVLC_API void * libvlc_media_player_get_nsobject ( libvlc_media_player_t *p_mi ); + +/** + * Set the agl handler where the media player should render its video output. + * + * \param p_mi the Media Player + * \param drawable the agl handler + */ +LIBVLC_API void libvlc_media_player_set_agl ( libvlc_media_player_t *p_mi, uint32_t drawable ); + +/** + * Get the agl handler previously set with libvlc_media_player_set_agl(). + * + * \param p_mi the Media Player + * \return the agl handler or 0 if none where set + */ +LIBVLC_API uint32_t libvlc_media_player_get_agl ( libvlc_media_player_t *p_mi ); + +/** + * Set an X Window System drawable where the media player should render its + * video output. If LibVLC was built without X11 output support, then this has + * no effects. + * + * The specified identifier must correspond to an existing Input/Output class + * X11 window. Pixmaps are not supported. The caller shall ensure that + * the X11 server is the same as the one the VLC instance has been configured + * with. This function must be called before video playback is started; + * otherwise it will only take effect after playback stop and restart. + * + * \param p_mi the Media Player + * \param drawable the ID of the X window + */ +LIBVLC_API void libvlc_media_player_set_xwindow ( libvlc_media_player_t *p_mi, uint32_t drawable ); + +/** + * Get the X Window System window identifier previously set with + * libvlc_media_player_set_xwindow(). Note that this will return the identifier + * even if VLC is not currently using it (for instance if it is playing an + * audio-only input). + * + * \param p_mi the Media Player + * \return an X window ID, or 0 if none where set. + */ +LIBVLC_API uint32_t libvlc_media_player_get_xwindow ( libvlc_media_player_t *p_mi ); + +/** + * Set a Win32/Win64 API window handle (HWND) where the media player should + * render its video output. If LibVLC was built without Win32/Win64 API output + * support, then this has no effects. + * + * \param p_mi the Media Player + * \param drawable windows handle of the drawable + */ +LIBVLC_API void libvlc_media_player_set_hwnd ( libvlc_media_player_t *p_mi, void *drawable ); + +/** + * Get the Windows API window handle (HWND) previously set with + * libvlc_media_player_set_hwnd(). The handle will be returned even if LibVLC + * is not currently outputting any video to it. + * + * \param p_mi the Media Player + * \return a window handle or NULL if there are none. + */ +LIBVLC_API void *libvlc_media_player_get_hwnd ( libvlc_media_player_t *p_mi ); + +/** + * Callback prototype for audio playback. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param samples pointer to the first audio sample to play back [IN] + * \param count number of audio samples to play back + * \param pts expected play time stamp (see libvlc_delay()) + */ +typedef void (*libvlc_audio_play_cb)(void *data, const void *samples, + unsigned count, int64_t pts); + +/** + * Callback prototype for audio pause. + * \note The pause callback is never called if the audio is already paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the pause request (should be elapsed already) + */ +typedef void (*libvlc_audio_pause_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio resumption (i.e. restart from pause). + * \note The resume callback is never called if the audio is not paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the resumption request (should be elapsed already) + */ +typedef void (*libvlc_audio_resume_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer flush + * (i.e. discard all pending buffers and stop playback as soon as possible). + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_flush_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer drain + * (i.e. wait for pending buffers to be played). + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_drain_cb)(void *data); + +/** + * Callback prototype for audio volume change. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param volume software volume (1. = nominal, 0. = mute) + * \param mute muted flag + */ +typedef void (*libvlc_audio_set_volume_cb)(void *data, + float volume, bool mute); + +/** + * Set callbacks and private data for decoded audio. + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \param mp the media player + * \param play callback to play audio samples (must not be NULL) + * \param pause callback to pause playback (or NULL to ignore) + * \param resume callback to resume playback (or NULL to ignore) + * \param flush callback to flush audio buffers (or NULL to ignore) + * \param drain callback to drain audio buffers (or NULL to ignore) + * \param opaque private pointer for the audio callbacks (as first parameter) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_callbacks( libvlc_media_player_t *mp, + libvlc_audio_play_cb play, + libvlc_audio_pause_cb pause, + libvlc_audio_resume_cb resume, + libvlc_audio_flush_cb flush, + libvlc_audio_drain_cb drain, + void *opaque ); + +/** + * Set callbacks and private data for decoded audio. This only works in + * combination with libvlc_audio_set_callbacks(). + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \param mp the media player + * \param set_volume callback to apply audio volume, + * or NULL to apply volume in software + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_volume_callback( libvlc_media_player_t *mp, + libvlc_audio_set_volume_cb set_volume ); + +/** + * Callback prototype to setup the audio playback. + * This is called when the media player needs to create a new audio output. + * \param opaque pointer to the data pointer passed to + * libvlc_audio_set_callbacks() [IN/OUT] + * \param format 4 bytes sample format [IN/OUT] + * \param rate sample rate [IN/OUT] + * \param channels channels count [IN/OUT] + * \return 0 on success, anything else to skip audio playback + */ +typedef int (*libvlc_audio_setup_cb)(void **data, char *format, unsigned *rate, + unsigned *channels); + +/** + * Callback prototype for audio playback cleanup. + * This is called when the media player no longer needs an audio output. + * \param opaque data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_cleanup_cb)(void *data); + +/** + * Set decoded audio format. This only works in combination with + * libvlc_audio_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the audio format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_audio_setup_cb setup, + libvlc_audio_cleanup_cb cleanup ); + +/** + * Set decoded audio format. + * This only works in combination with libvlc_audio_set_callbacks(), + * and is mutually exclusive with libvlc_audio_set_format_callbacks(). + * + * \param mp the media player + * \param format a four-characters string identifying the sample format + * (e.g. "S16N" or "FL32") + * \param rate sample rate (expressed in Hz) + * \param channels channels count + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format( libvlc_media_player_t *mp, const char *format, + unsigned rate, unsigned channels ); + +/** \bug This might go away ... to be replaced by a broader system */ + +/** + * Get the current movie length (in ms). + * + * \param p_mi the Media Player + * \return the movie length (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_length( libvlc_media_player_t *p_mi ); + +/** + * Get the current movie time (in ms). + * + * \param p_mi the Media Player + * \return the movie time (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi ); + +/** + * Set the movie time (in ms). This has no effect if no media is being played. + * Not all formats and protocols support this. + * + * \param p_mi the Media Player + * \param i_time the movie time (in ms). + */ +LIBVLC_API void libvlc_media_player_set_time( libvlc_media_player_t *p_mi, libvlc_time_t i_time ); + +/** + * Get movie position as percentage between 0.0 and 1.0. + * + * \param p_mi the Media Player + * \return movie position, or -1. in case of error + */ +LIBVLC_API float libvlc_media_player_get_position( libvlc_media_player_t *p_mi ); + +/** + * Set movie position as percentage between 0.0 and 1.0. + * This has no effect if playback is not enabled. + * This might not work depending on the underlying input format and protocol. + * + * \param p_mi the Media Player + * \param f_pos the position + */ +LIBVLC_API void libvlc_media_player_set_position( libvlc_media_player_t *p_mi, float f_pos ); + +/** + * Set movie chapter (if applicable). + * + * \param p_mi the Media Player + * \param i_chapter chapter number to play + */ +LIBVLC_API void libvlc_media_player_set_chapter( libvlc_media_player_t *p_mi, int i_chapter ); + +/** + * Get movie chapter. + * + * \param p_mi the Media Player + * \return chapter number currently playing, or -1 if there is no media. + */ +LIBVLC_API int libvlc_media_player_get_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get movie chapter count + * + * \param p_mi the Media Player + * \return number of chapters in movie, or -1. + */ +LIBVLC_API int libvlc_media_player_get_chapter_count( libvlc_media_player_t *p_mi ); + +/** + * Is the player able to play + * + * \param p_mi the Media Player + * \return boolean + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_will_play( libvlc_media_player_t *p_mi ); + +/** + * Get title chapter count + * + * \param p_mi the Media Player + * \param i_title title + * \return number of chapters in title, or -1 + */ +LIBVLC_API int libvlc_media_player_get_chapter_count_for_title( + libvlc_media_player_t *p_mi, int i_title ); + +/** + * Set movie title + * + * \param p_mi the Media Player + * \param i_title title number to play + */ +LIBVLC_API void libvlc_media_player_set_title( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Get movie title + * + * \param p_mi the Media Player + * \return title number currently playing, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title( libvlc_media_player_t *p_mi ); + +/** + * Get movie title count + * + * \param p_mi the Media Player + * \return title number count, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title_count( libvlc_media_player_t *p_mi ); + +/** + * Set previous chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_previous_chapter( libvlc_media_player_t *p_mi ); + +/** + * Set next chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_next_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get the requested movie play rate. + * @warning Depending on the underlying media, the requested rate may be + * different from the real playback rate. + * + * \param p_mi the Media Player + * \return movie play rate + */ +LIBVLC_API float libvlc_media_player_get_rate( libvlc_media_player_t *p_mi ); + +/** + * Set movie play rate + * + * \param p_mi the Media Player + * \param rate movie play rate to set + * \return -1 if an error was detected, 0 otherwise (but even then, it might + * not actually work depending on the underlying media protocol) + */ +LIBVLC_API int libvlc_media_player_set_rate( libvlc_media_player_t *p_mi, float rate ); + +/** + * Get current movie state + * + * \param p_mi the Media Player + * \return the current state of the media player (playing, paused, ...) \see libvlc_state_t + */ +LIBVLC_API libvlc_state_t libvlc_media_player_get_state( libvlc_media_player_t *p_mi ); + +/** + * Get movie fps rate + * + * \param p_mi the Media Player + * \return frames per second (fps) for this playing movie, or 0 if unspecified + */ +LIBVLC_API float libvlc_media_player_get_fps( libvlc_media_player_t *p_mi ); + +/** end bug */ + +/** + * How many video outputs does this media player have? + * + * \param p_mi the media player + * \return the number of video outputs + */ +LIBVLC_API unsigned libvlc_media_player_has_vout( libvlc_media_player_t *p_mi ); + +/** + * Is this media player seekable? + * + * \param p_mi the media player + * \return true if the media player can seek + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_seekable( libvlc_media_player_t *p_mi ); + +/** + * Can this media player be paused? + * + * \param p_mi the media player + * \return true if the media player can pause + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi ); + +/** + * Check if the current program is scrambled + * + * \param p_mi the media player + * \return true if the current program is scrambled + * + * \libvlc_return_bool + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_program_scrambled( libvlc_media_player_t *p_mi ); + +/** + * Display the next frame (if supported) + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_media_player_next_frame( libvlc_media_player_t *p_mi ); + +/** + * Navigate through DVD Menu + * + * \param p_mi the Media Player + * \param navigate the Navigation mode + * \version libVLC 2.0.0 or later + */ +LIBVLC_API void libvlc_media_player_navigate( libvlc_media_player_t* p_mi, + unsigned navigate ); + +/** + * Set if, and how, the video title will be shown when media is played. + * + * \param p_mi the media player + * \param position position at which to display the title, or libvlc_position_disable to prevent the title from being displayed + * \param timeout title display timeout in milliseconds (ignored if libvlc_position_disable) + * \version libVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_media_player_set_video_title_display( libvlc_media_player_t *p_mi, libvlc_position_t position, unsigned int timeout ); + +/** + * Release (free) libvlc_track_description_t + * + * \param p_track_description the structure to release + */ +LIBVLC_API void libvlc_track_description_list_release( libvlc_track_description_t *p_track_description ); + +/** + * \deprecated Use libvlc_track_description_list_release instead + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_track_description_release( libvlc_track_description_t *p_track_description ); + +/** \defgroup libvlc_video LibVLC video controls + * @{ + */ + +/** + * Toggle fullscreen status on non-embedded video outputs. + * + * @warning The same limitations applies to this function + * as to libvlc_set_fullscreen(). + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_toggle_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable fullscreen. + * + * @warning With most window managers, only a top-level windows can be in + * full-screen mode. Hence, this function will not operate properly if + * libvlc_media_player_set_xwindow() was used to embed the video in a + * non-top-level window. In that case, the embedding window must be reparented + * to the root window before fullscreen mode is enabled. You will want + * to reparent it back to its normal parent when disabling fullscreen. + * + * \param p_mi the media player + * \param b_fullscreen boolean for fullscreen status + */ +LIBVLC_API void libvlc_set_fullscreen( libvlc_media_player_t *p_mi, int b_fullscreen ); + +/** + * Get current fullscreen status. + * + * \param p_mi the media player + * \return the fullscreen status (boolean) + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_get_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable key press events handling, according to the LibVLC hotkeys + * configuration. By default and for historical reasons, keyboard events are + * handled by the LibVLC video widget. + * + * \note On X11, there can be only one subscriber for key press and mouse + * click events per window. If your application has subscribed to those events + * for the X window ID of the video widget, then LibVLC will not be able to + * handle key presses and mouse clicks in any case. + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle key press events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_key_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Enable or disable mouse click events handling. By default, those events are + * handled. This is needed for DVD menus to work, as well as a few video + * filters such as "puzzle". + * + * \see libvlc_video_set_key_input(). + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle mouse click events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_mouse_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Get the pixel dimensions of a video. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the pixel width [OUT] + * \param py pointer to get the pixel height [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_size( libvlc_media_player_t *p_mi, unsigned num, + unsigned *px, unsigned *py ); + +/** + * Get current video height. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel height or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_height( libvlc_media_player_t *p_mi ); + +/** + * Get current video width. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel width or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_width( libvlc_media_player_t *p_mi ); + +/** + * Get the mouse pointer coordinates over a video. + * Coordinates are expressed in terms of the decoded video resolution, + * not in terms of pixels on the screen/viewport (to get the latter, + * you can query your windowing system directly). + * + * Either of the coordinates may be negative or larger than the corresponding + * dimension of the video, if the cursor is outside the rendering area. + * + * @warning The coordinates may be out-of-date if the pointer is not located + * on the video rendering area. LibVLC does not track the pointer if it is + * outside of the video widget. + * + * @note LibVLC does not support multiple pointers (it does of course support + * multiple input devices sharing the same pointer) at the moment. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the abscissa [OUT] + * \param py pointer to get the ordinate [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_cursor( libvlc_media_player_t *p_mi, unsigned num, + int *px, int *py ); + +/** + * Get the current video scaling factor. + * See also libvlc_video_set_scale(). + * + * \param p_mi the media player + * \return the currently configured zoom factor, or 0. if the video is set + * to fit to the output window/drawable automatically. + */ +LIBVLC_API float libvlc_video_get_scale( libvlc_media_player_t *p_mi ); + +/** + * Set the video scaling factor. That is the ratio of the number of pixels on + * screen to the number of pixels in the original decoded video in each + * dimension. Zero is a special value; it will adjust the video to the output + * window/drawable (in windowed mode) or the entire screen. + * + * Note that not all video outputs support scaling. + * + * \param p_mi the media player + * \param f_factor the scaling factor, or zero + */ +LIBVLC_API void libvlc_video_set_scale( libvlc_media_player_t *p_mi, float f_factor ); + +/** + * Get current video aspect ratio. + * + * \param p_mi the media player + * \return the video aspect ratio or NULL if unspecified + * (the result must be released with free() or libvlc_free()). + */ +LIBVLC_API char *libvlc_video_get_aspect_ratio( libvlc_media_player_t *p_mi ); + +/** + * Set new video aspect ratio. + * + * \param p_mi the media player + * \param psz_aspect new video aspect-ratio or NULL to reset to default + * \note Invalid aspect ratios are ignored. + */ +LIBVLC_API void libvlc_video_set_aspect_ratio( libvlc_media_player_t *p_mi, const char *psz_aspect ); + +/** + * Get current video subtitle. + * + * \param p_mi the media player + * \return the video subtitle selected, or -1 if none + */ +LIBVLC_API int libvlc_video_get_spu( libvlc_media_player_t *p_mi ); + +/** + * Get the number of available video subtitles. + * + * \param p_mi the media player + * \return the number of available video subtitles + */ +LIBVLC_API int libvlc_video_get_spu_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video subtitles. + * + * \param p_mi the media player + * \return list containing description of available video subtitles + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_spu_description( libvlc_media_player_t *p_mi ); + +/** + * Set new video subtitle. + * + * \param p_mi the media player + * \param i_spu video subtitle track to select (i_id from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API int libvlc_video_set_spu( libvlc_media_player_t *p_mi, int i_spu ); + +/** + * Set new video subtitle file. + * + * \param p_mi the media player + * \param psz_subtitle new video subtitle file + * \return the success status (boolean) + */ +LIBVLC_API int libvlc_video_set_subtitle_file( libvlc_media_player_t *p_mi, const char *psz_subtitle ); + +/** + * Get the current subtitle delay. Positive values means subtitles are being + * displayed later, negative values earlier. + * + * \param p_mi media player + * \return time (in microseconds) the display of subtitles is being delayed + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int64_t libvlc_video_get_spu_delay( libvlc_media_player_t *p_mi ); + +/** + * Set the subtitle delay. This affects the timing of when the subtitle will + * be displayed. Positive values result in subtitles being displayed later, + * while negative values will result in subtitles being displayed earlier. + * + * The subtitle delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay time (in microseconds) the display of subtitles should be delayed + * \return 0 on success, -1 on error + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int libvlc_video_set_spu_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the description of available titles. + * + * \param p_mi the media player + * \return list containing description of available titles + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_title_description( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available chapters for specific title. + * + * \param p_mi the media player + * \param i_title selected title + * \return list containing description of available chapter for title i_title + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_chapter_description( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Get current crop filter geometry. + * + * \param p_mi the media player + * \return the crop filter geometry or NULL if unset + */ +LIBVLC_API char *libvlc_video_get_crop_geometry( libvlc_media_player_t *p_mi ); + +/** + * Set new crop filter geometry. + * + * \param p_mi the media player + * \param psz_geometry new crop filter geometry (NULL to unset) + */ +LIBVLC_API +void libvlc_video_set_crop_geometry( libvlc_media_player_t *p_mi, const char *psz_geometry ); + +/** + * Get current teletext page requested. + * + * \param p_mi the media player + * \return the current teletext page requested. + */ +LIBVLC_API int libvlc_video_get_teletext( libvlc_media_player_t *p_mi ); + +/** + * Set new teletext page to retrieve. + * + * \param p_mi the media player + * \param i_page teletex page number requested + */ +LIBVLC_API void libvlc_video_set_teletext( libvlc_media_player_t *p_mi, int i_page ); + +/** + * Toggle teletext transparent status on video output. + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_toggle_teletext( libvlc_media_player_t *p_mi ); + +/** + * Get number of available video tracks. + * + * \param p_mi media player + * \return the number of available video tracks (int) + */ +LIBVLC_API int libvlc_video_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video tracks. + * + * \param p_mi media player + * \return list with description of available video tracks, or NULL on error + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current video track. + * + * \param p_mi media player + * \return the video track ID (int) or -1 if no active input + */ +LIBVLC_API int libvlc_video_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set video track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API +int libvlc_video_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Take a snapshot of the current video window. + * + * If i_width AND i_height is 0, original size is used. + * If i_width XOR i_height is 0, original aspect-ratio is preserved. + * + * \param p_mi media player instance + * \param num number of video output (typically 0 for the first/only one) + * \param psz_filepath the path where to save the screenshot to + * \param i_width the snapshot's width + * \param i_height the snapshot's height + * \return 0 on success, -1 if the video was not found + */ +LIBVLC_API +int libvlc_video_take_snapshot( libvlc_media_player_t *p_mi, unsigned num, + const char *psz_filepath, unsigned int i_width, + unsigned int i_height ); + +/** + * Enable or disable deinterlace filter + * + * \param p_mi libvlc media player + * \param psz_mode type of deinterlace filter, NULL to disable + */ +LIBVLC_API void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi, + const char *psz_mode ); + +/** + * Get an integer marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_int_option_t + */ +LIBVLC_API int libvlc_video_get_marquee_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Get a string marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_string_option_t + */ +LIBVLC_API char *libvlc_video_get_marquee_string( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Enable, disable or set an integer marquee option + * + * Setting libvlc_marquee_Enable has the side effect of enabling (arg !0) + * or disabling (arg 0) the marq filter. + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_int_option_t + * \param i_val marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_int( libvlc_media_player_t *p_mi, + unsigned option, int i_val ); + +/** + * Set a marquee string option + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_string_option_t + * \param psz_text marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_text ); + +/** option values for libvlc_video_{get,set}_logo_{int,string} */ +enum libvlc_video_logo_option_t { + libvlc_logo_enable, + libvlc_logo_file, /**< string argument, "file,d,t;file,d,t;..." */ + libvlc_logo_x, + libvlc_logo_y, + libvlc_logo_delay, + libvlc_logo_repeat, + libvlc_logo_opacity, + libvlc_logo_position +}; + +/** + * Get integer logo option. + * + * \param p_mi libvlc media player instance + * \param option logo option to get, values of libvlc_video_logo_option_t + */ +LIBVLC_API int libvlc_video_get_logo_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set logo option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_logo_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the logo filter. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Set logo option as string. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param psz_value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_value ); + + +/** option values for libvlc_video_{get,set}_adjust_{int,float,bool} */ +enum libvlc_video_adjust_option_t { + libvlc_adjust_Enable = 0, + libvlc_adjust_Contrast, + libvlc_adjust_Brightness, + libvlc_adjust_Hue, + libvlc_adjust_Saturation, + libvlc_adjust_Gamma +}; + +/** + * Get integer adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API int libvlc_video_get_adjust_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_adjust_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the adjust filter. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Get float adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as float. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, + unsigned option, float value ); + +/** @} video */ + +/** \defgroup libvlc_audio LibVLC audio controls + * @{ + */ + +/** + * Audio device types + */ +typedef enum libvlc_audio_output_device_types_t { + libvlc_AudioOutputDevice_Error = -1, + libvlc_AudioOutputDevice_Mono = 1, + libvlc_AudioOutputDevice_Stereo = 2, + libvlc_AudioOutputDevice_2F2R = 4, + libvlc_AudioOutputDevice_3F2R = 5, + libvlc_AudioOutputDevice_5_1 = 6, + libvlc_AudioOutputDevice_6_1 = 7, + libvlc_AudioOutputDevice_7_1 = 8, + libvlc_AudioOutputDevice_SPDIF = 10 +} libvlc_audio_output_device_types_t; + +/** + * Audio channels + */ +typedef enum libvlc_audio_output_channel_t { + libvlc_AudioChannel_Error = -1, + libvlc_AudioChannel_Stereo = 1, + libvlc_AudioChannel_RStereo = 2, + libvlc_AudioChannel_Left = 3, + libvlc_AudioChannel_Right = 4, + libvlc_AudioChannel_Dolbys = 5 +} libvlc_audio_output_channel_t; + + +/** + * Gets the list of available audio output modules. + * + * \param p_instance libvlc instance + * \return list of available audio outputs. It must be freed it with +* \see libvlc_audio_output_list_release \see libvlc_audio_output_t . + * In case of error, NULL is returned. + */ +LIBVLC_API libvlc_audio_output_t * +libvlc_audio_output_list_get( libvlc_instance_t *p_instance ); + +/** + * Frees the list of available audio output modules. + * + * \param p_list list with audio outputs for release + */ +LIBVLC_API +void libvlc_audio_output_list_release( libvlc_audio_output_t *p_list ); + +/** + * Selects an audio output module. + * \note Any change will take be effect only after playback is stopped and + * restarted. Audio output cannot be changed while playing. + * + * \param p_mi media player + * \param psz_name name of audio output, + * use psz_name of \see libvlc_audio_output_t + * \return 0 if function succeded, -1 on error + */ +LIBVLC_API int libvlc_audio_output_set( libvlc_media_player_t *p_mi, + const char *psz_name ); + +/** + * Backward compatibility stub. Do not use in new code. + * Use libvlc_audio_output_device_list_get() instead. + * \return always 0. + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_audio_output_device_count( libvlc_instance_t *, const char * ); + +/** + * Backward compatibility stub. Do not use in new code. + * Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_longname( libvlc_instance_t *, const char *, + int ); + +/** + * Backward compatibility stub. Do not use in new code. + * Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_id( libvlc_instance_t *, const char *, int ); + +/** + * Gets a list of potential audio output devices, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support enumerating devices. + * The audio output may be functional even if the list is empty (NULL). + * + * \note The list may not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param mp media player + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed it with libvlc_audio_output_device_list_release() + * \version LibVLC 2.2.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_enum( libvlc_media_player_t *mp ); + +/** + * Gets a list of audio output devices for a given audio output module, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support this. In particular, an empty (NULL) + * list of devices does not imply that the specified audio output does + * not work. + * + * \note The list might not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param p_instance libvlc instance + * \param psz_aout audio output name + * (as returned by libvlc_audio_output_list_get()) + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed it with libvlc_audio_output_device_list_release() + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_list_get( libvlc_instance_t *p_instance, + const char *aout ); + +/** + * Frees a list of available audio output devices. + * + * \param p_list list with audio outputs for release + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API void libvlc_audio_output_device_list_release( + libvlc_audio_output_device_t *p_list ); + +/** + * Configures an explicit audio output device. + * + * If the module paramater is NULL, audio output will be moved to the device + * specified by the device identifier string immediately. This is the + * recommended usage. + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_enum(). + * + * However passing NULL is supported in LibVLC version 2.2.0 and later only; + * in earlier versions, this function would have no effects when the module + * parameter was NULL. + * + * If the module parameter is not NULL, the device parameter of the + * corresponding audio output, if it exists, will be set to the specified + * string. Note that some audio output modules do not have such a parameter + * (notably MMDevice and PulseAudio). + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_list_get(). + * + * \note This function does not select the specified audio output plugin. + * libvlc_audio_output_set() is used for that purpose. + * + * \warning The syntax for the device parameter depends on the audio output. + * + * Some audio output modules require further parameters (e.g. a channels map + * in the case of ALSA). + * + * \param mp media player + * \param module If NULL, current audio output module. + * if non-NULL, name of audio output module + (\see libvlc_audio_output_t) + * \param device_id device identifier string + * \return Nothing. Errors are ignored (this is a design bug). + */ +LIBVLC_API void libvlc_audio_output_device_set( libvlc_media_player_t *mp, + const char *module, + const char *device_id ); + +/** + * Stub for backward compatibility. + * \return always -1. + */ +LIBVLC_DEPRECATED +LIBVLC_API int libvlc_audio_output_get_device_type( libvlc_media_player_t *p_mi ); + +/** + * Stub for backward compatibility. + */ +LIBVLC_DEPRECATED +LIBVLC_API void libvlc_audio_output_set_device_type( libvlc_media_player_t *, + int ); + + +/** + * Toggle mute status. + * + * \param p_mi media player + * \warning Toggling mute atomically is not always possible: On some platforms, + * other processes can mute the VLC audio playback stream asynchronously. Thus, + * there is a small race condition where toggling will not work. + * See also the limitations of libvlc_audio_set_mute(). + */ +LIBVLC_API void libvlc_audio_toggle_mute( libvlc_media_player_t *p_mi ); + +/** + * Get current mute status. + * + * \param p_mi media player + * \return the mute status (boolean) if defined, -1 if undefined/unapplicable + */ +LIBVLC_API int libvlc_audio_get_mute( libvlc_media_player_t *p_mi ); + +/** + * Set mute status. + * + * \param p_mi media player + * \param status If status is true then mute, otherwise unmute + * \warning This function does not always work. If there are no active audio + * playback stream, the mute status might not be available. If digital + * pass-through (S/PDIF, HDMI...) is in use, muting may be unapplicable. Also + * some audio output plugins do not support muting at all. + * \note To force silent playback, disable all audio tracks. This is more + * efficient and reliable than mute. + */ +LIBVLC_API void libvlc_audio_set_mute( libvlc_media_player_t *p_mi, int status ); + +/** + * Get current software audio volume. + * + * \param p_mi media player + * \return the software volume in percents + * (0 = mute, 100 = nominal / 0dB) + */ +LIBVLC_API int libvlc_audio_get_volume( libvlc_media_player_t *p_mi ); + +/** + * Set current software audio volume. + * + * \param p_mi media player + * \param i_volume the volume in percents (0 = mute, 100 = 0dB) + * \return 0 if the volume was set, -1 if it was out of range + */ +LIBVLC_API int libvlc_audio_set_volume( libvlc_media_player_t *p_mi, int i_volume ); + +/** + * Get number of available audio tracks. + * + * \param p_mi media player + * \return the number of available audio tracks (int), or -1 if unavailable + */ +LIBVLC_API int libvlc_audio_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available audio tracks. + * + * \param p_mi media player + * \return list with description of available audio tracks, or NULL + */ +LIBVLC_API libvlc_track_description_t * + libvlc_audio_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current audio track. + * + * \param p_mi media player + * \return the audio track ID or -1 if no active input. + */ +LIBVLC_API int libvlc_audio_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set current audio track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Get current audio channel. + * + * \param p_mi media player + * \return the audio channel \see libvlc_audio_output_channel_t + */ +LIBVLC_API int libvlc_audio_get_channel( libvlc_media_player_t *p_mi ); + +/** + * Set current audio channel. + * + * \param p_mi media player + * \param channel the audio channel, \see libvlc_audio_output_channel_t + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_channel( libvlc_media_player_t *p_mi, int channel ); + +/** + * Get current audio delay. + * + * \param p_mi media player + * \return the audio delay (microseconds) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int64_t libvlc_audio_get_delay( libvlc_media_player_t *p_mi ); + +/** + * Set current audio delay. The audio delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay the audio delay (microseconds) + * \return 0 on success, -1 on error + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int libvlc_audio_set_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the number of equalizer presets. + * + * \return number of presets + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_preset_count( void ); + +/** + * Get the name of a particular equalizer preset. + * + * This name can be used, for example, to prepare a preset label or menu in a user + * interface. + * + * \param u_index index of the preset, counting from zero + * \return preset name, or NULL if there is no such preset + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API const char *libvlc_audio_equalizer_get_preset_name( unsigned u_index ); + +/** + * Get the number of distinct frequency bands for an equalizer. + * + * \return number of frequency bands + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_band_count( void ); + +/** + * Get a particular equalizer band frequency. + * + * This value can be used, for example, to create a label for an equalizer band control + * in a user interface. + * + * \param u_index index of the band, counting from zero + * \return equalizer band frequency (Hz), or -1 if there is no such band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_band_frequency( unsigned u_index ); + +/** + * Create a new default equalizer, with all frequency values zeroed. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new( void ); + +/** + * Create a new equalizer, with initial frequency values copied from an existing + * preset. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \param u_index index of the preset, counting from zero + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new_from_preset( unsigned u_index ); + +/** + * Release a previously created equalizer instance. + * + * The equalizer was previously created by using libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is safe to invoke this method with a NULL p_equalizer parameter for no effect. + * + * \param p_equalizer opaque equalizer handle, or NULL + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API void libvlc_audio_equalizer_release( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new pre-amplification value for an equalizer. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_preamp preamp value (-20.0 to 20.0 Hz) + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_preamp( libvlc_equalizer_t *p_equalizer, float f_preamp ); + +/** + * Get the current pre-amplification value from an equalizer. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \return preamp value (Hz) + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_preamp( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new amplification value for a particular equalizer frequency band. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_amp amplification value (-20.0 to 20.0 Hz) + * \param u_band index, counting from zero, of the frequency band to set + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_amp_at_index( libvlc_equalizer_t *p_equalizer, float f_amp, unsigned u_band ); + +/** + * Get the amplification value for a particular equalizer frequency band. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param u_band index, counting from zero, of the frequency band to get + * \return amplification value (Hz); NaN if there is no such frequency band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_amp_at_index( libvlc_equalizer_t *p_equalizer, unsigned u_band ); + +/** + * Apply new equalizer settings to a media player. + * + * The equalizer is first created by invoking libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is possible to apply new equalizer settings to a media player whether the media + * player is currently playing media or not. + * + * Invoking this method will immediately apply the new equalizer settings to the audio + * output of the currently playing media if there is any. + * + * If there is no currently playing media, the new equalizer settings will be applied + * later if and when new media is played. + * + * Equalizer settings will automatically be applied to subsequently played media. + * + * To disable the equalizer for a media player invoke this method passing NULL for the + * p_equalizer parameter. + * + * The media player does not keep a reference to the supplied equalizer so it is safe + * for an application to release the equalizer reference any time after this method + * returns. + * + * \param p_mi opaque media player handle + * \param p_equalizer opaque equalizer handle, or NULL to disable the equalizer for this media player + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_set_equalizer( libvlc_media_player_t *p_mi, libvlc_equalizer_t *p_equalizer ); + +/** @} audio */ + +/** @} media_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc2/include/libvlc_structures.h b/vlcdemo/vlc/vlc2/include/libvlc_structures.h new file mode 100644 index 0000000..54cd1fd --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_structures.h @@ -0,0 +1,73 @@ +/***************************************************************************** + * libvlc_structures.h: libvlc_* new external API structures + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id $ + * + * Authors: Filippo Carone + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_STRUCTURES_H +#define LIBVLC_STRUCTURES_H 1 + +/** + * \file + * This file defines libvlc_* new external API structures + */ + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \ingroup libvlc_core + * @{ + */ + +/** This structure is opaque. It represents a libvlc instance */ +typedef struct libvlc_instance_t libvlc_instance_t; + +typedef int64_t libvlc_time_t; + +/**@} */ + +/** + * \ingroup libvlc_log + * @{ + */ + +/** This structure is opaque. It represents a libvlc log iterator */ +typedef struct libvlc_log_iterator_t libvlc_log_iterator_t; + +typedef struct libvlc_log_message_t +{ + int i_severity; /* 0=INFO, 1=ERR, 2=WARN, 3=DBG */ + const char *psz_type; /* module type */ + const char *psz_name; /* module name */ + const char *psz_header; /* optional header */ + const char *psz_message; /* message */ +} libvlc_log_message_t; + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/libvlc_version.h b/vlcdemo/vlc/vlc2/include/libvlc_version.h new file mode 100644 index 0000000..9e9294c --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_version.h @@ -0,0 +1,55 @@ +/***************************************************************************** + * libvlc_version.h + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines version macros for LibVLC. + * Those macros are primilarly intended for conditional (pre)compilation. + * To get the run-time LibVLC version, use libvlc_get_version() instead + * (the run-time version may be more recent than build-time one, thanks to + * backward binary compatibility). + * + * \version This header file is available in LibVLC 1.1.4 and higher. + */ + +#ifndef LIBVLC_VERSION_H +# define LIBVLC_VERSION_H 1 + +/** LibVLC major version number */ +# define LIBVLC_VERSION_MAJOR (2) + +/** LibVLC minor version number */ +# define LIBVLC_VERSION_MINOR (2) + +/** LibVLC revision */ +# define LIBVLC_VERSION_REVISION (6) + +# define LIBVLC_VERSION_EXTRA (0) + +/** Makes a single integer from a LibVLC version numbers */ +# define LIBVLC_VERSION(maj,min,rev,extra) \ + ((maj << 24) | (min << 16) | (rev << 8) | (extra)) + +/** LibVLC full version as a single integer (for comparison) */ +# define LIBVLC_VERSION_INT \ + LIBVLC_VERSION(LIBVLC_VERSION_MAJOR, LIBVLC_VERSION_MINOR, \ + LIBVLC_VERSION_REVISION, LIBVLC_VERSION_EXTRA) + +#endif diff --git a/vlcdemo/vlc/vlc2/include/libvlc_vlm.h b/vlcdemo/vlc/vlc2/include/libvlc_vlm.h new file mode 100644 index 0000000..20c75f5 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/libvlc_vlm.h @@ -0,0 +1,349 @@ +/***************************************************************************** + * libvlc_vlm.h: libvlc_* new external API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 26e5cbb5ee7968a21520af0b8f553a4a117d4f99 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_VLM_H +#define LIBVLC_VLM_H 1 + +/** + * \file + * This file defines libvlc_vlm_* external API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * VLM + *****************************************************************************/ +/** \defgroup libvlc_vlm LibVLC VLM + * \ingroup libvlc + * @{ + */ + + +/** + * Release the vlm instance related to the given libvlc_instance_t + * + * \param p_instance the instance + */ +LIBVLC_API void libvlc_vlm_release( libvlc_instance_t *p_instance ); + +/** + * Add a broadcast, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const* ppsz_options, + int b_enabled, int b_loop ); + +/** + * Add a vod, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new vod media + * \param psz_input the input MRL + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new vod + * \param psz_mux the muxer of the vod media + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_vod( libvlc_instance_t * p_instance, + const char *psz_name, const char *psz_input, + int i_options, const char * const* ppsz_options, + int b_enabled, const char *psz_mux ); + +/** + * Delete a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to delete + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_del_media( libvlc_instance_t * p_instance, + const char *psz_name ); + +/** + * Enable or disable a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_enabled the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_enabled( libvlc_instance_t *p_instance, + const char *psz_name, int b_enabled ); + +/** + * Set the output for a media. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_output( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_output ); + +/** + * Set a media's input MRL. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Add a media's input MRL. This will add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Set a media's loop status. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_loop the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_loop( libvlc_instance_t *p_instance, + const char *psz_name, + int b_loop ); + +/** + * Set a media's vod muxer. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_mux the new muxer + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_mux( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_mux ); + +/** + * Edit the parameters of a media. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_change_media( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const *ppsz_options, + int b_enabled, int b_loop ); + +/** + * Play the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_play_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Stop the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_stop_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Pause the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_pause_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Seek in the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \param f_percentage the percentage to seek to + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_seek_media( libvlc_instance_t *p_instance, + const char *psz_name, + float f_percentage ); + +/** + * Return information about the named media as a JSON + * string representation. + * + * This function is mainly intended for debugging use, + * if you want programmatic access to the state of + * a vlm_media_instance_t, please use the corresponding + * libvlc_vlm_get_media_instance_xxx -functions. + * Currently there are no such functions available for + * vlm_media_t though. + * + * \param p_instance the instance + * \param psz_name the name of the media, + * if the name is an empty string, all media is described + * \return string with information about named media, or NULL on error + */ +LIBVLC_API const char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Get vlm_media instance position by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return position as float or -1. on error + */ +LIBVLC_API float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance time by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return time as integer or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_time( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance length by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return length of media item or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_length( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance playback rate by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return playback rate or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_rate( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); +#if 0 +/** + * Get vlm_media instance title number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return title as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_title( libvlc_instance_t *, + const char *, int ); + +/** + * Get vlm_media instance chapter number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return chapter as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_chapter( libvlc_instance_t *, + const char *, int ); + +/** + * Is libvlc instance seekable ? + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return 1 if seekable, 0 if not, -1 if media does not exist + */ +LIBVLC_API int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *, + const char *, int ); +#endif +/** + * Get libvlc_event_manager from a vlm media. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_instance a libvlc instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_vlm_get_event_manager( libvlc_instance_t *p_instance ); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_about.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_about.h new file mode 100644 index 0000000..85cf847 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_about.h @@ -0,0 +1,1374 @@ +/* Automatically generated file - DO NOT EDIT */ +static const char psz_license[] = +" GNU GENERAL PUBLIC LICENSE\n" +" Version 2, June 1991\n" +"\n" +" Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" +" Everyone is permitted to copy and distribute verbatim copies\n" +" of this license document, but changing it is not allowed.\n" +"\n" +" Preamble\n" +"\n" +" The licenses for most software are designed to take away your\n" +"freedom to share and change it. By contrast, the GNU General Public\n" +"License is intended to guarantee your freedom to share and change free\n" +"software--to make sure the software is free for all its users. This\n" +"General Public License applies to most of the Free Software\n" +"Foundation's software and to any other program whose authors commit to\n" +"using it. (Some other Free Software Foundation software is covered by\n" +"the GNU Lesser General Public License instead.) You can apply it to\n" +"your programs, too.\n" +"\n" +" When we speak of free software, we are referring to freedom, not\n" +"price. Our General Public Licenses are designed to make sure that you\n" +"have the freedom to distribute copies of free software (and charge for\n" +"this service if you wish), that you receive source code or can get it\n" +"if you want it, that you can change the software or use pieces of it\n" +"in new free programs; and that you know you can do these things.\n" +"\n" +" To protect your rights, we need to make restrictions that forbid\n" +"anyone to deny you these rights or to ask you to surrender the rights.\n" +"These restrictions translate to certain responsibilities for you if you\n" +"distribute copies of the software, or if you modify it.\n" +"\n" +" For example, if you distribute copies of such a program, whether\n" +"gratis or for a fee, you must give the recipients all the rights that\n" +"you have. You must make sure that they, too, receive or can get the\n" +"source code. And you must show them these terms so they know their\n" +"rights.\n" +"\n" +" We protect your rights with two steps: (1) copyright the software, and\n" +"(2) offer you this license which gives you legal permission to copy,\n" +"distribute and/or modify the software.\n" +"\n" +" Also, for each author's protection and ours, we want to make certain\n" +"that everyone understands that there is no warranty for this free\n" +"software. If the software is modified by someone else and passed on, we\n" +"want its recipients to know that what they have is not the original, so\n" +"that any problems introduced by others will not reflect on the original\n" +"authors' reputations.\n" +"\n" +" Finally, any free program is threatened constantly by software\n" +"patents. We wish to avoid the danger that redistributors of a free\n" +"program will individually obtain patent licenses, in effect making the\n" +"program proprietary. To prevent this, we have made it clear that any\n" +"patent must be licensed for everyone's free use or not licensed at all.\n" +"\n" +" The precise terms and conditions for copying, distribution and\n" +"modification follow.\n" +"\n" +" GNU GENERAL PUBLIC LICENSE\n" +" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" +"\n" +" 0. This License applies to any program or other work which contains\n" +"a notice placed by the copyright holder saying it may be distributed\n" +"under the terms of this General Public License. The \"Program\", below,\n" +"refers to any such program or work, and a \"work based on the Program\"\n" +"means either the Program or any derivative work under copyright law:\n" +"that is to say, a work containing the Program or a portion of it,\n" +"either verbatim or with modifications and/or translated into another\n" +"language. (Hereinafter, translation is included without limitation in\n" +"the term \"modification\".) Each licensee is addressed as \"you\".\n" +"\n" +"Activities other than copying, distribution and modification are not\n" +"covered by this License; they are outside its scope. The act of\n" +"running the Program is not restricted, and the output from the Program\n" +"is covered only if its contents constitute a work based on the\n" +"Program (independent of having been made by running the Program).\n" +"Whether that is true depends on what the Program does.\n" +"\n" +" 1. You may copy and distribute verbatim copies of the Program's\n" +"source code as you receive it, in any medium, provided that you\n" +"conspicuously and appropriately publish on each copy an appropriate\n" +"copyright notice and disclaimer of warranty; keep intact all the\n" +"notices that refer to this License and to the absence of any warranty;\n" +"and give any other recipients of the Program a copy of this License\n" +"along with the Program.\n" +"\n" +"You may charge a fee for the physical act of transferring a copy, and\n" +"you may at your option offer warranty protection in exchange for a fee.\n" +"\n" +" 2. You may modify your copy or copies of the Program or any portion\n" +"of it, thus forming a work based on the Program, and copy and\n" +"distribute such modifications or work under the terms of Section 1\n" +"above, provided that you also meet all of these conditions:\n" +"\n" +" a) You must cause the modified files to carry prominent notices\n" +" stating that you changed the files and the date of any change.\n" +"\n" +" b) You must cause any work that you distribute or publish, that in\n" +" whole or in part contains or is derived from the Program or any\n" +" part thereof, to be licensed as a whole at no charge to all third\n" +" parties under the terms of this License.\n" +"\n" +" c) If the modified program normally reads commands interactively\n" +" when run, you must cause it, when started running for such\n" +" interactive use in the most ordinary way, to print or display an\n" +" announcement including an appropriate copyright notice and a\n" +" notice that there is no warranty (or else, saying that you provide\n" +" a warranty) and that users may redistribute the program under\n" +" these conditions, and telling the user how to view a copy of this\n" +" License. (Exception: if the Program itself is interactive but\n" +" does not normally print such an announcement, your work based on\n" +" the Program is not required to print an announcement.)\n" +"\n" +"These requirements apply to the modified work as a whole. If\n" +"identifiable sections of that work are not derived from the Program,\n" +"and can be reasonably considered independent and separate works in\n" +"themselves, then this License, and its terms, do not apply to those\n" +"sections when you distribute them as separate works. But when you\n" +"distribute the same sections as part of a whole which is a work based\n" +"on the Program, the distribution of the whole must be on the terms of\n" +"this License, whose permissions for other licensees extend to the\n" +"entire whole, and thus to each and every part regardless of who wrote it.\n" +"\n" +"Thus, it is not the intent of this section to claim rights or contest\n" +"your rights to work written entirely by you; rather, the intent is to\n" +"exercise the right to control the distribution of derivative or\n" +"collective works based on the Program.\n" +"\n" +"In addition, mere aggregation of another work not based on the Program\n" +"with the Program (or with a work based on the Program) on a volume of\n" +"a storage or distribution medium does not bring the other work under\n" +"the scope of this License.\n" +"\n" +" 3. You may copy and distribute the Program (or a work based on it,\n" +"under Section 2) in object code or executable form under the terms of\n" +"Sections 1 and 2 above provided that you also do one of the following:\n" +"\n" +" a) Accompany it with the complete corresponding machine-readable\n" +" source code, which must be distributed under the terms of Sections\n" +" 1 and 2 above on a medium customarily used for software interchange; or,\n" +"\n" +" b) Accompany it with a written offer, valid for at least three\n" +" years, to give any third party, for a charge no more than your\n" +" cost of physically performing source distribution, a complete\n" +" machine-readable copy of the corresponding source code, to be\n" +" distributed under the terms of Sections 1 and 2 above on a medium\n" +" customarily used for software interchange; or,\n" +"\n" +" c) Accompany it with the information you received as to the offer\n" +" to distribute corresponding source code. (This alternative is\n" +" allowed only for noncommercial distribution and only if you\n" +" received the program in object code or executable form with such\n" +" an offer, in accord with Subsection b above.)\n" +"\n" +"The source code for a work means the preferred form of the work for\n" +"making modifications to it. For an executable work, complete source\n" +"code means all the source code for all modules it contains, plus any\n" +"associated interface definition files, plus the scripts used to\n" +"control compilation and installation of the executable. However, as a\n" +"special exception, the source code distributed need not include\n" +"anything that is normally distributed (in either source or binary\n" +"form) with the major components (compiler, kernel, and so on) of the\n" +"operating system on which the executable runs, unless that component\n" +"itself accompanies the executable.\n" +"\n" +"If distribution of executable or object code is made by offering\n" +"access to copy from a designated place, then offering equivalent\n" +"access to copy the source code from the same place counts as\n" +"distribution of the source code, even though third parties are not\n" +"compelled to copy the source along with the object code.\n" +"\n" +" 4. You may not copy, modify, sublicense, or distribute the Program\n" +"except as expressly provided under this License. Any attempt\n" +"otherwise to copy, modify, sublicense or distribute the Program is\n" +"void, and will automatically terminate your rights under this License.\n" +"However, parties who have received copies, or rights, from you under\n" +"this License will not have their licenses terminated so long as such\n" +"parties remain in full compliance.\n" +"\n" +" 5. You are not required to accept this License, since you have not\n" +"signed it. However, nothing else grants you permission to modify or\n" +"distribute the Program or its derivative works. These actions are\n" +"prohibited by law if you do not accept this License. Therefore, by\n" +"modifying or distributing the Program (or any work based on the\n" +"Program), you indicate your acceptance of this License to do so, and\n" +"all its terms and conditions for copying, distributing or modifying\n" +"the Program or works based on it.\n" +"\n" +" 6. Each time you redistribute the Program (or any work based on the\n" +"Program), the recipient automatically receives a license from the\n" +"original licensor to copy, distribute or modify the Program subject to\n" +"these terms and conditions. You may not impose any further\n" +"restrictions on the recipients' exercise of the rights granted herein.\n" +"You are not responsible for enforcing compliance by third parties to\n" +"this License.\n" +"\n" +" 7. If, as a consequence of a court judgment or allegation of patent\n" +"infringement or for any other reason (not limited to patent issues),\n" +"conditions are imposed on you (whether by court order, agreement or\n" +"otherwise) that contradict the conditions of this License, they do not\n" +"excuse you from the conditions of this License. If you cannot\n" +"distribute so as to satisfy simultaneously your obligations under this\n" +"License and any other pertinent obligations, then as a consequence you\n" +"may not distribute the Program at all. For example, if a patent\n" +"license would not permit royalty-free redistribution of the Program by\n" +"all those who receive copies directly or indirectly through you, then\n" +"the only way you could satisfy both it and this License would be to\n" +"refrain entirely from distribution of the Program.\n" +"\n" +"If any portion of this section is held invalid or unenforceable under\n" +"any particular circumstance, the balance of the section is intended to\n" +"apply and the section as a whole is intended to apply in other\n" +"circumstances.\n" +"\n" +"It is not the purpose of this section to induce you to infringe any\n" +"patents or other property right claims or to contest validity of any\n" +"such claims; this section has the sole purpose of protecting the\n" +"integrity of the free software distribution system, which is\n" +"implemented by public license practices. Many people have made\n" +"generous contributions to the wide range of software distributed\n" +"through that system in reliance on consistent application of that\n" +"system; it is up to the author/donor to decide if he or she is willing\n" +"to distribute software through any other system and a licensee cannot\n" +"impose that choice.\n" +"\n" +"This section is intended to make thoroughly clear what is believed to\n" +"be a consequence of the rest of this License.\n" +"\n" +" 8. If the distribution and/or use of the Program is restricted in\n" +"certain countries either by patents or by copyrighted interfaces, the\n" +"original copyright holder who places the Program under this License\n" +"may add an explicit geographical distribution limitation excluding\n" +"those countries, so that distribution is permitted only in or among\n" +"countries not thus excluded. In such case, this License incorporates\n" +"the limitation as if written in the body of this License.\n" +"\n" +" 9. The Free Software Foundation may publish revised and/or new versions\n" +"of the General Public License from time to time. Such new versions will\n" +"be similar in spirit to the present version, but may differ in detail to\n" +"address new problems or concerns.\n" +"\n" +"Each version is given a distinguishing version number. If the Program\n" +"specifies a version number of this License which applies to it and \"any\n" +"later version\", you have the option of following the terms and conditions\n" +"either of that version or of any later version published by the Free\n" +"Software Foundation. If the Program does not specify a version number of\n" +"this License, you may choose any version ever published by the Free Software\n" +"Foundation.\n" +"\n" +" 10. If you wish to incorporate parts of the Program into other free\n" +"programs whose distribution conditions are different, write to the author\n" +"to ask for permission. For software which is copyrighted by the Free\n" +"Software Foundation, write to the Free Software Foundation; we sometimes\n" +"make exceptions for this. Our decision will be guided by the two goals\n" +"of preserving the free status of all derivatives of our free software and\n" +"of promoting the sharing and reuse of software generally.\n" +"\n" +" NO WARRANTY\n" +"\n" +" 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" +"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" +"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" +"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" +"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" +"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" +"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" +"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" +"REPAIR OR CORRECTION.\n" +"\n" +" 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" +"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" +"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" +"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" +"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" +"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" +"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" +"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" +"POSSIBILITY OF SUCH DAMAGES.\n" +"\n" +" END OF TERMS AND CONDITIONS\n" +"\n" +" How to Apply These Terms to Your New Programs\n" +"\n" +" If you develop a new program, and you want it to be of the greatest\n" +"possible use to the public, the best way to achieve this is to make it\n" +"free software which everyone can redistribute and change under these terms.\n" +"\n" +" To do so, attach the following notices to the program. It is safest\n" +"to attach them to the start of each source file to most effectively\n" +"convey the exclusion of warranty; and each file should have at least\n" +"the \"copyright\" line and a pointer to where the full notice is found.\n" +"\n" +" \n" +" Copyright (C) \n" +"\n" +" This program is free software; you can redistribute it and/or modify\n" +" it under the terms of the GNU General Public License as published by\n" +" the Free Software Foundation; either version 2 of the License, or\n" +" (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be useful,\n" +" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +" GNU General Public License for more details.\n" +"\n" +" You should have received a copy of the GNU General Public License along\n" +" with this program; if not, write to the Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n" +"\n" +"Also add information on how to contact you by electronic and paper mail.\n" +"\n" +"If the program is interactive, make it output a short notice like this\n" +"when it starts in an interactive mode:\n" +"\n" +" Gnomovision version 69, Copyright (C) year name of author\n" +" Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" +" This is free software, and you are welcome to redistribute it\n" +" under certain conditions; type `show c' for details.\n" +"\n" +"The hypothetical commands `show w' and `show c' should show the appropriate\n" +"parts of the General Public License. Of course, the commands you use may\n" +"be called something other than `show w' and `show c'; they could even be\n" +"mouse-clicks or menu items--whatever suits your program.\n" +"\n" +"You should also get your employer (if you work as a programmer) or your\n" +"school, if any, to sign a \"copyright disclaimer\" for the program, if\n" +"necessary. Here is a sample; alter the names:\n" +"\n" +" Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" +" `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" +"\n" +" , 1 April 1989\n" +" Ty Coon, President of Vice\n" +"\n" +"This General Public License does not permit incorporating your program into\n" +"proprietary programs. If your program is a subroutine library, you may\n" +"consider it more useful to permit linking proprietary applications with the\n" +"library. If this is what you want to do, use the GNU Lesser General\n" +"Public License instead of this License.\n" +; +static const char psz_thanks[] = +"Some VLC plugins use external libraries and make extensive use of the\n" +"following persons' or companies' code:\n" +"\n" +"FAAD2 - Copyright (c) Nero AG, www.nero.com\" - GPLv2 or later\n" +"FFmpeg - Copyright (c) 2000-2015 the FFmpeg developers - LGPLv2.1 or later\n" +"FluidSynth - Copyright (c) 2003-2010 Peter Hanappe, Conrad Berhörster, Antoine\n" +" Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson - LGPLv2.1 or\n" +" later\n" +"Fontconfig - Copyright (c) 2000,2001,2002,2003,2004,2006,2007 Keith Packard,\n" +" (c) 2005 Patrick Lam, (c) 2009 Roozbeh Pournader, (c) 2008,2009 Red Hat,\n" +" Inc., (c) 2008 Danilo Šegan, (c) 2012 Google, Inc. - MIT License\n" +"freetype - David Turner, Robert Wilhelm, and Werner Lemberg - FreeType License\n" +"GSM - Copyright (c) 1992 - 1994, 2009 Jutta Degener & Carsten Bormann - GSM\n" +" permissive license\n" +"GNU FriBidi - Copyright (c) 2004-2012 Behdad Esfahbod, Dov Grobgeld, Roozbeh\n" +" Pournader - LGPLv2.1 or later\n" +"GnuTLS - Copyright (C) 2000-2012 Free Software Foundation, Inc. - LGPLv2.1 or\n" +" later\n" +"harfbuzz - Copyright (c) 2010, 2011, 2012 Google, Inc., (c) 2012 Mozilla\n" +" Foundation, (c) 2011 Codethink Limited, (c) 2008, 2010 Nokia Corporation\n" +" and/or its subsidiary(-ies), (c) 2009 Keith Stribley, (c) 2009 Martin Hosken\n" +" and SIL International, (c) 2007 Chris Wilson, (c) 2006 Behdad Esfahbod,\n" +" (c) 2005 David Turner, (c) 2004, 2007, 2008, 2009, 2010 Red Hat, Inc.,\n" +" (c) 1998-2004 David Turner and Werner Lemberg - Old MIT License\n" +"liba52 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libav - Copyright (c) 2000 - 2015 the libav developers - LGPLv2.1 or later\n" +"libass - Copyright (c) 2006-2015 Grigori Goronzy et al. - ISC License\n" +"libbluray - Copyright (c) 2009-2015 VideoLAN and authors - LGPLv2.1 or later\n" +"libcaca - Copyright (c) 2004 Sam Hocevar - WTFPL / LGPLv2.1 or later /\n" +" GPLv2 or later / ISC\n" +"libdca - Copyright (c) 2004-2007 VideoLAN and authors - GPLv2 or later\n" +"libdvbpsi - Copyright (c) 2001-2015 VideoLAN and authors - LGPLv2.1 or later\n" +"libdvdcss - Copyright (c) 2001-2015 VideoLAN and authors - GPLv2 or later\n" +"libdvdread - GPLv2 or later\n" +"libdvdnav - GPLv2 or later\n" +"libebml - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libFLAC - Copyright (c) 2001 - 2014 Josh Coalson et al. - Xiph.org BSD license\n" +"libgme - LGPLv2.1 or later\n" +"libgpg-error - Copyright 2003, 2004, 2005, 2006, 2007, 2013 g10 Code GmbH\n" +" - LGPLv2.1 or later\n" +"libkate - Copyright (c) 2008-2011 Vincent Penquerc'h - 3-clause BSD License\n" +"liblive555 - Copyright (c) 1996-2015 Live Networks, Inc. - LGPLv2.1 or later\n" +"libmad - Copyright (c) 2000-2004 Robert Leslie, et al. - GPLv2 or later\n" +"libmatroska - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libmpeg2 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libmodplug - Oliver Lapicque, Konstanty - Public domain\n" +"libogg, libvorbis - Copyright (c) 2002-2015 Xiph.org Foundation - Xiph.org BSD\n" +" license\n" +"libpostproc - Copyright (C) 2001-2015 Michael Niedermayer, et al. - GPLv2 or\n" +" later\n" +"libpng - Copyright (c) 2004, 2006-2014 Glenn Randers-Perhson, et al. - libpng\n" +" license\n" +"libsamplerate - Copyright (c) 2002-2011 Erik de Castro Lopo - GPLv2 or later\n" +"libschroedinger - Copyright (c) 2006 BBC and Fluendo - MIT License\n" +"libsdl - Copyright (c) 1997-2014 Sam Lantinga et al. - LGPLv2.1 or later\n" +"libshout - Copyright (c) 2012 - LGPLv2.1 or later\n" +"libtheora - Copyright (c) Xiph.org Foundation - Xiph.org BSD license\n" +"libtiff - Copyright (c) 1988-1997 Sam Leffler, (c) 1991-1997 Silicon Graphics,\n" +" Inc. - BSD-like\n" +"libtwolame - Copyright (c) 2001-2004 Michael Cheng, (c) 2004-2006 The TwoLAME\n" +" Project - LGPLv2.1 or later\n" +"libupnp - Copyright (c) 2000-2003 Intel Corporation - 3-clause BSD License\n" +"libvpx - Copyright (c) 2010-2015, Google Inc. - 3-clause BSD License\n" +"libxml2 - Copyright (c) 1998-2014 Daniel Veillard - MIT License\n" +"lua - Copyright (c) 1994-2008 Lua.org, PUC-Rio. - MIT License\n" +"Musepack decoder library - Copyright (c) 2005-2011, The Musepack Development\n" +" Team - 3-clause BSD License\n" +"OpenJPEG - Copyright (c) 2002-2014, Communcations and Remote Sensing\n" +" Laboratory, UCL, Belgium - ISC License\n" +"Opus - Copyright 2001-2013 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin,\n" +" Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding,\n" +" Erik de Castro Lopo - Xiph.org BSD License\n" +"Sparkle — Andy Matuschak et al. - MIT License\n" +"Speex, Speexdsp - Copyright (c) 1992-2015 Xiph.org Foundation, Jean-Marc Valin,\n" +" Analog Devices Inc. Commonwealth Scientific and Industrial Research\n" +" Organisation, David Row, Jutta Degener, Carsten Bormann - 3-clause BSD\n" +" License\n" +"taglib - Copyright (c) 2004-2013 Scott Wheeler, et al. - LGPLv2.1 or later\n" +"x264 - Copyright (c) 2004-2015 VideoLAN and authors - GPLv2 or later\n" +"x265 - Copyright (c) 2004-2015 x265 project - GPLv2 or later\n" +"Zapping VBI library - Copyright (c) 2000-2003 Michael H. Schimek, Iñaki García\n" +" Etxebarria - LGPLv2.1 or later\n" +"zlib - Copyright (c) 1995-2012 Jean-loup Gailly and Mark Adler - zlib license\n" +"\n" +"The VideoLAN team would like to thank the following donators:\n" +"\n" +"Julian Cain, who made a $1000 donation\n" +"The French website MacBidouille gave €500 to help us buy a PowerMac G5\n" +"The French magazine à vos MAC gave €500 to help us buy a PowerMac G5\n" +"Laurent Dupuy, who made a €540 donation\n" +"The French company Cybervia (Actech) gave €2000 to pay for webserver hosting\n" +"Dennis Perov - Hardware donation\n" +"\n" +"...the following active members of our user community:\n" +"\n" +"Alan Wright\n" +"David J LaBarre \"DJ\"\n" +"Eric Adler\n" +"Julien Bouquillon\n" +"\n" +"...and code auditors and testers:\n" +"\n" +"David Thiel\n" +"Philippe A. aka \"Lotesdelère\"\n" +"Sebastien Chaumat\n" +; +static const char psz_authors[] = +"VideoLAN and the VLC team would like to acknowledge the following contributors:\n" +"\n" +"Programming\n" +"-----------\n" +"Rémi Denis-Courmont\n" +"Jean-Baptiste Kempf\n" +"Laurent Aimar\n" +"Rafaël Carré\n" +"Felix Paul Kühne\n" +"Gildas Bazin\n" +"Pierre d'Herbemont\n" +"Rémi Duraffort\n" +"Derk-Jan Hartman\n" +"Antoine Cellerier\n" +"Jean-Paul Saman\n" +"Samuel Hocevar\n" +"Christophe Mutricy\n" +"Clément Stenac\n" +"Christophe Massiot\n" +"François Cartegnie\n" +"Ilkka Ollakka\n" +"David Fuhrmann\n" +"Pierre Ynard\n" +"Damien Fouilleul\n" +"Sigmund Augdal Helberg\n" +"Erwan Tulou\n" +"Olivier Teulière\n" +"Cyril Deguet\n" +"Eric Petit\n" +"Filippo Carone\n" +"Rocky Bernstein\n" +"Hugo Beauzée-Luyssen\n" +"Olivier Aubert\n" +"Pavlov Konstantin\n" +"Jakob Leben\n" +"Benjamin Pracht\n" +"Jean-Philippe André\n" +"Steve Lhomme\n" +"Stéphane Borel\n" +"Ludovic Fauvet\n" +"Martin Storsjö\n" +"JP Dinger\n" +"Geoffroy Couprie\n" +"KO Myung-Hun\n" +"Marian Ďurkovič\n" +"Yoann Peronneau\n" +"Sébastien Escudier\n" +"Denis Charmet\n" +"Edward Wang\n" +"Jon Lech Johansen\n" +"Felix Abecassis\n" +"Tristan Matthews\n" +"Dennis van Amerongen\n" +"Mirsal Ennaime\n" +"Faustino Osuna\n" +"Jérôme Decoodt\n" +"Loïc Minier\n" +"Christoph Miebach\n" +"Adrien Maglo\n" +"David Flynn\n" +"Frédéric Yhuel\n" +"Kaarlo Raiha\n" +"Mark Moriarty\n" +"Christopher Mueller\n" +"Fabio Ritrovato\n" +"Tony Castley\n" +"Srikanth Raju\n" +"Michel Kaempf\n" +"Jean-Marc Dressler\n" +"Johan Bilien\n" +"Vincent Seguin\n" +"Simon Latapie\n" +"Bernie Purcell\n" +"Henri Fallon\n" +"Sebastien Zwickert\n" +"Emmanuel Puig\n" +"Sean McGovern\n" +"Renaud Dartus\n" +"Alexis de Lattre\n" +"Naohiro Koriyama\n" +"Vincent Penquerc'h\n" +"Arnaud de Bossoreille de Ribou\n" +"Mohammed Adnène Trojette\n" +"Petri Hintukainen\n" +"Boris Dorès\n" +"Hannes Domani\n" +"Jai Menon\n" +"Anil Daoud\n" +"Daniel Mierswa\n" +"Dominique Leuenberger\n" +"Rob Jonson\n" +"Pierre Baillet\n" +"Andre Pang\n" +"Michał Trzebiatowski\n" +"Zoran Turalija\n" +"Akash Mehrotra\n" +"André Weber\n" +"Anthony Loiseau\n" +"Devin Heitmueller\n" +"Lukas Durfina\n" +"Xavier Marchesini\n" +"Cyril Mathé\n" +"Tobias Güntner\n" +"Juho Vähä-Herttua\n" +"Ken Self\n" +"Luca Barbato\n" +"Steinar H. Gunderson\n" +"Sébastien Toque\n" +"Alexis Ballier\n" +"Juha Jeronen\n" +"Nicolas Chauvet\n" +"Richard Hosking\n" +"Thomas Guillem\n" +"Timothy B. Terriberry\n" +"Éric Lassauge\n" +"Marc Ariberti\n" +"Matthias Keiser\n" +"Vittorio Giovara\n" +"Benoit Steiner\n" +"Maxim Bublis\n" +"Michel Lespinasse\n" +"Carlo Calabrò\n" +"Cheng Sun\n" +"Gleb Pinigin\n" +"Brad Smith\n" +"Brendon Justin\n" +"Daniel Verkamp\n" +"Mark Lee\n" +"Ronald Wright\n" +"Alexey Sokolov\n" +"Basos G\n" +"Philippe Morin\n" +"Thomas De Rocker\n" +"Vicente Jimenez Aguilar\n" +"Yuval Tze\n" +"Benjamin Drung\n" +"Yves Duret\n" +"Julien 'Lta' BALLET\n" +"Michael Hanselmann\n" +"Vianney Boyer\n" +"Alex Merry\n" +"Damien Lucas\n" +"Grigori Goronzy\n" +"Julian Scheel\n" +"Richard Shepherd\n" +"Gaël Hendryckx\n" +"Michael Feurstein\n" +"Rui Zhang\n" +"Stephan Assmus\n" +"Adrien Grand\n" +"Alexander Lakhin\n" +"Anatoliy Anischovich\n" +"Colin Guthrie\n" +"David Menestrina\n" +"Dominique Martinet\n" +"Jason Luka\n" +"Luc Saillard\n" +"Mario Speiß\n" +"Pankaj Yadav\n" +"Ramiro Polla\n" +"Can Wu\n" +"Christophe Courtaut\n" +"FUJISAWA Tooru\n" +"François Revol\n" +"Manol Manolov\n" +"Nicolas Bertrand\n" +"Andrey Utkin\n" +"Antoine Lejeune\n" +"Arnaud Schauly\n" +"Branko Kokanovic\n" +"Dylan Yudaken\n" +"Florian G. Pflug\n" +"G Finch\n" +"Keary Griffin\n" +"Konstanty Bialkowski\n" +"Ming Hu\n" +"Philippe Coent\n" +"Przemyslaw Fiala\n" +"Tanguy Krotoff\n" +"Wieland Hoffmann\n" +"Casian Andrei\n" +"Chris Smowton\n" +"David Kaplan\n" +"Eugenio Jarosiewicz\n" +"Fabian Keil\n" +"Guillaume Poussel\n" +"John Peterson\n" +"Justus Piater\n" +"Martin T. H. Sandsmark\n" +"Rune Botten\n" +"Sergey Radionov\n" +"Søren Bøg\n" +"Toralf Niebuhr\n" +"Adrian Yanes\n" +"Angelo Haller\n" +"Aurélien Nephtali\n" +"Austin Burrow\n" +"Bill C. Riemers\n" +"Colin Delacroix\n" +"Cristian Maglie\n" +"Elminster2031\n" +"Georgi Chorbadzhiyski\n" +"Gilles Sabourin\n" +"Jakub Wieczorek\n" +"John Freed\n" +"Mark Hassman\n" +"Martin Briza\n" +"Mike Houben\n" +"Romain Goyet\n" +"Barry Wardell\n" +"Ben Hutchings\n" +"Besnard Jean-Baptiste\n" +"Brian Weaver\n" +"Clement Chesnin\n" +"David Geldreich\n" +"David Robison\n" +"Dennis Hamester\n" +"Diego Elio Pettenò\n" +"Diego Fernando Nieto\n" +"Fabian Yamaguchi\n" +"Frode Tennebø\n" +"Jerome Forissier\n" +"John Stebbins\n" +"Jon Stacey\n" +"Jonathan Rosser\n" +"Joris van Rooij\n" +"Josh Watzman\n" +"Kaloyan Kovachev\n" +"Katsushi Kobayashi\n" +"Kelly Anderson\n" +"Loren Merritt\n" +"Maciej Blizinski\n" +"Mark Bidewell\n" +"Martell Malone\n" +"Miguel Angel Cabrera Moya\n" +"Niles Bindel\n" +"Samuel Pitoiset\n" +"Scott Caudle\n" +"Sean Robinson\n" +"Sergio Ammirata\n" +"Simon Hailes\n" +"Stephen Parry\n" +"Sukrit Sangwan\n" +"Thierry Reding\n" +"Uwe L. Korn\n" +"Valentin Vetter\n" +"Xavier Martin\n" +"Adam Leggett\n" +"Alex Converse\n" +"Alexander Bethke\n" +"Alexandre Ratchov\n" +"Andres Krapf\n" +"Andri Pálsson\n" +"Andy Chenee\n" +"Andy Tather\n" +"Anuradha Suraparaju\n" +"Arun Pandian G\n" +"Avishay Spitzer\n" +"Ben Littler\n" +"Benjamin Poulain\n" +"Brieuc Jeunhomme\n" +"Chris Clayton\n" +"Clément Lecigne\n" +"Cédric Cocquebert\n" +"Daniel Peng\n" +"Danny Wood\n" +"David K\n" +"Edouard Gomez\n" +"Emmanuel de Roux\n" +"Finn Hughes\n" +"GBX\n" +"Gaurav Narula\n" +"Geraud CONTINSOUZAS\n" +"Gilles Chanteperdrix\n" +"Gwenole Beauchesne\n" +"Hugues Fruchet\n" +"Jan Winter\n" +"Jean-François Massol\n" +"Jean-Philippe Grimaldi\n" +"Jean-Yves Avenard\n" +"Kai Lauterbach\n" +"Konstantin Bogdanov\n" +"Kuan-Chung Chiu\n" +"Kuang Rufan\n" +"Matthias Dahl\n" +"Michael McEll\n" +"Michael Ploujnikov\n" +"Mike Schrag\n" +"Nickolai Zeldovich\n" +"Niklas Hayer\n" +"Olafs Vandāns\n" +"Olivier Gambier\n" +"Paul Corke\n" +"Reka Inovan\n" +"Ron Frederick\n" +"Ross Finlayson\n" +"Rov Juvano\n" +"Sam Lade\n" +"Sandeep Kumar\n" +"Sasha Koruga\n" +"Simona-Marinela Prodea\n" +"Sreng Jean\n" +"Sven Petai\n" +"Timo Rothenpieler\n" +"Tomas Krotil\n" +"Tomer Barletz\n" +"Tristan Leteurtre\n" +"Vikram Fugro\n" +"Wang Bo\n" +"maxime Ripard\n" +"xxcv\n" +"Adam Hoka\n" +"Adrian Haensler\n" +"Adrian Knoth\n" +"Adrien Cunin\n" +"Ago Allikmaa\n" +"Alain Degreffe\n" +"Alan Fischer\n" +"Alan McCosh\n" +"Alex Helfet\n" +"Alex Peak\n" +"Alex Warhawk\n" +"Alex Woods\n" +"Alexander Terentyev\n" +"Alexandre Ferreira\n" +"Alexandre Pereira Nunes\n" +"Alina Friedrichsen\n" +"Allan Odgaard\n" +"An L. Ber\n" +"Andreas Schlick\n" +"Andrew Schubert\n" +"Andrey Makhnutin\n" +"Arnaud Vallat\n" +"Arne de Bruijn\n" +"Asad Mehmood\n" +"Ashok Bhat\n" +"Austin English\n" +"Baptiste Coudurier\n" +"Benoit Calvez\n" +"Björn Stenberg\n" +"Blake Livingston\n" +"Brandon Brooks\n" +"Brian Johnson\n" +"Brian Kurle\n" +"Brian Schmidt\n" +"Brion Vibber\n" +"Cezar Elnazli\n" +"Chris White\n" +"Christian Masus\n" +"Christian Suloway\n" +"Christoph Pfister\n" +"Christoph Seibert\n" +"Christopher Key\n" +"Christopher Rath\n" +"Claudio Ortelli\n" +"Cody Russell\n" +"Cristian Morales Vega\n" +"Dan Rosenberg\n" +"Daniel Marth\n" +"Daniel Tisza\n" +"Detlef Schroeder\n" +"Diego Biurrun\n" +"Dominik 'Rathann' Mierzejewski\n" +"Duncan Salerno\n" +"Edward Sheldrake\n" +"Elliot Murphy\n" +"Elodie Thomann\n" +"Eren Inan Canpolat\n" +"Ernest E. Teem III\n" +"Etienne Membrives\n" +"Fabrizio Ge\n" +"Fargier Sylvain\n" +"Fathi Boudra\n" +"Felix Geyer\n" +"Filipe Azevedo\n" +"Florent Pillet\n" +"Florian Hubold\n" +"Florian Roeske\n" +"Forteve Zepushisti\n" +"Frank Enderle\n" +"Frédéric Crozat\n" +"Gal Vinograd\n" +"Gaurav Pruthi\n" +"Georg Seifert\n" +"Gertjan Van Droogenbroeck\n" +"Greg Farrell\n" +"Gregory Maxwell\n" +"Götz Waschk\n" +"Hans-Kristian Arntzen\n" +"Harry Sintonen\n" +"Heorhi Valakhanovich\n" +"Iain Wade\n" +"Ibraheem Paredath\n" +"Igor Prokopenkov\n" +"Isamu Arimoto\n" +"Ismael Luceno\n" +"James Bates\n" +"James Bond\n" +"James Turner\n" +"Janne Grunau\n" +"Janne Kujanpää\n" +"Jarmo Torvinen\n" +"Jason Scheunemann\n" +"Jeff Lu\n" +"Jeremy Huddleston Sequoia\n" +"Jeroen Ost\n" +"Joe Taber\n" +"Johann Ransay\n" +"Johannes Weißl\n" +"John Hendrikx\n" +"Jonas Gehring\n" +"Joseph S. Atkinson\n" +"Juergen Lock\n" +"Julien / Gellule\n" +"Julien Humbert\n" +"Kamil Baldyga\n" +"Kamil Klimek\n" +"Karlheinz Wohlmuth\n" +"Kevin Anthony\n" +"Kevin DuBois\n" +"Konstantin Pavlov\n" +"Konstantinos Tsanaktsidis\n" +"LANGLOIS Olivier PIS -EXT\n" +"Lari Natri\n" +"Lorenzo Pistone\n" +"Lucas C. Villa Real\n" +"Lukas Juhrich\n" +"Lukáš Lalinský\n" +"Mal Graty\n" +"Malte Tancred\n" +"Marc Aldorasi\n" +"Marc Etcheverry\n" +"Martin Pöhlmann\n" +"Martin Zeman\n" +"Marton Balint\n" +"Mathew King\n" +"Mathieu Sonet\n" +"Matthew A. Townsend\n" +"Matthias Bauer\n" +"Max Dilipovich\n" +"Mika Tiainen\n" +"Mike Cardillo\n" +"Mounir Lamouri (volkmar)\n" +"Natanael Copa\n" +"Nathan Phillip Brink\n" +"Nick Briggs\n" +"Nick Pope\n" +"Nil Geiswiller\n" +"O. Hartmann\n" +"Pascal Thomet\n" +"Paul Clark\n" +"Paweł Stankowski\n" +"Pere Orga\n" +"Peter Bak Nielsen\n" +"Phil Roffe and David Grellscheid\n" +"Philip Sequeira\n" +"Pierre Souchay\n" +"Pierre-Hugues Husson\n" +"Piotr Fusik\n" +"Pádraig Brady\n" +"R.M\n" +"Ralph Giles\n" +"Ramon Gabarró\n" +"Ray Tiley\n" +"Robert Forsman\n" +"Robert Jedrzejczyk\n" +"Robert Paciorek\n" +"Rolf Ahrenberg\n" +"Romain FLIEDEL\n" +"Roman Pen\n" +"Ruud Althuizen\n" +"Salah-Eddin Shaban\n" +"Sam Malone\n" +"Samuli Suominen\n" +"Santiago Gimeno\n" +"Scott Lyons\n" +"Sebastian Birk\n" +"Sebastian Ramacher\n" +"Sergey Bolshakov\n" +"Sergey Puzanov\n" +"Sharad Dixit\n" +"Song Ye Wen\n" +"Stephan Krempel\n" +"Steven Kramer\n" +"Steven Sheehy\n" +"Sveinung Kvilhaugsvik\n" +"Sylvain Cadhillac\n" +"Sylver Bruneau\n" +"Takahito HIRANO\n" +"Theron Lewis\n" +"Thierry Foucu\n" +"Thijs Alkemade\n" +"Tillmann Karras\n" +"Tim Walker\n" +"Timo Paulssen\n" +"Tobias Rapp\n" +"Tomasen\n" +"Tony Vankrunkelsven\n" +"Tristan Heaven\n" +"Tzu-Jung Lee\n" +"Varphone Wong\n" +"Vasily Fomin\n" +"Vikram Narayanan\n" +"Wills Wang\n" +"Yannick Bréhon\n" +"Yavor Doganov\n" +"Yohann Martineau\n" +"dharani.prabhu.s\n" +"suheaven\n" +"wucan\n" +"أحمد المحم ودي (Ahmed El-Mahmoudy)\n" +"김정은\n" +"Adam Sampson\n" +"Alexander Gall\n" +"Alex Antropoff\n" +"Alexis Guillard\n" +"Alex Izvorski\n" +"Amir Gouini\n" +"Andrea Guzzo\n" +"Andrew Flintham\n" +"Andrew Zaikin\n" +"Andy Lindsay\n" +"Arai/Fujisawa Tooru\n" +"Arkadiusz Miskiewicz\n" +"Arnaud Gomes-do-Vale\n" +"Arwed v. Merkatz\n" +"Barak Ori\n" +"Basil Achermann\n" +"Benjamin Mironer\n" +"Bill\n" +"Bob Maguire\n" +"Brian C. Wiles\n" +"Brian Raymond\n" +"Brian Robb\n" +"Carsten Gottbehüt\n" +"Carsten Haitzler\n" +"Charles Hordis\n" +"Chris Clepper\n" +"Christian Henz\n" +"Christof Baumgaertner\n" +"Christophe Burgalat\n" +"Christopher Johnson\n" +"Cian Duffy\n" +"Colin Simmonds\n" +"Damian Ivereigh\n" +"Daniel Fischer\n" +"Daniel Stränger\n" +"Danko Dolch\n" +"Dennis Lou\n" +"Dermot McGahon\n" +"Douglas West\n" +"Dugal Harris\n" +"Emmanuel Blindauer\n" +"Enrico Gueli\n" +"Enrique Osuna\n" +"Eren Türkay\n" +"Eric Dudiak\n" +"Espen Skoglund\n" +"Ethan C. Baldridge\n" +"François Seingier\n" +"Frans van Veen\n" +"Frédéric Ruget\n" +"Gerald Hansink\n" +"Gisle Vanem\n" +"Glen Gray\n" +"Goetz Waschk\n" +"Gregory Hazel\n" +"Gustaf Neumann\n" +"Hang Su\n" +"Hans Lambermont\n" +"Hans-Peter Jansen\n" +"Harris Dugal\n" +"Heiko Panther\n" +"Igor Helman\n" +"Isaac Osunkunle\n" +"Jan David Mol\n" +"Jan Gerber\n" +"Jan Van Boghout\n" +"Jasper Alias\n" +"Jean-Alexis Montignies\n" +"Jean-Baptiste Le Stang\n" +"Jeffrey Baker\n" +"Jeroen Massar\n" +"Jérôme Guilbaud\n" +"Johannes Buchner\n" +"Johen Michael Zorko\n" +"Johnathan Rosser\n" +"John Dalgliesh\n" +"John Paul Lorenti\n" +"Jörg\n" +"Joseph Tulou\n" +"Julien Blache\n" +"Julien Plissonneau Duquène\n" +"Julien Robert\n" +"Kenneth Ostby\n" +"Kenneth Self\n" +"Kevin H. Patterson\n" +"Koehler, Vitally\n" +"K. Staring\n" +"Lahiru Lakmal Priyadarshana\n" +"Laurent Mutricy\n" +"Leo Spalteholz\n" +"Loox Thefuture\n" +"Marc Nolette\n" +"Marco Munderloh\n" +"Mark Gritter\n" +"Markus Kern\n" +"Markus Kuespert\n" +"Martin Hamrle\n" +"Martin Kahr\n" +"Mateus Krepsky Ludwich\n" +"Mathias Kretschmer\n" +"Mats Rojestal\n" +"Matthias P. Nowak\n" +"Matthieu Lochegnies\n" +"Michael Mondragon\n" +"Michael S. Feurstein\n" +"Michel Lanners\n" +"Mickael Hoerdt\n" +"Miguel Angel Cabrera\n" +"Mikko Hirvonen\n" +"Moritz Bunkus\n" +"Nilmoni Deb\n" +"Olivier Houchard\n" +"Olivier Pomel\n" +"Ondrej Kuda aka Albert\n" +"Øyvind Kolbu\n" +"Pascal Levesque\n" +"Patrick Horn\n" +"Patrick McLean\n" +"Pauline Castets\n" +"Paul Mackerras\n" +"Peter Surda\n" +"Petr Vacek\n" +"Philippe Van Hecke\n" +"Pierre-Luc Beaudoin\n" +"Pierre Marc Dumuid\n" +"Régis Duchesne\n" +"Remco Poortinga\n" +"Rene Gollent\n" +"Rob Casey\n" +"Robson Braga Araujo\n" +"Roine Gustafsson\n" +"Roman Bednarek\n" +"Rudolf Cornelissen\n" +"Sašo Kiselkov\n" +"Sebastian Jenny\n" +"Shane Harper\n" +"Stefán Freyr Stefánsson\n" +"Steve Brown\n" +"Steven M. Schultz\n" +"Tapio Hiltunen\n" +"Thomas L. Wood\n" +"Thomas Mühlgrabner\n" +"Thomas Parmelan\n" +"Tim 'O Callagha\n" +"Tim Schuerewegen\n" +"Tong Ka Man\n" +"Torsten Spindler\n" +"Udo Richter\n" +"Vincent Dimar\n" +"Vincent Penne\n" +"Vitalijus Slavinskas\n" +"Vitaly V. Bursov\n" +"Vladimir Chernyshov\n" +"Wade Majors\n" +"Wallace Wadge\n" +"Watanabe Go\n" +"William Hawkins\n" +"Xavier Maillard\n" +"Ye zhang\n" +"Yuehua Zhao\n" +"\n" +"Artwork\n" +"-------\n" +"Damien Erambert\n" +"Daniel Dreibrodt, aka aLtgLasS\n" +"David Weber\n" +"Davor Orel\n" +"Dominic Spitaler\n" +"Eurodata Computer Club\n" +"Geoffrey Roussel\n" +"Joeri van Dooren\n" +"kty0ne\n" +"Max Rudberg\n" +"Richard Øiestad\n" +"Simon Damkjær Andersen\n" +"Tom Bigelajzen\n" +"Vincent van den Heuvel\n" +"\n" +"Documentation\n" +"-------------\n" +"Bill Eldridge\n" +"\n" +"Localization\n" +"------------\n" +"Abdul Fousan - Tamil\n" +"A. Decorte - Friulian\n" +"A. Regnander - Swedish\n" +"Adem Gunes - Turkish\n" +"Adi Nugroho - Tagalog\n" +"Adnan Memija - Bosnian\n" +"airplanez - Korean\n" +"Ajith Manjula - Sinhala\n" +"Aled Powell - Welsh\n" +"Alexander Didebulidze - Georgian\n" +"Alexander Henket - Dutch\n" +"Alexander Jansen - Norwegian Bokmål\n" +"Alexander Lakhin - Russian\n" +"Alexey Lugin - Ukrainian\n" +"Alexey Salmin - Russian\n" +"Alfred John - Acoli\n" +"Amanpreet Singh Alam - Punjabi\n" +"André de Barros Martins Ribeiro - Brazilian portuguese\n" +"Andrey Brilevskiy - Russian\n" +"Andrey Wolk - Russian\n" +"Andri Pálsson - Icelandic\n" +"Andriy Bandura - Ukrainian\n" +"Anh Phan - Vietnamese\n" +"Aniket Eknath Kudale - Marathi\n" +"Animesh Swar - Nepalese\n" +"Aputsiaĸ Niels Janussen - Danish\n" +"Ara Bextiyar - Sorani (Kurdish)\n" +"Ari Constâncio - Portuguese\n" +"Arkadiusz Lipiec - Polish\n" +"Ask Hjorth Larsen - Danish\n" +"Audrey Prevost - French\n" +"Auk Piseth - Khmer\n" +"Bayarsaikhan Enkhtaivan Баярсайхан Энхтайван - Mongolian\n" +"Biraj Karmakar - Bengali (India)\n" +"Bruno Queirós - Portuguese\n" +"Bruno Vella - Italian\n" +"Caner Başaran - Turkish\n" +"Carlo Calabrò - Italian\n" +"Chandan Kumar - Hindi\n" +"Chesús Daniel Trigo - Aragonese\n" +"Christoph Miebach - German\n" +"Chynggyz Jumaliev - Kirgyz\n" +"Circo Radu - Romanian\n" +"Cristian Secară - Romanian\n" +"Daniel Nylander - Swedish\n" +"Daniel Winzen - German\n" +"David González - Spanish\n" +"David Planella - Catalan\n" +"Dean Lee - Simplified Chinese\n" +"Denis Arnaud - Breton\n" +"Derk-Jan Hartman - Dutch\n" +"DirektX - Hungarian\n" +"Dominko Aždajić - Croatian\n" +"Dylan Aïssi - French\n" +"Đorđe Vasiljević - Serbian\n" +"Eduard Babayan - Armenian\n" +"Eero - Estonian\n" +"Eirik U. Birkeland - Norwegian Nynorsk\n" +"Elizabeth Da Conceicao Baptista - Tetum\n" +"Emilio Sepúlveda - Interlingua\n" +"Emin Mastizada - Azerbaijani\n" +"Éric Lassauge - French\n" +"Farzaneh Sarafraz - Persian\n" +"Florence Tushabe - Chiga\n" +"Fouzia Bourai - Arabic\n" +"Frank Chao - Traditional Chinese\n" +"Freyr Gunnar Ólafsson - Icelandic\n" +"Friedel Wolff - Afrikaans\n" +"Fumio Nakayama - Japanese\n" +"Gabor Kelemen - Hungarian\n" +"Gaurav Kumar - Hindi\n" +"Gaëtan Rousseaux - Walloon\n" +"Ghjuvan Pasquinu - Corsican\n" +"Goce Manevski - Macedonian\n" +"Golam Maruf Oovee - Bengali\n" +"Gonçalo Cordeiro - Galician\n" +"Gorana Milicevic - Serbian\n" +"Goswami Hardikpuri Kishorpuri - Gujarati\n" +"Haakon Meland Eriksen - Norwegian\n" +"Han HoJoong - Korean\n" +"Hardik Kishorpuri Goswami - Gujarati\n" +"Hemanta Nandi - Bengali (India)\n" +"Huw Waters - Welsh\n" +"H.Shalitha Vikum - Sinhala\n" +"Ibrahima Sarr - Fulah\n" +"Ingmārs Dīriņš - Latvian\n" +"Israt Jahan - Bengali\n" +"Ivar Smolin - Estonian\n" +"Iván Seoane Pardo - Galician\n" +"Ivo Ivanov - Bulgarian\n" +"Iñaki Larrañaga Murgoitio - Basque\n" +"Iñigo Varela - Asturian; Bable\n" +"Jakub Žáček - Czech\n" +"James Olweny - Ganda\n" +"Jamil Ahmed - Bengali\n" +"Javier Varela - Spanish\n" +"Jean-Pierre Kuypers - French\n" +"Jens Seidel - German\n" +"Joao Almeida - Portuguese\n" +"Joel Arvidsson - Swedish\n" +"jogijs - Latvian\n" +"Jonas Larsen - Danish\n" +"Jon Stødle - Norwegian Nynorsk\n" +"Jouni Kähkönen - Finnish\n" +"Juha Jeronen - Finnish\n" +"Julen Ruiz Aizpuru - Basque\n" +"Kai Hermann - German\n" +"Kamil Páral - Czech\n" +"Kang Jeong-Hee - Korean\n" +"Kasper Tvede - Danish\n" +"Kaya Zeren - Turkish\n" +"Kenneth Nielsen - Danish\n" +"Khin Mi Mi Aung - Burmese\n" +"Khoem Sokhem - Khmer\n" +"Kola - Albanian\n" +"Kypchak Kypchak - Kazakh\n" +"Laurent Jonqueres - Occitan\n" +"Loba Yeasmeen - Bengali\n" +"Lorena Gomes - Catalan\n" +"Lorenzo Porta - Italian\n" +"Luqman Hakim - Indonesian\n" +"L. Balasubramaniam - Hindi\n" +"Mahrazi Mohd Kamal - Malay\n" +"Manolis Stefanis - Modern Greek\n" +"Manuela Silva/Alfredo Silva - Portuguese\n" +"Marián Hikaník - Slovak\n" +"Mario Siegmann - German\n" +"Marko Uskokovic - Serbian\n" +"Martin Srebotnjak - Slovenian\n" +"Martin Zicha - Czech\n" +"Matej Urbančič - Slovenian\n" +"Mathias C. Berens, welcome-soft - German\n" +"Mattias Põldaru - Estonian\n" +"Md. Rezwan Shahid - Bengali\n" +"Meelad Zakaria - Persian\n" +"Michael Bauer - Scottish Gaelic\n" +"Michal Halenka - Czech\n" +"Michał Trzebiatowski - Polish\n" +"Miguel Sousa - Portuguese\n" +"Mihkel Kirjutas - Estonian\n" +"Mindaugas Baranauskas - Lithuanian\n" +"Miroslav Oujeský - Czech\n" +"Morten Brix Pedersen - Danish\n" +"Mustafa Sandal - Czech\n" +"Myckel Habets - Dutch\n" +"Namhyung Kim - Korean\n" +"Niels Fanøe - Danish\n" +"Niklas 'Nille' Åkerström - Swedish\n" +"Olav Dahlum - Norwegian Bokmål\n" +"Oleksandr Natalenko - Ukrainian\n" +"Omer Ensari - Kurmanji (Kurdish)\n" +"Osama Khalid - Arabic\n" +"Otto Kekäläinen - Finnish\n" +"Paras Nath Chaudhary - Nepali\n" +"Pasindu Kavinda - Sinhala\n" +"Pau Iranzo - Catalan\n" +"Paula Iglesias - Galician\n" +"Pedro Valadares - Portuguese\n" +"Peter Jespersen - Danish\n" +"Petr Šimáček - Czech\n" +"Phan Anh - Vietnamese\n" +"Philipp Weissenbacher - German\n" +"Pittayakom Saingtong - Thai\n" +"Prasannajit Acharya - Oriya\n" +"Praveen Illa - Telugu\n" +"Predrag Ljubenović - Serbian\n" +"Pyae Sone - Burmese\n" +"Rajnikant Kumbhar - Marathi\n" +"Ricardo Perdigão - Portuguese\n" +"Ricardo Pérez López - Spanish\n" +"Roustam Ghizdatov - Russian\n" +"Ruei-Yuan Lu - Traditional Chinese\n" +"Saad Liaquat Kiani - Urdu\n" +"Sadia Afroz - Bengali\n" +"Said Marjan Zazai - Pashto\n" +"Salar Khalilzadeh - Persian\n" +"Sam Askari - Spanish\n" +"Sam Hocevar - British\n" +"Samuel Hocevar - French\n" +"Saúl Ortega - Spanish\n" +"Savvas Nesseris - Modern Greek\n" +"Sayan Chowdhury - Hindi\n" +"Seanán Ó Coistín - Irish\n" +"Semsudin Abdic - Bosnian\n" +"Shambhu Kumar - Hindi\n" +"Shantanu Sarkar - Hindi\n" +"Shashi Ranjan - Hindi\n" +"Siarhei Daryichau Дар'ічаў Сяргей - Belarusian\n" +"Sidney Doria - Brazilian Portuguese\n" +"Sigmund Augdal - Norwegian Bokmål\n" +"Simos Xenitellis - Modern Greek\n" +"Sipho Sibiya - Zulu\n" +"Sok Sophea - Khmer\n" +"Solomon Gizaw - Amharic\n" +"Sreejith P - Malayalam\n" +"Suraj Kawade - Marathi\n" +"Stian Jørgensrud - Norwegian Bokmål\n" +"Sveinn í Felli - Icelandic\n" +"Tadashi Jokagi - Japanese\n" +"Tarsem Singh - Hindi\n" +"Thanakrit Chomphuming - Thai\n" +"Tero Pelander - Finnish\n" +"Thomas De Rocker - Dutch\n" +"Thomas Graf - gettext support, German\n" +"Tomáš Chvátal - Czech\n" +"Tòni Galhard - Occitan\n" +"Umesh Agarwal - Bengali (India)\n" +"Umidjon Almasov - Uzbek\n" +"Václav Pavlíček - Czech\n" +"Valek Filippov - Russian\n" +"Vicente Jimenez Aguilar - Spanish\n" +"Vincenzo Reale - Italian\n" +"Vít Pelčák - Czech\n" +"viyyer - Hindi\n" +"Vladimir Yermolayev - Russian\n" +"Vojtěch Smejkal - Czech\n" +"Wei Mingzhi - Simplified Chinese\n" +"Xènia Albà Cantero - Catalan\n" +"Xuacu Saturio - Asturian\n" +"Yaron Shahrabani - Hebrew\n" +"Yaşar Tay - Turkish\n" +"Yhal Htet Aung - Burmese\n" +"Yogesh K S - Kannada\n" +"Yoyo - Simplified Chinese\n" +"Yuksel Yildirim - Turkish\n" +"Zabeeh Khan - Pashto\n" +"Zhang Tong - Chinese\n" +; diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_access.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_access.h new file mode 100644 index 0000000..3697db0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_access.h @@ -0,0 +1,181 @@ +/***************************************************************************** + * vlc_access.h: Access descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: 511278add942a4ff59cc658431901236dd48e341 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ACCESS_H +#define VLC_ACCESS_H 1 + +/** + * \file + * This file defines functions and definitions for access object + */ + +#include + +/** + * \defgroup access Access + * @{ + */ + +enum access_query_e +{ + /* capabilities */ + ACCESS_CAN_SEEK, /* arg1= bool* cannot fail */ + ACCESS_CAN_FASTSEEK, /* arg1= bool* cannot fail */ + ACCESS_CAN_PAUSE, /* arg1= bool* cannot fail */ + ACCESS_CAN_CONTROL_PACE,/* arg1= bool* cannot fail */ + ACCESS_GET_SIZE=6, /* arg1= uin64_t* */ + + /* */ + ACCESS_GET_PTS_DELAY = 0x101,/* arg1= int64_t* cannot fail */ + ACCESS_GET_TITLE_INFO, /* arg1=input_title_t*** arg2=int* res=can fail */ + ACCESS_GET_TITLE, /* arg1=unsigned * res=can fail */ + ACCESS_GET_SEEKPOINT, /* arg1=unsigned * res=can fail */ + + /* Meta data */ + ACCESS_GET_META, /* arg1= vlc_meta_t ** res=can fail */ + ACCESS_GET_CONTENT_TYPE,/* arg1=char **ppsz_content_type res=can fail */ + + ACCESS_GET_SIGNAL, /* arg1=double *pf_quality, arg2=double *pf_strength res=can fail */ + + /* */ + ACCESS_SET_PAUSE_STATE = 0x200, /* arg1= bool can fail */ + + /* */ + ACCESS_SET_TITLE, /* arg1= int can fail */ + ACCESS_SET_SEEKPOINT, /* arg1= int can fail */ + + /* Special mode for access/demux communication + * XXX: avoid to use it unless you can't */ + ACCESS_SET_PRIVATE_ID_STATE = 0x1000, /* arg1= int i_private_data, bool b_selected res=can fail */ + ACCESS_SET_PRIVATE_ID_CA, /* arg1= int i_program_number, uint16_t i_vpid, uint16_t i_apid1, uint16_t i_apid2, uint16_t i_apid3, uint8_t i_length, uint8_t *p_data */ + ACCESS_GET_PRIVATE_ID_STATE, /* arg1=int i_private_data arg2=bool * res=can fail */ +}; + +struct access_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* Access name (empty if non forced) */ + char *psz_access; + char *psz_location; /**< Location (URL with the scheme stripped) */ + char *psz_filepath; /**< Local file path (if applicable) */ + + /* Access can fill this entry to force a demuxer + * XXX: fill it once you know for sure you will succeed + * (if you fail, this value won't be reseted */ + char *psz_demux; + + /* pf_read/pf_block is used to read data. + * XXX A access should set one and only one of them */ + ssize_t (*pf_read) ( access_t *, uint8_t *, size_t ); /* Return -1 if no data yet, 0 if no more data, else real data read */ + block_t *(*pf_block)( access_t * ); /* return a block of data in his 'natural' size, NULL if not yet data or eof */ + + /* Called for each seek. + * XXX can be null */ + int (*pf_seek) ( access_t *, uint64_t ); /* can be null if can't seek */ + + /* Used to retreive and configure the access + * XXX mandatory. look at access_query_e to know what query you *have to* support */ + int (*pf_control)( access_t *, int i_query, va_list args); + + /* Access has to maintain them uptodate */ + struct + { + uint64_t i_pos; /* idem */ + bool b_eof; /* idem */ + } info; + access_sys_t *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +static inline int access_vaControl( access_t *p_access, int i_query, va_list args ) +{ + if( !p_access ) return VLC_EGENERIC; + return p_access->pf_control( p_access, i_query, args ); +} + +static inline int access_Control( access_t *p_access, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = access_vaControl( p_access, i_query, args ); + va_end( args ); + return i_result; +} + +static inline uint64_t access_GetSize( access_t *p_access ) +{ + uint64_t val; + if( access_Control( p_access, ACCESS_GET_SIZE, &val ) ) + val = 0; + return val; +} + +static inline void access_InitFields( access_t *p_a ) +{ + p_a->info.i_pos = 0; + p_a->info.b_eof = false; +} + +/** + * This function will return the parent input of this access. + * It is retained. It can return NULL. + */ +VLC_API input_thread_t * access_GetParentInput( access_t *p_access ) VLC_USED; + +#define ACCESS_SET_CALLBACKS( read, block, control, seek ) \ + do { \ + p_access->pf_read = (read); \ + p_access->pf_block = (block); \ + p_access->pf_control = (control); \ + p_access->pf_seek = (seek); \ + } while(0) + +#define STANDARD_READ_ACCESS_INIT \ + do { \ + access_InitFields( p_access ); \ + ACCESS_SET_CALLBACKS( Read, NULL, Control, Seek ); \ + p_sys = p_access->p_sys = (access_sys_t*)calloc( 1, sizeof( access_sys_t ) ); \ + if( !p_sys ) return VLC_ENOMEM;\ + } while(0); + +#define STANDARD_BLOCK_ACCESS_INIT \ + do { \ + access_InitFields( p_access ); \ + ACCESS_SET_CALLBACKS( NULL, Block, Control, Seek ); \ + p_sys = p_access->p_sys = (access_sys_t*)calloc( 1, sizeof( access_sys_t ) ); \ + if( !p_sys ) return VLC_ENOMEM; \ + } while(0); + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_addons.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_addons.h new file mode 100644 index 0000000..92d5bc6 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_addons.h @@ -0,0 +1,218 @@ +/***************************************************************************** + * vlc_addons.h : addons handling and describing + ***************************************************************************** + * Copyright (C) 2013 VideoLAN and authors + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ADDONS_H +#define VLC_ADDONS_H 1 + +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef enum addon_type_t +{ + ADDON_UNKNOWN = 0, + ADDON_EXTENSION, + ADDON_PLAYLIST_PARSER, + ADDON_SERVICE_DISCOVERY, + ADDON_SKIN2, + ADDON_PLUGIN, + ADDON_INTERFACE, + ADDON_META, + ADDON_OTHER +} addon_type_t; + +typedef enum addon_state_t +{ + ADDON_NOTINSTALLED = 0, + ADDON_INSTALLING, + ADDON_INSTALLED, + ADDON_UNINSTALLING +} addon_state_t; + +typedef enum addon_flags_t +{ + ADDON_BROKEN = 1, /* Have install inconsistency */ + ADDON_MANAGEABLE = 1 << 1, /* Have manifest, can install or uninstall files */ + ADDON_UPDATABLE = 1 << 2, +} addon_flags_t; + +#define ADDON_MAX_SCORE (5 * 100) +#define ADDON_UUID_SIZE 16 +#define ADDON_UUID_PSZ_SIZE (ADDON_UUID_SIZE * 2 + 4) +typedef uint8_t addon_uuid_t[ADDON_UUID_SIZE]; + +typedef struct addon_file_t +{ + addon_type_t e_filetype; + char *psz_download_uri; + char *psz_filename; +} addon_file_t; + +struct addon_entry_t +{ + vlc_mutex_t lock; + + addon_type_t e_type; + addon_state_t e_state; + addon_flags_t e_flags; + + /* data describing addon */ + addon_uuid_t uuid; + char *psz_name; + char *psz_summary; + char *psz_description; + char *psz_author; + char *psz_source_uri; /* webpage, ... */ + char *psz_image_uri; + char *psz_image_data; /* base64, png */ + char *psz_version; + + /* stats */ + long int i_downloads; + int i_score; /* score 0..5 in hundredth */ + + /* Lister */ + char *psz_source_module; + + /* files list */ + char *psz_archive_uri; /* Archive */ + DECL_ARRAY(addon_file_t *) files; + + /* custom data storage (if needed by module/source) */ + void * p_custom; +}; + +typedef struct addons_finder_t addons_finder_t; +typedef struct addons_finder_sys_t addons_finder_sys_t; +struct addons_finder_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_find )( addons_finder_t * ); + int ( * pf_retrieve )( addons_finder_t *, addon_entry_t * ); + DECL_ARRAY( addon_entry_t * ) entries; + char *psz_uri; + + addons_finder_sys_t *p_sys; +}; + +typedef struct addons_storage_t addons_storage_t; +typedef struct addons_storage_sys_t addons_storage_sys_t; +struct addons_storage_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_install )( addons_storage_t *, addon_entry_t * ); + int ( * pf_remove )( addons_storage_t *, addon_entry_t * ); + int ( * pf_catalog ) ( addons_storage_t *, addon_entry_t **, int ); + + addons_storage_sys_t *p_sys; +}; + +typedef struct addons_manager_private_t addons_manager_private_t; +struct addons_manager_t +{ + vlc_event_manager_t * p_event_manager; + + addons_manager_private_t *p_priv; +}; +typedef struct addons_manager_t addons_manager_t; + +/** + * addon entry lifecycle + */ +VLC_API addon_entry_t *addon_entry_New( void ); +VLC_API addon_entry_t *addon_entry_Hold(addon_entry_t *); +VLC_API void addon_entry_Release(addon_entry_t *); + +/** + * addons manager lifecycle + */ +VLC_API addons_manager_t *addons_manager_New( vlc_object_t * ); +VLC_API void addons_manager_Delete( addons_manager_t * ); + +/** + * Charge currently installed, usable and manageable addons + * (default "addons storage" module) + */ +VLC_API int addons_manager_LoadCatalog( addons_manager_t * ); + +/** + * Gather addons info from repository (default "addons finder" module) + * If psz_uri is not NULL, only gather info from the pointed package. + */ +VLC_API void addons_manager_Gather( addons_manager_t *, const char *psz_uri ); + +/** + * Install or Remove the addon identified by its uuid + */ +VLC_API int addons_manager_Install( addons_manager_t *p_manager, const addon_uuid_t uuid ); +VLC_API int addons_manager_Remove( addons_manager_t *p_manager, const addon_uuid_t uuid ); + +/** + * String uuid to binary uuid helpers + */ +static inline bool addons_uuid_read( const char *psz_uuid, addon_uuid_t *p_uuid ) +{ + if ( !psz_uuid ) return false; + if ( strlen( psz_uuid ) < ADDON_UUID_PSZ_SIZE ) return false; + + int i = 0, j = 0; + while ( i + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_H +#define VLC_AOUT_H 1 + +/** + * \file + * This file defines functions, structures and macros for audio output object + */ + +/* Buffers which arrive in advance of more than AOUT_MAX_ADVANCE_TIME + * will be considered as bogus and be trashed */ +#define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + CLOCK_FREQ) + +/* Buffers which arrive in advance of more than AOUT_MAX_PREPARE_TIME + * will cause the calling thread to sleep */ +#define AOUT_MAX_PREPARE_TIME (2 * CLOCK_FREQ) + +/* Buffers which arrive after pts - AOUT_MIN_PREPARE_TIME will be trashed + * to avoid too heavy resampling */ +#define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE + +/* Tolerance values from EBU Recommendation 37 */ +/** Maximum advance of actual audio playback time to coded PTS, + * above which downsampling will be performed */ +#define AOUT_MAX_PTS_ADVANCE (CLOCK_FREQ / 25) + +/** Maximum delay of actual audio playback time from coded PTS, + * above which upsampling will be performed */ +#define AOUT_MAX_PTS_DELAY (3 * CLOCK_FREQ / 50) + +/* Max acceptable resampling (in %) */ +#define AOUT_MAX_RESAMPLING 10 + +#include "vlc_es.h" + +#define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \ + ((p_first)->i_format == (p_second)->i_format) \ + && AOUT_FMTS_SIMILAR(p_first, p_second) ) + +/* Check if i_rate == i_rate and i_channels == i_channels */ +#define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \ + ((p_first)->i_rate == (p_second)->i_rate) \ + && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\ + && ((p_first)->i_original_channels == (p_second)->i_original_channels) ) + +#define AOUT_FMT_LINEAR( p_format ) \ + (aout_BitsPerSample((p_format)->i_format) != 0) + +#define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i') +#define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b') + +#define AOUT_FMT_SPDIF( p_format ) \ + ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \ + || ((p_format)->i_format == VLC_CODEC_SPDIFB) \ + || ((p_format)->i_format == VLC_CODEC_A52) \ + || ((p_format)->i_format == VLC_CODEC_DTS) ) + +/* Values used for the audio-channels object variable */ +#define AOUT_VAR_CHAN_UNSET 0 /* must be zero */ +#define AOUT_VAR_CHAN_STEREO 1 +#define AOUT_VAR_CHAN_RSTEREO 2 +#define AOUT_VAR_CHAN_LEFT 3 +#define AOUT_VAR_CHAN_RIGHT 4 +#define AOUT_VAR_CHAN_DOLBYS 5 + +/***************************************************************************** + * Main audio output structures + *****************************************************************************/ + +/* Size of a frame for S/PDIF output. */ +#define AOUT_SPDIF_SIZE 6144 + +/* Number of samples in an A/52 frame. */ +#define A52_FRAME_NB 1536 + +/* FIXME to remove once aout.h is cleaned a bit more */ +#include + +/** Audio output object */ +struct audio_output +{ + VLC_COMMON_MEMBERS + + struct aout_sys_t *sys; /**< Private data for callbacks */ + + int (*start)(audio_output_t *, audio_sample_format_t *fmt); + /**< Starts a new stream (mandatory, cannot be NULL). + * \param fmt input stream sample format upon entry, + * output stream sample format upon return [IN/OUT] + * \return VLC_SUCCESS on success, non-zero on failure + * \note No other stream may be already started when called. + */ + void (*stop)(audio_output_t *); + /**< Stops the existing stream (optional, may be NULL). + * \note A stream must have been started when called. + */ + int (*time_get)(audio_output_t *, mtime_t *delay); + /**< Estimates playback buffer latency (optional, may be NULL). + * \param delay pointer to the delay until the next sample to be written + * to the playback buffer is rendered [OUT] + * \return 0 on success, non-zero on failure or lack of data + * \note A stream must have been started when called. + */ + void (*play)(audio_output_t *, block_t *); + /**< Queues a block of samples for playback (mandatory, cannot be NULL). + * \note A stream must have been started when called. + */ + void (*pause)( audio_output_t *, bool pause, mtime_t date); + /**< Pauses or resumes playback (optional, may be NULL). + * \param pause pause if true, resume from pause if false + * \param date timestamp when the pause or resume was requested + * \note A stream must have been started when called. + */ + void (*flush)( audio_output_t *, bool wait); + /**< Flushes or drains the playback buffers (mandatory, cannot be NULL). + * \param wait true to wait for playback of pending buffers (drain), + * false to discard pending buffers (flush) + * \note A stream must have been started when called. + */ + int (*volume_set)(audio_output_t *, float volume); + /**< Changes playback volume (optional, may be NULL). + * \param volume requested volume (0. = mute, 1. = nominal) + * \note The volume is always a positive number. + * \warning A stream may or may not have been started when called. + */ + int (*mute_set)(audio_output_t *, bool mute); + /**< Changes muting (optinal, may be NULL). + * \param mute true to mute, false to unmute + * \warning A stream may or may not have been started when called. + */ + int (*device_select)(audio_output_t *, const char *id); + /**< Selects an audio output device (optional, may be NULL). + * \param id nul-terminated device unique identifier. + * \return 0 on success, non-zero on failure. + * \warning A stream may or may not have been started when called. + */ + struct { + void (*volume_report)(audio_output_t *, float); + void (*mute_report)(audio_output_t *, bool); + void (*policy_report)(audio_output_t *, bool); + void (*device_report)(audio_output_t *, const char *); + void (*hotplug_report)(audio_output_t *, const char *, const char *); + int (*gain_request)(audio_output_t *, float); + void (*restart_request)(audio_output_t *, unsigned); + } event; +}; + +/** + * It describes the audio channel order VLC expect. + */ +static const uint32_t pi_vlc_chan_order_wg4[] = +{ + AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, + AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, + AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_REARCENTER, + AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0 +}; + +#define AOUT_RESTART_FILTERS 1 +#define AOUT_RESTART_OUTPUT 2 +#define AOUT_RESTART_DECODER 4 + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * This function computes the reordering needed to go from pi_chan_order_in to + * pi_chan_order_out. + * If pi_chan_order_in or pi_chan_order_out is NULL, it will assume that vlc + * internal (WG4) order is requested. + */ +VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *, + uint32_t mask, uint8_t *table ); +VLC_API void aout_ChannelReorder(void *, size_t, unsigned, const uint8_t *, vlc_fourcc_t); + +VLC_API void aout_Interleave(void *dst, const void *const *planes, + unsigned samples, unsigned channels, + vlc_fourcc_t fourcc); +VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples, + unsigned channels, vlc_fourcc_t fourcc); + +/** + * This function will compute the extraction parameter into pi_selection to go + * from i_channels with their type given by pi_order_src[] into the order + * describe by pi_order_dst. + * It will also set : + * - *pi_channels as the number of channels that will be extracted which is + * lower (in case of non understood channels type) or equal to i_channels. + * - the layout of the channels (*pi_layout). + * + * It will return true if channel extraction is really needed, in which case + * aout_ChannelExtract must be used + * + * XXX It must be used when the source may have channel type not understood + * by VLC. In this case the channel type pi_order_src[] must be set to 0. + * XXX It must also be used if multiple channels have the same type. + */ +VLC_API bool aout_CheckChannelExtraction( int *pi_selection, uint32_t *pi_layout, int *pi_channels, const uint32_t pi_order_dst[AOUT_CHAN_MAX], const uint32_t *pi_order_src, int i_channels ); + +/** + * Do the actual channels extraction using the parameters created by + * aout_CheckChannelExtraction. + * + * XXX this function does not work in place (p_dst and p_src must not overlap). + * XXX Only 8, 16, 24, 32, 64 bits per sample are supported. + */ +VLC_API void aout_ChannelExtract( void *p_dst, int i_dst_channels, const void *p_src, int i_src_channels, int i_sample_count, const int *pi_selection, int i_bits_per_sample ); + +/* */ +static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt) +{ + return popcount(fmt->i_physical_channels); +} + +VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED; +VLC_API void aout_FormatPrepare( audio_sample_format_t * p_format ); +VLC_API void aout_FormatPrint(vlc_object_t *, const char *, + const audio_sample_format_t *); +#define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f) +VLC_API const char * aout_FormatPrintChannels( const audio_sample_format_t * ) VLC_USED; + +VLC_API float aout_VolumeGet (audio_output_t *); +VLC_API int aout_VolumeSet (audio_output_t *, float); +VLC_API int aout_MuteGet (audio_output_t *); +VLC_API int aout_MuteSet (audio_output_t *, bool); +VLC_API char *aout_DeviceGet (audio_output_t *); +VLC_API int aout_DeviceSet (audio_output_t *, const char *); +VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***); + +/** + * Report change of configured audio volume to the core and UI. + */ +static inline void aout_VolumeReport(audio_output_t *aout, float volume) +{ + aout->event.volume_report(aout, volume); +} + +/** + * Report change of muted flag to the core and UI. + */ +static inline void aout_MuteReport(audio_output_t *aout, bool mute) +{ + aout->event.mute_report(aout, mute); +} + +/** + * Report audio policy status. + * \parm cork true to request a cork, false to undo any pending cork. + */ +static inline void aout_PolicyReport(audio_output_t *aout, bool cork) +{ + aout->event.policy_report(aout, cork); +} + +/** + * Report change of output device. + */ +static inline void aout_DeviceReport(audio_output_t *aout, const char *id) +{ + aout->event.device_report(aout, id); +} + +/** + * Report a device hot-plug event. + * @param id device ID + * @param name human-readable device name (NULL for hot unplug) + */ +static inline void aout_HotplugReport(audio_output_t *aout, + const char *id, const char *name) +{ + aout->event.hotplug_report(aout, id, name); +} + +/** + * Request a change of software audio amplification. + * \param gain linear amplitude gain (must be positive) + * \warning Values in excess 1.0 may cause overflow and distorsion. + */ +static inline int aout_GainRequest(audio_output_t *aout, float gain) +{ + return aout->event.gain_request(aout, gain); +} + +static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode) +{ + aout->event.restart_request(aout, mode); +} + +static inline int aout_ChannelsRestart (vlc_object_t *obj, const char *varname, + vlc_value_t oldval, vlc_value_t newval, void *data) +{ + audio_output_t *aout = (audio_output_t *)obj; + (void)varname; (void)oldval; (void)newval; (void)data; + + aout_RestartRequest (aout, AOUT_RESTART_OUTPUT); + return 0; +} + +/* Audio output filters */ +typedef struct aout_filters aout_filters_t; +typedef struct aout_request_vout aout_request_vout_t; + +VLC_API aout_filters_t *aout_FiltersNew(vlc_object_t *, + const audio_sample_format_t *, + const audio_sample_format_t *, + const aout_request_vout_t *) VLC_USED; +#define aout_FiltersNew(o,inf,outf,rv) \ + aout_FiltersNew(VLC_OBJECT(o),inf,outf,rv) +VLC_API void aout_FiltersDelete(vlc_object_t *, aout_filters_t *); +#define aout_FiltersDelete(o,f) \ + aout_FiltersDelete(VLC_OBJECT(o),f) +VLC_API bool aout_FiltersAdjustResampling(aout_filters_t *, int); +VLC_API block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate); + +VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, video_format_t *p_fmt ); + +#endif /* VLC_AOUT_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_aout_volume.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_aout_volume.h new file mode 100644 index 0000000..f571afb --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_aout_volume.h @@ -0,0 +1,54 @@ +/***************************************************************************** + * vlc_aout_volume.h: audio volume module + ***************************************************************************** + * Copyright (C) 2002-2009 VLC authors and VideoLAN + * $Id: 051413ba105d5f7ee552679bf7fcd3a053db112c $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_MIXER_H +#define VLC_AOUT_MIXER_H 1 + +/** + * \file + * This file defines functions, structures and macros for audio output mixer object + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct audio_volume audio_volume_t; + +/** + * Audio volume + */ +struct audio_volume +{ + VLC_COMMON_MEMBERS + + vlc_fourcc_t format; /**< Audio samples format */ + void (*amplify)(audio_volume_t *, block_t *, float); /**< Amplifier */ +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_arrays.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_arrays.h new file mode 100644 index 0000000..dac7a52 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_arrays.h @@ -0,0 +1,622 @@ +/***************************************************************************** + * vlc_arrays.h : Arrays and data structures handling + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 91f540533b3144f00d1e74bd47dc34cf69598276 $ + * + * Authors: Samuel Hocevar + * Clément Stenac + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ARRAYS_H_ +#define VLC_ARRAYS_H_ + +/** + * \file + * This file defines functions, structures and macros for handling arrays in vlc + */ + +/* realloc() that never fails *if* downsizing */ +static inline void *realloc_down( void *ptr, size_t size ) +{ + void *ret = realloc( ptr, size ); + return ret ? ret : ptr; +} + +/** + * Simple dynamic array handling. Array is realloced at each insert/removal + */ +#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem ) \ + do \ + { \ + if( !(i_oldsize) ) (p_ar) = NULL; \ + (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof(*(p_ar)) ); \ + if( !(p_ar) ) abort(); \ + if( (i_oldsize) - (i_pos) ) \ + { \ + memmove( (p_ar) + (i_pos) + 1, (p_ar) + (i_pos), \ + ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) ); \ + } \ + (p_ar)[(i_pos)] = elem; \ + (i_oldsize)++; \ + } \ + while( 0 ) + +#define REMOVE_ELEM( p_ar, i_size, i_pos ) \ + do \ + { \ + if( (i_size) - (i_pos) - 1 ) \ + { \ + memmove( (p_ar) + (i_pos), \ + (p_ar) + (i_pos) + 1, \ + ((i_size) - (i_pos) - 1) * sizeof( *(p_ar) ) ); \ + } \ + if( i_size > 1 ) \ + (p_ar) = realloc_down( p_ar, ((i_size) - 1) * sizeof( *(p_ar) ) );\ + else \ + { \ + free( p_ar ); \ + (p_ar) = NULL; \ + } \ + (i_size)--; \ + } \ + while( 0 ) + +#define TAB_INIT( count, tab ) \ + do { \ + (count) = 0; \ + (tab) = NULL; \ + } while(0) + +#define TAB_CLEAN( count, tab ) \ + do { \ + free( tab ); \ + (count)= 0; \ + (tab)= NULL; \ + } while(0) + +#define TAB_APPEND_CAST( cast, count, tab, p ) \ + do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + (tab)[count] = (p); \ + (count)++; \ + } while(0) + +#define TAB_APPEND( count, tab, p ) \ + TAB_APPEND_CAST( , count, tab, p ) + +#define TAB_FIND( count, tab, p, idx ) \ + do { \ + for( (idx) = 0; (idx) < (count); (idx)++ ) \ + if( (tab)[(idx)] == (p) ) \ + break; \ + if( (idx) >= (count) ) \ + (idx) = -1; \ + } while(0) + + +#define TAB_REMOVE( count, tab, p ) \ + do { \ + int i_index; \ + TAB_FIND( count, tab, p, i_index ); \ + if( i_index >= 0 ) \ + { \ + if( (count) > 1 ) \ + { \ + memmove( ((void**)(tab) + i_index), \ + ((void**)(tab) + i_index+1), \ + ( (count) - i_index - 1 ) * sizeof( *(tab) ) );\ + } \ + (count)--; \ + if( (count) == 0 ) \ + { \ + free( tab ); \ + (tab) = NULL; \ + } \ + } \ + } while(0) + +#define TAB_INSERT_CAST( cast, count, tab, p, index ) do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + if( (count) - (index) > 0 ) \ + memmove( (void**)(tab) + (index) + 1, \ + (void**)(tab) + (index), \ + ((count) - (index)) * sizeof(*(tab)) );\ + (tab)[(index)] = (p); \ + (count)++; \ +} while(0) + +#define TAB_INSERT( count, tab, p, index ) \ + TAB_INSERT_CAST( , count, tab, p, index ) + +/** + * Binary search in a sorted array. The key must be comparable by < and > + * \param entries array of entries + * \param count number of entries + * \param elem key to check within an entry (like .id, or ->i_id) + * \param zetype type of the key + * \param key value of the key + * \param answer index of answer within the array. -1 if not found + */ +#define BSEARCH( entries, count, elem, zetype, key, answer ) \ + do { \ + int low = 0, high = count - 1; \ + answer = -1; \ + while( low <= high ) {\ + int mid = (low + high ) / 2; /* Just don't care about 2^30 tables */ \ + zetype mid_val = entries[mid] elem;\ + if( mid_val < key ) \ + low = mid + 1; \ + else if ( mid_val > key ) \ + high = mid -1; \ + else \ + { \ + answer = mid; break; \ + }\ + } \ + } while(0) + + +/************************************************************************ + * Dynamic arrays with progressive allocation + ************************************************************************/ + +/* Internal functions */ +#define _ARRAY_ALLOC(array, newsize) { \ + (array).i_alloc = newsize; \ + (array).p_elems = realloc( (array).p_elems, (array).i_alloc * \ + sizeof(*(array).p_elems) ); \ + if( !(array).p_elems ) abort(); \ +} + +#define _ARRAY_GROW1(array) { \ + if( (array).i_alloc < 10 ) \ + _ARRAY_ALLOC(array, 10 ) \ + else if( (array).i_alloc == (array).i_size ) \ + _ARRAY_ALLOC(array, (int)(array.i_alloc * 1.5) ) \ +} + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +/* API */ +#define DECL_ARRAY(type) struct { \ + int i_alloc; \ + int i_size; \ + type *p_elems; \ +} + +#define TYPEDEF_ARRAY(type, name) typedef DECL_ARRAY(type) name; + +#define ARRAY_INIT(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_RESET(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + free( (array).p_elems ); (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_APPEND(array, elem) \ + do { \ + _ARRAY_GROW1(array); \ + (array).p_elems[(array).i_size] = elem; \ + (array).i_size++; \ + } while(0) + +#define ARRAY_INSERT(array,elem,pos) \ + do { \ + _ARRAY_GROW1(array); \ + if( (array).i_size - pos ) { \ + memmove( (array).p_elems + pos + 1, (array).p_elems + pos, \ + ((array).i_size-pos) * sizeof(*(array).p_elems) ); \ + } \ + (array).p_elems[pos] = elem; \ + (array).i_size++; \ + } while(0) + +#define _ARRAY_SHRINK(array) { \ + if( (array).i_size > 10 && (array).i_size < (int)((array).i_alloc / 1.5) ) { \ + _ARRAY_ALLOC(array, (array).i_size + 5); \ + } \ +} + +#define ARRAY_REMOVE(array,pos) \ + do { \ + if( (array).i_size - (pos) - 1 ) \ + { \ + memmove( (array).p_elems + pos, (array).p_elems + pos + 1, \ + ( (array).i_size - pos - 1 ) *sizeof(*(array).p_elems) ); \ + } \ + (array).i_size--; \ + _ARRAY_SHRINK(array); \ + } while(0) + +#define ARRAY_VAL(array, pos) array.p_elems[pos] + +#define ARRAY_BSEARCH(array, elem, zetype, key, answer) \ + BSEARCH( (array).p_elems, (array).i_size, elem, zetype, key, answer) + +#define FOREACH_ARRAY( item, array ) { \ + int fe_idx; \ + for( fe_idx = 0 ; fe_idx < (array).i_size ; fe_idx++ ) \ + { \ + item = (array).p_elems[fe_idx]; + +#define FOREACH_END() } } + + +/************************************************************************ + * Dynamic arrays with progressive allocation (Preferred API) + ************************************************************************/ +typedef struct vlc_array_t +{ + int i_count; + void ** pp_elems; +} vlc_array_t; + +static inline void vlc_array_init( vlc_array_t * p_array ) +{ + memset( p_array, 0, sizeof(vlc_array_t) ); +} + +static inline void vlc_array_clear( vlc_array_t * p_array ) +{ + free( p_array->pp_elems ); + memset( p_array, 0, sizeof(vlc_array_t) ); +} + +static inline vlc_array_t * vlc_array_new( void ) +{ + vlc_array_t * ret = (vlc_array_t *)malloc( sizeof(vlc_array_t) ); + if( ret ) vlc_array_init( ret ); + return ret; +} + +static inline void vlc_array_destroy( vlc_array_t * p_array ) +{ + if( !p_array ) + return; + vlc_array_clear( p_array ); + free( p_array ); +} + + +/* Read */ +static inline int +vlc_array_count( vlc_array_t * p_array ) +{ + return p_array->i_count; +} + +static inline void * +vlc_array_item_at_index( vlc_array_t * p_array, int i_index ) +{ + return p_array->pp_elems[i_index]; +} + +static inline int +vlc_array_index_of_item( vlc_array_t * p_array, void * item ) +{ + int i; + for( i = 0; i < p_array->i_count; i++) + { + if( p_array->pp_elems[i] == item ) + return i; + } + return -1; +} + +/* Write */ +static inline void +vlc_array_insert( vlc_array_t * p_array, void * p_elem, int i_index ) +{ + TAB_INSERT_CAST( (void **), p_array->i_count, p_array->pp_elems, p_elem, i_index ); +} + +static inline void +vlc_array_append( vlc_array_t * p_array, void * p_elem ) +{ + vlc_array_insert( p_array, p_elem, p_array->i_count ); +} + +static inline void +vlc_array_remove( vlc_array_t * p_array, int i_index ) +{ + if( i_index >= 0 ) + { + if( p_array->i_count > 1 ) + { + memmove( p_array->pp_elems + i_index, + p_array->pp_elems + i_index+1, + ( p_array->i_count - i_index - 1 ) * sizeof( void* ) ); + } + p_array->i_count--; + if( p_array->i_count == 0 ) + { + free( p_array->pp_elems ); + p_array->pp_elems = NULL; + } + } +} + + +/************************************************************************ + * Dictionaries + ************************************************************************/ + +/* This function is not intended to be crypto-secure, we only want it to be + * fast and not suck too much. This one is pretty fast and did 0 collisions + * in wenglish's dictionary. + */ +static inline uint64_t DictHash( const char *psz_string, int hashsize ) +{ + uint64_t i_hash = 0; + if( psz_string ) + { + while( *psz_string ) + { + i_hash += *psz_string++; + i_hash += i_hash << 10; + i_hash ^= i_hash >> 8; + } + } + return i_hash % hashsize; +} + +typedef struct vlc_dictionary_entry_t +{ + char * psz_key; + void * p_value; + struct vlc_dictionary_entry_t * p_next; +} vlc_dictionary_entry_t; + +typedef struct vlc_dictionary_t +{ + int i_size; + vlc_dictionary_entry_t ** p_entries; +} vlc_dictionary_t; + +static void * const kVLCDictionaryNotFound = NULL; + +static inline void vlc_dictionary_init( vlc_dictionary_t * p_dict, int i_size ) +{ + p_dict->p_entries = NULL; + + if( i_size > 0 ) + { + p_dict->p_entries = (vlc_dictionary_entry_t **)calloc( i_size, sizeof(*p_dict->p_entries) ); + if( !p_dict->p_entries ) + i_size = 0; + } + p_dict->i_size = i_size; +} + +static inline void vlc_dictionary_clear( vlc_dictionary_t * p_dict, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( p_dict->p_entries ) + { + for( int i = 0; i < p_dict->i_size; i++ ) + { + vlc_dictionary_entry_t * p_current, * p_next; + p_current = p_dict->p_entries[i]; + while( p_current ) + { + p_next = p_current->p_next; + if( pf_free != NULL ) + ( * pf_free )( p_current->p_value, p_obj ); + free( p_current->psz_key ); + free( p_current ); + p_current = p_next; + } + } + free( p_dict->p_entries ); + p_dict->p_entries = NULL; + } + p_dict->i_size = 0; +} + +static inline int +vlc_dictionary_has_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return 0; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + return p_dict->p_entries[i_pos] != NULL; +} + +static inline void * +vlc_dictionary_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return kVLCDictionaryNotFound; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + + if( !p_entry ) + return kVLCDictionaryNotFound; + + /* Make sure we return the right item. (Hash collision) */ + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + return p_entry->p_value; + p_entry = p_entry->p_next; + } while( p_entry ); + + return kVLCDictionaryNotFound; +} + +static inline int +vlc_dictionary_keys_count( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + int i, count = 0; + + if( !p_dict->p_entries ) + return 0; + + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) count++; + } + return count; +} + +static inline char ** +vlc_dictionary_all_keys( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + char ** ppsz_ret; + int i, count = vlc_dictionary_keys_count( p_dict ); + + ppsz_ret = (char**)malloc(sizeof(char *) * (count + 1)); + if( unlikely(!ppsz_ret) ) + return NULL; + + count = 0; + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) + ppsz_ret[count++] = strdup( p_entry->psz_key ); + } + ppsz_ret[count] = NULL; + return ppsz_ret; +} + +static inline void +__vlc_dictionary_insert( vlc_dictionary_t * p_dict, const char * psz_key, + void * p_value, bool rebuild ) +{ + if( !p_dict->p_entries ) + vlc_dictionary_init( p_dict, 1 ); + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry; + + p_entry = (vlc_dictionary_entry_t *)malloc(sizeof(*p_entry)); + p_entry->psz_key = strdup( psz_key ); + p_entry->p_value = p_value; + p_entry->p_next = p_dict->p_entries[i_pos]; + p_dict->p_entries[i_pos] = p_entry; + if( rebuild ) + { + /* Count how many items there was */ + int count; + for( count = 1; p_entry->p_next; count++ ) + p_entry = p_entry->p_next; + if( count > 3 ) /* XXX: this need tuning */ + { + /* Here it starts to be not good, rebuild a bigger dictionary */ + struct vlc_dictionary_t new_dict; + int i_new_size = ( (p_dict->i_size+2) * 3) / 2; /* XXX: this need tuning */ + int i; + vlc_dictionary_init( &new_dict, i_new_size ); + for( i = 0; i < p_dict->i_size; i++ ) + { + p_entry = p_dict->p_entries[i]; + while( p_entry ) + { + __vlc_dictionary_insert( &new_dict, p_entry->psz_key, + p_entry->p_value, + false /* To avoid multiple rebuild loop */); + p_entry = p_entry->p_next; + } + } + + vlc_dictionary_clear( p_dict, NULL, NULL ); + p_dict->i_size = new_dict.i_size; + p_dict->p_entries = new_dict.p_entries; + } + } +} + +static inline void +vlc_dictionary_insert( vlc_dictionary_t * p_dict, const char * psz_key, void * p_value ) +{ + __vlc_dictionary_insert( p_dict, psz_key, p_value, true ); +} + +static inline void +vlc_dictionary_remove_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( !p_dict->p_entries ) + return; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + vlc_dictionary_entry_t * p_prev; + + if( !p_entry ) + return; /* Not found, nothing to do */ + + /* Hash collision */ + p_prev = NULL; + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + { + if( pf_free != NULL ) + ( * pf_free )( p_entry->p_value, p_obj ); + if( !p_prev ) + p_dict->p_entries[i_pos] = p_entry->p_next; + else + p_prev->p_next = p_entry->p_next; + free( p_entry->psz_key ); + free( p_entry ); + return; + } + p_prev = p_entry; + p_entry = p_entry->p_next; + } while( p_entry ); + + /* No key was found */ +} + +#ifdef __cplusplus +// C++ helpers +template +void vlc_delete_all( T &container ) +{ + typename T::iterator it = container.begin(); + while ( it != container.end() ) + { + delete *it; + ++it; + } + container.clear(); +} + +#endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_atomic.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_atomic.h new file mode 100644 index 0000000..15ccf8c --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_atomic.h @@ -0,0 +1,430 @@ +/***************************************************************************** + * vlc_atomic.h: + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ATOMIC_H +# define VLC_ATOMIC_H + +/** + * \file + * Atomic operations do not require locking, but they are not very powerful. + */ + +# if !defined (__cplusplus) && (__STDC_VERSION__ >= 201112L) \ + && !defined (__STDC_NO_ATOMICS__) + +/*** Native C11 atomics ***/ +# include + +# else + +# define ATOMIC_FLAG_INIT false + +# define ATOMIC_VAR_INIT(value) (value) + +# define atomic_init(obj, value) \ + do { *(obj) = (value); } while(0) + +# define kill_dependency(y) \ + ((void)0) + +# define atomic_thread_fence(order) \ + __sync_synchronize() + +# define atomic_signal_fence(order) \ + ((void)0) + +# define atomic_is_lock_free(obj) \ + false + +/* In principles, __sync_*() only supports int, long and long long and their + * unsigned equivalents, i.e. 4-bytes and 8-bytes types, although GCC also + * supports 1 and 2-bytes types. Some non-x86 architectures do not support + * 8-byte atomic types (or not efficiently). */ +# if defined (_MSC_VER) +/* Some atomic operations of the Interlocked API are only + available for desktop apps. Thus we define the atomic types to + be at least 32 bits wide. */ +typedef int_least32_t atomic_flag; +typedef int_least32_t atomic_bool; +typedef int_least32_t atomic_char; +typedef int_least32_t atomic_schar; +typedef uint_least32_t atomic_uchar; +typedef int_least32_t atomic_short; +typedef uint_least32_t atomic_ushort; +# else +typedef bool atomic_flag; +typedef bool atomic_bool; +typedef char atomic_char; +typedef signed char atomic_schar; +typedef unsigned char atomic_uchar; +typedef short atomic_short; +typedef unsigned short atomic_ushort; +# endif +typedef int atomic_int; +typedef unsigned int atomic_uint; +typedef long atomic_long; +typedef unsigned long atomic_ulong; +typedef long long atomic_llong; +typedef unsigned long long atomic_ullong; +//typedef char16_t atomic_char16_t; +//typedef char32_t atomic_char32_t; +typedef wchar_t atomic_wchar_t; +typedef int_least8_t atomic_int_least8_t; +typedef uint_least8_t atomic_uint_least8_t; +typedef int_least16_t atomic_int_least16_t; +typedef uint_least16_t atomic_uint_least16_t; +typedef int_least32_t atomic_int_least32_t; +typedef uint_least32_t atomic_uint_least32_t; +typedef int_least64_t atomic_int_least64_t; +typedef uint_least64_t atomic_uint_least64_t; +typedef int_fast8_t atomic_int_fast8_t; +typedef uint_fast8_t atomic_uint_fast8_t; +typedef int_fast16_t atomic_int_fast16_t; +typedef uint_fast16_t atomic_uint_fast16_t; +typedef int_fast32_t atomic_int_fast32_t; +typedef uint_fast32_t atomic_uint_fast32_t; +typedef int_fast64_t atomic_int_fast64_t; +typedef uint_fast64_t atomic_uint_fast64_t; +typedef intptr_t atomic_intptr_t; +typedef uintptr_t atomic_uintptr_t; +typedef size_t atomic_size_t; +typedef ptrdiff_t atomic_ptrdiff_t; +typedef intmax_t atomic_intmax_t; +typedef uintmax_t atomic_uintmax_t; + +# if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || (defined (__clang__) && (defined (__x86_64__) || defined (__i386__))) + +/*** Intel/GCC atomics ***/ + +# define atomic_store(object,desired) \ + do { \ + *(object) = (desired); \ + __sync_synchronize(); \ + } while (0) + +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object,desired) + +# define atomic_load(object) \ + (__sync_synchronize(), *(object)) + +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _old; \ + do \ + _old = atomic_load(_obj); \ + while (!__sync_bool_compare_and_swap(_obj, _old, (desired))); \ + _old; \ +}) + +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object,desired) + +# define atomic_compare_exchange(object,expected,desired) \ +({ \ + typeof (object) _exp = (expected); \ + typeof (*object) _old = *_exp; \ + *_exp = __sync_val_compare_and_swap((object), _old, (desired)); \ + *_exp == _old; \ +}) + +# define atomic_compare_exchange_strong(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order,order_different) \ + atomic_compare_exchange_strong(object, expected, desired) + +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order_equal,order_different) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_add(object,operand) \ + __sync_fetch_and_add(object, operand) + +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object,operand) + +# define atomic_fetch_sub(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_or(object,operand) \ + __sync_fetch_and_or(object, operand) + +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object,operand) + +# define atomic_fetch_xor(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_and(object,operand) \ + __sync_fetch_and_and(object, operand) + +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object,operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# elif defined (__GNUC__) + +/*** No atomics ***/ + +# define atomic_store(object,desired) \ + do { \ + typeof (object) _obj = (object); \ + typeof (*object) _des = (desired); \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + *_obj = _des; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + } while (0) +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object,desired) + +# define atomic_load(object) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _old; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + _old = *_obj; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + _old; \ +}) +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _des = (desired); \ + typeof (*object) _old; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + _old = *_obj; \ + *_obj = _des; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + _old; \ +}) +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object,desired) + +# define atomic_compare_exchange_strong(object,expected,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (object) _exp = (expected); \ + typeof (*object) _des = (desired); \ + bool ret; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + ret = *_obj == *_exp; \ + if (ret) \ + *_obj = _des; \ + else \ + *_exp = *_obj; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + ret; \ +}) +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_OP(object,desired,op) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _des = (desired); \ + typeof (*object) _old; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + _old = *_obj; \ + *_obj = (*_obj) op (_des); \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + _old; \ +}) + +# define atomic_fetch_add(object,operand) \ + atomic_fetch_OP(object,operand,+) +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object,operand) + +# define atomic_fetch_sub(object,operand) \ + atomic_fetch_OP(object,operand,-) +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_or(object,operand) \ + atomic_fetch_OP(object,operand,|) +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object,operand) + +# define atomic_fetch_xor(object,operand) \ + atomic_fetch_OP(object,operand,^) +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_and(object,operand) \ + atomic_fetch_OP(object,operand,&) +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object,operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# elif defined (_MSC_VER) + +# include + +/*** Use the Interlocked API. ***/ + +/* Define macros in order to dispatch to the correct function depending on the type. + Several ranges are need because some operations are not implemented for all types. */ +# define atomic_type_dispatch_32_64(operation, object, ...) \ + (sizeof(*object) == 4 ? operation((LONG *)object, __VA_ARGS__) : \ + sizeof(*object) == 8 ? operation##64((LONGLONG *)object, __VA_ARGS__) : \ + (abort(), 0)) + +# define atomic_type_dispatch_16_64(operation, object, ...) \ + (sizeof(*object) == 2 ? operation##16((short *)object, __VA_ARGS__) : \ + atomic_type_dispatch_32_64(operation, object, __VA_ARGS__)) + +# define atomic_type_dispatch_8_64(operation, object, ...) \ + (sizeof(*object) == 1 ? operation##8((char *)object, __VA_ARGS__) : \ + atomic_type_dispatch_16_64(operation, object, __VA_ARGS__)) + +# define atomic_store(object,desired) \ + atomic_type_dispatch_16_64(InterlockedExchange, object, desired) +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object, desired) + +# define atomic_load(object) \ + atomic_type_dispatch_16_64(InterlockedCompareExchange, object, 0, 0) +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ + atomic_type_dispatch_16_64(InterlockedExchange, object, desired) +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object, desired) + +# define atomic_compare_exchange_strong(object,expected,desired) \ + atomic_type_dispatch_16_64(InterlockedCompareExchange, object, *expected, desired) == *expected +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_add(object,operand) \ + atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, operand) +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object, operand) + +# define atomic_fetch_sub(object,operand) \ + atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, -(LONGLONG)operand) +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object, operand) + +# define atomic_fetch_or(object,operand) \ + atomic_type_dispatch_8_64(InterlockedOr, object, operand) +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object, operand) + +# define atomic_fetch_xor(object,operand) \ + atomic_type_dispatch_8_64(InterlockedXor, object, operand) +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object, operand) + +# define atomic_fetch_and(object,operand) \ + atomic_type_dispatch_8_64(InterlockedAnd, object, operand) +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object, operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# else +# error FIXME: implement atomic operations for this compiler. +# endif +# endif + +typedef atomic_uint_least32_t vlc_atomic_float; + +static inline void vlc_atomic_init_float(vlc_atomic_float *var, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_init(var, u.i); +} + +/** Helper to retrieve a single precision from an atom. */ +static inline float vlc_atomic_load_float(vlc_atomic_float *atom) +{ + union { float f; uint32_t i; } u; + u.i = atomic_load(atom); + return u.f; +} + +/** Helper to store a single precision into an atom. */ +static inline void vlc_atomic_store_float(vlc_atomic_float *atom, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_store(atom, u.i); +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_avcodec.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_avcodec.h new file mode 100644 index 0000000..664633a --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_avcodec.h @@ -0,0 +1,34 @@ +/***************************************************************************** + * vlc_avcodec.h: VLC thread support for libavcodec + ***************************************************************************** + * Copyright (C) 2009-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AVCODEC_H +# define VLC_AVCODEC_H 1 + +static inline void vlc_avcodec_lock (void) +{ + vlc_global_lock (VLC_AVCODEC_MUTEX); +} + +static inline void vlc_avcodec_unlock (void) +{ + vlc_global_unlock (VLC_AVCODEC_MUTEX); +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_bits.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_bits.h new file mode 100644 index 0000000..80010de --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_bits.h @@ -0,0 +1,197 @@ +/***************************************************************************** + * vlc_bits.h : Bit handling helpers + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 6c2915138c768d9c49b6646dde6c711acf6eabef $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BITS_H +#define VLC_BITS_H 1 + +/** + * \file + * This file defines functions, structures for handling streams of bits in vlc + */ + +typedef struct bs_s +{ + uint8_t *p_start; + uint8_t *p; + uint8_t *p_end; + + ssize_t i_left; /* i_count number of available bits */ +} bs_t; + +static inline void bs_init( bs_t *s, const void *p_data, size_t i_data ) +{ + s->p_start = (void *)p_data; + s->p = s->p_start; + s->p_end = s->p_start + i_data; + s->i_left = 8; +} + +static inline int bs_pos( const bs_t *s ) +{ + return( 8 * ( s->p - s->p_start ) + 8 - s->i_left ); +} + +static inline int bs_eof( const bs_t *s ) +{ + return( s->p >= s->p_end ? 1: 0 ); +} + +static inline uint32_t bs_read( bs_t *s, int i_count ) +{ + static const uint32_t i_mask[33] = + { 0x00, + 0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff, 0x3ff, 0x7ff, 0xfff, + 0x1fff, 0x3fff, 0x7fff, 0xffff, + 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, + 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, + 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, + 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff}; + int i_shr; + uint32_t i_result = 0; + + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + if( ( i_shr = s->i_left - i_count ) >= 0 ) + { + /* more in the buffer than requested */ + i_result |= ( *s->p >> i_shr )&i_mask[i_count]; + s->i_left -= i_count; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + return( i_result ); + } + else + { + /* less in the buffer than requested */ + i_result |= (*s->p&i_mask[s->i_left]) << -i_shr; + i_count -= s->i_left; + s->p++; + s->i_left = 8; + } + } + + return( i_result ); +} + +static inline uint32_t bs_read1( bs_t *s ) +{ + if( s->p < s->p_end ) + { + unsigned int i_result; + + s->i_left--; + i_result = ( *s->p >> s->i_left )&0x01; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + return i_result; + } + + return 0; +} + +static inline uint32_t bs_show( bs_t *s, int i_count ) +{ + bs_t s_tmp = *s; + return bs_read( &s_tmp, i_count ); +} + +static inline void bs_skip( bs_t *s, ssize_t i_count ) +{ + s->i_left -= i_count; + + if( s->i_left <= 0 ) + { + const int i_bytes = ( -s->i_left + 8 ) / 8; + + s->p += i_bytes; + s->i_left += 8 * i_bytes; + } +} + +static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits ) +{ + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + i_count--; + + if( ( i_bits >> i_count )&0x01 ) + { + *s->p |= 1 << ( s->i_left - 1 ); + } + else + { + *s->p &= ~( 1 << ( s->i_left - 1 ) ); + } + s->i_left--; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + } +} + +static inline void bs_align( bs_t *s ) +{ + if( s->i_left != 8 ) + { + s->i_left = 8; + s->p++; + } +} + +static inline void bs_align_0( bs_t *s ) +{ + if( s->i_left != 8 ) + { + bs_write( s, s->i_left, 0 ); + } +} + +static inline void bs_align_1( bs_t *s ) +{ + while( s->i_left != 8 ) + { + bs_write( s, 1, 1 ); + } +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_block.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_block.h new file mode 100644 index 0000000..20377e1 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_block.h @@ -0,0 +1,321 @@ +/***************************************************************************** + * vlc_block.h: Data blocks management functions + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 75f98ff4bd59bf3dad9356f9e84ebe53942efe69 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_H +#define VLC_BLOCK_H 1 + +/** + * \file + * This file implements functions and structures to handle blocks of data in vlc + * + */ + +#include /* for ssize_t */ + +/**************************************************************************** + * block: + **************************************************************************** + * - i_flags may not always be set (ie could be 0, even for a key frame + * it depends where you receive the buffer (before/after a packetizer + * and the demux/packetizer implementations. + * - i_dts/i_pts could be VLC_TS_INVALID, it means no pts/dts + * - i_length: length in microseond of the packet, can be null except in the + * sout where it is mandatory. + * + * - i_buffer number of valid data pointed by p_buffer + * you can freely decrease it but never increase it yourself + * (use block_Realloc) + * - p_buffer: pointer over datas. You should never overwrite it, you can + * only incremment it to skip datas, in others cases use block_Realloc + * (don't duplicate yourself in a bigger buffer, block_Realloc is + * optimised for preheader/postdatas increase) + ****************************************************************************/ + +/** The content doesn't follow the last block, or is probably broken */ +#define BLOCK_FLAG_DISCONTINUITY 0x0001 +/** Intra frame */ +#define BLOCK_FLAG_TYPE_I 0x0002 +/** Inter frame with backward reference only */ +#define BLOCK_FLAG_TYPE_P 0x0004 +/** Inter frame with backward and forward reference */ +#define BLOCK_FLAG_TYPE_B 0x0008 +/** For inter frame when you don't know the real type */ +#define BLOCK_FLAG_TYPE_PB 0x0010 +/** Warn that this block is a header one */ +#define BLOCK_FLAG_HEADER 0x0020 +/** This is the last block of the frame */ +#define BLOCK_FLAG_END_OF_FRAME 0x0040 +/** This is not a key frame for bitrate shaping */ +#define BLOCK_FLAG_NO_KEYFRAME 0x0080 +/** This block contains the last part of a sequence */ +#define BLOCK_FLAG_END_OF_SEQUENCE 0x0100 +/** This block contains a clock reference */ +#define BLOCK_FLAG_CLOCK 0x0200 +/** This block is scrambled */ +#define BLOCK_FLAG_SCRAMBLED 0x0400 +/** This block has to be decoded but not be displayed */ +#define BLOCK_FLAG_PREROLL 0x0800 +/** This block is corrupted and/or there is data loss */ +#define BLOCK_FLAG_CORRUPTED 0x1000 +/** This block contains an interlaced picture with top field first */ +#define BLOCK_FLAG_TOP_FIELD_FIRST 0x2000 +/** This block contains an interlaced picture with bottom field first */ +#define BLOCK_FLAG_BOTTOM_FIELD_FIRST 0x4000 + +/** This block contains an interlaced picture */ +#define BLOCK_FLAG_INTERLACED_MASK \ + (BLOCK_FLAG_TOP_FIELD_FIRST|BLOCK_FLAG_BOTTOM_FIELD_FIRST) + +#define BLOCK_FLAG_TYPE_MASK \ + (BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB) + +/* These are for input core private usage only */ +#define BLOCK_FLAG_CORE_PRIVATE_MASK 0x00ff0000 +#define BLOCK_FLAG_CORE_PRIVATE_SHIFT 16 + +/* These are for module private usage only */ +#define BLOCK_FLAG_PRIVATE_MASK 0xff000000 +#define BLOCK_FLAG_PRIVATE_SHIFT 24 + +typedef void (*block_free_t) (block_t *); + +struct block_t +{ + block_t *p_next; + + uint8_t *p_buffer; /**< Payload start */ + size_t i_buffer; /**< Payload length */ + uint8_t *p_start; /**< Buffer start */ + size_t i_size; /**< Buffer total size */ + + uint32_t i_flags; + unsigned i_nb_samples; /* Used for audio */ + + mtime_t i_pts; + mtime_t i_dts; + mtime_t i_length; + + /* Rudimentary support for overloading block (de)allocation. */ + block_free_t pf_release; +}; + +/**************************************************************************** + * Blocks functions: + **************************************************************************** + * - block_Alloc : create a new block with the requested size ( >= 0 ), return + * NULL for failure. + * - block_Release : release a block allocated with block_Alloc. + * - block_Realloc : realloc a block, + * i_pre: how many bytes to insert before body if > 0, else how many + * bytes of body to skip (the latter can be done without using + * block_Realloc i_buffer -= -i_pre, p_buffer += -i_pre as i_pre < 0) + * i_body (>= 0): the final size of the body (decreasing it can directly + * be done with i_buffer = i_body). + * with preheader and or body (increase + * and decrease are supported). Use it as it is optimised. + * - block_Duplicate : create a copy of a block. + ****************************************************************************/ +VLC_API void block_Init( block_t *, void *, size_t ); +VLC_API block_t *block_Alloc( size_t ) VLC_USED VLC_MALLOC; +VLC_API block_t *block_Realloc( block_t *, ssize_t i_pre, size_t i_body ) VLC_USED; + +static inline void block_CopyProperties( block_t *dst, block_t *src ) +{ + dst->i_flags = src->i_flags; + dst->i_nb_samples = src->i_nb_samples; + dst->i_dts = src->i_dts; + dst->i_pts = src->i_pts; + dst->i_length = src->i_length; +} + +VLC_USED +static inline block_t *block_Duplicate( block_t *p_block ) +{ + block_t *p_dup = block_Alloc( p_block->i_buffer ); + if( p_dup == NULL ) + return NULL; + + block_CopyProperties( p_dup, p_block ); + memcpy( p_dup->p_buffer, p_block->p_buffer, p_block->i_buffer ); + + return p_dup; +} + +static inline void block_Release( block_t *p_block ) +{ + p_block->pf_release( p_block ); +} + +VLC_API block_t *block_heap_Alloc(void *, size_t) VLC_USED VLC_MALLOC; +VLC_API block_t *block_mmap_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; +VLC_API block_t * block_shm_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; +VLC_API block_t *block_File(int fd) VLC_USED VLC_MALLOC; +VLC_API block_t *block_FilePath(const char *) VLC_USED VLC_MALLOC; + +static inline void block_Cleanup (void *block) +{ + block_Release ((block_t *)block); +} +#define block_cleanup_push( block ) vlc_cleanup_push (block_Cleanup, block) + +/**************************************************************************** + * Chains of blocks functions helper + **************************************************************************** + * - block_ChainAppend : append a block to the last block of a chain. Try to + * avoid using with a lot of data as it's really slow, prefer + * block_ChainLastAppend, p_block can be NULL + * - block_ChainLastAppend : use a pointer over a pointer to the next blocks, + * and update it. + * - block_ChainRelease : release a chain of block + * - block_ChainExtract : extract data from a chain, return real bytes counts + * - block_ChainGather : gather a chain, free it and return one block. + ****************************************************************************/ +static inline void block_ChainAppend( block_t **pp_list, block_t *p_block ) +{ + if( *pp_list == NULL ) + { + *pp_list = p_block; + } + else + { + block_t *p = *pp_list; + + while( p->p_next ) p = p->p_next; + p->p_next = p_block; + } +} + +static inline void block_ChainLastAppend( block_t ***ppp_last, block_t *p_block ) +{ + block_t *p_last = p_block; + + **ppp_last = p_block; + + while( p_last->p_next ) p_last = p_last->p_next; + *ppp_last = &p_last->p_next; +} + +static inline void block_ChainRelease( block_t *p_block ) +{ + while( p_block ) + { + block_t *p_next = p_block->p_next; + block_Release( p_block ); + p_block = p_next; + } +} + +static size_t block_ChainExtract( block_t *p_list, void *p_data, size_t i_max ) +{ + size_t i_total = 0; + uint8_t *p = (uint8_t*)p_data; + + while( p_list && i_max ) + { + size_t i_copy = __MIN( i_max, p_list->i_buffer ); + memcpy( p, p_list->p_buffer, i_copy ); + i_max -= i_copy; + i_total += i_copy; + p += i_copy; + + p_list = p_list->p_next; + } + return i_total; +} + +static inline void block_ChainProperties( block_t *p_list, int *pi_count, size_t *pi_size, mtime_t *pi_length ) +{ + size_t i_size = 0; + mtime_t i_length = 0; + int i_count = 0; + + while( p_list ) + { + i_size += p_list->i_buffer; + i_length += p_list->i_length; + i_count++; + + p_list = p_list->p_next; + } + + if( pi_size ) + *pi_size = i_size; + if( pi_length ) + *pi_length = i_length; + if( pi_count ) + *pi_count = i_count; +} + +static inline block_t *block_ChainGather( block_t *p_list ) +{ + size_t i_total = 0; + mtime_t i_length = 0; + block_t *g; + + if( p_list->p_next == NULL ) + return p_list; /* Already gathered */ + + block_ChainProperties( p_list, NULL, &i_total, &i_length ); + + g = block_Alloc( i_total ); + block_ChainExtract( p_list, g->p_buffer, g->i_buffer ); + + g->i_flags = p_list->i_flags; + g->i_pts = p_list->i_pts; + g->i_dts = p_list->i_dts; + g->i_length = i_length; + + /* free p_list */ + block_ChainRelease( p_list ); + return g; +} + +/**************************************************************************** + * Fifos of blocks. + **************************************************************************** + * - block_FifoNew : create and init a new fifo + * - block_FifoRelease : destroy a fifo and free all blocks in it. + * - block_FifoPace : wait for a fifo to drain to a specified number of packets or total data size + * - block_FifoEmpty : free all blocks in a fifo + * - block_FifoPut : put a block + * - block_FifoGet : get a packet from the fifo (and wait if it is empty) + * - block_FifoShow : show the first packet of the fifo (and wait if + * needed), be carefull, you can use it ONLY if you are sure to be the + * only one getting data from the fifo. + * - block_FifoCount : how many packets are waiting in the fifo + * + * block_FifoGet and block_FifoShow are cancellation points. + ****************************************************************************/ + +VLC_API block_fifo_t *block_FifoNew( void ) VLC_USED VLC_MALLOC; +VLC_API void block_FifoRelease( block_fifo_t * ); +VLC_API void block_FifoPace( block_fifo_t *fifo, size_t max_depth, size_t max_size ); +VLC_API void block_FifoEmpty( block_fifo_t * ); +VLC_API size_t block_FifoPut( block_fifo_t *, block_t * ); +VLC_API void block_FifoWake( block_fifo_t * ); +VLC_API block_t * block_FifoGet( block_fifo_t * ) VLC_USED; +VLC_API block_t * block_FifoShow( block_fifo_t * ); +size_t block_FifoSize( const block_fifo_t *p_fifo ) VLC_USED; +VLC_API size_t block_FifoCount( const block_fifo_t *p_fifo ) VLC_USED; + +#endif /* VLC_BLOCK_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_block_helper.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_block_helper.h new file mode 100644 index 0000000..2e6231f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_block_helper.h @@ -0,0 +1,517 @@ +/***************************************************************************** + * vlc_block_helper.h: Helper functions for data blocks management. + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: fdd5fdbeafee1f296c157410ef3e69a7cf57d3e5 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_HELPER_H +#define VLC_BLOCK_HELPER_H 1 + +#include + +typedef struct block_bytestream_t +{ + block_t *p_chain; /**< byte stream head block */ + block_t *p_block; /**< byte stream read pointer block */ + size_t i_offset; /**< byte stream read pointer offset within block */ + /* TODO? add tail pointer for faster push? */ +} block_bytestream_t; + +/***************************************************************************** + * block_bytestream_t management + *****************************************************************************/ +static inline void block_BytestreamInit( block_bytestream_t *p_bytestream ) +{ + p_bytestream->p_chain = p_bytestream->p_block = NULL; + p_bytestream->i_offset = 0; +} + +static inline void block_BytestreamRelease( block_bytestream_t *p_bytestream ) +{ + for( block_t *block = p_bytestream->p_chain; block != NULL; ) + { + block_t *p_next = block->p_next; + + block_Release( block ); + block = p_next; + } +} + +/** + * It flush all data (read and unread) from a block_bytestream_t. + */ +static inline void block_BytestreamEmpty( block_bytestream_t *p_bytestream ) +{ + block_BytestreamRelease( p_bytestream ); + block_BytestreamInit( p_bytestream ); +} + +/** + * It flushes all already read data from a block_bytestream_t. + */ +static inline void block_BytestreamFlush( block_bytestream_t *p_bytestream ) +{ + block_t *block = p_bytestream->p_chain; + + while( block != p_bytestream->p_block ) + { + block_t *p_next = block->p_next; + + block_Release( block ); + block = p_next; + } + + while( block != NULL && block->i_buffer == p_bytestream->i_offset ) + { + block_t *p_next = block->p_next; + + block_Release( block ); + block = p_next; + p_bytestream->i_offset = 0; + } + + p_bytestream->p_chain = p_bytestream->p_block = block; +} + +static inline void block_BytestreamPush( block_bytestream_t *p_bytestream, + block_t *p_block ) +{ + block_ChainAppend( &p_bytestream->p_chain, p_block ); + if( !p_bytestream->p_block ) p_bytestream->p_block = p_block; +} + +VLC_USED +static inline block_t *block_BytestreamPop( block_bytestream_t *p_bytestream ) +{ + block_t *p_block; + + block_BytestreamFlush( p_bytestream ); + + p_block = p_bytestream->p_block; + if( p_block == NULL ) + { + return NULL; + } + else if( !p_block->p_next ) + { + p_block->p_buffer += p_bytestream->i_offset; + p_block->i_buffer -= p_bytestream->i_offset; + p_bytestream->i_offset = 0; + p_bytestream->p_chain = p_bytestream->p_block = NULL; + return p_block; + } + + while( p_block->p_next && p_block->p_next->p_next ) + p_block = p_block->p_next; + + block_t *p_block_old = p_block; + p_block = p_block->p_next; + p_block_old->p_next = NULL; + + return p_block; +} + +static inline int block_SkipByte( block_bytestream_t *p_bytestream ) +{ + /* Most common case first */ + if( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) + { + p_bytestream->i_offset++; + return VLC_SUCCESS; + } + else + { + block_t *p_block; + + /* Less common case which is also slower */ + for( p_block = p_bytestream->p_block->p_next; + p_block != NULL; p_block = p_block->p_next ) + { + if( p_block->i_buffer ) + { + p_bytestream->i_offset = 1; + p_bytestream->p_block = p_block; + return VLC_SUCCESS; + } + } + } + + /* Not enough data, bail out */ + return VLC_EGENERIC; +} + +static inline int block_PeekByte( block_bytestream_t *p_bytestream, + uint8_t *p_data ) +{ + /* Most common case first */ + if( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) + { + *p_data = p_bytestream->p_block->p_buffer[p_bytestream->i_offset]; + return VLC_SUCCESS; + } + else + { + block_t *p_block; + + /* Less common case which is also slower */ + for( p_block = p_bytestream->p_block->p_next; + p_block != NULL; p_block = p_block->p_next ) + { + if( p_block->i_buffer ) + { + *p_data = p_block->p_buffer[0]; + return VLC_SUCCESS; + } + } + } + + /* Not enough data, bail out */ + return VLC_EGENERIC; +} + +static inline int block_GetByte( block_bytestream_t *p_bytestream, + uint8_t *p_data ) +{ + /* Most common case first */ + if( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) + { + *p_data = p_bytestream->p_block->p_buffer[p_bytestream->i_offset]; + p_bytestream->i_offset++; + return VLC_SUCCESS; + } + else + { + block_t *p_block; + + /* Less common case which is also slower */ + for( p_block = p_bytestream->p_block->p_next; + p_block != NULL; p_block = p_block->p_next ) + { + if( p_block->i_buffer ) + { + *p_data = p_block->p_buffer[0]; + p_bytestream->i_offset = 1; + p_bytestream->p_block = p_block; + return VLC_SUCCESS; + } + } + } + + /* Not enough data, bail out */ + return VLC_EGENERIC; +} + +static inline int block_WaitBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + return VLC_SUCCESS; +} + +static inline int block_SkipBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_data, p_block->i_buffer - i_offset ); + i_data -= i_copy; + + if( !i_data ) break; + + i_offset = 0; + } + + if( i_data ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + p_bytestream->p_block = p_block; + p_bytestream->i_offset = i_offset + i_copy; + return VLC_SUCCESS; +} + +static inline int block_PeekBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Copy the data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +static inline int block_GetBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Copy the data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + if( !i_size ) break; + + i_offset = 0; + } + + p_bytestream->p_block = p_block; + p_bytestream->i_offset = i_offset + i_copy; + + return VLC_SUCCESS; +} + +static inline int block_PeekOffsetBytes( block_bytestream_t *p_bytestream, + size_t i_peek_offset, uint8_t *p_data, size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data + i_peek_offset; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Find the right place */ + i_offset = p_bytestream->i_offset; + i_size = i_peek_offset; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( !i_size ) break; + + i_offset = 0; + } + + /* Copy the data */ + i_offset += i_copy; + i_size = i_data; + i_copy = 0; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +static inline int block_FindStartcodeFromOffset( + block_bytestream_t *p_bytestream, size_t *pi_offset, + const uint8_t *p_startcode, int i_startcode_length ) +{ + block_t *p_block, *p_block_backup = 0; + int i_size = 0; + size_t i_offset, i_offset_backup = 0; + int i_caller_offset_backup = 0, i_match; + + /* Find the right place */ + i_size = *pi_offset + p_bytestream->i_offset; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_size -= p_block->i_buffer; + if( i_size < 0 ) break; + } + + if( i_size >= 0 ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Begin the search. + * We first look for an occurrence of the 1st startcode byte and + * if found, we do a more thorough check. */ + i_size += p_block->i_buffer; + *pi_offset -= i_size; + i_match = 0; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + for( i_offset = i_size; i_offset < p_block->i_buffer; i_offset++ ) + { + if( p_block->p_buffer[i_offset] == p_startcode[i_match] ) + { + if( !i_match ) + { + p_block_backup = p_block; + i_offset_backup = i_offset; + i_caller_offset_backup = *pi_offset; + } + + if( i_match + 1 == i_startcode_length ) + { + /* We have it */ + *pi_offset += i_offset - i_match; + return VLC_SUCCESS; + } + + i_match++; + } + else if ( i_match ) + { + /* False positive */ + p_block = p_block_backup; + i_offset = i_offset_backup; + *pi_offset = i_caller_offset_backup; + i_match = 0; + } + + } + i_size = 0; + *pi_offset += i_offset; + } + + *pi_offset -= i_match; + return VLC_EGENERIC; +} + +#endif /* VLC_BLOCK_HELPER_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_charset.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_charset.h new file mode 100644 index 0000000..fb265c5 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_charset.h @@ -0,0 +1,213 @@ +/***************************************************************************** + * vlc_charset.h: Unicode UTF-8 wrappers function + ***************************************************************************** + * Copyright (C) 2003-2005 VLC authors and VideoLAN + * Copyright © 2005-2010 Rémi Denis-Courmont + * $Id: 3119e89fd6bad58096a18211009d1504b97c9fbe $ + * + * Author: Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CHARSET_H +#define VLC_CHARSET_H 1 + +/** + * \file + * This files handles locale conversions in vlc + */ + +/* iconv wrappers (defined in src/extras/libc.c) */ +typedef void *vlc_iconv_t; +VLC_API vlc_iconv_t vlc_iconv_open( const char *, const char * ) VLC_USED; +VLC_API size_t vlc_iconv( vlc_iconv_t, const char **, size_t *, char **, size_t * ) VLC_USED; +VLC_API int vlc_iconv_close( vlc_iconv_t ); + +#include + +VLC_API int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap ); +VLC_API int utf8_fprintf( FILE *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API char * vlc_strcasestr(const char *, const char *) VLC_USED; + +VLC_API char * EnsureUTF8( char * ); +VLC_API const char * IsUTF8( const char * ) VLC_USED; + +VLC_API char * FromCharset( const char *charset, const void *data, size_t data_size ) VLC_USED; +VLC_API void * ToCharset( const char *charset, const char *in, size_t *outsize ) VLC_USED; + +#ifdef _WIN32 +VLC_USED +static inline char *FromWide (const wchar_t *wide) +{ + size_t len = WideCharToMultiByte (CP_UTF8, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) + return NULL; + + char *out = (char *)malloc (len); + + if (likely(out)) + WideCharToMultiByte (CP_UTF8, 0, wide, -1, out, len, NULL, NULL); + return out; +} + +VLC_USED +static inline wchar_t *ToWide (const char *utf8) +{ + int len = MultiByteToWideChar (CP_UTF8, 0, utf8, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *out = (wchar_t *)malloc (len * sizeof (wchar_t)); + + if (likely(out)) + MultiByteToWideChar (CP_UTF8, 0, utf8, -1, out, len); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *ToCodePage (unsigned cp, const char *utf8) +{ + wchar_t *wide = ToWide (utf8); + if (wide == NULL) + return NULL; + + size_t len = WideCharToMultiByte (cp, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) { + free(wide); + return NULL; + } + + char *out = (char *)malloc (len); + if (likely(out != NULL)) + WideCharToMultiByte (cp, 0, wide, -1, out, len, NULL, NULL); + free (wide); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *FromCodePage (unsigned cp, const char *mb) +{ + int len = MultiByteToWideChar (cp, 0, mb, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *wide = (wchar_t *)malloc (len * sizeof (wchar_t)); + if (unlikely(wide == NULL)) + return NULL; + MultiByteToWideChar (cp, 0, mb, -1, wide, len); + + char *utf8 = FromWide (wide); + free (wide); + return utf8; +} + +VLC_USED VLC_MALLOC +static inline char *FromANSI (const char *ansi) +{ + return FromCodePage (GetACP (), ansi); +} + +VLC_USED VLC_MALLOC +static inline char *ToANSI (const char *utf8) +{ + return ToCodePage (GetACP (), utf8); +} + +# ifdef UNICODE +# define FromT FromWide +# define ToT ToWide +# else +# define FromT FromANSI +# define ToT ToANSI +# endif +# define FromLocale FromANSI +# define ToLocale ToANSI +# define LocaleFree(s) free((char *)(s)) +# define FromLocaleDup FromANSI +# define ToLocaleDup ToANSI + +#elif defined(__OS2__) + +VLC_USED static inline char *FromLocale (const char *locale) +{ + return locale ? FromCharset ((char *)"", locale, strlen(locale)) : NULL; +} + +VLC_USED static inline char *ToLocale (const char *utf8) +{ + size_t outsize; + return utf8 ? (char *)ToCharset ("", utf8, &outsize) : NULL; +} + +VLC_USED static inline void LocaleFree (const char *str) +{ + free ((char *)str); +} + +VLC_USED static inline char *FromLocaleDup (const char *locale) +{ + return FromCharset ("", locale, strlen(locale)); +} + +VLC_USED static inline char *ToLocaleDup (const char *utf8) +{ + size_t outsize; + return (char *)ToCharset ("", utf8, &outsize); +} + +#else + +# define FromLocale(l) (l) +# define ToLocale(u) (u) +# define LocaleFree(s) ((void)(s)) +# define FromLocaleDup strdup +# define ToLocaleDup strdup +#endif + +/** + * Converts a nul-terminated string from ISO-8859-1 to UTF-8. + */ +static inline char *FromLatin1 (const char *latin) +{ + char *str = (char *)malloc (2 * strlen (latin) + 1), *utf8 = str; + unsigned char c; + + if (str == NULL) + return NULL; + + while ((c = *(latin++)) != '\0') + { + if (c >= 0x80) + { + *(utf8++) = 0xC0 | (c >> 6); + *(utf8++) = 0x80 | (c & 0x3F); + } + else + *(utf8++) = c; + } + *(utf8++) = '\0'; + + utf8 = (char *)realloc (str, utf8 - str); + return utf8 ? utf8 : str; +} + +VLC_API double us_strtod( const char *, char ** ) VLC_USED; +VLC_API float us_strtof( const char *, char ** ) VLC_USED; +VLC_API double us_atof( const char * ) VLC_USED; +VLC_API int us_vasprintf( char **, const char *, va_list ); +VLC_API int us_asprintf( char **, const char *, ... ) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_codec.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_codec.h new file mode 100644 index 0000000..be775cd --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_codec.h @@ -0,0 +1,258 @@ +/***************************************************************************** + * vlc_codec.h: Definition of the decoder and encoder structures + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * $Id: 1e7c8a6f160cd27fc3123abf64c62a52b62f5111 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CODEC_H +#define VLC_CODEC_H 1 + +#include +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by decoders and encoders + */ + +typedef struct decoder_owner_sys_t decoder_owner_sys_t; + +/** + * \defgroup decoder Decoder + * + * The structure describing a decoder + * + * @{ + */ + +/* + * BIG FAT WARNING : the code relies in the first 4 members of filter_t + * and decoder_t to be the same, so if you have anything to add, do it + * at the end of the structure. + */ +struct decoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + decoder_sys_t * p_sys; + + /* Input format ie from demuxer (XXX: a lot of field could be invalid) */ + es_format_t fmt_in; + + /* Output format of decoder/packetizer */ + es_format_t fmt_out; + + /* Some decoders only accept packetized data (ie. not truncated) */ + bool b_need_packetized; + + /* Tell the decoder if it is allowed to drop frames */ + bool b_pace_control; + + /* */ + picture_t * ( * pf_decode_video )( decoder_t *, block_t ** ); + block_t * ( * pf_decode_audio )( decoder_t *, block_t ** ); + subpicture_t * ( * pf_decode_sub) ( decoder_t *, block_t ** ); + block_t * ( * pf_packetize ) ( decoder_t *, block_t ** ); + + /* Closed Caption (CEA 608/708) extraction. + * If set, it *may* be called after pf_decode_video/pf_packetize + * returned data. It should return CC for the pictures returned by the + * last pf_packetize/pf_decode_video call only, + * pb_present will be used to known which cc channel are present (but + * globaly, not necessary for the current packet */ + block_t * ( * pf_get_cc ) ( decoder_t *, bool pb_present[4] ); + + /* Meta data at codec level + * The decoder owner set it back to NULL once it has retreived what it needs. + * The decoder owner is responsible of its release except when you overwrite it. + */ + vlc_meta_t *p_description; + + /* + * Owner fields + * XXX You MUST not use them directly. + */ + + /* Video output callbacks + * XXX use decoder_NewPicture/decoder_DeletePicture + * and decoder_LinkPicture/decoder_UnlinkPicture */ + picture_t *(*pf_vout_buffer_new)( decoder_t * ); + void (*pf_vout_buffer_del)( decoder_t *, picture_t * ); + void (*pf_picture_link) ( decoder_t *, picture_t * ); + void (*pf_picture_unlink) ( decoder_t *, picture_t * ); + + /** + * Number of extra (ie in addition to the DPB) picture buffers + * needed for decoding. + */ + int i_extra_picture_buffers; + + /* Audio output callbacks */ + int (*pf_aout_format_update)( decoder_t * ); + + /* SPU output callbacks + * XXX use decoder_NewSubpicture and decoder_DeleteSubpicture */ + subpicture_t *(*pf_spu_buffer_new)( decoder_t *, const subpicture_updater_t * ); + void (*pf_spu_buffer_del)( decoder_t *, subpicture_t * ); + + /* Input attachments + * XXX use decoder_GetInputAttachments */ + int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment ); + + /* Display date + * XXX use decoder_GetDisplayDate */ + mtime_t (*pf_get_display_date)( decoder_t *, mtime_t ); + + /* Display rate + * XXX use decoder_GetDisplayRate */ + int (*pf_get_display_rate)( decoder_t * ); + + /* Private structure for the owner of the decoder */ + decoder_owner_sys_t *p_owner; + + bool b_error; +}; + +/** + * @} + */ + +/** + * \defgroup encoder Encoder + * + * The structure describing a Encoder + * + * @{ + */ + +struct encoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + encoder_sys_t * p_sys; + + /* Properties of the input data fed to the encoder */ + es_format_t fmt_in; + + /* Properties of the output of the encoder */ + es_format_t fmt_out; + + block_t * ( * pf_encode_video )( encoder_t *, picture_t * ); + block_t * ( * pf_encode_audio )( encoder_t *, block_t * ); + block_t * ( * pf_encode_sub )( encoder_t *, subpicture_t * ); + + /* Common encoder options */ + int i_threads; /* Number of threads to use during encoding */ + int i_iframes; /* One I frame per i_iframes */ + int i_bframes; /* One B frame per i_bframes */ + int i_tolerance; /* Bitrate tolerance */ + + /* Encoder config */ + config_chain_t *p_cfg; +}; + +/** + * @} + */ + + +/** + * This function will return a new picture usable by a decoder as an output + * buffer. You have to release it using decoder_DeletePicture or by returning + * it to the caller as a pf_decode_video return value. + */ +VLC_API picture_t * decoder_NewPicture( decoder_t * ) VLC_USED; + +/** + * This function will release a picture create by decoder_NewPicture. + */ +VLC_API void decoder_DeletePicture( decoder_t *, picture_t *p_picture ); + +/** + * This function will increase the picture reference count. + * (picture_Hold is not usable.) + */ +VLC_API void decoder_LinkPicture( decoder_t *, picture_t * ); + +/** + * This function will decrease the picture reference count. + * (picture_Release is not usable.) + */ +VLC_API void decoder_UnlinkPicture( decoder_t *, picture_t * ); + +/** + * This function notifies the audio output pipeline of a new audio output + * format (fmt_out.audio). If there is currently no audio output or if the + * audio output format has changed, a new audio output will be set up. + * @return 0 if the audio output is working, -1 if not. */ +static inline int decoder_UpdateAudioFormat( decoder_t *dec ) +{ + if( dec->pf_aout_format_update != NULL ) + return dec->pf_aout_format_update( dec ); + else + return -1; +} + +/** + * This function will return a new audio buffer usable by a decoder as an + * output buffer. You have to release it using decoder_DeleteAudioBuffer + * or by returning it to the caller as a pf_decode_audio return value. + */ +VLC_API block_t * decoder_NewAudioBuffer( decoder_t *, int i_size ) VLC_USED; + +/** + * This function will return a new subpicture usable by a decoder as an output + * buffer. You have to release it using decoder_DeleteSubpicture or by returning + * it to the caller as a pf_decode_sub return value. + */ +VLC_API subpicture_t * decoder_NewSubpicture( decoder_t *, const subpicture_updater_t * ) VLC_USED; + +/** + * This function will release a subpicture created by decoder_NewSubicture. + */ +VLC_API void decoder_DeleteSubpicture( decoder_t *, subpicture_t *p_subpicture ); + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +VLC_API int decoder_GetInputAttachments( decoder_t *, input_attachment_t ***ppp_attachment, int *pi_attachment ); + +/** + * This function converts a decoder timestamp into a display date comparable + * to mdate(). + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API mtime_t decoder_GetDisplayDate( decoder_t *, mtime_t ) VLC_USED; + +/** + * This function returns the current input rate. + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API int decoder_GetDisplayRate( decoder_t * ) VLC_USED; + +#endif /* _VLC_CODEC_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_common.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_common.h new file mode 100644 index 0000000..8b4b923 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_common.h @@ -0,0 +1,932 @@ +/***************************************************************************** + * vlc_common.h: common definitions + * Collection of useful common types and macros definitions + ***************************************************************************** + * Copyright (C) 1998-2011 VLC authors and VideoLAN + * + * Authors: Samuel Hocevar + * Vincent Seguin + * Gildas Bazin + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file is a collection of common definitions and types + */ + +#ifndef VLC_COMMON_H +# define VLC_COMMON_H 1 + +/***************************************************************************** + * Required vlc headers + *****************************************************************************/ +#include "vlc_config.h" + +/***************************************************************************** + * Required system headers + *****************************************************************************/ +#include +#include + +#include +#include +#include +#include + +#ifndef __cplusplus +# include +#endif + +/***************************************************************************** + * Compilers definitions + *****************************************************************************/ +/* Helper for GCC version checks */ +#ifdef __GNUC__ +# define VLC_GCC_VERSION(maj,min) \ + ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min))) +#else +# define VLC_GCC_VERSION(maj,min) (0) +#endif + +/* Try to fix format strings for all versions of mingw and mingw64 */ +#if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO ) + #undef PRId64 + #define PRId64 "lld" + #undef PRIi64 + #define PRIi64 "lli" + #undef PRIu64 + #define PRIu64 "llu" + #undef PRIo64 + #define PRIo64 "llo" + #undef PRIx64 + #define PRIx64 "llx" + #define snprintf __mingw_snprintf + #define vsnprintf __mingw_vsnprintf + #define swprintf _snwprintf +#endif + +/* Function attributes for compiler warnings */ +#ifdef __GNUC__ +# define VLC_DEPRECATED __attribute__((deprecated)) + +# if defined( _WIN32 ) && VLC_GCC_VERSION(4,4) +# define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y))) +# else +# define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y))) +# endif +# define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x))) + +# define VLC_MALLOC __attribute__ ((malloc)) +# define VLC_NORETURN __attribute__ ((noreturn)) + +# if VLC_GCC_VERSION(3,4) +# define VLC_USED __attribute__ ((warn_unused_result)) +# else +# define VLC_USED +# endif + +#else +# define VLC_DEPRECATED +# define VLC_FORMAT(x,y) +# define VLC_FORMAT_ARG(x) +# define VLC_MALLOC +# define VLC_NORETURN +# define VLC_USED +#endif + + +/* Branch prediction */ +#ifdef __GNUC__ +# define likely(p) __builtin_expect(!!(p), 1) +# define unlikely(p) __builtin_expect(!!(p), 0) +#else +# define likely(p) (!!(p)) +# define unlikely(p) (!!(p)) +#endif + +/* Linkage */ +#ifdef __cplusplus +# define VLC_EXTERN extern "C" +#else +# define VLC_EXTERN +#endif + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define VLC_EXPORT __declspec(dllexport) +#elif VLC_GCC_VERSION(4,0) +# define VLC_EXPORT __attribute__((visibility("default"))) +#else +# define VLC_EXPORT +#endif + +#define VLC_API VLC_EXTERN VLC_EXPORT + + +/***************************************************************************** + * Basic types definitions + *****************************************************************************/ +/** + * High precision date or time interval + * + * Store a high precision date or time interval. The maximum precision is the + * microsecond, and a 64 bits integer is used to avoid overflows (maximum + * time interval is then 292271 years, which should be long enough for any + * video). Dates are stored as microseconds since a common date (usually the + * epoch). Note that date and time intervals can be manipulated using regular + * arithmetic operators, and that no special functions are required. + */ +typedef int64_t mtime_t; + +/** + * The vlc_fourcc_t type. + * + * See http://www.webartz.com/fourcc/ for a very detailed list. + */ +typedef uint32_t vlc_fourcc_t; + +#ifdef WORDS_BIGENDIAN +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \ + | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) ) + +#else +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \ + | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) ) + +#endif + +/** + * Translate a vlc_fourcc into its string representation. This function + * assumes there is enough room in psz_fourcc to store 4 characters in. + * + * \param fcc a vlc_fourcc_t + * \param psz_fourcc string to store string representation of vlc_fourcc in + */ +static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc ) +{ + memcpy( psz_fourcc, &fcc, 4 ); +} + +#define vlc_fourcc_to_char( a, b ) \ + vlc_fourcc_to_char( (vlc_fourcc_t)(a), (char *)(b) ) + +/***************************************************************************** + * Classes declaration + *****************************************************************************/ + +/* Internal types */ +typedef struct vlc_list_t vlc_list_t; +typedef struct vlc_object_t vlc_object_t; +typedef struct libvlc_int_t libvlc_int_t; +typedef struct date_t date_t; + +/* Playlist */ + +/* FIXME */ +/** + * Playlist commands + */ +typedef enum { + PLAYLIST_PLAY, /**< No arg. res=can fail*/ + PLAYLIST_VIEWPLAY, /**< arg1= playlist_item_t*,*/ + /** arg2 = playlist_item_t* , res=can fail */ + PLAYLIST_PAUSE, /**< No arg res=can fail*/ + PLAYLIST_STOP, /**< No arg res=can fail*/ + PLAYLIST_SKIP, /**< arg1=int, res=can fail*/ +} playlist_command_t; + + +typedef struct playlist_t playlist_t; +typedef struct playlist_item_t playlist_item_t; +typedef struct services_discovery_t services_discovery_t; +typedef struct services_discovery_sys_t services_discovery_sys_t; +typedef struct playlist_add_t playlist_add_t; + +/* Modules */ +typedef struct module_t module_t; +typedef struct module_config_t module_config_t; + +typedef struct config_category_t config_category_t; + +/* Input */ +typedef struct input_thread_t input_thread_t; +typedef struct input_item_t input_item_t; +typedef struct input_item_node_t input_item_node_t; +typedef struct access_t access_t; +typedef struct access_sys_t access_sys_t; +typedef struct stream_t stream_t; +typedef struct stream_sys_t stream_sys_t; +typedef struct demux_t demux_t; +typedef struct demux_sys_t demux_sys_t; +typedef struct es_out_t es_out_t; +typedef struct es_out_id_t es_out_id_t; +typedef struct es_out_sys_t es_out_sys_t; +typedef struct seekpoint_t seekpoint_t; +typedef struct info_t info_t; +typedef struct info_category_t info_category_t; +typedef struct input_attachment_t input_attachment_t; + +/* Format */ +typedef struct audio_format_t audio_format_t; +typedef struct video_format_t video_format_t; +typedef struct subs_format_t subs_format_t; +typedef struct es_format_t es_format_t; +typedef struct video_palette_t video_palette_t; + +/* Audio */ +typedef struct audio_output audio_output_t; +typedef struct aout_sys_t aout_sys_t; +typedef audio_format_t audio_sample_format_t; + +/* Video */ +typedef struct vout_thread_t vout_thread_t; + +typedef video_format_t video_frame_format_t; +typedef struct picture_t picture_t; +typedef struct picture_sys_t picture_sys_t; + +/* Subpictures */ +typedef struct spu_t spu_t; +typedef struct subpicture_t subpicture_t; +typedef struct subpicture_region_t subpicture_region_t; + +typedef struct image_handler_t image_handler_t; + +/* Stream output */ +typedef struct sout_instance_t sout_instance_t; + +typedef struct sout_input_t sout_input_t; +typedef struct sout_packetizer_input_t sout_packetizer_input_t; + +typedef struct sout_access_out_t sout_access_out_t; +typedef struct sout_access_out_sys_t sout_access_out_sys_t; + +typedef struct sout_mux_t sout_mux_t; +typedef struct sout_mux_sys_t sout_mux_sys_t; + +typedef struct sout_stream_t sout_stream_t; +typedef struct sout_stream_sys_t sout_stream_sys_t; + +typedef struct config_chain_t config_chain_t; +typedef struct session_descriptor_t session_descriptor_t; + +/* Decoders */ +typedef struct decoder_t decoder_t; +typedef struct decoder_sys_t decoder_sys_t; +typedef struct decoder_synchro_t decoder_synchro_t; + +/* Encoders */ +typedef struct encoder_t encoder_t; +typedef struct encoder_sys_t encoder_sys_t; + +/* Filters */ +typedef struct filter_t filter_t; +typedef struct filter_sys_t filter_sys_t; + +/* Network */ +typedef struct virtual_socket_t v_socket_t; +typedef struct vlc_url_t vlc_url_t; + +/* Misc */ +typedef struct iso639_lang_t iso639_lang_t; + +/* block */ +typedef struct block_t block_t; +typedef struct block_fifo_t block_fifo_t; + +/* Hashing */ +typedef struct md5_s md5_t; + +/* XML */ +typedef struct xml_t xml_t; +typedef struct xml_sys_t xml_sys_t; +typedef struct xml_reader_t xml_reader_t; +typedef struct xml_reader_sys_t xml_reader_sys_t; + +/* vod server */ +typedef struct vod_t vod_t; +typedef struct vod_sys_t vod_sys_t; +typedef struct vod_media_t vod_media_t; + +/* VLM */ +typedef struct vlm_t vlm_t; +typedef struct vlm_message_t vlm_message_t; + +/* misc */ +typedef struct vlc_meta_t vlc_meta_t; +typedef struct input_stats_t input_stats_t; +typedef struct addon_entry_t addon_entry_t; + +/* Update */ +typedef struct update_t update_t; + +/** + * VLC value structure + */ +typedef union +{ + int64_t i_int; + bool b_bool; + float f_float; + char * psz_string; + void * p_address; + vlc_object_t * p_object; + vlc_list_t * p_list; + mtime_t i_time; + struct { int32_t x; int32_t y; } coords; + +} vlc_value_t; + +/** + * VLC list structure + */ +struct vlc_list_t +{ + int i_count; + vlc_value_t * p_values; + int * pi_types; + +}; + +/***************************************************************************** + * Error values (shouldn't be exposed) + *****************************************************************************/ +#define VLC_SUCCESS (-0) /**< No error */ +#define VLC_EGENERIC (-1) /**< Unspecified error */ +#define VLC_ENOMEM (-2) /**< Not enough memory */ +#define VLC_ETIMEOUT (-3) /**< Timeout */ +#define VLC_ENOMOD (-4) /**< Module not found */ +#define VLC_ENOOBJ (-5) /**< Object not found */ +#define VLC_ENOVAR (-6) /**< Variable not found */ +#define VLC_EBADVAR (-7) /**< Bad variable value */ +#define VLC_ENOITEM (-8) /**< Item not found */ + +/***************************************************************************** + * Variable callbacks + *****************************************************************************/ +typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ + char const *, /* variable name */ + vlc_value_t, /* old value */ + vlc_value_t, /* new value */ + void * ); /* callback data */ + +/***************************************************************************** + * OS-specific headers and thread types + *****************************************************************************/ +#if defined( _WIN32 ) +# include +# ifndef PATH_MAX +# define PATH_MAX MAX_PATH +# endif +# include +#endif + +#ifdef __SYMBIAN32__ + #include +#endif + +#ifdef __OS2__ +# define OS2EMX_PLAIN_CHAR +# define INCL_BASE +# define INCL_PM +# include +# include +#endif + +#include "vlc_mtime.h" +#include "vlc_threads.h" + +/***************************************************************************** + * Common structure members + *****************************************************************************/ + +/* VLC_COMMON_MEMBERS : members common to all basic vlc objects */ +#define VLC_COMMON_MEMBERS \ +/** \name VLC_COMMON_MEMBERS \ + * these members are common for all vlc objects \ + */ \ +/**@{*/ \ + const char *psz_object_type; \ + \ + /* Messages header */ \ + char *psz_header; \ + int i_flags; \ + \ + /* Object properties */ \ + bool b_force; /**< set by the outside (eg. module_need()) */ \ + \ + /* Stuff related to the libvlc structure */ \ + libvlc_int_t *p_libvlc; /**< (root of all evil) - 1 */ \ + \ + vlc_object_t * p_parent; /**< our parent */ \ + \ +/**@}*/ \ + +/* VLC_OBJECT: attempt at doing a clever cast */ +#if VLC_GCC_VERSION(4,0) +# ifndef __cplusplus +# define VLC_OBJECT( x ) \ + __builtin_choose_expr( \ + __builtin_offsetof(__typeof__(*(x)), psz_object_type), \ + (void)0 /* screw you */, \ + (vlc_object_t *)(x)) +# else +# define VLC_OBJECT( x ) \ + ((vlc_object_t *)(x) \ + + 0 * __builtin_offsetof(__typeof__(*(x)), psz_object_type)) +# endif +#else +# define VLC_OBJECT( x ) ((vlc_object_t *)(x)) +#endif + +/***************************************************************************** + * Macros and inline functions + *****************************************************************************/ + +/* CEIL: division with round to nearest greater integer */ +#define CEIL(n, d) ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) ) + +/* PAD: PAD(n, d) = CEIL(n ,d) * d */ +#define PAD(n, d) ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) ) + +/* __MAX and __MIN: self explanatory */ +#ifndef __MAX +# define __MAX(a, b) ( ((a) > (b)) ? (a) : (b) ) +#endif +#ifndef __MIN +# define __MIN(a, b) ( ((a) < (b)) ? (a) : (b) ) +#endif + +/* clip v in [min, max] */ +#define VLC_CLIP(v, min, max) __MIN(__MAX((v), (min)), (max)) + +VLC_USED +static inline int64_t GCD ( int64_t a, int64_t b ) +{ + while( b ) + { + int64_t c = a % b; + a = b; + b = c; + } + return a; +} + +/* function imported from libavutil/common.h */ +VLC_USED +static inline uint8_t clip_uint8_vlc( int32_t a ) +{ + if( a&(~255) ) return (-a)>>31; + else return a; +} + +/** Count leading zeroes */ +VLC_USED +static inline unsigned clz (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_clz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x >>= 1; + i--; + } + return i; +#endif +} + +#define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8)) +#define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8)) +/* XXX: this assumes that int is 32-bits or more */ +#define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8)) + +/** Count trailing zeroes */ +VLC_USED +static inline unsigned ctz (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_ctz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x <<= 1; + i--; + } + return i; +#endif +} + +/** Bit weight */ +VLC_USED +static inline unsigned popcount (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_popcount (x); +#else + unsigned count = 0; + while (x) + { + count += x & 1; + x = x >> 1; + } + return count; +#endif +} + +VLC_USED +static inline unsigned parity (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_parity (x); +#else + for (unsigned i = 4 * sizeof (x); i > 0; i /= 2) + x ^= x >> i; + return x & 1; +#endif +} + +#ifdef __OS2__ +# undef bswap16 +# undef bswap32 +# undef bswap64 +#endif + +/** Byte swap (16 bits) */ +VLC_USED +static inline uint16_t bswap16 (uint16_t x) +{ + return (x << 8) | (x >> 8); +} + +/** Byte swap (32 bits) */ +VLC_USED +static inline uint32_t bswap32 (uint32_t x) +{ +#if VLC_GCC_VERSION(4,3) || defined(__clang__) + return __builtin_bswap32 (x); +#else + return ((x & 0x000000FF) << 24) + | ((x & 0x0000FF00) << 8) + | ((x & 0x00FF0000) >> 8) + | ((x & 0xFF000000) >> 24); +#endif +} + +/** Byte swap (64 bits) */ +VLC_USED +static inline uint64_t bswap64 (uint64_t x) +{ +#if VLC_GCC_VERSION(4,3) || defined(__clang__) + return __builtin_bswap64 (x); +#elif !defined (__cplusplus) + return ((x & 0x00000000000000FF) << 56) + | ((x & 0x000000000000FF00) << 40) + | ((x & 0x0000000000FF0000) << 24) + | ((x & 0x00000000FF000000) << 8) + | ((x & 0x000000FF00000000) >> 8) + | ((x & 0x0000FF0000000000) >> 24) + | ((x & 0x00FF000000000000) >> 40) + | ((x & 0xFF00000000000000) >> 56); +#else + return ((x & 0x00000000000000FFULL) << 56) + | ((x & 0x000000000000FF00ULL) << 40) + | ((x & 0x0000000000FF0000ULL) << 24) + | ((x & 0x00000000FF000000ULL) << 8) + | ((x & 0x000000FF00000000ULL) >> 8) + | ((x & 0x0000FF0000000000ULL) >> 24) + | ((x & 0x00FF000000000000ULL) >> 40) + | ((x & 0xFF00000000000000ULL) >> 56); +#endif +} + + +/* Free and set set the variable to NULL */ +#define FREENULL(a) do { free( a ); a = NULL; } while(0) + +#define EMPTY_STR(str) (!str || !*str) + +VLC_API char const * vlc_error( int ) VLC_USED; + +#include + +/* MSB (big endian)/LSB (little endian) conversions - network order is always + * MSB, and should be used for both network communications and files. */ + +#ifdef WORDS_BIGENDIAN +# define hton16(i) ((uint16_t)(i)) +# define hton32(i) ((uint32_t)(i)) +# define hton64(i) ((uint64_t)(i)) +#else +# define hton16(i) bswap16(i) +# define hton32(i) bswap32(i) +# define hton64(i) bswap64(i) +#endif +#define ntoh16(i) hton16(i) +#define ntoh32(i) hton32(i) +#define ntoh64(i) hton64(i) + +/** Reads 16 bits in network byte order */ +VLC_USED +static inline uint16_t U16_AT (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh16 (x); +} + +/** Reads 32 bits in network byte order */ +VLC_USED +static inline uint32_t U32_AT (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh32 (x); +} + +/** Reads 64 bits in network byte order */ +VLC_USED +static inline uint64_t U64_AT (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh64 (x); +} + +#define GetWBE(p) U16_AT(p) +#define GetDWBE(p) U32_AT(p) +#define GetQWBE(p) U64_AT(p) + +/** Reads 16 bits in little-endian order */ +VLC_USED +static inline uint16_t GetWLE (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap16 (x); +#endif + return x; +} + +/** Reads 32 bits in little-endian order */ +VLC_USED +static inline uint32_t GetDWLE (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap32 (x); +#endif + return x; +} + +/** Reads 64 bits in little-endian order */ +VLC_USED +static inline uint64_t GetQWLE (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap64 (x); +#endif + return x; +} + +/** Writes 16 bits in network byte order */ +static inline void SetWBE (void *p, uint16_t w) +{ + w = hton16 (w); + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in network byte order */ +static inline void SetDWBE (void *p, uint32_t dw) +{ + dw = hton32 (dw); + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in network byte order */ +static inline void SetQWBE (void *p, uint64_t qw) +{ + qw = hton64 (qw); + memcpy (p, &qw, sizeof (qw)); +} + +/** Writes 16 bits in little endian order */ +static inline void SetWLE (void *p, uint16_t w) +{ +#ifdef WORDS_BIGENDIAN + w = bswap16 (w); +#endif + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in little endian order */ +static inline void SetDWLE (void *p, uint32_t dw) +{ +#ifdef WORDS_BIGENDIAN + dw = bswap32 (dw); +#endif + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in little endian order */ +static inline void SetQWLE (void *p, uint64_t qw) +{ +#ifdef WORDS_BIGENDIAN + qw = bswap64 (qw); +#endif + memcpy (p, &qw, sizeof (qw)); +} + +/* */ +#define VLC_UNUSED(x) (void)(x) + +/* Stuff defined in src/extras/libc.c */ + +#if defined(_WIN32) +/* several type definitions */ +# if defined( __MINGW32__ ) +# if !defined( _OFF_T_ ) + typedef long long _off_t; + typedef _off_t off_t; +# define _OFF_T_ +# else +# ifdef off_t +# undef off_t +# endif +# define off_t long long +# endif +# endif + +# ifndef O_NONBLOCK +# define O_NONBLOCK 0 +# endif + +# include +#endif /* _WIN32 */ + +VLC_API bool vlc_ureduce( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ); + +/* Aligned memory allocator */ +#ifdef __APPLE__ +#include +#endif + +#ifdef __MINGW32__ +# define vlc_memalign(align, size) (__mingw_aligned_malloc(size, align)) +# define vlc_free(base) (__mingw_aligned_free(base)) +#elif defined(_MSC_VER) +# define vlc_memalign(align, size) (_aligned_malloc(size, align)) +# define vlc_free(base) (_aligned_free(base)) +#elif defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6) +static inline void *vlc_memalign(size_t align, size_t size) +{ + long diff; + void *ptr; + + ptr = malloc(size+align); + if(!ptr) + return ptr; + diff = ((-(long)ptr - 1)&(align-1)) + 1; + ptr = (char*)ptr + diff; + ((char*)ptr)[-1]= diff; + return ptr; +} + +static void vlc_free(void *ptr) +{ + if (ptr) + free((char*)ptr - ((char*)ptr)[-1]); +} +#else +static inline void *vlc_memalign(size_t align, size_t size) +{ + void *base; + if (unlikely(posix_memalign(&base, align, size))) + base = NULL; + return base; +} +# define vlc_free(base) free(base) +#endif + +VLC_API void vlc_tdestroy( void *, void (*)(void *) ); + +/***************************************************************************** + * I18n stuff + *****************************************************************************/ +VLC_API char *vlc_gettext( const char *msgid ) VLC_FORMAT_ARG(1); +VLC_API char *vlc_ngettext( const char *s, const char *p, unsigned long n ) VLC_FORMAT_ARG(1) VLC_FORMAT_ARG(2); + +#define vlc_pgettext( ctx, id ) \ + vlc_pgettext_aux( ctx "\004" id, id ) + +VLC_FORMAT_ARG(2) +static inline const char *vlc_pgettext_aux( const char *ctx, const char *id ) +{ + const char *tr = vlc_gettext( ctx ); + return (tr == ctx) ? id : tr; +} + +/***************************************************************************** + * Loosy memory allocation functions. Do not use in new code. + *****************************************************************************/ +static inline void *xmalloc (size_t len) +{ + void *ptr = malloc (len); + if (unlikely (ptr == NULL)) + abort (); + return ptr; +} + +static inline void *xrealloc (void *ptr, size_t len) +{ + void *nptr = realloc (ptr, len); + if (unlikely (nptr == NULL)) + abort (); + return nptr; +} + +static inline void *xcalloc (size_t n, size_t size) +{ + void *ptr = calloc (n, size); + if (unlikely (ptr == NULL)) + abort (); + return ptr; +} + +static inline char *xstrdup (const char *str) +{ + char *ptr = strdup (str); + if (unlikely(ptr == NULL)) + abort (); + return ptr; +} + +/***************************************************************************** + * libvlc features + *****************************************************************************/ +VLC_API const char * VLC_CompileBy( void ) VLC_USED; +VLC_API const char * VLC_CompileHost( void ) VLC_USED; +VLC_API const char * VLC_Compiler( void ) VLC_USED; + +/***************************************************************************** + * Additional vlc stuff + *****************************************************************************/ +#include "vlc_messages.h" +#include "vlc_objects.h" +#include "vlc_variables.h" +#include "vlc_main.h" +#include "vlc_configuration.h" + +#if defined( _WIN32 ) || defined( __SYMBIAN32__ ) || defined( __OS2__ ) +# define DIR_SEP_CHAR '\\' +# define DIR_SEP "\\" +# define PATH_SEP_CHAR ';' +# define PATH_SEP ";" +#else +# define DIR_SEP_CHAR '/' +# define DIR_SEP "/" +# define PATH_SEP_CHAR ':' +# define PATH_SEP ":" +#endif + +#define LICENSE_MSG \ + _("This program comes with NO WARRANTY, to the extent permitted by " \ + "law.\nYou may redistribute it under the terms of the GNU General " \ + "Public License;\nsee the file named COPYING for details.\n" \ + "Written by the VideoLAN team; see the AUTHORS file.\n") + +#endif /* !VLC_COMMON_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_config.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_config.h new file mode 100644 index 0000000..50b4887 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_config.h @@ -0,0 +1,114 @@ +/***************************************************************************** + * vlc_config.h: limits and configuration + * Defines all compilation-time configuration constants and size limits + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines of values used in interface, vout, aout and vlc core functions. + */ + +/* Conventions regarding names of symbols and variables + * ---------------------------------------------------- + * + * - Symbols should begin with a prefix indicating in which module they are + * used, such as INTF_, VOUT_ or AOUT_. + */ + +/***************************************************************************** + * General configuration + *****************************************************************************/ + +/* All timestamp below or equal to this define are invalid/unset + * XXX the numerical value is 0 because of historical reason and will change.*/ +#define VLC_TS_INVALID INT64_C(0) +#define VLC_TS_0 INT64_C(1) + +#define CLOCK_FREQ INT64_C(1000000) + +/***************************************************************************** + * Interface configuration + *****************************************************************************/ + +/* Base delay in micro second for interface sleeps */ +#define INTF_IDLE_SLEEP (CLOCK_FREQ/20) + +/***************************************************************************** + * Input thread configuration + *****************************************************************************/ + +/* Used in ErrorThread */ +#define INPUT_IDLE_SLEEP (CLOCK_FREQ/10) + +/* + * General limitations + */ + +/* Duration between the time we receive the data packet, and the time we will + * mark it to be presented */ +#define DEFAULT_PTS_DELAY (3*CLOCK_FREQ/10) + +/***************************************************************************** + * SPU configuration + *****************************************************************************/ + +/* Buffer must avoid arriving more than SPU_MAX_PREPARE_TIME in advanced to + * the SPU */ +#define SPU_MAX_PREPARE_TIME (CLOCK_FREQ/2) + +/***************************************************************************** + * Video configuration + *****************************************************************************/ + +/* + * Default settings for video output threads + */ + +/* Multiplier value for aspect ratio calculation (2^7 * 3^3 * 5^3) */ +#define VOUT_ASPECT_FACTOR 432000 + +/* Maximum width of a scaled source picture - this should be relatively high, + * since higher stream values will result in no display at all. */ +#define VOUT_MAX_WIDTH 4096 + +/* Number of planes in a picture */ +#define VOUT_MAX_PLANES 5 + +/* + * Time settings + */ + +/* Time to sleep when waiting for a buffer (from vout or the video fifo). + * It should be approximately the time needed to perform a complete picture + * loop. Since it only happens when the video heap is full, it does not need + * to be too low, even if it blocks the decoder. */ +#define VOUT_OUTMEM_SLEEP (CLOCK_FREQ/50) + +/* The default video output window title */ +#define VOUT_TITLE "VLC" + +/***************************************************************************** + * Messages and console interfaces configuration + *****************************************************************************/ + +/* Maximal depth of the object tree output by vlc_dumpstructure */ +#define MAX_DUMPSTRUCTURE_DEPTH 100 diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_config_cat.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_config_cat.h new file mode 100644 index 0000000..225e026 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_config_cat.h @@ -0,0 +1,263 @@ +/***************************************************************************** + * vlc_config_cat.h : Definition of configuration categories + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 00d7352f061379bd7eca6cbfea6af347dd5ea0cb $ + * + * Authors: Clément Stenac + * Anil Daoud + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HELP_H +#define VLC_HELP_H 1 +# include + +/* + * First, we need help strings for the General Settings and for the + * Plugins screen + */ +#define MAIN_TITLE N_( "VLC preferences" ) +#define MAIN_HELP N_( \ + "Select \"Advanced Options\" to see all options." ) + +/* Interface */ +#define INTF_TITLE N_("Interface") +#define INTF_HELP N_( "Settings for VLC's interfaces" ) + +#define INTF_GENERAL_HELP N_( "Main interfaces settings" ) + +#define INTF_MAIN_TITLE N_( "Main interfaces" ) +#define INTF_MAIN_HELP N_( "Settings for the main interface" ) + +#define INTF_CONTROL_TITLE N_( "Control interfaces" ) +#define INTF_CONTROL_HELP N_( "Settings for VLC's control interfaces" ) + +#define INTF_HOTKEYS_TITLE N_( "Hotkeys settings" ) +#define INTF_HOTKEYS_HELP N_( "Hotkeys settings" ) + +/* Audio */ +#define AUDIO_TITLE N_( "Audio" ) +#define AUDIO_HELP N_( "Audio settings" ) + +#define AUDIO_GENERAL_HELP N_("General audio settings") + +#define AFILTER_TITLE N_("Filters") +#define AFILTER_HELP N_( "Audio filters are used to process the audio stream." ) + +#define AVISUAL_TITLE N_("Visualizations") +#define AVISUAL_HELP N_( "Audio visualizations" ) + +#define AOUT_TITLE N_( "Output modules" ) +#define AOUT_HELP N_("General settings for audio output modules.") + +#define AMISC_TITLE N_("Miscellaneous") +#define AMISC_HELP N_( "Miscellaneous audio settings and modules." ) + +/* Video */ +#define VIDEO_TITLE N_("Video") +#define VIDEO_HELP N_("Video settings") + +#define VIDEO_GENERAL_HELP N_( "General video settings" ) + +#define _VOUT_TITLE N_("Output modules" ) +#define VOUT_HELP N_("General settings for video output modules.") + +#define VFILTER_TITLE N_("Filters" ) +#define VFILTER_HELP N_("Video filters are used to process the video stream." ) + +#define SUBPIC_TITLE N_( "Subtitles / OSD") +#define SUBPIC_HELP N_( "Settings related to On-Screen-Display,"\ + " subtitles and \"overlay subpictures\"") +/* +#define TEXT_HELP N_( \ + "Use the settings of the \"freetype\" module to choose the font you " \ + "want VLC to use for text rendering (to display subtitles for example).") +*/ +/* Input */ +#define INPUT_TITLE N_( "Input / Codecs" ) +#define INPUT_HELP N_( "Settings for input, demultiplexing, " \ + "decoding and encoding") + +#define ACCESS_TITLE N_( "Access modules" ) +#define ACCESS_HELP N_( \ + "Settings related to the various access methods. " \ + "Common settings you may want to alter are HTTP proxy or " \ + "caching settings." ) + +#define STREAM_FILTER_TITLE N_( "Stream filters" ) +#define STREAM_FILTER_HELP N_( \ + "Stream filters are special modules that allow advanced operations on " \ + "the input side of VLC. Use with care..." ) + +#define DEMUX_TITLE N_("Demuxers") +#define DEMUX_HELP N_( "Demuxers are used to separate audio and video streams." ) + +#define VDEC_TITLE N_( "Video codecs" ) +#define VDEC_HELP N_( "Settings for the video, images or video+audio decoders and encoders." ) + +#define ADEC_TITLE N_( "Audio codecs" ) +#define ADEC_HELP N_( "Settings for the audio-only decoders and encoders." ) + +#define SDEC_TITLE N_( "Subtitle codecs") +#define SDEC_HELP N_( "Settings for subtitle, teletext and CC decoders and encoders." ) + +#define ADVANCED_HELP N_( "General input settings. Use with care..." ) + +/* Sout */ +#define SOUT_TITLE N_( "Stream output" ) +#define SOUT_HELP N_( \ + "Stream output settings are used when acting as a streaming server " \ + "or when saving incoming streams.\n" \ + "Streams are first muxed and then sent through an \"access output\" "\ + "module that can either save the stream to a file, or stream " \ + "it (UDP, HTTP, RTP/RTSP).\n" \ + "Sout streams modules allow advanced stream processing (transcoding, "\ + "duplicating...).") + +#define SOUT_GENERAL_HELP N_( "General stream output settings") + +#define SOUT_MUX_TITLE N_( "Muxers" ) +#define SOUT_MUX_HELP N_( \ + "Muxers create the encapsulation formats that are used to " \ + "put all the elementary streams (video, audio, ...) " \ + "together. This setting allows you to always force a specific muxer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each muxer." ) + +#define SOUT_ACO_TITLE N_( "Access output" ) +#define SOUT_ACO_HELP N_( \ + "Access output modules control the ways the muxed streams are sent. " \ + "This setting allows you to always force a specific access output method. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each access output.") + +#define SOUT_PACKET_TITLE N_( "Packetizers" ) +#define SOUT_PACKET_HELP N_( \ + "Packetizers are used to \"preprocess\" the elementary "\ + "streams before muxing. " \ + "This setting allows you to always force a packetizer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each packetizer." ) + +#define SOUT_STREAM_TITLE N_("Sout stream") +#define SOUT_STREAM_HELP N_( "Sout stream modules allow to build a sout " \ + "processing chain. Please refer to the Streaming Howto for " \ + "more information. You can configure default options for " \ + "each sout stream module here.") + +#define SOUT_VOD_TITLE N_( "VOD" ) +#define SOUT_VOD_HELP N_( "VLC's implementation of Video On Demand" ) + + +/* Playlist */ +#define PLAYLIST_TITLE N_( "Playlist" ) +#define PLAYLIST_HELP N_( "Settings related to playlist behaviour " \ + "(e.g. playback mode) and to modules that automatically add "\ + "items to the playlist (\"service discovery\" modules).") + +#define PGENERAL_HELP N_( "General playlist behaviour") +#define SD_TITLE N_("Services discovery") +#define SD_HELP N_("Services discovery modules are facilities "\ + "that automatically add items to playlist.") + +/* Advanced */ +#define AADVANCED_TITLE N_( "Advanced" ) +#define AADVANCED_HELP N_( "Advanced settings. Use with care...") + +#define MISC_TITLE N_( "Advanced settings" ) + +/* This function is deprecated and is kept only for compatibility */ +static const struct config_category_t categories_array[] = +{ + /* Interface */ + { CAT_INTERFACE, INTF_TITLE, INTF_HELP }, + { SUBCAT_INTERFACE_GENERAL, INTF_TITLE, INTF_GENERAL_HELP }, + { SUBCAT_INTERFACE_MAIN, INTF_MAIN_TITLE, INTF_MAIN_HELP }, + { SUBCAT_INTERFACE_CONTROL, INTF_CONTROL_TITLE, INTF_CONTROL_HELP }, + { SUBCAT_INTERFACE_HOTKEYS, INTF_HOTKEYS_TITLE, INTF_HOTKEYS_HELP }, + + { CAT_AUDIO, AUDIO_TITLE, AUDIO_HELP }, + { SUBCAT_AUDIO_GENERAL, AUDIO_TITLE, AUDIO_GENERAL_HELP }, + { SUBCAT_AUDIO_AOUT, AOUT_TITLE, AOUT_HELP }, + { SUBCAT_AUDIO_AFILTER, AFILTER_TITLE, AFILTER_HELP }, + { SUBCAT_AUDIO_VISUAL, AVISUAL_TITLE, AVISUAL_HELP }, + { SUBCAT_AUDIO_MISC, AMISC_TITLE, AMISC_HELP }, + + { CAT_VIDEO, VIDEO_TITLE, VIDEO_HELP }, + { SUBCAT_VIDEO_GENERAL, VIDEO_TITLE, VIDEO_GENERAL_HELP }, + { SUBCAT_VIDEO_VOUT, _VOUT_TITLE, VOUT_HELP }, + { SUBCAT_VIDEO_VFILTER, VFILTER_TITLE, VFILTER_HELP }, + { SUBCAT_VIDEO_SUBPIC, SUBPIC_TITLE, SUBPIC_HELP }, + + { CAT_INPUT, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_GENERAL, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_ACCESS, ACCESS_TITLE, ACCESS_HELP }, + { SUBCAT_INPUT_DEMUX, DEMUX_TITLE, DEMUX_HELP }, + { SUBCAT_INPUT_VCODEC, VDEC_TITLE, VDEC_HELP }, + { SUBCAT_INPUT_ACODEC, ADEC_TITLE, ADEC_HELP }, + { SUBCAT_INPUT_SCODEC, SDEC_TITLE, SDEC_HELP }, + { SUBCAT_INPUT_STREAM_FILTER, STREAM_FILTER_TITLE, STREAM_FILTER_HELP }, + + { CAT_SOUT, SOUT_TITLE, SOUT_HELP }, + { SUBCAT_SOUT_GENERAL, SOUT_TITLE, SOUT_GENERAL_HELP }, + { SUBCAT_SOUT_STREAM, SOUT_STREAM_TITLE, SOUT_STREAM_HELP }, + { SUBCAT_SOUT_MUX, SOUT_MUX_TITLE, SOUT_MUX_HELP }, + { SUBCAT_SOUT_ACO, SOUT_ACO_TITLE, SOUT_ACO_HELP }, + { SUBCAT_SOUT_PACKETIZER, SOUT_PACKET_TITLE, SOUT_PACKET_HELP }, + { SUBCAT_SOUT_VOD, SOUT_VOD_TITLE, SOUT_VOD_HELP }, + + { CAT_PLAYLIST, PLAYLIST_TITLE , PLAYLIST_HELP }, + { SUBCAT_PLAYLIST_GENERAL, PLAYLIST_TITLE, PGENERAL_HELP }, + { SUBCAT_PLAYLIST_SD, SD_TITLE, SD_HELP }, + + { CAT_ADVANCED, AADVANCED_TITLE, AADVANCED_HELP }, + { SUBCAT_ADVANCED_MISC, MISC_TITLE, AADVANCED_HELP }, + + { -1, NULL, NULL } +}; + +VLC_USED +static inline const char *config_CategoryNameGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_name != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_name); + } + i++; + } + return NULL; +} + +VLC_USED +static inline const char *config_CategoryHelpGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_help != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_help); + } + i++; + } + return NULL; +} + +#endif /* VLC_HELP_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_configuration.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_configuration.h new file mode 100644 index 0000000..778e422 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_configuration.h @@ -0,0 +1,234 @@ +/***************************************************************************** + * vlc_configuration.h : configuration management module + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: fe0aba5ca8b9d5bb60afd0ac9027d023b1862f2f $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CONFIGURATION_H +#define VLC_CONFIGURATION_H 1 + +/** + * \file + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + */ + +#include /* for ssize_t */ + +# ifdef __cplusplus +extern "C" { +# endif + +struct config_category_t +{ + int i_id; + const char *psz_name; + const char *psz_help; +}; + +typedef union +{ + char *psz; + int64_t i; + float f; +} module_value_t; + +typedef int (*vlc_string_list_cb)(vlc_object_t *, const char *, + char ***, char ***); +typedef int (*vlc_integer_list_cb)(vlc_object_t *, const char *, + int64_t **, char ***); + +struct module_config_t +{ + uint8_t i_type; /* Configuration type */ + char i_short; /* Optional short option name */ + unsigned b_advanced:1; /* Advanced option */ + unsigned b_internal:1; /* Hidden from prefs and help */ + unsigned b_unsaveable:1; /* Not stored in configuration */ + unsigned b_safe:1; /* Safe in web plugins and playlists */ + unsigned b_removed:1; /* Deprecated */ + + char *psz_type; /* Configuration subtype */ + char *psz_name; /* Option name */ + char *psz_text; /* Short comment on the configuration option */ + char *psz_longtext; /* Long comment on the configuration option */ + + module_value_t value; /* Option value */ + module_value_t orig; + module_value_t min; + module_value_t max; + + /* Values list */ + uint16_t list_count; /* Options list size */ + union + { + char **psz; /* List of possible values for the option */ + int *i; + vlc_string_list_cb psz_cb; + vlc_integer_list_cb i_cb; + } list; + char **list_text; /* Friendly names for list values */ +}; + +/***************************************************************************** + * Prototypes - these methods are used to get, set or manipulate configuration + * data. + *****************************************************************************/ +VLC_API int config_GetType(vlc_object_t *, const char *) VLC_USED; +VLC_API int64_t config_GetInt(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutInt(vlc_object_t *, const char *, int64_t); +VLC_API float config_GetFloat(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutFloat(vlc_object_t *, const char *, float); +VLC_API char * config_GetPsz(vlc_object_t *, const char *) VLC_USED VLC_MALLOC; +VLC_API void config_PutPsz(vlc_object_t *, const char *, const char *); +VLC_API int config_GetIntChoices(vlc_object_t *, const char *, int64_t **, char ***) VLC_USED; +VLC_API int config_GetPszChoices(vlc_object_t *, const char *, char ***, char ***) VLC_USED; + +VLC_API int config_SaveConfigFile( vlc_object_t * ); +#define config_SaveConfigFile(a) config_SaveConfigFile(VLC_OBJECT(a)) + +VLC_API void config_ResetAll( vlc_object_t * ); +#define config_ResetAll(a) config_ResetAll(VLC_OBJECT(a)) + +VLC_API module_config_t * config_FindConfig( vlc_object_t *, const char * ) VLC_USED; +VLC_API char * config_GetDataDir(void) VLC_USED VLC_MALLOC; +VLC_API char *config_GetLibDir(void) VLC_USED; + +typedef enum vlc_userdir +{ + VLC_HOME_DIR, /* User's home */ + VLC_CONFIG_DIR, /* VLC-specific configuration directory */ + VLC_DATA_DIR, /* VLC-specific data directory */ + VLC_CACHE_DIR, /* VLC-specific user cached data directory */ + /* Generic directories (same as XDG) */ + VLC_DESKTOP_DIR=0x80, + VLC_DOWNLOAD_DIR, + VLC_TEMPLATES_DIR, + VLC_PUBLICSHARE_DIR, + VLC_DOCUMENTS_DIR, + VLC_MUSIC_DIR, + VLC_PICTURES_DIR, + VLC_VIDEOS_DIR, +} vlc_userdir_t; + +VLC_API char * config_GetUserDir( vlc_userdir_t ) VLC_USED VLC_MALLOC; + +VLC_API void config_AddIntf( vlc_object_t *, const char * ); +VLC_API void config_RemoveIntf( vlc_object_t *, const char * ); +VLC_API bool config_ExistIntf( vlc_object_t *, const char * ) VLC_USED; + +#define config_GetType(a,b) config_GetType(VLC_OBJECT(a),b) +#define config_GetInt(a,b) config_GetInt(VLC_OBJECT(a),b) +#define config_PutInt(a,b,c) config_PutInt(VLC_OBJECT(a),b,c) +#define config_GetFloat(a,b) config_GetFloat(VLC_OBJECT(a),b) +#define config_PutFloat(a,b,c) config_PutFloat(VLC_OBJECT(a),b,c) +#define config_GetPsz(a,b) config_GetPsz(VLC_OBJECT(a),b) +#define config_PutPsz(a,b,c) config_PutPsz(VLC_OBJECT(a),b,c) + +#define config_AddIntf(a,b) config_AddIntf(VLC_OBJECT(a),b) +#define config_RemoveIntf(a,b) config_RemoveIntf(VLC_OBJECT(a),b) +#define config_ExistIntf(a,b) config_ExistIntf(VLC_OBJECT(a),b) + +/**************************************************************************** + * config_chain_t: + ****************************************************************************/ +struct config_chain_t +{ + config_chain_t *p_next; /**< Pointer on the next config_chain_t element */ + + char *psz_name; /**< Option name */ + char *psz_value; /**< Option value */ +}; + +/** + * This function will + * - create all options in the array ppsz_options (var_Create). + * - parse the given linked list of config_chain_t and set the value (var_Set). + * + * The option names will be created by adding the psz_prefix prefix. + */ +VLC_API void config_ChainParse( vlc_object_t *, const char *psz_prefix, const char *const *ppsz_options, config_chain_t * ); +#define config_ChainParse( a, b, c, d ) config_ChainParse( VLC_OBJECT(a), b, c, d ) + +/** + * This function will parse a configuration string (psz_opts) and + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*} + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API const char *config_ChainParseOptions( config_chain_t **pp_cfg, const char *ppsz_opts ); + +/** + * This function will parse a configuration string (psz_string) and + * - set the module name (*ppsz_name) + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*}[:modulenext{option=*,...}] + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API char *config_ChainCreate( char **ppsz_name, config_chain_t **pp_cfg, const char *psz_string ) VLC_USED VLC_MALLOC; + +/** + * This function will release a linked list of config_chain_t + * (Including the head) + */ +VLC_API void config_ChainDestroy( config_chain_t * ); + +/** + * This function will duplicate a linked list of config_chain_t + */ +VLC_API config_chain_t * config_ChainDuplicate( const config_chain_t * ) VLC_USED VLC_MALLOC; + +/** + * This function will unescape a string in place and will return a pointer on + * the given string. + * No memory is allocated by it (unlike config_StringEscape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The following sequences will be unescaped (only one time): + * \\ \' and \" + */ +VLC_API char * config_StringUnescape( char *psz_string ); + +/** + * This function will escape a string that can be unescaped by + * config_StringUnescape. + * The returned value is allocated by it. You have to free it once you + * do not need it anymore (unlike config_StringUnescape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The escaped characters are ' " and \ + */ +VLC_API char * config_StringEscape( const char *psz_string ) VLC_USED VLC_MALLOC; + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_CONFIGURATION_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_cpu.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_cpu.h new file mode 100644 index 0000000..910900a --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_cpu.h @@ -0,0 +1,198 @@ +/***************************************************************************** + * vlc_cpu.h: CPU capabilities + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file provides CPU features detection. + */ + +#ifndef VLC_CPU_H +# define VLC_CPU_H 1 + +VLC_API unsigned vlc_CPU(void); + +# if defined (__i386__) || defined (__x86_64__) +# define HAVE_FPU 1 +# define VLC_CPU_MMX 0x00000008 +# define VLC_CPU_3dNOW 0x00000010 +# define VLC_CPU_MMXEXT 0x00000020 +# define VLC_CPU_SSE 0x00000040 +# define VLC_CPU_SSE2 0x00000080 +# define VLC_CPU_SSE3 0x00000100 +# define VLC_CPU_SSSE3 0x00000200 +# define VLC_CPU_SSE4_1 0x00000400 +# define VLC_CPU_SSE4_2 0x00000800 +# define VLC_CPU_SSE4A 0x00001000 +# define VLC_CPU_AVX 0x00002000 +# define VLC_CPU_AVX2 0x00004000 +# define VLC_CPU_XOP 0x00008000 +# define VLC_CPU_FMA4 0x00010000 + +# if defined (__MMX__) +# define vlc_CPU_MMX() (1) +# define VLC_MMX +# else +# define vlc_CPU_MMX() ((vlc_CPU() & VLC_CPU_MMX) != 0) +# if VLC_GCC_VERSION(4, 4) || defined(__clang__) +# define VLC_MMX __attribute__ ((__target__ ("mmx"))) +# else +# define VLC_MMX VLC_MMX_is_not_implemented_on_this_compiler +# endif +# endif + +# if defined (__SSE__) +# define vlc_CPU_MMXEXT() (1) +# define vlc_CPU_SSE() (1) +# define VLC_SSE +# else +# define vlc_CPU_MMXEXT() ((vlc_CPU() & VLC_CPU_MMXEXT) != 0) +# define vlc_CPU_SSE() ((vlc_CPU() & VLC_CPU_SSE) != 0) +# if VLC_GCC_VERSION(4, 4) || defined(__clang__) +# define VLC_SSE __attribute__ ((__target__ ("sse"))) +# else +# define VLC_SSE VLC_SSE_is_not_implemented_on_this_compiler +# endif +# endif + +# ifdef __SSE2__ +# define vlc_CPU_SSE2() (1) +# else +# define vlc_CPU_SSE2() ((vlc_CPU() & VLC_CPU_SSE2) != 0) +# endif + +# ifdef __SSE3__ +# define vlc_CPU_SSE3() (1) +# else +# define vlc_CPU_SSE3() ((vlc_CPU() & VLC_CPU_SSE3) != 0) +# endif + +# ifdef __SSSE3__ +# define vlc_CPU_SSSE3() (1) +# else +# define vlc_CPU_SSSE3() ((vlc_CPU() & VLC_CPU_SSSE3) != 0) +# endif + +# ifdef __SSE4_1__ +# define vlc_CPU_SSE4_1() (1) +# else +# define vlc_CPU_SSE4_1() ((vlc_CPU() & VLC_CPU_SSE4_1) != 0) +# endif + +# ifdef __SSE4_2__ +# define vlc_CPU_SSE4_2() (1) +# else +# define vlc_CPU_SSE4_2() ((vlc_CPU() & VLC_CPU_SSE4_2) != 0) +# endif + +# ifdef __SSE4A__ +# define vlc_CPU_SSE4A() (1) +# else +# define vlc_CPU_SSE4A() ((vlc_CPU() & VLC_CPU_SSE4A) != 0) +# endif + +# ifdef __AVX__ +# define vlc_CPU_AVX() (1) +# else +# define vlc_CPU_AVX() ((vlc_CPU() & VLC_CPU_AVX) != 0) +# endif + +# ifdef __AVX2__ +# define vlc_CPU_AVX2() (1) +# else +# define vlc_CPU_AVX2() ((vlc_CPU() & VLC_CPU_AVX2) != 0) +# endif + +# ifdef __3dNOW__ +# define vlc_CPU_3dNOW() (1) +# else +# define vlc_CPU_3dNOW() ((vlc_CPU() & VLC_CPU_3dNOW) != 0) +# endif + +# ifdef __XOP__ +# define vlc_CPU_XOP() (1) +# else +# define vlc_CPU_XOP() ((vlc_CPU() & VLC_CPU_XOP) != 0) +# endif + +# ifdef __FMA4__ +# define vlc_CPU_FMA4() (1) +# else +# define vlc_CPU_FMA4() ((vlc_CPU() & VLC_CPU_FMA4) != 0) +# endif + +# elif defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__) +# define HAVE_FPU 1 +# define VLC_CPU_ALTIVEC 2 + +# ifdef ALTIVEC +# define vlc_CPU_ALTIVEC() (1) +# else +# define vlc_CPU_ALTIVEC() ((vlc_CPU() & VLC_CPU_ALTIVEC) != 0) +# endif + +# elif defined (__arm__) +# if defined (__VFP_FP__) && !defined (__SOFTFP__) +# define HAVE_FPU 1 +# else +# define HAVE_FPU 0 +# endif +# define VLC_CPU_ARMv6 4 +# define VLC_CPU_ARM_NEON 2 + +# if defined (__ARM_ARCH_7A__) +# define VLC_CPU_ARM_ARCH 7 +# elif defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6T2__) +# define VLC_CPU_ARM_ARCH 6 +# else +# define VLC_CPU_ARM_ARCH 4 +# endif + +# if (VLC_CPU_ARM_ARCH >= 6) +# define vlc_CPU_ARMv6() (1) +# else +# define vlc_CPU_ARMv6() ((vlc_CPU() & VLC_CPU_ARMv6) != 0) +# endif + +# ifdef __ARM_NEON__ +# define vlc_CPU_ARM_NEON() (1) +# else +# define vlc_CPU_ARM_NEON() ((vlc_CPU() & VLC_CPU_ARM_NEON) != 0) +# endif + +# elif defined (__aarch64__) +# define HAVE_FPU 1 + +# elif defined (__sparc__) +# define HAVE_FPU 1 + +# elif defined (__mips_hard_float) +# define HAVE_FPU 1 + +# else +/** + * Are single precision floating point operations "fast"? + * If this preprocessor constant is zero, floating point should be avoided + * (especially relevant for audio codecs). + */ +# define HAVE_FPU 0 + +# endif + +#endif /* !VLC_CPU_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_demux.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_demux.h new file mode 100644 index 0000000..4cd49ce --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_demux.h @@ -0,0 +1,256 @@ +/***************************************************************************** + * vlc_demux.h: Demuxer descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2005 VLC authors and VideoLAN + * $Id: 0dcee0dffe2ac9dafdc9fe8fd5fa363a64cb85e1 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DEMUX_H +#define VLC_DEMUX_H 1 + +/** + * \file + * This files defines functions and structures used by demux objects in vlc + */ + +#include +#include +#include + +/** + * \defgroup demux Demux + * @{ + */ + +struct demux_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* eg informative but needed (we can have access+demux) */ + char *psz_access; + char *psz_demux; + char *psz_location; + char *psz_file; + + /* input stream */ + stream_t *s; /* NULL in case of a access+demux in one */ + + /* es output */ + es_out_t *out; /* our p_es_out */ + + /* set by demuxer */ + int (*pf_demux) ( demux_t * ); /* demux one frame only */ + int (*pf_control)( demux_t *, int i_query, va_list args); + + /* Demux has to maintain them uptodate + * when it is responsible of seekpoint/title */ + struct + { + unsigned int i_update; /* Demux sets them on change, + Input removes them once take into account*/ + /* Seekpoint/Title at demux level */ + int i_title; /* idem, start from 0 (could be menu) */ + int i_seekpoint; /* idem, start from 0 */ + } info; + demux_sys_t *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/* demux_t.info.i_update field */ +#define INPUT_UPDATE_TITLE 0x0010 +#define INPUT_UPDATE_SEEKPOINT 0x0020 +#define INPUT_UPDATE_META 0x0040 +#define INPUT_UPDATE_TITLE_LIST 0x0100 + +/* demux_meta_t is returned by "meta reader" module to the demuxer */ +typedef struct demux_meta_t +{ + VLC_COMMON_MEMBERS + demux_t *p_demux; /** FIXME: use stream_t instead? */ + input_item_t *p_item; /***< the input item that is being read */ + + vlc_meta_t *p_meta; /**< meta data */ + + int i_attachments; /**< number of attachments */ + input_attachment_t **attachments; /**< array of attachments */ +} demux_meta_t; + +enum demux_query_e +{ + /* I. Common queries to access_demux and demux */ + /* POSITION double between 0.0 and 1.0 */ + DEMUX_GET_POSITION, /* arg1= double * res= */ + DEMUX_SET_POSITION, /* arg1= double arg2= bool b_precise res=can fail */ + + /* LENGTH/TIME in microsecond, 0 if unknown */ + DEMUX_GET_LENGTH, /* arg1= int64_t * res= */ + DEMUX_GET_TIME, /* arg1= int64_t * res= */ + DEMUX_SET_TIME, /* arg1= int64_t arg2= bool b_precise res=can fail */ + + /* TITLE_INFO only if more than 1 title or 1 chapter */ + DEMUX_GET_TITLE_INFO, /* arg1=input_title_t*** arg2=int* + arg3=int*pi_title_offset(0), arg4=int*pi_seekpoint_offset(0) can fail */ + /* TITLE/SEEKPOINT, only when TITLE_INFO succeed */ + DEMUX_SET_TITLE, /* arg1= int can fail */ + DEMUX_SET_SEEKPOINT, /* arg1= int can fail */ + + /* DEMUX_SET_GROUP/SET_ES only a hint for demuxer (mainly DVB) to allow not + * reading everything (you should not use this to call es_out_Control) + * if you don't know what to do with it, just IGNORE it, it is safe(r) + * -1 means all group, 0 default group (first es added) */ + DEMUX_SET_GROUP, /* arg1= int, arg2=const vlc_list_t * can fail */ + DEMUX_SET_ES, /* arg1= int can fail */ + + /* Ask the demux to demux until the given date at the next pf_demux call + * but not more (and not less, at the precision available of course). + * XXX: not mandatory (except for subtitle demux) but will help a lot + * for multi-input + */ + DEMUX_SET_NEXT_DEMUX_TIME, /* arg1= int64_t can fail */ + /* FPS for correct subtitles handling */ + DEMUX_GET_FPS, /* arg1= double * res=can fail */ + + /* Meta data */ + DEMUX_GET_META, /* arg1= vlc_meta_t ** res=can fail */ + DEMUX_HAS_UNSUPPORTED_META, /* arg1= bool * res can fail */ + + /* Attachments */ + DEMUX_GET_ATTACHMENTS, /* arg1=input_attachment_t***, int* res=can fail */ + + /* RECORD you are ensured that it is never called twice with the same state + * you should accept it only if the stream can be recorded without + * any modification or header addition. */ + DEMUX_CAN_RECORD, /* arg1=bool* res=can fail(assume false) */ + DEMUX_SET_RECORD_STATE, /* arg1=bool res=can fail */ + + DEMUX_GET_SIGNAL, /* arg1=double *pf_quality, arg2=double *pf_strength + res=can fail */ + + /* II. Specific access_demux queries */ + /* PAUSE you are ensured that it is never called twice with the same state */ + DEMUX_CAN_PAUSE = 0x1000, /* arg1= bool* can fail (assume false)*/ + DEMUX_SET_PAUSE_STATE, /* arg1= bool can fail */ + + DEMUX_GET_PTS_DELAY, /* arg1= int64_t* cannot fail */ + + /* DEMUX_CAN_CONTROL_PACE returns true (*pb_pace) if we can read the + * data at our pace */ + DEMUX_CAN_CONTROL_PACE, /* arg1= bool*pb_pace can fail (assume false) */ + + /* DEMUX_CAN_CONTROL_RATE is called only if DEMUX_CAN_CONTROL_PACE has returned false. + * *pb_rate should be true when the rate can be changed (using DEMUX_SET_RATE) + * *pb_ts_rescale should be true when the timestamps (pts/dts/pcr) have to be rescaled */ + DEMUX_CAN_CONTROL_RATE, /* arg1= bool*pb_rate arg2= bool*pb_ts_rescale can fail(assume false) */ + /* DEMUX_SET_RATE is called only if DEMUX_CAN_CONTROL_RATE has returned true. + * It should return the value really used in *pi_rate */ + DEMUX_SET_RATE, /* arg1= int*pi_rate can fail */ + + DEMUX_CAN_SEEK, /* arg1= bool* can fail (assume false)*/ + + /* Navigation */ + DEMUX_NAV_ACTIVATE, /* res=can fail */ + DEMUX_NAV_UP, /* res=can fail */ + DEMUX_NAV_DOWN, /* res=can fail */ + DEMUX_NAV_LEFT, /* res=can fail */ + DEMUX_NAV_RIGHT, /* res=can fail */ +}; + +VLC_API int demux_vaControlHelper( stream_t *, int64_t i_start, int64_t i_end, int64_t i_bitrate, int i_align, int i_query, va_list args ); + +static inline void demux_UpdateTitleFromStream( demux_t *demux ) +{ + stream_t *s = demux->s; + unsigned title, seekpoint; + + if( stream_Control( s, STREAM_GET_TITLE, &title ) == VLC_SUCCESS + && title != (unsigned)demux->info.i_title ) + { + demux->info.i_title = title; + demux->info.i_update |= INPUT_UPDATE_TITLE; + } + + if( stream_Control( s, STREAM_GET_SEEKPOINT, &seekpoint ) == VLC_SUCCESS + && seekpoint != (unsigned)demux->info.i_seekpoint ) + { + demux->info.i_seekpoint = seekpoint; + demux->info.i_update |= INPUT_UPDATE_SEEKPOINT; + } +} + +/************************************************************************* + * Miscellaneous helpers for demuxers + *************************************************************************/ + +VLC_USED +static inline bool demux_IsPathExtension( demux_t *p_demux, const char *psz_extension ) +{ + const char *name = (p_demux->psz_file != NULL) ? p_demux->psz_file + : p_demux->psz_location; + const char *psz_ext = strrchr ( name, '.' ); + if( !psz_ext || strcasecmp( psz_ext, psz_extension ) ) + return false; + return true; +} + +VLC_USED +static inline bool demux_IsForced( demux_t *p_demux, const char *psz_name ) +{ + if( !p_demux->psz_demux || strcmp( p_demux->psz_demux, psz_name ) ) + return false; + return true; +} + +/** + * This function will create a packetizer suitable for a demuxer that parses + * elementary stream. + * + * The provided es_format_t will be cleaned on error or by + * demux_PacketizerDestroy. + */ +VLC_API decoder_t * demux_PacketizerNew( demux_t *p_demux, es_format_t *p_fmt, const char *psz_msg ) VLC_USED; + +/** + * This function will destroy a packetizer create by demux_PacketizerNew. + */ +VLC_API void demux_PacketizerDestroy( decoder_t *p_packetizer ); + +/** + * This function will return the parent input of this demux. + * It is retained. Can return NULL. + */ +VLC_API input_thread_t * demux_GetParentInput( demux_t *p_demux ) VLC_USED; + +/* */ +#define DEMUX_INIT_COMMON() do { \ + p_demux->pf_control = Control; \ + p_demux->pf_demux = Demux; \ + p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) ); \ + if( !p_demux->p_sys ) return VLC_ENOMEM;\ + } while(0) + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_dialog.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_dialog.h new file mode 100644 index 0000000..168bea4 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_dialog.h @@ -0,0 +1,124 @@ +/***************************************************************************** + * vlc_dialog.h: user interaction dialogs + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DIALOG_H_ +#define VLC_DIALOG_H_ +# include + +/** + * \file vlc_dialog.h + * User interaction dialog APIs + */ + +/** + * A fatal error dialog. + * No response expected from the user. + */ +typedef struct dialog_fatal_t +{ + const char *title; + const char *message; +} dialog_fatal_t; + +VLC_API void dialog_VFatal(vlc_object_t *, bool, const char *, const char *, va_list); + +static inline VLC_FORMAT(3, 4) +void dialog_Fatal (vlc_object_t *obj, const char *title, const char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + dialog_VFatal(obj, false, title, fmt, ap); + va_end (ap); +} +#define dialog_Fatal(o, t, ...) \ + dialog_Fatal(VLC_OBJECT(o), t, __VA_ARGS__) + +static inline VLC_FORMAT(3, 4) +void dialog_FatalWait (vlc_object_t *obj, const char *title, + const char *fmt, ...){ + va_list ap; + + va_start (ap, fmt); + dialog_VFatal(obj, true, title, fmt, ap); + va_end (ap); +} +#define dialog_FatalWait(o, t, ...) \ + dialog_FatalWait(VLC_OBJECT(o), t, __VA_ARGS__) + +/** + * A login dialog. + */ +typedef struct dialog_login_t +{ + const char *title; + const char *message; + char **username; + char **password; +} dialog_login_t; + +VLC_API void dialog_Login(vlc_object_t *, char **, char **, const char *, const char *, ...) VLC_FORMAT (5, 6); +#define dialog_Login(o, u, p, t, ...) \ + dialog_Login(VLC_OBJECT(o), u, p, t, __VA_ARGS__) + +/** + * A question dialog. + */ +typedef struct dialog_question_t +{ + const char *title; + const char *message; + const char *yes; + const char *no; + const char *cancel; + int answer; +} dialog_question_t; + +VLC_API int dialog_Question(vlc_object_t *, const char *, const char *, + const char *, const char *, const char *, ...) +VLC_FORMAT(3, 7); +#define dialog_Question(o, t, m, y, n, ...) \ + dialog_Question(VLC_OBJECT(o), t, m, y, n, __VA_ARGS__) + +typedef struct dialog_progress_bar_t +{ /* Request-time parameters */ + const char *title; + const char *message; + const char *cancel; + /* Permanent parameters */ + void (*pf_update) (void *, const char *, float); + bool (*pf_check) (void *); + void (*pf_destroy) (void *); + void *p_sys; +} dialog_progress_bar_t; + +VLC_API dialog_progress_bar_t * dialog_ProgressCreate(vlc_object_t *, const char *, const char *, const char *) VLC_USED; +#define dialog_ProgressCreate(o, t, m, c) \ + dialog_ProgressCreate(VLC_OBJECT(o), t, m, c) +VLC_API void dialog_ProgressDestroy(dialog_progress_bar_t *); +VLC_API void dialog_ProgressSet(dialog_progress_bar_t *, const char *, float); +VLC_API bool dialog_ProgressCancelled(dialog_progress_bar_t *); + +VLC_API int dialog_Register(vlc_object_t *); +VLC_API int dialog_Unregister(vlc_object_t *); +#define dialog_Register(o) dialog_Register(VLC_OBJECT(o)) +#define dialog_Unregister(o) dialog_Unregister(VLC_OBJECT(o)) + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_epg.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_epg.h new file mode 100644 index 0000000..2ae770f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_epg.h @@ -0,0 +1,97 @@ +/***************************************************************************** + * vlc_epg.h: Electronic Program Guide + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: c0fd0f559ac3bb7ed6201889dcda998ebff3a413 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EPG_H +#define VLC_EPG_H 1 + +/** + * \file + * This file defines functions and structures for storing dvb epg information + */ + +typedef struct +{ + int64_t i_start; /* Interpreted as a value return by time() */ + int i_duration; /* Duration of the event in second */ + + char *psz_name; + char *psz_short_description; + char *psz_description; + + uint8_t i_rating; /* Parental control, set to 0 when undefined */ +} vlc_epg_event_t; + +typedef struct +{ + char *psz_name; + vlc_epg_event_t *p_current; /* Can be null or should be the same than one of pp_event entry */ + + int i_event; + vlc_epg_event_t **pp_event; +} vlc_epg_t; + +/** + * It initializes a vlc_epg_t. + * + * You must call vlc_epg_Clean to release the associated resource. + */ +VLC_API void vlc_epg_Init(vlc_epg_t *p_epg, const char *psz_name); + +/** + * It releases all resources associated to a vlc_epg_t + */ +VLC_API void vlc_epg_Clean(vlc_epg_t *p_epg); + +/** + * It creates and appends a new vlc_epg_event_t to a vlc_epg_t. + * + * \see vlc_epg_t for the definitions of the parameters. + */ +VLC_API void vlc_epg_AddEvent(vlc_epg_t *p_epg, int64_t i_start, int i_duration, const char *psz_name, const char *psz_short_description, const char *psz_description, uint8_t i_rating ); + +/** + * It creates a new vlc_epg_t* + * + * You must call vlc_epg_Delete to release the associated resource. + */ +VLC_API vlc_epg_t * vlc_epg_New(const char *psz_name) VLC_USED; + +/** + * It releases a vlc_epg_t*. + */ +VLC_API void vlc_epg_Delete(vlc_epg_t *p_epg); + +/** + * It set the current event of a vlc_epg_t given a start time + */ +VLC_API void vlc_epg_SetCurrent(vlc_epg_t *p_epg, int64_t i_start); + +/** + * It merges all the event of \p p_src and \p p_dst into \p p_dst. + * + * \p p_src is not modified. + */ +VLC_API void vlc_epg_Merge(vlc_epg_t *p_dst, const vlc_epg_t *p_src); + +#endif + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_es.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_es.h new file mode 100644 index 0000000..e131c73 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_es.h @@ -0,0 +1,468 @@ +/***************************************************************************** + * vlc_es.h: Elementary stream formats descriptions + ***************************************************************************** + * Copyright (C) 1999-2012 VLC authors and VideoLAN + * $Id: 8db588494350b40b0f9225df00234f44189c5072 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_H +#define VLC_ES_H 1 + +#include +#include + +/** + * \file + * This file defines the elementary streams format types + */ + +/** + * video palette data + * \see video_format_t + * \see subs_format_t + */ +#define VIDEO_PALETTE_COLORS_MAX 256 + +struct video_palette_t +{ + int i_entries; /**< to keep the compatibility with libavcodec's palette */ + uint8_t palette[VIDEO_PALETTE_COLORS_MAX][4]; /**< 4-byte RGBA/YUVA palette */ +}; + +/** + * audio replay gain description + */ +#define AUDIO_REPLAY_GAIN_MAX (2) +#define AUDIO_REPLAY_GAIN_TRACK (0) +#define AUDIO_REPLAY_GAIN_ALBUM (1) +typedef struct +{ + /* true if we have the peak value */ + bool pb_peak[AUDIO_REPLAY_GAIN_MAX]; + /* peak value where 1.0 means full sample value */ + float pf_peak[AUDIO_REPLAY_GAIN_MAX]; + + /* true if we have the gain value */ + bool pb_gain[AUDIO_REPLAY_GAIN_MAX]; + /* gain value in dB */ + float pf_gain[AUDIO_REPLAY_GAIN_MAX]; +} audio_replay_gain_t; + +/** + * audio format description + */ +struct audio_format_t +{ + vlc_fourcc_t i_format; /**< audio format fourcc */ + unsigned int i_rate; /**< audio sample-rate */ + + /* Describes the channels configuration of the samples (ie. number of + * channels which are available in the buffer, and positions). */ + uint16_t i_physical_channels; + + /* Describes from which original channels, before downmixing, the + * buffer is derived. */ + uint32_t i_original_channels; + + /* Optional - for A/52, SPDIF and DTS types : */ + /* Bytes used by one compressed frame, depends on bitrate. */ + unsigned int i_bytes_per_frame; + + /* Number of sampleframes contained in one compressed frame. */ + unsigned int i_frame_length; + /* Please note that it may be completely arbitrary - buffers are not + * obliged to contain a integral number of so-called "frames". It's + * just here for the division : + * buffer_size = i_nb_samples * i_bytes_per_frame / i_frame_length + */ + + /* FIXME ? (used by the codecs) */ + unsigned i_bitspersample; + unsigned i_blockalign; + uint8_t i_channels; /* must be <=32 */ +}; + +/* Values available for audio channels */ +#define AOUT_CHAN_CENTER 0x1 +#define AOUT_CHAN_LEFT 0x2 +#define AOUT_CHAN_RIGHT 0x4 +#define AOUT_CHAN_REARCENTER 0x10 +#define AOUT_CHAN_REARLEFT 0x20 +#define AOUT_CHAN_REARRIGHT 0x40 +#define AOUT_CHAN_MIDDLELEFT 0x100 +#define AOUT_CHAN_MIDDLERIGHT 0x200 +#define AOUT_CHAN_LFE 0x1000 + +#define AOUT_CHANS_FRONT (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT) +#define AOUT_CHANS_MIDDLE (AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT) +#define AOUT_CHANS_REAR (AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT) +#define AOUT_CHANS_CENTER (AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_STEREO AOUT_CHANS_2_0 +#define AOUT_CHANS_2_0 (AOUT_CHANS_FRONT) +#define AOUT_CHANS_2_1 (AOUT_CHANS_FRONT | AOUT_CHAN_LFE) +#define AOUT_CHANS_3_0 (AOUT_CHANS_FRONT | AOUT_CHAN_CENTER) +#define AOUT_CHANS_3_1 (AOUT_CHANS_3_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_4_0 (AOUT_CHANS_FRONT | AOUT_CHANS_REAR) +#define AOUT_CHANS_4_1 (AOUT_CHANS_4_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_5_0 (AOUT_CHANS_4_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_5_1 (AOUT_CHANS_5_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_6_0 (AOUT_CHANS_4_0 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_7_0 (AOUT_CHANS_6_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_7_1 (AOUT_CHANS_5_1 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_8_1 (AOUT_CHANS_7_1 | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_4_0_MIDDLE (AOUT_CHANS_FRONT | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_4_CENTER_REAR (AOUT_CHANS_FRONT | AOUT_CHANS_CENTER) +#define AOUT_CHANS_5_0_MIDDLE (AOUT_CHANS_4_0_MIDDLE | AOUT_CHAN_CENTER) +#define AOUT_CHANS_6_1_MIDDLE (AOUT_CHANS_5_0_MIDDLE | AOUT_CHAN_REARCENTER | AOUT_CHAN_LFE) + +/* Values available for original channels only */ +#define AOUT_CHAN_DOLBYSTEREO 0x10000 +#define AOUT_CHAN_DUALMONO 0x20000 +#define AOUT_CHAN_REVERSESTEREO 0x40000 + +#define AOUT_CHAN_PHYSMASK 0xFFFF +#define AOUT_CHAN_MAX 9 + +/** + * Picture orientation. + */ +typedef enum video_orientation_t +{ + ORIENT_TOP_LEFT = 0, /**< Top line represents top, left column left. */ + ORIENT_TOP_RIGHT, /**< Flipped horizontally */ + ORIENT_BOTTOM_LEFT, /**< Flipped vertically */ + ORIENT_BOTTOM_RIGHT, /**< Rotated 180 degrees */ + ORIENT_LEFT_TOP, /**< Transposed */ + ORIENT_LEFT_BOTTOM, /**< Rotated 90 degrees clockwise */ + ORIENT_RIGHT_TOP, /**< Rotated 90 degrees anti-clockwise */ + ORIENT_RIGHT_BOTTOM, /**< Anti-transposed */ + + ORIENT_NORMAL = ORIENT_TOP_LEFT, + ORIENT_TRANSPOSED = ORIENT_LEFT_TOP, + ORIENT_ANTI_TRANSPOSED = ORIENT_RIGHT_BOTTOM, + ORIENT_HFLIPPED = ORIENT_TOP_RIGHT, + ORIENT_VFLIPPED = ORIENT_BOTTOM_LEFT, + ORIENT_ROTATED_180 = ORIENT_BOTTOM_RIGHT, + ORIENT_ROTATED_270 = ORIENT_LEFT_BOTTOM, + ORIENT_ROTATED_90 = ORIENT_RIGHT_TOP, +} video_orientation_t; +/** Convert EXIF orientation to enum video_orientation_t */ +#define ORIENT_FROM_EXIF(exif) ((0x01324675U >> (4 * ((exif) - 1))) & 7) +/** Convert enum video_orientation_t to EXIF */ +#define ORIENT_TO_EXIF(orient) ((0x12435867U >> (4 * (orient))) & 15) +/** If the orientation is natural or mirrored */ +#define ORIENT_IS_MIRROR(orient) parity(orient) +/** If the orientation swaps dimensions */ +#define ORIENT_IS_SWAP(orient) (((orient) & 4) != 0) +/** Applies horizontal flip to an orientation */ +#define ORIENT_HFLIP(orient) ((orient) ^ 1) +/** Applies vertical flip to an orientation */ +#define ORIENT_VFLIP(orient) ((orient) ^ 2) +/** Applies horizontal flip to an orientation */ +#define ORIENT_ROTATE_180(orient) ((orient) ^ 3) + +typedef enum video_transform_t +{ + TRANSFORM_IDENTITY = ORIENT_NORMAL, + TRANSFORM_HFLIP = ORIENT_HFLIPPED, + TRANSFORM_VFLIP = ORIENT_VFLIPPED, + TRANSFORM_R180 = ORIENT_ROTATED_180, + TRANSFORM_R270 = ORIENT_ROTATED_270, + TRANSFORM_R90 = ORIENT_ROTATED_90, + TRANSFORM_TRANSPOSE = ORIENT_TRANSPOSED, + TRANSFORM_ANTI_TRANSPOSE = ORIENT_ANTI_TRANSPOSED +} video_transform_t; + +/** + * video format description + */ +struct video_format_t +{ + vlc_fourcc_t i_chroma; /**< picture chroma */ + + unsigned int i_width; /**< picture width */ + unsigned int i_height; /**< picture height */ + unsigned int i_x_offset; /**< start offset of visible area */ + unsigned int i_y_offset; /**< start offset of visible area */ + unsigned int i_visible_width; /**< width of visible area */ + unsigned int i_visible_height; /**< height of visible area */ + + unsigned int i_bits_per_pixel; /**< number of bits per pixel */ + + unsigned int i_sar_num; /**< sample/pixel aspect ratio */ + unsigned int i_sar_den; + + unsigned int i_frame_rate; /**< frame rate numerator */ + unsigned int i_frame_rate_base; /**< frame rate denominator */ + + uint32_t i_rmask, i_gmask, i_bmask; /**< color masks for RGB chroma */ + int i_rrshift, i_lrshift; + int i_rgshift, i_lgshift; + int i_rbshift, i_lbshift; + video_palette_t *p_palette; /**< video palette from demuxer */ + video_orientation_t orientation; /**< picture orientation */ +}; + +/** + * Initialize a video_format_t structure with chroma 'i_chroma' + * \param p_src pointer to video_format_t structure + * \param i_chroma chroma value to use + */ +static inline void video_format_Init( video_format_t *p_src, vlc_fourcc_t i_chroma ) +{ + memset( p_src, 0, sizeof( video_format_t ) ); + p_src->i_chroma = i_chroma; + p_src->i_sar_num = p_src->i_sar_den = 1; + p_src->p_palette = NULL; +} + +/** + * Copy video_format_t including the palette + * \param p_dst video_format_t to copy to + * \param p_src video_format_t to copy from + */ +static inline int video_format_Copy( video_format_t *p_dst, const video_format_t *p_src ) +{ + memcpy( p_dst, p_src, sizeof( *p_dst ) ); + if( p_src->p_palette ) + { + p_dst->p_palette = (video_palette_t *) malloc( sizeof( video_palette_t ) ); + if( !p_dst->p_palette ) + return VLC_ENOMEM; + memcpy( p_dst->p_palette, p_src->p_palette, sizeof( *p_dst->p_palette ) ); + } + return VLC_SUCCESS; +} + +/** + * Cleanup and free palette of this video_format_t + * \param p_src video_format_t structure to clean + */ +static inline void video_format_Clean( video_format_t *p_src ) +{ + free( p_src->p_palette ); + memset( p_src, 0, sizeof( video_format_t ) ); + p_src->p_palette = NULL; +} + +/** + * It will fill up a video_format_t using the given arguments. + * Note that the video_format_t must already be initialized. + */ +VLC_API void video_format_Setup( video_format_t *, vlc_fourcc_t i_chroma, + int i_width, int i_height, int i_visible_width, int i_visible_height, + int i_sar_num, int i_sar_den ); + +/** + * It will copy the crop properties from a video_format_t to another. + */ +VLC_API void video_format_CopyCrop( video_format_t *, const video_format_t * ); + +/** + * It will compute the crop/ar properties when scaling. + */ +VLC_API void video_format_ScaleCropAr( video_format_t *, const video_format_t * ); + +/** + * This function "normalizes" the formats orientation, by switching the a/r according to the orientation, + * producing a format whose orientation is ORIENT_NORMAL. It makes a shallow copy (pallette is not alloc'ed). + */ +VLC_API void video_format_ApplyRotation(video_format_t * /*restrict*/ out, + const video_format_t *in); + +/** + * This function applies the transform operation to fmt. + */ +VLC_API void video_format_TransformBy(video_format_t *fmt, video_transform_t transform); + +/** + * This function applies the transforms necessary to fmt so that the resulting fmt + * has the dst_orientation. + */ +VLC_API void video_format_TransformTo(video_format_t *fmt, video_orientation_t dst_orientation); + +/** + * Returns the operation required to transform src into dst. + */ +VLC_API video_transform_t video_format_GetTransform(video_orientation_t src, video_orientation_t dst); + +/** + * This function will check if the first video format is similar + * to the second one. + */ +VLC_API bool video_format_IsSimilar( const video_format_t *, const video_format_t * ); + +/** + * It prints details about the given video_format_t + */ +VLC_API void video_format_Print( vlc_object_t *, const char *, const video_format_t * ); + + +static inline video_transform_t transform_Inverse( video_transform_t transform ) +{ + switch ( transform ) { + case TRANSFORM_R90: + return TRANSFORM_R270; + case TRANSFORM_R270: + return TRANSFORM_R90; + default: + return transform; + } +} +/** + * subtitles format description + */ +struct subs_format_t +{ + /* the character encoding of the text of the subtitle. + * all gettext recognized shorts can be used */ + char *psz_encoding; + + + int i_x_origin; /**< x coordinate of the subtitle. 0 = left */ + int i_y_origin; /**< y coordinate of the subtitle. 0 = top */ + + struct + { + /* */ + uint32_t palette[16+1]; + + /* the width of the original movie the spu was extracted from */ + int i_original_frame_width; + /* the height of the original movie the spu was extracted from */ + int i_original_frame_height; + } spu; + + struct + { + int i_id; + } dvb; + struct + { + int i_magazine; + int i_page; + } teletext; + + text_style_t *p_style; /* Default styles to use */ +}; + +/** + * ES language definition + */ +typedef struct extra_languages_t +{ + char *psz_language; + char *psz_description; +} extra_languages_t; + +/** + * ES format definition + */ +#define ES_PRIORITY_NOT_SELECTABLE -2 +#define ES_PRIORITY_NOT_DEFAULTABLE -1 +#define ES_PRIORITY_SELECTABLE_MIN 0 +#define ES_PRIORITY_MIN ES_PRIORITY_NOT_SELECTABLE +struct es_format_t +{ + int i_cat; /**< ES category @see es_format_category_e */ + vlc_fourcc_t i_codec; /**< FOURCC value as used in vlc */ + vlc_fourcc_t i_original_fourcc; /**< original FOURCC from the container */ + + int i_id; /**< es identifier, where means + -1: let the core mark the right id + >=0: valid id */ + int i_group; /**< group identifier, where means: + -1 : standalone + >= 0 then a "group" (program) is created + for each value */ + int i_priority; /**< priority, where means: + -2 : mean not selectable by the users + -1 : mean not selected by default even + when no other stream + >=0: priority */ + + char *psz_language; /**< human readible language name */ + char *psz_description; /**< human readible description of language */ + int i_extra_languages; /**< length in bytes of extra language data pointer */ + extra_languages_t *p_extra_languages; /**< extra language data needed by some decoders */ + + audio_format_t audio; /**< description of audio format */ + audio_replay_gain_t audio_replay_gain; /*< audio replay gain information */ + video_format_t video; /**< description of video format */ + subs_format_t subs; /**< description of subtitle format */ + + unsigned int i_bitrate; /**< bitrate of this ES */ + int i_profile; /**< codec specific information (like real audio flavor, mpeg audio layer, h264 profile ...) */ + int i_level; /**< codec specific information: indicates maximum restrictions on the stream (resolution, bitrate, codec features ...) */ + + bool b_packetized; /**< whether the data is packetized (ie. not truncated) */ + int i_extra; /**< length in bytes of extra data pointer */ + void *p_extra; /**< extra data needed by some decoders or muxers */ + +}; + +/** ES Categories */ +enum es_format_category_e +{ + UNKNOWN_ES = 0x00, + VIDEO_ES, + AUDIO_ES, + SPU_ES, + NAV_ES, +}; +#define ES_CATEGORY_COUNT (NAV_ES + 1) + +/** + * This function will fill all RGB shift from RGB masks. + */ +VLC_API void video_format_FixRgb( video_format_t * ); + +/** + * This function will initialize a es_format_t structure. + */ +VLC_API void es_format_Init( es_format_t *, int i_cat, vlc_fourcc_t i_codec ); + +/** + * This function will initialize a es_format_t structure from a video_format_t. + */ +VLC_API void es_format_InitFromVideo( es_format_t *, const video_format_t * ); + +/** + * This functions will copy a es_format_t. + */ +VLC_API int es_format_Copy( es_format_t *p_dst, const es_format_t *p_src ); + +/** + * This function will clean up a es_format_t and release all associated + * resources. + * You can call it multiple times on the same structure. + */ +VLC_API void es_format_Clean( es_format_t *fmt ); + +/** + * This function will check if the first ES format is similar + * to the second one. + * + * All descriptive fields are ignored. + */ +VLC_API bool es_format_IsSimilar( const es_format_t *, const es_format_t * ); + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_es_out.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_es_out.h new file mode 100644 index 0000000..8e2bad1 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_es_out.h @@ -0,0 +1,163 @@ +/***************************************************************************** + * vlc_es_out.h: es_out (demuxer output) descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: cf1abcec08467eb495ad62474e055c1500f358b6 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_OUT_H +#define VLC_ES_OUT_H 1 + +/** + * \file + * This file defines functions and structures for handling es_out in stream output + */ + +/** + * \defgroup es out Es Out + * @{ + */ + +enum es_out_query_e +{ + /* set ES selected for the es category (audio/video/spu) */ + ES_OUT_SET_ES, /* arg1= es_out_id_t* */ + ES_OUT_RESTART_ES, /* arg1= es_out_id_t* */ + + /* set 'default' tag on ES (copied across from container) */ + ES_OUT_SET_ES_DEFAULT, /* arg1= es_out_id_t* */ + + /* force selection/unselection of the ES (bypass current mode) */ + ES_OUT_SET_ES_STATE,/* arg1= es_out_id_t* arg2=bool */ + ES_OUT_GET_ES_STATE,/* arg1= es_out_id_t* arg2=bool* */ + + /* */ + ES_OUT_SET_GROUP, /* arg1= int */ + + /* PCR handling, DTS/PTS will be automatically computed using thoses PCR + * XXX: SET_PCR(_GROUP) are in charge of the pace control. They will wait + * to slow down the demuxer so that it reads at the right speed. + * XXX: if you want PREROLL just call ES_OUT_SET_NEXT_DISPLAY_TIME and send + * as you would normally do. + */ + ES_OUT_SET_PCR, /* arg1=int64_t i_pcr(microsecond!) (using default group 0)*/ + ES_OUT_SET_GROUP_PCR, /* arg1= int i_group, arg2=int64_t i_pcr(microsecond!)*/ + ES_OUT_RESET_PCR, /* no arg */ + + /* Try not to use this one as it is a bit hacky */ + ES_OUT_SET_ES_FMT, /* arg1= es_out_id_t* arg2=es_format_t* */ + + /* Allow preroll of data (data with dts/pts < i_pts for all ES will be decoded but not displayed */ + ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=int64_t i_pts(microsecond) */ + /* Set meta data for group (dynamic) (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_GROUP_META, /* arg1=int i_group arg2=const vlc_meta_t */ + /* Set epg for group (dynamic) (The vlc_epg_t is not modified nor released) */ + ES_OUT_SET_GROUP_EPG, /* arg1=int i_group arg2=const vlc_epg_t */ + /* */ + ES_OUT_DEL_GROUP, /* arg1=int i_group */ + + /* Set scrambled state for one es */ + ES_OUT_SET_ES_SCRAMBLED_STATE, /* arg1=int i_group arg2=es_out_id_t* */ + + /* Stop any buffering being done, and ask if es_out has no more data to + * play. + * It will not block and so MUST be used carrefully. The only good reason + * is for interactive playback (like for DVD menu). + * XXX You SHALL call ES_OUT_RESET_PCR before any other es_out_Control/Send calls. */ + ES_OUT_GET_EMPTY, /* arg1=bool* res=cannot fail */ + + /* Set global meta data (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_META, /* arg1=const vlc_meta_t * */ + + /* PCR system clock manipulation for external clock synchronization */ + ES_OUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + ES_OUT_MODIFY_PCR_SYSTEM, /* arg1=int is_absolute, arg2=mtime_t, res=can fail */ + + /* First value usable for private control */ + ES_OUT_PRIVATE_START = 0x10000, +}; + +struct es_out_t +{ + es_out_id_t *(*pf_add) ( es_out_t *, const es_format_t * ); + int (*pf_send) ( es_out_t *, es_out_id_t *, block_t * ); + void (*pf_del) ( es_out_t *, es_out_id_t * ); + int (*pf_control)( es_out_t *, int i_query, va_list ); + void (*pf_destroy)( es_out_t * ); + + es_out_sys_t *p_sys; +}; + +VLC_USED +static inline es_out_id_t * es_out_Add( es_out_t *out, const es_format_t *fmt ) +{ + return out->pf_add( out, fmt ); +} + +static inline void es_out_Del( es_out_t *out, es_out_id_t *id ) +{ + out->pf_del( out, id ); +} + +static inline int es_out_Send( es_out_t *out, es_out_id_t *id, + block_t *p_block ) +{ + return out->pf_send( out, id, p_block ); +} + +static inline int es_out_vaControl( es_out_t *out, int i_query, va_list args ) +{ + return out->pf_control( out, i_query, args ); +} + +static inline int es_out_Control( es_out_t *out, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = es_out_vaControl( out, i_query, args ); + va_end( args ); + return i_result; +} + +static inline void es_out_Delete( es_out_t *p_out ) +{ + p_out->pf_destroy( p_out ); +} + +static inline int es_out_ControlSetMeta( es_out_t *out, const vlc_meta_t *p_meta ) +{ + return es_out_Control( out, ES_OUT_SET_META, p_meta ); +} + +static inline int es_out_ControlGetPcrSystem( es_out_t *out, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return es_out_Control( out, ES_OUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +static inline int es_out_ControlModifyPcrSystem( es_out_t *out, bool b_absolute, mtime_t i_system ) +{ + return es_out_Control( out, ES_OUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_events.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_events.h new file mode 100644 index 0000000..b167e91 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_events.h @@ -0,0 +1,263 @@ +/***************************************************************************** + * vlc_events.h: events definitions + * Interface used to send events. + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: c3425102b47c0ed953b527412521d1c8698b083e $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EVENTS_H +# define VLC_EVENTS_H + +#include +#include + +/** + * \file + * This file is the interface definition for events + * (implementation in src/misc/events.c) + */ + +/***************************************************************************** + * Documentation + *****************************************************************************/ +/* + **** Background + * + * This implements a way to send and receive event for an object (which can be + * a simple C struct or less). + * + * This is in direct concurrency with the Variable based Callback + * (see src/misc/variables.c). + * + * It has the following advantages over Variable based Callback: + * - No need to implement the whole VLC_COMMON_MEMBERS in the object, + * thus it reduce it size. This is especially true for input_item_t which + * doesn't have VLC_COMMON_MEMBERS. This is the first reason of existence of + * this implementation. + * - Libvlc can easily be based upon that. + * - Existing event are clearly declared (in include/vlc_events.h) + * + * + **** Example usage + * + * (vlc_cool_object_t doesn't need to have the VLC_COMMON_MEMBERS.) + * + * struct vlc_cool_object_t + * { + * ... + * vlc_event_manager_t p_event_manager; + * ... + * } + * + * vlc_my_cool_object_new() + * { + * ... + * vlc_event_manager_init( &p_self->p_event_manager, p_self, p_a_libvlc_object ); + * vlc_event_manager_register_event_type(p_self->p_event_manager, + * vlc_MyCoolObjectDidSomething, p_e) + * ... + * } + * + * vlc_my_cool_object_release() + * { + * ... + * vlc_event_manager_fini( &p_self->p_event_manager ); + * ... + * } + * + * vlc_my_cool_object_do_something() + * { + * ... + * vlc_event_t event; + * event.type = vlc_MyCoolObjectDidSomething; + * event.u.my_cool_object_did_something.what_it_did = kSomething; + * vlc_event_send( &p_self->p_event_manager, &event ); + * } + * */ + + /***************************************************************************** + * Event Type + *****************************************************************************/ + +/* Private structure defined in misc/events.c */ +struct vlc_event_listeners_group_t; + +/* Event manager type */ +typedef struct vlc_event_manager_t +{ + void * p_obj; + vlc_mutex_t object_lock; + vlc_mutex_t event_sending_lock; + DECL_ARRAY(struct vlc_event_listeners_group_t *) listeners_groups; +} vlc_event_manager_t; + +/* List of event */ +typedef enum vlc_event_type_t { + /* Input (thread) events */ + vlc_InputStateChanged, + vlc_InputSelectedStreamChanged, + + /* Input item events */ + vlc_InputItemMetaChanged, + vlc_InputItemSubItemAdded, + vlc_InputItemSubItemTreeAdded, + vlc_InputItemDurationChanged, + vlc_InputItemPreparsedChanged, + vlc_InputItemNameChanged, + vlc_InputItemInfoChanged, + vlc_InputItemErrorWhenReadingChanged, + + /* Service Discovery event */ + vlc_ServicesDiscoveryItemAdded, + vlc_ServicesDiscoveryItemRemoved, + vlc_ServicesDiscoveryItemRemoveAll, + vlc_ServicesDiscoveryStarted, + vlc_ServicesDiscoveryEnded, + + /* Addons Manager events */ + vlc_AddonFound, + vlc_AddonsDiscoveryEnded, + vlc_AddonChanged +} vlc_event_type_t; + +/* Event definition */ +typedef struct vlc_event_t +{ + vlc_event_type_t type; + void * p_obj; /* Sender object, automatically filled by vlc_event_send() */ + union vlc_event_type_specific + { + /* Input (thread) events */ + struct vlc_input_state_changed + { + int new_state; + } input_state_changed; + struct vlc_input_selected_stream_changed + { + void * unused; + } input_selected_stream_changed; + + /* Input item events */ + struct vlc_input_item_meta_changed + { + vlc_meta_type_t meta_type; + } input_item_meta_changed; + struct vlc_input_item_subitem_added + { + input_item_t * p_new_child; + } input_item_subitem_added; + struct vlc_input_item_subitem_tree_added + { + input_item_node_t * p_root; + } input_item_subitem_tree_added; + struct vlc_input_item_duration_changed + { + mtime_t new_duration; + } input_item_duration_changed; + struct vlc_input_item_preparsed_changed + { + int new_status; + } input_item_preparsed_changed; + struct vlc_input_item_name_changed + { + const char * new_name; + } input_item_name_changed; + struct vlc_input_item_info_changed + { + void * unused; + } input_item_info_changed; + struct input_item_error_when_reading_changed + { + bool new_value; + } input_item_error_when_reading_changed; + + /* Service discovery events */ + struct vlc_services_discovery_item_added + { + input_item_t * p_new_item; + const char * psz_category; + } services_discovery_item_added; + struct vlc_services_discovery_item_removed + { + input_item_t * p_item; + } services_discovery_item_removed; + struct vlc_services_discovery_started + { + void * unused; + } services_discovery_started; + struct vlc_services_discovery_ended + { + void * unused; + } services_discovery_ended; + + /* Addons */ + struct vlc_addon_generic_event + { + addon_entry_t * p_entry; + } addon_generic_event; + } u; +} vlc_event_t; + +/* Event callback type */ +typedef void ( *vlc_event_callback_t )( const vlc_event_t *, void * ); + + /***************************************************************************** + * Event manager + *****************************************************************************/ + +/* + * p_obj points to the object that owns the event manager, and from + * which events are sent + */ +VLC_API int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj ); + +/* + * Destroy + */ +VLC_API void vlc_event_manager_fini( vlc_event_manager_t * p_em ); + +/* + * Tells a specific event manager that it will handle event_type object + */ +VLC_API int vlc_event_manager_register_event_type( vlc_event_manager_t * p_em, + vlc_event_type_t ); + +/* + * Send an event to the listener attached to this p_em. + */ +VLC_API void vlc_event_send( vlc_event_manager_t * p_em, vlc_event_t * ); + +/* + * Add a callback for an event. + */ +VLC_API int vlc_event_attach( vlc_event_manager_t * p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +/* + * Remove a callback for an event. + */ +VLC_API void vlc_event_detach( vlc_event_manager_t *p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +#endif /* VLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_filter.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_filter.h new file mode 100644 index 0000000..91a14a8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_filter.h @@ -0,0 +1,419 @@ +/***************************************************************************** + * vlc_filter.h: filter related structures and functions + ***************************************************************************** + * Copyright (C) 1999-2008 VLC authors and VideoLAN + * $Id: 320cbac3a4a5b8461ec41eabd77f323bbbc509dd $ + * + * Authors: Gildas Bazin + * Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FILTER_H +#define VLC_FILTER_H 1 + +#include +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by video and audio filters + */ + +typedef struct filter_owner_sys_t filter_owner_sys_t; + +/** Structure describing a filter + * @warning BIG FAT WARNING : the code relies on the first 4 members of + * filter_t and decoder_t to be the same, so if you have anything to add, + * do it at the end of the structure. + */ +struct filter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + filter_sys_t * p_sys; + + /* Input format */ + es_format_t fmt_in; + + /* Output format of filter */ + es_format_t fmt_out; + bool b_allow_fmt_out_change; + + /* Filter configuration */ + config_chain_t * p_cfg; + + union + { + struct + { + picture_t * (*pf_filter) ( filter_t *, picture_t * ); + void (*pf_flush)( filter_t * ); + picture_t * (*pf_buffer_new) ( filter_t * ); + void (*pf_buffer_del) ( filter_t *, picture_t * ); + /* Filter mouse state. + * + * If non-NULL, you must convert from output to input formats: + * - If VLC_SUCCESS is returned, the mouse state is propagated. + * - Otherwise, the mouse change is not propagated. + * If NULL, the mouse state is considered unchanged and will be + * propagated. + */ + int (*pf_mouse)( filter_t *, vlc_mouse_t *, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ); + } video; +#define pf_video_filter u.video.pf_filter +#define pf_video_flush u.video.pf_flush +#define pf_video_mouse u.video.pf_mouse +#define pf_video_buffer_new u.video.pf_buffer_new +#define pf_video_buffer_del u.video.pf_buffer_del + + struct + { + block_t * (*pf_filter) ( filter_t *, block_t * ); + } audio; +#define pf_audio_filter u.audio.pf_filter + + struct + { + void (*pf_blend) ( filter_t *, picture_t *, + const picture_t *, int, int, int ); + } blend; +#define pf_video_blend u.blend.pf_blend + + struct + { + subpicture_t * (*pf_source) ( filter_t *, mtime_t ); + subpicture_t * (*pf_buffer_new)( filter_t * ); + void (*pf_buffer_del)( filter_t *, subpicture_t * ); + int (*pf_mouse) ( filter_t *, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + const video_format_t * ); + } sub; +#define pf_sub_source u.sub.pf_source +#define pf_sub_buffer_new u.sub.pf_buffer_new +#define pf_sub_buffer_del u.sub.pf_buffer_del +#define pf_sub_mouse u.sub.pf_mouse + + struct + { + subpicture_t * (*pf_filter) ( filter_t *, subpicture_t * ); + } subf; +#define pf_sub_filter u.subf.pf_filter + + struct + { + int (*pf_text) ( filter_t *, subpicture_region_t *, + subpicture_region_t *, + const vlc_fourcc_t * ); + int (*pf_html) ( filter_t *, subpicture_region_t *, + subpicture_region_t *, + const vlc_fourcc_t * ); + } render; +#define pf_render_text u.render.pf_text +#define pf_render_html u.render.pf_html + + } u; + + /* Input attachments + * XXX use filter_GetInputAttachments */ + int (*pf_get_attachments)( filter_t *, input_attachment_t ***, int * ); + + /* Private structure for the owner of the decoder */ + filter_owner_sys_t *p_owner; +}; + +/** + * This function will return a new picture usable by p_filter as an output + * buffer. You have to release it using filter_DeletePicture or by returning + * it to the caller as a pf_video_filter return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new picture on success or NULL on failure + */ +static inline picture_t *filter_NewPicture( filter_t *p_filter ) +{ + picture_t *p_picture = p_filter->pf_video_buffer_new( p_filter ); + if( !p_picture ) + msg_Warn( p_filter, "can't get output picture" ); + return p_picture; +} + +/** + * This function will release a picture create by filter_NewPicture. + * Provided for convenience. + * + * \param p_filter filter_t object + * \param p_picture picture to be deleted + */ +static inline void filter_DeletePicture( filter_t *p_filter, picture_t *p_picture ) +{ + p_filter->pf_video_buffer_del( p_filter, p_picture ); +} + +/** + * This function will flush the state of a video filter. + */ +static inline void filter_FlushPictures( filter_t *p_filter ) +{ + if( p_filter->pf_video_flush ) + p_filter->pf_video_flush( p_filter ); +} + +/** + * This function will return a new subpicture usable by p_filter as an output + * buffer. You have to release it using filter_DeleteSubpicture or by returning + * it to the caller as a pf_sub_source return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new subpicture + */ +static inline subpicture_t *filter_NewSubpicture( filter_t *p_filter ) +{ + subpicture_t *p_subpicture = p_filter->pf_sub_buffer_new( p_filter ); + if( !p_subpicture ) + msg_Warn( p_filter, "can't get output subpicture" ); + return p_subpicture; +} + +/** + * This function will release a subpicture create by filter_NewSubicture. + * Provided for convenience. + * + * \param p_filter filter_t object + * \param p_subpicture to be released + */ +static inline void filter_DeleteSubpicture( filter_t *p_filter, subpicture_t *p_subpicture ) +{ + p_filter->pf_sub_buffer_del( p_filter, p_subpicture ); +} + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +static inline int filter_GetInputAttachments( filter_t *p_filter, + input_attachment_t ***ppp_attachment, + int *pi_attachment ) +{ + if( !p_filter->pf_get_attachments ) + return VLC_EGENERIC; + return p_filter->pf_get_attachments( p_filter, + ppp_attachment, pi_attachment ); +} + +/** + * It creates a blend filter. + * + * Only the chroma properties of the dest format is used (chroma + * type, rgb masks and shifts) + */ +VLC_API filter_t * filter_NewBlend( vlc_object_t *, const video_format_t *p_dst_chroma ) VLC_USED; + +/** + * It configures blend filter parameters that are allowed to changed + * after the creation. + */ +VLC_API int filter_ConfigureBlend( filter_t *, int i_dst_width, int i_dst_height, const video_format_t *p_src ); + +/** + * It blends a picture into another one. + * + * The input picture is not modified and not released. + */ +VLC_API int filter_Blend( filter_t *, picture_t *p_dst, int i_dst_x, int i_dst_y, const picture_t *p_src, int i_alpha ); + +/** + * It destroys a blend filter created by filter_NewBlend. + */ +VLC_API void filter_DeleteBlend( filter_t * ); + +/** + * Create a picture_t *(*)( filter_t *, picture_t * ) compatible wrapper + * using a void (*)( filter_t *, picture_t *, picture_t * ) function + * + * Currently used by the chroma video filters + */ +#define VIDEO_FILTER_WRAPPER( name ) \ + static picture_t *name ## _Filter ( filter_t *p_filter, \ + picture_t *p_pic ) \ + { \ + picture_t *p_outpic = filter_NewPicture( p_filter ); \ + if( p_outpic ) \ + { \ + name( p_filter, p_pic, p_outpic ); \ + picture_CopyProperties( p_outpic, p_pic ); \ + } \ + picture_Release( p_pic ); \ + return p_outpic; \ + } + +/** + * Filter chain management API + * The filter chain management API is used to dynamically construct filters + * and add them in a chain. + */ + +typedef struct filter_chain_t filter_chain_t; + +/** + * Create new filter chain + * + * \param p_object pointer to a vlc object + * \param psz_capability vlc capability of filters in filter chain + * \param b_allow_format_fmt_change allow changing of fmt + * \param pf_buffer_allocation_init callback function to initialize buffer allocations + * \param pf_buffer_allocation_clear callback function to clear buffer allocation initialization + * \param p_buffer_allocation_data pointer to private allocation data + * \return pointer to a filter chain + */ +VLC_API filter_chain_t * filter_chain_New( vlc_object_t *, const char *, bool, int (*)( filter_t *, void * ), void (*)( filter_t * ), void * ) VLC_USED; +#define filter_chain_New( a, b, c, d, e, f ) filter_chain_New( VLC_OBJECT( a ), b, c, d, e, f ) + +/** + * Delete filter chain will delete all filters in the chain and free all + * allocated data. The pointer to the filter chain is then no longer valid. + * + * \param p_chain pointer to filter chain + */ +VLC_API void filter_chain_Delete( filter_chain_t * ); + +/** + * Reset filter chain will delete all filters in the chain and + * reset p_fmt_in and p_fmt_out to the new values. + * + * \param p_chain pointer to filter chain + * \param p_fmt_in new fmt_in params + * \param p_fmt_out new fmt_out params + */ +VLC_API void filter_chain_Reset( filter_chain_t *, const es_format_t *, const es_format_t * ); + +/** + * Append filter to the end of the chain. + * + * \param p_chain pointer to filter chain + * \param psz_name name of filter + * \param p_cfg + * \param p_fmt_in input es_format_t + * \param p_fmt_out output es_format_t + * \return pointer to filter chain + */ +VLC_API filter_t * filter_chain_AppendFilter( filter_chain_t *, const char *, config_chain_t *, const es_format_t *, const es_format_t * ); + +/** + * Append new filter to filter chain from string. + * + * \param p_chain pointer to filter chain + * \param psz_string string of filters + * \return 0 for success + */ +VLC_API int filter_chain_AppendFromString( filter_chain_t *, const char * ); + +/** + * Delete filter from filter chain. This function also releases the filter + * object and unloads the filter modules. The pointer to p_filter is no + * longer valid after this function successfully returns. + * + * \param p_chain pointer to filter chain + * \param p_filter pointer to filter object + * \return VLC_SUCCESS on succes, else VLC_EGENERIC + */ +VLC_API int filter_chain_DeleteFilter( filter_chain_t *, filter_t * ); + +/** + * Get the number of filters in the filter chain. + * + * \param p_chain pointer to filter chain + * \return number of filters in this filter chain + */ +VLC_API int filter_chain_GetLength( filter_chain_t * ); + +/** + * Get last p_fmt_out in the chain. + * + * \param p_chain pointer to filter chain + * \return last p_fmt (es_format_t) of this filter chain + */ +VLC_API const es_format_t * filter_chain_GetFmtOut( filter_chain_t * ); + +/** + * Apply the filter chain to a video picture. + * + * \param p_chain pointer to filter chain + * \param p_picture picture to apply filters on + * \return modified picture after applying all video filters + */ +VLC_API picture_t * filter_chain_VideoFilter( filter_chain_t *, picture_t * ); + +/** + * Flush a video filter chain. + */ +VLC_API void filter_chain_VideoFlush( filter_chain_t * ); + +/** + * Apply the filter chain to a audio block. + * + * \param p_chain pointer to filter chain + * \param p_block audio frame to apply filters on + * \return modified audio frame after applying all audio filters + */ +VLC_API block_t * filter_chain_AudioFilter( filter_chain_t *, block_t * ); + +/** + * Apply filter chain to subpictures. + * + * \param p_chain pointer to filter chain + * \param display_date of subpictures + */ +VLC_API void filter_chain_SubSource( filter_chain_t *, mtime_t ); + +/** + * Apply filter chain to subpictures. + * + * \param p_chain pointer to filter chain + * \param p_subpicture subpicture to apply filters on + * \return modified subpicture after applying all subpicture filters + */ +VLC_API subpicture_t * filter_chain_SubFilter( filter_chain_t *, subpicture_t * ); + +/** + * Apply the filter chain to a mouse state. + * + * It will be applied from the output to the input. It makes sense only + * for a video filter chain. + * + * The vlc_mouse_t* pointers may be the same. + */ +VLC_API int filter_chain_MouseFilter( filter_chain_t *, vlc_mouse_t *, const vlc_mouse_t * ); + +/** + * Inform the filter chain of mouse state. + * + * It makes sense only for a sub source chain. + */ +VLC_API int filter_chain_MouseEvent( filter_chain_t *, const vlc_mouse_t *, const video_format_t * ); + +#endif /* _VLC_FILTER_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_fingerprinter.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_fingerprinter.h new file mode 100644 index 0000000..e5d3afe --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_fingerprinter.h @@ -0,0 +1,92 @@ +/***************************************************************************** + * vlc_fingerprinter.h: Fingerprinter abstraction layer + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FINGERPRINTER_H +# define VLC_FINGERPRINTER_H + +#include +#include +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct fingerprinter_sys_t fingerprinter_sys_t; + +struct fingerprint_request_t +{ + input_item_t *p_item; + unsigned int i_duration; /* track length hint in seconds, 0 if unkown */ + struct + { + char *psz_fingerprint; + vlc_array_t metas_array; + } results ; +}; +typedef struct fingerprint_request_t fingerprint_request_t; + +static inline fingerprint_request_t *fingerprint_request_New( input_item_t *p_item ) +{ + fingerprint_request_t *p_r = + ( fingerprint_request_t * ) calloc( 1, sizeof( fingerprint_request_t ) ); + if ( !p_r ) return NULL; + p_r->results.psz_fingerprint = NULL; + p_r->i_duration = 0; + vlc_gc_incref( p_item ); + p_r->p_item = p_item; + vlc_array_init( & p_r->results.metas_array ); /* shouldn't be needed */ + return p_r; +} + +static inline void fingerprint_request_Delete( fingerprint_request_t *p_f ) +{ + vlc_gc_decref( p_f->p_item ); + free( p_f->results.psz_fingerprint ); + for( int i = 0; i < vlc_array_count( & p_f->results.metas_array ); i++ ) + vlc_meta_Delete( (vlc_meta_t *) vlc_array_item_at_index( & p_f->results.metas_array, i ) ); + free( p_f ); +} + +struct fingerprinter_thread_t +{ + VLC_COMMON_MEMBERS + + /* Specific interfaces */ + fingerprinter_sys_t * p_sys; + + module_t * p_module; + void ( *pf_run ) ( struct fingerprinter_thread_t * ); + + void ( *pf_enqueue ) ( struct fingerprinter_thread_t *f, fingerprint_request_t *r ); + fingerprint_request_t * ( *pf_getresults ) ( struct fingerprinter_thread_t *f ); + void ( *pf_apply ) ( fingerprint_request_t *, int i_resultid ); +}; +typedef struct fingerprinter_thread_t fingerprinter_thread_t; + +VLC_API fingerprinter_thread_t *fingerprinter_Create( vlc_object_t *p_this ); +VLC_API void fingerprinter_Destroy( fingerprinter_thread_t *p_fingerprint ); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_fourcc.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_fourcc.h new file mode 100644 index 0000000..f691438 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_fourcc.h @@ -0,0 +1,575 @@ +/***************************************************************************** + * vlc_fourcc.h: Definition of various FOURCC and helpers + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: debb5c97d7d74c6591943104a4fb2afc15a1aa49 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FOURCC_H +#define VLC_FOURCC_H 1 + +#include + +/* Video codec */ +#define VLC_CODEC_MPGV VLC_FOURCC('m','p','g','v') +#define VLC_CODEC_MP4V VLC_FOURCC('m','p','4','v') +#define VLC_CODEC_DIV1 VLC_FOURCC('D','I','V','1') +#define VLC_CODEC_DIV2 VLC_FOURCC('D','I','V','2') +#define VLC_CODEC_DIV3 VLC_FOURCC('D','I','V','3') +#define VLC_CODEC_SVQ1 VLC_FOURCC('S','V','Q','1') +#define VLC_CODEC_SVQ3 VLC_FOURCC('S','V','Q','3') +#define VLC_CODEC_H264 VLC_FOURCC('h','2','6','4') +#define VLC_CODEC_H263 VLC_FOURCC('h','2','6','3') +#define VLC_CODEC_H263I VLC_FOURCC('I','2','6','3') +#define VLC_CODEC_H263P VLC_FOURCC('I','L','V','R') +#define VLC_CODEC_FLV1 VLC_FOURCC('F','L','V','1') +#define VLC_CODEC_H261 VLC_FOURCC('h','2','6','1') +#define VLC_CODEC_MJPG VLC_FOURCC('M','J','P','G') +#define VLC_CODEC_MJPGB VLC_FOURCC('m','j','p','b') +#define VLC_CODEC_LJPG VLC_FOURCC('L','J','P','G') +#define VLC_CODEC_WMV1 VLC_FOURCC('W','M','V','1') +#define VLC_CODEC_WMV2 VLC_FOURCC('W','M','V','2') +#define VLC_CODEC_WMV3 VLC_FOURCC('W','M','V','3') +#define VLC_CODEC_WMVA VLC_FOURCC('W','M','V','A') +#define VLC_CODEC_WMVP VLC_FOURCC('W','M','V','P') +#define VLC_CODEC_WMVP2 VLC_FOURCC('W','V','P','2') +#define VLC_CODEC_VC1 VLC_FOURCC('V','C','-','1') +#define VLC_CODEC_THEORA VLC_FOURCC('t','h','e','o') +#define VLC_CODEC_TARKIN VLC_FOURCC('t','a','r','k') +#define VLC_CODEC_DIRAC VLC_FOURCC('d','r','a','c') +#define VLC_CODEC_CAVS VLC_FOURCC('C','A','V','S') +#define VLC_CODEC_NUV VLC_FOURCC('N','J','P','G') +#define VLC_CODEC_RV10 VLC_FOURCC('R','V','1','0') +#define VLC_CODEC_RV13 VLC_FOURCC('R','V','1','3') +#define VLC_CODEC_RV20 VLC_FOURCC('R','V','2','0') +#define VLC_CODEC_RV30 VLC_FOURCC('R','V','3','0') +#define VLC_CODEC_RV40 VLC_FOURCC('R','V','4','0') +#define VLC_CODEC_VP3 VLC_FOURCC('V','P','3',' ') +#define VLC_CODEC_VP5 VLC_FOURCC('V','P','5',' ') +#define VLC_CODEC_VP6 VLC_FOURCC('V','P','6','2') +#define VLC_CODEC_VP6F VLC_FOURCC('V','P','6','F') +#define VLC_CODEC_VP6A VLC_FOURCC('V','P','6','A') +#define VLC_CODEC_MSVIDEO1 VLC_FOURCC('M','S','V','C') +#define VLC_CODEC_FLIC VLC_FOURCC('F','L','I','C') +#define VLC_CODEC_SP5X VLC_FOURCC('S','P','5','X') +#define VLC_CODEC_DV VLC_FOURCC('d','v',' ',' ') +#define VLC_CODEC_MSRLE VLC_FOURCC('m','r','l','e') +#define VLC_CODEC_HUFFYUV VLC_FOURCC('H','F','Y','U') +#define VLC_CODEC_FFVHUFF VLC_FOURCC('F','F','V','H') +#define VLC_CODEC_ASV1 VLC_FOURCC('A','S','V','1') +#define VLC_CODEC_ASV2 VLC_FOURCC('A','S','V','2') +#define VLC_CODEC_FFV1 VLC_FOURCC('F','F','V','1') +#define VLC_CODEC_VCR1 VLC_FOURCC('V','C','R','1') +#define VLC_CODEC_CLJR VLC_FOURCC('C','L','J','R') +#define VLC_CODEC_RPZA VLC_FOURCC('r','p','z','a') +#define VLC_CODEC_SMC VLC_FOURCC('s','m','c',' ') +#define VLC_CODEC_CINEPAK VLC_FOURCC('C','V','I','D') +#define VLC_CODEC_TSCC VLC_FOURCC('T','S','C','C') +#define VLC_CODEC_CSCD VLC_FOURCC('C','S','C','D') +#define VLC_CODEC_ZMBV VLC_FOURCC('Z','M','B','V') +#define VLC_CODEC_VMNC VLC_FOURCC('V','M','n','c') +#define VLC_CODEC_FRAPS VLC_FOURCC('F','P','S','1') +#define VLC_CODEC_TRUEMOTION1 VLC_FOURCC('D','U','C','K') +#define VLC_CODEC_TRUEMOTION2 VLC_FOURCC('T','M','2','0') +#define VLC_CODEC_QTRLE VLC_FOURCC('r','l','e',' ') +#define VLC_CODEC_QDRAW VLC_FOURCC('q','d','r','w') +#define VLC_CODEC_QPEG VLC_FOURCC('Q','P','E','G') +#define VLC_CODEC_ULTI VLC_FOURCC('U','L','T','I') +#define VLC_CODEC_VIXL VLC_FOURCC('V','I','X','L') +#define VLC_CODEC_LOCO VLC_FOURCC('L','O','C','O') +#define VLC_CODEC_WNV1 VLC_FOURCC('W','N','V','1') +#define VLC_CODEC_AASC VLC_FOURCC('A','A','S','C') +#define VLC_CODEC_INDEO2 VLC_FOURCC('I','V','2','0') +#define VLC_CODEC_INDEO3 VLC_FOURCC('I','V','3','1') +#define VLC_CODEC_INDEO4 VLC_FOURCC('I','V','4','1') +#define VLC_CODEC_INDEO5 VLC_FOURCC('I','V','5','0') +#define VLC_CODEC_FLASHSV VLC_FOURCC('F','S','V','1') +#define VLC_CODEC_KMVC VLC_FOURCC('K','M','V','C') +#define VLC_CODEC_SMACKVIDEO VLC_FOURCC('S','M','K','2') +#define VLC_CODEC_DNXHD VLC_FOURCC('A','V','d','n') +#define VLC_CODEC_8BPS VLC_FOURCC('8','B','P','S') +#define VLC_CODEC_MIMIC VLC_FOURCC('M','L','2','O') +#define VLC_CODEC_INTERPLAY VLC_FOURCC('i','m','v','e') +#define VLC_CODEC_IDCIN VLC_FOURCC('I','D','C','I') +#define VLC_CODEC_4XM VLC_FOURCC('4','X','M','V') +#define VLC_CODEC_ROQ VLC_FOURCC('R','o','Q','v') +#define VLC_CODEC_MDEC VLC_FOURCC('M','D','E','C') +#define VLC_CODEC_VMDVIDEO VLC_FOURCC('V','M','D','V') +#define VLC_CODEC_CDG VLC_FOURCC('C','D','G',' ') +#define VLC_CODEC_FRWU VLC_FOURCC('F','R','W','U') +#define VLC_CODEC_AMV VLC_FOURCC('A','M','V',' ') +#define VLC_CODEC_VP7 VLC_FOURCC('V','P','7','0') +#define VLC_CODEC_VP8 VLC_FOURCC('V','P','8','0') +#define VLC_CODEC_VP9 VLC_FOURCC('V','P','9','0') +#define VLC_CODEC_JPEG2000 VLC_FOURCC('J','P','2','K') +#define VLC_CODEC_LAGARITH VLC_FOURCC('L','A','G','S') +#define VLC_CODEC_FLASHSV2 VLC_FOURCC('F','S','V','2') +#define VLC_CODEC_PRORES VLC_FOURCC('a','p','c','n') +#define VLC_CODEC_MXPEG VLC_FOURCC('M','X','P','G') +#define VLC_CODEC_CDXL VLC_FOURCC('C','D','X','L') +#define VLC_CODEC_BMVVIDEO VLC_FOURCC('B','M','V','V') +#define VLC_CODEC_UTVIDEO VLC_FOURCC('U','L','R','A') +#define VLC_CODEC_VBLE VLC_FOURCC('V','B','L','E') +#define VLC_CODEC_DXTORY VLC_FOURCC('x','t','o','r') +#define VLC_CODEC_MSS1 VLC_FOURCC('M','S','S','1') +#define VLC_CODEC_MSS2 VLC_FOURCC('M','S','S','2') +#define VLC_CODEC_MSA1 VLC_FOURCC('M','S','A','1') +#define VLC_CODEC_TSC2 VLC_FOURCC('T','S','C','2') +#define VLC_CODEC_MTS2 VLC_FOURCC('M','T','S','2') +#define VLC_CODEC_HEVC VLC_FOURCC('h','e','v','c') +#define VLC_CODEC_ICOD VLC_FOURCC('i','c','o','d') +#define VLC_CODEC_G2M2 VLC_FOURCC('G','2','M','2') +#define VLC_CODEC_G2M3 VLC_FOURCC('G','2','M','3') +#define VLC_CODEC_G2M4 VLC_FOURCC('G','2','M','4') +#define VLC_CODEC_BINKVIDEO VLC_FOURCC('B','I','K','f') +#define VLC_CODEC_BINKAUDIO_DCT VLC_FOURCC('B','A','U','1') +#define VLC_CODEC_BINKAUDIO_RDFT VLC_FOURCC('B','A','U','2') +#define VLC_CODEC_XAN_WC4 VLC_FOURCC('X','x','a','n') +#define VLC_CODEC_LCL_MSZH VLC_FOURCC('M','S','Z','H') +#define VLC_CODEC_LCL_ZLIB VLC_FOURCC('Z','L','I','B') +#define VLC_CODEC_THP VLC_FOURCC('T','H','P','0') +#define VLC_CODEC_ESCAPE124 VLC_FOURCC('E','1','2','4') +#define VLC_CODEC_KGV1 VLC_FOURCC('K','G','V','1') +#define VLC_CODEC_CLLC VLC_FOURCC('C','L','L','C') +#define VLC_CODEC_AURA VLC_FOURCC('A','U','R','A') +#define VLC_CODEC_FIC VLC_FOURCC('F','I','C','V') + +/* Planar YUV 4:1:0 Y:V:U */ +#define VLC_CODEC_YV9 VLC_FOURCC('Y','V','U','9') +/* Planar YUV 4:2:0 Y:V:U */ +#define VLC_CODEC_YV12 VLC_FOURCC('Y','V','1','2') +/* Planar YUV 4:1:0 Y:U:V */ +#define VLC_CODEC_I410 VLC_FOURCC('I','4','1','0') +/* Planar YUV 4:1:1 Y:U:V */ +#define VLC_CODEC_I411 VLC_FOURCC('I','4','1','1') +/* Planar YUV 4:2:0 Y:U:V 8-bit */ +#define VLC_CODEC_I420 VLC_FOURCC('I','4','2','0') +/* Planar YUV 4:2:0 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I420_9L VLC_FOURCC('I','0','9','L') +#define VLC_CODEC_I420_9B VLC_FOURCC('I','0','9','B') +/* Planar YUV 4:2:0 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I420_10L VLC_FOURCC('I','0','A','L') +#define VLC_CODEC_I420_10B VLC_FOURCC('I','0','A','B') +/* Planar YUV 4:2:2 Y:U:V 8-bit */ +#define VLC_CODEC_I422 VLC_FOURCC('I','4','2','2') +/* Planar YUV 4:2:2 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I422_9L VLC_FOURCC('I','2','9','L') +#define VLC_CODEC_I422_9B VLC_FOURCC('I','2','9','B') +/* Planar YUV 4:2:2 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I422_10L VLC_FOURCC('I','2','A','L') +#define VLC_CODEC_I422_10B VLC_FOURCC('I','2','A','B') +/* Planar YUV 4:4:0 Y:U:V */ +#define VLC_CODEC_I440 VLC_FOURCC('I','4','4','0') +/* Planar YUV 4:4:4 Y:U:V 8-bit */ +#define VLC_CODEC_I444 VLC_FOURCC('I','4','4','4') +/* Planar YUV 4:4:4 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I444_9L VLC_FOURCC('I','4','9','L') +#define VLC_CODEC_I444_9B VLC_FOURCC('I','4','9','B') +/* Planar YUV 4:4:4 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I444_10L VLC_FOURCC('I','4','A','L') +#define VLC_CODEC_I444_10B VLC_FOURCC('I','4','A','B') +/* Planar YUV 4:4:4 Y:U:V 16-bit */ +#define VLC_CODEC_I444_16L VLC_FOURCC('I','4','F','L') +#define VLC_CODEC_I444_16B VLC_FOURCC('I','4','F','B') +/* Planar YUV 4:2:0 Y:U:V full scale */ +#define VLC_CODEC_J420 VLC_FOURCC('J','4','2','0') +/* Planar YUV 4:2:2 Y:U:V full scale */ +#define VLC_CODEC_J422 VLC_FOURCC('J','4','2','2') +/* Planar YUV 4:4:0 Y:U:V full scale */ +#define VLC_CODEC_J440 VLC_FOURCC('J','4','4','0') +/* Planar YUV 4:4:4 Y:U:V full scale */ +#define VLC_CODEC_J444 VLC_FOURCC('J','4','4','4') +/* Palettized YUV with palette element Y:U:V:A */ +#define VLC_CODEC_YUVP VLC_FOURCC('Y','U','V','P') +/* Planar YUV 4:4:4 Y:U:V:A */ +#define VLC_CODEC_YUVA VLC_FOURCC('Y','U','V','A') +/* Planar YUV 4:2:2 Y:U:V:A */ +#define VLC_CODEC_YUV422A VLC_FOURCC('I','4','2','A') +/* Planar YUV 4:2:0 Y:U:V:A */ +#define VLC_CODEC_YUV420A VLC_FOURCC('I','4','0','A') + +/* Palettized RGB with palette element R:G:B */ +#define VLC_CODEC_RGBP VLC_FOURCC('R','G','B','P') +/* 8 bits RGB */ +#define VLC_CODEC_RGB8 VLC_FOURCC('R','G','B','8') +/* 12 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB12 VLC_FOURCC('R','V','1','2') +/* 15 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB15 VLC_FOURCC('R','V','1','5') +/* 16 bits RGB */ +#define VLC_CODEC_RGB16 VLC_FOURCC('R','V','1','6') +/* 24 bits RGB */ +#define VLC_CODEC_RGB24 VLC_FOURCC('R','V','2','4') +/* 24 bits RGB padded to 32 bits */ +#define VLC_CODEC_RGB32 VLC_FOURCC('R','V','3','2') +/* 32 bits RGBA */ +#define VLC_CODEC_RGBA VLC_FOURCC('R','G','B','A') +/* 32 bits ARGB */ +#define VLC_CODEC_ARGB VLC_FOURCC('A','R','G','B') +/* 32 bits BGRA */ +#define VLC_CODEC_BGRA VLC_FOURCC('B','G','R','A') + +/* Planar GBR 4:4:4 8 bits */ +#define VLC_CODEC_GBR_PLANAR VLC_FOURCC('G','B','R','8') +#define VLC_CODEC_GBR_PLANAR_9B VLC_FOURCC('G','B','9','B') +#define VLC_CODEC_GBR_PLANAR_9L VLC_FOURCC('G','B','9','L') +#define VLC_CODEC_GBR_PLANAR_10B VLC_FOURCC('G','B','A','B') +#define VLC_CODEC_GBR_PLANAR_10L VLC_FOURCC('G','B','A','L') +#define VLC_CODEC_GBR_PLANAR_16L VLC_FOURCC('G','B','F','L') +#define VLC_CODEC_GBR_PLANAR_16B VLC_FOURCC('G','B','F','B') + +/* 8 bits grey */ +#define VLC_CODEC_GREY VLC_FOURCC('G','R','E','Y') +/* Packed YUV 4:2:2, U:Y:V:Y */ +#define VLC_CODEC_UYVY VLC_FOURCC('U','Y','V','Y') +/* Packed YUV 4:2:2, V:Y:U:Y */ +#define VLC_CODEC_VYUY VLC_FOURCC('V','Y','U','Y') +/* Packed YUV 4:2:2, Y:U:Y:V */ +#define VLC_CODEC_YUYV VLC_FOURCC('Y','U','Y','2') +/* Packed YUV 4:2:2, Y:V:Y:U */ +#define VLC_CODEC_YVYU VLC_FOURCC('Y','V','Y','U') +/* Packed YUV 2:1:1, Y:U:Y:V */ +#define VLC_CODEC_Y211 VLC_FOURCC('Y','2','1','1') +/* Packed YUV 4:2:2, U:Y:V:Y, reverted */ +#define VLC_CODEC_CYUV VLC_FOURCC('c','y','u','v') +/* 10-bit 4:2:2 Component YCbCr */ +#define VLC_CODEC_V210 VLC_FOURCC('v','2','1','0') +/* 2 planes Y/UV 4:2:0 */ +#define VLC_CODEC_NV12 VLC_FOURCC('N','V','1','2') +/* 2 planes Y/VU 4:2:0 */ +#define VLC_CODEC_NV21 VLC_FOURCC('N','V','2','1') +/* 2 planes Y/UV 4:2:2 */ +#define VLC_CODEC_NV16 VLC_FOURCC('N','V','1','6') +/* 2 planes Y/VU 4:2:2 */ +#define VLC_CODEC_NV61 VLC_FOURCC('N','V','6','1') +/* 2 planes Y/UV 4:4:4 */ +#define VLC_CODEC_NV24 VLC_FOURCC('N','V','2','4') +/* 2 planes Y/VU 4:4:4 */ +#define VLC_CODEC_NV42 VLC_FOURCC('N','V','4','2') + +/* VDPAU video surface YCbCr 4:2:0 */ +#define VLC_CODEC_VDPAU_VIDEO_420 VLC_FOURCC('V','D','V','0') +/* VDPAU video surface YCbCr 4:2:2 */ +#define VLC_CODEC_VDPAU_VIDEO_422 VLC_FOURCC('V','D','V','2') +/* VDPAU video surface YCbCr 4:4:4 */ +#define VLC_CODEC_VDPAU_VIDEO_444 VLC_FOURCC('V','D','V','4') +/* VDPAU output surface RGBA */ +#define VLC_CODEC_VDPAU_OUTPUT VLC_FOURCC('V','D','O','R') + +/* MediaCodec/IOMX opaque buffer type */ +#define VLC_CODEC_ANDROID_OPAQUE VLC_FOURCC('A','N','O','P') + +/* Broadcom MMAL opaque buffer type */ +#define VLC_CODEC_MMAL_OPAQUE VLC_FOURCC('M','M','A','L') + +/* Image codec (video) */ +#define VLC_CODEC_PNG VLC_FOURCC('p','n','g',' ') +#define VLC_CODEC_PPM VLC_FOURCC('p','p','m',' ') +#define VLC_CODEC_PGM VLC_FOURCC('p','g','m',' ') +#define VLC_CODEC_PGMYUV VLC_FOURCC('p','g','m','y') +#define VLC_CODEC_PAM VLC_FOURCC('p','a','m',' ') +#define VLC_CODEC_JPEG VLC_FOURCC('j','p','e','g') +#define VLC_CODEC_JPEGLS VLC_FOURCC('M','J','L','S') +#define VLC_CODEC_BMP VLC_FOURCC('b','m','p',' ') +#define VLC_CODEC_TIFF VLC_FOURCC('t','i','f','f') +#define VLC_CODEC_GIF VLC_FOURCC('g','i','f',' ') +#define VLC_CODEC_TARGA VLC_FOURCC('t','g','a',' ') +#define VLC_CODEC_SVG VLC_FOURCC('s','v','g',' ') +#define VLC_CODEC_SGI VLC_FOURCC('s','g','i',' ') +#define VLC_CODEC_PNM VLC_FOURCC('p','n','m',' ') +#define VLC_CODEC_PCX VLC_FOURCC('p','c','x',' ') +#define VLC_CODEC_XWD VLC_FOURCC('X','W','D',' ') +#define VLC_CODEC_TXD VLC_FOURCC('T','X','D',' ') + + +/* Audio codec */ +#define VLC_CODEC_MPGA VLC_FOURCC('m','p','g','a') +#define VLC_CODEC_MP4A VLC_FOURCC('m','p','4','a') +#define VLC_CODEC_ALS VLC_FOURCC('a','l','s',' ') +#define VLC_CODEC_A52 VLC_FOURCC('a','5','2',' ') +#define VLC_CODEC_EAC3 VLC_FOURCC('e','a','c','3') +#define VLC_CODEC_DTS VLC_FOURCC('d','t','s',' ') +#define VLC_CODEC_WMA1 VLC_FOURCC('W','M','A','1') +#define VLC_CODEC_WMA2 VLC_FOURCC('W','M','A','2') +#define VLC_CODEC_WMAP VLC_FOURCC('W','M','A','P') +#define VLC_CODEC_WMAL VLC_FOURCC('W','M','A','L') +#define VLC_CODEC_WMAS VLC_FOURCC('W','M','A','S') +#define VLC_CODEC_FLAC VLC_FOURCC('f','l','a','c') +#define VLC_CODEC_MLP VLC_FOURCC('m','l','p',' ') +#define VLC_CODEC_TRUEHD VLC_FOURCC('t','r','h','d') +#define VLC_CODEC_DVAUDIO VLC_FOURCC('d','v','a','u') +#define VLC_CODEC_SPEEX VLC_FOURCC('s','p','x',' ') +#define VLC_CODEC_OPUS VLC_FOURCC('O','p','u','s') +#define VLC_CODEC_VORBIS VLC_FOURCC('v','o','r','b') +#define VLC_CODEC_MACE3 VLC_FOURCC('M','A','C','3') +#define VLC_CODEC_MACE6 VLC_FOURCC('M','A','C','6') +#define VLC_CODEC_MUSEPACK7 VLC_FOURCC('M','P','C',' ') +#define VLC_CODEC_MUSEPACK8 VLC_FOURCC('M','P','C','K') +#define VLC_CODEC_RA_144 VLC_FOURCC('1','4','_','4') +#define VLC_CODEC_RA_288 VLC_FOURCC('2','8','_','8') +#define VLC_CODEC_INTERPLAY_DPCM VLC_FOURCC('i','d','p','c') +#define VLC_CODEC_ROQ_DPCM VLC_FOURCC('R','o','Q','a') +#define VLC_CODEC_DSICINAUDIO VLC_FOURCC('D','C','I','A') +#define VLC_CODEC_ADPCM_4XM VLC_FOURCC('4','x','m','a') +#define VLC_CODEC_ADPCM_EA VLC_FOURCC('A','D','E','A') +#define VLC_CODEC_ADPCM_XA VLC_FOURCC('x','a',' ',' ') +#define VLC_CODEC_ADPCM_ADX VLC_FOURCC('a','d','x',' ') +#define VLC_CODEC_ADPCM_IMA_WS VLC_FOURCC('A','I','W','S') +#define VLC_CODEC_ADPCM_G722 VLC_FOURCC('g','7','2','2') +#define VLC_CODEC_ADPCM_G726 VLC_FOURCC('g','7','2','6') +#define VLC_CODEC_ADPCM_SWF VLC_FOURCC('S','W','F','a') +#define VLC_CODEC_ADPCM_MS VLC_FOURCC('m','s',0x00,0x02) +#define VLC_CODEC_ADPCM_IMA_WAV VLC_FOURCC('m','s',0x00,0x11) +#define VLC_CODEC_ADPCM_IMA_AMV VLC_FOURCC('i','m','a','v') +#define VLC_CODEC_ADPCM_IMA_QT VLC_FOURCC('i','m','a','4') +#define VLC_CODEC_ADPCM_YAMAHA VLC_FOURCC('m','s',0x00,0x20) +#define VLC_CODEC_ADPCM_DK3 VLC_FOURCC('m','s',0x00,0x62) +#define VLC_CODEC_ADPCM_DK4 VLC_FOURCC('m','s',0x00,0x61) +#define VLC_CODEC_ADPCM_THP VLC_FOURCC('T','H','P','A') +#define VLC_CODEC_G723_1 VLC_FOURCC('g','7','2', 0x31) +#define VLC_CODEC_G729 VLC_FOURCC('g','7','2','9') +#define VLC_CODEC_VMDAUDIO VLC_FOURCC('v','m','d','a') +#define VLC_CODEC_AMR_NB VLC_FOURCC('s','a','m','r') +#define VLC_CODEC_AMR_WB VLC_FOURCC('s','a','w','b') +#define VLC_CODEC_ALAC VLC_FOURCC('a','l','a','c') +#define VLC_CODEC_QDM2 VLC_FOURCC('Q','D','M','2') +#define VLC_CODEC_COOK VLC_FOURCC('c','o','o','k') +#define VLC_CODEC_SIPR VLC_FOURCC('s','i','p','r') +#define VLC_CODEC_TTA VLC_FOURCC('T','T','A','1') +#define VLC_CODEC_SHORTEN VLC_FOURCC('s','h','n',' ') +#define VLC_CODEC_WAVPACK VLC_FOURCC('W','V','P','K') +#define VLC_CODEC_GSM VLC_FOURCC('g','s','m',' ') +#define VLC_CODEC_GSM_MS VLC_FOURCC('a','g','s','m') +#define VLC_CODEC_ATRAC1 VLC_FOURCC('a','t','r','1') +#define VLC_CODEC_ATRAC3 VLC_FOURCC('a','t','r','c') +#define VLC_CODEC_ATRAC3P VLC_FOURCC('a','t','r','p') +#define VLC_CODEC_IMC VLC_FOURCC(0x1,0x4,0x0,0x0) +#define VLC_CODEC_TRUESPEECH VLC_FOURCC(0x22,0x0,0x0,0x0) +#define VLC_CODEC_NELLYMOSER VLC_FOURCC('N','E','L','L') +#define VLC_CODEC_APE VLC_FOURCC('A','P','E',' ') +#define VLC_CODEC_QCELP VLC_FOURCC('Q','c','l','p') +#define VLC_CODEC_302M VLC_FOURCC('3','0','2','m') +#define VLC_CODEC_DVD_LPCM VLC_FOURCC('l','p','c','m') +#define VLC_CODEC_DVDA_LPCM VLC_FOURCC('a','p','c','m') +#define VLC_CODEC_BD_LPCM VLC_FOURCC('b','p','c','m') +#define VLC_CODEC_WIDI_LPCM VLC_FOURCC('w','p','c','m') +#define VLC_CODEC_SDDS VLC_FOURCC('s','d','d','s') +#define VLC_CODEC_MIDI VLC_FOURCC('M','I','D','I') +#define VLC_CODEC_RALF VLC_FOURCC('R','A','L','F') + +#define VLC_CODEC_S8 VLC_FOURCC('s','8',' ',' ') +#define VLC_CODEC_U8 VLC_FOURCC('u','8',' ',' ') +#define VLC_CODEC_S16L VLC_FOURCC('s','1','6','l') +#define VLC_CODEC_S16B VLC_FOURCC('s','1','6','b') +#define VLC_CODEC_U16L VLC_FOURCC('u','1','6','l') +#define VLC_CODEC_U16B VLC_FOURCC('u','1','6','b') +#define VLC_CODEC_S20B VLC_FOURCC('s','2','0','b') +#define VLC_CODEC_S24L VLC_FOURCC('s','2','4','l') +#define VLC_CODEC_S24B VLC_FOURCC('s','2','4','b') +#define VLC_CODEC_U24L VLC_FOURCC('u','2','4','l') +#define VLC_CODEC_U24B VLC_FOURCC('u','2','4','b') +#define VLC_CODEC_S24L32 VLC_FOURCC('s','2','4','4') +#define VLC_CODEC_S24B32 VLC_FOURCC('S','2','4','4') +#define VLC_CODEC_S32L VLC_FOURCC('s','3','2','l') +#define VLC_CODEC_S32B VLC_FOURCC('s','3','2','b') +#define VLC_CODEC_U32L VLC_FOURCC('u','3','2','l') +#define VLC_CODEC_U32B VLC_FOURCC('u','3','2','b') +#define VLC_CODEC_F32L VLC_FOURCC('f','3','2','l') +#define VLC_CODEC_F32B VLC_FOURCC('f','3','2','b') +#define VLC_CODEC_F64L VLC_FOURCC('f','6','4','l') +#define VLC_CODEC_F64B VLC_FOURCC('f','6','4','b') + +#define VLC_CODEC_ALAW VLC_FOURCC('a','l','a','w') +#define VLC_CODEC_MULAW VLC_FOURCC('m','l','a','w') +#define VLC_CODEC_DAT12 VLC_FOURCC('L','P','1','2') +#define VLC_CODEC_S24DAUD VLC_FOURCC('d','a','u','d') +#define VLC_CODEC_TWINVQ VLC_FOURCC('T','W','I','N') +#define VLC_CODEC_BMVAUDIO VLC_FOURCC('B','M','V','A') +#define VLC_CODEC_ULEAD_DV_AUDIO_NTSC VLC_FOURCC('m','s',0x02,0x15) +#define VLC_CODEC_ULEAD_DV_AUDIO_PAL VLC_FOURCC('m','s',0x02,0x16) +#define VLC_CODEC_INDEO_AUDIO VLC_FOURCC('m','s',0x04,0x02) +#define VLC_CODEC_METASOUND VLC_FOURCC('m','s',0x00,0x75) +#define VLC_CODEC_ON2AVC VLC_FOURCC('m','s',0x05,0x00) +#define VLC_CODEC_TAK VLC_FOURCC('t','a','k',' ') +#define VLC_CODEC_SMACKAUDIO VLC_FOURCC('S','M','K','A') + +/* Subtitle */ +#define VLC_CODEC_SPU VLC_FOURCC('s','p','u',' ') +#define VLC_CODEC_DVBS VLC_FOURCC('d','v','b','s') +#define VLC_CODEC_SUBT VLC_FOURCC('s','u','b','t') +#define VLC_CODEC_XSUB VLC_FOURCC('X','S','U','B') +#define VLC_CODEC_SSA VLC_FOURCC('s','s','a',' ') +#define VLC_CODEC_TEXT VLC_FOURCC('T','E','X','T') +#define VLC_CODEC_TELETEXT VLC_FOURCC('t','e','l','x') +#define VLC_CODEC_KATE VLC_FOURCC('k','a','t','e') +#define VLC_CODEC_CMML VLC_FOURCC('c','m','m','l') +#define VLC_CODEC_ITU_T140 VLC_FOURCC('t','1','4','0') +#define VLC_CODEC_USF VLC_FOURCC('u','s','f',' ') +#define VLC_CODEC_OGT VLC_FOURCC('o','g','t',' ') +#define VLC_CODEC_CVD VLC_FOURCC('c','v','d',' ') +#define VLC_CODEC_TX3G VLC_FOURCC('t','x','3','g') +/* Blu-ray Presentation Graphics */ +#define VLC_CODEC_BD_PG VLC_FOURCC('b','d','p','g') +/* EBU STL (TECH. 3264-E) */ +#define VLC_CODEC_EBU_STL VLC_FOURCC('S','T','L',' ') +#define VLC_CODEC_SCTE_27 VLC_FOURCC('S','C','2','7') + +/* XYZ colorspace 12 bits packed in 16 bits, organisation |XXX0|YYY0|ZZZ0| */ +#define VLC_CODEC_XYZ12 VLC_FOURCC('X','Y','1','2') + + +/* Special endian dependant values + * The suffic N means Native + * The suffix I means Inverted (ie non native) */ +#ifdef WORDS_BIGENDIAN +# define VLC_CODEC_S16N VLC_CODEC_S16B +# define VLC_CODEC_U16N VLC_CODEC_U16B +# define VLC_CODEC_S24N VLC_CODEC_S24B +# define VLC_CODEC_U24N VLC_CODEC_U24B +# define VLC_CODEC_S32N VLC_CODEC_S32B +# define VLC_CODEC_U32N VLC_CODEC_U32B +# define VLC_CODEC_FL32 VLC_CODEC_F32B +# define VLC_CODEC_FL64 VLC_CODEC_F64B + +# define VLC_CODEC_S16I VLC_CODEC_S16L +# define VLC_CODEC_U16I VLC_CODEC_U16L +# define VLC_CODEC_S24I VLC_CODEC_S24L +# define VLC_CODEC_U24I VLC_CODEC_U24L +# define VLC_CODEC_S32I VLC_CODEC_S32L +# define VLC_CODEC_U32I VLC_CODEC_U32L + +#else +# define VLC_CODEC_S16N VLC_CODEC_S16L +# define VLC_CODEC_U16N VLC_CODEC_U16L +# define VLC_CODEC_S24N VLC_CODEC_S24L +# define VLC_CODEC_U24N VLC_CODEC_U24L +# define VLC_CODEC_S32N VLC_CODEC_S32L +# define VLC_CODEC_U32N VLC_CODEC_U32L +# define VLC_CODEC_FL32 VLC_CODEC_F32L +# define VLC_CODEC_FL64 VLC_CODEC_F64L + +# define VLC_CODEC_S16I VLC_CODEC_S16B +# define VLC_CODEC_U16I VLC_CODEC_U16B +# define VLC_CODEC_S24I VLC_CODEC_S24B +# define VLC_CODEC_U24I VLC_CODEC_U24B +# define VLC_CODEC_S32I VLC_CODEC_S32B +# define VLC_CODEC_U32I VLC_CODEC_U32B +#endif + +/* Non official codecs, used to force a profile in an encoder */ +/* MPEG-1 video */ +#define VLC_CODEC_MP1V VLC_FOURCC('m','p','1','v') +/* MPEG-2 video */ +#define VLC_CODEC_MP2V VLC_FOURCC('m','p','2','v') +/* MPEG-I/II layer 2 audio */ +#define VLC_CODEC_MP2 VLC_FOURCC('m','p','2',' ') +/* MPEG-I/II layer 3 audio */ +#define VLC_CODEC_MP3 VLC_FOURCC('m','p','3',' ') + +/** + * It returns the codec associated to a fourcc within a ES category. + * + * If not found, it will return the given fourcc. + * If found, it will always be one of the VLC_CODEC_ defined above. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns the codec associated to a fourcc store in a zero terminated + * string. + * + * If the string is NULL or does not have exactly 4 charateres, it will + * return 0, otherwise it behaves like vlc_fourcc_GetCodec. + * + * Provided for convenience. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char * ); + +/** + * It convert the gives fourcc to an audio codec when possible. + * + * The fourcc converted are aflt, araw/pcm , twos, sowt. When an incompatible i_bits + * is detected, 0 is returned. + * The other fourcc goes through vlc_fourcc_GetCodec and i_bits is not checked. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits ); + +/** + * It returns the description of the given fourcc or NULL if not found. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API const char * vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns a list (terminated with the value 0) of YUV fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetYUVFallback( vlc_fourcc_t ); + +/** + * It returns a list (terminated with the value 0) of RGB fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetRGBFallback( vlc_fourcc_t ); + +/** + * It returns true if the given fourcc is YUV and false otherwise. + */ +VLC_API bool vlc_fourcc_IsYUV( vlc_fourcc_t ); + +/** + * It returns true if the two fourccs are equivalent if their U&V planes are + * swapped. + */ +VLC_API bool vlc_fourcc_AreUVPlanesSwapped(vlc_fourcc_t , vlc_fourcc_t ); + +/** + * Chroma related information. + */ +typedef struct { + unsigned plane_count; + struct { + struct { + unsigned num; + unsigned den; + } w; + struct { + unsigned num; + unsigned den; + } h; + } p[4]; + unsigned pixel_size; /* Number of bytes per pixel for a plane */ + unsigned pixel_bits; /* Number of bits actually used bits per pixel for a plane */ +} vlc_chroma_description_t; + +/** + * It returns a vlc_chroma_description_t describing the request fourcc or NULL + * if not found. + */ +VLC_API const vlc_chroma_description_t * vlc_fourcc_GetChromaDescription( vlc_fourcc_t fourcc ); + +#endif /* _VLC_FOURCC_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_fs.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_fs.h new file mode 100644 index 0000000..533aa9b --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_fs.h @@ -0,0 +1,107 @@ +/***************************************************************************** + * vlc_fs.h: File system helpers + ***************************************************************************** + * Copyright © 2006-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FS_H +#define VLC_FS_H 1 + +/** + * \file + * Those functions convert file paths from UTF-8 to the system-specific + * encoding (especially UTF-16 on Windows). Also, they always mark file + * descriptor with the close-on-exec flag. + */ + +#include +#include + +VLC_API int vlc_open( const char *filename, int flags, ... ) VLC_USED; +VLC_API FILE * vlc_fopen( const char *filename, const char *mode ) VLC_USED; +VLC_API int vlc_openat( int fd, const char *filename, int flags, ... ) VLC_USED; + +VLC_API DIR * vlc_opendir( const char *dirname ) VLC_USED; +VLC_API char * vlc_readdir( DIR *dir ) VLC_USED; +VLC_API int vlc_loaddir( DIR *dir, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); +VLC_API int vlc_scandir( const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); +VLC_API int vlc_mkdir( const char *filename, mode_t mode ); + +VLC_API int vlc_unlink( const char *filename ); +VLC_API int vlc_rename( const char *oldpath, const char *newpath ); +VLC_API char *vlc_getcwd( void ) VLC_USED; + +#if defined( _WIN32 ) +typedef struct vlc_DIR +{ + _WDIR *wdir; /* MUST be first, see */ + char *entry; + union + { + DWORD drives; + bool insert_dot_dot; + } u; +} vlc_DIR; + +static inline int vlc_closedir( DIR *dir ) +{ + vlc_DIR *vdir = (vlc_DIR *)dir; + _WDIR *wdir = vdir->wdir; + + free( vdir->entry ); + free( vdir ); + return (wdir != NULL) ? _wclosedir( wdir ) : 0; +} +# undef closedir +# define closedir vlc_closedir + +static inline void vlc_rewinddir( DIR *dir ) +{ + _WDIR *wdir = *(_WDIR **)dir; + + _wrewinddir( wdir ); +} +# undef rewinddir +# define rewinddir vlc_rewinddir + +# include +# ifndef stat +# define stat _stati64 +# endif +# ifndef fstat +# define fstat _fstati64 +# endif +# ifndef _MSC_VER +# undef lseek +# define lseek _lseeki64 +# endif +#endif + +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + +struct stat; + +VLC_API int vlc_stat( const char *filename, struct stat *buf ); +VLC_API int vlc_lstat( const char *filename, struct stat *buf ); + +VLC_API int vlc_mkstemp( char * ); + +VLC_API int vlc_dup( int ); +VLC_API int vlc_pipe( int[2] ); +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_gcrypt.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_gcrypt.h new file mode 100644 index 0000000..89bdab8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_gcrypt.h @@ -0,0 +1,103 @@ +/***************************************************************************** + * vlc_gcrypt.h: VLC thread support for gcrypt + ***************************************************************************** + * Copyright (C) 2004-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file implements gcrypt support functions in vlc + */ + +#include + +#ifdef LIBVLC_USE_PTHREAD +/** + * If possible, use gcrypt-provided thread implementation. This is so that + * other non-VLC components (inside the process) can also use gcrypt safely. + */ +GCRY_THREAD_OPTION_PTHREAD_IMPL; +# define gcry_threads_vlc gcry_threads_pthread +#else + +/** + * gcrypt thread option VLC implementation + */ + +static int gcry_vlc_mutex_init( void **p_sys ) +{ + vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) ); + if( p_lock == NULL) + return ENOMEM; + + vlc_mutex_init( p_lock ); + *p_sys = p_lock; + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_destroy( void **p_sys ) +{ + vlc_mutex_t *p_lock = (vlc_mutex_t *)*p_sys; + vlc_mutex_destroy( p_lock ); + free( p_lock ); + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_lock( void **p_sys ) +{ + vlc_mutex_lock( (vlc_mutex_t *)*p_sys ); + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_unlock( void **lock ) +{ + vlc_mutex_unlock( (vlc_mutex_t *)*lock ); + return VLC_SUCCESS; +} + +static const struct gcry_thread_cbs gcry_threads_vlc = +{ + GCRY_THREAD_OPTION_USER, + NULL, + gcry_vlc_mutex_init, + gcry_vlc_mutex_destroy, + gcry_vlc_mutex_lock, + gcry_vlc_mutex_unlock, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; +#endif + +/** + * Initializes gcrypt with proper locking. + */ +static inline void vlc_gcrypt_init (void) +{ + /* This would need a process-wide static mutex with all libraries linking + * to a given instance of libgcrypt. We cannot do this as we have different + * plugins linking with gcrypt, and some underlying libraries may use it + * behind our back. Only way is to always link gcrypt statically (ouch!) or + * have upstream gcrypt provide one shared object per threading system. */ + static bool done = false; + + vlc_global_lock (VLC_GCRYPT_MUTEX); + if (!done) + { + gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc); + done = true; + } + vlc_global_unlock (VLC_GCRYPT_MUTEX); +} diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_http.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_http.h new file mode 100644 index 0000000..9b0510a --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_http.h @@ -0,0 +1,67 @@ +/***************************************************************************** + * vlc_http.h: Shared code for HTTP clients + ***************************************************************************** + * Copyright (C) 2001-2008 VLC authors and VideoLAN + * $Id: ddde13efed1e11a15632f17e1da4437f59750988 $ + * + * Authors: Laurent Aimar + * Christophe Massiot + * Rémi Denis-Courmont + * Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTP_H +#define VLC_HTTP_H 1 + +/** + * \file + * This file defines functions, structures, enums and macros shared between + * HTTP clients. + */ + +/* RFC 2617: Basic and Digest Access Authentication */ +typedef struct http_auth_t +{ + char *psz_realm; + char *psz_domain; + char *psz_nonce; + char *psz_opaque; + char *psz_stale; + char *psz_algorithm; + char *psz_qop; + int i_nonce; + char *psz_cnonce; + char *psz_HA1; /* stored H(A1) value if algorithm = "MD5-sess" */ +} http_auth_t; + + +VLC_API void http_auth_Init( http_auth_t * ); +VLC_API void http_auth_Reset( http_auth_t * ); +VLC_API void http_auth_ParseWwwAuthenticateHeader + ( vlc_object_t *, http_auth_t * , + const char * ); +VLC_API int http_auth_ParseAuthenticationInfoHeader + ( vlc_object_t *, http_auth_t *, + const char *, const char *, + const char *, const char *, + const char * ); +VLC_API char *http_auth_FormatAuthorizationHeader + ( vlc_object_t *, http_auth_t *, + const char *, const char *, + const char *, const char * ) VLC_USED; + +#endif /* VLC_HTTP_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_httpd.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_httpd.h new file mode 100644 index 0000000..ade72f9 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_httpd.h @@ -0,0 +1,153 @@ +/***************************************************************************** + * vlc_httpd.h: builtin HTTP/RTSP server. + ***************************************************************************** + * Copyright (C) 2004-2006 VLC authors and VideoLAN + * $Id: 852a7a8c15f9c419cf00e2565d71986500258da7 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTPD_H +#define VLC_HTTPD_H 1 + +/** + * \file + * HTTP/RTSP server API. + */ + +enum +{ + HTTPD_MSG_NONE, + + /* answer */ + HTTPD_MSG_ANSWER, + + /* http request */ + HTTPD_MSG_GET, + HTTPD_MSG_HEAD, + HTTPD_MSG_POST, + + /* rtsp request */ + HTTPD_MSG_OPTIONS, + HTTPD_MSG_DESCRIBE, + HTTPD_MSG_SETUP, + HTTPD_MSG_PLAY, + HTTPD_MSG_PAUSE, + HTTPD_MSG_GETPARAMETER, + HTTPD_MSG_TEARDOWN, + + /* just to track the count of MSG */ + HTTPD_MSG_MAX +}; + +enum +{ + HTTPD_PROTO_NONE, + HTTPD_PROTO_HTTP, /* HTTP/1.x */ + HTTPD_PROTO_RTSP, /* RTSP/1.x */ + HTTPD_PROTO_HTTP0, /* HTTP/0.x */ +}; + +typedef struct httpd_host_t httpd_host_t; +typedef struct httpd_client_t httpd_client_t; +/* create a new host */ +VLC_API httpd_host_t *vlc_http_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_https_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_rtsp_HostNew( vlc_object_t * ) VLC_USED; +/* delete a host */ +VLC_API void httpd_HostDelete( httpd_host_t * ); + +typedef struct +{ + char * name; + char * value; +} httpd_header; + +typedef struct httpd_message_t +{ + httpd_client_t *cl; /* NULL if not throught a connection e vlc internal */ + + uint8_t i_type; + uint8_t i_proto; + uint8_t i_version; + + /* for an answer */ + int i_status; + + /* for a query */ + char *psz_url; + /* FIXME find a clean way to handle GET(psz_args) + and POST(body) through the same code */ + uint8_t *psz_args; + + /* options */ + size_t i_headers; + httpd_header *p_headers; + + /* body */ + int64_t i_body_offset; + int i_body; + uint8_t *p_body; + +} httpd_message_t; + +typedef struct httpd_url_t httpd_url_t; +typedef struct httpd_callback_sys_t httpd_callback_sys_t; +typedef int (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query ); +/* register a new url */ +VLC_API httpd_url_t * httpd_UrlNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password ) VLC_USED; +/* register callback on a url */ +VLC_API int httpd_UrlCatch( httpd_url_t *, int i_msg, httpd_callback_t, httpd_callback_sys_t * ); +/* delete a url */ +VLC_API void httpd_UrlDelete( httpd_url_t * ); + +VLC_API char* httpd_ClientIP( const httpd_client_t *cl, char *, int * ); +VLC_API char* httpd_ServerIP( const httpd_client_t *cl, char *, int * ); + +/* High level */ + +typedef struct httpd_file_t httpd_file_t; +typedef struct httpd_file_sys_t httpd_file_sys_t; +typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_file_t * httpd_FileNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password, httpd_file_callback_t pf_fill, httpd_file_sys_t * ) VLC_USED; +VLC_API httpd_file_sys_t * httpd_FileDelete( httpd_file_t * ); + + +typedef struct httpd_handler_t httpd_handler_t; +typedef struct httpd_handler_sys_t httpd_handler_sys_t; +typedef int (*httpd_handler_callback_t)( httpd_handler_sys_t *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_handler_t * httpd_HandlerNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password, httpd_handler_callback_t pf_fill, httpd_handler_sys_t * ) VLC_USED; +VLC_API httpd_handler_sys_t * httpd_HandlerDelete( httpd_handler_t * ); + +typedef struct httpd_redirect_t httpd_redirect_t; +VLC_API httpd_redirect_t * httpd_RedirectNew( httpd_host_t *, const char *psz_url_dst, const char *psz_url_src ) VLC_USED; +VLC_API void httpd_RedirectDelete( httpd_redirect_t * ); + + +typedef struct httpd_stream_t httpd_stream_t; +VLC_API httpd_stream_t * httpd_StreamNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password ) VLC_USED; +VLC_API void httpd_StreamDelete( httpd_stream_t * ); +VLC_API int httpd_StreamHeader( httpd_stream_t *, uint8_t *p_data, int i_data ); +VLC_API int httpd_StreamSend( httpd_stream_t *, const block_t *p_block ); +VLC_API int httpd_StreamSetHTTPHeaders(httpd_stream_t *, httpd_header *, size_t); + +/* Msg functions facilities */ +VLC_API void httpd_MsgAdd( httpd_message_t *, const char *psz_name, const char *psz_value, ... ) VLC_FORMAT( 3, 4 ); +/* return "" if not found. The string is not allocated */ +VLC_API const char * httpd_MsgGet( const httpd_message_t *, const char *psz_name ); + +#endif /* _VLC_HTTPD_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_image.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_image.h new file mode 100644 index 0000000..52419af --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_image.h @@ -0,0 +1,81 @@ +/***************************************************************************** + * vlc_image.h : wrapper for image reading/writing facilities + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: 52bce1f24495ffdbadfb6d0aef0953577992b9a2 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_IMAGE_H +#define VLC_IMAGE_H 1 + +/** + * \file + * This file defines functions and structures for image conversions in vlc + */ + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +struct image_handler_t +{ + picture_t * (*pf_read) ( image_handler_t *, block_t *, + video_format_t *, video_format_t * ); + picture_t * (*pf_read_url) ( image_handler_t *, const char *, + video_format_t *, video_format_t * ); + block_t * (*pf_write) ( image_handler_t *, picture_t *, + video_format_t *, video_format_t * ); + int (*pf_write_url) ( image_handler_t *, picture_t *, + video_format_t *, video_format_t *, + const char * ); + + picture_t * (*pf_convert) ( image_handler_t *, picture_t *, + video_format_t *, video_format_t * ); + picture_t * (*pf_filter) ( image_handler_t *, picture_t *, + video_format_t *, const char * ); + + /* Private properties */ + vlc_object_t *p_parent; + decoder_t *p_dec; + encoder_t *p_enc; + filter_t *p_filter; +}; + +VLC_API image_handler_t * image_HandlerCreate( vlc_object_t * ) VLC_USED; +#define image_HandlerCreate( a ) image_HandlerCreate( VLC_OBJECT(a) ) +VLC_API void image_HandlerDelete( image_handler_t * ); + +#define image_Read( a, b, c, d ) a->pf_read( a, b, c, d ) +#define image_ReadUrl( a, b, c, d ) a->pf_read_url( a, b, c, d ) +#define image_Write( a, b, c, d ) a->pf_write( a, b, c, d ) +#define image_WriteUrl( a, b, c, d, e ) a->pf_write_url( a, b, c, d, e ) +#define image_Convert( a, b, c, d ) a->pf_convert( a, b, c, d ) +#define image_Filter( a, b, c, d ) a->pf_filter( a, b, c, d ) + +VLC_API vlc_fourcc_t image_Type2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Ext2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Mime2Fourcc( const char *psz_mime ); + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_IMAGE_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_inhibit.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_inhibit.h new file mode 100644 index 0000000..b1f7330 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_inhibit.h @@ -0,0 +1,54 @@ +/***************************************************************************** + * vlc_inhibit.h: VLC screen saver inhibition + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines the interface for screen-saver inhibition modules + */ + +#ifndef VLC_INHIBIT_H +# define VLC_INHIBIT_H 1 + +typedef struct vlc_inhibit vlc_inhibit_t; +typedef struct vlc_inhibit_sys vlc_inhibit_sys_t; + +enum vlc_inhibit_flags +{ + VLC_INHIBIT_NONE=0 /*< No inhibition */, + VLC_INHIBIT_SUSPEND=0x1 /*< Processor is in use - do not suspend */, + VLC_INHIBIT_DISPLAY=0x2 /*< Display is in use - do not blank/lock */, +#define VLC_INHIBIT_AUDIO (VLC_INHIBIT_SUSPEND) +#define VLC_INHIBIT_VIDEO (VLC_INHIBIT_SUSPEND|VLC_INHIBIT_DISPLAY) +}; + +struct vlc_inhibit +{ + VLC_COMMON_MEMBERS + + vlc_inhibit_sys_t *p_sys; + void (*inhibit) (vlc_inhibit_t *, unsigned flags); +}; + +static inline void vlc_inhibit_Set (vlc_inhibit_t *ih, unsigned flags) +{ + ih->inhibit (ih, flags); +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_input.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_input.h new file mode 100644 index 0000000..f53bcaa --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_input.h @@ -0,0 +1,676 @@ +/***************************************************************************** + * vlc_input.h: Core input structures + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: 13a944a2ac92728542d3f33755daf7857113d5d9 $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/* __ is need because conflict with */ +#ifndef VLC_INPUT_H +#define VLC_INPUT_H 1 + +/** + * \file + * This file defines functions, structures and enums for input objects in vlc + */ + +#include +#include +#include +#include +#include +#include + +#include + +/***************************************************************************** + * Seek point: (generalisation of chapters) + *****************************************************************************/ +struct seekpoint_t +{ + int64_t i_byte_offset; + int64_t i_time_offset; + char *psz_name; +}; + +static inline seekpoint_t *vlc_seekpoint_New( void ) +{ + seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) ); + if( !point ) + return NULL; + point->i_byte_offset = + point->i_time_offset = -1; + point->psz_name = NULL; + return point; +} + +static inline void vlc_seekpoint_Delete( seekpoint_t *point ) +{ + if( !point ) return; + free( point->psz_name ); + free( point ); +} + +static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src ) +{ + seekpoint_t *point = vlc_seekpoint_New(); + if( src->psz_name ) point->psz_name = strdup( src->psz_name ); + point->i_time_offset = src->i_time_offset; + point->i_byte_offset = src->i_byte_offset; + return point; +} + +/***************************************************************************** + * Title: + *****************************************************************************/ +typedef struct input_title_t +{ + char *psz_name; + + bool b_menu; /* Is it a menu or a normal entry */ + + int64_t i_length; /* Length(microsecond) if known, else 0 */ + int64_t i_size; /* Size (bytes) if known, else 0 */ + + /* Title seekpoint */ + int i_seekpoint; + seekpoint_t **seekpoint; + +} input_title_t; + +static inline input_title_t *vlc_input_title_New(void) +{ + input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) ); + if( !t ) + return NULL; + + t->psz_name = NULL; + t->b_menu = false; + t->i_length = 0; + t->i_size = 0; + t->i_seekpoint = 0; + t->seekpoint = NULL; + + return t; +} + +static inline void vlc_input_title_Delete( input_title_t *t ) +{ + int i; + if( t == NULL ) + return; + + free( t->psz_name ); + for( i = 0; i < t->i_seekpoint; i++ ) + { + free( t->seekpoint[i]->psz_name ); + free( t->seekpoint[i] ); + } + free( t->seekpoint ); + free( t ); +} + +static inline input_title_t *vlc_input_title_Duplicate( const input_title_t *t ) +{ + input_title_t *dup = vlc_input_title_New( ); + int i; + + if( t->psz_name ) dup->psz_name = strdup( t->psz_name ); + dup->b_menu = t->b_menu; + dup->i_length = t->i_length; + dup->i_size = t->i_size; + dup->i_seekpoint = t->i_seekpoint; + if( t->i_seekpoint > 0 ) + { + dup->seekpoint = (seekpoint_t**)calloc( t->i_seekpoint, + sizeof(seekpoint_t*) ); + + for( i = 0; i < t->i_seekpoint; i++ ) + { + dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] ); + } + } + + return dup; +} + +/***************************************************************************** + * Attachments + *****************************************************************************/ +struct input_attachment_t +{ + char *psz_name; + char *psz_mime; + char *psz_description; + + int i_data; + void *p_data; +}; + +static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name, + const char *psz_mime, + const char *psz_description, + const void *p_data, + int i_data ) +{ + input_attachment_t *a = + (input_attachment_t*)malloc( sizeof(input_attachment_t) ); + if( !a ) + return NULL; + a->psz_name = strdup( psz_name ? psz_name : "" ); + a->psz_mime = strdup( psz_mime ? psz_mime : "" ); + a->psz_description = strdup( psz_description ? psz_description : "" ); + a->i_data = i_data; + a->p_data = NULL; + if( i_data > 0 ) + { + a->p_data = malloc( i_data ); + if( a->p_data && p_data ) + memcpy( a->p_data, p_data, i_data ); + } + return a; +} +static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a ) +{ + return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description, + a->p_data, a->i_data ); +} +static inline void vlc_input_attachment_Delete( input_attachment_t *a ) +{ + if( !a ) + return; + free( a->psz_name ); + free( a->psz_mime ); + free( a->psz_description ); + free( a->p_data ); + free( a ); +} + +/***************************************************************************** + * input defines/constants. + *****************************************************************************/ + +/** + * This defines private core storage for an input. + */ +typedef struct input_thread_private_t input_thread_private_t; + +/** + * This defines an opaque input resource handler. + */ +typedef struct input_resource_t input_resource_t; + +/** + * Main structure representing an input thread. This structure is mostly + * private. The only public fields are READ-ONLY. You must use the helpers + * to modify them + */ +struct input_thread_t +{ + VLC_COMMON_MEMBERS + + bool b_error; + bool b_eof; + bool b_preparsing; + bool b_dead; + + /* All other data is input_thread is PRIVATE. You can't access it + * outside of src/input */ + input_thread_private_t *p; +}; + +/** + * Record prefix string. + * TODO make it configurable. + */ +#define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%Hh%Mm%Ss-$ N-$ p" + +/***************************************************************************** + * Input events and variables + *****************************************************************************/ + +/** + * \defgroup inputvariable Input variables + * + * The input provides multiples variable you can write to and/or read from. + * + * TODO complete the documentation. + * The read only variables are: + * - "length" + * - "can-seek" (if you can seek, it doesn't say if 'bar display' has be shown + * or not, for that check position != 0.0) + * - "can-pause" + * - "can-rate" + * - "can-rewind" + * - "can-record" (if a stream can be recorded while playing) + * - "teletext-es" (list of id from the spu tracks (spu-es) that are teletext, the + * variable value being the one currently selected, -1 if no teletext) + * - "signal-quality" + * - "signal-strength" + * - "program-scrambled" (if the current program is scrambled) + * - "cache" (level of data cached [0 .. 1]) + * + * The read-write variables are: + * - state (\see input_state_e) + * - rate + * - position, position-offset + * - time, time-offset + * - title, next-title, prev-title + * - chapter, next-chapter, next-chapter-prev + * - program, audio-es, video-es, spu-es + * - audio-delay, spu-delay + * - bookmark (bookmark list) + * - record + * - frame-next + * - navigation (list of "title %2i") + * - "title %2i" + * + * The variable used for event is + * - intf-event (\see input_event_type_e) + */ + +/** + * Input state + * + * This enum is used by the variable "state" + */ +typedef enum input_state_e +{ + INIT_S = 0, + OPENING_S, + PLAYING_S, + PAUSE_S, + END_S, + ERROR_S, +} input_state_e; + +/** + * Input rate. + * + * It is an float used by the variable "rate" in the + * range [INPUT_RATE_DEFAULT/INPUT_RATE_MAX, INPUT_RATE_DEFAULT/INPUT_RATE_MIN] + * the default value being 1. It represents the ratio of playback speed to + * nominal speed (bigger is faster). + * + * Internally, the rate is stored as a value in the range + * [INPUT_RATE_MIN, INPUT_RATE_MAX]. + * internal rate = INPUT_RATE_DEFAULT / rate variable + */ + +/** + * Default rate value + */ +#define INPUT_RATE_DEFAULT 1000 +/** + * Minimal rate value + */ +#define INPUT_RATE_MIN 32 /* Up to 32/1 */ +/** + * Maximal rate value + */ +#define INPUT_RATE_MAX 32000 /* Up to 1/32 */ + +/** + * Input events + * + * You can catch input event by adding a callback on the variable "intf-event". + * This variable is an integer that will hold a input_event_type_e value. + */ +typedef enum input_event_type_e +{ + /* "state" has changed */ + INPUT_EVENT_STATE, + /* b_dead is true */ + INPUT_EVENT_DEAD, + /* a *user* abort has been requested */ + INPUT_EVENT_ABORT, + + /* "rate" has changed */ + INPUT_EVENT_RATE, + + /* At least one of "position" or "time" */ + INPUT_EVENT_POSITION, + + /* "length" has changed */ + INPUT_EVENT_LENGTH, + + /* A title has been added or removed or selected. + * It imply that chapter has changed (not chapter event is sent) */ + INPUT_EVENT_TITLE, + /* A chapter has been added or removed or selected. */ + INPUT_EVENT_CHAPTER, + + /* A program ("program") has been added or removed or selected, + * or "program-scrambled" has changed.*/ + INPUT_EVENT_PROGRAM, + /* A ES has been added or removed or selected */ + INPUT_EVENT_ES, + /* "teletext-es" has changed */ + INPUT_EVENT_TELETEXT, + + /* "record" has changed */ + INPUT_EVENT_RECORD, + + /* input_item_t media has changed */ + INPUT_EVENT_ITEM_META, + /* input_item_t info has changed */ + INPUT_EVENT_ITEM_INFO, + /* input_item_t name has changed */ + INPUT_EVENT_ITEM_NAME, + /* input_item_t epg has changed */ + INPUT_EVENT_ITEM_EPG, + + /* Input statistics have been updated */ + INPUT_EVENT_STATISTICS, + /* At least one of "signal-quality" or "signal-strength" has changed */ + INPUT_EVENT_SIGNAL, + + /* "audio-delay" has changed */ + INPUT_EVENT_AUDIO_DELAY, + /* "spu-delay" has changed */ + INPUT_EVENT_SUBTITLE_DELAY, + + /* "bookmark" has changed */ + INPUT_EVENT_BOOKMARK, + + /* cache" has changed */ + INPUT_EVENT_CACHE, + + /* A audio_output_t object has been created/deleted by *the input* */ + INPUT_EVENT_AOUT, + /* A vout_thread_t object has been created/deleted by *the input* */ + INPUT_EVENT_VOUT, + +} input_event_type_e; + +/** + * Input queries + */ +enum input_query_e +{ + /* input variable "position" */ + INPUT_GET_POSITION, /* arg1= double * res= */ + INPUT_SET_POSITION, /* arg1= double res=can fail */ + + /* input variable "length" */ + INPUT_GET_LENGTH, /* arg1= int64_t * res=can fail */ + + /* input variable "time" */ + INPUT_GET_TIME, /* arg1= int64_t * res= */ + INPUT_SET_TIME, /* arg1= int64_t res=can fail */ + + /* input variable "rate" (nominal is INPUT_RATE_DEFAULT) */ + INPUT_GET_RATE, /* arg1= int * res= */ + INPUT_SET_RATE, /* arg1= int res=can fail */ + + /* input variable "state" */ + INPUT_GET_STATE, /* arg1= int * res= */ + INPUT_SET_STATE, /* arg1= int res=can fail */ + + /* input variable "audio-delay" and "sub-delay" */ + INPUT_GET_AUDIO_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_AUDIO_DELAY, /* arg1 = int res=can fail */ + INPUT_GET_SPU_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_SPU_DELAY, /* arg1 = int res=can fail */ + + /* Menu navigation */ + INPUT_NAV_ACTIVATE, + INPUT_NAV_UP, + INPUT_NAV_DOWN, + INPUT_NAV_LEFT, + INPUT_NAV_RIGHT, + + /* Meta datas */ + INPUT_ADD_INFO, /* arg1= char* arg2= char* arg3=... res=can fail */ + INPUT_REPLACE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_MERGE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_GET_INFO, /* arg1= char* arg2= char* arg3= char** res=can fail */ + INPUT_DEL_INFO, /* arg1= char* arg2= char* res=can fail */ + INPUT_SET_NAME, /* arg1= char* res=can fail */ + + /* Input properties */ + INPUT_GET_VIDEO_FPS, /* arg1= double * res=can fail */ + + /* bookmarks */ + INPUT_GET_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_GET_BOOKMARKS, /* arg1= seekpoint_t *** arg2= int * res=can fail */ + INPUT_CLEAR_BOOKMARKS, /* res=can fail */ + INPUT_ADD_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_CHANGE_BOOKMARK, /* arg1= seekpoint_t * arg2= int * res=can fail */ + INPUT_DEL_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_SET_BOOKMARK, /* arg1= int res=can fail */ + + /* titles */ + INPUT_GET_TITLE_INFO, /* arg1=input_title_t** arg2= int * res=can fail */ + + /* Attachments */ + INPUT_GET_ATTACHMENTS, /* arg1=input_attachment_t***, arg2=int* res=can fail */ + INPUT_GET_ATTACHMENT, /* arg1=input_attachment_t**, arg2=char* res=can fail */ + + /* On the fly input slave */ + INPUT_ADD_SLAVE, /* arg1= const char * */ + INPUT_ADD_SUBTITLE, /* arg1= const char *, arg2=bool b_check_extension */ + + /* On the fly record while playing */ + INPUT_SET_RECORD_STATE, /* arg1=bool res=can fail */ + INPUT_GET_RECORD_STATE, /* arg1=bool* res=can fail */ + + /* ES */ + INPUT_RESTART_ES, /* arg1=int (-AUDIO/VIDEO/SPU_ES for the whole category) */ + + /* Input ressources + * XXX You must call vlc_object_release as soon as possible */ + INPUT_GET_AOUT, /* arg1=audio_output_t ** res=can fail */ + INPUT_GET_VOUTS, /* arg1=vout_thread_t ***, size_t * res=can fail */ + INPUT_GET_ES_OBJECTS, /* arg1=int id, vlc_object_t **dec, vout_thread_t **, audio_output_t ** */ + + /* External clock managments */ + INPUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + INPUT_MODIFY_PCR_SYSTEM,/* arg1=int absolute, arg2=mtime_t res=can fail */ +}; + +/** @}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +VLC_API input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *, const char *psz_log, input_resource_t * ) VLC_USED; +#define input_Create(a,b,c,d) input_Create(VLC_OBJECT(a),b,c,d) + +VLC_API input_thread_t * input_CreateAndStart( vlc_object_t *p_parent, input_item_t *, const char *psz_log ) VLC_USED; +#define input_CreateAndStart(a,b,c) input_CreateAndStart(VLC_OBJECT(a),b,c) + +VLC_API int input_Start( input_thread_t * ); + +VLC_API void input_Stop( input_thread_t *, bool b_abort ); + +VLC_API int input_Read( vlc_object_t *, input_item_t * ); +#define input_Read(a,b) input_Read(VLC_OBJECT(a),b) + +VLC_API int input_vaControl( input_thread_t *, int i_query, va_list ); + +VLC_API int input_Control( input_thread_t *, int i_query, ... ); + +VLC_API void input_Close( input_thread_t * ); +void input_Join( input_thread_t * ); +void input_Release( input_thread_t * ); + +/** + * Get the input item for an input thread + * + * You have to keep a reference to the input or to the input_item_t until + * you do not need it anymore. + */ +VLC_API input_item_t* input_GetItem( input_thread_t * ) VLC_USED; + +/** + * It will return the current state of the input. + * Provided for convenience. + */ +static inline input_state_e input_GetState( input_thread_t * p_input ) +{ + input_state_e state = INIT_S; + input_Control( p_input, INPUT_GET_STATE, &state ); + return state; +} + +/** + * Return one of the video output (if any). If possible, you should use + * INPUT_GET_VOUTS directly and process _all_ video outputs instead. + * @param p_input an input thread from which to get a video output + * @return NULL on error, or a video output thread pointer (which needs to be + * released with vlc_object_release()). + */ +static inline vout_thread_t *input_GetVout( input_thread_t *p_input ) +{ + vout_thread_t **pp_vout, *p_vout; + size_t i_vout; + + if( input_Control( p_input, INPUT_GET_VOUTS, &pp_vout, &i_vout ) ) + return NULL; + + for( size_t i = 1; i < i_vout; i++ ) + vlc_object_release( (vlc_object_t *)(pp_vout[i]) ); + + p_vout = (i_vout >= 1) ? pp_vout[0] : NULL; + free( pp_vout ); + return p_vout; +} + +/** + * It will add a new subtitle source to the input. + * Provided for convenience. + */ +static inline int input_AddSubtitleOSD( input_thread_t *p_input, const char *psz_url, + bool b_check_extension, bool b_osd ) +{ + int i_result = input_Control( p_input, INPUT_ADD_SUBTITLE, psz_url, b_check_extension ); + if( i_result != VLC_SUCCESS || !b_osd ) + return i_result; + + vout_thread_t *p_vout = input_GetVout( p_input ); + if( p_vout ) + { + vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s", + vlc_gettext("Subtitle track added") ); + vlc_object_release( (vlc_object_t *)p_vout ); + } + return i_result; +} +#define input_AddSubtitle(a, b, c) input_AddSubtitleOSD(a, b, c, false) + + +/** + * Return the audio output (if any) associated with an input. + * @param p_input an input thread + * @return NULL on error, or the audio output (which needs to be + * released with vlc_object_release()). + */ +static inline audio_output_t *input_GetAout( input_thread_t *p_input ) +{ + audio_output_t *p_aout; + return input_Control( p_input, INPUT_GET_AOUT, &p_aout ) ? NULL : p_aout; +} + +/** + * Returns the objects associated to an ES. + * + * You must release all non NULL object using vlc_object_release. + * You may set pointer of pointer to NULL to avoid retreiving it. + */ +static inline int input_GetEsObjects( input_thread_t *p_input, int i_id, + vlc_object_t **pp_decoder, + vout_thread_t **pp_vout, audio_output_t **pp_aout ) +{ + return input_Control( p_input, INPUT_GET_ES_OBJECTS, i_id, + pp_decoder, pp_vout, pp_aout ); +} + +/** + * \see input_clock_GetSystemOrigin + */ +static inline int input_GetPcrSystem( input_thread_t *p_input, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return input_Control( p_input, INPUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +/** + * \see input_clock_ChangeSystemOrigin + */ +static inline int input_ModifyPcrSystem( input_thread_t *p_input, bool b_absolute, mtime_t i_system ) +{ + return input_Control( p_input, INPUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/* */ +VLC_API decoder_t * input_DecoderCreate( vlc_object_t *, es_format_t *, input_resource_t * ) VLC_USED; +VLC_API void input_DecoderDelete( decoder_t * ); +VLC_API void input_DecoderDecode( decoder_t *, block_t *, bool b_do_pace ); + +/** + * This function creates a sane filename path. + */ +VLC_API char * input_CreateFilename( input_thread_t *, const char *psz_path, const char *psz_prefix, const char *psz_extension ) VLC_USED; + +/** + * It creates an empty input resource handler. + * + * The given object MUST stay alive as long as the input_resource_t is + * not deleted. + */ +VLC_API input_resource_t * input_resource_New( vlc_object_t * ) VLC_USED; + +/** + * It releases an input resource. + */ +VLC_API void input_resource_Release( input_resource_t * ); + +/** + * Forcefully destroys the video output (e.g. when the playlist is stopped). + */ +VLC_API void input_resource_TerminateVout( input_resource_t * ); + +/** + * This function releases all resources (object). + */ +VLC_API void input_resource_Terminate( input_resource_t * ); + +/** + * \return the current audio output if any. + * Use vlc_object_release() to drop the reference. + */ +VLC_API audio_output_t *input_resource_HoldAout( input_resource_t * ); + +/** + * This function creates or recycles an audio output. + */ +VLC_API audio_output_t *input_resource_GetAout( input_resource_t * ); + +/** + * This function retains or destroys an audio output. + */ +VLC_API void input_resource_PutAout( input_resource_t *, audio_output_t * ); + +/** + * Prevents the existing audio output (if any) from being recycled. + */ +VLC_API void input_resource_ResetAout( input_resource_t * ); + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_input_item.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_input_item.h new file mode 100644 index 0000000..8dd17a8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_input_item.h @@ -0,0 +1,351 @@ +/***************************************************************************** + * vlc_input_item.h: Core input item + ***************************************************************************** + * Copyright (C) 1999-2009 VLC authors and VideoLAN + * $Id: f4eb4bb23416e1b7ed774b447c5948b3086f9cfe $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INPUT_ITEM_H +#define VLC_INPUT_ITEM_H 1 + +/** + * \file + * This file defines functions, structures and enums for input items in vlc + */ + +#include +#include +#include + +#include + +/***************************************************************************** + * input_item_t: Describes an input and is used to spawn input_thread_t objects + *****************************************************************************/ +struct info_t +{ + char *psz_name; /**< Name of this info */ + char *psz_value; /**< Value of the info */ +}; + +struct info_category_t +{ + char *psz_name; /**< Name of this category */ + int i_infos; /**< Number of infos in the category */ + struct info_t **pp_infos; /**< Pointer to an array of infos */ +}; + +struct input_item_t +{ + int i_id; /**< Identifier of the item */ + + char *psz_name; /**< text describing this item */ + char *psz_uri; /**< mrl of this item */ + + int i_options; /**< Number of input options */ + char **ppsz_options; /**< Array of input options */ + uint8_t *optflagv; /**< Some flags of input options */ + unsigned optflagc; + + mtime_t i_duration; /**< Duration in microseconds */ + + + int i_categories; /**< Number of info categories */ + info_category_t **pp_categories; /**< Pointer to the first info category */ + + int i_es; /**< Number of es format descriptions */ + es_format_t **es; /**< Es formats */ + + input_stats_t *p_stats; /**< Statistics */ + int i_nb_played; /**< Number of times played */ + + vlc_meta_t *p_meta; + + int i_epg; /**< Number of EPG entries */ + vlc_epg_t **pp_epg; /**< EPG entries */ + + vlc_event_manager_t event_manager; + + vlc_mutex_t lock; /**< Lock for the item */ + + uint8_t i_type; /**< Type (file, disc, ... see input_item_type_e) */ + bool b_fixed_name; /**< Can the interface change the name ?*/ + bool b_error_when_reading;/**< Error When Reading */ +}; + +TYPEDEF_ARRAY(input_item_t*, input_item_array_t) + +enum input_item_type_e +{ + ITEM_TYPE_UNKNOWN, + ITEM_TYPE_FILE, + ITEM_TYPE_DIRECTORY, + ITEM_TYPE_DISC, + ITEM_TYPE_CDDA, + ITEM_TYPE_CARD, + ITEM_TYPE_NET, + ITEM_TYPE_PLAYLIST, + ITEM_TYPE_NODE, + + /* This one is not a real type but the number of input_item types. */ + ITEM_TYPE_NUMBER +}; + +struct input_item_node_t +{ + input_item_t * p_item; + int i_children; + input_item_node_t **pp_children; + input_item_node_t *p_parent; +}; + +VLC_API void input_item_CopyOptions( input_item_t *p_parent, input_item_t *p_child ); +VLC_API void input_item_SetName( input_item_t *p_item, const char *psz_name ); + +/** + * Add one subitem to this item + * + * This won't hold the item, but can tell to interested third parties + * Like the playlist, that there is a new sub item. With this design + * It is not the input item's responsability to keep all the ref of + * the input item children. + * + * Sends a vlc_InputItemSubItemTreeAdded and a vlc_InputItemSubItemAdded event + */ +VLC_API void input_item_PostSubItem( input_item_t *p_parent, input_item_t *p_child ); + +/** + * Start adding multiple subitems. + * + * Create a root node to hold a tree of subitems for given item + */ +VLC_API input_item_node_t * input_item_node_Create( input_item_t *p_input ) VLC_USED; + +/** + * Add a new child node to this parent node that will point to this subitem. + */ +VLC_API input_item_node_t * input_item_node_AppendItem( input_item_node_t *p_node, input_item_t *p_item ); + +/** + * Add an already created node to children of this parent node. + */ +VLC_API void input_item_node_AppendNode( input_item_node_t *p_parent, input_item_node_t *p_child ); + +/** + * Delete a node created with input_item_node_Create() and all its children. + */ +VLC_API void input_item_node_Delete( input_item_node_t *p_node ); + +/** + * End adding multiple subitems. + * + * Sends a vlc_InputItemSubItemTreeAdded event to notify that the item pointed to + * by the given root node has created new subitems that are pointed to by all the + * children of the node. + * + * Also sends vlc_InputItemSubItemAdded event for every child under the given root node; + * + * In the end deletes the node and all its children nodes. + */ +VLC_API void input_item_node_PostAndDelete( input_item_node_t *p_node ); + + +/** + * Option flags + */ +enum input_item_option_e +{ + /* Allow VLC to trust the given option. + * By default options are untrusted */ + VLC_INPUT_OPTION_TRUSTED = 0x2, + + /* Add the option, unless the same option + * is already present. */ + VLC_INPUT_OPTION_UNIQUE = 0x100, +}; + +/** + * This function allows to add an option to an existing input_item_t. + */ +VLC_API int input_item_AddOption(input_item_t *, const char *, unsigned i_flags ); + +/* */ +VLC_API bool input_item_HasErrorWhenReading( input_item_t * ); +VLC_API void input_item_SetMeta( input_item_t *, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API bool input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz ); +VLC_API char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type ) VLC_USED; +VLC_API char * input_item_GetName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetTitleFbName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetURI( input_item_t * p_i ) VLC_USED; +VLC_API void input_item_SetURI( input_item_t * p_i, const char *psz_uri ); +VLC_API mtime_t input_item_GetDuration( input_item_t * p_i ); +VLC_API void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration ); +VLC_API bool input_item_IsPreparsed( input_item_t *p_i ); +VLC_API bool input_item_IsArtFetched( input_item_t *p_i ); + +static inline char *input_item_GetNowPlayingFb( input_item_t *p_item ) +{ + char *psz_meta = input_item_GetMeta( p_item, vlc_meta_NowPlaying ); + if( !psz_meta || strlen( psz_meta ) == 0 ) + { + free( psz_meta ); + return input_item_GetMeta( p_item, vlc_meta_ESNowPlaying ); + } + return psz_meta; +} + +#define INPUT_META( name ) \ +static inline \ +void input_item_Set ## name (input_item_t *p_input, const char *val) \ +{ \ + input_item_SetMeta (p_input, vlc_meta_ ## name, val); \ +} \ +static inline \ +char *input_item_Get ## name (input_item_t *p_input) \ +{ \ + return input_item_GetMeta (p_input, vlc_meta_ ## name); \ +} + +INPUT_META(Title) +INPUT_META(Artist) +INPUT_META(Genre) +INPUT_META(Copyright) +INPUT_META(Album) +INPUT_META(TrackNumber) +INPUT_META(Description) +INPUT_META(Rating) +INPUT_META(Date) +INPUT_META(Setting) +INPUT_META(URL) +INPUT_META(Language) +INPUT_META(NowPlaying) +INPUT_META(ESNowPlaying) +INPUT_META(Publisher) +INPUT_META(EncodedBy) +INPUT_META(ArtworkURL) +INPUT_META(TrackID) +INPUT_META(TrackTotal) +INPUT_META(Director) +INPUT_META(Season) +INPUT_META(Episode) +INPUT_META(ShowName) +INPUT_META(Actors) + +#define input_item_SetTrackNum input_item_SetTrackNumber +#define input_item_GetTrackNum input_item_GetTrackNumber +#define input_item_SetArtURL input_item_SetArtworkURL +#define input_item_GetArtURL input_item_GetArtworkURL + +VLC_API char * input_item_GetInfo( input_item_t *p_i, const char *psz_cat,const char *psz_name ) VLC_USED; +VLC_API int input_item_AddInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name, const char *psz_format, ... ) VLC_FORMAT( 4, 5 ); +VLC_API int input_item_DelInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name ); +VLC_API void input_item_ReplaceInfos( input_item_t *, info_category_t * ); +VLC_API void input_item_MergeInfos( input_item_t *, info_category_t * ); + +/** + * This function creates a new input_item_t with the provided information. + * + * XXX You may also use input_item_New or input_item_NewExt as they need + * less arguments. + */ +VLC_API input_item_t * input_item_NewWithType( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration, int i_type ) VLC_USED; + +/** + * This function creates a new input_item_t with the provided information. + * + * Provided for convenience. + */ +VLC_API input_item_t * input_item_NewExt( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration ) VLC_USED; + +/** + * This function creates a new input_item_t with the provided information. + * + * Provided for convenience. + */ +#define input_item_New( a,b ) input_item_NewExt( a, b, 0, NULL, 0, -1 ) + +/** + * This function creates a new input_item_t as a copy of another. + */ +VLC_API input_item_t * input_item_Copy(input_item_t * ) VLC_USED; + +/** Holds an input item, i.e. creates a new reference. */ +VLC_API input_item_t *input_item_Hold(input_item_t *); + +/** Releases an input item, i.e. decrements its reference counter. */ +VLC_API void input_item_Release(input_item_t *); + +/* Historical hack... */ +#define vlc_gc_incref(i) input_item_Hold(i) +#define vlc_gc_decref(i) input_item_Release(i) + +typedef enum input_item_meta_request_option_t +{ + META_REQUEST_OPTION_NONE = 0x00, + META_REQUEST_OPTION_SCOPE_LOCAL = 0x01, + META_REQUEST_OPTION_SCOPE_NETWORK = 0x02, + META_REQUEST_OPTION_SCOPE_ANY = 0x03 +} input_item_meta_request_option_t; + +VLC_API int libvlc_MetaRequest(libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t ); +VLC_API int libvlc_ArtRequest(libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t ); + +/****************** + * Input stats + ******************/ +struct input_stats_t +{ + vlc_mutex_t lock; + + /* Input */ + int64_t i_read_packets; + int64_t i_read_bytes; + float f_input_bitrate; + float f_average_input_bitrate; + + /* Demux */ + int64_t i_demux_read_packets; + int64_t i_demux_read_bytes; + float f_demux_bitrate; + float f_average_demux_bitrate; + int64_t i_demux_corrupted; + int64_t i_demux_discontinuity; + + /* Decoders */ + int64_t i_decoded_audio; + int64_t i_decoded_video; + + /* Vout */ + int64_t i_displayed_pictures; + int64_t i_lost_pictures; + + /* Sout */ + int64_t i_sent_packets; + int64_t i_sent_bytes; + float f_send_bitrate; + + /* Aout */ + int64_t i_played_abuffers; + int64_t i_lost_abuffers; +}; + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_keys.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_keys.h new file mode 100644 index 0000000..bf31710 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_keys.h @@ -0,0 +1,237 @@ +/***************************************************************************** + * vlc_keys.h: keycode defines + ***************************************************************************** + * Copyright (C) 2003-2009 VLC authors and VideoLAN + * $Id: 49edab323f602e2149b6371bdb3b3277732b9cc0 $ + * + * Authors: Sigmund Augdal Helberg + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_KEYS_H +#define VLC_KEYS_H 1 + +/** + * \file + * This file defines keys and functions + */ + +#define KEY_MODIFIER 0xFF000000 +#define KEY_MODIFIER_ALT 0x01000000 +#define KEY_MODIFIER_SHIFT 0x02000000 +#define KEY_MODIFIER_CTRL 0x04000000 +#define KEY_MODIFIER_META 0x08000000 +#define KEY_MODIFIER_COMMAND 0x10000000 + +#define KEY_UNSET 0x00000000 +#define KEY_BACKSPACE 0x08 +#define KEY_TAB 0x09 +#define KEY_ENTER 0x0D +#define KEY_ESC 0x1B +/* End of Unicode range: 0x0010FFFF */ +#define KEY_LEFT 0x00210000 +#define KEY_RIGHT 0x00220000 +#define KEY_UP 0x00230000 +#define KEY_DOWN 0x00240000 +#define KEY_F1 0x00270000 +#define KEY_F2 0x00280000 +#define KEY_F3 0x00290000 +#define KEY_F4 0x002A0000 +#define KEY_F5 0x002B0000 +#define KEY_F6 0x002C0000 +#define KEY_F7 0x002D0000 +#define KEY_F8 0x002E0000 +#define KEY_F9 0x002F0000 +#define KEY_F10 0x00300000 +#define KEY_F11 0x00310000 +#define KEY_F12 0x00320000 +#define KEY_HOME 0x00330000 +#define KEY_END 0x00340000 +#define KEY_INSERT 0x00350000 +#define KEY_DELETE 0x00360000 +#define KEY_MENU 0x00370000 +#define KEY_PAGEUP 0x00390000 +#define KEY_PAGEDOWN 0x003A0000 +#define KEY_PRINT 0x003B0000 +#define KEY_PAUSE 0x003D0000 + +#define KEY_BROWSER_BACK 0x003F0000 +#define KEY_BROWSER_FORWARD 0x00400000 +#define KEY_BROWSER_REFRESH 0x00410000 +#define KEY_BROWSER_STOP 0x00420000 +#define KEY_BROWSER_SEARCH 0x00430000 +#define KEY_BROWSER_FAVORITES 0x00440000 +#define KEY_BROWSER_HOME 0x00450000 +#define KEY_VOLUME_MUTE 0x00460000 +#define KEY_VOLUME_DOWN 0x00470000 +#define KEY_VOLUME_UP 0x00480000 +#define KEY_MEDIA_NEXT_TRACK 0x00490000 +#define KEY_MEDIA_PREV_TRACK 0x004A0000 +#define KEY_MEDIA_STOP 0x004B0000 +#define KEY_MEDIA_PLAY_PAUSE 0x004C0000 +#define KEY_MEDIA_RECORD 0x004D0000 +#define KEY_MEDIA_REWIND 0x004E0000 +#define KEY_MEDIA_FORWARD 0x004F0000 +#define KEY_MEDIA_REPEAT 0x00500000 +#define KEY_MEDIA_SHUFFLE 0x00510000 +#define KEY_MEDIA_SUBTITLE 0x00520000 +#define KEY_MEDIA_AUDIO 0x00530000 +#define KEY_MEDIA_ANGLE 0x00540000 +#define KEY_MEDIA_TIME 0x00550000 +#define KEY_MEDIA_FRAME_PREV 0x00560000 +#define KEY_MEDIA_FRAME_NEXT 0x00570000 +#define KEY_MEDIA_SELECT 0x00580000 +#define KEY_MEDIA_VIEW 0x00590000 +#define KEY_MEDIA_MENU 0x005A0000 +#define KEY_ZOOM_IN 0x00600000 +#define KEY_ZOOM_OUT 0x00610000 +#define KEY_BRIGHTNESS_UP 0x00620000 +#define KEY_BRIGHTNESS_DOWN 0x00630000 + +#define KEY_MOUSEWHEELUP 0x00F00000 +#define KEY_MOUSEWHEELDOWN 0x00F10000 +#define KEY_MOUSEWHEELLEFT 0x00F20000 +#define KEY_MOUSEWHEELRIGHT 0x00F30000 + +VLC_API char *vlc_keycode2str(uint_fast32_t i_key, bool locale) VLC_USED; +VLC_API uint_fast32_t vlc_str2keycode(const char *str) VLC_USED; + +typedef enum vlc_action { + ACTIONID_NONE = 0, + ACTIONID_QUIT, + ACTIONID_PLAY_PAUSE, + ACTIONID_PLAY, + ACTIONID_PAUSE, + ACTIONID_STOP, + ACTIONID_PREV, + ACTIONID_NEXT, + ACTIONID_SLOWER, + ACTIONID_FASTER, + ACTIONID_TOGGLE_FULLSCREEN, + ACTIONID_VOL_UP, + ACTIONID_VOL_DOWN, + ACTIONID_NAV_ACTIVATE, + ACTIONID_NAV_UP, + ACTIONID_NAV_DOWN, + ACTIONID_NAV_LEFT, + ACTIONID_NAV_RIGHT, + ACTIONID_JUMP_BACKWARD_EXTRASHORT, + ACTIONID_JUMP_FORWARD_EXTRASHORT, + ACTIONID_JUMP_BACKWARD_SHORT, + ACTIONID_JUMP_FORWARD_SHORT, + ACTIONID_JUMP_BACKWARD_MEDIUM, + ACTIONID_JUMP_FORWARD_MEDIUM, + ACTIONID_JUMP_BACKWARD_LONG, + ACTIONID_JUMP_FORWARD_LONG, + ACTIONID_FRAME_NEXT, + ACTIONID_POSITION, + ACTIONID_VOL_MUTE, +/* let ACTIONID_SET_BOOMARK* and ACTIONID_PLAY_BOOKMARK* be contiguous */ + ACTIONID_SET_BOOKMARK1, + ACTIONID_SET_BOOKMARK2, + ACTIONID_SET_BOOKMARK3, + ACTIONID_SET_BOOKMARK4, + ACTIONID_SET_BOOKMARK5, + ACTIONID_SET_BOOKMARK6, + ACTIONID_SET_BOOKMARK7, + ACTIONID_SET_BOOKMARK8, + ACTIONID_SET_BOOKMARK9, + ACTIONID_SET_BOOKMARK10, + ACTIONID_PLAY_BOOKMARK1, + ACTIONID_PLAY_BOOKMARK2, + ACTIONID_PLAY_BOOKMARK3, + ACTIONID_PLAY_BOOKMARK4, + ACTIONID_PLAY_BOOKMARK5, + ACTIONID_PLAY_BOOKMARK6, + ACTIONID_PLAY_BOOKMARK7, + ACTIONID_PLAY_BOOKMARK8, + ACTIONID_PLAY_BOOKMARK9, + ACTIONID_PLAY_BOOKMARK10, + /* end of contiguous zone */ + ACTIONID_PLAY_CLEAR, + ACTIONID_SUBDELAY_UP, + ACTIONID_SUBDELAY_DOWN, + ACTIONID_SUBSYNC_MARKAUDIO, + ACTIONID_SUBSYNC_MARKSUB, + ACTIONID_SUBSYNC_APPLY, + ACTIONID_SUBSYNC_RESET, + ACTIONID_SUBPOS_UP, + ACTIONID_SUBPOS_DOWN, + ACTIONID_AUDIO_TRACK, + ACTIONID_SUBTITLE_TRACK, + ACTIONID_SUBTITLE_TOGGLE, + ACTIONID_INTF_TOGGLE_FSC, + ACTIONID_INTF_HIDE, + ACTIONID_INTF_BOSS, + /* chapter and title navigation */ + ACTIONID_TITLE_PREV, + ACTIONID_TITLE_NEXT, + ACTIONID_CHAPTER_PREV, + ACTIONID_CHAPTER_NEXT, + /* end of chapter and title navigation */ + ACTIONID_AUDIODELAY_UP, + ACTIONID_AUDIODELAY_DOWN, + ACTIONID_SNAPSHOT, + ACTIONID_RECORD, + ACTIONID_DISC_MENU, + ACTIONID_ASPECT_RATIO, + ACTIONID_CROP, + ACTIONID_DEINTERLACE, + ACTIONID_DEINTERLACE_MODE, + ACTIONID_ZOOM, + ACTIONID_UNZOOM, + ACTIONID_CROP_TOP, + ACTIONID_UNCROP_TOP, + ACTIONID_CROP_LEFT, + ACTIONID_UNCROP_LEFT, + ACTIONID_CROP_BOTTOM, + ACTIONID_UNCROP_BOTTOM, + ACTIONID_CROP_RIGHT, + ACTIONID_UNCROP_RIGHT, + ACTIONID_RANDOM, + ACTIONID_LOOP, + ACTIONID_WALLPAPER, + ACTIONID_LEAVE_FULLSCREEN, + /* Zoom */ + ACTIONID_ZOOM_QUARTER, + ACTIONID_ZOOM_HALF, + ACTIONID_ZOOM_ORIGINAL, + ACTIONID_ZOOM_DOUBLE, + /* Cycle Through Audio Devices */ + ACTIONID_AUDIODEVICE_CYCLE, + /* scaling */ + ACTIONID_TOGGLE_AUTOSCALE, + ACTIONID_SCALE_UP, + ACTIONID_SCALE_DOWN, + /* */ + ACTIONID_RATE_NORMAL, + ACTIONID_RATE_SLOWER_FINE, + ACTIONID_RATE_FASTER_FINE, + /* Cycle Through Program Service IDs */ + ACTIONID_PROGRAM_SID_NEXT, + ACTIONID_PROGRAM_SID_PREV, + ACTIONID_INTF_POPUP_MENU, + +} vlc_action_t; + +VLC_API vlc_action_t vlc_GetActionId(const char *psz_key) VLC_USED; + +struct hotkey +{ + const char *psz_action; +}; + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_main.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_main.h new file mode 100644 index 0000000..142ce01 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_main.h @@ -0,0 +1,43 @@ +/***************************************************************************** + * vlc_main.h: access to all program variables + * Declaration and extern access to LibVLC instance object. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002, 2008 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_int_t internal libvlc instance + */ + +struct hotkey; + +/***************************************************************************** + * libvlc_internal_instance_t + ***************************************************************************** + * This structure is a LibVLC instance, for use by libvlc core and plugins + *****************************************************************************/ +struct libvlc_int_t +{ + VLC_COMMON_MEMBERS + + /* Structure storing the action name / key associations */ + const struct hotkey *p_hotkeys; +}; + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_md5.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_md5.h new file mode 100644 index 0000000..9b8c579 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_md5.h @@ -0,0 +1,59 @@ +/***************************************************************************** + * vlc_md5.h: MD5 hash + ***************************************************************************** + * Copyright © 2004-2011 VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MD5_H +# define VLC_MD5_H + +/** + * \file + * This file defines functions and structures to compute MD5 digests + */ + +struct md5_s +{ + uint32_t A, B, C, D; /* chaining variables */ + uint32_t nblocks; + uint8_t buf[64]; + int count; +}; + +VLC_API void InitMD5( struct md5_s * ); +VLC_API void AddMD5( struct md5_s *, const void *, size_t ); +VLC_API void EndMD5( struct md5_s * ); + +/** + * Returns a char representation of the md5 hash, as shown by UNIX md5 or + * md5sum tools. + */ +static inline char * psz_md5_hash( struct md5_s *md5_s ) +{ + char *psz = malloc( 33 ); /* md5 string is 32 bytes + NULL character */ + if( likely(psz) ) + { + for( int i = 0; i < 16; i++ ) + sprintf( &psz[2*i], "%02" PRIx8, md5_s->buf[i] ); + } + return psz; +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_media_library.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_media_library.h new file mode 100644 index 0000000..e7e1f70 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_media_library.h @@ -0,0 +1,127 @@ +/***************************************************************************** + * vlc_media_library.h: SQL-based media library + ***************************************************************************** + * Copyright (C) 2008-2010 the VideoLAN Team and AUTHORS + * $Id: a35d9729ca3705ec792b7be9e1819919f6e601f6 $ + * + * Authors: Antoine Lejeune + * Jean-Philippe André + * Rémi Duraffort + * Adrien Maglo + * Srikanth Raju + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MEDIA_LIBRARY_H +# define VLC_MEDIA_LIBRARY_H + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * ML Enums + *****************************************************************************/ + +#define ML_PERSON_ARTIST "Artist" +#define ML_PERSON_ALBUM_ARTIST "Album Artist" +#define ML_PERSON_ENCODER "Encoder" +#define ML_PERSON_PUBLISHER "Publisher" + + +/** List of Query select types. + * In a query array or variable argument list, each select type is followed + * by an argument (X) of variable type (char* or int, @see ml_element_t). + * These types can be used either in the query list or in the result array. + * Some types are reserved for the result array: + */ +typedef enum +{ + ML_ALBUM = 1, /**< Album Title */ + ML_ALBUM_ID, /**< Album ID */ + ML_ALBUM_COVER, /**< Album Cover art url */ + /* FIXME: Remove ML_ARTIST */ + ML_ARTIST, /**< Artist, interpreted as ML_PEOPLE + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_ARTIST_ID, /**< Artist ID, interpreted as ML_PEOPLE_ID + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_COMMENT, /**< Comment about media */ + ML_COUNT_MEDIA, /**< Number of medias */ + ML_COUNT_ALBUM, /**< Number of albums */ + ML_COUNT_PEOPLE, /**< Number of people */ + ML_COVER, /**< Cover art url */ + ML_DURATION, /**< Duration in ms */ + ML_DISC_NUMBER, /**< Disc number of the track */ + ML_EXTRA, /**< Extra/comment (string) on the media */ + ML_FIRST_PLAYED, /**< First time media was played */ + ML_FILESIZE, /**< Size of the media file */ + ML_GENRE, /**< Genre of the media (if any) */ + ML_ID, /**< Media ID */ + ML_IMPORT_TIME, /**< Date when media was imported */ + ML_LANGUAGE, /**< Language */ + ML_LAST_PLAYED, /**< Last play UNIX timestamp */ + ML_LAST_SKIPPED, /**< Time when media was last skipped */ + ML_ORIGINAL_TITLE, /**< Media original title (if any) */ + ML_PEOPLE, /**< Any People associated with this media */ + ML_PEOPLE_ID, /**< Id of a person */ + ML_PEOPLE_ROLE, /**< Person role */ + ML_PLAYED_COUNT, /**< Media play count */ + ML_PREVIEW, /**< Url of the video preview */ + ML_SKIPPED_COUNT, /**< Number of times skipped */ + ML_SCORE, /**< Computed media score */ + ML_TITLE, /**< Media title */ + ML_TRACK_NUMBER, /**< Media track number (if any) */ + ML_TYPE, /**< Media type. @see ml_type_e */ + ML_URI, /**< Media full URI. */ + ML_VOTE, /**< Media user vote value */ + ML_YEAR, /**< Media publishing year */ + ML_DIRECTORY, /**< Monitored directory */ + ML_MEDIA, /**< Full media descriptor. @see ml_media_t */ + ML_MEDIA_SPARSE, /**< Sparse media. @see ml_media_t */ + ML_MEDIA_EXTRA, /**< Sparse + Extra = Full media */ + + /* Some special elements */ + ML_LIMIT = -1, /**< Limit a query to X results */ + ML_SORT_DESC = -2, /**< Sort a query descending on argument X */ + ML_SORT_ASC = -3, /**< Sort a query ascending on argument X */ + ML_DISTINCT = -4, /**< Add DISTINCT to SELECT statements. */ + ML_END = -42 /**< End of argument list */ +} ml_select_e; + +/** Media types (audio, video, etc...) */ +typedef enum +{ + ML_UNKNOWN = 0, /**< Unknown media type */ + ML_AUDIO = 1 << 0, /**< Audio only media */ + ML_VIDEO = 1 << 1, /**< Video media. May contain audio channels */ + ML_STREAM = 1 << 2, /**< Streamed media = not a local file */ + ML_NODE = 1 << 3, /**< Nodes like simple nodes, directories, playlists, etc */ + ML_REMOVABLE = 1 << 4, /**< Removable media: CD/DVD/Card/... */ +} ml_type_e; + +/** Query result item/list type: integers, strings, medias, timestamps */ +typedef enum { + ML_TYPE_INT, /**< Object is an int */ + ML_TYPE_PSZ, /**< A string char* */ + ML_TYPE_TIME, /**< A timestamp mtime_t */ + ML_TYPE_MEDIA, /**< A pointer to a media ml_media_t* */ +} ml_result_type_e; + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* VLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_messages.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_messages.h new file mode 100644 index 0000000..e5b1833 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_messages.h @@ -0,0 +1,90 @@ +/***************************************************************************** + * vlc_messages.h: messages interface + * This library provides basic functions for threads to interact with user + * interface, such as message output. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002 VLC authors and VideoLAN + * $Id: f746f61c09afd91f89dee61340a1d090bd96416c $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MESSAGES_H_ +#define VLC_MESSAGES_H_ + +/** + * \file + * This file defines structures and functions to handle messages and statistics gathering + */ + +#include + +/** + * \defgroup messages Messages + * This library provides basic functions for threads to interact with user + * interface, such as message output. + * + * @{ + */ + +/** Message types */ +enum vlc_log_type +{ + VLC_MSG_INFO=0, /**< Important information */ + VLC_MSG_ERR, /**< Error */ + VLC_MSG_WARN, /**< Warning */ + VLC_MSG_DBG, /**< Debug */ +}; + +/** + * Log message + */ +typedef struct vlc_log_t +{ + uintptr_t i_object_id; /**< Emitter (temporaly) unique object ID or 0 */ + const char *psz_object_type; /**< Emitter object type name */ + const char *psz_module; /**< Emitter module (source code) */ + const char *psz_header; /**< Additional header (used by VLM media) */ +} vlc_log_t; + +VLC_API void vlc_Log(vlc_object_t *, int, + const char *, const char *, ...) VLC_FORMAT( 4, 5 ); +VLC_API void vlc_vaLog(vlc_object_t *, int, + const char *, const char *, va_list); +#define msg_GenericVa(a, b, c, d, e) vlc_vaLog(VLC_OBJECT(a), b, c, d, e) + +#define msg_Info( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_INFO, MODULE_STRING, __VA_ARGS__ ) +#define msg_Err( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_ERR, MODULE_STRING, __VA_ARGS__ ) +#define msg_Warn( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_WARN, MODULE_STRING, __VA_ARGS__ ) +#define msg_Dbg( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_DBG, MODULE_STRING, __VA_ARGS__ ) + +#ifndef MODULE_STRING +# define MODULE_STRING __FILE__ +#endif + +VLC_API const char *vlc_strerror(int); +VLC_API const char *vlc_strerror_c(int); + +/** + * @} + */ +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_meta.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_meta.h new file mode 100644 index 0000000..75cf8b3 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_meta.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_meta.h: Stream meta-data + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: 4292095290d804f6e22303de88ecae86be983fc0 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_H +#define VLC_META_H 1 + +/** + * \file + * This file defines functions and structures for stream meta-data in vlc + * + */ + +typedef enum vlc_meta_type_t +{ + vlc_meta_Title, + vlc_meta_Artist, + vlc_meta_Genre, + vlc_meta_Copyright, + vlc_meta_Album, + vlc_meta_TrackNumber, + vlc_meta_Description, + vlc_meta_Rating, + vlc_meta_Date, + vlc_meta_Setting, + vlc_meta_URL, + vlc_meta_Language, + vlc_meta_NowPlaying, + vlc_meta_ESNowPlaying, + vlc_meta_Publisher, + vlc_meta_EncodedBy, + vlc_meta_ArtworkURL, + vlc_meta_TrackID, + vlc_meta_TrackTotal, + vlc_meta_Director, + vlc_meta_Season, + vlc_meta_Episode, + vlc_meta_ShowName, + vlc_meta_Actors, +} vlc_meta_type_t; + +#define VLC_META_TYPE_COUNT 24 + +#define ITEM_PREPARSED 1 +#define ITEM_ARTURL_FETCHED 2 +#define ITEM_ART_FETCHED 4 +#define ITEM_ART_NOTFOUND 8 + +/** + * Basic function to deal with meta + */ +struct vlc_meta_t; + +VLC_API vlc_meta_t * vlc_meta_New( void ) VLC_USED; +VLC_API void vlc_meta_Delete( vlc_meta_t *m ); +VLC_API void vlc_meta_Set( vlc_meta_t *p_meta, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API const char * vlc_meta_Get( const vlc_meta_t *p_meta, vlc_meta_type_t meta_type ); + +VLC_API void vlc_meta_AddExtra( vlc_meta_t *m, const char *psz_name, const char *psz_value ); +VLC_API const char * vlc_meta_GetExtra( const vlc_meta_t *m, const char *psz_name ); +VLC_API unsigned vlc_meta_GetExtraCount( const vlc_meta_t *m ); + +/** + * Allocate a copy of all extra meta names and a table with it. + * Be sure to free both the returned pointers and its name. + */ +VLC_API char ** vlc_meta_CopyExtraNames( const vlc_meta_t *m ) VLC_USED; + +VLC_API void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src ); + +VLC_API int vlc_meta_GetStatus( vlc_meta_t *m ); +VLC_API void vlc_meta_SetStatus( vlc_meta_t *m, int status ); + +/** + * Returns a localizes string describing the meta + */ +VLC_API const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type ); + +/* deprecated (album-art variable) */ +enum { + ALBUM_ART_WHEN_ASKED, + ALBUM_ART_WHEN_PLAYED, + ALBUM_ART_ALL +}; + + +typedef struct meta_export_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + const char *psz_file; +} meta_export_t; + +VLC_API int input_item_WriteMeta(vlc_object_t *, input_item_t *); + +/* Setters for meta. + * Warning: Make sure to use the input_item meta setters (defined in vlc_input_item.h) + * instead of those one. */ +#define vlc_meta_SetTitle( meta, b ) vlc_meta_Set( meta, vlc_meta_Title, b ) +#define vlc_meta_SetArtist( meta, b ) vlc_meta_Set( meta, vlc_meta_Artist, b ) +#define vlc_meta_SetGenre( meta, b ) vlc_meta_Set( meta, vlc_meta_Genre, b ) +#define vlc_meta_SetCopyright( meta, b ) vlc_meta_Set( meta, vlc_meta_Copyright, b ) +#define vlc_meta_SetAlbum( meta, b ) vlc_meta_Set( meta, vlc_meta_Album, b ) +#define vlc_meta_SetTrackNum( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackNumber, b ) +#define vlc_meta_SetDescription( meta, b ) vlc_meta_Set( meta, vlc_meta_Description, b ) +#define vlc_meta_SetRating( meta, b ) vlc_meta_Set( meta, vlc_meta_Rating, b ) +#define vlc_meta_SetDate( meta, b ) vlc_meta_Set( meta, vlc_meta_Date, b ) +#define vlc_meta_SetSetting( meta, b ) vlc_meta_Set( meta, vlc_meta_Setting, b ) +#define vlc_meta_SetURL( meta, b ) vlc_meta_Set( meta, vlc_meta_URL, b ) +#define vlc_meta_SetLanguage( meta, b ) vlc_meta_Set( meta, vlc_meta_Language, b ) +#define vlc_meta_SetNowPlaying( meta, b ) vlc_meta_Set( meta, vlc_meta_NowPlaying, b ) +#define vlc_meta_SetPublisher( meta, b ) vlc_meta_Set( meta, vlc_meta_Publisher, b ) +#define vlc_meta_SetEncodedBy( meta, b ) vlc_meta_Set( meta, vlc_meta_EncodedBy, b ) +#define vlc_meta_SetArtURL( meta, b ) vlc_meta_Set( meta, vlc_meta_ArtworkURL, b ) +#define vlc_meta_SetTrackID( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackID, b ) +#define vlc_meta_SetTrackTotal( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackTotal, b ) +#define vlc_meta_SetDirector( meta, b ) vlc_meta_Set( meta, vlc_meta_Director, b ) +#define vlc_meta_SetSeason( meta, b ) vlc_meta_Set( meta, vlc_meta_Season, b ) +#define vlc_meta_SetEpisode( meta, b ) vlc_meta_Set( meta, vlc_meta_Episode, b ) +#define vlc_meta_SetShowName( meta, b ) vlc_meta_Set( meta, vlc_meta_ShowName, b ) +#define vlc_meta_SetActors( meta, b ) vlc_meta_Set( meta, vlc_meta_Actors, b ) + +#define VLC_META_TITLE vlc_meta_TypeToLocalizedString( vlc_meta_Title ) +#define VLC_META_ARTIST vlc_meta_TypeToLocalizedString( vlc_meta_Artist ) +#define VLC_META_GENRE vlc_meta_TypeToLocalizedString( vlc_meta_Genre ) +#define VLC_META_COPYRIGHT vlc_meta_TypeToLocalizedString( vlc_meta_Copyright ) +#define VLC_META_ALBUM vlc_meta_TypeToLocalizedString( vlc_meta_Album ) +#define VLC_META_TRACK_NUMBER vlc_meta_TypeToLocalizedString( vlc_meta_TrackNumber ) +#define VLC_META_DESCRIPTION vlc_meta_TypeToLocalizedString( vlc_meta_Description ) +#define VLC_META_RATING vlc_meta_TypeToLocalizedString( vlc_meta_Rating ) +#define VLC_META_DATE vlc_meta_TypeToLocalizedString( vlc_meta_Date ) +#define VLC_META_SETTING vlc_meta_TypeToLocalizedString( vlc_meta_Setting ) +#define VLC_META_URL vlc_meta_TypeToLocalizedString( vlc_meta_URL ) +#define VLC_META_LANGUAGE vlc_meta_TypeToLocalizedString( vlc_meta_Language ) +#define VLC_META_NOW_PLAYING vlc_meta_TypeToLocalizedString( vlc_meta_NowPlaying ) +#define VLC_META_PUBLISHER vlc_meta_TypeToLocalizedString( vlc_meta_Publisher ) +#define VLC_META_ENCODED_BY vlc_meta_TypeToLocalizedString( vlc_meta_EncodedBy ) +#define VLC_META_ART_URL vlc_meta_TypeToLocalizedString( vlc_meta_ArtworkURL ) +#define VLC_META_TRACKID vlc_meta_TypeToLocalizedString( vlc_meta_TrackID ) +#define VLC_META_DIRECTOR vlc_meta_TypeToLocalizedString( vlc_meta_Director ) +#define VLC_META_SEASON vlc_meta_TypeToLocalizedString( vlc_meta_Season ) +#define VLC_META_EPISODE vlc_meta_TypeToLocalizedString( vlc_meta_Episode ) +#define VLC_META_SHOW_NAME vlc_meta_TypeToLocalizedString( vlc_meta_ShowName ) +#define VLC_META_ACTORS vlc_meta_TypeToLocalizedString( vlc_meta_Actors ) + +#define VLC_META_EXTRA_MB_ALBUMID "MB_ALBUMID" + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_meta_fetcher.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_meta_fetcher.h new file mode 100644 index 0000000..e806145 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_meta_fetcher.h @@ -0,0 +1,38 @@ +/***************************************************************************** + * vlc_meta_fetcher.h + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_FETCHER_H +#define VLC_META_FETCHER_H 1 + +typedef enum meta_fetcher_scope_t +{ + FETCHER_SCOPE_LOCAL = 0x01, + FETCHER_SCOPE_NETWORK = 0x02, + FETCHER_SCOPE_ANY = 0x03 +} meta_fetcher_scope_t; + +typedef struct meta_fetcher_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + meta_fetcher_scope_t e_scope; +} meta_fetcher_t; + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_mime.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_mime.h new file mode 100644 index 0000000..f04fc95 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_mime.h @@ -0,0 +1,31 @@ +/***************************************************************************** + * vlc_mime.h: Mime type recognition + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MIME_H +#define VLC_MIME_H 1 + +/** + * \file + * Mime type recognition helpers. + */ + +VLC_API const char * vlc_mime_Ext2Mime( const char *psz_url ); + +#endif /* _VLC_MIME_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_modules.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_modules.h new file mode 100644 index 0000000..be68094 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_modules.h @@ -0,0 +1,77 @@ +/***************************************************************************** + * vlc_modules.h : Module descriptor and load functions + ***************************************************************************** + * Copyright (C) 2001-2011 VLC authors and VideoLAN + * $Id: 7f45217969b63e32af360d2e48789f5a16809b9a $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines functions for modules in vlc + */ + +typedef int (*vlc_activate_t)(void *func, va_list args); +typedef void (*vlc_deactivate_t)(void *func, va_list args); + +/***************************************************************************** + * Exported functions. + *****************************************************************************/ + +VLC_API module_t * vlc_module_load( vlc_object_t *obj, const char *cap, const char *name, bool strict, vlc_activate_t probe, ... ) VLC_USED; +#define vlc_module_load(o,c,n,s,...) \ + vlc_module_load(VLC_OBJECT(o),c,n,s,__VA_ARGS__) +VLC_API void vlc_module_unload( module_t *, vlc_deactivate_t deinit, ... ); + +VLC_API module_t * module_need( vlc_object_t *, const char *, const char *, bool ) VLC_USED; +#define module_need(a,b,c,d) module_need(VLC_OBJECT(a),b,c,d) +VLC_API void module_unneed( vlc_object_t *, module_t * ); +#define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b) +VLC_API bool module_exists(const char *) VLC_USED; +VLC_API module_t * module_find(const char *) VLC_USED; + +int module_start(vlc_object_t *, const module_t *); +#define module_start(o, m) module_start(VLC_OBJECT(o),m) +void module_stop(vlc_object_t *, const module_t *); +#define module_stop(o, m) module_stop(VLC_OBJECT(o),m) + +VLC_API module_config_t * module_config_get( const module_t *, unsigned * ) VLC_USED; +VLC_API void module_config_free( module_config_t * ); + +VLC_API void module_list_free(module_t **); +VLC_API module_t ** module_list_get(size_t *n) VLC_USED; + +VLC_API bool module_provides( const module_t *m, const char *cap ); +VLC_API const char * module_get_object( const module_t *m ) VLC_USED; +VLC_API const char * module_get_name( const module_t *m, bool long_name ) VLC_USED; +#define module_GetLongName( m ) module_get_name( m, true ) +VLC_API const char * module_get_help( const module_t *m ) VLC_USED; +VLC_API const char * module_get_capability( const module_t *m ) VLC_USED; +VLC_API int module_get_score( const module_t *m ) VLC_USED; +VLC_API const char * module_gettext( const module_t *, const char * ) VLC_USED; + +VLC_USED static inline module_t *module_get_main (void) +{ + return module_find ("core"); +} +#define module_get_main(a) module_get_main() + +VLC_USED static inline bool module_is_main( const module_t * p_module ) +{ + return !strcmp( module_get_object( p_module ), "core" ); +} diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_mouse.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_mouse.h new file mode 100644 index 0000000..c62ee3c --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_mouse.h @@ -0,0 +1,148 @@ +/***************************************************************************** + * vlc_mouse.h: mouse related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: b48853570a09ad1d77cc95cda0c5b04b5028ee80 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef _VLC_MOUSE_H +#define _VLC_MOUSE_H 1 + +/** + * Mouse buttons + */ +enum +{ + MOUSE_BUTTON_LEFT=0, + MOUSE_BUTTON_CENTER, + MOUSE_BUTTON_RIGHT, + MOUSE_BUTTON_WHEEL_UP, + MOUSE_BUTTON_WHEEL_DOWN, + MOUSE_BUTTON_WHEEL_LEFT, + MOUSE_BUTTON_WHEEL_RIGHT, + MOUSE_BUTTON_MAX +}; + +/** + * Mouse state + */ +typedef struct +{ + /* Coordinate */ + int i_x; + int i_y; + /* Mask of pressed button */ + int i_pressed; + /* Is double clicked */ + bool b_double_click; +} vlc_mouse_t; + +static inline void vlc_mouse_Init( vlc_mouse_t *p_mouse ) +{ + p_mouse->i_x = 0; + p_mouse->i_y = 0; + p_mouse->i_pressed = 0; + p_mouse->b_double_click = false; +} + +/* */ +static inline void vlc_mouse_SetPressed( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed |= 1 << i_button; +} +static inline void vlc_mouse_SetReleased( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed &= ~(1 << i_button); +} +static inline void vlc_mouse_SetPosition( vlc_mouse_t *p_mouse, + int i_x, int i_y ) +{ + p_mouse->i_x = i_x; + p_mouse->i_y = i_y; +} + +/* */ +static inline bool vlc_mouse_IsPressed( const vlc_mouse_t *p_mouse, + int i_button ) +{ + return ( p_mouse->i_pressed & (1 << i_button) ) != 0; +} +static inline bool vlc_mouse_IsLeftPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_LEFT ); +} +static inline bool vlc_mouse_IsCenterPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_CENTER ); +} +static inline bool vlc_mouse_IsRightPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_RIGHT ); +} +static inline bool vlc_mouse_IsWheelUpPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_UP ); +} +static inline bool vlc_mouse_IsWheelDownPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_DOWN ); +} +static inline void vlc_mouse_GetMotion( int *pi_x, int *pi_y, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + *pi_x = p_new->i_x - p_old->i_x; + *pi_y = p_new->i_y - p_old->i_y; +} + +/* */ +static inline bool vlc_mouse_HasChanged( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y || + p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasMoved( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y; +} +static inline bool vlc_mouse_HasButton( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasPressed( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) == 0 && (p_new->i_pressed & i_mask); +} +static inline bool vlc_mouse_HasReleased( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) && (p_new->i_pressed & i_mask) == 0; +} +#endif /* _VLC_MOUSE_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_mtime.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_mtime.h new file mode 100644 index 0000000..42172e0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_mtime.h @@ -0,0 +1,79 @@ +/***************************************************************************** + * vlc_mtime.h: high resolution time management functions + ***************************************************************************** + * This header provides portable high precision time management functions, + * which should be the only ones used in other segments of the program, since + * functions like gettimeofday() and ftime() are not always supported. + * Most functions are declared as inline or as macros since they are only + * interfaces to system calls and have to be called frequently. + * 'm' stands for 'micro', since maximum resolution is the microsecond. + * Functions prototyped are implemented in interface/mtime.c. + ***************************************************************************** + * Copyright (C) 1996, 1997, 1998, 1999, 2000 VLC authors and VideoLAN + * $Id: ab89a972120c8ee3f45d9823994eac584f8fe527 $ + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef __VLC_MTIME_H +# define __VLC_MTIME_H 1 + +/***************************************************************************** + * LAST_MDATE: date which will never happen + ***************************************************************************** + * This date can be used as a 'never' date, to mark missing events in a function + * supposed to return a date, such as nothing to display in a function + * returning the date of the first image to be displayed. It can be used in + * comparaison with other values: all existing dates will be earlier. + *****************************************************************************/ +#define LAST_MDATE ((mtime_t)((uint64_t)(-1)/2)) + +/***************************************************************************** + * MSTRTIME_MAX_SIZE: maximum possible size of mstrtime + ***************************************************************************** + * This values is the maximal possible size of the string returned by the + * mstrtime() function, including '-' and the final '\0'. It should be used to + * allocate the buffer. + *****************************************************************************/ +#define MSTRTIME_MAX_SIZE 22 + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API char * mstrtime( char *psz_buffer, mtime_t date ); +VLC_API char * secstotimestr( char *psz_buffer, int32_t secs ); + +/***************************************************************************** + * date_t: date incrementation without long-term rounding errors + *****************************************************************************/ +struct date_t +{ + mtime_t date; + uint32_t i_divider_num; + uint32_t i_divider_den; + uint32_t i_remainder; +}; + +VLC_API void date_Init( date_t *, uint32_t, uint32_t ); +VLC_API void date_Change( date_t *, uint32_t, uint32_t ); +VLC_API void date_Set( date_t *, mtime_t ); +VLC_API mtime_t date_Get( const date_t * ); +VLC_API void date_Move( date_t *, mtime_t ); +VLC_API mtime_t date_Increment( date_t *, uint32_t ); +VLC_API mtime_t date_Decrement( date_t *, uint32_t ); +VLC_API uint64_t NTPtime64( void ); +#endif /* !__VLC_MTIME_ */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_network.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_network.h new file mode 100644 index 0000000..3461c9f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_network.h @@ -0,0 +1,370 @@ +/***************************************************************************** + * vlc_network.h: interface to communicate with network plug-ins + ***************************************************************************** + * Copyright (C) 2002-2005 VLC authors and VideoLAN + * Copyright © 2006-2007 Rémi Denis-Courmont + * $Id: 70281a229d0acf031b71e0d22ac0a08be0712c68 $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_NETWORK_H +# define VLC_NETWORK_H + +/** + * \file + * This file defines interface to communicate with network plug-ins + */ + +#if defined( _WIN32 ) +# define _NO_OLDNAMES 1 +# include +# include +# include +# define net_errno (WSAGetLastError()) + +struct iovec +{ + void *iov_base; + size_t iov_len; +}; + +struct msghdr +{ + void *msg_name; + size_t msg_namelen; + struct iovec *msg_iov; + size_t msg_iovlen; + void *msg_control; + size_t msg_controllen; + int msg_flags; +}; + +# ifndef IPV6_V6ONLY +# define IPV6_V6ONLY 27 +# endif +#else +# include +# include +# include +# include +# include +# define net_errno errno +#endif + +#if defined( __SYMBIAN32__ ) +# undef AF_INET6 +# undef IN6_IS_ADDR_MULTICAST +# undef IPV6_V6ONLY +# undef IPV6_MULTICAST_HOPS +# undef IPV6_MULTICAST_IF +# undef IPV6_TCLASS +# undef IPV6_JOIN_GROUP +#endif + +VLC_API int vlc_socket (int, int, int, bool nonblock) VLC_USED; + +struct sockaddr; +VLC_API int vlc_accept( int, struct sockaddr *, socklen_t *, bool ) VLC_USED; + +# ifdef __cplusplus +extern "C" { +# endif + +/* Portable networking layer communication */ +int net_Socket (vlc_object_t *obj, int family, int socktype, int proto); + +VLC_API int net_Connect(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); +#define net_Connect(a, b, c, d, e) net_Connect(VLC_OBJECT(a), b, c, d, e) + +VLC_API int * net_Listen(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); + +#define net_ListenTCP(a, b, c) net_Listen(VLC_OBJECT(a), b, c, \ + SOCK_STREAM, IPPROTO_TCP) + +static inline int net_ConnectTCP (vlc_object_t *obj, const char *host, int port) +{ + return net_Connect (obj, host, port, SOCK_STREAM, IPPROTO_TCP); +} +#define net_ConnectTCP(a, b, c) net_ConnectTCP(VLC_OBJECT(a), b, c) + +VLC_API int net_AcceptSingle(vlc_object_t *obj, int lfd); + +VLC_API int net_Accept( vlc_object_t *, int * ); +#define net_Accept(a, b) \ + net_Accept(VLC_OBJECT(a), b) + +VLC_API int net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim, int proto ); +#define net_ConnectDgram(a, b, c, d, e ) \ + net_ConnectDgram(VLC_OBJECT(a), b, c, d, e) + +static inline int net_ConnectUDP (vlc_object_t *obj, const char *host, int port, int hlim) +{ + return net_ConnectDgram (obj, host, port, hlim, IPPROTO_UDP); +} + +VLC_API int net_OpenDgram( vlc_object_t *p_this, const char *psz_bind, int i_bind, const char *psz_server, int i_server, int proto ); +#define net_OpenDgram( a, b, c, d, e, g ) \ + net_OpenDgram(VLC_OBJECT(a), b, c, d, e, g) + +static inline int net_ListenUDP1 (vlc_object_t *obj, const char *host, int port) +{ + return net_OpenDgram (obj, host, port, NULL, 0, IPPROTO_UDP); +} + +VLC_API void net_ListenClose( int *fd ); + +int net_Subscribe (vlc_object_t *obj, int fd, const struct sockaddr *addr, + socklen_t addrlen); + +VLC_API int net_SetCSCov( int fd, int sendcov, int recvcov ); + +/* Functions to read from or write to the networking layer */ +struct virtual_socket_t +{ + void *p_sys; + int (*pf_recv) ( void *, void *, size_t ); + int (*pf_send) ( void *, const void *, size_t ); +}; + +VLC_API ssize_t net_Read( vlc_object_t *p_this, int fd, const v_socket_t *, void *p_data, size_t i_data, bool b_retry ); +#define net_Read(a,b,c,d,e,f) net_Read(VLC_OBJECT(a),b,c,d,e,f) +VLC_API ssize_t net_Write( vlc_object_t *p_this, int fd, const v_socket_t *, const void *p_data, size_t i_data ); +#define net_Write(a,b,c,d,e) net_Write(VLC_OBJECT(a),b,c,d,e) +VLC_API char * net_Gets( vlc_object_t *p_this, int fd, const v_socket_t * ); +#define net_Gets(a,b,c) net_Gets(VLC_OBJECT(a),b,c) + + +VLC_API ssize_t net_Printf( vlc_object_t *p_this, int fd, const v_socket_t *, const char *psz_fmt, ... ) VLC_FORMAT( 4, 5 ); +#define net_Printf(o,fd,vs,...) net_Printf(VLC_OBJECT(o),fd,vs, __VA_ARGS__) +VLC_API ssize_t net_vaPrintf( vlc_object_t *p_this, int fd, const v_socket_t *, const char *psz_fmt, va_list args ); +#define net_vaPrintf(a,b,c,d,e) net_vaPrintf(VLC_OBJECT(a),b,c,d,e) + +#ifdef _WIN32 +/* Microsoft: same semantic, same value, different name... go figure */ +# define SHUT_RD SD_RECEIVE +# define SHUT_WR SD_SEND +# define SHUT_RDWR SD_BOTH +# define net_Close( fd ) closesocket ((SOCKET)fd) +#else +# ifdef __OS2__ +# define SHUT_RD 0 +# define SHUT_WR 1 +# define SHUT_RDWR 2 +# endif +# define net_Close( fd ) (void)close (fd) +#endif + +/* Portable network names/addresses resolution layer */ + +/* GAI error codes */ +# ifndef EAI_BADFLAGS +# define EAI_BADFLAGS -1 +# endif +# ifndef EAI_NONAME +# define EAI_NONAME -2 +# endif +# ifndef EAI_AGAIN +# define EAI_AGAIN -3 +# endif +# ifndef EAI_FAIL +# define EAI_FAIL -4 +# endif +# ifndef EAI_NODATA +# define EAI_NODATA -5 +# endif +# ifndef EAI_FAMILY +# define EAI_FAMILY -6 +# endif +# ifndef EAI_SOCKTYPE +# define EAI_SOCKTYPE -7 +# endif +# ifndef EAI_SERVICE +# define EAI_SERVICE -8 +# endif +# ifndef EAI_ADDRFAMILY +# define EAI_ADDRFAMILY -9 +# endif +# ifndef EAI_MEMORY +# define EAI_MEMORY -10 +# endif +#ifndef EAI_OVERFLOW +# define EAI_OVERFLOW -11 +#endif +# ifndef EAI_SYSTEM +# define EAI_SYSTEM -12 +# endif + + +# ifndef NI_MAXHOST +# define NI_MAXHOST 1025 +# define NI_MAXSERV 32 +# endif +# define NI_MAXNUMERICHOST 64 + +#ifndef AI_NUMERICSERV +# define AI_NUMERICSERV 0 +#endif +#ifndef AI_IDN +# define AI_IDN 0 /* GNU/libc extension */ +#endif + +#ifdef _WIN32 +# undef gai_strerror +# define gai_strerror gai_strerrorA +#endif + +#ifdef __OS2__ +# ifndef NI_NUMERICHOST +# define NI_NUMERICHOST 0x01 +# define NI_NUMERICSERV 0x02 +# define NI_NOFQDN 0x04 +# define NI_NAMEREQD 0x08 +# define NI_DGRAM 0x10 +# endif + +# define AI_PASSIVE 1 +# define AI_CANONNAME 2 +# define AI_NUMERICHOST 4 + +VLC_API const char *gai_strerror( int errnum ); + +VLC_API int getaddrinfo ( const char *, const char *, + const struct addrinfo *, struct addrinfo ** ); +VLC_API void freeaddrinfo( struct addrinfo * ); +VLC_API int getnameinfo ( const struct sockaddr *, socklen_t, + char *, int, char *, int, int ); +#endif + +VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int ); +VLC_API int vlc_getaddrinfo (const char *, unsigned, + const struct addrinfo *, struct addrinfo **); + + +#ifdef __OS2__ +/* OS/2 does not support IPv6, yet. But declare these only for compilation */ +struct in6_addr +{ + uint8_t s6_addr[16]; +}; + +struct sockaddr_in6 +{ + uint8_t sin6_len; + uint8_t sin6_family; + uint16_t sin6_port; + uint32_t sin6_flowinfo; + struct in6_addr sin6_addr; + uint32_t sin6_scope_id; +}; + +# define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff) + +static const struct in6_addr in6addr_any = + { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; +#endif + +static inline bool +net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len) +{ + switch (addr->sa_family) + { +#ifdef IN_MULTICAST + case AF_INET: + { + const struct sockaddr_in *v4 = (const struct sockaddr_in *)addr; + if ((size_t)len < sizeof (*v4)) + return false; + return IN_MULTICAST (ntohl (v4->sin_addr.s_addr)) != 0; + } +#endif + +#ifdef IN6_IS_ADDR_MULTICAST + case AF_INET6: + { + const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr; + if ((size_t)len < sizeof (*v6)) + return false; + return IN6_IS_ADDR_MULTICAST (&v6->sin6_addr) != 0; + } +#endif + } + + return false; +} + + +static inline int net_GetSockAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getsockname( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline int net_GetPeerAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getpeername( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline uint16_t net_GetPort (const struct sockaddr *addr) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + return ((const struct sockaddr_in6 *)addr)->sin6_port; +#endif + case AF_INET: + return ((const struct sockaddr_in *)addr)->sin_port; + } + return 0; +} + +static inline void net_SetPort (struct sockaddr *addr, uint16_t port) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + ((struct sockaddr_in6 *)addr)->sin6_port = port; + break; +#endif + case AF_INET: + ((struct sockaddr_in *)addr)->sin_port = port; + break; + } +} + +VLC_API char *vlc_getProxyUrl(const char *); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_objects.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_objects.h new file mode 100644 index 0000000..db3f8fe --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_objects.h @@ -0,0 +1,79 @@ +/***************************************************************************** + * vlc_objects.h: vlc_object_t definition and manipulation methods + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: c6708750ee9cd68a9fce0246f019ad8aec80432b $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines the vlc_object_t structure and object types. + */ + +/** + * \defgroup vlc_object Objects + * @{ + */ + +/* Object flags */ +#define OBJECT_FLAGS_QUIET 0x0002 +#define OBJECT_FLAGS_NOINTERACT 0x0004 + +/***************************************************************************** + * The vlc_object_t type. Yes, it's that simple :-) + *****************************************************************************/ +/** The main vlc_object_t structure */ +struct vlc_object_t +{ + VLC_COMMON_MEMBERS +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API void *vlc_object_create( vlc_object_t *, size_t ) VLC_MALLOC VLC_USED; +VLC_API vlc_object_t *vlc_object_find_name( vlc_object_t *, const char * ) VLC_USED VLC_DEPRECATED; +VLC_API void * vlc_object_hold( vlc_object_t * ); +VLC_API void vlc_object_release( vlc_object_t * ); +VLC_API vlc_list_t *vlc_list_children( vlc_object_t * ) VLC_USED; +VLC_API void vlc_list_release( vlc_list_t * ); +VLC_API char *vlc_object_get_name( const vlc_object_t * ) VLC_USED; +#define vlc_object_get_name(o) vlc_object_get_name(VLC_OBJECT(o)) + +/**}@*/ + +#define vlc_object_create(a,b) vlc_object_create( VLC_OBJECT(a), b ) + +#define vlc_object_find_name(a,b) \ + vlc_object_find_name( VLC_OBJECT(a),b) + +#define vlc_object_hold(a) \ + vlc_object_hold( VLC_OBJECT(a) ) + +#define vlc_object_release(a) \ + vlc_object_release( VLC_OBJECT(a) ) + +#define vlc_list_children(a) \ + vlc_list_children( VLC_OBJECT(a) ) + +/* Objects and threading */ +VLC_API VLC_USED VLC_DEPRECATED bool vlc_object_alive (vlc_object_t *); +#define vlc_object_alive(a) vlc_object_alive( VLC_OBJECT(a) ) + +/** @} */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_opengl.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_opengl.h new file mode 100644 index 0000000..1cc8ca2 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_opengl.h @@ -0,0 +1,95 @@ +/***************************************************************************** + * vlc_opengl.h: VLC GL API + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * Copyright (C) 2011 Rémi Denis-Courmont + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_GL_H +#define VLC_GL_H 1 + +/** + * \file + * This file defines GL structures and functions. + */ + +struct vout_window_t; + +/** + * A VLC GL context (and its underlying surface) + */ +typedef struct vlc_gl_t vlc_gl_t; + +struct vlc_gl_t +{ + VLC_COMMON_MEMBERS + + struct vout_window_t *surface; + module_t *module; + void *sys; + + int (*makeCurrent)(vlc_gl_t *); + void (*releaseCurrent)(vlc_gl_t *); + void (*swap)(vlc_gl_t *); + int (*lock)(vlc_gl_t *); + void (*unlock)(vlc_gl_t *); + void*(*getProcAddress)(vlc_gl_t *, const char *); +}; + +enum { + VLC_OPENGL, + VLC_OPENGL_ES, + VLC_OPENGL_ES2, +}; + +VLC_API vlc_gl_t *vlc_gl_Create(struct vout_window_t *, unsigned, const char *) VLC_USED; +VLC_API void vlc_gl_Destroy(vlc_gl_t *); + +static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl) +{ + return gl->makeCurrent(gl); +} + +static inline void vlc_gl_ReleaseCurrent(vlc_gl_t *gl) +{ + gl->releaseCurrent(gl); +} + +static inline int vlc_gl_Lock(vlc_gl_t *gl) +{ + return (gl->lock != NULL) ? gl->lock(gl) : VLC_SUCCESS; +} + +static inline void vlc_gl_Unlock(vlc_gl_t *gl) +{ + if (gl->unlock != NULL) + gl->unlock(gl); +} + +static inline void vlc_gl_Swap(vlc_gl_t *gl) +{ + gl->swap(gl); +} + +static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name) +{ + return (gl->getProcAddress != NULL) ? gl->getProcAddress(gl, name) : NULL; +} + +#endif /* VLC_GL_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_picture.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_picture.h new file mode 100644 index 0000000..0dc2b08 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_picture.h @@ -0,0 +1,285 @@ +/***************************************************************************** + * vlc_picture.h: picture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: e45374ba04791df4b80ebda3987d4897757b5663 $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_H +#define VLC_PICTURE_H 1 + +/** + * \file + * This file defines picture structures and functions in vlc + */ + +#include +#if (defined (__LIBVLC__) && !defined (__PLUGIN__)) +# include +#endif + +/** Description of a planar graphic field */ +typedef struct plane_t +{ + uint8_t *p_pixels; /**< Start of the plane's data */ + + /* Variables used for fast memcpy operations */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + + /** Size of a macropixel, defaults to 1 */ + int i_pixel_pitch; + + /* Variables used for pictures with margins */ + int i_visible_lines; /**< How many visible lines are there ? */ + int i_visible_pitch; /**< How many visible pixels are there ? */ + +} plane_t; + +/** + * Maximum number of plane for a picture + */ +#define PICTURE_PLANE_MAX (VOUT_MAX_PLANES) + + +/** + * A private definition to help overloading picture release + */ +typedef struct picture_gc_sys_t picture_gc_sys_t; + +/** + * Video picture + */ +struct picture_t +{ + /** + * The properties of the picture + */ + video_frame_format_t format; + + plane_t p[PICTURE_PLANE_MAX]; /**< description of the planes */ + int i_planes; /**< number of allocated planes */ + + /** \name Picture management properties + * These properties can be modified using the video output thread API, + * but should never be written directly */ + /**@{*/ + mtime_t date; /**< display date */ + bool b_force; + /**@}*/ + + /** \name Picture dynamic properties + * Those properties can be changed by the decoder + * @{ + */ + bool b_progressive; /**< is it a progressive frame ? */ + bool b_top_field_first; /**< which field is first */ + unsigned int i_nb_fields; /**< # of displayed fields */ + void * context; /**< video format-specific data pointer, + * must point to a (void (*)(void*)) pointer to free the context */ + /**@}*/ + + /** Private data - the video output plugin might want to put stuff here to + * keep track of the picture */ + picture_sys_t * p_sys; + + /** This way the picture_Release can be overloaded */ + struct + { +#if (defined (__LIBVLC__) && !defined (__PLUGIN__)) + atomic_uintptr_t refcount; +#else + uintptr_t refcount_placeholder_keep_off; +#endif + void (*pf_destroy)( picture_t * ); + picture_gc_sys_t *p_sys; + } gc; + + /** Next picture in a FIFO a pictures */ + struct picture_t *p_next; +}; + +/** + * This function will create a new picture. + * The picture created will implement a default release management compatible + * with picture_Hold and picture_Release. This default management will release + * p_sys, gc.p_sys fields if non NULL. + */ +VLC_API picture_t * picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den ) VLC_USED; + +/** + * This function will create a new picture using the given format. + * + * When possible, it is preferred to use this function over picture_New + * as more information about the format is kept. + */ +VLC_API picture_t * picture_NewFromFormat( const video_format_t *p_fmt ) VLC_USED; + +/** + * Resource for a picture. + */ +typedef struct +{ + picture_sys_t *p_sys; + void (*pf_destroy)(picture_t *); + + /* Plane resources + * XXX all fields MUST be set to the right value. + */ + struct + { + uint8_t *p_pixels; /**< Start of the plane's data */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + } p[PICTURE_PLANE_MAX]; + +} picture_resource_t; + +/** + * This function will create a new picture using the provided resource. + * + * If the resource is NULL then a plain picture_NewFromFormat is returned. + */ +VLC_API picture_t * picture_NewFromResource( const video_format_t *, const picture_resource_t * ) VLC_USED; + +/** + * This function will increase the picture reference count. + * It will not have any effect on picture obtained from vout + * + * It returns the given picture for convenience. + */ +VLC_API picture_t *picture_Hold( picture_t *p_picture ); + +/** + * This function will release a picture. + * It will not have any effect on picture obtained from vout + */ +VLC_API void picture_Release( picture_t *p_picture ); + +/** + * This function will return true if you are not the only owner of the + * picture. + * + * It is only valid if it is created using picture_New. + */ +VLC_API bool picture_IsReferenced( picture_t *p_picture ); + +/** + * This function will copy all picture dynamic properties. + */ +VLC_API void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src ); + +/** + * This function will reset a picture information (properties and quantizers). + * It is sometimes useful for reusing pictures (like from a pool). + */ +VLC_API void picture_Reset( picture_t * ); + +/** + * This function will copy the picture pixels. + * You can safely copy between pictures that do not have the same size, + * only the compatible(smaller) part will be copied. + */ +VLC_API void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ); +VLC_API void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ); + +/** + * This function will copy both picture dynamic properties and pixels. + * You have to notice that sometime a simple picture_Hold may do what + * you want without the copy overhead. + * Provided for convenience. + * + * \param p_dst pointer to the destination picture. + * \param p_src pointer to the source picture. + */ +VLC_API void picture_Copy( picture_t *p_dst, const picture_t *p_src ); + +/** + * This function will export a picture to an encoded bitstream. + * + * pp_image will contain the encoded bitstream in psz_format format. + * + * p_fmt can be NULL otherwise it will be set with the format used for the + * picture before encoding. + * + * i_override_width/height allow to override the width and/or the height of the + * picture to be encoded: + * - if strictly lower than 0, the original dimension will be used. + * - if equal to 0, it will be deduced from the other dimension which must be + * different to 0. + * - if strictly higher than 0, it will override the dimension. + * If at most one of them is > 0 then the picture aspect ratio will be kept. + */ +VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ); + +/** + * This function will setup all fields of a picture_t without allocating any + * memory. + * XXX The memory must already be initialized. + * It does not need to be released. + * + * It will return VLC_EGENERIC if the core does not understand the requested + * format. + * + * It can be useful to get the properties of planes. + */ +VLC_API int picture_Setup( picture_t *, const video_format_t * ); + + +/** + * This function will blend a given subpicture onto a picture. + * + * The subpicture and all its region must: + * - be absolute. + * - not be ephemere. + * - not have the fade flag. + * - contains only picture (no text rendering). + * \return the number of region(s) succesfully blent + */ +VLC_API unsigned picture_BlendSubpicture( picture_t *, filter_t *p_blend, subpicture_t * ); + + +/***************************************************************************** + * Shortcuts to access image components + *****************************************************************************/ + +/* Plane indices */ +enum +{ + Y_PLANE = 0, + U_PLANE = 1, + V_PLANE = 2, + A_PLANE = 3, +}; + +/* Shortcuts */ +#define Y_PIXELS p[Y_PLANE].p_pixels +#define Y_PITCH p[Y_PLANE].i_pitch +#define U_PIXELS p[U_PLANE].p_pixels +#define U_PITCH p[U_PLANE].i_pitch +#define V_PIXELS p[V_PLANE].p_pixels +#define V_PITCH p[V_PLANE].i_pitch +#define A_PIXELS p[A_PLANE].p_pixels +#define A_PITCH p[A_PLANE].i_pitch + +/**@}*/ + +#endif /* VLC_PICTURE_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_picture_fifo.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_picture_fifo.h new file mode 100644 index 0000000..d337a3b --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_picture_fifo.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * vlc_picture_fifo.h: picture fifo definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: 73d1b20c279f628cf94bc7cfc83b2548878bcc07 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_FIFO_H +#define VLC_PICTURE_FIFO_H 1 + +/** + * \file + * This file defines picture fifo structures and functions in vlc + */ + +#include + +/** + * Picture fifo handle + * + * It is thread safe (push/pop). + */ +typedef struct picture_fifo_t picture_fifo_t; + +/** + * It creates an empty picture_fifo_t. + */ +VLC_API picture_fifo_t * picture_fifo_New( void ) VLC_USED; + +/** + * It destroys a fifo created by picture_fifo_New. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Delete( picture_fifo_t * ); + +/** + * It retreives a picture_t from the fifo. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Pop( picture_fifo_t * ) VLC_USED; + +/** + * It returns the first picture_t pointer from the fifo but does not + * remove it. The picture returned has been hold for you so you + * must call picture_Release on it. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Peek( picture_fifo_t * ) VLC_USED; + +/** + * It saves a picture_t into the fifo. + */ +VLC_API void picture_fifo_Push( picture_fifo_t *, picture_t * ); + +/** + * It release all picture inside the fifo that have a lower or equal date + * if flush_before or higher or equal to if not flush_before than the given one. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Flush( picture_fifo_t *, mtime_t date, bool flush_before ); + +/** + * It applies a delta on all the picture timestamp. + */ +VLC_API void picture_fifo_OffsetDate( picture_fifo_t *, mtime_t delta ); + + +#endif /* VLC_PICTURE_FIFO_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_picture_pool.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_picture_pool.h new file mode 100644 index 0000000..147d9c8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_picture_pool.h @@ -0,0 +1,126 @@ +/***************************************************************************** + * vlc_picture_pool.h: picture pool definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: d4574dc5a1dfd2d873c6f286ee612462f886bb33 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_POOL_H +#define VLC_PICTURE_POOL_H 1 + +/** + * \file + * This file defines picture pool structures and functions in vlc + */ + +#include + +/** + * Picture pool handle + * + * XXX it is not thread safe, all pool manipulations and picture_Release + * must be properly locked if needed. + */ +typedef struct picture_pool_t picture_pool_t; + +/** + * Picture pool configuration + */ +typedef struct { + int picture_count; + picture_t **picture; + + int (*lock)(picture_t *); + void (*unlock)(picture_t *); +} picture_pool_configuration_t; + +/** + * It creates a picture_pool_t wrapping the given configuration. + * + * It avoids useless picture creations/destructions. + * The given picture must not have a reference count greater than 1. + * The pool takes ownership of the picture and MUST not be used directly. + * When deleted, the pool will release the pictures using picture_Release. + * If defined, picture_pool_configuration_t::lock will be called before + * a picture is used, and picture_pool_configuration_t::unlock will be called + * as soon as a picture is unused. They are allowed to modify picture_t::p and + * access picture_t::p_sys. + */ +VLC_API picture_pool_t * picture_pool_NewExtended( const picture_pool_configuration_t * ) VLC_USED; + +/** + * It creates a picture_pool_t wrapping the given arrays of picture. + * + * It is provided as convenience. + */ +VLC_API picture_pool_t * picture_pool_New( int picture_count, picture_t *picture[] ) VLC_USED; + +/** + * It creates a picture_pool_t creating images using the given format. + * + * Provided for convenience. + */ +VLC_API picture_pool_t * picture_pool_NewFromFormat( const video_format_t *, int picture_count ) VLC_USED; + +/** + * It destroys a pool created by picture_pool_New. + * + * All pictures must already be released to the pool. The pool will then + * released them. + */ +VLC_API void picture_pool_Delete( picture_pool_t * ); + +/** + * It retreives a picture_t from a pool. + * + * The picture must be release by using picture_Release. + */ +VLC_API picture_t * picture_pool_Get( picture_pool_t * ) VLC_USED; + +/** + * It forces the next picture_pool_Get to return a picture even if no + * pictures are free. + * + * If b_reset is true, all pictures will be marked as free. + * + * It does it by releasing itself the oldest used picture if none is + * available. + * XXX it should be used with great care, the only reason you may need + * it is to workaround a bug. + */ +VLC_API void picture_pool_NonEmpty( picture_pool_t *, bool reset ); + +/** + * It reserves picture_count pictures from the given pool and returns + * a new pool with thoses pictures. + * + * The master pool must be full. + * The returned pool must be deleted before the master pool. + * When deleted, all pictures return to the master pool. + */ +VLC_API picture_pool_t * picture_pool_Reserve(picture_pool_t *, int picture_count) VLC_USED; + +/** + * It returns the size of the given pool. + */ +VLC_API int picture_pool_GetSize(picture_pool_t *); + + +#endif /* VLC_PICTURE_POOL_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_playlist.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_playlist.h new file mode 100644 index 0000000..6b0f684 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_playlist.h @@ -0,0 +1,412 @@ +/***************************************************************************** + * vlc_playlist.h : Playlist functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 49dcd1535bdff782f18463b5b45c80b298f8e5c5 $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PLAYLIST_H_ +#define VLC_PLAYLIST_H_ + +# ifdef __cplusplus +extern "C" { +# endif + +#include +#include + +TYPEDEF_ARRAY(playlist_item_t*, playlist_item_array_t) + +struct intf_thread_t; + +/** + * \file + * This file contain structures and function prototypes related + * to the playlist in vlc + * + * \defgroup vlc_playlist Playlist + * + * The VLC playlist system has a tree structure. This allows advanced + * categorization, like for SAP streams (which are grouped by "sap groups"). + * + * The base structure for all playlist operations is the input_item_t. This + * contains all information needed to play a stream and get info, ie, mostly, + * mrl and metadata. This structure contains a unique i_id field. ids are + * not recycled when an item is destroyed. + * + * Input items are not used directly, but through playlist items. + * The playlist items are themselves in a tree structure. They only contain + * a link to the input item, a unique id and a few flags. the playlist + * item id is NOT the same as the input item id. + * Several playlist items can be attached to a single input item. The input + * item is refcounted and is automatically destroyed when it is not used + * anymore. + * + * The top-level items are the main media sources and include: + * playlist, media library, SAP, Shoutcast, devices, ... + * + * It is envisioned that a third tree will appear: VLM, but it's not done yet + * + * The playlist also stores, for utility purposes, an array of all input + * items, an array of all playlist items and an array of all playlist items + * and nodes (both are represented by the same structure). + * + * So, here is an example: + * \verbatim + * Inputs array + * - input 1 -> name = foo 1 uri = ... + * - input 2 -> name = foo 2 uri = ... + * + * Playlist items tree + * - playlist (id 1) + * - category 1 (id 2) + * - foo 2 (id 6 - input 2) + * - media library (id 2) + * - foo 1 (id 5 - input 1) + * \endverbatim + * + * Sometimes, an item creates subitems. This happens for the directory access + * for example. In that case, if the item is under the "playlist" top-level item + * and playlist is configured to be flat then the item will be deleted and + * replaced with new subitems. If the item is under another top-level item, it + * will be transformed to a node and removed from the list of all items without + * nodes. + * + * For "standard" item addition, you can use playlist_Add, playlist_AddExt + * (more options) or playlist_AddInput if you already created your input + * item. This will add the item at the root of "Playlist" or of "Media library" + * in each of the two trees. + * + * You can create nodes with playlist_NodeCreate and can create items from + * existing input items to be placed under any node with playlist_NodeAddInput. + * + * To delete an item, use playlist_DeleteFromInput( p_item ) which will + * remove all occurrences of the input. + * + * + * The playlist defines the following event variables: + * + * - "item-change": It will contain the input_item_t->i_id of a changed input + * item monitored by the playlist. + * item being played. + * + * - "playlist-item-append": It will contain a pointer to a playlist_add_t. + * - "playlist-item-deleted": It will contain the playlist_item_t->i_id of a + * deleted playlist_item_t. + * + * - "leaf-to-parent": It will contain the playlist_item_t->i_id of an item that is transformed + * into a node. + * + * The playlist contains rate-variable which is propagated to current input if available + * also rate-slower/rate-faster is in use + * + * XXX Be really carefull, playlist_item_t->i_id and input_item_t->i_id are not + * the same. Yes, the situation is pretty bad. + * + * @{ + */ + +/** Helper structure to export to file part of the playlist */ +typedef struct playlist_export_t +{ + VLC_COMMON_MEMBERS + const char *psz_filename; + FILE *p_file; + playlist_item_t *p_root; +} playlist_export_t; + +/** playlist item / node */ +struct playlist_item_t +{ + input_item_t *p_input; /**< Linked input item */ + + playlist_item_t **pp_children; /**< Children nodes/items */ + playlist_item_t *p_parent; /**< Item parent */ + int i_children; /**< Number of children, -1 if not a node */ + + int i_id; /**< Playlist item specific id */ + uint8_t i_flags; /**< Flags \see playlist_item_flags_e */ + + playlist_t *p_playlist; /**< Parent playlist */ +}; + +typedef enum { + PLAYLIST_SAVE_FLAG = 0x0001, /**< Must it be saved */ + PLAYLIST_SKIP_FLAG = 0x0002, /**< Must playlist skip after it ? */ + PLAYLIST_DBL_FLAG = 0x0004, /**< Is it disabled ? */ + PLAYLIST_RO_FLAG = 0x0008, /**< Write-enabled ? */ + PLAYLIST_REMOVE_FLAG = 0x0010, /**< Remove this item at the end */ + PLAYLIST_EXPANDED_FLAG = 0x0020, /**< Expanded node */ + PLAYLIST_SUBITEM_STOP_FLAG = 0x0040, /**< Must playlist stop if the item gets subitems ?*/ +} playlist_item_flags_e; + +/** Playlist status */ +typedef enum +{ PLAYLIST_STOPPED,PLAYLIST_RUNNING,PLAYLIST_PAUSED } playlist_status_t; + +/** Structure containing information about the playlist */ +struct playlist_t +{ + VLC_COMMON_MEMBERS + + playlist_item_array_t items; /**< Arrays of items */ + playlist_item_array_t all_items; /**< Array of items and nodes */ + + playlist_item_array_t current; /**< Items currently being played */ + int i_current_index; /**< Index in current array */ + + /* Predefined items */ + playlist_item_t * p_root; + playlist_item_t * p_playing; + playlist_item_t * p_media_library; + + //Phony ones, point to those above; + playlist_item_t * p_root_category; /**< Root of category tree */ + playlist_item_t * p_root_onelevel; /**< Root of onelevel tree */ + playlist_item_t * p_local_category; /** < "Playlist" in CATEGORY view */ + playlist_item_t * p_ml_category; /** < "Library" in CATEGORY view */ + playlist_item_t * p_local_onelevel; /** < "Playlist" in ONELEVEL view */ + playlist_item_t * p_ml_onelevel; /** < "Library" in ONELEVEL view */ +}; + +/** Helper to add an item */ +struct playlist_add_t +{ + int i_node; /**< Playist id of the parent node */ + int i_item; /**< Playist id of the playlist_item_t */ +}; + +/* A bit of macro magic to generate an enum out of the following list, + * and later, to generate a list of static functions out of the same list. + * There is also SORT_RANDOM, which is always last and handled specially. + */ +#define VLC_DEFINE_SORT_FUNCTIONS \ + DEF( SORT_ID )\ + DEF( SORT_TITLE )\ + DEF( SORT_TITLE_NODES_FIRST )\ + DEF( SORT_ARTIST )\ + DEF( SORT_GENRE )\ + DEF( SORT_DURATION )\ + DEF( SORT_TITLE_NUMERIC )\ + DEF( SORT_ALBUM )\ + DEF( SORT_TRACK_NUMBER )\ + DEF( SORT_DESCRIPTION )\ + DEF( SORT_RATING )\ + DEF( SORT_URI ) + +#define DEF( s ) s, +enum +{ + VLC_DEFINE_SORT_FUNCTIONS + SORT_RANDOM, + NUM_SORT_FNS=SORT_RANDOM +}; +#undef DEF +#ifndef VLC_INTERNAL_PLAYLIST_SORT_FUNCTIONS +#undef VLC_DEFINE_SORT_FUNCTIONS +#endif + +enum +{ + ORDER_NORMAL = 0, + ORDER_REVERSE = 1, +}; + +/* Used by playlist_Import */ +#define PLAYLIST_INSERT 0x0001 +#define PLAYLIST_APPEND 0x0002 +#define PLAYLIST_GO 0x0004 +#define PLAYLIST_PREPARSE 0x0008 +#define PLAYLIST_SPREPARSE 0x0010 +#define PLAYLIST_NO_REBUILD 0x0020 + +#define PLAYLIST_END -666 + +enum pl_locked_state +{ + pl_Locked = true, + pl_Unlocked = false +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/* Helpers */ +#define PL_LOCK playlist_Lock( p_playlist ) +#define PL_UNLOCK playlist_Unlock( p_playlist ) +#define PL_ASSERT_LOCKED playlist_AssertLocked( p_playlist ) + +/* Playlist control */ +#define playlist_Play(p) playlist_Control(p,PLAYLIST_PLAY, pl_Unlocked ) +#define playlist_Pause(p) playlist_Control(p,PLAYLIST_PAUSE, pl_Unlocked ) +#define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP, pl_Unlocked ) +#define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, 1) +#define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, -1) +#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, (i) ) + +VLC_API void playlist_Lock( playlist_t * ); +VLC_API void playlist_Unlock( playlist_t * ); +VLC_API void playlist_AssertLocked( playlist_t * ); +VLC_API void playlist_Deactivate( playlist_t * ); + +/** + * Do a playlist action. + * If there is something in the playlist then you can do playlist actions. + * Possible queries are listed in vlc_common.h + * \param p_playlist the playlist to do the command on + * \param i_query the command to do + * \param b_locked TRUE if playlist is locked when entering this function + * \param variable number of arguments + * \return VLC_SUCCESS or an error + */ +VLC_API int playlist_Control( playlist_t *p_playlist, int i_query, bool b_locked, ... ); + +/** Get current playing input. The object is retained. + */ +VLC_API input_thread_t * playlist_CurrentInput( playlist_t *p_playlist ) VLC_USED; + +/** Get the duration of all items in a node. + */ +VLC_API mtime_t playlist_GetNodeDuration( playlist_item_t * ); + +/** Clear the playlist + * \param b_locked TRUE if playlist is locked when entering this function + */ +VLC_API void playlist_Clear( playlist_t *, bool ); + +/* Playlist sorting */ +VLC_API int playlist_TreeMove( playlist_t *, playlist_item_t *, playlist_item_t *, int ); +VLC_API int playlist_TreeMoveMany( playlist_t *, int, playlist_item_t **, playlist_item_t *, int ); +VLC_API int playlist_RecursiveNodeSort( playlist_t *, playlist_item_t *,int, int ); + +VLC_API playlist_item_t * playlist_CurrentPlayingItem( playlist_t * ) VLC_USED; +VLC_API int playlist_Status( playlist_t * ); + +/** + * Export a node of the playlist to a certain type of playlistfile + * \param p_playlist the playlist to export + * \param psz_filename the location where the exported file will be saved + * \param p_export_root the root node to export + * \param psz_type the type of playlist file to create (m3u, pls, ..) + * \return VLC_SUCCESS on success + */ +VLC_API int playlist_Export( playlist_t *p_playlist, const char *psz_name, playlist_item_t *p_export_root, const char *psz_type ); + +/** + * Open a playlist file, add its content to the current playlist + */ +VLC_API int playlist_Import( playlist_t *p_playlist, const char *psz_file ); + +/********************** Services discovery ***********************/ + +/** Add a list of comma-separated service discovery modules */ +VLC_API int playlist_ServicesDiscoveryAdd(playlist_t *, const char *); +/** Remove a services discovery module by name */ +VLC_API int playlist_ServicesDiscoveryRemove(playlist_t *, const char *); +/** Check whether a given SD is loaded */ +VLC_API bool playlist_IsServicesDiscoveryLoaded( playlist_t *,const char *) VLC_DEPRECATED; +/** Query a services discovery */ +VLC_API int playlist_ServicesDiscoveryControl( playlist_t *, const char *, int, ... ); + + + +/******************************************************** + * Item management + ********************************************************/ + +/*************************** Item deletion **************************/ +VLC_API int playlist_DeleteFromInput( playlist_t *, input_item_t *, bool ); + +/******************** Item addition ********************/ +VLC_API int playlist_Add( playlist_t *, const char *, const char *, int, int, bool, bool ); +VLC_API int playlist_AddExt( playlist_t *, const char *, const char *, int, int, mtime_t, int, const char *const *, unsigned, bool, bool ); +VLC_API int playlist_AddInput( playlist_t *, input_item_t *, int, int, bool, bool ); +VLC_API playlist_item_t * playlist_NodeAddInput( playlist_t *, input_item_t *, playlist_item_t *, int, int, bool ); +VLC_API int playlist_NodeAddCopy( playlist_t *, playlist_item_t *, playlist_item_t *, int ); + +/********************************** Item search *************************/ +VLC_API playlist_item_t * playlist_ItemGetById(playlist_t *, int ) VLC_USED; +VLC_API playlist_item_t * playlist_ItemGetByInput(playlist_t *,input_item_t * ) VLC_USED; + +VLC_API int playlist_LiveSearchUpdate(playlist_t *, playlist_item_t *, const char *, bool ); + +/******************************************************** + * Tree management + ********************************************************/ +/* Node management */ +VLC_API playlist_item_t * playlist_NodeCreate( playlist_t *, const char *, playlist_item_t * p_parent, int i_pos, int i_flags, input_item_t * ); +VLC_API int playlist_NodeAppend(playlist_t *,playlist_item_t*,playlist_item_t *); +VLC_API int playlist_NodeInsert(playlist_t *,playlist_item_t*,playlist_item_t *, int); +VLC_API int playlist_NodeRemoveItem(playlist_t *,playlist_item_t*,playlist_item_t *); +VLC_API playlist_item_t * playlist_ChildSearchName(playlist_item_t*, const char* ) VLC_USED; +VLC_API int playlist_NodeDelete( playlist_t *, playlist_item_t *, bool , bool ); + +VLC_API playlist_item_t * playlist_GetNextLeaf( playlist_t *p_playlist, playlist_item_t *p_root, playlist_item_t *p_item, bool b_ena, bool b_unplayed ) VLC_USED; +VLC_API playlist_item_t * playlist_GetPrevLeaf( playlist_t *p_playlist, playlist_item_t *p_root, playlist_item_t *p_item, bool b_ena, bool b_unplayed ) VLC_USED; + +/************************** + * Audio output management + **************************/ + +VLC_API audio_output_t *playlist_GetAout( playlist_t * ); + +#define AOUT_VOLUME_DEFAULT 256 +#define AOUT_VOLUME_MAX 512 + +VLC_API float playlist_VolumeGet( playlist_t * ); +VLC_API int playlist_VolumeSet( playlist_t *, float ); +VLC_API int playlist_VolumeUp( playlist_t *, int, float * ); +#define playlist_VolumeDown(a, b, c) playlist_VolumeUp(a, -(b), c) +VLC_API int playlist_MuteSet( playlist_t *, bool ); +VLC_API int playlist_MuteGet( playlist_t * ); + +static inline int playlist_MuteToggle( playlist_t *pl ) +{ + int val = playlist_MuteGet( pl ); + if (val >= 0) + val = playlist_MuteSet( pl, !val ); + return val; +} + +VLC_API void playlist_EnableAudioFilter( playlist_t *, const char *, bool ); + +/*********************************************************************** + * Inline functions + ***********************************************************************/ +/** Tell if the playlist is empty */ +static inline bool playlist_IsEmpty( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->items.i_size == 0; +} + +/** Tell the number of items in the current playing context */ +static inline int playlist_CurrentSize( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->current.i_size; +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_plugin.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_plugin.h new file mode 100644 index 0000000..14c48f0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_plugin.h @@ -0,0 +1,538 @@ +/***************************************************************************** + * vlc_plugin.h : Macros used from within a module. + ***************************************************************************** + * Copyright (C) 2001-2006 VLC authors and VideoLAN + * Copyright © 2007-2009 Rémi Denis-Courmont + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MODULES_MACROS_H +# define LIBVLC_MODULES_MACROS_H 1 + +/** + * \file + * This file implements plugin (module) macros used to define a vlc module. + */ + +enum vlc_module_properties +{ + VLC_MODULE_CREATE, + VLC_CONFIG_CREATE, + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_MODULE_CPU_REQUIREMENT=0x100, + VLC_MODULE_SHORTCUT, + VLC_MODULE_CAPABILITY, + VLC_MODULE_SCORE, + VLC_MODULE_CB_OPEN, + VLC_MODULE_CB_CLOSE, + VLC_MODULE_NO_UNLOAD, + VLC_MODULE_NAME, + VLC_MODULE_SHORTNAME, + VLC_MODULE_DESCRIPTION, + VLC_MODULE_HELP, + VLC_MODULE_TEXTDOMAIN, + /* Insert new VLC_MODULE_* here */ + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_CONFIG_NAME=0x1000, + /* command line name (args=const char *) */ + + VLC_CONFIG_VALUE, + /* actual value (args=int/double/const char *) */ + + VLC_CONFIG_RANGE, + /* minimum value (args=int/double/const char * twice) */ + + VLC_CONFIG_ADVANCED, + /* enable advanced flag (args=none) */ + + VLC_CONFIG_VOLATILE, + /* don't write variable to storage (args=none) */ + + VLC_CONFIG_PERSISTENT_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_PRIVATE, + /* hide from user (args=none) */ + + VLC_CONFIG_REMOVED, + /* tag as no longer supported (args=none) */ + + VLC_CONFIG_CAPABILITY, + /* capability for a module or list thereof (args=const char*) */ + + VLC_CONFIG_SHORTCUT, + /* one-character (short) command line option name (args=char) */ + + VLC_CONFIG_OLDNAME_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_SAFE, + /* tag as modifiable by untrusted input item "sources" (args=none) */ + + VLC_CONFIG_DESC, + /* description (args=const char *, const char *, const char *) */ + + VLC_CONFIG_LIST_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_ADD_ACTION_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_LIST, + /* list of suggested values + * (args=size_t, const *, const char *const *) */ + + VLC_CONFIG_LIST_CB, + /* callback for suggested values + * (args=size_t (*)(vlc_object_t *, **, char ***)) */ + + /* Insert new VLC_CONFIG_* here */ +}; + +/* Configuration hint types */ +#define CONFIG_HINT_CATEGORY 0x02 /* Start of new category */ +#define CONFIG_HINT_USAGE 0x05 /* Usage information */ + +#define CONFIG_CATEGORY 0x06 /* Set category */ +#define CONFIG_SUBCATEGORY 0x07 /* Set subcategory */ +#define CONFIG_SECTION 0x08 /* Start of new section */ + +/* Configuration item types */ +#define CONFIG_ITEM_FLOAT 0x20 /* Float option */ +#define CONFIG_ITEM_INTEGER 0x40 /* Integer option */ +#define CONFIG_ITEM_RGB 0x41 /* RGB color option */ +#define CONFIG_ITEM_BOOL 0x60 /* Bool option */ +#define CONFIG_ITEM_STRING 0x80 /* String option */ +#define CONFIG_ITEM_PASSWORD 0x81 /* Password option (*) */ +#define CONFIG_ITEM_KEY 0x82 /* Hot key option */ +#define CONFIG_ITEM_MODULE 0x84 /* Module option */ +#define CONFIG_ITEM_MODULE_CAT 0x85 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST 0x86 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST_CAT 0x87 /* Module option */ +#define CONFIG_ITEM_LOADFILE 0x8C /* Read file option */ +#define CONFIG_ITEM_SAVEFILE 0x8D /* Written file option */ +#define CONFIG_ITEM_DIRECTORY 0x8E /* Directory option */ +#define CONFIG_ITEM_FONT 0x8F /* Font option */ + +#define CONFIG_ITEM(x) (((x) & ~0xF) != 0) + +/* Categories and subcategories */ +#define CAT_INTERFACE 1 +#define SUBCAT_INTERFACE_GENERAL 101 +#define SUBCAT_INTERFACE_MAIN 102 +#define SUBCAT_INTERFACE_CONTROL 103 +#define SUBCAT_INTERFACE_HOTKEYS 104 + +#define CAT_AUDIO 2 +#define SUBCAT_AUDIO_GENERAL 201 +#define SUBCAT_AUDIO_AOUT 202 +#define SUBCAT_AUDIO_AFILTER 203 +#define SUBCAT_AUDIO_VISUAL 204 +#define SUBCAT_AUDIO_MISC 205 + +#define CAT_VIDEO 3 +#define SUBCAT_VIDEO_GENERAL 301 +#define SUBCAT_VIDEO_VOUT 302 +#define SUBCAT_VIDEO_VFILTER 303 +#define SUBCAT_VIDEO_SUBPIC 305 + +#define CAT_INPUT 4 +#define SUBCAT_INPUT_GENERAL 401 +#define SUBCAT_INPUT_ACCESS 402 +#define SUBCAT_INPUT_DEMUX 403 +#define SUBCAT_INPUT_VCODEC 404 +#define SUBCAT_INPUT_ACODEC 405 +#define SUBCAT_INPUT_SCODEC 406 +#define SUBCAT_INPUT_STREAM_FILTER 407 + +#define CAT_SOUT 5 +#define SUBCAT_SOUT_GENERAL 501 +#define SUBCAT_SOUT_STREAM 502 +#define SUBCAT_SOUT_MUX 503 +#define SUBCAT_SOUT_ACO 504 +#define SUBCAT_SOUT_PACKETIZER 505 +#define SUBCAT_SOUT_VOD 507 + +#define CAT_ADVANCED 6 +#define SUBCAT_ADVANCED_MISC 602 +#define SUBCAT_ADVANCED_NETWORK 603 + +#define CAT_PLAYLIST 7 +#define SUBCAT_PLAYLIST_GENERAL 701 +#define SUBCAT_PLAYLIST_SD 702 +#define SUBCAT_PLAYLIST_EXPORT 703 + + +/** + * Current plugin ABI version + */ +# define MODULE_SYMBOL 2_2_0b +# define MODULE_SUFFIX "__2_2_0b" + +/***************************************************************************** + * Add a few defines. You do not want to read this section. Really. + *****************************************************************************/ + +/* Explanation: + * + * if linking a module statically, we will need: + * #define MODULE_FUNC( zog ) module_foo_zog + * + * this can't easily be done with the C preprocessor, thus a few ugly hacks. + */ + +/* I need to do _this_ to change « foo bar » to « module_foo_bar » ! */ +#define CONCATENATE( y, z ) CRUDE_HACK( y, z ) +#define CRUDE_HACK( y, z ) y##__##z + +/* If the module is built-in, then we need to define foo_InitModule instead + * of InitModule. Same for Activate- and DeactivateModule. */ +#ifdef __PLUGIN__ +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_SYMBOL ) +#else +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_NAME ) +#endif + +#define CDECL_SYMBOL +#if defined (__PLUGIN__) +# if defined (_WIN32) +# define DLL_SYMBOL __declspec(dllexport) +# undef CDECL_SYMBOL +# define CDECL_SYMBOL __cdecl +# elif VLC_GCC_VERSION(4,0) +# define DLL_SYMBOL __attribute__((visibility("default"))) +# else +# define DLL_SYMBOL +# endif +#else +# define DLL_SYMBOL +#endif + +#if defined( __cplusplus ) +# define EXTERN_SYMBOL extern "C" +#else +# define EXTERN_SYMBOL +#endif + +typedef int (*vlc_set_cb) (void *, void *, int, ...); + +#define vlc_plugin_set(...) vlc_set (opaque, NULL, __VA_ARGS__) +#define vlc_module_set(...) vlc_set (opaque, module, __VA_ARGS__) +#define vlc_config_set(...) vlc_set (opaque, config, __VA_ARGS__) + +/* + * InitModule: this function is called once and only once, when the module + * is looked at for the first time. We get the useful data from it, for + * instance the module name, its shortcuts, its capabilities... we also create + * a copy of its config because the module can be unloaded at any time. + */ +#define vlc_module_begin() \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \ +{ \ + module_t *module; \ + module_config_t *config = NULL; \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; \ + if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \ + goto error; + +#define vlc_module_end() \ + (void) config; \ + return 0; \ +error: \ + return -1; \ +} \ +VLC_METADATA_EXPORTS + +#define add_submodule( ) \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; + +#define add_shortcut( ... ) \ +{ \ + const char *shortcuts[] = { __VA_ARGS__ }; \ + if (vlc_module_set (VLC_MODULE_SHORTCUT, \ + sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts)) \ + goto error; \ +} + +#define set_shortname( shortname ) \ + if (vlc_module_set (VLC_MODULE_SHORTNAME, (const char *)(shortname))) \ + goto error; + +#define set_description( desc ) \ + if (vlc_module_set (VLC_MODULE_DESCRIPTION, (const char *)(desc))) \ + goto error; + +#define set_help( help ) \ + if (vlc_module_set (VLC_MODULE_HELP, (const char *)(help))) \ + goto error; + +#define set_capability( cap, score ) \ + if (vlc_module_set (VLC_MODULE_CAPABILITY, (const char *)(cap)) \ + || vlc_module_set (VLC_MODULE_SCORE, (int)(score))) \ + goto error; + +#define set_callbacks( activate, deactivate ) \ + if (vlc_module_set (VLC_MODULE_CB_OPEN, activate) \ + || vlc_module_set (VLC_MODULE_CB_CLOSE, deactivate)) \ + goto error; + +#define cannot_unload_broken_library( ) \ + if (vlc_module_set (VLC_MODULE_NO_UNLOAD)) \ + goto error; + +#define set_text_domain( dom ) \ + if (vlc_plugin_set (VLC_MODULE_TEXTDOMAIN, (dom))) \ + goto error; + +/***************************************************************************** + * Macros used to build the configuration structure. + * + * Note that internally we support only 3 types of config data: int, float + * and string. + * The other types declared here just map to one of these 3 basic types but + * have the advantage of also providing very good hints to a configuration + * interface so as to make it more user friendly. + * The configuration structure also includes category hints. These hints can + * provide a configuration interface with some very useful data and again + * allow for a more user friendly interface. + *****************************************************************************/ + +#define add_type_inner( type ) \ + vlc_plugin_set (VLC_CONFIG_CREATE, (type), &config); + +#define add_typedesc_inner( type, text, longtext ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_DESC, \ + (const char *)(text), (const char *)(longtext)); + +#define add_typeadv_inner( type, text, longtext, advc ) \ + add_typedesc_inner( type, text, longtext ) \ + if (advc) vlc_config_set (VLC_CONFIG_ADVANCED); + +#define add_typename_inner( type, name, text, longtext, advc ) \ + add_typeadv_inner( type, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); + +#define add_string_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (const char *)(v)); + +#define add_int_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(v)); + + +#define set_category( i_id ) \ + add_type_inner( CONFIG_CATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_subcategory( i_id ) \ + add_type_inner( CONFIG_SUBCATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_section( text, longtext ) \ + add_typedesc_inner( CONFIG_SECTION, text, longtext ) + +#define add_category_hint( text, longtext, advc ) \ + add_typeadv_inner( CONFIG_HINT_CATEGORY, text, longtext, advc ) + +#define add_usage_hint( text ) \ + add_typedesc_inner( CONFIG_HINT_USAGE, text, NULL ) + +#define add_string( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_STRING, name, text, longtext, advc, \ + value ) + +#define add_password( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_PASSWORD, name, text, longtext, advc, \ + value ) + +#define add_loadfile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_LOADFILE, name, text, longtext, advc, \ + value ) + +#define add_savefile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_SAVEFILE, name, text, longtext, advc, \ + value ) + +#define add_directory( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_DIRECTORY, name, text, longtext, advc, \ + value ) + +#define add_font( name, value, text, longtext, advc )\ + add_string_inner( CONFIG_ITEM_FONT, name, text, longtext, advc, \ + value ) + +#define add_module( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#define add_module_list( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#ifndef __PLUGIN__ +#define add_module_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_CAT, name, text, longtext, advc, \ + value ) \ + change_integer_range (i_subcategory /* gruik */, 0); + +#define add_module_list_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST_CAT, name, text, longtext, \ + advc, value ) \ + change_integer_range (i_subcategory /* gruik */, 0); +#endif + +#define add_integer( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_INTEGER, name, text, longtext, advc, value ) + +#define add_rgb( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_RGB, name, text, longtext, advc, value ) \ + change_integer_range( 0, 0xFFFFFF ) + +#define add_key( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_KEY, "global-" name, text, longtext, advc, \ + KEY_UNSET ) \ + add_string_inner( CONFIG_ITEM_KEY, name, text, longtext, advc, value ) + +#define add_integer_with_range( name, value, i_min, i_max, text, longtext, advc ) \ + add_integer( name, value, text, longtext, advc ) \ + change_integer_range( i_min, i_max ) + +#define add_float( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_FLOAT, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (double)(v)); + +#define add_float_with_range( name, value, f_min, f_max, text, longtext, advc ) \ + add_float( name, value, text, longtext, advc ) \ + change_float_range( f_min, f_max ) + +#define add_bool( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_BOOL, name, text, longtext, advc ) \ + if (v) vlc_config_set (VLC_CONFIG_VALUE, (int64_t)true); + +/* For removed option */ +#define add_obsolete_inner( name, type ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); \ + vlc_config_set (VLC_CONFIG_REMOVED); + +#define add_obsolete_bool( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_BOOL ) + +#define add_obsolete_integer( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_INTEGER ) + +#define add_obsolete_float( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_FLOAT ) + +#define add_obsolete_string( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_STRING ) + +/* Modifier macros for the config options (used for fine tuning) */ + +#define change_short( ch ) \ + vlc_config_set (VLC_CONFIG_SHORTCUT, (int)(ch)); + +#define change_string_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (char *)), \ + (const char *const *)(list), \ + (const char *const *)(list_text)); + +#define change_string_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, (cb)); + +#define change_integer_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (int)), \ + (const int *)(list), \ + (const char *const *)(list_text)); + +#define change_integer_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, (cb)); + +#define change_integer_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (int64_t)(minv), (int64_t)(maxv)); + +#define change_float_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (double)(minv), (double)(maxv)); + +#define change_action_add( pf_action, text ) \ + (void)(pf_action, text); + +/* For options that are saved but hidden from the preferences panel */ +#define change_private() \ + vlc_config_set (VLC_CONFIG_PRIVATE); + +/* For options that cannot be saved in the configuration */ +#define change_volatile() \ + change_private() \ + vlc_config_set (VLC_CONFIG_VOLATILE); + +#define change_safe() \ + vlc_config_set (VLC_CONFIG_SAFE); + +/* Meta data plugin exports */ +#define VLC_META_EXPORT( name, value ) \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void); \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void) \ + { \ + return value; \ + } + +#if defined (__LIBVLC__) +# define VLC_COPYRIGHT_EXPORT VLC_META_EXPORT (copyright, \ + "\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x74\x68" \ + "\x65\x20\x56\x69\x64\x65\x6f\x4c\x41\x4e\x20\x56\x4c\x43\x20\x6d" \ + "\x65\x64\x69\x61\x20\x70\x6c\x61\x79\x65\x72\x20\x64\x65\x76\x65" \ + "\x6c\x6f\x70\x65\x72\x73" ) +# define VLC_LICENSE_EXPORT VLC_META_EXPORT (license, \ + "\x4c\x69\x63\x65\x6e\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74" \ + "\x68\x65\x20\x74\x65\x72\x6d\x73\x20\x6f\x66\x20\x74\x68\x65\x20" \ + "\x47\x4e\x55\x20\x4c\x65\x73\x73\x65\x72\x20\x47\x65\x6e\x65\x72" \ + "\x61\x6c\x20\x50\x75\x62\x6c\x69\x63\x20\x4c\x69\x63\x65\x6e\x73" \ + "\x65\x2c\x20\x76\x65\x72\x73\x69\x6f\x6e\x20\x32\x2e\x31\x20\x6f" \ + "\x72\x20\x6c\x61\x74\x65\x72\x2e" ) +#else +# if !defined (VLC_COPYRIGHT_EXPORT) +# define VLC_COPYRIGHT_EXPORT +# endif +# if !defined (VLC_LICENSE_EXPORT) +# define VLC_LICENSE_EXPORT +# endif +#endif + +#define VLC_METADATA_EXPORTS \ + VLC_COPYRIGHT_EXPORT \ + VLC_LICENSE_EXPORT + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_probe.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_probe.h new file mode 100644 index 0000000..efa4d97 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_probe.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * vlc_probe.h: service probing interface + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PROBE_H +# define VLC_PROBE_H 1 + +# include + +/** + * \file + * This file defines functions and structures to run-time probe VLC extensions + */ + +# ifdef __cplusplus +extern "C" { +# endif + +void *vlc_probe (vlc_object_t *, const char *, size_t *); +#define vlc_probe(obj, cap, pcount) \ + vlc_probe(VLC_OBJECT(obj), cap, pcount) + +struct vlc_probe_t +{ + VLC_COMMON_MEMBERS + + void *list; + size_t count; +}; + +typedef struct vlc_probe_t vlc_probe_t; + +static inline int vlc_probe_add(vlc_probe_t *obj, const void *data, + size_t len) +{ + char *tab = (char *)realloc (obj->list, (obj->count + 1) * len); + + if (unlikely(tab == NULL)) + return VLC_ENOMEM; + memcpy(tab + (obj->count * len), data, len); + obj->list = tab; + obj->count++; + return VLC_SUCCESS; +} + +# define VLC_PROBE_CONTINUE VLC_EGENERIC +# define VLC_PROBE_STOP VLC_SUCCESS + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_rand.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_rand.h new file mode 100644 index 0000000..761cee5 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_rand.h @@ -0,0 +1,37 @@ +/***************************************************************************** + * vlc_rand.h: RNG + ***************************************************************************** + * Copyright © 2007 Rémi Denis-Courmont + * $Id: 3ae95ac04c55f46d116481eb89255b013f6d1c32 $ + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_RAND_H +# define VLC_RAND_H + +/** + * \file + * This file defined random number generator function in vlc + */ + +VLC_API void vlc_rand_bytes(void *buf, size_t len); + +/* Interlocked (but not reproducible) functions for the POSIX PRNG */ +VLC_API double vlc_drand48(void) VLC_USED; +VLC_API long vlc_lrand48(void) VLC_USED; +VLC_API long vlc_mrand48(void) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_services_discovery.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_services_discovery.h new file mode 100644 index 0000000..3652230 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_services_discovery.h @@ -0,0 +1,185 @@ +/***************************************************************************** + * vlc_services_discovery.h : Services Discover functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: d9c231b28f3ec075343e0f8016792b8fa33f60f5 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SERVICES_DISCOVERY_H_ +#define VLC_SERVICES_DISCOVERY_H_ + +#include +#include +#include + +/** + * \file + * This file lists functions and structures for service discovery (SD) in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * @{ + */ + +/** + * Main service discovery structure to build a SD module + */ +struct services_discovery_t +{ + VLC_COMMON_MEMBERS + module_t * p_module; /**< Loaded module */ + + /**< Event manager + * You should access it through setters, outside of the core */ + vlc_event_manager_t event_manager; + + char *psz_name; /**< Main name of the SD */ + config_chain_t *p_cfg; /**< Configuration for the SD */ + + /** Control function + * \see services_discovery_command_e + */ + int ( *pf_control ) ( services_discovery_t *, int, va_list ); + + services_discovery_sys_t *p_sys; /**< Custom private data */ +}; + +/** + * Service discovery categories + * \see vlc_sd_probe_Add + */ +enum services_discovery_category_e +{ + SD_CAT_DEVICES = 1, /**< Devices, like portable music players */ + SD_CAT_LAN, /**< LAN/WAN services, like Upnp or SAP */ + SD_CAT_INTERNET, /**< Internet or Website channels services */ + SD_CAT_MYCOMPUTER /**< Computer services, like Discs or Apps */ +}; + +/** + * Service discovery control commands + */ +enum services_discovery_command_e +{ + SD_CMD_SEARCH = 1, /**< arg1 = query */ + SD_CMD_DESCRIPTOR /**< arg1 = services_discovery_descriptor_t* */ +}; + +/** + * Service discovery capabilities + */ +enum services_discovery_capability_e +{ + SD_CAP_SEARCH = 1 /**< One can search in the SD */ +}; + +/** + * Service discovery descriptor + * \see services_discovery_command_e + */ +typedef struct +{ + char *psz_short_desc; /**< The short description, human-readable */ + char *psz_icon_url; /**< URL to the icon that represents it */ + char *psz_url; /**< URL for the service */ + int i_capabilities; /**< \see services_discovery_capability_e */ +} services_discovery_descriptor_t; + + +/*********************************************************************** + * Service Discovery + ***********************************************************************/ + +/** + * Ask for a research in the SD + * @param p_sd: the Service Discovery + * @param i_control: the command to issue + * @param args: the argument list + * @return VLC_SUCCESS in case of success, the error code overwise + */ +static inline int vlc_sd_control( services_discovery_t *p_sd, int i_control, va_list args ) +{ + if( p_sd->pf_control ) + return p_sd->pf_control( p_sd, i_control, args ); + else + return VLC_EGENERIC; +} + +/* Get the services discovery modules names to use in Create(), in a null + * terminated string array. Array and string must be freed after use. */ +VLC_API char ** vlc_sd_GetNames( vlc_object_t *, char ***, int ** ) VLC_USED; +#define vlc_sd_GetNames(obj, pln, pcat ) \ + vlc_sd_GetNames(VLC_OBJECT(obj), pln, pcat) + +/* Creation of a services_discovery object */ +VLC_API services_discovery_t * vlc_sd_Create( vlc_object_t *, const char * ) VLC_USED; +VLC_API bool vlc_sd_Start( services_discovery_t * ); +VLC_API void vlc_sd_Stop( services_discovery_t * ); +VLC_API void vlc_sd_Destroy( services_discovery_t * ); + +/** + * Helper to stop and destroy the Service Discovery + */ +static inline void vlc_sd_StopAndDestroy( services_discovery_t * p_this ) +{ + vlc_sd_Stop( p_this ); + vlc_sd_Destroy( p_this ); +} + +/* Read info from discovery object */ +VLC_API char * services_discovery_GetLocalizedName( services_discovery_t * p_this ) VLC_USED; + +/* Receive event notification (preferred way to get new items) */ +VLC_API vlc_event_manager_t * services_discovery_EventManager( services_discovery_t * p_this ) VLC_USED; + +/* Used by services_discovery to post update about their items */ + /* About the psz_category, it is a legacy way to add info to the item, + * for more options, directly set the (meta) data on the input item */ +VLC_API void services_discovery_AddItem( services_discovery_t * p_this, input_item_t * p_item, const char * psz_category ); +VLC_API void services_discovery_RemoveItem( services_discovery_t * p_this, input_item_t * p_item ); +VLC_API void services_discovery_RemoveAll( services_discovery_t * p_sd ); + + +/* SD probing */ + +VLC_API int vlc_sd_probe_Add(vlc_probe_t *, const char *, const char *, int category); + +#define VLC_SD_PROBE_SUBMODULE \ + add_submodule() \ + set_capability( "services probe", 100 ) \ + set_callbacks( vlc_sd_probe_Open, NULL ) + +#define VLC_SD_PROBE_HELPER(name, longname, cat) \ +static int vlc_sd_probe_Open (vlc_object_t *obj) \ +{ \ + return vlc_sd_probe_Add ((struct vlc_probe_t *)obj, \ + name "{longname=\"" longname "\"}", \ + longname, cat); \ +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_sout.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_sout.h new file mode 100644 index 0000000..7df3a52 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_sout.h @@ -0,0 +1,252 @@ +/***************************************************************************** + * vlc_sout.h : stream output module + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: b9366f790374562525f49d5449ec882fff348ddf $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Eric Petit + * Jean-Paul Saman + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SOUT_H_ +#define VLC_SOUT_H_ + +/** + * \file + * This file defines structures and functions for stream output in vlc + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** Stream output instance (FIXME: should be private to src/ to avoid + * invalid unsynchronized access) */ +struct sout_instance_t +{ + VLC_COMMON_MEMBERS + + char *psz_sout; + + /** count of output that can't control the space */ + int i_out_pace_nocontrol; + + vlc_mutex_t lock; + sout_stream_t *p_stream; +}; + +/**************************************************************************** + * sout_stream_id_sys_t: opaque (private for all sout_stream_t) + ****************************************************************************/ +typedef struct sout_stream_id_sys_t sout_stream_id_sys_t; + +/** Stream output access_output */ +struct sout_access_out_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + char *psz_access; + + char *psz_path; + sout_access_out_sys_t *p_sys; + int (*pf_seek)( sout_access_out_t *, off_t ); + ssize_t (*pf_read)( sout_access_out_t *, block_t * ); + ssize_t (*pf_write)( sout_access_out_t *, block_t * ); + int (*pf_control)( sout_access_out_t *, int, va_list ); + + config_chain_t *p_cfg; +}; + +enum access_out_query_e +{ + ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */ + ACCESS_OUT_CAN_SEEK, /* arg1=bool *, can fail (assume true) */ +}; + +VLC_API sout_access_out_t * sout_AccessOutNew( vlc_object_t *, const char *psz_access, const char *psz_name ) VLC_USED; +#define sout_AccessOutNew( obj, access, name ) \ + sout_AccessOutNew( VLC_OBJECT(obj), access, name ) +VLC_API void sout_AccessOutDelete( sout_access_out_t * ); +VLC_API int sout_AccessOutSeek( sout_access_out_t *, off_t ); +VLC_API ssize_t sout_AccessOutRead( sout_access_out_t *, block_t * ); +VLC_API ssize_t sout_AccessOutWrite( sout_access_out_t *, block_t * ); +VLC_API int sout_AccessOutControl( sout_access_out_t *, int, ... ); + +static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao ) +{ + bool b; + if( sout_AccessOutControl( p_ao, ACCESS_OUT_CONTROLS_PACE, &b ) ) + return true; + return b; +} + +/** Muxer structure */ +struct sout_mux_t +{ + VLC_COMMON_MEMBERS + module_t *p_module; + + sout_instance_t *p_sout; + + char *psz_mux; + config_chain_t *p_cfg; + + sout_access_out_t *p_access; + + int (*pf_addstream)( sout_mux_t *, sout_input_t * ); + int (*pf_delstream)( sout_mux_t *, sout_input_t * ); + int (*pf_mux) ( sout_mux_t * ); + int (*pf_control) ( sout_mux_t *, int, va_list ); + + /* here are all inputs accepted by muxer */ + int i_nb_inputs; + sout_input_t **pp_inputs; + + /* mux private */ + sout_mux_sys_t *p_sys; + + /* XXX private to stream_output.c */ + /* if muxer doesn't support adding stream at any time then we first wait + * for stream then we refuse all stream and start muxing */ + bool b_add_stream_any_time; + bool b_waiting_stream; + /* we wait one second after first stream added */ + mtime_t i_add_stream_start; +}; + +enum sout_mux_query_e +{ + /* capabilities */ + MUX_CAN_ADD_STREAM_WHILE_MUXING, /* arg1= bool *, res=cannot fail */ + /* properties */ + MUX_GET_ADD_STREAM_WAIT, /* arg1= bool *, res=cannot fail */ + MUX_GET_MIME, /* arg1= char ** res=can fail */ +}; + +struct sout_input_t +{ + es_format_t *p_fmt; + block_fifo_t *p_fifo; + + void *p_sys; +}; + + +VLC_API sout_mux_t * sout_MuxNew( sout_instance_t*, const char *, sout_access_out_t * ) VLC_USED; +VLC_API sout_input_t * sout_MuxAddStream( sout_mux_t *, es_format_t * ) VLC_USED; +VLC_API void sout_MuxDeleteStream( sout_mux_t *, sout_input_t * ); +VLC_API void sout_MuxDelete( sout_mux_t * ); +VLC_API int sout_MuxSendBuffer( sout_mux_t *, sout_input_t *, block_t * ); +VLC_API int sout_MuxGetStream(sout_mux_t *, int , mtime_t *); + +static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = p_mux->pf_control( p_mux, i_query, args ); + va_end( args ); + return i_result; +} + +/**************************************************************************** + * sout_stream: + ****************************************************************************/ +struct sout_stream_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + sout_instance_t *p_sout; + + char *psz_name; + config_chain_t *p_cfg; + sout_stream_t *p_next; + + /* add, remove a stream */ + sout_stream_id_sys_t *(*pf_add)( sout_stream_t *, es_format_t * ); + int (*pf_del)( sout_stream_t *, sout_stream_id_sys_t * ); + /* manage a packet */ + int (*pf_send)( sout_stream_t *, sout_stream_id_sys_t *, block_t* ); + + sout_stream_sys_t *p_sys; + bool pace_nocontrol; +}; + +VLC_API void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last ); +VLC_API sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout, + char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED; + +static inline sout_stream_id_sys_t *sout_StreamIdAdd( sout_stream_t *s, es_format_t *fmt ) +{ + return s->pf_add( s, fmt ); +} +static inline int sout_StreamIdDel( sout_stream_t *s, sout_stream_id_sys_t *id ) +{ + return s->pf_del( s, id ); +} +static inline int sout_StreamIdSend( sout_stream_t *s, sout_stream_id_sys_t *id, block_t *b ) +{ + return s->pf_send( s, id, b ); +} + +/**************************************************************************** + * Encoder + ****************************************************************************/ + +VLC_API encoder_t * sout_EncoderCreate( vlc_object_t *obj ); +#define sout_EncoderCreate(o) sout_EncoderCreate(VLC_OBJECT(o)) + +/**************************************************************************** + * Announce handler + ****************************************************************************/ +VLC_API session_descriptor_t* sout_AnnounceRegisterSDP( vlc_object_t *, const char *, const char * ) VLC_USED; +VLC_API int sout_AnnounceUnRegister(vlc_object_t *,session_descriptor_t* ); +#define sout_AnnounceRegisterSDP(o, sdp, addr) \ + sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr) +#define sout_AnnounceUnRegister(o, a) \ + sout_AnnounceUnRegister(VLC_OBJECT (o), a) + +/** SDP */ + +struct sockaddr; + +VLC_API char * vlc_sdp_Start( vlc_object_t *obj, const char *cfgpref, const struct sockaddr *src, size_t srclen, const struct sockaddr *addr, size_t addrlen ) VLC_USED; +VLC_API char * sdp_AddMedia(char **sdp, const char *type, const char *protocol, int dport, unsigned pt, bool bw_indep, unsigned bw, const char *ptname, unsigned clockrate, unsigned channels, const char *fmtp); +VLC_API char * sdp_AddAttribute(char **sdp, const char *name, const char *fmt, ...) VLC_FORMAT( 3, 4 ); + +/** Description module */ +typedef struct sout_description_data_t +{ + int i_es; + es_format_t **es; + vlc_sem_t *sem; +} sout_description_data_t; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_spu.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_spu.h new file mode 100644 index 0000000..cbd20ea --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_spu.h @@ -0,0 +1,112 @@ +/***************************************************************************** + * vlc_spu.h: spu_t definition and functions. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2010 Laurent Aimar + * $Id: d448d06f8c9f9c91d70239ff0d07cb5ceac06423 $ + * + * Authors: Gildas Bazin + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SPU_H +#define VLC_SPU_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************** + * Base SPU structures + **********************************************************************/ +/** + * \defgroup spu Subpicture Unit + * This module describes the programming interface for the subpicture unit. + * It includes functions allowing to create/destroy an spu, and render + * subpictures. + * @{ + */ + +typedef struct spu_private_t spu_private_t; + +/* Default subpicture channel ID */ +#define SPU_DEFAULT_CHANNEL (1) + +/** + * Subpicture unit descriptor + */ +struct spu_t +{ + VLC_COMMON_MEMBERS + + spu_private_t *p; +}; + +VLC_API spu_t * spu_Create( vlc_object_t * ); +#define spu_Create(a) spu_Create(VLC_OBJECT(a)) +VLC_API void spu_Destroy( spu_t * ); + +/** + * This function sends a subpicture to the spu_t core. + * + * You cannot use the provided subpicture anymore. The spu_t core + * will destroy it at its convenience. + */ +VLC_API void spu_PutSubpicture( spu_t *, subpicture_t * ); + +/** + * This function will return an unique subpicture containing the OSD and + * subtitles visibles at the requested date. + * + * \param p_chroma_list is a list of supported chroma for the output (can be NULL) + * \param p_fmt_dst is the format of the picture on which the return subpicture will be rendered. + * \param p_fmt_src is the format of the original(source) video. + * + * The returned value if non NULL must be released by subpicture_Delete(). + */ +VLC_API subpicture_t * spu_Render( spu_t *, const vlc_fourcc_t *p_chroma_list, const video_format_t *p_fmt_dst, const video_format_t *p_fmt_src, mtime_t render_subtitle_date, mtime_t render_osd_date, bool ignore_osd ); + +/** + * It registers a new SPU channel. + */ +VLC_API int spu_RegisterChannel( spu_t * ); + +/** + * It clears all subpictures associated to a SPU channel. + */ +VLC_API void spu_ClearChannel( spu_t *, int ); + +/** + * It changes the sub sources list + */ +VLC_API void spu_ChangeSources( spu_t *, const char * ); + +/** + * It changes the sub filters list + */ +VLC_API void spu_ChangeFilters( spu_t *, const char * ); + +/** @}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_SPU_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_stream.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_stream.h new file mode 100644 index 0000000..5cec1b3 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_stream.h @@ -0,0 +1,233 @@ +/***************************************************************************** + * vlc_stream.h: Stream (between access and demux) descriptor and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 10a98ef2811fdfddb4b934c04806fea6813aaab5 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STREAM_H +#define VLC_STREAM_H 1 + +#include + +/** + * \file + * This file defines structures and functions for stream (between access and demux) descriptor in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \defgroup stream Stream + * + * This will allow you to easily handle read/seek in demuxer modules. + * @{ + */ + +/* Opaque definition for text reader context */ +typedef struct stream_text_t stream_text_t; + +/** + * stream_t definition + */ + +struct stream_t +{ + VLC_COMMON_MEMBERS + bool b_error; + + /* Module properties for stream filter */ + module_t *p_module; + + char *psz_access; + /* Real or virtual path (it can only be changed during stream_t opening) */ + char *psz_path; + + /* Stream source for stream filter */ + stream_t *p_source; + + /* */ + int (*pf_read) ( stream_t *, void *p_read, unsigned int i_read ); + int (*pf_peek) ( stream_t *, const uint8_t **pp_peek, unsigned int i_peek ); + int (*pf_control)( stream_t *, int i_query, va_list ); + + /* */ + void (*pf_destroy)( stream_t *); + + /* Private data for module */ + stream_sys_t *p_sys; + + /* Text reader state */ + stream_text_t *p_text; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/** + * Possible commands to send to stream_Control() and stream_vaControl() + */ +enum stream_query_e +{ + /* capabilities */ + STREAM_CAN_SEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_FASTSEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_PAUSE, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_CONTROL_PACE, /**< arg1= bool * res=cannot fail*/ + + /* */ + STREAM_SET_POSITION, /**< arg1= uint64_t res=can fail */ + STREAM_GET_POSITION, /**< arg1= uint64_t * res=cannot fail*/ + + STREAM_GET_SIZE, /**< arg1= uint64_t * res=cannot fail (0 if no sense)*/ + + /* You should update size of source if any and then update size + * FIXME find a way to avoid it */ + STREAM_UPDATE_SIZE, + + /* */ + STREAM_GET_PTS_DELAY = 0x101,/**< arg1= int64_t* res=cannot fail */ + STREAM_GET_TITLE_INFO, /**< arg1=input_title_t*** arg2=int* res=can fail */ + STREAM_GET_TITLE, /**< arg1=unsigned * res=can fail */ + STREAM_GET_SEEKPOINT, /**< arg1=unsigned * res=can fail */ + STREAM_GET_META, /**< arg1= vlc_meta_t ** res=can fail */ + STREAM_GET_CONTENT_TYPE, /**< arg1= char ** res=can fail */ + STREAM_GET_SIGNAL, /**< arg1=double *pf_quality, arg2=double *pf_strength res=can fail */ + + STREAM_SET_PAUSE_STATE = 0x200, /**< arg1= bool res=can fail */ + STREAM_SET_TITLE, /**< arg1= int res=can fail */ + STREAM_SET_SEEKPOINT, /**< arg1= int res=can fail */ + + /* XXX only data read through stream_Read/Block will be recorded */ + STREAM_SET_RECORD_STATE, /**< arg1=bool, arg2=const char *psz_ext (if arg1 is true) res=can fail */ + + STREAM_SET_PRIVATE_ID_STATE = 0x1000, /* arg1= int i_private_data, bool b_selected res=can fail */ + STREAM_SET_PRIVATE_ID_CA, /* arg1= int i_program_number, uint16_t i_vpid, uint16_t i_apid1, uint16_t i_apid2, uint16_t i_apid3, uint8_t i_length, uint8_t *p_data */ + STREAM_GET_PRIVATE_ID_STATE, /* arg1=int i_private_data arg2=bool * res=can fail */ +}; + +VLC_API int stream_Read( stream_t *s, void *p_read, int i_read ); +VLC_API int stream_Peek( stream_t *s, const uint8_t **pp_peek, int i_peek ); +VLC_API int stream_vaControl( stream_t *s, int i_query, va_list args ); +VLC_API void stream_Delete( stream_t *s ); +VLC_API int stream_Control( stream_t *s, int i_query, ... ); +VLC_API block_t * stream_Block( stream_t *s, int i_size ); +VLC_API block_t * stream_BlockRemaining( stream_t *s, int i_max_size ); +VLC_API char * stream_ReadLine( stream_t * ); + +/** + * Get the current position in a stream + */ +static inline int64_t stream_Tell( stream_t *s ) +{ + uint64_t i_pos; + stream_Control( s, STREAM_GET_POSITION, &i_pos ); + if( i_pos >> 62 ) + return (int64_t)1 << 62; + return i_pos; +} + +/** + * Get the size of the stream. + */ +static inline int64_t stream_Size( stream_t *s ) +{ + uint64_t i_pos; + stream_Control( s, STREAM_GET_SIZE, &i_pos ); + if( i_pos >> 62 ) + return (int64_t)1 << 62; + return i_pos; +} + +static inline int stream_Seek( stream_t *s, uint64_t i_pos ) +{ + return stream_Control( s, STREAM_SET_POSITION, i_pos ); +} + +/** + * Get the Content-Type of a stream, or NULL if unknown. + * Result must be free()'d. + */ +static inline char *stream_ContentType( stream_t *s ) +{ + char *res; + if( stream_Control( s, STREAM_GET_CONTENT_TYPE, &res ) ) + return NULL; + return res; +} + +/** + * Create a special stream and a demuxer, this allows chaining demuxers + * You must delete it using stream_Delete. + */ +VLC_API stream_t * stream_DemuxNew( demux_t *p_demux, const char *psz_demux, es_out_t *out ); + +/** + * Send data to a stream handle created by stream_DemuxNew(). + */ +VLC_API void stream_DemuxSend( stream_t *s, block_t *p_block ); + +/** + * Perform a demux (i.e. DEMUX_...) control request on a stream handle + * created by stream_DemuxNew(). + */ +VLC_API int stream_DemuxControlVa( stream_t *s, int, va_list ); + +static inline int stream_DemuxControl( stream_t *s, int query, ... ) +{ + va_list ap; + int ret; + + va_start( ap, query ); + ret = stream_DemuxControlVa( s, query, ap ); + va_end( ap ); + return ret; +} + +/** + * Create a stream_t reading from memory. + * You must delete it using stream_Delete. + */ +VLC_API stream_t * stream_MemoryNew(vlc_object_t *p_obj, uint8_t *p_buffer, uint64_t i_size, bool b_preserve_memory ); +#define stream_MemoryNew( a, b, c, d ) stream_MemoryNew( VLC_OBJECT(a), b, c, d ) + +/** + * Create a stream_t reading from a URL. + * You must delete it using stream_Delete. + */ +VLC_API stream_t * stream_UrlNew(vlc_object_t *p_this, const char *psz_url ); +#define stream_UrlNew( a, b ) stream_UrlNew( VLC_OBJECT(a), b ) + + +/** + * Try to add a stream filter to an open stream. + * @return New stream to use, or NULL if the filter could not be added. + **/ +VLC_API stream_t* stream_FilterNew( stream_t *p_source, const char *psz_stream_filter ); +/** + * @} + */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_strings.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_strings.h new file mode 100644 index 0000000..52a5bde --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_strings.h @@ -0,0 +1,67 @@ +/***************************************************************************** + * vlc_strings.h: String functions + ***************************************************************************** + * Copyright (C) 2006 VLC authors and VideoLAN + * $Id: 3ce4884e7ac610205103c2e1cbab521a4c1ebab4 $ + * + * Authors: Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STRINGS_H +#define VLC_STRINGS_H 1 + +/** + * \file + * This file defines functions and structures handling misc strings + */ + +/** + * \defgroup strings Strings + * @{ + */ + +VLC_API void resolve_xml_special_chars( char *psz_value ); +VLC_API char * convert_xml_special_chars( const char *psz_content ); + +VLC_API char * vlc_b64_encode_binary( const uint8_t *, size_t ); +VLC_API char * vlc_b64_encode( const char * ); + +VLC_API size_t vlc_b64_decode_binary_to_buffer( uint8_t *p_dst, size_t i_dst_max, const char *psz_src ); +VLC_API size_t vlc_b64_decode_binary( uint8_t **pp_dst, const char *psz_src ); +VLC_API char * vlc_b64_decode( const char *psz_src ); + +VLC_API char * str_format_time( const char * ); +VLC_API char * str_format_meta( input_thread_t *, const char * ); + +static inline char *str_format( input_thread_t *input, const char *fmt ) +{ + char *s1 = str_format_time( fmt ); + char *s2 = str_format_meta( input, s1 ); + free( s1 ); + return s2; +} + +VLC_API void filename_sanitize( char * ); +VLC_API void path_sanitize( char * ); + +VLC_API time_t str_duration( const char * ); + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_subpicture.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_subpicture.h new file mode 100644 index 0000000..8d78bb4 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_subpicture.h @@ -0,0 +1,208 @@ +/***************************************************************************** + * vlc_subpicture.h: subpicture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: 6bfede171002b78b80c7635e87fdd51ea7d15ea4 $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SUBPICTURE_H +#define VLC_SUBPICTURE_H 1 + +/** + * \file + * This file defines subpicture structures and functions in vlc + */ + +#include +#include + +/** + * \defgroup subpicture Video Subpictures + * Subpictures are pictures that should be displayed on top of the video, like + * subtitles and OSD + * \ingroup video_output + * @{ + */ + +/** + * Video subtitle region spu core private + */ +typedef struct subpicture_region_private_t subpicture_region_private_t; + +/** + * Video subtitle region + * + * A subtitle region is defined by a picture (graphic) and its rendering + * coordinates. + * Subtitles contain a list of regions. + */ +struct subpicture_region_t +{ + video_format_t fmt; /**< format of the picture */ + picture_t *p_picture; /**< picture comprising this region */ + + int i_x; /**< position of region */ + int i_y; /**< position of region */ + int i_align; /**< alignment within a region */ + int i_alpha; /**< transparency */ + + char *psz_text; /**< text string comprising this region */ + char *psz_html; /**< HTML version of subtitle (NULL = use psz_text) */ + text_style_t *p_style; /**< a description of the text style formatting */ + bool b_renderbg; /**< render black background under text */ + + subpicture_region_t *p_next; /**< next region in the list */ + subpicture_region_private_t *p_private; /**< Private data for spu_t *only* */ +}; + +/* Subpicture region position flags */ +#define SUBPICTURE_ALIGN_LEFT 0x1 +#define SUBPICTURE_ALIGN_RIGHT 0x2 +#define SUBPICTURE_ALIGN_TOP 0x4 +#define SUBPICTURE_ALIGN_BOTTOM 0x8 +#define SUBPICTURE_ALIGN_LEAVETEXT 0x10 /**< Align the subpicture, but not the text inside */ +#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \ + SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM| \ + SUBPICTURE_ALIGN_LEAVETEXT ) +/** + * This function will create a new subpicture region. + * + * You must use subpicture_region_Delete to destroy it. + */ +VLC_API subpicture_region_t * subpicture_region_New( const video_format_t *p_fmt ); + +/** + * This function will destroy a subpicture region allocated by + * subpicture_region_New. + * + * You may give it NULL. + */ +VLC_API void subpicture_region_Delete( subpicture_region_t *p_region ); + +/** + * This function will destroy a list of subpicture regions allocated by + * subpicture_region_New. + * + * Provided for convenience. + */ +VLC_API void subpicture_region_ChainDelete( subpicture_region_t *p_head ); + +/** + * + */ +typedef struct subpicture_updater_sys_t subpicture_updater_sys_t; +typedef struct +{ + int (*pf_validate)( subpicture_t *, + bool has_src_changed, const video_format_t *p_fmt_src, + bool has_dst_changed, const video_format_t *p_fmt_dst, + mtime_t); + void (*pf_update) ( subpicture_t *, + const video_format_t *p_fmt_src, + const video_format_t *p_fmt_dst, + mtime_t ); + void (*pf_destroy) ( subpicture_t * ); + subpicture_updater_sys_t *p_sys; +} subpicture_updater_t; + +typedef struct subpicture_private_t subpicture_private_t; + +/** + * Video subtitle + * + * Any subtitle destined to be displayed by a video output thread should + * be stored in this structure from it's creation to it's effective display. + * Subtitle type and flags should only be modified by the output thread. Note + * that an empty subtitle MUST have its flags set to 0. + */ +struct subpicture_t +{ + /** \name Channel ID */ + /**@{*/ + int i_channel; /**< subpicture channel ID */ + /**@}*/ + + /** \name Type and flags + Should NOT be modified except by the vout thread */ + /**@{*/ + int64_t i_order; /** an increasing unique number */ + subpicture_t * p_next; /**< next subtitle to be displayed */ + /**@}*/ + + subpicture_region_t *p_region; /**< region list composing this subtitle */ + + /** \name Date properties */ + /**@{*/ + mtime_t i_start; /**< beginning of display date */ + mtime_t i_stop; /**< end of display date */ + bool b_ephemer; /**< If this flag is set to true the subtitle + will be displayed untill the next one appear */ + bool b_fade; /**< enable fading */ + /**@}*/ + + /** \name Display properties + * These properties are only indicative and may be + * changed by the video output thread, or simply ignored depending of the + * subtitle type. */ + /**@{*/ + bool b_subtitle; /**< the picture is a movie subtitle */ + bool b_absolute; /**< position is absolute */ + int i_original_picture_width; /**< original width of the movie */ + int i_original_picture_height;/**< original height of the movie */ + int i_alpha; /**< transparency */ + /**@}*/ + + subpicture_updater_t updater; + + subpicture_private_t *p_private; /* Reserved to the core */ +}; + +/** + * This function create a new empty subpicture. + * + * You must use subpicture_Delete to destroy it. + */ +VLC_API subpicture_t * subpicture_New( const subpicture_updater_t * ); + +/** + * This function delete a subpicture created by subpicture_New. + * You may give it NULL. + */ +VLC_API void subpicture_Delete( subpicture_t *p_subpic ); + +/** + * This function will create a subpicture having one region in the requested + * chroma showing the given picture. + * + * The picture_t given is not released nor used inside the + * returned subpicture_t. + */ +VLC_API subpicture_t * subpicture_NewFromPicture( vlc_object_t *, picture_t *, vlc_fourcc_t i_chroma ); + +/** + * This function will update the content of a subpicture created with + * a non NULL subpicture_updater_t. + */ +VLC_API void subpicture_Update( subpicture_t *, const video_format_t *src, const video_format_t *, mtime_t ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_text_style.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_text_style.h new file mode 100644 index 0000000..10a1b5b --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_text_style.h @@ -0,0 +1,107 @@ +/***************************************************************************** + * vlc_text_style.h: text_style_t definition and helpers. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * $Id: 51677243e472c3e7712f1a0b168a647433f7470b $ + * + * Authors: Derk-Jan Hartman + * basOS G + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TEXT_STYLE_H +#define VLC_TEXT_STYLE_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Text style + * + * A text style is used to specify the formatting of text. + * A font renderer can use the supplied information to render the + * text specified. + */ +typedef struct +{ + char * psz_fontname; /**< The name of the font */ + char * psz_monofontname; /**< The name of the mono font */ + int i_font_size; /**< The font size in pixels */ + int i_font_color; /**< The color of the text 0xRRGGBB + (native endianness) */ + unsigned i_font_alpha; /**< The transparency of the text. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_style_flags; /**< Formatting style flags */ + int i_outline_color; /**< The color of the outline 0xRRGGBB */ + int i_outline_alpha; /**< The transparency of the outline. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_shadow_color; /**< The color of the shadow 0xRRGGBB */ + int i_shadow_alpha; /**< The transparency of the shadow. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_background_color;/**< The color of the background 0xRRGGBB */ + int i_background_alpha;/**< The transparency of the background. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_karaoke_background_color;/**< Background color for karaoke 0xRRGGBB */ + int i_karaoke_background_alpha;/**< The transparency of the karaoke bg. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_outline_width; /**< The width of the outline in pixels */ + int i_shadow_width; /**< The width of the shadow in pixels */ + int i_spacing; /**< The spaceing between glyphs in pixels */ +} text_style_t; + +/* Style flags for \ref text_style_t */ +#define STYLE_BOLD 1 +#define STYLE_ITALIC 2 +#define STYLE_OUTLINE 4 +#define STYLE_SHADOW 8 +#define STYLE_BACKGROUND 16 +#define STYLE_UNDERLINE 32 +#define STYLE_STRIKEOUT 64 + +#define STYLE_DEFAULT_FONT_SIZE 22 + +/** + * Create a default text style + */ +VLC_API text_style_t * text_style_New( void ); + +/** + * Copy a text style into another + */ +VLC_API text_style_t * text_style_Copy( text_style_t *, const text_style_t * ); + +/** + * Duplicate a text style + */ +VLC_API text_style_t * text_style_Duplicate( const text_style_t * ); + +/** + * Delete a text style created by text_style_New or text_style_Duplicate + */ +VLC_API void text_style_Delete( text_style_t * ); + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_TEXT_STYLE_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_threads.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_threads.h new file mode 100644 index 0000000..a6ac360 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_threads.h @@ -0,0 +1,481 @@ +/***************************************************************************** + * vlc_threads.h : threads implementation for the VideoLAN client + * This header provides portable declarations for mutexes & conditions + ***************************************************************************** + * Copyright (C) 1999, 2002 VLC authors and VideoLAN + * Copyright © 2007-2008 Rémi Denis-Courmont + * + * Authors: Jean-Marc Dressler + * Samuel Hocevar + * Gildas Bazin + * Christophe Massiot + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_THREADS_H_ +#define VLC_THREADS_H_ + +/** + * \file + * This file defines structures and functions for handling threads in vlc + * + */ + +#if defined (_WIN32) +# include +# ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +# endif + +typedef struct vlc_thread *vlc_thread_t; +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + CRITICAL_SECTION mutex; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +typedef struct +{ + HANDLE handle; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { 0, 0 } +typedef HANDLE vlc_sem_t; +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_AUDIO THREAD_PRIORITY_HIGHEST +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL + +#elif defined (__OS2__) +# include + +typedef struct vlc_thread *vlc_thread_t; +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + HMTX hmtx; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +typedef struct +{ + HEV hev; + unsigned waiters; + HEV hevAck; + unsigned signaled; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { NULLHANDLE, 0, NULLHANDLE, 0, 0 } +#define LIBVLC_NEED_SEMAPHORE +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_AUDIO MAKESHORT(PRTYD_MAXIMUM, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_HIGHEST MAKESHORT(0, PRTYC_TIMECRITICAL) + +# define pthread_sigmask sigprocmask + +#elif defined (__ANDROID__) /* pthreads subset without pthread_cancel() */ +# include +# include +# include +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_NEED_SEMAPHORE +# define LIBVLC_NEED_RWLOCK + +typedef struct vlc_thread *vlc_thread_t; +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef struct +{ + pthread_cond_t cond; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { PTHREAD_COND_INITIALIZER, CLOCK_REALTIME } + +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 0 +# define VLC_THREAD_PRIORITY_AUDIO 0 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 0 +# define VLC_THREAD_PRIORITY_HIGHEST 0 + +#elif defined (__APPLE__) +# define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */ +# include +# include +/* Unnamed POSIX semaphores not supported on Mac OS X */ +# include +# include +# define LIBVLC_USE_PTHREAD 1 +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_USE_PTHREAD_CANCEL 1 + +typedef pthread_t vlc_thread_t; +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef struct +{ + pthread_cond_t cond; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { PTHREAD_COND_INITIALIZER, 0 } +typedef semaphore_t vlc_sem_t; +typedef pthread_rwlock_t vlc_rwlock_t; +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 22 +# define VLC_THREAD_PRIORITY_AUDIO 22 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 22 +# define VLC_THREAD_PRIORITY_HIGHEST 22 + +#else /* POSIX threads */ +# include /* _POSIX_SPIN_LOCKS */ +# include +# include +# define LIBVLC_USE_PTHREAD 1 +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_USE_PTHREAD_CANCEL 1 + +typedef pthread_t vlc_thread_t; +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef pthread_cond_t vlc_cond_t; +#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER +typedef sem_t vlc_sem_t; +typedef pthread_rwlock_t vlc_rwlock_t; +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 10 +# define VLC_THREAD_PRIORITY_AUDIO 5 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 15 +# define VLC_THREAD_PRIORITY_HIGHEST 20 + +#endif + +#ifdef LIBVLC_NEED_SEMAPHORE +typedef struct vlc_sem +{ + vlc_mutex_t lock; + vlc_cond_t wait; + unsigned value; +} vlc_sem_t; +#endif + +#ifdef LIBVLC_NEED_RWLOCK +typedef struct vlc_rwlock +{ + vlc_mutex_t mutex; + vlc_cond_t wait; + long state; +} vlc_rwlock_t; +# define VLC_STATIC_RWLOCK { VLC_STATIC_MUTEX, VLC_STATIC_COND, 0 } +#endif + +/***************************************************************************** + * Function definitions + *****************************************************************************/ +VLC_API void vlc_mutex_init( vlc_mutex_t * ); +VLC_API void vlc_mutex_init_recursive( vlc_mutex_t * ); +VLC_API void vlc_mutex_destroy( vlc_mutex_t * ); +VLC_API void vlc_mutex_lock( vlc_mutex_t * ); +VLC_API int vlc_mutex_trylock( vlc_mutex_t * ) VLC_USED; +VLC_API void vlc_mutex_unlock( vlc_mutex_t * ); +VLC_API void vlc_cond_init( vlc_cond_t * ); +VLC_API void vlc_cond_init_daytime( vlc_cond_t * ); +VLC_API void vlc_cond_destroy( vlc_cond_t * ); +VLC_API void vlc_cond_signal(vlc_cond_t *); +VLC_API void vlc_cond_broadcast(vlc_cond_t *); +VLC_API void vlc_cond_wait(vlc_cond_t *, vlc_mutex_t *); +VLC_API int vlc_cond_timedwait(vlc_cond_t *, vlc_mutex_t *, mtime_t); +VLC_API void vlc_sem_init(vlc_sem_t *, unsigned); +VLC_API void vlc_sem_destroy(vlc_sem_t *); +VLC_API int vlc_sem_post(vlc_sem_t *); +VLC_API void vlc_sem_wait(vlc_sem_t *); + +VLC_API void vlc_rwlock_init(vlc_rwlock_t *); +VLC_API void vlc_rwlock_destroy(vlc_rwlock_t *); +VLC_API void vlc_rwlock_rdlock(vlc_rwlock_t *); +VLC_API void vlc_rwlock_wrlock(vlc_rwlock_t *); +VLC_API void vlc_rwlock_unlock(vlc_rwlock_t *); +VLC_API int vlc_threadvar_create(vlc_threadvar_t * , void (*) (void *) ); +VLC_API void vlc_threadvar_delete(vlc_threadvar_t *); +VLC_API int vlc_threadvar_set(vlc_threadvar_t, void *); +VLC_API void * vlc_threadvar_get(vlc_threadvar_t); + +VLC_API int vlc_clone(vlc_thread_t *, void * (*) (void *), void *, int) VLC_USED; +VLC_API void vlc_cancel(vlc_thread_t); +VLC_API void vlc_join(vlc_thread_t, void **); +VLC_API void vlc_control_cancel (int cmd, ...); + +VLC_API mtime_t mdate(void); +VLC_API void mwait(mtime_t deadline); +VLC_API void msleep(mtime_t delay); + +#define VLC_HARD_MIN_SLEEP 10000 /* 10 milliseconds = 1 tick at 100Hz */ +#define VLC_SOFT_MIN_SLEEP 9000000 /* 9 seconds */ + +#if VLC_GCC_VERSION(4,3) +/* Linux has 100, 250, 300 or 1000Hz + * + * HZ=100 by default on FreeBSD, but some architectures use a 1000Hz timer + */ + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("sorry, cannot sleep for such short a time"))) +mtime_t impossible_delay( mtime_t delay ) +{ + (void) delay; + return VLC_HARD_MIN_SLEEP; +} + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((warning("use proper event handling instead of short delay"))) +mtime_t harmful_delay( mtime_t delay ) +{ + return delay; +} + +# define check_delay( d ) \ + ((__builtin_constant_p(d < VLC_HARD_MIN_SLEEP) \ + && (d < VLC_HARD_MIN_SLEEP)) \ + ? impossible_delay(d) \ + : ((__builtin_constant_p(d < VLC_SOFT_MIN_SLEEP) \ + && (d < VLC_SOFT_MIN_SLEEP)) \ + ? harmful_delay(d) \ + : d)) + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("deadlines can not be constant"))) +mtime_t impossible_deadline( mtime_t deadline ) +{ + return deadline; +} + +# define check_deadline( d ) \ + (__builtin_constant_p(d) ? impossible_deadline(d) : d) +#else +# define check_delay(d) (d) +# define check_deadline(d) (d) +#endif + +VLC_API int vlc_timer_create(vlc_timer_t *, void (*) (void *), void *) VLC_USED; +VLC_API void vlc_timer_destroy(vlc_timer_t); +VLC_API void vlc_timer_schedule(vlc_timer_t, bool, mtime_t, mtime_t); +VLC_API unsigned vlc_timer_getoverrun(vlc_timer_t) VLC_USED; + +VLC_API unsigned vlc_GetCPUCount(void); + +VLC_API int vlc_savecancel(void); +VLC_API void vlc_restorecancel(int state); +VLC_API void vlc_testcancel(void); + +#if defined (LIBVLC_USE_PTHREAD_CLEANUP) +/** + * Registers a new procedure to run if the thread is cancelled (or otherwise + * exits prematurely). Any call to vlc_cleanup_push() must paired with a + * call to either vlc_cleanup_pop() or vlc_cleanup_run(). Branching into or out + * of the block between these two function calls is not allowed (read: it will + * likely crash the whole process). If multiple procedures are registered, + * they are handled in last-in first-out order. + * + * @param routine procedure to call if the thread ends + * @param arg argument for the procedure + */ +# define vlc_cleanup_push( routine, arg ) pthread_cleanup_push (routine, arg) + +/** + * Removes a cleanup procedure that was previously registered with + * vlc_cleanup_push(). + */ +# define vlc_cleanup_pop( ) pthread_cleanup_pop (0) + +/** + * Removes a cleanup procedure that was previously registered with + * vlc_cleanup_push(), and executes it. + */ +# define vlc_cleanup_run( ) pthread_cleanup_pop (1) + +#else +enum +{ + VLC_CLEANUP_PUSH, + VLC_CLEANUP_POP, +}; +typedef struct vlc_cleanup_t vlc_cleanup_t; + +struct vlc_cleanup_t +{ + vlc_cleanup_t *next; + void (*proc) (void *); + void *data; +}; + +/* This macros opens a code block on purpose. This is needed for multiple + * calls within a single function. This also prevent Win32 developers from + * writing code that would break on POSIX (POSIX opens a block as well). */ +# define vlc_cleanup_push( routine, arg ) \ + do { \ + vlc_cleanup_t vlc_cleanup_data = { NULL, routine, arg, }; \ + vlc_control_cancel (VLC_CLEANUP_PUSH, &vlc_cleanup_data) + +# define vlc_cleanup_pop( ) \ + vlc_control_cancel (VLC_CLEANUP_POP); \ + } while (0) + +# define vlc_cleanup_run( ) \ + vlc_control_cancel (VLC_CLEANUP_POP); \ + vlc_cleanup_data.proc (vlc_cleanup_data.data); \ + } while (0) + +#endif /* !LIBVLC_USE_PTHREAD_CLEANUP */ + +#ifndef LIBVLC_USE_PTHREAD_CANCEL +/* poll() with cancellation */ +# ifdef __OS2__ +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + static int (*vlc_poll_os2)(struct pollfd *, unsigned, int) = NULL; + + if (!vlc_poll_os2) + { + HMODULE hmod; + CHAR szFailed[CCHMAXPATH]; + + if (DosLoadModule(szFailed, sizeof(szFailed), "vlccore", &hmod)) + return -1; + + if (DosQueryProcAddr(hmod, 0, "_vlc_poll_os2", (PFN *)&vlc_poll_os2)) + return -1; + } + + return (*vlc_poll_os2)(fds, nfds, timeout); +} +# else +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + int val; + + do + { + int ugly_timeout = ((unsigned)timeout >= 50) ? 50 : timeout; + if (timeout >= 0) + timeout -= ugly_timeout; + + vlc_testcancel (); + val = poll (fds, nfds, ugly_timeout); + } + while (val == 0 && timeout != 0); + + return val; +} +# endif + +# define poll(u,n,t) vlc_poll(u, n, t) + +#endif /* LIBVLC_USE_PTHREAD_CANCEL */ + +static inline void vlc_cleanup_lock (void *lock) +{ + vlc_mutex_unlock ((vlc_mutex_t *)lock); +} +#define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock, lock) + +#ifdef __cplusplus +/** + * Helper C++ class to lock a mutex. + * The mutex is locked when the object is created, and unlocked when the object + * is destroyed. + */ +class vlc_mutex_locker +{ + private: + vlc_mutex_t *lock; + public: + vlc_mutex_locker (vlc_mutex_t *m) : lock (m) + { + vlc_mutex_lock (lock); + } + + ~vlc_mutex_locker (void) + { + vlc_mutex_unlock (lock); + } +}; +#endif + +enum +{ + VLC_AVCODEC_MUTEX = 0, + VLC_GCRYPT_MUTEX, + VLC_XLIB_MUTEX, + VLC_MOSAIC_MUTEX, + VLC_HIGHLIGHT_MUTEX, + VLC_ATOMIC_MUTEX, + /* Insert new entry HERE */ + VLC_MAX_MUTEX +}; + +VLC_API void vlc_global_mutex( unsigned, bool ); +#define vlc_global_lock( n ) vlc_global_mutex( n, true ) +#define vlc_global_unlock( n ) vlc_global_mutex( n, false ) + +#endif /* !_VLC_THREADS_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_tls.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_tls.h new file mode 100644 index 0000000..e9db9cc --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_tls.h @@ -0,0 +1,82 @@ +/***************************************************************************** + * vlc_tls.h: Transport Layer Security API + ***************************************************************************** + * Copyright (C) 2004-2011 Rémi Denis-Courmont + * Copyright (C) 2005-2006 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TLS_H +# define VLC_TLS_H + +/** + * \file + * This file defines Transport Layer Security API (TLS) in vlc + */ + +# include + +typedef struct vlc_tls vlc_tls_t; +typedef struct vlc_tls_sys vlc_tls_sys_t; +typedef struct vlc_tls_creds vlc_tls_creds_t; +typedef struct vlc_tls_creds_sys vlc_tls_creds_sys_t; + +/** TLS session */ +struct vlc_tls +{ + VLC_COMMON_MEMBERS + + vlc_tls_sys_t *sys; + + struct virtual_socket_t sock; + int (*handshake) (vlc_tls_t *, const char *host, const char *service); +}; + +VLC_API vlc_tls_t *vlc_tls_ClientSessionCreate (vlc_tls_creds_t *, int fd, + const char *host, const char *service); +vlc_tls_t *vlc_tls_SessionCreate (vlc_tls_creds_t *, int fd, const char *host); +int vlc_tls_SessionHandshake (vlc_tls_t *, const char *host, const char *serv); +VLC_API void vlc_tls_SessionDelete (vlc_tls_t *); + +/* NOTE: It is assumed that a->sock.p_sys = a */ +# define tls_Send( a, b, c ) (((vlc_tls_t *)a)->sock.pf_send (a, b, c)) + +# define tls_Recv( a, b, c ) (((vlc_tls_t *)a)->sock.pf_recv (a, b, c)) + + +/** TLS credentials (certificate, private and trust settings) */ +struct vlc_tls_creds +{ + VLC_COMMON_MEMBERS + + module_t *module; + vlc_tls_creds_sys_t *sys; + + int (*add_CA) (vlc_tls_creds_t *, const char *path); + int (*add_CRL) (vlc_tls_creds_t *, const char *path); + + int (*open) (vlc_tls_creds_t *, vlc_tls_t *, int fd, const char *host); + void (*close) (vlc_tls_creds_t *, vlc_tls_t *); +}; + +VLC_API vlc_tls_creds_t *vlc_tls_ClientCreate (vlc_object_t *); +vlc_tls_creds_t *vlc_tls_ServerCreate (vlc_object_t *, + const char *cert, const char *key); +VLC_API void vlc_tls_Delete (vlc_tls_creds_t *); +int vlc_tls_ServerAddCA (vlc_tls_creds_t *srv, const char *path); +int vlc_tls_ServerAddCRL (vlc_tls_creds_t *srv, const char *path); + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_url.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_url.h new file mode 100644 index 0000000..f548ef4 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_url.h @@ -0,0 +1,55 @@ +/***************************************************************************** + * vlc_url.h: URL related macros + ***************************************************************************** + * Copyright (C) 2002-2006 VLC authors and VideoLAN + * $Id: 820250f963fbc31ff56ef1e866fe6bd020686ef0 $ + * + * Authors: Christophe Massiot + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_URL_H +# define VLC_URL_H + +/** + * \file + * This file defines functions for manipulating URL in vlc + */ + +VLC_API char *vlc_path2uri (const char *path, const char *scheme) VLC_MALLOC; + +struct vlc_url_t +{ + char *psz_protocol; + char *psz_username; + char *psz_password; + char *psz_host; + unsigned i_port; + char *psz_path; + char *psz_option; + + char *psz_buffer; /* to be freed */ +}; + +VLC_API char * decode_URI_duplicate( const char *psz ) VLC_MALLOC; +VLC_API char * decode_URI( char *psz ); +VLC_API char * encode_URI_component( const char *psz ) VLC_MALLOC; +VLC_API char * make_path( const char *url ) VLC_MALLOC; + +VLC_API void vlc_UrlParse (vlc_url_t *, const char *, unsigned char); +VLC_API void vlc_UrlClean (vlc_url_t *); +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_variables.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_variables.h new file mode 100644 index 0000000..b5b83ab --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_variables.h @@ -0,0 +1,755 @@ +/***************************************************************************** + * vlc_variables.h: variables handling + ***************************************************************************** + * Copyright (C) 2002-2004 VLC authors and VideoLAN + * $Id: 420f0b4d026725d423f32ed510276bd53ffcf207 $ + * + * Authors: Samuel Hocevar + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VARIABLES_H +#define VLC_VARIABLES_H 1 + +/** + * \file + * This file defines functions and structures for dynamic variables in vlc + */ + +/** + * \defgroup variables Variables + * + * Functions for using the object variables in vlc. + * + * Vlc have a very powerful "object variable" infrastructure useful + * for many things. + * + * @{ + */ + +#define VLC_VAR_TYPE 0x00ff +#define VLC_VAR_CLASS 0x00f0 +#define VLC_VAR_FLAGS 0xff00 + +/** + * \defgroup var_type Variable types + * These are the different types a vlc variable can have. + * @{ + */ +#define VLC_VAR_VOID 0x0010 +#define VLC_VAR_BOOL 0x0020 +#define VLC_VAR_INTEGER 0x0030 +#define VLC_VAR_HOTKEY 0x0031 +#define VLC_VAR_STRING 0x0040 +#define VLC_VAR_VARIABLE 0x0044 +#define VLC_VAR_FLOAT 0x0050 +#define VLC_VAR_TIME 0x0060 +#define VLC_VAR_ADDRESS 0x0070 +#define VLC_VAR_COORDS 0x00A0 +/**@}*/ + +/** \defgroup var_flags Additive flags + * These flags are added to the type field of the variable. Most as a result of + * a var_Change() call, but some may be added at creation time + * @{ + */ +#define VLC_VAR_HASCHOICE 0x0100 +#define VLC_VAR_HASMIN 0x0200 +#define VLC_VAR_HASMAX 0x0400 +#define VLC_VAR_HASSTEP 0x0800 + +#define VLC_VAR_ISCOMMAND 0x2000 + +/** Creation flag */ +/* If the variable is not found on the current module + search all parents and finally module config until found */ +#define VLC_VAR_DOINHERIT 0x8000 +/**@}*/ + +/** + * \defgroup var_action Variable actions + * These are the different actions that can be used with var_Change(). + * The parameters given are the meaning of the two last parameters of + * var_Change() when this action is being used. + * @{ + */ + +/** + * Set the minimum value of this variable + * \param p_val The new minimum value + * \param p_val2 Unused + */ +#define VLC_VAR_SETMIN 0x0010 +/** + * Set the maximum value of this variable + * \param p_val The new maximum value + * \param p_val2 Unused + */ +#define VLC_VAR_SETMAX 0x0011 +#define VLC_VAR_SETSTEP 0x0012 + +/** + * Set the value of this variable without triggering any callbacks + * \param p_val The new value + * \param p_val2 Unused + */ +#define VLC_VAR_SETVALUE 0x0013 + +#define VLC_VAR_SETTEXT 0x0014 +#define VLC_VAR_GETTEXT 0x0015 + +#define VLC_VAR_GETMIN 0x0016 +#define VLC_VAR_GETMAX 0x0017 +#define VLC_VAR_GETSTEP 0x0018 + +#define VLC_VAR_ADDCHOICE 0x0020 +#define VLC_VAR_DELCHOICE 0x0021 +#define VLC_VAR_CLEARCHOICES 0x0022 +#define VLC_VAR_SETDEFAULT 0x0023 +#define VLC_VAR_GETCHOICES 0x0024 +#define VLC_VAR_GETLIST 0x0025 +#define VLC_VAR_CHOICESCOUNT 0x0026 + +/**@}*/ + +/** \defgroup var_GetAndSet Variable actions + * These are the different actions that can be used with var_GetAndSet() + * @{ + */ +enum { + VLC_VAR_BOOL_TOGGLE, /**< Invert a boolean value (param ignored) */ + VLC_VAR_INTEGER_ADD, /**< Add parameter to an integer value */ + VLC_VAR_INTEGER_OR, /**< Binary OR over an integer bits field */ + VLC_VAR_INTEGER_NAND,/**< Binary NAND over an integer bits field */ +}; +/**@}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API int var_Create( vlc_object_t *, const char *, int ); +#define var_Create(a,b,c) var_Create( VLC_OBJECT(a), b, c ) + +VLC_API int var_Destroy( vlc_object_t *, const char * ); +#define var_Destroy(a,b) var_Destroy( VLC_OBJECT(a), b ) + +VLC_API int var_Change( vlc_object_t *, const char *, int, vlc_value_t *, vlc_value_t * ); +#define var_Change(a,b,c,d,e) var_Change( VLC_OBJECT(a), b, c, d, e ) + +VLC_API int var_Type( vlc_object_t *, const char * ) VLC_USED; +#define var_Type(a,b) var_Type( VLC_OBJECT(a), b ) + +VLC_API int var_Set( vlc_object_t *, const char *, vlc_value_t ); +#define var_Set(a,b,c) var_Set( VLC_OBJECT(a), b, c ) + +VLC_API int var_Get( vlc_object_t *, const char *, vlc_value_t * ); +#define var_Get(a,b,c) var_Get( VLC_OBJECT(a), b, c ) + +VLC_API int var_SetChecked( vlc_object_t *, const char *, int, vlc_value_t ); +#define var_SetChecked(o,n,t,v) var_SetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetChecked( vlc_object_t *, const char *, int, vlc_value_t * ); +#define var_GetChecked(o,n,t,v) var_GetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetAndSet( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API int var_Inherit( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API void var_FreeList( vlc_value_t *, vlc_value_t * ); + + +/***************************************************************************** + * Variable callbacks + ***************************************************************************** + * int MyCallback( vlc_object_t *p_this, + * char const *psz_variable, + * vlc_value_t oldvalue, + * vlc_value_t newvalue, + * void *p_data); + *****************************************************************************/ +VLC_API int var_AddCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API int var_DelCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API int var_TriggerCallback( vlc_object_t *, const char * ); + +#define var_AddCallback(a,b,c,d) var_AddCallback( VLC_OBJECT(a), b, c, d ) +#define var_DelCallback(a,b,c,d) var_DelCallback( VLC_OBJECT(a), b, c, d ) +#define var_TriggerCallback(a,b) var_TriggerCallback( VLC_OBJECT(a), b ) + +/***************************************************************************** + * helpers functions + *****************************************************************************/ + +/** + * Set the value of an integer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param i The new integer value of this variable + */ +static inline int var_SetInteger( vlc_object_t *p_obj, const char *psz_name, + int64_t i ) +{ + vlc_value_t val; + val.i_int = i; + return var_SetChecked( p_obj, psz_name, VLC_VAR_INTEGER, val ); +} + +/** + * Set the value of an boolean variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param b The new boolean value of this variable + */ +static inline int var_SetBool( vlc_object_t *p_obj, const char *psz_name, bool b ) +{ + vlc_value_t val; + val.b_bool = b; + return var_SetChecked( p_obj, psz_name, VLC_VAR_BOOL, val ); +} + +/** + * Set the value of a time variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param i The new time value of this variable + */ +static inline int var_SetTime( vlc_object_t *p_obj, const char *psz_name, int64_t i ) +{ + vlc_value_t val; + val.i_time = i; + return var_SetChecked( p_obj, psz_name, VLC_VAR_TIME, val ); +} + +static inline int var_SetCoords( vlc_object_t *obj, const char *name, + int32_t x, int32_t y ) +{ + vlc_value_t val; + val.coords.x = x; + val.coords.y = y; + return var_SetChecked (obj, name, VLC_VAR_COORDS, val); +} +#define var_SetCoords(o,n,x,y) var_SetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Set the value of a float variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param f The new float value of this variable + */ +static inline int var_SetFloat( vlc_object_t *p_obj, const char *psz_name, float f ) +{ + vlc_value_t val; + val.f_float = f; + return var_SetChecked( p_obj, psz_name, VLC_VAR_FLOAT, val ); +} + +/** + * Set the value of a string variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param psz_string The new string value of this variable + */ +static inline int var_SetString( vlc_object_t *p_obj, const char *psz_name, const char *psz_string ) +{ + vlc_value_t val; + val.psz_string = (char *)psz_string; + return var_SetChecked( p_obj, psz_name, VLC_VAR_STRING, val ); +} + +/** + * Set the value of a pointer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param ptr The new pointer value of this variable + */ +static inline +int var_SetAddress( vlc_object_t *p_obj, const char *psz_name, void *ptr ) +{ + vlc_value_t val; + val.p_address = ptr; + return var_SetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, val ); +} + +#define var_SetInteger(a,b,c) var_SetInteger( VLC_OBJECT(a),b,c) +#define var_SetBool(a,b,c) var_SetBool( VLC_OBJECT(a),b,c) +#define var_SetTime(a,b,c) var_SetTime( VLC_OBJECT(a),b,c) +#define var_SetFloat(a,b,c) var_SetFloat( VLC_OBJECT(a),b,c) +#define var_SetString(a,b,c) var_SetString( VLC_OBJECT(a),b,c) +#define var_SetAddress(o, n, p) var_SetAddress(VLC_OBJECT(o), n, p) + + +/** + * Get an integer value +* + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_GetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_INTEGER, &val ) ) + return val.i_int; + else + return 0; +} + +/** + * Get a boolean value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_GetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.b_bool = false; + + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_BOOL, &val ) ) + return val.b_bool; + else + return false; +} + +/** + * Get a time value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_GetTime( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.i_time = 0L; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_TIME, &val ) ) + return val.i_time; + else + return 0; +} + +static inline void var_GetCoords( vlc_object_t *obj, const char *name, + int32_t *px, int32_t *py ) +{ + vlc_value_t val; + + if (likely(!var_GetChecked (obj, name, VLC_VAR_COORDS, &val))) + { + *px = val.coords.x; + *py = val.coords.y; + } + else + *px = *py = 0; +} +#define var_GetCoords(o,n,x,y) var_GetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Get a float value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_GetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.f_float = 0.0; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_FLOAT, &val ) ) + return val.f_float; + else + return 0.0; +} + +/** + * Get a string value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_GetString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.psz_string = NULL; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + else + return val.psz_string; +} + +VLC_USED VLC_MALLOC +static inline char *var_GetNonEmptyString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + if( val.psz_string && *val.psz_string ) + return val.psz_string; + free( val.psz_string ); + return NULL; +} + +VLC_USED +static inline void *var_GetAddress( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, &val ) ) + return NULL; + else + return val.p_address; +} + +/** + * Increment an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_IncInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = 1; + var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ); + return val.i_int; +} +#define var_IncInteger(a,b) var_IncInteger( VLC_OBJECT(a), b ) + +/** + * Decrement an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_DecInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = -1; + var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ); + return val.i_int; +} +#define var_DecInteger(a,b) var_DecInteger( VLC_OBJECT(a), b ) + +static inline uint64_t var_OrInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + var_GetAndSet( obj, name, VLC_VAR_INTEGER_OR, &val ); + return val.i_int; +} +#define var_OrInteger(a,b,c) var_OrInteger(VLC_OBJECT(a),b,c) + +static inline uint64_t var_NAndInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + var_GetAndSet( obj, name, VLC_VAR_INTEGER_NAND, &val ); + return val.i_int; +} +#define var_NAndInteger(a,b,c) var_NAndInteger(VLC_OBJECT(a),b,c) + +/** + * Create a integer variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a time variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetTime( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT ); + return var_GetTime( p_obj, psz_name ); +} + +/** + * Create a float variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +/** + * Create an address variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline void *var_CreateGetAddress( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT ); + return var_GetAddress( p_obj, psz_name ); +} + +#define var_CreateGetInteger(a,b) var_CreateGetInteger( VLC_OBJECT(a),b) +#define var_CreateGetBool(a,b) var_CreateGetBool( VLC_OBJECT(a),b) +#define var_CreateGetTime(a,b) var_CreateGetTime( VLC_OBJECT(a),b) +#define var_CreateGetFloat(a,b) var_CreateGetFloat( VLC_OBJECT(a),b) +#define var_CreateGetString(a,b) var_CreateGetString( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyString(a,b) var_CreateGetNonEmptyString( VLC_OBJECT(a),b) +#define var_CreateGetAddress(a,b) var_CreateGetAddress( VLC_OBJECT(a),b) + +/** + * Create a integer command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetIntegerCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBoolCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a time command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetTimeCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetTime( p_obj, psz_name ); +} + +/** + * Create a float command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloatCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +#define var_CreateGetIntegerCommand(a,b) var_CreateGetIntegerCommand( VLC_OBJECT(a),b) +#define var_CreateGetBoolCommand(a,b) var_CreateGetBoolCommand( VLC_OBJECT(a),b) +#define var_CreateGetTimeCommand(a,b) var_CreateGetTimeCommand( VLC_OBJECT(a),b) +#define var_CreateGetFloatCommand(a,b) var_CreateGetFloatCommand( VLC_OBJECT(a),b) +#define var_CreateGetStringCommand(a,b) var_CreateGetStringCommand( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyStringCommand(a,b) var_CreateGetNonEmptyStringCommand( VLC_OBJECT(a),b) + +VLC_USED +static inline int var_CountChoices( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t count; + if( var_Change( p_obj, psz_name, VLC_VAR_CHOICESCOUNT, &count, NULL ) ) + return 0; + return count.i_int; +} +#define var_CountChoices(a,b) var_CountChoices( VLC_OBJECT(a),b) + + +static inline bool var_ToggleBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + var_GetAndSet( p_obj, psz_name, VLC_VAR_BOOL_TOGGLE, &val ); + return val.b_bool; +} +#define var_ToggleBool(a,b) var_ToggleBool( VLC_OBJECT(a),b ) + + +VLC_USED +static inline bool var_InheritBool( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_BOOL, &val ) ) + val.b_bool = false; + return val.b_bool; +} +#define var_InheritBool(o, n) var_InheritBool(VLC_OBJECT(o), n) + +VLC_USED +static inline int64_t var_InheritInteger( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_INTEGER, &val ) ) + val.i_int = 0; + return val.i_int; +} +#define var_InheritInteger(o, n) var_InheritInteger(VLC_OBJECT(o), n) + +VLC_USED +static inline float var_InheritFloat( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_FLOAT, &val ) ) + val.f_float = 0.; + return val.f_float; +} +#define var_InheritFloat(o, n) var_InheritFloat(VLC_OBJECT(o), n) + +VLC_USED VLC_MALLOC +static inline char *var_InheritString( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_STRING, &val ) ) + val.psz_string = NULL; + else if( val.psz_string && !*val.psz_string ) + { + free( val.psz_string ); + val.psz_string = NULL; + } + return val.psz_string; +} +#define var_InheritString(o, n) var_InheritString(VLC_OBJECT(o), n) + +VLC_USED +static inline mtime_t var_InheritTime( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_TIME, &val ) ) + val.i_time = 0; + return val.i_time; +} +#define var_InheritTime(o, n) var_InheritTime(VLC_OBJECT(o), n) + +VLC_USED +static inline void *var_InheritAddress( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_ADDRESS, &val ) ) + val.p_address = NULL; + return val.p_address; +} +#define var_InheritAddress(o, n) var_InheritAddress(VLC_OBJECT(o), n) + +VLC_API int var_InheritURational( vlc_object_t *, unsigned *num, unsigned *den, const char *var ); +#define var_InheritURational(a,b,c,d) var_InheritURational(VLC_OBJECT(a), b, c, d) + +#define var_GetInteger(a,b) var_GetInteger( VLC_OBJECT(a),b) +#define var_GetBool(a,b) var_GetBool( VLC_OBJECT(a),b) +#define var_GetTime(a,b) var_GetTime( VLC_OBJECT(a),b) +#define var_GetFloat(a,b) var_GetFloat( VLC_OBJECT(a),b) +#define var_GetString(a,b) var_GetString( VLC_OBJECT(a),b) +#define var_GetNonEmptyString(a,b) var_GetNonEmptyString( VLC_OBJECT(a),b) +#define var_GetAddress(a,b) var_GetAddress( VLC_OBJECT(a),b) + +VLC_API int var_LocationParse(vlc_object_t *, const char *mrl, const char *prefix); +#define var_LocationParse(o, m, p) var_LocationParse(VLC_OBJECT(o), m, p) + +/** + * @} + */ +#endif /* _VLC_VARIABLES_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_video_splitter.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_video_splitter.h new file mode 100644 index 0000000..419a4ca --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_video_splitter.h @@ -0,0 +1,158 @@ +/***************************************************************************** + * vlc_video_splitter.h: "video splitter" related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: eb2bf00f85a3ee2df1c35a90f12da4099a95a463 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VIDEO_SPLITTER_H +#define VLC_VIDEO_SPLITTER_H 1 + +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by video splitter filters. + */ + +typedef struct video_splitter_t video_splitter_t; +typedef struct video_splitter_sys_t video_splitter_sys_t; +typedef struct video_splitter_owner_t video_splitter_owner_t; + +/** Structure describing a video splitter output properties + */ +typedef struct +{ + /* Video format of the output */ + video_format_t fmt; + + /* Window hints */ + struct + { + /* Relative position. + * (0,0) is equal to the default position. + */ + int i_x; + int i_y; + + /* Alignment inside the window + */ + int i_align; + } window; + + /* Video output module + * Use NULL for default + */ + char *psz_module; + +} video_splitter_output_t; + +/** Structure describing a video splitter + */ +struct video_splitter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* configuration */ + config_chain_t *p_cfg; + + /* Input format + * It is filled by the creator and cannot be modified. + */ + video_format_t fmt; + + /* Output formats + * + * It can only be set in the open() function and must remain + * constant. + * The module is responsible for the allocation and deallocation. + */ + int i_output; + video_splitter_output_t *p_output; + + int (*pf_filter)( video_splitter_t *, picture_t *pp_dst[], + picture_t *p_src ); + int (*pf_mouse) ( video_splitter_t *, vlc_mouse_t *, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ); + + video_splitter_sys_t *p_sys; + + /* Buffer allocation */ + int (*pf_picture_new) ( video_splitter_t *, picture_t *pp_picture[] ); + void (*pf_picture_del) ( video_splitter_t *, picture_t *pp_picture[] ); + video_splitter_owner_t *p_owner; +}; + +/** + * It will create an array of pictures suitable as output. + * + * You must either returned them through pf_filter or by calling + * video_splitter_DeletePicture. + * + * If VLC_SUCCESS is not returned, pp_picture values are undefined. + */ +static inline int video_splitter_NewPicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + int i_ret = p_splitter->pf_picture_new( p_splitter, pp_picture ); + if( i_ret ) + msg_Warn( p_splitter, "can't get output pictures" ); + return i_ret; +} + +/** + * It will release an array of pictures created by video_splitter_NewPicture. + * Provided for convenience. + */ +static inline void video_splitter_DeletePicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + p_splitter->pf_picture_del( p_splitter, pp_picture ); +} + +/* */ +VLC_API video_splitter_t * video_splitter_New( vlc_object_t *, const char *psz_name, const video_format_t * ); +VLC_API void video_splitter_Delete( video_splitter_t * ); + +static inline int video_splitter_Filter( video_splitter_t *p_splitter, + picture_t *pp_dst[], picture_t *p_src ) +{ + return p_splitter->pf_filter( p_splitter, pp_dst, p_src ); +} +static inline int video_splitter_Mouse( video_splitter_t *p_splitter, + vlc_mouse_t *p_mouse, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ) +{ + if( !p_splitter->pf_mouse ) + { + *p_mouse = *p_new; + return VLC_SUCCESS; + } + return p_splitter->pf_mouse( p_splitter, p_mouse, i_index, p_old, p_new ); +} + +#endif /* VLC_VIDEO_SPLITTER_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_vlm.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_vlm.h new file mode 100644 index 0000000..58680b6 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_vlm.h @@ -0,0 +1,369 @@ +/***************************************************************************** + * vlc_vlm.h: VLM core structures + ***************************************************************************** + * Copyright (C) 2000, 2001 VLC authors and VideoLAN + * $Id: 11111da6edb9fbecaa750af4c2851a5f0c338f0b $ + * + * Authors: Simon Latapie + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VLM_H +#define VLC_VLM_H 1 + +/** + * \file + * This file defines VLM core functions and structures in vlc + */ + +#include + +/** + * \defgroup server VLM + * VLM is the server core in vlc that allows streaming of multiple media streams + * at the same time. It provides broadcast, schedule and video on demand features + * for streaming using several streaming and network protocols. + * @{ + */ + +/** VLM media */ +typedef struct +{ + int64_t id; /*< numeric id for vlm_media_t item */ + bool b_enabled; /*< vlm_media_t is enabled */ + + char *psz_name; /*< descriptive name of vlm_media_t item */ + + int i_input; /*< number of input options */ + char **ppsz_input; /*< array of input options */ + + int i_option; /*< number of output options */ + char **ppsz_option; /*< array of output options */ + + char *psz_output; /*< */ + + bool b_vod; /*< vlm_media_t is of type VOD */ + struct + { + bool b_loop; /*< this vlc_media_t broadcast item should loop */ + } broadcast; /*< Broadcast specific information */ + struct + { + char *psz_mux; /*< name of muxer to use */ + } vod; /*< VOD specific information */ + +} vlm_media_t; + +/** VLM media instance */ +typedef struct +{ + char *psz_name; /*< vlm media instance descriptive name */ + + int64_t i_time; /*< vlm media instance vlm media current time */ + int64_t i_length; /*< vlm media instance vlm media item length */ + double d_position; /*< vlm media instance position in stream */ + bool b_paused; /*< vlm media instance is paused */ + int i_rate; // normal is INPUT_RATE_DEFAULT +} vlm_media_instance_t; + +#if 0 +typedef struct +{ + +} vlm_schedule_t +#endif + +/** VLM events + * You can catch vlm event by adding a callback on the variable "intf-event" + * of the VLM object. + * This variable is an address that will hold a vlm_event_t* value. + */ +enum vlm_event_type_e +{ + /* */ + VLM_EVENT_MEDIA_ADDED = 0x100, + VLM_EVENT_MEDIA_REMOVED, + VLM_EVENT_MEDIA_CHANGED, + + /* */ + VLM_EVENT_MEDIA_INSTANCE_STARTED = 0x200, + VLM_EVENT_MEDIA_INSTANCE_STOPPED, + VLM_EVENT_MEDIA_INSTANCE_STATE, +}; + +typedef struct +{ + int i_type; /* a vlm_event_type_e value */ + int64_t id; /* Media ID */ + const char *psz_name; /* Media name */ + const char *psz_instance_name; /* Instance name or NULL */ + input_state_e input_state; /* Input instance event type */ +} vlm_event_t; + +/** VLM control query */ +enum vlm_query_e +{ + /* --- Media control */ + /* Get all medias */ + VLM_GET_MEDIAS, /* arg1=vlm_media_t ***, int *pi_media */ + /* Delete all medias */ + VLM_CLEAR_MEDIAS, /* no arg */ + + /* Add a new media */ + VLM_ADD_MEDIA, /* arg1=vlm_media_t* arg2=int64_t *p_id res=can fail */ + /* Delete an existing media */ + VLM_DEL_MEDIA, /* arg1=int64_t id */ + /* Change properties of an existing media (all fields but id and b_vod) */ + VLM_CHANGE_MEDIA, /* arg1=vlm_media_t* res=can fail */ + /* Get 1 media by it's ID */ + VLM_GET_MEDIA, /* arg1=int64_t id arg2=vlm_media_t ** */ + /* Get media ID from its name */ + VLM_GET_MEDIA_ID, /* arg1=const char *psz_name arg2=int64_t* */ + + /* Media instance control XXX VOD control are for internal use only */ + /* Get all media instances */ + VLM_GET_MEDIA_INSTANCES, /* arg1=int64_t id arg2=vlm_media_instance_t *** arg3=int *pi_instance */ + /* Delete all media instances */ + VLM_CLEAR_MEDIA_INSTANCES, /* arg1=int64_t id */ + /* Control broadcast instance */ + VLM_START_MEDIA_BROADCAST_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index res=can fail */ + /* Control VOD instance */ + VLM_START_MEDIA_VOD_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index char *psz_vod_output res=can fail */ + /* Stop an instance */ + VLM_STOP_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Pause an instance */ + VLM_PAUSE_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Get instance position time (in microsecond) */ + VLM_GET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t * */ + /* Set instance position time (in microsecond) */ + VLM_SET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t */ + /* Get instance position ([0.0 .. 1.0]) */ + VLM_GET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double * */ + /* Set instance position ([0.0 .. 1.0]) */ + VLM_SET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double */ + + /* Schedule control */ + VLM_CLEAR_SCHEDULES, /* no arg */ + /* TODO: missing schedule control */ + + /* */ +}; + + +/* VLM specific - structures and functions */ + +/* ok, here is the structure of a vlm_message: + The parent node is ( name_of_the_command , NULL ), or + ( name_of_the_command , message_error ) on error. + If a node has children, it should not have a value (=NULL).*/ +struct vlm_message_t +{ + char *psz_name; /*< message name */ + char *psz_value; /*< message value */ + + int i_child; /*< number of child messages */ + vlm_message_t **child; /*< array of vlm_message_t */ +}; + + +#ifdef __cplusplus +extern "C" { +#endif + +VLC_API vlm_t * vlm_New( vlc_object_t * ); +#define vlm_New( a ) vlm_New( VLC_OBJECT(a) ) +VLC_API void vlm_Delete( vlm_t * ); +VLC_API int vlm_ExecuteCommand( vlm_t *, const char *, vlm_message_t ** ); +VLC_API int vlm_Control( vlm_t *p_vlm, int i_query, ... ); + +VLC_API vlm_message_t * vlm_MessageSimpleNew( const char * ); +VLC_API vlm_message_t * vlm_MessageNew( const char *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API vlm_message_t * vlm_MessageAdd( vlm_message_t *, vlm_message_t * ); +VLC_API void vlm_MessageDelete( vlm_message_t * ); + +/* media helpers */ + +/** + * Initialize a vlm_media_t instance + * \param p_media vlm_media_t instance to initialize + */ +static inline void vlm_media_Init( vlm_media_t *p_media ) +{ + memset( p_media, 0, sizeof(vlm_media_t) ); + p_media->id = 0; // invalid id + p_media->psz_name = NULL; + TAB_INIT( p_media->i_input, p_media->ppsz_input ); + TAB_INIT( p_media->i_option, p_media->ppsz_option ); + p_media->psz_output = NULL; + p_media->b_vod = false; + + p_media->vod.psz_mux = NULL; + p_media->broadcast.b_loop = false; +} + +/** + * Copy a vlm_media_t instance into another vlm_media_t instance + * \param p_dst vlm_media_t instance to copy to + * \param p_src vlm_media_t instance to copy from + */ +static inline void +#ifndef __cplusplus +vlm_media_Copy( vlm_media_t *restrict p_dst, const vlm_media_t *restrict p_src ) +#else +vlm_media_Copy( vlm_media_t *p_dst, const vlm_media_t *p_src ) +#endif +{ + int i; + + memset( p_dst, 0, sizeof(vlm_media_t) ); + p_dst->id = p_src->id; + p_dst->b_enabled = p_src->b_enabled; + if( p_src->psz_name ) + p_dst->psz_name = strdup( p_src->psz_name ); + + for( i = 0; i < p_src->i_input; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_input, p_dst->ppsz_input, strdup(p_src->ppsz_input[i]) ); + for( i = 0; i < p_src->i_option; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_option, p_dst->ppsz_option, strdup(p_src->ppsz_option[i]) ); + + if( p_src->psz_output ) + p_dst->psz_output = strdup( p_src->psz_output ); + + p_dst->b_vod = p_src->b_vod; + if( p_src->b_vod ) + { + if( p_src->vod.psz_mux ) + p_dst->vod.psz_mux = strdup( p_src->vod.psz_mux ); + } + else + { + p_dst->broadcast.b_loop = p_src->broadcast.b_loop; + } +} + +/** + * Cleanup and release memory associated with this vlm_media_t instance. + * You still need to release p_media itself with vlm_media_Delete(). + * \param p_media vlm_media_t to cleanup + */ +static inline void vlm_media_Clean( vlm_media_t *p_media ) +{ + int i; + free( p_media->psz_name ); + + for( i = 0; i < p_media->i_input; i++ ) + free( p_media->ppsz_input[i]); + TAB_CLEAN(p_media->i_input, p_media->ppsz_input ); + + for( i = 0; i < p_media->i_option; i++ ) + free( p_media->ppsz_option[i]); + TAB_CLEAN(p_media->i_option, p_media->ppsz_option ); + + free( p_media->psz_output ); + if( p_media->b_vod ) + free( p_media->vod.psz_mux ); +} + +/** + * Allocate a new vlm_media_t instance + * \return vlm_media_t instance + */ +static inline vlm_media_t *vlm_media_New(void) +{ + vlm_media_t *p_media = (vlm_media_t *)malloc( sizeof(vlm_media_t) ); + if( p_media ) + vlm_media_Init( p_media ); + return p_media; +} + +/** + * Delete a vlm_media_t instance + * \param p_media vlm_media_t instance to delete + */ +static inline void vlm_media_Delete( vlm_media_t *p_media ) +{ + vlm_media_Clean( p_media ); + free( p_media ); +} + +/** + * Copy a vlm_media_t instance + * \param p_src vlm_media_t instance to copy + * \return vlm_media_t duplicate of p_src + */ +static inline vlm_media_t *vlm_media_Duplicate( vlm_media_t *p_src ) +{ + vlm_media_t *p_dst = vlm_media_New(); + if( p_dst ) + vlm_media_Copy( p_dst, p_src ); + return p_dst; +} + +/* media instance helpers */ +/** + * Initialize vlm_media_instance_t + * \param p_instance vlm_media_instance_t to initialize + */ +static inline void vlm_media_instance_Init( vlm_media_instance_t *p_instance ) +{ + memset( p_instance, 0, sizeof(vlm_media_instance_t) ); + p_instance->psz_name = NULL; + p_instance->i_time = 0; + p_instance->i_length = 0; + p_instance->d_position = 0.0; + p_instance->b_paused = false; + p_instance->i_rate = INPUT_RATE_DEFAULT; +} + +/** + * Cleanup vlm_media_instance_t + * \param p_instance vlm_media_instance_t to cleanup + */ +static inline void vlm_media_instance_Clean( vlm_media_instance_t *p_instance ) +{ + free( p_instance->psz_name ); +} + +/** + * Allocate a new vlm_media_instance_t + * \return a new vlm_media_instance_t + */ +static inline vlm_media_instance_t *vlm_media_instance_New(void) +{ + vlm_media_instance_t *p_instance = (vlm_media_instance_t *) malloc( sizeof(vlm_media_instance_t) ); + if( p_instance ) + vlm_media_instance_Init( p_instance ); + return p_instance; +} + +/** + * Delete a vlm_media_instance_t + * \param p_instance vlm_media_instance_t to delete + */ +static inline void vlm_media_instance_Delete( vlm_media_instance_t *p_instance ) +{ + vlm_media_instance_Clean( p_instance ); + free( p_instance ); +} + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_vout.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout.h new file mode 100644 index 0000000..2ff13aa --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_vout.h: common video definitions + ***************************************************************************** + * Copyright (C) 1999 - 2008 VLC authors and VideoLAN + * $Id: b39e49b564e8367df07a2a85ee8bddfac6b548c4 $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_H_ +#define VLC_VOUT_H_ 1 + +/** + * \file + * This file defines common video output structures and functions in vlc + */ + +#include +#include +#include + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * \defgroup video_output Video Output + * This module describes the programming interface for video output threads. + * It includes functions allowing to open a new thread, send pictures to a + * thread, and destroy a previously opened video output thread. + * @{ + */ + +/** + * Vout configuration + */ +typedef struct { + vout_thread_t *vout; + vlc_object_t *input; + bool change_fmt; + const video_format_t *fmt; + unsigned dpb_size; +} vout_configuration_t; + +/** + * Video output thread private structure + */ +typedef struct vout_thread_sys_t vout_thread_sys_t; + +/** + * Video output thread descriptor + * + * Any independent video output device, such as an X11 window or a GGI device, + * is represented by a video output thread, and described using the following + * structure. + */ +struct vout_thread_t { + VLC_COMMON_MEMBERS + + /* Private vout_thread data */ + vout_thread_sys_t *p; +}; + +/* Alignment flags */ +#define VOUT_ALIGN_LEFT 0x0001 +#define VOUT_ALIGN_RIGHT 0x0002 +#define VOUT_ALIGN_HMASK 0x0003 +#define VOUT_ALIGN_TOP 0x0004 +#define VOUT_ALIGN_BOTTOM 0x0008 +#define VOUT_ALIGN_VMASK 0x000C + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * Returns a suitable vout or release the given one. + * + * If cfg->fmt is non NULL and valid, a vout will be returned, reusing cfg->vout + * is possible, otherwise it returns NULL. + * If cfg->vout is not used, it will be closed and released. + * + * You can release the returned value either by vout_Request or vout_Close() + * followed by a vlc_object_release() or shorter vout_CloseAndRelease() + * + * \param object a vlc object + * \param cfg the video configuration requested. + * \return a vout + */ +VLC_API vout_thread_t * vout_Request( vlc_object_t *object, const vout_configuration_t *cfg ); +#define vout_Request(a,b) vout_Request(VLC_OBJECT(a),b) + +/** + * This function will close a vout created by vout_Request. + * The associated vout module is closed. + * Note: It is not released yet, you'll have to call vlc_object_release() + * or use the convenient vout_CloseAndRelease(). + * + * \param p_vout the vout to close + */ +VLC_API void vout_Close( vout_thread_t *p_vout ); + +/** + * This function will close a vout created by vout_Create + * and then release it. + * + * \param p_vout the vout to close and release + */ +static inline void vout_CloseAndRelease( vout_thread_t *p_vout ) +{ + vout_Close( p_vout ); + vlc_object_release( p_vout ); +} + +/** + * This function will handle a snapshot request. + * + * pp_image, pp_picture and p_fmt can be NULL otherwise they will be + * set with returned value in case of success. + * + * pp_image will hold an encoded picture in psz_format format. + * + * i_timeout specifies the time the function will wait for a snapshot to be + * available. + * + */ +VLC_API int vout_GetSnapshot( vout_thread_t *p_vout, + block_t **pp_image, picture_t **pp_picture, + video_format_t *p_fmt, + const char *psz_format, mtime_t i_timeout ); + +VLC_API void vout_ChangeAspectRatio( vout_thread_t *p_vout, + unsigned int i_num, unsigned int i_den ); + +/* */ +VLC_API picture_t * vout_GetPicture( vout_thread_t * ); +VLC_API void vout_PutPicture( vout_thread_t *, picture_t * ); + +VLC_API void vout_HoldPicture( vout_thread_t *, picture_t * ); +VLC_API void vout_ReleasePicture( vout_thread_t *, picture_t * ); + +/* */ +VLC_API void vout_PutSubpicture( vout_thread_t *, subpicture_t * ); +VLC_API int vout_RegisterSubpictureChannel( vout_thread_t * ); +VLC_API void vout_FlushSubpictureChannel( vout_thread_t *, int ); + +VLC_API void vout_EnableFilter( vout_thread_t *, const char *,bool , bool ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_display.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_display.h new file mode 100644 index 0000000..8142b91 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_display.h @@ -0,0 +1,453 @@ +/***************************************************************************** + * vlc_vout_display.h: vout_display_t definitions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: f5f68177a4b543fcd986363dc2563dbce0f81298 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_DISPLAY_H +#define VLC_VOUT_DISPLAY_H 1 + +/** + * \file + * This file defines vout display structures and functions in vlc + */ + +#include +#include +#include +#include +#include +#include +#include + +/* XXX + * Do NOT use video_format_t::i_aspect but i_sar_num/den everywhere. i_aspect + * will be removed as soon as possible. + * + */ +typedef struct vout_display_t vout_display_t; +typedef struct vout_display_sys_t vout_display_sys_t; +typedef struct vout_display_owner_t vout_display_owner_t; +typedef struct vout_display_owner_sys_t vout_display_owner_sys_t; + +/** + * Possible alignments for vout_display. + */ +typedef enum +{ + VOUT_DISPLAY_ALIGN_CENTER, + /* */ + VOUT_DISPLAY_ALIGN_LEFT, + VOUT_DISPLAY_ALIGN_RIGHT, + /* */ + VOUT_DISPLAY_ALIGN_TOP, + VOUT_DISPLAY_ALIGN_BOTTOM, +} vout_display_align_t; + +/** + * Window management state. + */ +enum { + VOUT_WINDOW_STATE_NORMAL=0, + VOUT_WINDOW_STATE_ABOVE=1, + VOUT_WINDOW_STATE_BELOW=2, + VOUT_WINDOW_STACK_MASK=3, +}; + +/** + * Initial/Current configuration for a vout_display_t + */ +typedef struct { + bool is_fullscreen; /* Is the display fullscreen */ + + /* Display properties */ + struct { + /* Window title (may be NULL) */ + const char *title; + + /* Display size */ + unsigned width; + unsigned height; + + /* Display SAR */ + struct { + unsigned num; + unsigned den; + } sar; + } display; + + /* Alignment of the picture inside the display */ + struct { + int horizontal; + int vertical; + } align; + + /* Do we fill up the display with the video */ + bool is_display_filled; + + /* Zoom to use + * It will be applied to the whole display if b_display_filled is set, otherwise + * only on the video source */ + struct { + int num; + int den; + } zoom; + +} vout_display_cfg_t; + +/** + * Information from a vout_display_t to configure + * the core behaviour. + * + * By default they are all false or NULL. + * + */ +typedef struct { + bool is_slow; /* The picture memory has slow read/write */ + bool has_double_click; /* Is double-click generated */ + bool has_hide_mouse; /* Is mouse automatically hidden */ + bool has_pictures_invalid; /* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */ + bool has_event_thread; /* Will events (key at least) be emitted using an independent thread */ + const vlc_fourcc_t *subpicture_chromas; /* List of supported chromas for subpicture rendering. */ +} vout_display_info_t; + +/** + * Control query for vout_display_t + */ +enum { + /* Hide the mouse. It will be sent when + * vout_display_t::info.b_hide_mouse is false */ + VOUT_DISPLAY_HIDE_MOUSE, + + /* Ask to reset the internal buffers after a VOUT_DISPLAY_EVENT_PICTURES_INVALID + * request. + */ + VOUT_DISPLAY_RESET_PICTURES, + + /* Ask the module to acknowledge/refuse the fullscreen state change after + * being requested (externally or by VOUT_DISPLAY_EVENT_FULLSCREEN */ + VOUT_DISPLAY_CHANGE_FULLSCREEN, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse the window management state change + * after being requested externally or by VOUT_DISPLAY_WINDOW_STATE */ + VOUT_DISPLAY_CHANGE_WINDOW_STATE, /* unsigned state */ + + /* Ask the module to acknowledge/refuse the display size change requested + * (externally or by VOUT_DISPLAY_EVENT_DISPLAY_SIZE) */ + VOUT_DISPLAY_CHANGE_DISPLAY_SIZE, /* const vout_display_cfg_t *p_cfg, int is_forced */ + + /* Ask the module to acknowledge/refuse fill display state change after + * being requested externally */ + VOUT_DISPLAY_CHANGE_DISPLAY_FILLED, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse zoom change after being requested + * externally */ + VOUT_DISPLAY_CHANGE_ZOOM, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse source aspect ratio after being + * requested externally */ + VOUT_DISPLAY_CHANGE_SOURCE_ASPECT, /* const video_format_t *p_source */ + + /* Ask the module to acknowledge/refuse source crop change after being + * requested externally. + * The cropping requested is stored by video_format_t::i_x/y_offset and + * video_format_t::i_visible_width/height */ + VOUT_DISPLAY_CHANGE_SOURCE_CROP, /* const video_format_t *p_source */ + + /* Ask an opengl interface if available. */ + VOUT_DISPLAY_GET_OPENGL, /* vlc_gl_t ** */ +}; + +/** + * Event from vout_display_t + * + * Events modifiying the state may be sent multiple times. + * Only the transition will be retained and acted upon. + */ +enum { + /* TODO: + * ZOOM ? DISPLAY_FILLED ? ON_TOP ? + */ + /* */ + VOUT_DISPLAY_EVENT_PICTURES_INVALID, /* The buffer are now invalid and need to be changed */ + + VOUT_DISPLAY_EVENT_FULLSCREEN, + VOUT_DISPLAY_EVENT_WINDOW_STATE, + + VOUT_DISPLAY_EVENT_DISPLAY_SIZE, /* The display size need to change : int i_width, int i_height, bool is_fullscreen */ + + /* */ + VOUT_DISPLAY_EVENT_CLOSE, + VOUT_DISPLAY_EVENT_KEY, + + /* Full mouse state. + * You can use it OR use the other mouse events. The core will do + * the conversion. + */ + VOUT_DISPLAY_EVENT_MOUSE_STATE, + + /* Mouse event */ + VOUT_DISPLAY_EVENT_MOUSE_MOVED, + VOUT_DISPLAY_EVENT_MOUSE_PRESSED, + VOUT_DISPLAY_EVENT_MOUSE_RELEASED, + VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK, +}; + +/** + * Vout owner structures + */ +struct vout_display_owner_t { + /* Private place holder for the vout_display_t creator + */ + vout_display_owner_sys_t *sys; + + /* Event coming from the module + * + * This function is set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_SendEvent* + * wrapper. + * + * You can send it at any time i.e. from any vout_display_t functions or + * from another thread. + * Be careful, it does not ensure correct serialization if it is used + * from multiple threads. + */ + void (*event)(vout_display_t *, int, va_list); + + /* Window management + * + * These functions are set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_*Window + * wrapper */ + vout_window_t *(*window_new)(vout_display_t *, const vout_window_cfg_t *); + void (*window_del)(vout_display_t *, vout_window_t *); +}; + +struct vout_display_t { + VLC_COMMON_MEMBERS + + /* Module */ + module_t *module; + + /* Initial and current configuration. + * You cannot modify it directly, you must use the appropriate events. + * + * It reflects the current values, i.e. after the event has been accepted + * and applied/configured if needed. + */ + const vout_display_cfg_t *cfg; + + /* video source format. + * + * Cropping is not requested while in the open function. + * You cannot change it. + */ + video_format_t source; + + /* picture_t format. + * + * You can only change it inside the module open function to + * match what you want, and when a VOUT_DISPLAY_RESET_PICTURES control + * request is made and succeeds. + * + * By default, it is equal to ::source except for the aspect ratio + * which is undefined(0) and is ignored. + */ + video_format_t fmt; + + /* Information + * + * You can only set them in the open function. + */ + vout_display_info_t info; + + /* Return a pointer over the current picture_pool_t* (mandatory). + * + * For performance reasons, it is best to provide at least count + * pictures but it is not mandatory. + * You can return NULL when you cannot/do not want to allocate + * pictures. + * The vout display module keeps the ownership of the pool and can + * destroy it only when closing or on invalid pictures control. + */ + picture_pool_t *(*pool)(vout_display_t *, unsigned count); + + /* Prepare a picture and an optional subpicture for display (optional). + * + * It is called before the next pf_display call to provide as much + * time as possible to prepare the given picture and the subpicture + * for display. + * You are guaranted that pf_display will always be called and using + * the exact same picture_t and subpicture_t. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + */ + void (*prepare)(vout_display_t *, picture_t *, subpicture_t *); + + /* Display a picture and an optional subpicture (mandatory). + * + * The picture and the optional subpicture must be displayed as soon as + * possible. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + * + * This function gives away the ownership of the picture and of the + * subpicture, so you must release them as soon as possible. + */ + void (*display)(vout_display_t *, picture_t *, subpicture_t *); + + /* Control on the module (mandatory) */ + int (*control)(vout_display_t *, int, va_list); + + /* Manage pending event (optional) */ + void (*manage)(vout_display_t *); + + /* Private place holder for the vout_display_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_display_sys_t *sys; + + /* Reserved for the vout_display_t owner. + * + * It must not be overwritten nor used directly by a module. + */ + vout_display_owner_t owner; +}; + +static inline void vout_display_SendEvent(vout_display_t *vd, int query, ...) +{ + va_list args; + va_start(args, query); + vd->owner.event(vd, query, args); + va_end(args); +} + +static inline void vout_display_SendEventDisplaySize(vout_display_t *vd, int width, int height, bool is_fullscreen) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_DISPLAY_SIZE, width, height, is_fullscreen); +} +static inline void vout_display_SendEventPicturesInvalid(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_PICTURES_INVALID); +} +static inline void vout_display_SendEventClose(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_CLOSE); +} +static inline void vout_display_SendEventKey(vout_display_t *vd, int key) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_KEY, key); +} +static inline void vout_display_SendEventFullscreen(vout_display_t *vd, bool is_fullscreen) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_FULLSCREEN, is_fullscreen); +} +static inline void vout_display_SendWindowState(vout_display_t *vd, unsigned state) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_WINDOW_STATE, state); +} +/* The mouse position (State and Moved event) must be expressed against vout_display_t::source unit */ +static inline void vout_display_SendEventMouseState(vout_display_t *vd, int x, int y, int button_mask) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_STATE, x, y, button_mask); +} +static inline void vout_display_SendEventMouseMoved(vout_display_t *vd, int x, int y) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_MOVED, x, y); +} +static inline void vout_display_SendEventMousePressed(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_PRESSED, button); +} +static inline void vout_display_SendEventMouseReleased(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_RELEASED, button); +} +static inline void vout_display_SendEventMouseDoubleClick(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK); +} + +/** + * Asks for a new window with the given configuration as hint. + * + * b_standalone/i_x/i_y may be overwritten by the core + */ +static inline vout_window_t *vout_display_NewWindow(vout_display_t *vd, const vout_window_cfg_t *cfg) +{ + return vd->owner.window_new(vd, cfg); +} +/** + * Deletes a window created by vout_display_NewWindow if window is non NULL + * or any unused windows otherwise. + */ +static inline void vout_display_DeleteWindow(vout_display_t *vd, + vout_window_t *window) +{ + vd->owner.window_del(vd, window); +} + +/** + * Computes the default display size given the source and + * the display configuration. + * + * This asssumes that the picture is already cropped. + */ +VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height, const video_format_t *source, const vout_display_cfg_t *); + + +/** + * Structure used to store the result of a vout_display_PlacePicture. + */ +typedef struct { + int x; + int y; + unsigned width; + unsigned height; +} vout_display_place_t; + +/** + * Computes how to place a picture inside the display to respect + * the given parameters. + * This assumes that cropping is done by an external mean. + * + * \param p_place Place inside the window (window pixel unit) + * \param p_source Video source format + * \param p_cfg Display configuration + * \param b_clip If true, prevent the video to go outside the display (break zoom). + */ +VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping); + + +/** + * Helper function that applies the necessary transforms to the mouse position + * and then calls vout_display_SendEventMouseMoved. + * + * \param vd vout_display_t. + * \param orient_display The orientation of the picture as seen on screen (probably ORIENT_NORMAL). + * \param m_x Mouse x position (relative to place, origin is top left). + * \param m_y Mouse y position (relative to place, origin is top left). + * \param place Place of the picture. + */ +VLC_API void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y, + vout_display_place_t *place); +#endif /* VLC_VOUT_DISPLAY_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_osd.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_osd.h new file mode 100644 index 0000000..8b2b27d --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_osd.h @@ -0,0 +1,98 @@ +/***************************************************************************** + * vlc_vout_osd.h: vout OSD + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2004-2005 M2X + * $Id: 74d79379258cf0af1cdafcd45946c7b4cf23b01f $ + * + * Authors: Jean-Paul Saman + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_OSD_H +#define VLC_VOUT_OSD_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * OSD menu position and picture type defines + */ +enum +{ + /* Icons */ + OSD_PLAY_ICON = 1, + OSD_PAUSE_ICON, + OSD_SPEAKER_ICON, + OSD_MUTE_ICON, + /* Sliders */ + OSD_HOR_SLIDER, + OSD_VERT_SLIDER, +}; + +/********************************************************************** + * Vout text and widget overlays + **********************************************************************/ +VLC_API int vout_OSDEpg( vout_thread_t *, input_item_t * ); + +/** + * \brief Write an informative message if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param position Position of the text + * \param duration Duration of the text being displayed + * \param text Text to be displayed + */ +VLC_API void vout_OSDText( vout_thread_t *vout, int channel, int position, mtime_t duration, const char *text ); + +/** + * \brief Write an informative message at the default location, + * for the default duration and only if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param format printf style formatting + * + * Provided for convenience. + */ +VLC_API void vout_OSDMessage( vout_thread_t *, int, const char *, ... ) VLC_FORMAT( 3, 4 ); + +/** + * Display a slider on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_postion Current position in the slider + * \param i_type Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER. + */ +VLC_API void vout_OSDSlider( vout_thread_t *, int, int , short ); + +/** + * Display an Icon on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_type Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON + */ +VLC_API void vout_OSDIcon( vout_thread_t *, int, short ); + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_VOUT_OSD_H */ + diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_window.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_window.h new file mode 100644 index 0000000..85dd6d0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_vout_window.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_vout_window.h: vout_window_t definitions + ***************************************************************************** + * Copyright (C) 2008 Rémi Denis-Courmont + * Copyright (C) 2009 Laurent Aimar + * $Id: ed7d42c89657225e42bcf8dab18a61710f41d635 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_WINDOW_H +#define VLC_VOUT_WINDOW_H 1 + +/** + * \file + * This file defines vout windows structures and functions in vlc + */ + +#include + +/* */ +typedef struct vout_window_t vout_window_t; +typedef struct vout_window_sys_t vout_window_sys_t; + + +/** + * Window handle type + */ +enum { + VOUT_WINDOW_TYPE_INVALID=0, + VOUT_WINDOW_TYPE_XID, + VOUT_WINDOW_TYPE_HWND, + VOUT_WINDOW_TYPE_NSOBJECT, + VOUT_WINDOW_TYPE_ANDROID_NATIVE, +}; + +/** + * Control query for vout_window_t + */ +enum { + VOUT_WINDOW_SET_STATE, /* unsigned state */ + VOUT_WINDOW_SET_SIZE, /* unsigned i_width, unsigned i_height */ + VOUT_WINDOW_SET_FULLSCREEN, /* int b_fullscreen */ +}; + +typedef struct { + /* If true, a standalone window is requested */ + bool is_standalone; + + /* Window handle type */ + unsigned type; + + /* Window position hint */ + int x; + int y; + + /* Windows size hint */ + unsigned width; + unsigned height; + +} vout_window_cfg_t; + +/** + * FIXME do we need an event system in the window too ? + * or the window user will take care of it ? + */ +struct vout_window_t { + VLC_COMMON_MEMBERS + + unsigned type; /**< Window handle type */ + + /* window handle (mandatory) + * + * It must be filled in the open function. + */ + union { + void *hwnd; /* Win32 window handle */ + uint32_t xid; /* X11 windows ID */ + void *nsobject; /* Mac OSX view object */ + void *anativewindow; /* Android native window. */ + } handle; + + /* display server (mandatory) */ + union { + char *x11; /* X11 display (NULL = use default) */ + } display; + + /* Control on the module (mandatory) + * + * Do not use it directly; use vout_window_Control instead. + */ + int (*control)(vout_window_t *, int query, va_list); + + /* Private place holder for the vout_window_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_window_sys_t *sys; +}; + +/** + * Creates a new window. + * + * @param module plugin name (usually "$window") + * @note If you are inside a "vout display", you must use + / vout_display_NewWindow() and vout_display_DeleteWindow() instead. + * This enables recycling windows. + */ +VLC_API vout_window_t * vout_window_New(vlc_object_t *, const char *module, const vout_window_cfg_t *); + +/** + * Deletes a window created by vout_window_New(). + * + * @note See vout_window_New() about window recycling. + */ +VLC_API void vout_window_Delete(vout_window_t *); + + +/** + * Reconfigures a window. + * + * @note The vout_window_* wrappers should be used instead of this function. + * + * @warning The caller must own the window, as vout_window_t is not thread safe. + */ +VLC_API int vout_window_Control(vout_window_t *, int query, ...); + +/** + * Configures the window manager state for this window. + */ +static inline int vout_window_SetState(vout_window_t *window, unsigned state) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_STATE, state); +} + +/** + * Configures the window display (i.e. inner/useful) size. + */ +static inline int vout_window_SetSize(vout_window_t *window, + unsigned width, unsigned height) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_SIZE, width, height); +} + +/** + * Sets fullscreen mode. + */ +static inline int vout_window_SetFullScreen(vout_window_t *window, bool full) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_FULLSCREEN, full); +} + +#endif /* VLC_VOUT_WINDOW_H */ diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_xlib.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_xlib.h new file mode 100644 index 0000000..b6818c1 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_xlib.h @@ -0,0 +1,57 @@ +/***************************************************************************** + * vlc_xlib.h: initialization of Xlib + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XLIB_H +# define VLC_XLIB_H 1 + +# include +# include +# include +# include + +static inline bool vlc_xlib_init (vlc_object_t *obj) +{ + if (!var_InheritBool (obj, "xlib")) + return false; + + bool ok = false; + + /* XInitThreads() can be called multiple times, + * but it is not reentrant, so we need this global lock. */ + vlc_global_lock (VLC_XLIB_MUTEX); + + if (_Xglobal_lock == NULL && unlikely(_XErrorFunction != NULL)) + /* (_Xglobal_lock == NULL) => Xlib threads not initialized */ + /* (_XErrorFunction != NULL) => Xlib already in use */ + fprintf (stderr, "%s:%u:%s: Xlib not initialized for threads.\n" + "This process is probably using LibVLC incorrectly.\n" + "Pass \"--no-xlib\" to libvlc_new() to fix this.\n", + __FILE__, __LINE__, __func__); + else if (XInitThreads ()) + ok = true; + + vlc_global_unlock (VLC_XLIB_MUTEX); + + if (!ok) + msg_Err (obj, "Xlib not initialized for threads"); + return ok; +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include/plugins/vlc_xml.h b/vlcdemo/vlc/vlc2/include/plugins/vlc_xml.h new file mode 100644 index 0000000..3bb8312 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include/plugins/vlc_xml.h @@ -0,0 +1,120 @@ +/***************************************************************************** + * vlc_xml.h: XML abstraction layer + ***************************************************************************** + * Copyright (C) 2004-2010 VLC authors and VideoLAN + * + * Author: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XML_H +#define VLC_XML_H + +/** +* \file +* This file defines functions and structures to handle xml tags in vlc +* +*/ + +# ifdef __cplusplus +extern "C" { +# endif + +struct xml_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + xml_sys_t *p_sys; + + void (*pf_catalog_load) ( xml_t *, const char * ); + void (*pf_catalog_add) ( xml_t *, const char *, const char *, + const char * ); +}; + +VLC_API xml_t * xml_Create( vlc_object_t * ) VLC_USED; +#define xml_Create( a ) xml_Create( VLC_OBJECT(a) ) +VLC_API void xml_Delete( xml_t * ); + +static inline void xml_CatalogLoad( xml_t *xml, const char *catalog ) +{ + xml->pf_catalog_load( xml, catalog ); +} + +static inline void xml_CatalogAdd( xml_t *xml, const char *type, + const char *orig, const char *value ) +{ + xml->pf_catalog_add( xml, type, orig, value ); +} + + +struct xml_reader_t +{ + VLC_COMMON_MEMBERS + + xml_reader_sys_t *p_sys; + stream_t *p_stream; + module_t *p_module; + + int (*pf_next_node) ( xml_reader_t *, const char ** ); + const char *(*pf_next_attr) ( xml_reader_t *, const char ** ); + + int (*pf_use_dtd) ( xml_reader_t * ); + int (*pf_is_empty) ( xml_reader_t * ); +}; + +VLC_API xml_reader_t * xml_ReaderCreate(vlc_object_t *, stream_t *) VLC_USED; +#define xml_ReaderCreate( a, s ) xml_ReaderCreate(VLC_OBJECT(a), s) +VLC_API void xml_ReaderDelete(xml_reader_t *); +VLC_API xml_reader_t * xml_ReaderReset(xml_reader_t *, stream_t *) VLC_USED; + +static inline int xml_ReaderNextNode( xml_reader_t *reader, const char **pval ) +{ + return reader->pf_next_node( reader, pval ); +} + +static inline const char *xml_ReaderNextAttr( xml_reader_t *reader, + const char **pval ) +{ + return reader->pf_next_attr( reader, pval ); +} + +static inline int xml_ReaderUseDTD( xml_reader_t *reader ) +{ + return reader->pf_use_dtd( reader ); +} + +static inline int xml_ReaderIsEmptyElement( xml_reader_t *reader ) +{ + if(reader->pf_is_empty == NULL) + return -2; + + return reader->pf_is_empty( reader ); +} + +enum { + XML_READER_NONE=0, + XML_READER_STARTELEM, + XML_READER_ENDELEM, + XML_READER_TEXT, +}; + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/deprecated.h b/vlcdemo/vlc/vlc2/include64/deprecated.h new file mode 100644 index 0000000..65df232 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/deprecated.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * deprecated.h: libvlc deprecated API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 7f55090fcd482489ceed9145ce2253e78fa6fd2a $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_DEPRECATED_H +#define LIBVLC_DEPRECATED_H 1 + +/** + * \file + * This file defines libvlc deprecated API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * Playlist (Deprecated) + *****************************************************************************/ +/** \defgroup libvlc_playlist LibVLC playlist (legacy) + * \ingroup libvlc + * @deprecated Use @ref libvlc_media_list instead. + * @{ + */ + +/** + * Start playing (if there is any item in the playlist). + * + * Additionnal playlist item options can be specified for addition to the + * item before it is played. + * + * \param p_instance the playlist instance + * \param i_id the item to play. If this is a negative number, the next + * item will be selected. Otherwise, the item with the given ID will be + * played + * \param i_options the number of options to add to the item + * \param ppsz_options the options to add to the item + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_playlist_play( libvlc_instance_t *p_instance, int i_id, + int i_options, char **ppsz_options ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_DEPRECATED_H */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc.h b/vlcdemo/vlc/vlc2/include64/libvlc.h new file mode 100644 index 0000000..395cb65 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc.h @@ -0,0 +1,634 @@ +/***************************************************************************** + * libvlc.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 0bc0b401a553d2758abddf6f545022a6c2644405 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc external API + */ + +/** + * \defgroup libvlc LibVLC + * LibVLC is the external programming interface of the VLC media player. + * It is used to embed VLC into other applications or frameworks. + * @{ + */ + +#ifndef VLC_LIBVLC_H +#define VLC_LIBVLC_H 1 + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define LIBVLC_API __declspec(dllexport) +#elif defined (__GNUC__) && (__GNUC__ >= 4) +# define LIBVLC_API __attribute__((visibility("default"))) +#else +# define LIBVLC_API +#endif + +#ifdef __LIBVLC__ +/* Avoid unhelpful warnings from libvlc with our deprecated APIs */ +# define LIBVLC_DEPRECATED +#elif defined(__GNUC__) && \ + (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) +# define LIBVLC_DEPRECATED __attribute__((deprecated)) +#else +# define LIBVLC_DEPRECATED +#endif + +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +#include + +/** \defgroup libvlc_core LibVLC core + * \ingroup libvlc + * Before it can do anything useful, LibVLC must be initialized. + * You can create one (or more) instance(s) of LibVLC in a given process, + * with libvlc_new() and destroy them with libvlc_release(). + * + * \version Unless otherwise stated, these functions are available + * from LibVLC versions numbered 1.1.0 or more. + * Earlier versions (0.9.x and 1.0.x) are not compatible. + * @{ + */ + +/** \defgroup libvlc_error LibVLC error handling + * @{ + */ + +/** + * A human-readable error message for the last LibVLC error in the calling + * thread. The resulting string is valid until another error occurs (at least + * until the next LibVLC call). + * + * @warning + * This will be NULL if there was no error. + */ +LIBVLC_API const char *libvlc_errmsg (void); + +/** + * Clears the LibVLC error status for the current thread. This is optional. + * By default, the error status is automatically overridden when a new error + * occurs, and destroyed when the thread exits. + */ +LIBVLC_API void libvlc_clearerr (void); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param ap the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_vprinterr (const char *fmt, va_list ap); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param args the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_printerr (const char *fmt, ...); + +/**@} */ + +/** + * Create and initialize a libvlc instance. + * This functions accept a list of "command line" arguments similar to the + * main(). These arguments affect the LibVLC instance default configuration. + * + * \version + * Arguments are meant to be passed from the command line to LibVLC, just like + * VLC media player does. The list of valid arguments depends on the LibVLC + * version, the operating system and platform, and set of available LibVLC + * plugins. Invalid or unsupported arguments will cause the function to fail + * (i.e. return NULL). Also, some arguments may alter the behaviour or + * otherwise interfere with other LibVLC functions. + * + * \warning + * There is absolutely no warranty or promise of forward, backward and + * cross-platform compatibility with regards to libvlc_new() arguments. + * We recommend that you do not use them, other than when debugging. + * + * \param argc the number of arguments (should be 0) + * \param argv list of arguments (should be NULL) + * \return the libvlc instance or NULL in case of error + */ +LIBVLC_API libvlc_instance_t * +libvlc_new( int argc , const char *const *argv ); + +/** + * Decrement the reference count of a libvlc instance, and destroy it + * if it reaches zero. + * + * \param p_instance the instance to destroy + */ +LIBVLC_API void libvlc_release( libvlc_instance_t *p_instance ); + +/** + * Increments the reference count of a libvlc instance. + * The initial reference count is 1 after libvlc_new() returns. + * + * \param p_instance the instance to reference + */ +LIBVLC_API void libvlc_retain( libvlc_instance_t *p_instance ); + +/** + * Try to start a user interface for the libvlc instance. + * + * \param p_instance the instance + * \param name interface name, or NULL for default + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_add_intf( libvlc_instance_t *p_instance, const char *name ); + +/** + * Registers a callback for the LibVLC exit event. This is mostly useful if + * the VLC playlist and/or at least one interface are started with + * libvlc_playlist_play() or libvlc_add_intf() respectively. + * Typically, this function will wake up your application main loop (from + * another thread). + * + * \note This function should be called before the playlist or interface are + * started. Otherwise, there is a small race condition: the exit event could + * be raised before the handler is registered. + * + * \param p_instance LibVLC instance + * \param cb callback to invoke when LibVLC wants to exit, + * or NULL to disable the exit handler (as by default) + * \param opaque data pointer for the callback + * \warning This function and libvlc_wait() cannot be used at the same time. + */ +LIBVLC_API +void libvlc_set_exit_handler( libvlc_instance_t *p_instance, + void (*cb) (void *), void *opaque ); + +/** + * Waits until an interface causes the instance to exit. + * You should start at least one interface first, using libvlc_add_intf(). + * + * \param p_instance the instance + * \warning This function wastes one thread doing basically nothing. + * libvlc_set_exit_handler() should be used instead. + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_wait( libvlc_instance_t *p_instance ); + +/** + * Sets the application name. LibVLC passes this as the user agent string + * when a protocol requires it. + * + * \param p_instance LibVLC instance + * \param name human-readable application name, e.g. "FooBar player 1.2.3" + * \param http HTTP User Agent, e.g. "FooBar/1.2.3 Python/2.6.0" + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_set_user_agent( libvlc_instance_t *p_instance, + const char *name, const char *http ); + +/** + * Sets some meta-information about the application. + * See also libvlc_set_user_agent(). + * + * \param p_instance LibVLC instance + * \param id Java-style application identifier, e.g. "com.acme.foobar" + * \param version application version numbers, e.g. "1.2.3" + * \param icon application icon name, e.g. "foobar" + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API +void libvlc_set_app_id( libvlc_instance_t *p_instance, const char *id, + const char *version, const char *icon ); + +/** + * Retrieve libvlc version. + * + * Example: "1.1.0-git The Luggage" + * + * \return a string containing the libvlc version + */ +LIBVLC_API const char * libvlc_get_version(void); + +/** + * Retrieve libvlc compiler version. + * + * Example: "gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu6)" + * + * \return a string containing the libvlc compiler version + */ +LIBVLC_API const char * libvlc_get_compiler(void); + +/** + * Retrieve libvlc changeset. + * + * Example: "aa9bce0bc4" + * + * \return a string containing the libvlc changeset + */ +LIBVLC_API const char * libvlc_get_changeset(void); + +/** + * Frees an heap allocation returned by a LibVLC function. + * If you know you're using the same underlying C run-time as the LibVLC + * implementation, then you can call ANSI C free() directly instead. + * + * \param ptr the pointer + */ +LIBVLC_API void libvlc_free( void *ptr ); + +/** \defgroup libvlc_event LibVLC asynchronous events + * LibVLC emits asynchronous events. + * + * Several LibVLC objects (such @ref libvlc_instance_t as + * @ref libvlc_media_player_t) generate events asynchronously. Each of them + * provides @ref libvlc_event_manager_t event manager. You can subscribe to + * events with libvlc_event_attach() and unsubscribe with + * libvlc_event_detach(). + * @{ + */ + +/** + * Event manager that belongs to a libvlc object, and from whom events can + * be received. + */ +typedef struct libvlc_event_manager_t libvlc_event_manager_t; + +struct libvlc_event_t; + +/** + * Type of a LibVLC event. + */ +typedef int libvlc_event_type_t; + +/** + * Callback function notification + * \param p_event the event triggering the callback + */ +typedef void ( *libvlc_callback_t )( const struct libvlc_event_t *, void * ); + +/** + * Register for an event notification. + * + * \param p_event_manager the event manager to which you want to attach to. + * Generally it is obtained by vlc_my_object_event_manager() where + * my_object is the object you want to listen to. + * \param i_event_type the desired event to which we want to listen + * \param f_callback the function to call when i_event_type occurs + * \param user_data user provided data to carry with the event + * \return 0 on success, ENOMEM on error + */ +LIBVLC_API int libvlc_event_attach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *user_data ); + +/** + * Unregister an event notification. + * + * \param p_event_manager the event manager + * \param i_event_type the desired event to which we want to unregister + * \param f_callback the function to call when i_event_type occurs + * \param p_user_data user provided data to carry with the event + */ +LIBVLC_API void libvlc_event_detach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *p_user_data ); + +/** + * Get an event's type name. + * + * \param event_type the desired event + */ +LIBVLC_API const char * libvlc_event_type_name( libvlc_event_type_t event_type ); + +/** @} */ + +/** \defgroup libvlc_log LibVLC logging + * libvlc_log_* functions provide access to the LibVLC messages log. + * This is used for logging and debugging. + * @{ + */ + +/** + * Logging messages level. + * \note Future LibVLC versions may define new levels. + */ +enum libvlc_log_level +{ + LIBVLC_DEBUG=0, /**< Debug message */ + LIBVLC_NOTICE=2, /**< Important informational message */ + LIBVLC_WARNING=3, /**< Warning (potential error) message */ + LIBVLC_ERROR=4 /**< Error message */ +}; + +typedef struct vlc_log_t libvlc_log_t; + +/** + * Gets debugging information about a log message: the name of the VLC module + * emitting the message and the message location within the source code. + * + * The returned module name and file name will be NULL if unknown. + * The returned line number will similarly be zero if unknown. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param module module name storage (or NULL) [OUT] + * \param file source code file name storage (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_context(const libvlc_log_t *ctx, + const char **module, const char **file, unsigned *line); + +/** + * Gets VLC object information about a log message: the type name of the VLC + * object emitting the message, the object header if any and a temporaly-unique + * object identifier. This information is mainly meant for manual + * troubleshooting. + * + * The returned type name may be "generic" if unknown, but it cannot be NULL. + * The returned header will be NULL if unset; in current versions, the header + * is used to distinguish for VLM inputs. + * The returned object ID will be zero if the message is not associated with + * any VLC object. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param name object name storage (or NULL) [OUT] + * \param header object header (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_object(const libvlc_log_t *ctx, + const char **name, const char **header, uintptr_t *id); + +/** + * Callback prototype for LibVLC log message handler. + * \param data data pointer as given to libvlc_log_set() + * \param level message level (@ref enum libvlc_log_level) + * \param ctx message context (meta-information about the message) + * \param fmt printf() format string (as defined by ISO C11) + * \param args variable argument list for the format + * \note Log message handlers must be thread-safe. + * \warning The message context pointer, the format string parameters and the + * variable arguments are only valid until the callback returns. + */ +typedef void (*libvlc_log_cb)(void *data, int level, const libvlc_log_t *ctx, + const char *fmt, va_list args); + +/** + * Unsets the logging callback for a LibVLC instance. This is rarely needed: + * the callback is implicitly unset when the instance is destroyed. + * This function will wait for any pending callbacks invocation to complete + * (causing a deadlock if called from within the callback). + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_unset( libvlc_instance_t * ); + +/** + * Sets the logging callback for a LibVLC instance. + * This function is thread-safe: it will wait for any pending callbacks + * invocation to complete. + * + * \param cb callback function pointer + * \param data opaque data pointer for the callback function + * + * \note Some log messages (especially debug) are emitted by LibVLC while + * is being initialized. These messages cannot be captured with this interface. + * + * \warning A deadlock may occur if this function is called from the callback. + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set( libvlc_instance_t *, + libvlc_log_cb cb, void *data ); + + +/** + * Sets up logging to a file. + * \param p_instance libvlc instance + * \param stream FILE pointer opened for writing + * (the FILE pointer must remain valid until libvlc_log_unset()) + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set_file( libvlc_instance_t *, FILE *stream ); + +/** + * Always returns minus one. + * This function is only provided for backward compatibility. + * + * \param p_instance ignored + * \return always -1 + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_get_log_verbosity( const libvlc_instance_t *p_instance ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_instance ignored + * \param level ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_set_log_verbosity( libvlc_instance_t *p_instance, unsigned level ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_instance libvlc instance + * \return an unique pointer or NULL on error + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_t *libvlc_log_open( libvlc_instance_t *p_instance ); + +/** + * Frees memory allocated by libvlc_log_open(). + * + * \param p_log libvlc log instance or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_close( libvlc_log_t *p_log ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_log ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_log_count( const libvlc_log_t *p_log ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_log ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_clear( libvlc_log_t *p_log ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_log ignored + * \return an unique pointer or NULL on error or if the parameter was NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_iterator_t *libvlc_log_get_iterator( const libvlc_log_t *p_log ); + +/** + * Frees memory allocated by libvlc_log_get_iterator(). + * + * \param p_iter libvlc log iterator or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_iterator_free( libvlc_log_iterator_t *p_iter ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_iter ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_log_iterator_has_next( const libvlc_log_iterator_t *p_iter ); + +/** + * Always returns NULL. + * This function is only provided for backward compatibility. + * + * \param p_iter libvlc log iterator or NULL + * \param p_buf ignored + * \return always NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterator_t *p_iter, + libvlc_log_message_t *p_buf ); + +/** @} */ + +/** + * Description of a module. + */ +typedef struct libvlc_module_description_t +{ + char *psz_name; + char *psz_shortname; + char *psz_longname; + char *psz_help; + struct libvlc_module_description_t *p_next; +} libvlc_module_description_t; + +/** + * Release a list of module descriptions. + * + * \param p_list the list to be released + */ +LIBVLC_API +void libvlc_module_description_list_release( libvlc_module_description_t *p_list ); + +/** + * Returns a list of audio filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_audio_filter_list_get( libvlc_instance_t *p_instance ); + +/** + * Returns a list of video filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_video_filter_list_get( libvlc_instance_t *p_instance ); + +/** @} */ + +/** \defgroup libvlc_clock LibVLC time + * These functions provide access to the LibVLC time/clock. + * @{ + */ + +/** + * Return the current time as defined by LibVLC. The unit is the microsecond. + * Time increases monotonically (regardless of time zone changes and RTC + * adjustements). + * The origin is arbitrary but consistent across the whole system + * (e.g. the system uptim, the time since the system was booted). + * \note On systems that support it, the POSIX monotonic clock is used. + */ +LIBVLC_API +int64_t libvlc_clock(void); + +/** + * Return the delay (in microseconds) until a certain timestamp. + * \param pts timestamp + * \return negative if timestamp is in the past, + * positive if it is in the future + */ +static inline int64_t libvlc_delay(int64_t pts) +{ + return pts - libvlc_clock(); +} + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_events.h b/vlcdemo/vlc/vlc2/include64/libvlc_events.h new file mode 100644 index 0000000..7b29cd3 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_events.h @@ -0,0 +1,253 @@ +/***************************************************************************** + * libvlc_events.h: libvlc_events external API structure + ***************************************************************************** + * Copyright (C) 1998-2010 VLC authors and VideoLAN + * $Id $ + * + * Authors: Filippo Carone + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_EVENTS_H +#define LIBVLC_EVENTS_H 1 + +/** + * \file + * This file defines libvlc_event external API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \ingroup libvlc_event + * @{ + */ + +/** + * Event types + */ +enum libvlc_event_e { + /* Append new event types at the end of a category. + * Do not remove, insert or re-order any entry. + * Keep this in sync with lib/event.c:libvlc_event_type_name(). */ + libvlc_MediaMetaChanged=0, + libvlc_MediaSubItemAdded, + libvlc_MediaDurationChanged, + libvlc_MediaParsedChanged, + libvlc_MediaFreed, + libvlc_MediaStateChanged, + libvlc_MediaSubItemTreeAdded, + + libvlc_MediaPlayerMediaChanged=0x100, + libvlc_MediaPlayerNothingSpecial, + libvlc_MediaPlayerOpening, + libvlc_MediaPlayerBuffering, + libvlc_MediaPlayerPlaying, + libvlc_MediaPlayerPaused, + libvlc_MediaPlayerStopped, + libvlc_MediaPlayerForward, + libvlc_MediaPlayerBackward, + libvlc_MediaPlayerEndReached, + libvlc_MediaPlayerEncounteredError, + libvlc_MediaPlayerTimeChanged, + libvlc_MediaPlayerPositionChanged, + libvlc_MediaPlayerSeekableChanged, + libvlc_MediaPlayerPausableChanged, + libvlc_MediaPlayerTitleChanged, + libvlc_MediaPlayerSnapshotTaken, + libvlc_MediaPlayerLengthChanged, + libvlc_MediaPlayerVout, + libvlc_MediaPlayerScrambledChanged, + libvlc_MediaPlayerCorked = libvlc_MediaPlayerScrambledChanged + 3 + 1, + libvlc_MediaPlayerUncorked, + libvlc_MediaPlayerMuted, + libvlc_MediaPlayerUnmuted, + libvlc_MediaPlayerAudioVolume, + + libvlc_MediaListItemAdded=0x200, + libvlc_MediaListWillAddItem, + libvlc_MediaListItemDeleted, + libvlc_MediaListWillDeleteItem, + + libvlc_MediaListViewItemAdded=0x300, + libvlc_MediaListViewWillAddItem, + libvlc_MediaListViewItemDeleted, + libvlc_MediaListViewWillDeleteItem, + + libvlc_MediaListPlayerPlayed=0x400, + libvlc_MediaListPlayerNextItemSet, + libvlc_MediaListPlayerStopped, + + libvlc_MediaDiscovererStarted=0x500, + libvlc_MediaDiscovererEnded, + + libvlc_VlmMediaAdded=0x600, + libvlc_VlmMediaRemoved, + libvlc_VlmMediaChanged, + libvlc_VlmMediaInstanceStarted, + libvlc_VlmMediaInstanceStopped, + libvlc_VlmMediaInstanceStatusInit, + libvlc_VlmMediaInstanceStatusOpening, + libvlc_VlmMediaInstanceStatusPlaying, + libvlc_VlmMediaInstanceStatusPause, + libvlc_VlmMediaInstanceStatusEnd, + libvlc_VlmMediaInstanceStatusError +}; + +/** + * A LibVLC event + */ +typedef struct libvlc_event_t +{ + int type; /**< Event type (see @ref libvlc_event_e) */ + void *p_obj; /**< Object emitting the event */ + union + { + /* media descriptor */ + struct + { + libvlc_meta_t meta_type; + } media_meta_changed; + struct + { + libvlc_media_t * new_child; + } media_subitem_added; + struct + { + int64_t new_duration; + } media_duration_changed; + struct + { + int new_status; + } media_parsed_changed; + struct + { + libvlc_media_t * md; + } media_freed; + struct + { + libvlc_state_t new_state; + } media_state_changed; + struct + { + libvlc_media_t * item; + } media_subitemtree_added; + + /* media instance */ + struct + { + float new_cache; + } media_player_buffering; + struct + { + float new_position; + } media_player_position_changed; + struct + { + libvlc_time_t new_time; + } media_player_time_changed; + struct + { + int new_title; + } media_player_title_changed; + struct + { + int new_seekable; + } media_player_seekable_changed; + struct + { + int new_pausable; + } media_player_pausable_changed; + struct + { + int new_scrambled; + } media_player_scrambled_changed; + struct + { + int new_count; + } media_player_vout; + + /* media list */ + struct + { + libvlc_media_t * item; + int index; + } media_list_item_added; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_add_item; + struct + { + libvlc_media_t * item; + int index; + } media_list_item_deleted; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_delete_item; + + /* media list player */ + struct + { + libvlc_media_t * item; + } media_list_player_next_item_set; + + /* snapshot taken */ + struct + { + char* psz_filename ; + } media_player_snapshot_taken ; + + /* Length changed */ + struct + { + libvlc_time_t new_length; + } media_player_length_changed; + + /* VLM media */ + struct + { + const char * psz_media_name; + const char * psz_instance_name; + } vlm_media_event; + + /* Extra MediaPlayer */ + struct + { + libvlc_media_t * new_media; + } media_player_media_changed; + + struct + { + float volume; + } media_player_audio_volume; + } u; /**< Type-dependent event description */ +} libvlc_event_t; + + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_media.h b/vlcdemo/vlc/vlc2/include64/libvlc_media.h new file mode 100644 index 0000000..e3e9913 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_media.h @@ -0,0 +1,609 @@ +/***************************************************************************** + * libvlc_media.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 948230a3f17569091b982038ec2c66b48e1a4398 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media external API + */ + +#ifndef VLC_LIBVLC_MEDIA_H +#define VLC_LIBVLC_MEDIA_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media LibVLC media + * \ingroup libvlc + * @ref libvlc_media_t is an abstract representation of a playable media. + * It consists of a media location and various optional meta data. + * @{ + */ + +typedef struct libvlc_media_t libvlc_media_t; + +/** defgroup libvlc_meta LibVLC meta data + * \ingroup libvlc_media + * @{ + */ + +/** Meta data types */ +typedef enum libvlc_meta_t { + libvlc_meta_Title, + libvlc_meta_Artist, + libvlc_meta_Genre, + libvlc_meta_Copyright, + libvlc_meta_Album, + libvlc_meta_TrackNumber, + libvlc_meta_Description, + libvlc_meta_Rating, + libvlc_meta_Date, + libvlc_meta_Setting, + libvlc_meta_URL, + libvlc_meta_Language, + libvlc_meta_NowPlaying, + libvlc_meta_Publisher, + libvlc_meta_EncodedBy, + libvlc_meta_ArtworkURL, + libvlc_meta_TrackID, + libvlc_meta_TrackTotal, + libvlc_meta_Director, + libvlc_meta_Season, + libvlc_meta_Episode, + libvlc_meta_ShowName, + libvlc_meta_Actors + /* Add new meta types HERE */ +} libvlc_meta_t; + +/** @}*/ + +/** + * Note the order of libvlc_state_t enum must match exactly the order of + * \see mediacontrol_PlayerStatus, \see input_state_e enums, + * and VideoLAN.LibVLC.State (at bindings/cil/src/media.cs). + * + * Expected states by web plugins are: + * IDLE/CLOSE=0, OPENING=1, BUFFERING=2, PLAYING=3, PAUSED=4, + * STOPPING=5, ENDED=6, ERROR=7 + */ +typedef enum libvlc_state_t +{ + libvlc_NothingSpecial=0, + libvlc_Opening, + libvlc_Buffering, + libvlc_Playing, + libvlc_Paused, + libvlc_Stopped, + libvlc_Ended, + libvlc_Error +} libvlc_state_t; + +enum +{ + libvlc_media_option_trusted = 0x2, + libvlc_media_option_unique = 0x100 +}; + +typedef enum libvlc_track_type_t +{ + libvlc_track_unknown = -1, + libvlc_track_audio = 0, + libvlc_track_video = 1, + libvlc_track_text = 2 +} libvlc_track_type_t; + +/** defgroup libvlc_media_stats_t LibVLC media statistics + * \ingroup libvlc_media + * @{ + */ +typedef struct libvlc_media_stats_t +{ + /* Input */ + int i_read_bytes; + float f_input_bitrate; + + /* Demux */ + int i_demux_read_bytes; + float f_demux_bitrate; + int i_demux_corrupted; + int i_demux_discontinuity; + + /* Decoders */ + int i_decoded_video; + int i_decoded_audio; + + /* Video Output */ + int i_displayed_pictures; + int i_lost_pictures; + + /* Audio output */ + int i_played_abuffers; + int i_lost_abuffers; + + /* Stream output */ + int i_sent_packets; + int i_sent_bytes; + float f_send_bitrate; +} libvlc_media_stats_t; +/** @}*/ + +typedef struct libvlc_media_track_info_t +{ + /* Codec fourcc */ + uint32_t i_codec; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + struct { + /* Audio specific */ + unsigned i_channels; + unsigned i_rate; + } audio; + struct { + /* Video specific */ + unsigned i_height; + unsigned i_width; + } video; + } u; + +} libvlc_media_track_info_t; + + +typedef struct libvlc_audio_track_t +{ + unsigned i_channels; + unsigned i_rate; +} libvlc_audio_track_t; + +typedef struct libvlc_video_track_t +{ + unsigned i_height; + unsigned i_width; + unsigned i_sar_num; + unsigned i_sar_den; + unsigned i_frame_rate_num; + unsigned i_frame_rate_den; +} libvlc_video_track_t; + +typedef struct libvlc_subtitle_track_t +{ + char *psz_encoding; +} libvlc_subtitle_track_t; + +typedef struct libvlc_media_track_t +{ + /* Codec fourcc */ + uint32_t i_codec; + uint32_t i_original_fourcc; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + libvlc_audio_track_t *audio; + libvlc_video_track_t *video; + libvlc_subtitle_track_t *subtitle; + }; + + unsigned int i_bitrate; + char *psz_language; + char *psz_description; + +} libvlc_media_track_t; + + +/** + * Create a media with a certain given media resource location, + * for instance a valid URL. + * + * \note To refer to a local file with this function, + * the file://... URI syntax must be used (see IETF RFC3986). + * We recommend using libvlc_media_new_path() instead when dealing with + * local files. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_mrl the media location + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_location( + libvlc_instance_t *p_instance, + const char * psz_mrl ); + +/** + * Create a media for a certain file path. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param path local filesystem path + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_path( + libvlc_instance_t *p_instance, + const char *path ); + +/** + * Create a media for an already open file descriptor. + * The file descriptor shall be open for reading (or reading and writing). + * + * Regular file descriptors, pipe read descriptors and character device + * descriptors (including TTYs) are supported on all platforms. + * Block device descriptors are supported where available. + * Directory descriptors are supported on systems that provide fdopendir(). + * Sockets are supported on all platforms where they are file descriptors, + * i.e. all except Windows. + * + * \note This library will not automatically close the file descriptor + * under any circumstance. Nevertheless, a file descriptor can usually only be + * rendered once in a media player. To render it a second time, the file + * descriptor should probably be rewound to the beginning with lseek(). + * + * \see libvlc_media_release + * + * \version LibVLC 1.1.5 and later. + * + * \param p_instance the instance + * \param fd open file descriptor + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_fd( + libvlc_instance_t *p_instance, + int fd ); + + +/** + * Create a media as an empty node with a given name. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_name the name of the node + * \return the new empty media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_as_node( + libvlc_instance_t *p_instance, + const char * psz_name ); + +/** + * Add an option to the media. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * \note The options are listed in 'vlc --long-help' from the command line, + * e.g. "-sout-all". Keep in mind that available options and their semantics + * vary across LibVLC versions and builds. + * \warning Not all options affects libvlc_media_t objects: + * Specifically, due to architectural issues most audio and video options, + * such as text renderer options, have no effects on an individual media. + * These options must be set through libvlc_new() instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + */ +LIBVLC_API void libvlc_media_add_option( + libvlc_media_t *p_md, + const char * psz_options ); + +/** + * Add an option to the media with configurable flags. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * The options are detailed in vlc --long-help, for instance + * "--sout-all". Note that all options are not usable on medias: + * specifically, due to architectural issues, video-related options + * such as text renderer options cannot be set on a single media. They + * must be set on the whole libvlc instance instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + * \param i_flags the flags for this option + */ +LIBVLC_API void libvlc_media_add_option_flag( + libvlc_media_t *p_md, + const char * psz_options, + unsigned i_flags ); + + +/** + * Retain a reference to a media descriptor object (libvlc_media_t). Use + * libvlc_media_release() to decrement the reference count of a + * media descriptor object. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_retain( libvlc_media_t *p_md ); + +/** + * Decrement the reference count of a media descriptor object. If the + * reference count is 0, then libvlc_media_release() will release the + * media descriptor object. It will send out an libvlc_MediaFreed event + * to all listeners. If the media descriptor object has been released it + * should not be used again. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_release( libvlc_media_t *p_md ); + + +/** + * Get the media resource locator (mrl) from a media descriptor object + * + * \param p_md a media descriptor object + * \return string with mrl of media descriptor object + */ +LIBVLC_API char *libvlc_media_get_mrl( libvlc_media_t *p_md ); + +/** + * Duplicate a media descriptor object. + * + * \param p_md a media descriptor object. + */ +LIBVLC_API libvlc_media_t *libvlc_media_duplicate( libvlc_media_t *p_md ); + +/** + * Read the meta of the media. + * + * If the media has not yet been parsed this will return NULL. + * + * This methods automatically calls libvlc_media_parse_async(), so after calling + * it you may receive a libvlc_MediaMetaChanged event. If you prefer a synchronous + * version ensure that you call libvlc_media_parse() before get_meta(). + * + * \see libvlc_media_parse + * \see libvlc_media_parse_async + * \see libvlc_MediaMetaChanged + * + * \param p_md the media descriptor + * \param e_meta the meta to read + * \return the media's meta + */ +LIBVLC_API char *libvlc_media_get_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta ); + +/** + * Set the meta of the media (this function will not save the meta, call + * libvlc_media_save_meta in order to save the meta) + * + * \param p_md the media descriptor + * \param e_meta the meta to write + * \param psz_value the media's meta + */ +LIBVLC_API void libvlc_media_set_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta, + const char *psz_value ); + + +/** + * Save the meta previously set + * + * \param p_md the media desriptor + * \return true if the write operation was successful + */ +LIBVLC_API int libvlc_media_save_meta( libvlc_media_t *p_md ); + + +/** + * Get current state of media descriptor object. Possible media states + * are defined in libvlc_structures.c ( libvlc_NothingSpecial=0, + * libvlc_Opening, libvlc_Buffering, libvlc_Playing, libvlc_Paused, + * libvlc_Stopped, libvlc_Ended, + * libvlc_Error). + * + * \see libvlc_state_t + * \param p_md a media descriptor object + * \return state of media descriptor object + */ +LIBVLC_API libvlc_state_t libvlc_media_get_state( + libvlc_media_t *p_md ); + + +/** + * Get the current statistics about the media + * \param p_md: media descriptor object + * \param p_stats: structure that contain the statistics about the media + * (this structure must be allocated by the caller) + * \return true if the statistics are available, false otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_get_stats( libvlc_media_t *p_md, + libvlc_media_stats_t *p_stats ); + +/* The following method uses libvlc_media_list_t, however, media_list usage is optionnal + * and this is here for convenience */ +#define VLC_FORWARD_DECLARE_OBJECT(a) struct a + +/** + * Get subitems of media descriptor object. This will increment + * the reference count of supplied media descriptor object. Use + * libvlc_media_list_release() to decrement the reference counting. + * + * \param p_md media descriptor object + * \return list of media descriptor subitems or NULL + */ +LIBVLC_API VLC_FORWARD_DECLARE_OBJECT(libvlc_media_list_t *) +libvlc_media_subitems( libvlc_media_t *p_md ); + +/** + * Get event manager from media descriptor object. + * NOTE: this function doesn't increment reference counting. + * + * \param p_md a media descriptor object + * \return event manager object + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_event_manager( libvlc_media_t *p_md ); + +/** + * Get duration (in ms) of media descriptor object item. + * + * \param p_md media descriptor object + * \return duration of media item or -1 on error + */ +LIBVLC_API libvlc_time_t + libvlc_media_get_duration( libvlc_media_t *p_md ); + +/** + * Parse a media. + * + * This fetches (local) meta data and tracks information. + * The method is synchronous. + * + * \see libvlc_media_parse_async + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_API void +libvlc_media_parse( libvlc_media_t *p_md ); + +/** + * Parse a media. + * + * This fetches (local) meta data and tracks information. + * The method is the asynchronous of libvlc_media_parse(). + * + * To track when this is over you can listen to libvlc_MediaParsedChanged + * event. However if the media was already parsed you will not receive this + * event. + * + * \see libvlc_media_parse + * \see libvlc_MediaParsedChanged + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_API void +libvlc_media_parse_async( libvlc_media_t *p_md ); + +/** + * Get Parsed status for media descriptor object. + * + * \see libvlc_MediaParsedChanged + * + * \param p_md media descriptor object + * \return true if media object has been parsed otherwise it returns false + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_is_parsed( libvlc_media_t *p_md ); + +/** + * Sets media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + * \param p_new_user_data pointer to user data + */ +LIBVLC_API void + libvlc_media_set_user_data( libvlc_media_t *p_md, void *p_new_user_data ); + +/** + * Get media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + */ +LIBVLC_API void *libvlc_media_get_user_data( libvlc_media_t *p_md ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \deprecated Use libvlc_media_tracks_get instead + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed by the caller) [OUT] + * + * \return the number of Elementary Streams + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_media_get_tracks_info( libvlc_media_t *p_md, + libvlc_media_track_info_t **tracks ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \version LibVLC 2.1.0 and later. + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed with libvlc_media_tracks_release + by the caller) [OUT] + * + * \return the number of Elementary Streams (zero on error) + */ +LIBVLC_API +unsigned libvlc_media_tracks_get( libvlc_media_t *p_md, + libvlc_media_track_t ***tracks ); + + +/** + * Release media descriptor's elementary streams description array + * + * \version LibVLC 2.1.0 and later. + * + * \param p_tracks tracks info array to release + * \param i_count number of elements in the array + */ +LIBVLC_API +void libvlc_media_tracks_release( libvlc_media_track_t **p_tracks, + unsigned i_count ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_H */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_media_discoverer.h b/vlcdemo/vlc/vlc2/include64/libvlc_media_discoverer.h new file mode 100644 index 0000000..3883419 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_media_discoverer.h @@ -0,0 +1,111 @@ +/***************************************************************************** + * libvlc_media_discoverer.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: cf263b0536d9b19e725e039f12ef20eaa392fec3 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media_discoverer external API + */ + +#ifndef VLC_LIBVLC_MEDIA_DISCOVERER_H +#define VLC_LIBVLC_MEDIA_DISCOVERER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_discoverer LibVLC media discovery + * \ingroup libvlc + * LibVLC media discovery finds available media via various means. + * This corresponds to the service discovery functionality in VLC media player. + * Different plugins find potential medias locally (e.g. user media directory), + * from peripherals (e.g. video capture device), on the local network + * (e.g. SAP) or on the Internet (e.g. Internet radios). + * @{ + */ + +typedef struct libvlc_media_discoverer_t libvlc_media_discoverer_t; + +/** + * Discover media service by name. + * + * \param p_inst libvlc instance + * \param psz_name service name + * \return media discover object or NULL in case of error + */ +LIBVLC_API libvlc_media_discoverer_t * +libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, + const char * psz_name ); + +/** + * Release media discover object. If the reference count reaches 0, then + * the object will be released. + * + * \param p_mdis media service discover object + */ +LIBVLC_API void libvlc_media_discoverer_release( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media service discover object its localized name. + * + * \param p_mdis media discover object + * \return localized name + */ +LIBVLC_API char * libvlc_media_discoverer_localized_name( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media service discover media list. + * + * \param p_mdis media service discover object + * \return list of media items + */ +LIBVLC_API libvlc_media_list_t * libvlc_media_discoverer_media_list( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get event manager from media service discover object. + * + * \param p_mdis media service discover object + * \return event manager object. + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_discoverer_event_manager( libvlc_media_discoverer_t * p_mdis ); + +/** + * Query if media service discover object is running. + * + * \param p_mdis media service discover object + * \return true if running, false if not + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_discoverer_is_running( libvlc_media_discoverer_t * p_mdis ); + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_media_library.h b/vlcdemo/vlc/vlc2/include64/libvlc_media_library.h new file mode 100644 index 0000000..4134c07 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_media_library.h @@ -0,0 +1,99 @@ +/***************************************************************************** + * libvlc_media_library.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: fa7094a6a8aac42607490c9982d9f4d082c2794c $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media_library external API + */ + +#ifndef VLC_LIBVLC_MEDIA_LIBRARY_H +#define VLC_LIBVLC_MEDIA_LIBRARY_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_library LibVLC media library + * \ingroup libvlc + * @{ + */ + +typedef struct libvlc_media_library_t libvlc_media_library_t; + +/** + * Create an new Media Library object + * + * \param p_instance the libvlc instance + * \return a new object or NULL on error + */ +LIBVLC_API libvlc_media_library_t * + libvlc_media_library_new( libvlc_instance_t * p_instance ); + +/** + * Release media library object. This functions decrements the + * reference count of the media library object. If it reaches 0, + * then the object will be released. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_release( libvlc_media_library_t * p_mlib ); + +/** + * Retain a reference to a media library object. This function will + * increment the reference counting for this object. Use + * libvlc_media_library_release() to decrement the reference count. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_retain( libvlc_media_library_t * p_mlib ); + +/** + * Load media library. + * + * \param p_mlib media library object + * \return 0 on success, -1 on error + */ +LIBVLC_API int + libvlc_media_library_load( libvlc_media_library_t * p_mlib ); + +/** + * Get media library subitems. + * + * \param p_mlib media library object + * \return media list subitems + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_library_media_list( libvlc_media_library_t * p_mlib ); + + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_media_list.h b/vlcdemo/vlc/vlc2/include64/libvlc_media_list.h new file mode 100644 index 0000000..6330c6f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_media_list.h @@ -0,0 +1,209 @@ +/***************************************************************************** + * libvlc_media_list.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 015824bf54e656cc67838452c7e99a00a452af6e $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_H +#define LIBVLC_MEDIA_LIST_H 1 + +/** + * \file + * This file defines libvlc_media_list API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_list LibVLC media list + * \ingroup libvlc + * A LibVLC media list holds multiple @ref libvlc_media_t media descriptors. + * @{ + */ + +typedef struct libvlc_media_list_t libvlc_media_list_t; + +/** + * Create an empty media list. + * + * \param p_instance libvlc instance + * \return empty media list, or NULL on error + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_list_new( libvlc_instance_t *p_instance ); + +/** + * Release media list created with libvlc_media_list_new(). + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_release( libvlc_media_list_t *p_ml ); + +/** + * Retain reference to a media list + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_retain( libvlc_media_list_t *p_ml ); + +LIBVLC_DEPRECATED int + libvlc_media_list_add_file_content( libvlc_media_list_t * p_ml, + const char * psz_uri ); + +/** + * Associate media instance with this media list instance. + * If another media instance was present it will be released. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance to add + */ +LIBVLC_API void +libvlc_media_list_set_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Get media instance from this media list instance. This action will increase + * the refcount on the media instance. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \return media instance + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_media( libvlc_media_list_t *p_ml ); + +/** + * Add media instance to media list + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_add_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Insert media instance in media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_insert_media( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md, int i_pos ); + +/** + * Remove media instance from media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the list is read-only or the item was not found + */ +LIBVLC_API int +libvlc_media_list_remove_index( libvlc_media_list_t *p_ml, int i_pos ); + +/** + * Get count on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \return number of items in media list + */ +LIBVLC_API int + libvlc_media_list_count( libvlc_media_list_t *p_ml ); + +/** + * List media instance in media list at a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return media instance at position i_pos, or NULL if not found. + * In case of success, libvlc_media_retain() is called to increase the refcount + * on the media. + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_item_at_index( libvlc_media_list_t *p_ml, int i_pos ); +/** + * Find index position of List media instance in media list. + * Warning: the function will return the first matched position. + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance + * \return position of media instance or -1 if media not found + */ +LIBVLC_API int + libvlc_media_list_index_of_item( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md ); + +/** + * This indicates if this media list is read-only from a user point of view + * + * \param p_ml media list instance + * \return 1 on readonly, 0 on readwrite + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_is_readonly( libvlc_media_list_t * p_ml ); + +/** + * Get lock on media list items + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_lock( libvlc_media_list_t *p_ml ); + +/** + * Release lock on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_unlock( libvlc_media_list_t *p_ml ); + +/** + * Get libvlc_event_manager from this media list instance. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_ml a media list instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_event_manager( libvlc_media_list_t *p_ml ); + +/** @} media_list */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_MEDIA_LIST_H */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_media_list_player.h b/vlcdemo/vlc/vlc2/include64/libvlc_media_list_player.h new file mode 100644 index 0000000..5fa3285 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_media_list_player.h @@ -0,0 +1,224 @@ +/***************************************************************************** + * libvlc_media_list_player.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: c95ad972c7dcf380ef62e60d821af726848dae48 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_PLAYER_H +#define LIBVLC_MEDIA_LIST_PLAYER_H 1 + +/** + * \file + * This file defines libvlc_media_list_player API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * Media List Player + *****************************************************************************/ +/** \defgroup libvlc_media_list_player LibVLC media list player + * \ingroup libvlc + * The LibVLC media list player plays a @ref libvlc_media_list_t list of media, + * in a certain order. + * This is required to especially support playlist files. + * The normal @ref libvlc_media_player_t LibVLC media player can only play a + * single media, and does not handle playlist files properly. + * @{ + */ + +typedef struct libvlc_media_list_player_t libvlc_media_list_player_t; + +/** + * Defines playback modes for playlist. + */ +typedef enum libvlc_playback_mode_t +{ + libvlc_playback_mode_default, + libvlc_playback_mode_loop, + libvlc_playback_mode_repeat +} libvlc_playback_mode_t; + +/** + * Create new media_list_player. + * + * \param p_instance libvlc instance + * \return media list player instance or NULL on error + */ +LIBVLC_API libvlc_media_list_player_t * + libvlc_media_list_player_new( libvlc_instance_t * p_instance ); + +/** + * Release a media_list_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_list_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_release( libvlc_media_list_player_t * p_mlp ); + +/** + * Retain a reference to a media player list object. Use + * libvlc_media_list_player_release() to decrement reference count. + * + * \param p_mlp media player list object + */ +LIBVLC_API void + libvlc_media_list_player_retain( libvlc_media_list_player_t *p_mlp ); + +/** + * Return the event manager of this media_list_player. + * + * \param p_mlp media list player instance + * \return the event manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_player_event_manager(libvlc_media_list_player_t * p_mlp); + +/** + * Replace media player in media_list_player with this instance. + * + * \param p_mlp media list player instance + * \param p_mi media player instance + */ +LIBVLC_API void + libvlc_media_list_player_set_media_player( + libvlc_media_list_player_t * p_mlp, + libvlc_media_player_t * p_mi ); + +/** + * Set the media list associated with the player + * + * \param p_mlp media list player instance + * \param p_mlist list of media + */ +LIBVLC_API void + libvlc_media_list_player_set_media_list( + libvlc_media_list_player_t * p_mlp, + libvlc_media_list_t * p_mlist ); + +/** + * Play media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_play(libvlc_media_list_player_t * p_mlp); + +/** + * Toggle pause (or resume) media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_pause(libvlc_media_list_player_t * p_mlp); + +/** + * Is media list playing? + * + * \param p_mlp media list player instance + * \return true for playing and false for not playing + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_player_is_playing( libvlc_media_list_player_t * p_mlp ); + +/** + * Get current libvlc_state of media list player + * + * \param p_mlp media list player instance + * \return libvlc_state_t for media list player + */ +LIBVLC_API libvlc_state_t + libvlc_media_list_player_get_state( libvlc_media_list_player_t * p_mlp ); + +/** + * Play media list item at position index + * + * \param p_mlp media list player instance + * \param i_index index in media list to play + * \return 0 upon success -1 if the item wasn't found + */ +LIBVLC_API +int libvlc_media_list_player_play_item_at_index(libvlc_media_list_player_t * p_mlp, + int i_index); + +/** + * Play the given media item + * + * \param p_mlp media list player instance + * \param p_md the media instance + * \return 0 upon success, -1 if the media is not part of the media list + */ +LIBVLC_API +int libvlc_media_list_player_play_item(libvlc_media_list_player_t * p_mlp, + libvlc_media_t * p_md); + +/** + * Stop playing media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_stop( libvlc_media_list_player_t * p_mlp); + +/** + * Play next item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no next item + */ +LIBVLC_API +int libvlc_media_list_player_next(libvlc_media_list_player_t * p_mlp); + +/** + * Play previous item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no previous item + */ +LIBVLC_API +int libvlc_media_list_player_previous(libvlc_media_list_player_t * p_mlp); + + + +/** + * Sets the playback mode for the playlist + * + * \param p_mlp media list player instance + * \param e_mode playback mode specification + */ +LIBVLC_API +void libvlc_media_list_player_set_playback_mode(libvlc_media_list_player_t * p_mlp, + libvlc_playback_mode_t e_mode ); + +/** @} media_list_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* LIBVLC_MEDIA_LIST_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_media_player.h b/vlcdemo/vlc/vlc2/include64/libvlc_media_player.h new file mode 100644 index 0000000..00afa61 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_media_player.h @@ -0,0 +1,1881 @@ +/***************************************************************************** + * libvlc_media_player.h: libvlc_media_player external API + ***************************************************************************** + * Copyright (C) 1998-2010 VLC authors and VideoLAN + * $Id: 94bf7e8c4461896ff0d22b7c86ce6d3f9854eb17 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_media_player external API + */ + +#ifndef VLC_LIBVLC_MEDIA_PLAYER_H +#define VLC_LIBVLC_MEDIA_PLAYER_H 1 + +# ifdef __cplusplus +extern "C" { +# else +# include +# endif + +/***************************************************************************** + * Media Player + *****************************************************************************/ +/** \defgroup libvlc_media_player LibVLC media player + * \ingroup libvlc + * A LibVLC media player plays one media (usually in a custom drawable). + * @{ + */ + +typedef struct libvlc_media_player_t libvlc_media_player_t; + +/** + * Description for video, audio tracks and subtitles. It contains + * id, name (description string) and pointer to next record. + */ +typedef struct libvlc_track_description_t +{ + int i_id; + char *psz_name; + struct libvlc_track_description_t *p_next; + +} libvlc_track_description_t; + +/** + * Description for audio output. It contains + * name, description and pointer to next record. + */ +typedef struct libvlc_audio_output_t +{ + char *psz_name; + char *psz_description; + struct libvlc_audio_output_t *p_next; + +} libvlc_audio_output_t; + +/** + * Description for audio output device. + */ +typedef struct libvlc_audio_output_device_t +{ + struct libvlc_audio_output_device_t *p_next; /**< Next entry in list */ + char *psz_device; /**< Device identifier string */ + char *psz_description; /**< User-friendly device description */ + /* More fields may be added here in later versions */ +} libvlc_audio_output_device_t; + +/** + * Rectangle type for video geometry + */ +typedef struct libvlc_rectangle_t +{ + int top, left; + int bottom, right; +} libvlc_rectangle_t; + +/** + * Marq options definition + */ +typedef enum libvlc_video_marquee_option_t { + libvlc_marquee_Enable = 0, + libvlc_marquee_Text, /** string argument */ + libvlc_marquee_Color, + libvlc_marquee_Opacity, + libvlc_marquee_Position, + libvlc_marquee_Refresh, + libvlc_marquee_Size, + libvlc_marquee_Timeout, + libvlc_marquee_X, + libvlc_marquee_Y +} libvlc_video_marquee_option_t; + +/** + * Navigation mode + */ +typedef enum libvlc_navigate_mode_t +{ + libvlc_navigate_activate = 0, + libvlc_navigate_up, + libvlc_navigate_down, + libvlc_navigate_left, + libvlc_navigate_right +} libvlc_navigate_mode_t; + +/** + * Enumeration of values used to set position (e.g. of video title). + */ +typedef enum libvlc_position_t { + libvlc_position_disable=-1, + libvlc_position_center, + libvlc_position_left, + libvlc_position_right, + libvlc_position_top, + libvlc_position_top_left, + libvlc_position_top_right, + libvlc_position_bottom, + libvlc_position_bottom_left, + libvlc_position_bottom_right +} libvlc_position_t; + +/** + * Opaque equalizer handle. + * + * Equalizer settings can be applied to a media player. + */ +typedef struct libvlc_equalizer_t libvlc_equalizer_t; + +/** + * Create an empty Media Player object + * + * \param p_libvlc_instance the libvlc instance in which the Media Player + * should be created. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new( libvlc_instance_t *p_libvlc_instance ); + +/** + * Create a Media Player object from a Media + * + * \param p_md the media. Afterwards the p_md can be safely + * destroyed. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new_from_media( libvlc_media_t *p_md ); + +/** + * Release a media_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mi the Media Player to free + */ +LIBVLC_API void libvlc_media_player_release( libvlc_media_player_t *p_mi ); + +/** + * Retain a reference to a media player object. Use + * libvlc_media_player_release() to decrement reference count. + * + * \param p_mi media player object + */ +LIBVLC_API void libvlc_media_player_retain( libvlc_media_player_t *p_mi ); + +/** + * Set the media that will be used by the media_player. If any, + * previous md will be released. + * + * \param p_mi the Media Player + * \param p_md the Media. Afterwards the p_md can be safely + * destroyed. + */ +LIBVLC_API void libvlc_media_player_set_media( libvlc_media_player_t *p_mi, + libvlc_media_t *p_md ); + +/** + * Get the media used by the media_player. + * + * \param p_mi the Media Player + * \return the media associated with p_mi, or NULL if no + * media is associated + */ +LIBVLC_API libvlc_media_t * libvlc_media_player_get_media( libvlc_media_player_t *p_mi ); + +/** + * Get the Event Manager from which the media player send event. + * + * \param p_mi the Media Player + * \return the event manager associated with p_mi + */ +LIBVLC_API libvlc_event_manager_t * libvlc_media_player_event_manager ( libvlc_media_player_t *p_mi ); + +/** + * is_playing + * + * \param p_mi the Media Player + * \return 1 if the media player is playing, 0 otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_playing ( libvlc_media_player_t *p_mi ); + +/** + * Play + * + * \param p_mi the Media Player + * \return 0 if playback started (and was already started), or -1 on error. + */ +LIBVLC_API int libvlc_media_player_play ( libvlc_media_player_t *p_mi ); + +/** + * Pause or resume (no effect if there is no media) + * + * \param mp the Media Player + * \param do_pause play/resume if zero, pause if non-zero + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API void libvlc_media_player_set_pause ( libvlc_media_player_t *mp, + int do_pause ); + +/** + * Toggle pause (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_pause ( libvlc_media_player_t *p_mi ); + +/** + * Stop (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_stop ( libvlc_media_player_t *p_mi ); + +/** + * Callback prototype to allocate and lock a picture buffer. + * + * Whenever a new video frame needs to be decoded, the lock callback is + * invoked. Depending on the video chroma, one or three pixel planes of + * adequate dimensions must be returned via the second parameter. Those + * planes must be aligned on 32-bytes boundaries. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param planes start address of the pixel planes (LibVLC allocates the array + * of void pointers, this callback must initialize the array) [OUT] + * \return a private pointer for the display and unlock callbacks to identify + * the picture buffers + */ +typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes); + +/** + * Callback prototype to unlock a picture buffer. + * + * When the video frame decoding is complete, the unlock callback is invoked. + * This callback might not be needed at all. It is only an indication that the + * application can now read the pixel values if it needs to. + * + * \warning A picture buffer is unlocked after the picture is decoded, + * but before the picture is displayed. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + * \param planes pixel planes as defined by the @ref libvlc_video_lock_cb + * callback (this parameter is only for convenience) [IN] + */ +typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture, + void *const *planes); + +/** + * Callback prototype to display a picture. + * + * When the video frame needs to be shown, as determined by the media playback + * clock, the display callback is invoked. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + */ +typedef void (*libvlc_video_display_cb)(void *opaque, void *picture); + +/** + * Callback prototype to configure picture buffers format. + * This callback gets the format of the video as output by the video decoder + * and the chain of video filters (if any). It can opt to change any parameter + * as it needs. In that case, LibVLC will attempt to convert the video format + * (rescaling and chroma conversion) but these operations can be CPU intensive. + * + * \param opaque pointer to the private pointer passed to + * libvlc_video_set_callbacks() [IN/OUT] + * \param chroma pointer to the 4 bytes video format identifier [IN/OUT] + * \param width pointer to the pixel width [IN/OUT] + * \param height pointer to the pixel height [IN/OUT] + * \param pitches table of scanline pitches in bytes for each pixel plane + * (the table is allocated by LibVLC) [OUT] + * \param lines table of scanlines count for each plane [OUT] + * \return the number of picture buffers allocated, 0 indicates failure + * + * \note + * For each pixels plane, the scanline pitch must be bigger than or equal to + * the number of bytes per pixel multiplied by the pixel width. + * Similarly, the number of scanlines must be bigger than of equal to + * the pixel height. + * Furthermore, we recommend that pitches and lines be multiple of 32 + * to not break assumption that might be made by various optimizations + * in the video decoders, video filters and/or video converters. + */ +typedef unsigned (*libvlc_video_format_cb)(void **opaque, char *chroma, + unsigned *width, unsigned *height, + unsigned *pitches, + unsigned *lines); + +/** + * Callback prototype to configure picture buffers format. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() + * (and possibly modified by @ref libvlc_video_format_cb) [IN] + */ +typedef void (*libvlc_video_cleanup_cb)(void *opaque); + + +/** + * Set callbacks and private data to render decoded video to a custom area + * in memory. + * Use libvlc_video_set_format() or libvlc_video_set_format_callbacks() + * to configure the decoded format. + * + * \param mp the media player + * \param lock callback to lock video memory (must not be NULL) + * \param unlock callback to unlock video memory (or NULL if not needed) + * \param display callback to display video (or NULL if not needed) + * \param opaque private pointer for the three callbacks (as first parameter) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_video_set_callbacks( libvlc_media_player_t *mp, + libvlc_video_lock_cb lock, + libvlc_video_unlock_cb unlock, + libvlc_video_display_cb display, + void *opaque ); + +/** + * Set decoded video chroma and dimensions. + * This only works in combination with libvlc_video_set_callbacks(), + * and is mutually exclusive with libvlc_video_set_format_callbacks(). + * + * \param mp the media player + * \param chroma a four-characters string identifying the chroma + * (e.g. "RV32" or "YUYV") + * \param width pixel width + * \param height pixel height + * \param pitch line pitch (in bytes) + * \version LibVLC 1.1.1 or later + * \bug All pixel planes are expected to have the same pitch. + * To use the YCbCr color space with chrominance subsampling, + * consider using libvlc_video_set_format_callbacks() instead. + */ +LIBVLC_API +void libvlc_video_set_format( libvlc_media_player_t *mp, const char *chroma, + unsigned width, unsigned height, + unsigned pitch ); + +/** + * Set decoded video chroma and dimensions. This only works in combination with + * libvlc_video_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the video format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_video_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_video_format_cb setup, + libvlc_video_cleanup_cb cleanup ); + +/** + * Set the NSView handler where the media player should render its video output. + * + * Use the vout called "macosx". + * + * The drawable is an NSObject that follow the VLCOpenGLVideoViewEmbedding + * protocol: + * + * @begincode + * \@protocol VLCOpenGLVideoViewEmbedding + * - (void)addVoutSubview:(NSView *)view; + * - (void)removeVoutSubview:(NSView *)view; + * \@end + * @endcode + * + * Or it can be an NSView object. + * + * If you want to use it along with Qt4 see the QMacCocoaViewContainer. Then + * the following code should work: + * @begincode + * { + * NSView *video = [[NSView alloc] init]; + * QMacCocoaViewContainer *container = new QMacCocoaViewContainer(video, parent); + * libvlc_media_player_set_nsobject(mp, video); + * [video release]; + * } + * @endcode + * + * You can find a live example in VLCVideoView in VLCKit.framework. + * + * \param p_mi the Media Player + * \param drawable the drawable that is either an NSView or an object following + * the VLCOpenGLVideoViewEmbedding protocol. + */ +LIBVLC_API void libvlc_media_player_set_nsobject ( libvlc_media_player_t *p_mi, void * drawable ); + +/** + * Get the NSView handler previously set with libvlc_media_player_set_nsobject(). + * + * \param p_mi the Media Player + * \return the NSView handler or 0 if none where set + */ +LIBVLC_API void * libvlc_media_player_get_nsobject ( libvlc_media_player_t *p_mi ); + +/** + * Set the agl handler where the media player should render its video output. + * + * \param p_mi the Media Player + * \param drawable the agl handler + */ +LIBVLC_API void libvlc_media_player_set_agl ( libvlc_media_player_t *p_mi, uint32_t drawable ); + +/** + * Get the agl handler previously set with libvlc_media_player_set_agl(). + * + * \param p_mi the Media Player + * \return the agl handler or 0 if none where set + */ +LIBVLC_API uint32_t libvlc_media_player_get_agl ( libvlc_media_player_t *p_mi ); + +/** + * Set an X Window System drawable where the media player should render its + * video output. If LibVLC was built without X11 output support, then this has + * no effects. + * + * The specified identifier must correspond to an existing Input/Output class + * X11 window. Pixmaps are not supported. The caller shall ensure that + * the X11 server is the same as the one the VLC instance has been configured + * with. This function must be called before video playback is started; + * otherwise it will only take effect after playback stop and restart. + * + * \param p_mi the Media Player + * \param drawable the ID of the X window + */ +LIBVLC_API void libvlc_media_player_set_xwindow ( libvlc_media_player_t *p_mi, uint32_t drawable ); + +/** + * Get the X Window System window identifier previously set with + * libvlc_media_player_set_xwindow(). Note that this will return the identifier + * even if VLC is not currently using it (for instance if it is playing an + * audio-only input). + * + * \param p_mi the Media Player + * \return an X window ID, or 0 if none where set. + */ +LIBVLC_API uint32_t libvlc_media_player_get_xwindow ( libvlc_media_player_t *p_mi ); + +/** + * Set a Win32/Win64 API window handle (HWND) where the media player should + * render its video output. If LibVLC was built without Win32/Win64 API output + * support, then this has no effects. + * + * \param p_mi the Media Player + * \param drawable windows handle of the drawable + */ +LIBVLC_API void libvlc_media_player_set_hwnd ( libvlc_media_player_t *p_mi, void *drawable ); + +/** + * Get the Windows API window handle (HWND) previously set with + * libvlc_media_player_set_hwnd(). The handle will be returned even if LibVLC + * is not currently outputting any video to it. + * + * \param p_mi the Media Player + * \return a window handle or NULL if there are none. + */ +LIBVLC_API void *libvlc_media_player_get_hwnd ( libvlc_media_player_t *p_mi ); + +/** + * Callback prototype for audio playback. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param samples pointer to the first audio sample to play back [IN] + * \param count number of audio samples to play back + * \param pts expected play time stamp (see libvlc_delay()) + */ +typedef void (*libvlc_audio_play_cb)(void *data, const void *samples, + unsigned count, int64_t pts); + +/** + * Callback prototype for audio pause. + * \note The pause callback is never called if the audio is already paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the pause request (should be elapsed already) + */ +typedef void (*libvlc_audio_pause_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio resumption (i.e. restart from pause). + * \note The resume callback is never called if the audio is not paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the resumption request (should be elapsed already) + */ +typedef void (*libvlc_audio_resume_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer flush + * (i.e. discard all pending buffers and stop playback as soon as possible). + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_flush_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer drain + * (i.e. wait for pending buffers to be played). + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_drain_cb)(void *data); + +/** + * Callback prototype for audio volume change. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param volume software volume (1. = nominal, 0. = mute) + * \param mute muted flag + */ +typedef void (*libvlc_audio_set_volume_cb)(void *data, + float volume, bool mute); + +/** + * Set callbacks and private data for decoded audio. + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \param mp the media player + * \param play callback to play audio samples (must not be NULL) + * \param pause callback to pause playback (or NULL to ignore) + * \param resume callback to resume playback (or NULL to ignore) + * \param flush callback to flush audio buffers (or NULL to ignore) + * \param drain callback to drain audio buffers (or NULL to ignore) + * \param opaque private pointer for the audio callbacks (as first parameter) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_callbacks( libvlc_media_player_t *mp, + libvlc_audio_play_cb play, + libvlc_audio_pause_cb pause, + libvlc_audio_resume_cb resume, + libvlc_audio_flush_cb flush, + libvlc_audio_drain_cb drain, + void *opaque ); + +/** + * Set callbacks and private data for decoded audio. This only works in + * combination with libvlc_audio_set_callbacks(). + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \param mp the media player + * \param set_volume callback to apply audio volume, + * or NULL to apply volume in software + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_volume_callback( libvlc_media_player_t *mp, + libvlc_audio_set_volume_cb set_volume ); + +/** + * Callback prototype to setup the audio playback. + * This is called when the media player needs to create a new audio output. + * \param opaque pointer to the data pointer passed to + * libvlc_audio_set_callbacks() [IN/OUT] + * \param format 4 bytes sample format [IN/OUT] + * \param rate sample rate [IN/OUT] + * \param channels channels count [IN/OUT] + * \return 0 on success, anything else to skip audio playback + */ +typedef int (*libvlc_audio_setup_cb)(void **data, char *format, unsigned *rate, + unsigned *channels); + +/** + * Callback prototype for audio playback cleanup. + * This is called when the media player no longer needs an audio output. + * \param opaque data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_cleanup_cb)(void *data); + +/** + * Set decoded audio format. This only works in combination with + * libvlc_audio_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the audio format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_audio_setup_cb setup, + libvlc_audio_cleanup_cb cleanup ); + +/** + * Set decoded audio format. + * This only works in combination with libvlc_audio_set_callbacks(), + * and is mutually exclusive with libvlc_audio_set_format_callbacks(). + * + * \param mp the media player + * \param format a four-characters string identifying the sample format + * (e.g. "S16N" or "FL32") + * \param rate sample rate (expressed in Hz) + * \param channels channels count + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format( libvlc_media_player_t *mp, const char *format, + unsigned rate, unsigned channels ); + +/** \bug This might go away ... to be replaced by a broader system */ + +/** + * Get the current movie length (in ms). + * + * \param p_mi the Media Player + * \return the movie length (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_length( libvlc_media_player_t *p_mi ); + +/** + * Get the current movie time (in ms). + * + * \param p_mi the Media Player + * \return the movie time (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi ); + +/** + * Set the movie time (in ms). This has no effect if no media is being played. + * Not all formats and protocols support this. + * + * \param p_mi the Media Player + * \param i_time the movie time (in ms). + */ +LIBVLC_API void libvlc_media_player_set_time( libvlc_media_player_t *p_mi, libvlc_time_t i_time ); + +/** + * Get movie position as percentage between 0.0 and 1.0. + * + * \param p_mi the Media Player + * \return movie position, or -1. in case of error + */ +LIBVLC_API float libvlc_media_player_get_position( libvlc_media_player_t *p_mi ); + +/** + * Set movie position as percentage between 0.0 and 1.0. + * This has no effect if playback is not enabled. + * This might not work depending on the underlying input format and protocol. + * + * \param p_mi the Media Player + * \param f_pos the position + */ +LIBVLC_API void libvlc_media_player_set_position( libvlc_media_player_t *p_mi, float f_pos ); + +/** + * Set movie chapter (if applicable). + * + * \param p_mi the Media Player + * \param i_chapter chapter number to play + */ +LIBVLC_API void libvlc_media_player_set_chapter( libvlc_media_player_t *p_mi, int i_chapter ); + +/** + * Get movie chapter. + * + * \param p_mi the Media Player + * \return chapter number currently playing, or -1 if there is no media. + */ +LIBVLC_API int libvlc_media_player_get_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get movie chapter count + * + * \param p_mi the Media Player + * \return number of chapters in movie, or -1. + */ +LIBVLC_API int libvlc_media_player_get_chapter_count( libvlc_media_player_t *p_mi ); + +/** + * Is the player able to play + * + * \param p_mi the Media Player + * \return boolean + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_will_play( libvlc_media_player_t *p_mi ); + +/** + * Get title chapter count + * + * \param p_mi the Media Player + * \param i_title title + * \return number of chapters in title, or -1 + */ +LIBVLC_API int libvlc_media_player_get_chapter_count_for_title( + libvlc_media_player_t *p_mi, int i_title ); + +/** + * Set movie title + * + * \param p_mi the Media Player + * \param i_title title number to play + */ +LIBVLC_API void libvlc_media_player_set_title( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Get movie title + * + * \param p_mi the Media Player + * \return title number currently playing, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title( libvlc_media_player_t *p_mi ); + +/** + * Get movie title count + * + * \param p_mi the Media Player + * \return title number count, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title_count( libvlc_media_player_t *p_mi ); + +/** + * Set previous chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_previous_chapter( libvlc_media_player_t *p_mi ); + +/** + * Set next chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_next_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get the requested movie play rate. + * @warning Depending on the underlying media, the requested rate may be + * different from the real playback rate. + * + * \param p_mi the Media Player + * \return movie play rate + */ +LIBVLC_API float libvlc_media_player_get_rate( libvlc_media_player_t *p_mi ); + +/** + * Set movie play rate + * + * \param p_mi the Media Player + * \param rate movie play rate to set + * \return -1 if an error was detected, 0 otherwise (but even then, it might + * not actually work depending on the underlying media protocol) + */ +LIBVLC_API int libvlc_media_player_set_rate( libvlc_media_player_t *p_mi, float rate ); + +/** + * Get current movie state + * + * \param p_mi the Media Player + * \return the current state of the media player (playing, paused, ...) \see libvlc_state_t + */ +LIBVLC_API libvlc_state_t libvlc_media_player_get_state( libvlc_media_player_t *p_mi ); + +/** + * Get movie fps rate + * + * \param p_mi the Media Player + * \return frames per second (fps) for this playing movie, or 0 if unspecified + */ +LIBVLC_API float libvlc_media_player_get_fps( libvlc_media_player_t *p_mi ); + +/** end bug */ + +/** + * How many video outputs does this media player have? + * + * \param p_mi the media player + * \return the number of video outputs + */ +LIBVLC_API unsigned libvlc_media_player_has_vout( libvlc_media_player_t *p_mi ); + +/** + * Is this media player seekable? + * + * \param p_mi the media player + * \return true if the media player can seek + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_seekable( libvlc_media_player_t *p_mi ); + +/** + * Can this media player be paused? + * + * \param p_mi the media player + * \return true if the media player can pause + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi ); + +/** + * Check if the current program is scrambled + * + * \param p_mi the media player + * \return true if the current program is scrambled + * + * \libvlc_return_bool + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_program_scrambled( libvlc_media_player_t *p_mi ); + +/** + * Display the next frame (if supported) + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_media_player_next_frame( libvlc_media_player_t *p_mi ); + +/** + * Navigate through DVD Menu + * + * \param p_mi the Media Player + * \param navigate the Navigation mode + * \version libVLC 2.0.0 or later + */ +LIBVLC_API void libvlc_media_player_navigate( libvlc_media_player_t* p_mi, + unsigned navigate ); + +/** + * Set if, and how, the video title will be shown when media is played. + * + * \param p_mi the media player + * \param position position at which to display the title, or libvlc_position_disable to prevent the title from being displayed + * \param timeout title display timeout in milliseconds (ignored if libvlc_position_disable) + * \version libVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_media_player_set_video_title_display( libvlc_media_player_t *p_mi, libvlc_position_t position, unsigned int timeout ); + +/** + * Release (free) libvlc_track_description_t + * + * \param p_track_description the structure to release + */ +LIBVLC_API void libvlc_track_description_list_release( libvlc_track_description_t *p_track_description ); + +/** + * \deprecated Use libvlc_track_description_list_release instead + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_track_description_release( libvlc_track_description_t *p_track_description ); + +/** \defgroup libvlc_video LibVLC video controls + * @{ + */ + +/** + * Toggle fullscreen status on non-embedded video outputs. + * + * @warning The same limitations applies to this function + * as to libvlc_set_fullscreen(). + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_toggle_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable fullscreen. + * + * @warning With most window managers, only a top-level windows can be in + * full-screen mode. Hence, this function will not operate properly if + * libvlc_media_player_set_xwindow() was used to embed the video in a + * non-top-level window. In that case, the embedding window must be reparented + * to the root window before fullscreen mode is enabled. You will want + * to reparent it back to its normal parent when disabling fullscreen. + * + * \param p_mi the media player + * \param b_fullscreen boolean for fullscreen status + */ +LIBVLC_API void libvlc_set_fullscreen( libvlc_media_player_t *p_mi, int b_fullscreen ); + +/** + * Get current fullscreen status. + * + * \param p_mi the media player + * \return the fullscreen status (boolean) + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_get_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable key press events handling, according to the LibVLC hotkeys + * configuration. By default and for historical reasons, keyboard events are + * handled by the LibVLC video widget. + * + * \note On X11, there can be only one subscriber for key press and mouse + * click events per window. If your application has subscribed to those events + * for the X window ID of the video widget, then LibVLC will not be able to + * handle key presses and mouse clicks in any case. + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle key press events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_key_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Enable or disable mouse click events handling. By default, those events are + * handled. This is needed for DVD menus to work, as well as a few video + * filters such as "puzzle". + * + * \see libvlc_video_set_key_input(). + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle mouse click events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_mouse_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Get the pixel dimensions of a video. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the pixel width [OUT] + * \param py pointer to get the pixel height [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_size( libvlc_media_player_t *p_mi, unsigned num, + unsigned *px, unsigned *py ); + +/** + * Get current video height. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel height or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_height( libvlc_media_player_t *p_mi ); + +/** + * Get current video width. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel width or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_width( libvlc_media_player_t *p_mi ); + +/** + * Get the mouse pointer coordinates over a video. + * Coordinates are expressed in terms of the decoded video resolution, + * not in terms of pixels on the screen/viewport (to get the latter, + * you can query your windowing system directly). + * + * Either of the coordinates may be negative or larger than the corresponding + * dimension of the video, if the cursor is outside the rendering area. + * + * @warning The coordinates may be out-of-date if the pointer is not located + * on the video rendering area. LibVLC does not track the pointer if it is + * outside of the video widget. + * + * @note LibVLC does not support multiple pointers (it does of course support + * multiple input devices sharing the same pointer) at the moment. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the abscissa [OUT] + * \param py pointer to get the ordinate [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_cursor( libvlc_media_player_t *p_mi, unsigned num, + int *px, int *py ); + +/** + * Get the current video scaling factor. + * See also libvlc_video_set_scale(). + * + * \param p_mi the media player + * \return the currently configured zoom factor, or 0. if the video is set + * to fit to the output window/drawable automatically. + */ +LIBVLC_API float libvlc_video_get_scale( libvlc_media_player_t *p_mi ); + +/** + * Set the video scaling factor. That is the ratio of the number of pixels on + * screen to the number of pixels in the original decoded video in each + * dimension. Zero is a special value; it will adjust the video to the output + * window/drawable (in windowed mode) or the entire screen. + * + * Note that not all video outputs support scaling. + * + * \param p_mi the media player + * \param f_factor the scaling factor, or zero + */ +LIBVLC_API void libvlc_video_set_scale( libvlc_media_player_t *p_mi, float f_factor ); + +/** + * Get current video aspect ratio. + * + * \param p_mi the media player + * \return the video aspect ratio or NULL if unspecified + * (the result must be released with free() or libvlc_free()). + */ +LIBVLC_API char *libvlc_video_get_aspect_ratio( libvlc_media_player_t *p_mi ); + +/** + * Set new video aspect ratio. + * + * \param p_mi the media player + * \param psz_aspect new video aspect-ratio or NULL to reset to default + * \note Invalid aspect ratios are ignored. + */ +LIBVLC_API void libvlc_video_set_aspect_ratio( libvlc_media_player_t *p_mi, const char *psz_aspect ); + +/** + * Get current video subtitle. + * + * \param p_mi the media player + * \return the video subtitle selected, or -1 if none + */ +LIBVLC_API int libvlc_video_get_spu( libvlc_media_player_t *p_mi ); + +/** + * Get the number of available video subtitles. + * + * \param p_mi the media player + * \return the number of available video subtitles + */ +LIBVLC_API int libvlc_video_get_spu_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video subtitles. + * + * \param p_mi the media player + * \return list containing description of available video subtitles + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_spu_description( libvlc_media_player_t *p_mi ); + +/** + * Set new video subtitle. + * + * \param p_mi the media player + * \param i_spu video subtitle track to select (i_id from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API int libvlc_video_set_spu( libvlc_media_player_t *p_mi, int i_spu ); + +/** + * Set new video subtitle file. + * + * \param p_mi the media player + * \param psz_subtitle new video subtitle file + * \return the success status (boolean) + */ +LIBVLC_API int libvlc_video_set_subtitle_file( libvlc_media_player_t *p_mi, const char *psz_subtitle ); + +/** + * Get the current subtitle delay. Positive values means subtitles are being + * displayed later, negative values earlier. + * + * \param p_mi media player + * \return time (in microseconds) the display of subtitles is being delayed + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int64_t libvlc_video_get_spu_delay( libvlc_media_player_t *p_mi ); + +/** + * Set the subtitle delay. This affects the timing of when the subtitle will + * be displayed. Positive values result in subtitles being displayed later, + * while negative values will result in subtitles being displayed earlier. + * + * The subtitle delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay time (in microseconds) the display of subtitles should be delayed + * \return 0 on success, -1 on error + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int libvlc_video_set_spu_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the description of available titles. + * + * \param p_mi the media player + * \return list containing description of available titles + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_title_description( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available chapters for specific title. + * + * \param p_mi the media player + * \param i_title selected title + * \return list containing description of available chapter for title i_title + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_chapter_description( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Get current crop filter geometry. + * + * \param p_mi the media player + * \return the crop filter geometry or NULL if unset + */ +LIBVLC_API char *libvlc_video_get_crop_geometry( libvlc_media_player_t *p_mi ); + +/** + * Set new crop filter geometry. + * + * \param p_mi the media player + * \param psz_geometry new crop filter geometry (NULL to unset) + */ +LIBVLC_API +void libvlc_video_set_crop_geometry( libvlc_media_player_t *p_mi, const char *psz_geometry ); + +/** + * Get current teletext page requested. + * + * \param p_mi the media player + * \return the current teletext page requested. + */ +LIBVLC_API int libvlc_video_get_teletext( libvlc_media_player_t *p_mi ); + +/** + * Set new teletext page to retrieve. + * + * \param p_mi the media player + * \param i_page teletex page number requested + */ +LIBVLC_API void libvlc_video_set_teletext( libvlc_media_player_t *p_mi, int i_page ); + +/** + * Toggle teletext transparent status on video output. + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_toggle_teletext( libvlc_media_player_t *p_mi ); + +/** + * Get number of available video tracks. + * + * \param p_mi media player + * \return the number of available video tracks (int) + */ +LIBVLC_API int libvlc_video_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video tracks. + * + * \param p_mi media player + * \return list with description of available video tracks, or NULL on error + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current video track. + * + * \param p_mi media player + * \return the video track ID (int) or -1 if no active input + */ +LIBVLC_API int libvlc_video_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set video track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API +int libvlc_video_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Take a snapshot of the current video window. + * + * If i_width AND i_height is 0, original size is used. + * If i_width XOR i_height is 0, original aspect-ratio is preserved. + * + * \param p_mi media player instance + * \param num number of video output (typically 0 for the first/only one) + * \param psz_filepath the path where to save the screenshot to + * \param i_width the snapshot's width + * \param i_height the snapshot's height + * \return 0 on success, -1 if the video was not found + */ +LIBVLC_API +int libvlc_video_take_snapshot( libvlc_media_player_t *p_mi, unsigned num, + const char *psz_filepath, unsigned int i_width, + unsigned int i_height ); + +/** + * Enable or disable deinterlace filter + * + * \param p_mi libvlc media player + * \param psz_mode type of deinterlace filter, NULL to disable + */ +LIBVLC_API void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi, + const char *psz_mode ); + +/** + * Get an integer marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_int_option_t + */ +LIBVLC_API int libvlc_video_get_marquee_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Get a string marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_string_option_t + */ +LIBVLC_API char *libvlc_video_get_marquee_string( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Enable, disable or set an integer marquee option + * + * Setting libvlc_marquee_Enable has the side effect of enabling (arg !0) + * or disabling (arg 0) the marq filter. + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_int_option_t + * \param i_val marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_int( libvlc_media_player_t *p_mi, + unsigned option, int i_val ); + +/** + * Set a marquee string option + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_string_option_t + * \param psz_text marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_text ); + +/** option values for libvlc_video_{get,set}_logo_{int,string} */ +enum libvlc_video_logo_option_t { + libvlc_logo_enable, + libvlc_logo_file, /**< string argument, "file,d,t;file,d,t;..." */ + libvlc_logo_x, + libvlc_logo_y, + libvlc_logo_delay, + libvlc_logo_repeat, + libvlc_logo_opacity, + libvlc_logo_position +}; + +/** + * Get integer logo option. + * + * \param p_mi libvlc media player instance + * \param option logo option to get, values of libvlc_video_logo_option_t + */ +LIBVLC_API int libvlc_video_get_logo_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set logo option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_logo_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the logo filter. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Set logo option as string. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param psz_value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_value ); + + +/** option values for libvlc_video_{get,set}_adjust_{int,float,bool} */ +enum libvlc_video_adjust_option_t { + libvlc_adjust_Enable = 0, + libvlc_adjust_Contrast, + libvlc_adjust_Brightness, + libvlc_adjust_Hue, + libvlc_adjust_Saturation, + libvlc_adjust_Gamma +}; + +/** + * Get integer adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API int libvlc_video_get_adjust_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_adjust_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the adjust filter. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Get float adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as float. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, + unsigned option, float value ); + +/** @} video */ + +/** \defgroup libvlc_audio LibVLC audio controls + * @{ + */ + +/** + * Audio device types + */ +typedef enum libvlc_audio_output_device_types_t { + libvlc_AudioOutputDevice_Error = -1, + libvlc_AudioOutputDevice_Mono = 1, + libvlc_AudioOutputDevice_Stereo = 2, + libvlc_AudioOutputDevice_2F2R = 4, + libvlc_AudioOutputDevice_3F2R = 5, + libvlc_AudioOutputDevice_5_1 = 6, + libvlc_AudioOutputDevice_6_1 = 7, + libvlc_AudioOutputDevice_7_1 = 8, + libvlc_AudioOutputDevice_SPDIF = 10 +} libvlc_audio_output_device_types_t; + +/** + * Audio channels + */ +typedef enum libvlc_audio_output_channel_t { + libvlc_AudioChannel_Error = -1, + libvlc_AudioChannel_Stereo = 1, + libvlc_AudioChannel_RStereo = 2, + libvlc_AudioChannel_Left = 3, + libvlc_AudioChannel_Right = 4, + libvlc_AudioChannel_Dolbys = 5 +} libvlc_audio_output_channel_t; + + +/** + * Gets the list of available audio output modules. + * + * \param p_instance libvlc instance + * \return list of available audio outputs. It must be freed it with +* \see libvlc_audio_output_list_release \see libvlc_audio_output_t . + * In case of error, NULL is returned. + */ +LIBVLC_API libvlc_audio_output_t * +libvlc_audio_output_list_get( libvlc_instance_t *p_instance ); + +/** + * Frees the list of available audio output modules. + * + * \param p_list list with audio outputs for release + */ +LIBVLC_API +void libvlc_audio_output_list_release( libvlc_audio_output_t *p_list ); + +/** + * Selects an audio output module. + * \note Any change will take be effect only after playback is stopped and + * restarted. Audio output cannot be changed while playing. + * + * \param p_mi media player + * \param psz_name name of audio output, + * use psz_name of \see libvlc_audio_output_t + * \return 0 if function succeded, -1 on error + */ +LIBVLC_API int libvlc_audio_output_set( libvlc_media_player_t *p_mi, + const char *psz_name ); + +/** + * Backward compatibility stub. Do not use in new code. + * Use libvlc_audio_output_device_list_get() instead. + * \return always 0. + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_audio_output_device_count( libvlc_instance_t *, const char * ); + +/** + * Backward compatibility stub. Do not use in new code. + * Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_longname( libvlc_instance_t *, const char *, + int ); + +/** + * Backward compatibility stub. Do not use in new code. + * Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_id( libvlc_instance_t *, const char *, int ); + +/** + * Gets a list of potential audio output devices, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support enumerating devices. + * The audio output may be functional even if the list is empty (NULL). + * + * \note The list may not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param mp media player + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed it with libvlc_audio_output_device_list_release() + * \version LibVLC 2.2.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_enum( libvlc_media_player_t *mp ); + +/** + * Gets a list of audio output devices for a given audio output module, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support this. In particular, an empty (NULL) + * list of devices does not imply that the specified audio output does + * not work. + * + * \note The list might not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param p_instance libvlc instance + * \param psz_aout audio output name + * (as returned by libvlc_audio_output_list_get()) + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed it with libvlc_audio_output_device_list_release() + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_list_get( libvlc_instance_t *p_instance, + const char *aout ); + +/** + * Frees a list of available audio output devices. + * + * \param p_list list with audio outputs for release + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API void libvlc_audio_output_device_list_release( + libvlc_audio_output_device_t *p_list ); + +/** + * Configures an explicit audio output device. + * + * If the module paramater is NULL, audio output will be moved to the device + * specified by the device identifier string immediately. This is the + * recommended usage. + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_enum(). + * + * However passing NULL is supported in LibVLC version 2.2.0 and later only; + * in earlier versions, this function would have no effects when the module + * parameter was NULL. + * + * If the module parameter is not NULL, the device parameter of the + * corresponding audio output, if it exists, will be set to the specified + * string. Note that some audio output modules do not have such a parameter + * (notably MMDevice and PulseAudio). + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_list_get(). + * + * \note This function does not select the specified audio output plugin. + * libvlc_audio_output_set() is used for that purpose. + * + * \warning The syntax for the device parameter depends on the audio output. + * + * Some audio output modules require further parameters (e.g. a channels map + * in the case of ALSA). + * + * \param mp media player + * \param module If NULL, current audio output module. + * if non-NULL, name of audio output module + (\see libvlc_audio_output_t) + * \param device_id device identifier string + * \return Nothing. Errors are ignored (this is a design bug). + */ +LIBVLC_API void libvlc_audio_output_device_set( libvlc_media_player_t *mp, + const char *module, + const char *device_id ); + +/** + * Stub for backward compatibility. + * \return always -1. + */ +LIBVLC_DEPRECATED +LIBVLC_API int libvlc_audio_output_get_device_type( libvlc_media_player_t *p_mi ); + +/** + * Stub for backward compatibility. + */ +LIBVLC_DEPRECATED +LIBVLC_API void libvlc_audio_output_set_device_type( libvlc_media_player_t *, + int ); + + +/** + * Toggle mute status. + * + * \param p_mi media player + * \warning Toggling mute atomically is not always possible: On some platforms, + * other processes can mute the VLC audio playback stream asynchronously. Thus, + * there is a small race condition where toggling will not work. + * See also the limitations of libvlc_audio_set_mute(). + */ +LIBVLC_API void libvlc_audio_toggle_mute( libvlc_media_player_t *p_mi ); + +/** + * Get current mute status. + * + * \param p_mi media player + * \return the mute status (boolean) if defined, -1 if undefined/unapplicable + */ +LIBVLC_API int libvlc_audio_get_mute( libvlc_media_player_t *p_mi ); + +/** + * Set mute status. + * + * \param p_mi media player + * \param status If status is true then mute, otherwise unmute + * \warning This function does not always work. If there are no active audio + * playback stream, the mute status might not be available. If digital + * pass-through (S/PDIF, HDMI...) is in use, muting may be unapplicable. Also + * some audio output plugins do not support muting at all. + * \note To force silent playback, disable all audio tracks. This is more + * efficient and reliable than mute. + */ +LIBVLC_API void libvlc_audio_set_mute( libvlc_media_player_t *p_mi, int status ); + +/** + * Get current software audio volume. + * + * \param p_mi media player + * \return the software volume in percents + * (0 = mute, 100 = nominal / 0dB) + */ +LIBVLC_API int libvlc_audio_get_volume( libvlc_media_player_t *p_mi ); + +/** + * Set current software audio volume. + * + * \param p_mi media player + * \param i_volume the volume in percents (0 = mute, 100 = 0dB) + * \return 0 if the volume was set, -1 if it was out of range + */ +LIBVLC_API int libvlc_audio_set_volume( libvlc_media_player_t *p_mi, int i_volume ); + +/** + * Get number of available audio tracks. + * + * \param p_mi media player + * \return the number of available audio tracks (int), or -1 if unavailable + */ +LIBVLC_API int libvlc_audio_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available audio tracks. + * + * \param p_mi media player + * \return list with description of available audio tracks, or NULL + */ +LIBVLC_API libvlc_track_description_t * + libvlc_audio_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current audio track. + * + * \param p_mi media player + * \return the audio track ID or -1 if no active input. + */ +LIBVLC_API int libvlc_audio_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set current audio track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Get current audio channel. + * + * \param p_mi media player + * \return the audio channel \see libvlc_audio_output_channel_t + */ +LIBVLC_API int libvlc_audio_get_channel( libvlc_media_player_t *p_mi ); + +/** + * Set current audio channel. + * + * \param p_mi media player + * \param channel the audio channel, \see libvlc_audio_output_channel_t + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_channel( libvlc_media_player_t *p_mi, int channel ); + +/** + * Get current audio delay. + * + * \param p_mi media player + * \return the audio delay (microseconds) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int64_t libvlc_audio_get_delay( libvlc_media_player_t *p_mi ); + +/** + * Set current audio delay. The audio delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay the audio delay (microseconds) + * \return 0 on success, -1 on error + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int libvlc_audio_set_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the number of equalizer presets. + * + * \return number of presets + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_preset_count( void ); + +/** + * Get the name of a particular equalizer preset. + * + * This name can be used, for example, to prepare a preset label or menu in a user + * interface. + * + * \param u_index index of the preset, counting from zero + * \return preset name, or NULL if there is no such preset + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API const char *libvlc_audio_equalizer_get_preset_name( unsigned u_index ); + +/** + * Get the number of distinct frequency bands for an equalizer. + * + * \return number of frequency bands + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_band_count( void ); + +/** + * Get a particular equalizer band frequency. + * + * This value can be used, for example, to create a label for an equalizer band control + * in a user interface. + * + * \param u_index index of the band, counting from zero + * \return equalizer band frequency (Hz), or -1 if there is no such band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_band_frequency( unsigned u_index ); + +/** + * Create a new default equalizer, with all frequency values zeroed. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new( void ); + +/** + * Create a new equalizer, with initial frequency values copied from an existing + * preset. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \param u_index index of the preset, counting from zero + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new_from_preset( unsigned u_index ); + +/** + * Release a previously created equalizer instance. + * + * The equalizer was previously created by using libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is safe to invoke this method with a NULL p_equalizer parameter for no effect. + * + * \param p_equalizer opaque equalizer handle, or NULL + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API void libvlc_audio_equalizer_release( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new pre-amplification value for an equalizer. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_preamp preamp value (-20.0 to 20.0 Hz) + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_preamp( libvlc_equalizer_t *p_equalizer, float f_preamp ); + +/** + * Get the current pre-amplification value from an equalizer. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \return preamp value (Hz) + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_preamp( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new amplification value for a particular equalizer frequency band. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_amp amplification value (-20.0 to 20.0 Hz) + * \param u_band index, counting from zero, of the frequency band to set + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_amp_at_index( libvlc_equalizer_t *p_equalizer, float f_amp, unsigned u_band ); + +/** + * Get the amplification value for a particular equalizer frequency band. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param u_band index, counting from zero, of the frequency band to get + * \return amplification value (Hz); NaN if there is no such frequency band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_amp_at_index( libvlc_equalizer_t *p_equalizer, unsigned u_band ); + +/** + * Apply new equalizer settings to a media player. + * + * The equalizer is first created by invoking libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is possible to apply new equalizer settings to a media player whether the media + * player is currently playing media or not. + * + * Invoking this method will immediately apply the new equalizer settings to the audio + * output of the currently playing media if there is any. + * + * If there is no currently playing media, the new equalizer settings will be applied + * later if and when new media is played. + * + * Equalizer settings will automatically be applied to subsequently played media. + * + * To disable the equalizer for a media player invoke this method passing NULL for the + * p_equalizer parameter. + * + * The media player does not keep a reference to the supplied equalizer so it is safe + * for an application to release the equalizer reference any time after this method + * returns. + * + * \param p_mi opaque media player handle + * \param p_equalizer opaque equalizer handle, or NULL to disable the equalizer for this media player + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_set_equalizer( libvlc_media_player_t *p_mi, libvlc_equalizer_t *p_equalizer ); + +/** @} audio */ + +/** @} media_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_structures.h b/vlcdemo/vlc/vlc2/include64/libvlc_structures.h new file mode 100644 index 0000000..54cd1fd --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_structures.h @@ -0,0 +1,73 @@ +/***************************************************************************** + * libvlc_structures.h: libvlc_* new external API structures + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id $ + * + * Authors: Filippo Carone + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_STRUCTURES_H +#define LIBVLC_STRUCTURES_H 1 + +/** + * \file + * This file defines libvlc_* new external API structures + */ + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \ingroup libvlc_core + * @{ + */ + +/** This structure is opaque. It represents a libvlc instance */ +typedef struct libvlc_instance_t libvlc_instance_t; + +typedef int64_t libvlc_time_t; + +/**@} */ + +/** + * \ingroup libvlc_log + * @{ + */ + +/** This structure is opaque. It represents a libvlc log iterator */ +typedef struct libvlc_log_iterator_t libvlc_log_iterator_t; + +typedef struct libvlc_log_message_t +{ + int i_severity; /* 0=INFO, 1=ERR, 2=WARN, 3=DBG */ + const char *psz_type; /* module type */ + const char *psz_name; /* module name */ + const char *psz_header; /* optional header */ + const char *psz_message; /* message */ +} libvlc_log_message_t; + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_version.h b/vlcdemo/vlc/vlc2/include64/libvlc_version.h new file mode 100644 index 0000000..9e9294c --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_version.h @@ -0,0 +1,55 @@ +/***************************************************************************** + * libvlc_version.h + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines version macros for LibVLC. + * Those macros are primilarly intended for conditional (pre)compilation. + * To get the run-time LibVLC version, use libvlc_get_version() instead + * (the run-time version may be more recent than build-time one, thanks to + * backward binary compatibility). + * + * \version This header file is available in LibVLC 1.1.4 and higher. + */ + +#ifndef LIBVLC_VERSION_H +# define LIBVLC_VERSION_H 1 + +/** LibVLC major version number */ +# define LIBVLC_VERSION_MAJOR (2) + +/** LibVLC minor version number */ +# define LIBVLC_VERSION_MINOR (2) + +/** LibVLC revision */ +# define LIBVLC_VERSION_REVISION (6) + +# define LIBVLC_VERSION_EXTRA (0) + +/** Makes a single integer from a LibVLC version numbers */ +# define LIBVLC_VERSION(maj,min,rev,extra) \ + ((maj << 24) | (min << 16) | (rev << 8) | (extra)) + +/** LibVLC full version as a single integer (for comparison) */ +# define LIBVLC_VERSION_INT \ + LIBVLC_VERSION(LIBVLC_VERSION_MAJOR, LIBVLC_VERSION_MINOR, \ + LIBVLC_VERSION_REVISION, LIBVLC_VERSION_EXTRA) + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/libvlc_vlm.h b/vlcdemo/vlc/vlc2/include64/libvlc_vlm.h new file mode 100644 index 0000000..20c75f5 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/libvlc_vlm.h @@ -0,0 +1,349 @@ +/***************************************************************************** + * libvlc_vlm.h: libvlc_* new external API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 26e5cbb5ee7968a21520af0b8f553a4a117d4f99 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_VLM_H +#define LIBVLC_VLM_H 1 + +/** + * \file + * This file defines libvlc_vlm_* external API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * VLM + *****************************************************************************/ +/** \defgroup libvlc_vlm LibVLC VLM + * \ingroup libvlc + * @{ + */ + + +/** + * Release the vlm instance related to the given libvlc_instance_t + * + * \param p_instance the instance + */ +LIBVLC_API void libvlc_vlm_release( libvlc_instance_t *p_instance ); + +/** + * Add a broadcast, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const* ppsz_options, + int b_enabled, int b_loop ); + +/** + * Add a vod, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new vod media + * \param psz_input the input MRL + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new vod + * \param psz_mux the muxer of the vod media + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_vod( libvlc_instance_t * p_instance, + const char *psz_name, const char *psz_input, + int i_options, const char * const* ppsz_options, + int b_enabled, const char *psz_mux ); + +/** + * Delete a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to delete + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_del_media( libvlc_instance_t * p_instance, + const char *psz_name ); + +/** + * Enable or disable a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_enabled the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_enabled( libvlc_instance_t *p_instance, + const char *psz_name, int b_enabled ); + +/** + * Set the output for a media. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_output( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_output ); + +/** + * Set a media's input MRL. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Add a media's input MRL. This will add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Set a media's loop status. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_loop the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_loop( libvlc_instance_t *p_instance, + const char *psz_name, + int b_loop ); + +/** + * Set a media's vod muxer. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_mux the new muxer + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_mux( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_mux ); + +/** + * Edit the parameters of a media. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_change_media( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const *ppsz_options, + int b_enabled, int b_loop ); + +/** + * Play the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_play_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Stop the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_stop_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Pause the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_pause_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Seek in the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \param f_percentage the percentage to seek to + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_seek_media( libvlc_instance_t *p_instance, + const char *psz_name, + float f_percentage ); + +/** + * Return information about the named media as a JSON + * string representation. + * + * This function is mainly intended for debugging use, + * if you want programmatic access to the state of + * a vlm_media_instance_t, please use the corresponding + * libvlc_vlm_get_media_instance_xxx -functions. + * Currently there are no such functions available for + * vlm_media_t though. + * + * \param p_instance the instance + * \param psz_name the name of the media, + * if the name is an empty string, all media is described + * \return string with information about named media, or NULL on error + */ +LIBVLC_API const char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Get vlm_media instance position by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return position as float or -1. on error + */ +LIBVLC_API float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance time by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return time as integer or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_time( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance length by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return length of media item or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_length( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance playback rate by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return playback rate or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_rate( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); +#if 0 +/** + * Get vlm_media instance title number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return title as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_title( libvlc_instance_t *, + const char *, int ); + +/** + * Get vlm_media instance chapter number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return chapter as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_chapter( libvlc_instance_t *, + const char *, int ); + +/** + * Is libvlc instance seekable ? + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return 1 if seekable, 0 if not, -1 if media does not exist + */ +LIBVLC_API int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *, + const char *, int ); +#endif +/** + * Get libvlc_event_manager from a vlm media. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_instance a libvlc instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_vlm_get_event_manager( libvlc_instance_t *p_instance ); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_about.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_about.h new file mode 100644 index 0000000..85cf847 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_about.h @@ -0,0 +1,1374 @@ +/* Automatically generated file - DO NOT EDIT */ +static const char psz_license[] = +" GNU GENERAL PUBLIC LICENSE\n" +" Version 2, June 1991\n" +"\n" +" Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" +" Everyone is permitted to copy and distribute verbatim copies\n" +" of this license document, but changing it is not allowed.\n" +"\n" +" Preamble\n" +"\n" +" The licenses for most software are designed to take away your\n" +"freedom to share and change it. By contrast, the GNU General Public\n" +"License is intended to guarantee your freedom to share and change free\n" +"software--to make sure the software is free for all its users. This\n" +"General Public License applies to most of the Free Software\n" +"Foundation's software and to any other program whose authors commit to\n" +"using it. (Some other Free Software Foundation software is covered by\n" +"the GNU Lesser General Public License instead.) You can apply it to\n" +"your programs, too.\n" +"\n" +" When we speak of free software, we are referring to freedom, not\n" +"price. Our General Public Licenses are designed to make sure that you\n" +"have the freedom to distribute copies of free software (and charge for\n" +"this service if you wish), that you receive source code or can get it\n" +"if you want it, that you can change the software or use pieces of it\n" +"in new free programs; and that you know you can do these things.\n" +"\n" +" To protect your rights, we need to make restrictions that forbid\n" +"anyone to deny you these rights or to ask you to surrender the rights.\n" +"These restrictions translate to certain responsibilities for you if you\n" +"distribute copies of the software, or if you modify it.\n" +"\n" +" For example, if you distribute copies of such a program, whether\n" +"gratis or for a fee, you must give the recipients all the rights that\n" +"you have. You must make sure that they, too, receive or can get the\n" +"source code. And you must show them these terms so they know their\n" +"rights.\n" +"\n" +" We protect your rights with two steps: (1) copyright the software, and\n" +"(2) offer you this license which gives you legal permission to copy,\n" +"distribute and/or modify the software.\n" +"\n" +" Also, for each author's protection and ours, we want to make certain\n" +"that everyone understands that there is no warranty for this free\n" +"software. If the software is modified by someone else and passed on, we\n" +"want its recipients to know that what they have is not the original, so\n" +"that any problems introduced by others will not reflect on the original\n" +"authors' reputations.\n" +"\n" +" Finally, any free program is threatened constantly by software\n" +"patents. We wish to avoid the danger that redistributors of a free\n" +"program will individually obtain patent licenses, in effect making the\n" +"program proprietary. To prevent this, we have made it clear that any\n" +"patent must be licensed for everyone's free use or not licensed at all.\n" +"\n" +" The precise terms and conditions for copying, distribution and\n" +"modification follow.\n" +"\n" +" GNU GENERAL PUBLIC LICENSE\n" +" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" +"\n" +" 0. This License applies to any program or other work which contains\n" +"a notice placed by the copyright holder saying it may be distributed\n" +"under the terms of this General Public License. The \"Program\", below,\n" +"refers to any such program or work, and a \"work based on the Program\"\n" +"means either the Program or any derivative work under copyright law:\n" +"that is to say, a work containing the Program or a portion of it,\n" +"either verbatim or with modifications and/or translated into another\n" +"language. (Hereinafter, translation is included without limitation in\n" +"the term \"modification\".) Each licensee is addressed as \"you\".\n" +"\n" +"Activities other than copying, distribution and modification are not\n" +"covered by this License; they are outside its scope. The act of\n" +"running the Program is not restricted, and the output from the Program\n" +"is covered only if its contents constitute a work based on the\n" +"Program (independent of having been made by running the Program).\n" +"Whether that is true depends on what the Program does.\n" +"\n" +" 1. You may copy and distribute verbatim copies of the Program's\n" +"source code as you receive it, in any medium, provided that you\n" +"conspicuously and appropriately publish on each copy an appropriate\n" +"copyright notice and disclaimer of warranty; keep intact all the\n" +"notices that refer to this License and to the absence of any warranty;\n" +"and give any other recipients of the Program a copy of this License\n" +"along with the Program.\n" +"\n" +"You may charge a fee for the physical act of transferring a copy, and\n" +"you may at your option offer warranty protection in exchange for a fee.\n" +"\n" +" 2. You may modify your copy or copies of the Program or any portion\n" +"of it, thus forming a work based on the Program, and copy and\n" +"distribute such modifications or work under the terms of Section 1\n" +"above, provided that you also meet all of these conditions:\n" +"\n" +" a) You must cause the modified files to carry prominent notices\n" +" stating that you changed the files and the date of any change.\n" +"\n" +" b) You must cause any work that you distribute or publish, that in\n" +" whole or in part contains or is derived from the Program or any\n" +" part thereof, to be licensed as a whole at no charge to all third\n" +" parties under the terms of this License.\n" +"\n" +" c) If the modified program normally reads commands interactively\n" +" when run, you must cause it, when started running for such\n" +" interactive use in the most ordinary way, to print or display an\n" +" announcement including an appropriate copyright notice and a\n" +" notice that there is no warranty (or else, saying that you provide\n" +" a warranty) and that users may redistribute the program under\n" +" these conditions, and telling the user how to view a copy of this\n" +" License. (Exception: if the Program itself is interactive but\n" +" does not normally print such an announcement, your work based on\n" +" the Program is not required to print an announcement.)\n" +"\n" +"These requirements apply to the modified work as a whole. If\n" +"identifiable sections of that work are not derived from the Program,\n" +"and can be reasonably considered independent and separate works in\n" +"themselves, then this License, and its terms, do not apply to those\n" +"sections when you distribute them as separate works. But when you\n" +"distribute the same sections as part of a whole which is a work based\n" +"on the Program, the distribution of the whole must be on the terms of\n" +"this License, whose permissions for other licensees extend to the\n" +"entire whole, and thus to each and every part regardless of who wrote it.\n" +"\n" +"Thus, it is not the intent of this section to claim rights or contest\n" +"your rights to work written entirely by you; rather, the intent is to\n" +"exercise the right to control the distribution of derivative or\n" +"collective works based on the Program.\n" +"\n" +"In addition, mere aggregation of another work not based on the Program\n" +"with the Program (or with a work based on the Program) on a volume of\n" +"a storage or distribution medium does not bring the other work under\n" +"the scope of this License.\n" +"\n" +" 3. You may copy and distribute the Program (or a work based on it,\n" +"under Section 2) in object code or executable form under the terms of\n" +"Sections 1 and 2 above provided that you also do one of the following:\n" +"\n" +" a) Accompany it with the complete corresponding machine-readable\n" +" source code, which must be distributed under the terms of Sections\n" +" 1 and 2 above on a medium customarily used for software interchange; or,\n" +"\n" +" b) Accompany it with a written offer, valid for at least three\n" +" years, to give any third party, for a charge no more than your\n" +" cost of physically performing source distribution, a complete\n" +" machine-readable copy of the corresponding source code, to be\n" +" distributed under the terms of Sections 1 and 2 above on a medium\n" +" customarily used for software interchange; or,\n" +"\n" +" c) Accompany it with the information you received as to the offer\n" +" to distribute corresponding source code. (This alternative is\n" +" allowed only for noncommercial distribution and only if you\n" +" received the program in object code or executable form with such\n" +" an offer, in accord with Subsection b above.)\n" +"\n" +"The source code for a work means the preferred form of the work for\n" +"making modifications to it. For an executable work, complete source\n" +"code means all the source code for all modules it contains, plus any\n" +"associated interface definition files, plus the scripts used to\n" +"control compilation and installation of the executable. However, as a\n" +"special exception, the source code distributed need not include\n" +"anything that is normally distributed (in either source or binary\n" +"form) with the major components (compiler, kernel, and so on) of the\n" +"operating system on which the executable runs, unless that component\n" +"itself accompanies the executable.\n" +"\n" +"If distribution of executable or object code is made by offering\n" +"access to copy from a designated place, then offering equivalent\n" +"access to copy the source code from the same place counts as\n" +"distribution of the source code, even though third parties are not\n" +"compelled to copy the source along with the object code.\n" +"\n" +" 4. You may not copy, modify, sublicense, or distribute the Program\n" +"except as expressly provided under this License. Any attempt\n" +"otherwise to copy, modify, sublicense or distribute the Program is\n" +"void, and will automatically terminate your rights under this License.\n" +"However, parties who have received copies, or rights, from you under\n" +"this License will not have their licenses terminated so long as such\n" +"parties remain in full compliance.\n" +"\n" +" 5. You are not required to accept this License, since you have not\n" +"signed it. However, nothing else grants you permission to modify or\n" +"distribute the Program or its derivative works. These actions are\n" +"prohibited by law if you do not accept this License. Therefore, by\n" +"modifying or distributing the Program (or any work based on the\n" +"Program), you indicate your acceptance of this License to do so, and\n" +"all its terms and conditions for copying, distributing or modifying\n" +"the Program or works based on it.\n" +"\n" +" 6. Each time you redistribute the Program (or any work based on the\n" +"Program), the recipient automatically receives a license from the\n" +"original licensor to copy, distribute or modify the Program subject to\n" +"these terms and conditions. You may not impose any further\n" +"restrictions on the recipients' exercise of the rights granted herein.\n" +"You are not responsible for enforcing compliance by third parties to\n" +"this License.\n" +"\n" +" 7. If, as a consequence of a court judgment or allegation of patent\n" +"infringement or for any other reason (not limited to patent issues),\n" +"conditions are imposed on you (whether by court order, agreement or\n" +"otherwise) that contradict the conditions of this License, they do not\n" +"excuse you from the conditions of this License. If you cannot\n" +"distribute so as to satisfy simultaneously your obligations under this\n" +"License and any other pertinent obligations, then as a consequence you\n" +"may not distribute the Program at all. For example, if a patent\n" +"license would not permit royalty-free redistribution of the Program by\n" +"all those who receive copies directly or indirectly through you, then\n" +"the only way you could satisfy both it and this License would be to\n" +"refrain entirely from distribution of the Program.\n" +"\n" +"If any portion of this section is held invalid or unenforceable under\n" +"any particular circumstance, the balance of the section is intended to\n" +"apply and the section as a whole is intended to apply in other\n" +"circumstances.\n" +"\n" +"It is not the purpose of this section to induce you to infringe any\n" +"patents or other property right claims or to contest validity of any\n" +"such claims; this section has the sole purpose of protecting the\n" +"integrity of the free software distribution system, which is\n" +"implemented by public license practices. Many people have made\n" +"generous contributions to the wide range of software distributed\n" +"through that system in reliance on consistent application of that\n" +"system; it is up to the author/donor to decide if he or she is willing\n" +"to distribute software through any other system and a licensee cannot\n" +"impose that choice.\n" +"\n" +"This section is intended to make thoroughly clear what is believed to\n" +"be a consequence of the rest of this License.\n" +"\n" +" 8. If the distribution and/or use of the Program is restricted in\n" +"certain countries either by patents or by copyrighted interfaces, the\n" +"original copyright holder who places the Program under this License\n" +"may add an explicit geographical distribution limitation excluding\n" +"those countries, so that distribution is permitted only in or among\n" +"countries not thus excluded. In such case, this License incorporates\n" +"the limitation as if written in the body of this License.\n" +"\n" +" 9. The Free Software Foundation may publish revised and/or new versions\n" +"of the General Public License from time to time. Such new versions will\n" +"be similar in spirit to the present version, but may differ in detail to\n" +"address new problems or concerns.\n" +"\n" +"Each version is given a distinguishing version number. If the Program\n" +"specifies a version number of this License which applies to it and \"any\n" +"later version\", you have the option of following the terms and conditions\n" +"either of that version or of any later version published by the Free\n" +"Software Foundation. If the Program does not specify a version number of\n" +"this License, you may choose any version ever published by the Free Software\n" +"Foundation.\n" +"\n" +" 10. If you wish to incorporate parts of the Program into other free\n" +"programs whose distribution conditions are different, write to the author\n" +"to ask for permission. For software which is copyrighted by the Free\n" +"Software Foundation, write to the Free Software Foundation; we sometimes\n" +"make exceptions for this. Our decision will be guided by the two goals\n" +"of preserving the free status of all derivatives of our free software and\n" +"of promoting the sharing and reuse of software generally.\n" +"\n" +" NO WARRANTY\n" +"\n" +" 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" +"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" +"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" +"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" +"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" +"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" +"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" +"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" +"REPAIR OR CORRECTION.\n" +"\n" +" 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" +"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" +"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" +"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" +"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" +"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" +"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" +"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" +"POSSIBILITY OF SUCH DAMAGES.\n" +"\n" +" END OF TERMS AND CONDITIONS\n" +"\n" +" How to Apply These Terms to Your New Programs\n" +"\n" +" If you develop a new program, and you want it to be of the greatest\n" +"possible use to the public, the best way to achieve this is to make it\n" +"free software which everyone can redistribute and change under these terms.\n" +"\n" +" To do so, attach the following notices to the program. It is safest\n" +"to attach them to the start of each source file to most effectively\n" +"convey the exclusion of warranty; and each file should have at least\n" +"the \"copyright\" line and a pointer to where the full notice is found.\n" +"\n" +" \n" +" Copyright (C) \n" +"\n" +" This program is free software; you can redistribute it and/or modify\n" +" it under the terms of the GNU General Public License as published by\n" +" the Free Software Foundation; either version 2 of the License, or\n" +" (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be useful,\n" +" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +" GNU General Public License for more details.\n" +"\n" +" You should have received a copy of the GNU General Public License along\n" +" with this program; if not, write to the Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n" +"\n" +"Also add information on how to contact you by electronic and paper mail.\n" +"\n" +"If the program is interactive, make it output a short notice like this\n" +"when it starts in an interactive mode:\n" +"\n" +" Gnomovision version 69, Copyright (C) year name of author\n" +" Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" +" This is free software, and you are welcome to redistribute it\n" +" under certain conditions; type `show c' for details.\n" +"\n" +"The hypothetical commands `show w' and `show c' should show the appropriate\n" +"parts of the General Public License. Of course, the commands you use may\n" +"be called something other than `show w' and `show c'; they could even be\n" +"mouse-clicks or menu items--whatever suits your program.\n" +"\n" +"You should also get your employer (if you work as a programmer) or your\n" +"school, if any, to sign a \"copyright disclaimer\" for the program, if\n" +"necessary. Here is a sample; alter the names:\n" +"\n" +" Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" +" `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" +"\n" +" , 1 April 1989\n" +" Ty Coon, President of Vice\n" +"\n" +"This General Public License does not permit incorporating your program into\n" +"proprietary programs. If your program is a subroutine library, you may\n" +"consider it more useful to permit linking proprietary applications with the\n" +"library. If this is what you want to do, use the GNU Lesser General\n" +"Public License instead of this License.\n" +; +static const char psz_thanks[] = +"Some VLC plugins use external libraries and make extensive use of the\n" +"following persons' or companies' code:\n" +"\n" +"FAAD2 - Copyright (c) Nero AG, www.nero.com\" - GPLv2 or later\n" +"FFmpeg - Copyright (c) 2000-2015 the FFmpeg developers - LGPLv2.1 or later\n" +"FluidSynth - Copyright (c) 2003-2010 Peter Hanappe, Conrad Berhörster, Antoine\n" +" Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson - LGPLv2.1 or\n" +" later\n" +"Fontconfig - Copyright (c) 2000,2001,2002,2003,2004,2006,2007 Keith Packard,\n" +" (c) 2005 Patrick Lam, (c) 2009 Roozbeh Pournader, (c) 2008,2009 Red Hat,\n" +" Inc., (c) 2008 Danilo Šegan, (c) 2012 Google, Inc. - MIT License\n" +"freetype - David Turner, Robert Wilhelm, and Werner Lemberg - FreeType License\n" +"GSM - Copyright (c) 1992 - 1994, 2009 Jutta Degener & Carsten Bormann - GSM\n" +" permissive license\n" +"GNU FriBidi - Copyright (c) 2004-2012 Behdad Esfahbod, Dov Grobgeld, Roozbeh\n" +" Pournader - LGPLv2.1 or later\n" +"GnuTLS - Copyright (C) 2000-2012 Free Software Foundation, Inc. - LGPLv2.1 or\n" +" later\n" +"harfbuzz - Copyright (c) 2010, 2011, 2012 Google, Inc., (c) 2012 Mozilla\n" +" Foundation, (c) 2011 Codethink Limited, (c) 2008, 2010 Nokia Corporation\n" +" and/or its subsidiary(-ies), (c) 2009 Keith Stribley, (c) 2009 Martin Hosken\n" +" and SIL International, (c) 2007 Chris Wilson, (c) 2006 Behdad Esfahbod,\n" +" (c) 2005 David Turner, (c) 2004, 2007, 2008, 2009, 2010 Red Hat, Inc.,\n" +" (c) 1998-2004 David Turner and Werner Lemberg - Old MIT License\n" +"liba52 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libav - Copyright (c) 2000 - 2015 the libav developers - LGPLv2.1 or later\n" +"libass - Copyright (c) 2006-2015 Grigori Goronzy et al. - ISC License\n" +"libbluray - Copyright (c) 2009-2015 VideoLAN and authors - LGPLv2.1 or later\n" +"libcaca - Copyright (c) 2004 Sam Hocevar - WTFPL / LGPLv2.1 or later /\n" +" GPLv2 or later / ISC\n" +"libdca - Copyright (c) 2004-2007 VideoLAN and authors - GPLv2 or later\n" +"libdvbpsi - Copyright (c) 2001-2015 VideoLAN and authors - LGPLv2.1 or later\n" +"libdvdcss - Copyright (c) 2001-2015 VideoLAN and authors - GPLv2 or later\n" +"libdvdread - GPLv2 or later\n" +"libdvdnav - GPLv2 or later\n" +"libebml - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libFLAC - Copyright (c) 2001 - 2014 Josh Coalson et al. - Xiph.org BSD license\n" +"libgme - LGPLv2.1 or later\n" +"libgpg-error - Copyright 2003, 2004, 2005, 2006, 2007, 2013 g10 Code GmbH\n" +" - LGPLv2.1 or later\n" +"libkate - Copyright (c) 2008-2011 Vincent Penquerc'h - 3-clause BSD License\n" +"liblive555 - Copyright (c) 1996-2015 Live Networks, Inc. - LGPLv2.1 or later\n" +"libmad - Copyright (c) 2000-2004 Robert Leslie, et al. - GPLv2 or later\n" +"libmatroska - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libmpeg2 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libmodplug - Oliver Lapicque, Konstanty - Public domain\n" +"libogg, libvorbis - Copyright (c) 2002-2015 Xiph.org Foundation - Xiph.org BSD\n" +" license\n" +"libpostproc - Copyright (C) 2001-2015 Michael Niedermayer, et al. - GPLv2 or\n" +" later\n" +"libpng - Copyright (c) 2004, 2006-2014 Glenn Randers-Perhson, et al. - libpng\n" +" license\n" +"libsamplerate - Copyright (c) 2002-2011 Erik de Castro Lopo - GPLv2 or later\n" +"libschroedinger - Copyright (c) 2006 BBC and Fluendo - MIT License\n" +"libsdl - Copyright (c) 1997-2014 Sam Lantinga et al. - LGPLv2.1 or later\n" +"libshout - Copyright (c) 2012 - LGPLv2.1 or later\n" +"libtheora - Copyright (c) Xiph.org Foundation - Xiph.org BSD license\n" +"libtiff - Copyright (c) 1988-1997 Sam Leffler, (c) 1991-1997 Silicon Graphics,\n" +" Inc. - BSD-like\n" +"libtwolame - Copyright (c) 2001-2004 Michael Cheng, (c) 2004-2006 The TwoLAME\n" +" Project - LGPLv2.1 or later\n" +"libupnp - Copyright (c) 2000-2003 Intel Corporation - 3-clause BSD License\n" +"libvpx - Copyright (c) 2010-2015, Google Inc. - 3-clause BSD License\n" +"libxml2 - Copyright (c) 1998-2014 Daniel Veillard - MIT License\n" +"lua - Copyright (c) 1994-2008 Lua.org, PUC-Rio. - MIT License\n" +"Musepack decoder library - Copyright (c) 2005-2011, The Musepack Development\n" +" Team - 3-clause BSD License\n" +"OpenJPEG - Copyright (c) 2002-2014, Communcations and Remote Sensing\n" +" Laboratory, UCL, Belgium - ISC License\n" +"Opus - Copyright 2001-2013 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin,\n" +" Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding,\n" +" Erik de Castro Lopo - Xiph.org BSD License\n" +"Sparkle — Andy Matuschak et al. - MIT License\n" +"Speex, Speexdsp - Copyright (c) 1992-2015 Xiph.org Foundation, Jean-Marc Valin,\n" +" Analog Devices Inc. Commonwealth Scientific and Industrial Research\n" +" Organisation, David Row, Jutta Degener, Carsten Bormann - 3-clause BSD\n" +" License\n" +"taglib - Copyright (c) 2004-2013 Scott Wheeler, et al. - LGPLv2.1 or later\n" +"x264 - Copyright (c) 2004-2015 VideoLAN and authors - GPLv2 or later\n" +"x265 - Copyright (c) 2004-2015 x265 project - GPLv2 or later\n" +"Zapping VBI library - Copyright (c) 2000-2003 Michael H. Schimek, Iñaki García\n" +" Etxebarria - LGPLv2.1 or later\n" +"zlib - Copyright (c) 1995-2012 Jean-loup Gailly and Mark Adler - zlib license\n" +"\n" +"The VideoLAN team would like to thank the following donators:\n" +"\n" +"Julian Cain, who made a $1000 donation\n" +"The French website MacBidouille gave €500 to help us buy a PowerMac G5\n" +"The French magazine à vos MAC gave €500 to help us buy a PowerMac G5\n" +"Laurent Dupuy, who made a €540 donation\n" +"The French company Cybervia (Actech) gave €2000 to pay for webserver hosting\n" +"Dennis Perov - Hardware donation\n" +"\n" +"...the following active members of our user community:\n" +"\n" +"Alan Wright\n" +"David J LaBarre \"DJ\"\n" +"Eric Adler\n" +"Julien Bouquillon\n" +"\n" +"...and code auditors and testers:\n" +"\n" +"David Thiel\n" +"Philippe A. aka \"Lotesdelère\"\n" +"Sebastien Chaumat\n" +; +static const char psz_authors[] = +"VideoLAN and the VLC team would like to acknowledge the following contributors:\n" +"\n" +"Programming\n" +"-----------\n" +"Rémi Denis-Courmont\n" +"Jean-Baptiste Kempf\n" +"Laurent Aimar\n" +"Rafaël Carré\n" +"Felix Paul Kühne\n" +"Gildas Bazin\n" +"Pierre d'Herbemont\n" +"Rémi Duraffort\n" +"Derk-Jan Hartman\n" +"Antoine Cellerier\n" +"Jean-Paul Saman\n" +"Samuel Hocevar\n" +"Christophe Mutricy\n" +"Clément Stenac\n" +"Christophe Massiot\n" +"François Cartegnie\n" +"Ilkka Ollakka\n" +"David Fuhrmann\n" +"Pierre Ynard\n" +"Damien Fouilleul\n" +"Sigmund Augdal Helberg\n" +"Erwan Tulou\n" +"Olivier Teulière\n" +"Cyril Deguet\n" +"Eric Petit\n" +"Filippo Carone\n" +"Rocky Bernstein\n" +"Hugo Beauzée-Luyssen\n" +"Olivier Aubert\n" +"Pavlov Konstantin\n" +"Jakob Leben\n" +"Benjamin Pracht\n" +"Jean-Philippe André\n" +"Steve Lhomme\n" +"Stéphane Borel\n" +"Ludovic Fauvet\n" +"Martin Storsjö\n" +"JP Dinger\n" +"Geoffroy Couprie\n" +"KO Myung-Hun\n" +"Marian Ďurkovič\n" +"Yoann Peronneau\n" +"Sébastien Escudier\n" +"Denis Charmet\n" +"Edward Wang\n" +"Jon Lech Johansen\n" +"Felix Abecassis\n" +"Tristan Matthews\n" +"Dennis van Amerongen\n" +"Mirsal Ennaime\n" +"Faustino Osuna\n" +"Jérôme Decoodt\n" +"Loïc Minier\n" +"Christoph Miebach\n" +"Adrien Maglo\n" +"David Flynn\n" +"Frédéric Yhuel\n" +"Kaarlo Raiha\n" +"Mark Moriarty\n" +"Christopher Mueller\n" +"Fabio Ritrovato\n" +"Tony Castley\n" +"Srikanth Raju\n" +"Michel Kaempf\n" +"Jean-Marc Dressler\n" +"Johan Bilien\n" +"Vincent Seguin\n" +"Simon Latapie\n" +"Bernie Purcell\n" +"Henri Fallon\n" +"Sebastien Zwickert\n" +"Emmanuel Puig\n" +"Sean McGovern\n" +"Renaud Dartus\n" +"Alexis de Lattre\n" +"Naohiro Koriyama\n" +"Vincent Penquerc'h\n" +"Arnaud de Bossoreille de Ribou\n" +"Mohammed Adnène Trojette\n" +"Petri Hintukainen\n" +"Boris Dorès\n" +"Hannes Domani\n" +"Jai Menon\n" +"Anil Daoud\n" +"Daniel Mierswa\n" +"Dominique Leuenberger\n" +"Rob Jonson\n" +"Pierre Baillet\n" +"Andre Pang\n" +"Michał Trzebiatowski\n" +"Zoran Turalija\n" +"Akash Mehrotra\n" +"André Weber\n" +"Anthony Loiseau\n" +"Devin Heitmueller\n" +"Lukas Durfina\n" +"Xavier Marchesini\n" +"Cyril Mathé\n" +"Tobias Güntner\n" +"Juho Vähä-Herttua\n" +"Ken Self\n" +"Luca Barbato\n" +"Steinar H. Gunderson\n" +"Sébastien Toque\n" +"Alexis Ballier\n" +"Juha Jeronen\n" +"Nicolas Chauvet\n" +"Richard Hosking\n" +"Thomas Guillem\n" +"Timothy B. Terriberry\n" +"Éric Lassauge\n" +"Marc Ariberti\n" +"Matthias Keiser\n" +"Vittorio Giovara\n" +"Benoit Steiner\n" +"Maxim Bublis\n" +"Michel Lespinasse\n" +"Carlo Calabrò\n" +"Cheng Sun\n" +"Gleb Pinigin\n" +"Brad Smith\n" +"Brendon Justin\n" +"Daniel Verkamp\n" +"Mark Lee\n" +"Ronald Wright\n" +"Alexey Sokolov\n" +"Basos G\n" +"Philippe Morin\n" +"Thomas De Rocker\n" +"Vicente Jimenez Aguilar\n" +"Yuval Tze\n" +"Benjamin Drung\n" +"Yves Duret\n" +"Julien 'Lta' BALLET\n" +"Michael Hanselmann\n" +"Vianney Boyer\n" +"Alex Merry\n" +"Damien Lucas\n" +"Grigori Goronzy\n" +"Julian Scheel\n" +"Richard Shepherd\n" +"Gaël Hendryckx\n" +"Michael Feurstein\n" +"Rui Zhang\n" +"Stephan Assmus\n" +"Adrien Grand\n" +"Alexander Lakhin\n" +"Anatoliy Anischovich\n" +"Colin Guthrie\n" +"David Menestrina\n" +"Dominique Martinet\n" +"Jason Luka\n" +"Luc Saillard\n" +"Mario Speiß\n" +"Pankaj Yadav\n" +"Ramiro Polla\n" +"Can Wu\n" +"Christophe Courtaut\n" +"FUJISAWA Tooru\n" +"François Revol\n" +"Manol Manolov\n" +"Nicolas Bertrand\n" +"Andrey Utkin\n" +"Antoine Lejeune\n" +"Arnaud Schauly\n" +"Branko Kokanovic\n" +"Dylan Yudaken\n" +"Florian G. Pflug\n" +"G Finch\n" +"Keary Griffin\n" +"Konstanty Bialkowski\n" +"Ming Hu\n" +"Philippe Coent\n" +"Przemyslaw Fiala\n" +"Tanguy Krotoff\n" +"Wieland Hoffmann\n" +"Casian Andrei\n" +"Chris Smowton\n" +"David Kaplan\n" +"Eugenio Jarosiewicz\n" +"Fabian Keil\n" +"Guillaume Poussel\n" +"John Peterson\n" +"Justus Piater\n" +"Martin T. H. Sandsmark\n" +"Rune Botten\n" +"Sergey Radionov\n" +"Søren Bøg\n" +"Toralf Niebuhr\n" +"Adrian Yanes\n" +"Angelo Haller\n" +"Aurélien Nephtali\n" +"Austin Burrow\n" +"Bill C. Riemers\n" +"Colin Delacroix\n" +"Cristian Maglie\n" +"Elminster2031\n" +"Georgi Chorbadzhiyski\n" +"Gilles Sabourin\n" +"Jakub Wieczorek\n" +"John Freed\n" +"Mark Hassman\n" +"Martin Briza\n" +"Mike Houben\n" +"Romain Goyet\n" +"Barry Wardell\n" +"Ben Hutchings\n" +"Besnard Jean-Baptiste\n" +"Brian Weaver\n" +"Clement Chesnin\n" +"David Geldreich\n" +"David Robison\n" +"Dennis Hamester\n" +"Diego Elio Pettenò\n" +"Diego Fernando Nieto\n" +"Fabian Yamaguchi\n" +"Frode Tennebø\n" +"Jerome Forissier\n" +"John Stebbins\n" +"Jon Stacey\n" +"Jonathan Rosser\n" +"Joris van Rooij\n" +"Josh Watzman\n" +"Kaloyan Kovachev\n" +"Katsushi Kobayashi\n" +"Kelly Anderson\n" +"Loren Merritt\n" +"Maciej Blizinski\n" +"Mark Bidewell\n" +"Martell Malone\n" +"Miguel Angel Cabrera Moya\n" +"Niles Bindel\n" +"Samuel Pitoiset\n" +"Scott Caudle\n" +"Sean Robinson\n" +"Sergio Ammirata\n" +"Simon Hailes\n" +"Stephen Parry\n" +"Sukrit Sangwan\n" +"Thierry Reding\n" +"Uwe L. Korn\n" +"Valentin Vetter\n" +"Xavier Martin\n" +"Adam Leggett\n" +"Alex Converse\n" +"Alexander Bethke\n" +"Alexandre Ratchov\n" +"Andres Krapf\n" +"Andri Pálsson\n" +"Andy Chenee\n" +"Andy Tather\n" +"Anuradha Suraparaju\n" +"Arun Pandian G\n" +"Avishay Spitzer\n" +"Ben Littler\n" +"Benjamin Poulain\n" +"Brieuc Jeunhomme\n" +"Chris Clayton\n" +"Clément Lecigne\n" +"Cédric Cocquebert\n" +"Daniel Peng\n" +"Danny Wood\n" +"David K\n" +"Edouard Gomez\n" +"Emmanuel de Roux\n" +"Finn Hughes\n" +"GBX\n" +"Gaurav Narula\n" +"Geraud CONTINSOUZAS\n" +"Gilles Chanteperdrix\n" +"Gwenole Beauchesne\n" +"Hugues Fruchet\n" +"Jan Winter\n" +"Jean-François Massol\n" +"Jean-Philippe Grimaldi\n" +"Jean-Yves Avenard\n" +"Kai Lauterbach\n" +"Konstantin Bogdanov\n" +"Kuan-Chung Chiu\n" +"Kuang Rufan\n" +"Matthias Dahl\n" +"Michael McEll\n" +"Michael Ploujnikov\n" +"Mike Schrag\n" +"Nickolai Zeldovich\n" +"Niklas Hayer\n" +"Olafs Vandāns\n" +"Olivier Gambier\n" +"Paul Corke\n" +"Reka Inovan\n" +"Ron Frederick\n" +"Ross Finlayson\n" +"Rov Juvano\n" +"Sam Lade\n" +"Sandeep Kumar\n" +"Sasha Koruga\n" +"Simona-Marinela Prodea\n" +"Sreng Jean\n" +"Sven Petai\n" +"Timo Rothenpieler\n" +"Tomas Krotil\n" +"Tomer Barletz\n" +"Tristan Leteurtre\n" +"Vikram Fugro\n" +"Wang Bo\n" +"maxime Ripard\n" +"xxcv\n" +"Adam Hoka\n" +"Adrian Haensler\n" +"Adrian Knoth\n" +"Adrien Cunin\n" +"Ago Allikmaa\n" +"Alain Degreffe\n" +"Alan Fischer\n" +"Alan McCosh\n" +"Alex Helfet\n" +"Alex Peak\n" +"Alex Warhawk\n" +"Alex Woods\n" +"Alexander Terentyev\n" +"Alexandre Ferreira\n" +"Alexandre Pereira Nunes\n" +"Alina Friedrichsen\n" +"Allan Odgaard\n" +"An L. Ber\n" +"Andreas Schlick\n" +"Andrew Schubert\n" +"Andrey Makhnutin\n" +"Arnaud Vallat\n" +"Arne de Bruijn\n" +"Asad Mehmood\n" +"Ashok Bhat\n" +"Austin English\n" +"Baptiste Coudurier\n" +"Benoit Calvez\n" +"Björn Stenberg\n" +"Blake Livingston\n" +"Brandon Brooks\n" +"Brian Johnson\n" +"Brian Kurle\n" +"Brian Schmidt\n" +"Brion Vibber\n" +"Cezar Elnazli\n" +"Chris White\n" +"Christian Masus\n" +"Christian Suloway\n" +"Christoph Pfister\n" +"Christoph Seibert\n" +"Christopher Key\n" +"Christopher Rath\n" +"Claudio Ortelli\n" +"Cody Russell\n" +"Cristian Morales Vega\n" +"Dan Rosenberg\n" +"Daniel Marth\n" +"Daniel Tisza\n" +"Detlef Schroeder\n" +"Diego Biurrun\n" +"Dominik 'Rathann' Mierzejewski\n" +"Duncan Salerno\n" +"Edward Sheldrake\n" +"Elliot Murphy\n" +"Elodie Thomann\n" +"Eren Inan Canpolat\n" +"Ernest E. Teem III\n" +"Etienne Membrives\n" +"Fabrizio Ge\n" +"Fargier Sylvain\n" +"Fathi Boudra\n" +"Felix Geyer\n" +"Filipe Azevedo\n" +"Florent Pillet\n" +"Florian Hubold\n" +"Florian Roeske\n" +"Forteve Zepushisti\n" +"Frank Enderle\n" +"Frédéric Crozat\n" +"Gal Vinograd\n" +"Gaurav Pruthi\n" +"Georg Seifert\n" +"Gertjan Van Droogenbroeck\n" +"Greg Farrell\n" +"Gregory Maxwell\n" +"Götz Waschk\n" +"Hans-Kristian Arntzen\n" +"Harry Sintonen\n" +"Heorhi Valakhanovich\n" +"Iain Wade\n" +"Ibraheem Paredath\n" +"Igor Prokopenkov\n" +"Isamu Arimoto\n" +"Ismael Luceno\n" +"James Bates\n" +"James Bond\n" +"James Turner\n" +"Janne Grunau\n" +"Janne Kujanpää\n" +"Jarmo Torvinen\n" +"Jason Scheunemann\n" +"Jeff Lu\n" +"Jeremy Huddleston Sequoia\n" +"Jeroen Ost\n" +"Joe Taber\n" +"Johann Ransay\n" +"Johannes Weißl\n" +"John Hendrikx\n" +"Jonas Gehring\n" +"Joseph S. Atkinson\n" +"Juergen Lock\n" +"Julien / Gellule\n" +"Julien Humbert\n" +"Kamil Baldyga\n" +"Kamil Klimek\n" +"Karlheinz Wohlmuth\n" +"Kevin Anthony\n" +"Kevin DuBois\n" +"Konstantin Pavlov\n" +"Konstantinos Tsanaktsidis\n" +"LANGLOIS Olivier PIS -EXT\n" +"Lari Natri\n" +"Lorenzo Pistone\n" +"Lucas C. Villa Real\n" +"Lukas Juhrich\n" +"Lukáš Lalinský\n" +"Mal Graty\n" +"Malte Tancred\n" +"Marc Aldorasi\n" +"Marc Etcheverry\n" +"Martin Pöhlmann\n" +"Martin Zeman\n" +"Marton Balint\n" +"Mathew King\n" +"Mathieu Sonet\n" +"Matthew A. Townsend\n" +"Matthias Bauer\n" +"Max Dilipovich\n" +"Mika Tiainen\n" +"Mike Cardillo\n" +"Mounir Lamouri (volkmar)\n" +"Natanael Copa\n" +"Nathan Phillip Brink\n" +"Nick Briggs\n" +"Nick Pope\n" +"Nil Geiswiller\n" +"O. Hartmann\n" +"Pascal Thomet\n" +"Paul Clark\n" +"Paweł Stankowski\n" +"Pere Orga\n" +"Peter Bak Nielsen\n" +"Phil Roffe and David Grellscheid\n" +"Philip Sequeira\n" +"Pierre Souchay\n" +"Pierre-Hugues Husson\n" +"Piotr Fusik\n" +"Pádraig Brady\n" +"R.M\n" +"Ralph Giles\n" +"Ramon Gabarró\n" +"Ray Tiley\n" +"Robert Forsman\n" +"Robert Jedrzejczyk\n" +"Robert Paciorek\n" +"Rolf Ahrenberg\n" +"Romain FLIEDEL\n" +"Roman Pen\n" +"Ruud Althuizen\n" +"Salah-Eddin Shaban\n" +"Sam Malone\n" +"Samuli Suominen\n" +"Santiago Gimeno\n" +"Scott Lyons\n" +"Sebastian Birk\n" +"Sebastian Ramacher\n" +"Sergey Bolshakov\n" +"Sergey Puzanov\n" +"Sharad Dixit\n" +"Song Ye Wen\n" +"Stephan Krempel\n" +"Steven Kramer\n" +"Steven Sheehy\n" +"Sveinung Kvilhaugsvik\n" +"Sylvain Cadhillac\n" +"Sylver Bruneau\n" +"Takahito HIRANO\n" +"Theron Lewis\n" +"Thierry Foucu\n" +"Thijs Alkemade\n" +"Tillmann Karras\n" +"Tim Walker\n" +"Timo Paulssen\n" +"Tobias Rapp\n" +"Tomasen\n" +"Tony Vankrunkelsven\n" +"Tristan Heaven\n" +"Tzu-Jung Lee\n" +"Varphone Wong\n" +"Vasily Fomin\n" +"Vikram Narayanan\n" +"Wills Wang\n" +"Yannick Bréhon\n" +"Yavor Doganov\n" +"Yohann Martineau\n" +"dharani.prabhu.s\n" +"suheaven\n" +"wucan\n" +"أحمد المحم ودي (Ahmed El-Mahmoudy)\n" +"김정은\n" +"Adam Sampson\n" +"Alexander Gall\n" +"Alex Antropoff\n" +"Alexis Guillard\n" +"Alex Izvorski\n" +"Amir Gouini\n" +"Andrea Guzzo\n" +"Andrew Flintham\n" +"Andrew Zaikin\n" +"Andy Lindsay\n" +"Arai/Fujisawa Tooru\n" +"Arkadiusz Miskiewicz\n" +"Arnaud Gomes-do-Vale\n" +"Arwed v. Merkatz\n" +"Barak Ori\n" +"Basil Achermann\n" +"Benjamin Mironer\n" +"Bill\n" +"Bob Maguire\n" +"Brian C. Wiles\n" +"Brian Raymond\n" +"Brian Robb\n" +"Carsten Gottbehüt\n" +"Carsten Haitzler\n" +"Charles Hordis\n" +"Chris Clepper\n" +"Christian Henz\n" +"Christof Baumgaertner\n" +"Christophe Burgalat\n" +"Christopher Johnson\n" +"Cian Duffy\n" +"Colin Simmonds\n" +"Damian Ivereigh\n" +"Daniel Fischer\n" +"Daniel Stränger\n" +"Danko Dolch\n" +"Dennis Lou\n" +"Dermot McGahon\n" +"Douglas West\n" +"Dugal Harris\n" +"Emmanuel Blindauer\n" +"Enrico Gueli\n" +"Enrique Osuna\n" +"Eren Türkay\n" +"Eric Dudiak\n" +"Espen Skoglund\n" +"Ethan C. Baldridge\n" +"François Seingier\n" +"Frans van Veen\n" +"Frédéric Ruget\n" +"Gerald Hansink\n" +"Gisle Vanem\n" +"Glen Gray\n" +"Goetz Waschk\n" +"Gregory Hazel\n" +"Gustaf Neumann\n" +"Hang Su\n" +"Hans Lambermont\n" +"Hans-Peter Jansen\n" +"Harris Dugal\n" +"Heiko Panther\n" +"Igor Helman\n" +"Isaac Osunkunle\n" +"Jan David Mol\n" +"Jan Gerber\n" +"Jan Van Boghout\n" +"Jasper Alias\n" +"Jean-Alexis Montignies\n" +"Jean-Baptiste Le Stang\n" +"Jeffrey Baker\n" +"Jeroen Massar\n" +"Jérôme Guilbaud\n" +"Johannes Buchner\n" +"Johen Michael Zorko\n" +"Johnathan Rosser\n" +"John Dalgliesh\n" +"John Paul Lorenti\n" +"Jörg\n" +"Joseph Tulou\n" +"Julien Blache\n" +"Julien Plissonneau Duquène\n" +"Julien Robert\n" +"Kenneth Ostby\n" +"Kenneth Self\n" +"Kevin H. Patterson\n" +"Koehler, Vitally\n" +"K. Staring\n" +"Lahiru Lakmal Priyadarshana\n" +"Laurent Mutricy\n" +"Leo Spalteholz\n" +"Loox Thefuture\n" +"Marc Nolette\n" +"Marco Munderloh\n" +"Mark Gritter\n" +"Markus Kern\n" +"Markus Kuespert\n" +"Martin Hamrle\n" +"Martin Kahr\n" +"Mateus Krepsky Ludwich\n" +"Mathias Kretschmer\n" +"Mats Rojestal\n" +"Matthias P. Nowak\n" +"Matthieu Lochegnies\n" +"Michael Mondragon\n" +"Michael S. Feurstein\n" +"Michel Lanners\n" +"Mickael Hoerdt\n" +"Miguel Angel Cabrera\n" +"Mikko Hirvonen\n" +"Moritz Bunkus\n" +"Nilmoni Deb\n" +"Olivier Houchard\n" +"Olivier Pomel\n" +"Ondrej Kuda aka Albert\n" +"Øyvind Kolbu\n" +"Pascal Levesque\n" +"Patrick Horn\n" +"Patrick McLean\n" +"Pauline Castets\n" +"Paul Mackerras\n" +"Peter Surda\n" +"Petr Vacek\n" +"Philippe Van Hecke\n" +"Pierre-Luc Beaudoin\n" +"Pierre Marc Dumuid\n" +"Régis Duchesne\n" +"Remco Poortinga\n" +"Rene Gollent\n" +"Rob Casey\n" +"Robson Braga Araujo\n" +"Roine Gustafsson\n" +"Roman Bednarek\n" +"Rudolf Cornelissen\n" +"Sašo Kiselkov\n" +"Sebastian Jenny\n" +"Shane Harper\n" +"Stefán Freyr Stefánsson\n" +"Steve Brown\n" +"Steven M. Schultz\n" +"Tapio Hiltunen\n" +"Thomas L. Wood\n" +"Thomas Mühlgrabner\n" +"Thomas Parmelan\n" +"Tim 'O Callagha\n" +"Tim Schuerewegen\n" +"Tong Ka Man\n" +"Torsten Spindler\n" +"Udo Richter\n" +"Vincent Dimar\n" +"Vincent Penne\n" +"Vitalijus Slavinskas\n" +"Vitaly V. Bursov\n" +"Vladimir Chernyshov\n" +"Wade Majors\n" +"Wallace Wadge\n" +"Watanabe Go\n" +"William Hawkins\n" +"Xavier Maillard\n" +"Ye zhang\n" +"Yuehua Zhao\n" +"\n" +"Artwork\n" +"-------\n" +"Damien Erambert\n" +"Daniel Dreibrodt, aka aLtgLasS\n" +"David Weber\n" +"Davor Orel\n" +"Dominic Spitaler\n" +"Eurodata Computer Club\n" +"Geoffrey Roussel\n" +"Joeri van Dooren\n" +"kty0ne\n" +"Max Rudberg\n" +"Richard Øiestad\n" +"Simon Damkjær Andersen\n" +"Tom Bigelajzen\n" +"Vincent van den Heuvel\n" +"\n" +"Documentation\n" +"-------------\n" +"Bill Eldridge\n" +"\n" +"Localization\n" +"------------\n" +"Abdul Fousan - Tamil\n" +"A. Decorte - Friulian\n" +"A. Regnander - Swedish\n" +"Adem Gunes - Turkish\n" +"Adi Nugroho - Tagalog\n" +"Adnan Memija - Bosnian\n" +"airplanez - Korean\n" +"Ajith Manjula - Sinhala\n" +"Aled Powell - Welsh\n" +"Alexander Didebulidze - Georgian\n" +"Alexander Henket - Dutch\n" +"Alexander Jansen - Norwegian Bokmål\n" +"Alexander Lakhin - Russian\n" +"Alexey Lugin - Ukrainian\n" +"Alexey Salmin - Russian\n" +"Alfred John - Acoli\n" +"Amanpreet Singh Alam - Punjabi\n" +"André de Barros Martins Ribeiro - Brazilian portuguese\n" +"Andrey Brilevskiy - Russian\n" +"Andrey Wolk - Russian\n" +"Andri Pálsson - Icelandic\n" +"Andriy Bandura - Ukrainian\n" +"Anh Phan - Vietnamese\n" +"Aniket Eknath Kudale - Marathi\n" +"Animesh Swar - Nepalese\n" +"Aputsiaĸ Niels Janussen - Danish\n" +"Ara Bextiyar - Sorani (Kurdish)\n" +"Ari Constâncio - Portuguese\n" +"Arkadiusz Lipiec - Polish\n" +"Ask Hjorth Larsen - Danish\n" +"Audrey Prevost - French\n" +"Auk Piseth - Khmer\n" +"Bayarsaikhan Enkhtaivan Баярсайхан Энхтайван - Mongolian\n" +"Biraj Karmakar - Bengali (India)\n" +"Bruno Queirós - Portuguese\n" +"Bruno Vella - Italian\n" +"Caner Başaran - Turkish\n" +"Carlo Calabrò - Italian\n" +"Chandan Kumar - Hindi\n" +"Chesús Daniel Trigo - Aragonese\n" +"Christoph Miebach - German\n" +"Chynggyz Jumaliev - Kirgyz\n" +"Circo Radu - Romanian\n" +"Cristian Secară - Romanian\n" +"Daniel Nylander - Swedish\n" +"Daniel Winzen - German\n" +"David González - Spanish\n" +"David Planella - Catalan\n" +"Dean Lee - Simplified Chinese\n" +"Denis Arnaud - Breton\n" +"Derk-Jan Hartman - Dutch\n" +"DirektX - Hungarian\n" +"Dominko Aždajić - Croatian\n" +"Dylan Aïssi - French\n" +"Đorđe Vasiljević - Serbian\n" +"Eduard Babayan - Armenian\n" +"Eero - Estonian\n" +"Eirik U. Birkeland - Norwegian Nynorsk\n" +"Elizabeth Da Conceicao Baptista - Tetum\n" +"Emilio Sepúlveda - Interlingua\n" +"Emin Mastizada - Azerbaijani\n" +"Éric Lassauge - French\n" +"Farzaneh Sarafraz - Persian\n" +"Florence Tushabe - Chiga\n" +"Fouzia Bourai - Arabic\n" +"Frank Chao - Traditional Chinese\n" +"Freyr Gunnar Ólafsson - Icelandic\n" +"Friedel Wolff - Afrikaans\n" +"Fumio Nakayama - Japanese\n" +"Gabor Kelemen - Hungarian\n" +"Gaurav Kumar - Hindi\n" +"Gaëtan Rousseaux - Walloon\n" +"Ghjuvan Pasquinu - Corsican\n" +"Goce Manevski - Macedonian\n" +"Golam Maruf Oovee - Bengali\n" +"Gonçalo Cordeiro - Galician\n" +"Gorana Milicevic - Serbian\n" +"Goswami Hardikpuri Kishorpuri - Gujarati\n" +"Haakon Meland Eriksen - Norwegian\n" +"Han HoJoong - Korean\n" +"Hardik Kishorpuri Goswami - Gujarati\n" +"Hemanta Nandi - Bengali (India)\n" +"Huw Waters - Welsh\n" +"H.Shalitha Vikum - Sinhala\n" +"Ibrahima Sarr - Fulah\n" +"Ingmārs Dīriņš - Latvian\n" +"Israt Jahan - Bengali\n" +"Ivar Smolin - Estonian\n" +"Iván Seoane Pardo - Galician\n" +"Ivo Ivanov - Bulgarian\n" +"Iñaki Larrañaga Murgoitio - Basque\n" +"Iñigo Varela - Asturian; Bable\n" +"Jakub Žáček - Czech\n" +"James Olweny - Ganda\n" +"Jamil Ahmed - Bengali\n" +"Javier Varela - Spanish\n" +"Jean-Pierre Kuypers - French\n" +"Jens Seidel - German\n" +"Joao Almeida - Portuguese\n" +"Joel Arvidsson - Swedish\n" +"jogijs - Latvian\n" +"Jonas Larsen - Danish\n" +"Jon Stødle - Norwegian Nynorsk\n" +"Jouni Kähkönen - Finnish\n" +"Juha Jeronen - Finnish\n" +"Julen Ruiz Aizpuru - Basque\n" +"Kai Hermann - German\n" +"Kamil Páral - Czech\n" +"Kang Jeong-Hee - Korean\n" +"Kasper Tvede - Danish\n" +"Kaya Zeren - Turkish\n" +"Kenneth Nielsen - Danish\n" +"Khin Mi Mi Aung - Burmese\n" +"Khoem Sokhem - Khmer\n" +"Kola - Albanian\n" +"Kypchak Kypchak - Kazakh\n" +"Laurent Jonqueres - Occitan\n" +"Loba Yeasmeen - Bengali\n" +"Lorena Gomes - Catalan\n" +"Lorenzo Porta - Italian\n" +"Luqman Hakim - Indonesian\n" +"L. Balasubramaniam - Hindi\n" +"Mahrazi Mohd Kamal - Malay\n" +"Manolis Stefanis - Modern Greek\n" +"Manuela Silva/Alfredo Silva - Portuguese\n" +"Marián Hikaník - Slovak\n" +"Mario Siegmann - German\n" +"Marko Uskokovic - Serbian\n" +"Martin Srebotnjak - Slovenian\n" +"Martin Zicha - Czech\n" +"Matej Urbančič - Slovenian\n" +"Mathias C. Berens, welcome-soft - German\n" +"Mattias Põldaru - Estonian\n" +"Md. Rezwan Shahid - Bengali\n" +"Meelad Zakaria - Persian\n" +"Michael Bauer - Scottish Gaelic\n" +"Michal Halenka - Czech\n" +"Michał Trzebiatowski - Polish\n" +"Miguel Sousa - Portuguese\n" +"Mihkel Kirjutas - Estonian\n" +"Mindaugas Baranauskas - Lithuanian\n" +"Miroslav Oujeský - Czech\n" +"Morten Brix Pedersen - Danish\n" +"Mustafa Sandal - Czech\n" +"Myckel Habets - Dutch\n" +"Namhyung Kim - Korean\n" +"Niels Fanøe - Danish\n" +"Niklas 'Nille' Åkerström - Swedish\n" +"Olav Dahlum - Norwegian Bokmål\n" +"Oleksandr Natalenko - Ukrainian\n" +"Omer Ensari - Kurmanji (Kurdish)\n" +"Osama Khalid - Arabic\n" +"Otto Kekäläinen - Finnish\n" +"Paras Nath Chaudhary - Nepali\n" +"Pasindu Kavinda - Sinhala\n" +"Pau Iranzo - Catalan\n" +"Paula Iglesias - Galician\n" +"Pedro Valadares - Portuguese\n" +"Peter Jespersen - Danish\n" +"Petr Šimáček - Czech\n" +"Phan Anh - Vietnamese\n" +"Philipp Weissenbacher - German\n" +"Pittayakom Saingtong - Thai\n" +"Prasannajit Acharya - Oriya\n" +"Praveen Illa - Telugu\n" +"Predrag Ljubenović - Serbian\n" +"Pyae Sone - Burmese\n" +"Rajnikant Kumbhar - Marathi\n" +"Ricardo Perdigão - Portuguese\n" +"Ricardo Pérez López - Spanish\n" +"Roustam Ghizdatov - Russian\n" +"Ruei-Yuan Lu - Traditional Chinese\n" +"Saad Liaquat Kiani - Urdu\n" +"Sadia Afroz - Bengali\n" +"Said Marjan Zazai - Pashto\n" +"Salar Khalilzadeh - Persian\n" +"Sam Askari - Spanish\n" +"Sam Hocevar - British\n" +"Samuel Hocevar - French\n" +"Saúl Ortega - Spanish\n" +"Savvas Nesseris - Modern Greek\n" +"Sayan Chowdhury - Hindi\n" +"Seanán Ó Coistín - Irish\n" +"Semsudin Abdic - Bosnian\n" +"Shambhu Kumar - Hindi\n" +"Shantanu Sarkar - Hindi\n" +"Shashi Ranjan - Hindi\n" +"Siarhei Daryichau Дар'ічаў Сяргей - Belarusian\n" +"Sidney Doria - Brazilian Portuguese\n" +"Sigmund Augdal - Norwegian Bokmål\n" +"Simos Xenitellis - Modern Greek\n" +"Sipho Sibiya - Zulu\n" +"Sok Sophea - Khmer\n" +"Solomon Gizaw - Amharic\n" +"Sreejith P - Malayalam\n" +"Suraj Kawade - Marathi\n" +"Stian Jørgensrud - Norwegian Bokmål\n" +"Sveinn í Felli - Icelandic\n" +"Tadashi Jokagi - Japanese\n" +"Tarsem Singh - Hindi\n" +"Thanakrit Chomphuming - Thai\n" +"Tero Pelander - Finnish\n" +"Thomas De Rocker - Dutch\n" +"Thomas Graf - gettext support, German\n" +"Tomáš Chvátal - Czech\n" +"Tòni Galhard - Occitan\n" +"Umesh Agarwal - Bengali (India)\n" +"Umidjon Almasov - Uzbek\n" +"Václav Pavlíček - Czech\n" +"Valek Filippov - Russian\n" +"Vicente Jimenez Aguilar - Spanish\n" +"Vincenzo Reale - Italian\n" +"Vít Pelčák - Czech\n" +"viyyer - Hindi\n" +"Vladimir Yermolayev - Russian\n" +"Vojtěch Smejkal - Czech\n" +"Wei Mingzhi - Simplified Chinese\n" +"Xènia Albà Cantero - Catalan\n" +"Xuacu Saturio - Asturian\n" +"Yaron Shahrabani - Hebrew\n" +"Yaşar Tay - Turkish\n" +"Yhal Htet Aung - Burmese\n" +"Yogesh K S - Kannada\n" +"Yoyo - Simplified Chinese\n" +"Yuksel Yildirim - Turkish\n" +"Zabeeh Khan - Pashto\n" +"Zhang Tong - Chinese\n" +; diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_access.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_access.h new file mode 100644 index 0000000..3697db0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_access.h @@ -0,0 +1,181 @@ +/***************************************************************************** + * vlc_access.h: Access descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: 511278add942a4ff59cc658431901236dd48e341 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ACCESS_H +#define VLC_ACCESS_H 1 + +/** + * \file + * This file defines functions and definitions for access object + */ + +#include + +/** + * \defgroup access Access + * @{ + */ + +enum access_query_e +{ + /* capabilities */ + ACCESS_CAN_SEEK, /* arg1= bool* cannot fail */ + ACCESS_CAN_FASTSEEK, /* arg1= bool* cannot fail */ + ACCESS_CAN_PAUSE, /* arg1= bool* cannot fail */ + ACCESS_CAN_CONTROL_PACE,/* arg1= bool* cannot fail */ + ACCESS_GET_SIZE=6, /* arg1= uin64_t* */ + + /* */ + ACCESS_GET_PTS_DELAY = 0x101,/* arg1= int64_t* cannot fail */ + ACCESS_GET_TITLE_INFO, /* arg1=input_title_t*** arg2=int* res=can fail */ + ACCESS_GET_TITLE, /* arg1=unsigned * res=can fail */ + ACCESS_GET_SEEKPOINT, /* arg1=unsigned * res=can fail */ + + /* Meta data */ + ACCESS_GET_META, /* arg1= vlc_meta_t ** res=can fail */ + ACCESS_GET_CONTENT_TYPE,/* arg1=char **ppsz_content_type res=can fail */ + + ACCESS_GET_SIGNAL, /* arg1=double *pf_quality, arg2=double *pf_strength res=can fail */ + + /* */ + ACCESS_SET_PAUSE_STATE = 0x200, /* arg1= bool can fail */ + + /* */ + ACCESS_SET_TITLE, /* arg1= int can fail */ + ACCESS_SET_SEEKPOINT, /* arg1= int can fail */ + + /* Special mode for access/demux communication + * XXX: avoid to use it unless you can't */ + ACCESS_SET_PRIVATE_ID_STATE = 0x1000, /* arg1= int i_private_data, bool b_selected res=can fail */ + ACCESS_SET_PRIVATE_ID_CA, /* arg1= int i_program_number, uint16_t i_vpid, uint16_t i_apid1, uint16_t i_apid2, uint16_t i_apid3, uint8_t i_length, uint8_t *p_data */ + ACCESS_GET_PRIVATE_ID_STATE, /* arg1=int i_private_data arg2=bool * res=can fail */ +}; + +struct access_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* Access name (empty if non forced) */ + char *psz_access; + char *psz_location; /**< Location (URL with the scheme stripped) */ + char *psz_filepath; /**< Local file path (if applicable) */ + + /* Access can fill this entry to force a demuxer + * XXX: fill it once you know for sure you will succeed + * (if you fail, this value won't be reseted */ + char *psz_demux; + + /* pf_read/pf_block is used to read data. + * XXX A access should set one and only one of them */ + ssize_t (*pf_read) ( access_t *, uint8_t *, size_t ); /* Return -1 if no data yet, 0 if no more data, else real data read */ + block_t *(*pf_block)( access_t * ); /* return a block of data in his 'natural' size, NULL if not yet data or eof */ + + /* Called for each seek. + * XXX can be null */ + int (*pf_seek) ( access_t *, uint64_t ); /* can be null if can't seek */ + + /* Used to retreive and configure the access + * XXX mandatory. look at access_query_e to know what query you *have to* support */ + int (*pf_control)( access_t *, int i_query, va_list args); + + /* Access has to maintain them uptodate */ + struct + { + uint64_t i_pos; /* idem */ + bool b_eof; /* idem */ + } info; + access_sys_t *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +static inline int access_vaControl( access_t *p_access, int i_query, va_list args ) +{ + if( !p_access ) return VLC_EGENERIC; + return p_access->pf_control( p_access, i_query, args ); +} + +static inline int access_Control( access_t *p_access, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = access_vaControl( p_access, i_query, args ); + va_end( args ); + return i_result; +} + +static inline uint64_t access_GetSize( access_t *p_access ) +{ + uint64_t val; + if( access_Control( p_access, ACCESS_GET_SIZE, &val ) ) + val = 0; + return val; +} + +static inline void access_InitFields( access_t *p_a ) +{ + p_a->info.i_pos = 0; + p_a->info.b_eof = false; +} + +/** + * This function will return the parent input of this access. + * It is retained. It can return NULL. + */ +VLC_API input_thread_t * access_GetParentInput( access_t *p_access ) VLC_USED; + +#define ACCESS_SET_CALLBACKS( read, block, control, seek ) \ + do { \ + p_access->pf_read = (read); \ + p_access->pf_block = (block); \ + p_access->pf_control = (control); \ + p_access->pf_seek = (seek); \ + } while(0) + +#define STANDARD_READ_ACCESS_INIT \ + do { \ + access_InitFields( p_access ); \ + ACCESS_SET_CALLBACKS( Read, NULL, Control, Seek ); \ + p_sys = p_access->p_sys = (access_sys_t*)calloc( 1, sizeof( access_sys_t ) ); \ + if( !p_sys ) return VLC_ENOMEM;\ + } while(0); + +#define STANDARD_BLOCK_ACCESS_INIT \ + do { \ + access_InitFields( p_access ); \ + ACCESS_SET_CALLBACKS( NULL, Block, Control, Seek ); \ + p_sys = p_access->p_sys = (access_sys_t*)calloc( 1, sizeof( access_sys_t ) ); \ + if( !p_sys ) return VLC_ENOMEM; \ + } while(0); + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_addons.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_addons.h new file mode 100644 index 0000000..92d5bc6 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_addons.h @@ -0,0 +1,218 @@ +/***************************************************************************** + * vlc_addons.h : addons handling and describing + ***************************************************************************** + * Copyright (C) 2013 VideoLAN and authors + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ADDONS_H +#define VLC_ADDONS_H 1 + +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef enum addon_type_t +{ + ADDON_UNKNOWN = 0, + ADDON_EXTENSION, + ADDON_PLAYLIST_PARSER, + ADDON_SERVICE_DISCOVERY, + ADDON_SKIN2, + ADDON_PLUGIN, + ADDON_INTERFACE, + ADDON_META, + ADDON_OTHER +} addon_type_t; + +typedef enum addon_state_t +{ + ADDON_NOTINSTALLED = 0, + ADDON_INSTALLING, + ADDON_INSTALLED, + ADDON_UNINSTALLING +} addon_state_t; + +typedef enum addon_flags_t +{ + ADDON_BROKEN = 1, /* Have install inconsistency */ + ADDON_MANAGEABLE = 1 << 1, /* Have manifest, can install or uninstall files */ + ADDON_UPDATABLE = 1 << 2, +} addon_flags_t; + +#define ADDON_MAX_SCORE (5 * 100) +#define ADDON_UUID_SIZE 16 +#define ADDON_UUID_PSZ_SIZE (ADDON_UUID_SIZE * 2 + 4) +typedef uint8_t addon_uuid_t[ADDON_UUID_SIZE]; + +typedef struct addon_file_t +{ + addon_type_t e_filetype; + char *psz_download_uri; + char *psz_filename; +} addon_file_t; + +struct addon_entry_t +{ + vlc_mutex_t lock; + + addon_type_t e_type; + addon_state_t e_state; + addon_flags_t e_flags; + + /* data describing addon */ + addon_uuid_t uuid; + char *psz_name; + char *psz_summary; + char *psz_description; + char *psz_author; + char *psz_source_uri; /* webpage, ... */ + char *psz_image_uri; + char *psz_image_data; /* base64, png */ + char *psz_version; + + /* stats */ + long int i_downloads; + int i_score; /* score 0..5 in hundredth */ + + /* Lister */ + char *psz_source_module; + + /* files list */ + char *psz_archive_uri; /* Archive */ + DECL_ARRAY(addon_file_t *) files; + + /* custom data storage (if needed by module/source) */ + void * p_custom; +}; + +typedef struct addons_finder_t addons_finder_t; +typedef struct addons_finder_sys_t addons_finder_sys_t; +struct addons_finder_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_find )( addons_finder_t * ); + int ( * pf_retrieve )( addons_finder_t *, addon_entry_t * ); + DECL_ARRAY( addon_entry_t * ) entries; + char *psz_uri; + + addons_finder_sys_t *p_sys; +}; + +typedef struct addons_storage_t addons_storage_t; +typedef struct addons_storage_sys_t addons_storage_sys_t; +struct addons_storage_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_install )( addons_storage_t *, addon_entry_t * ); + int ( * pf_remove )( addons_storage_t *, addon_entry_t * ); + int ( * pf_catalog ) ( addons_storage_t *, addon_entry_t **, int ); + + addons_storage_sys_t *p_sys; +}; + +typedef struct addons_manager_private_t addons_manager_private_t; +struct addons_manager_t +{ + vlc_event_manager_t * p_event_manager; + + addons_manager_private_t *p_priv; +}; +typedef struct addons_manager_t addons_manager_t; + +/** + * addon entry lifecycle + */ +VLC_API addon_entry_t *addon_entry_New( void ); +VLC_API addon_entry_t *addon_entry_Hold(addon_entry_t *); +VLC_API void addon_entry_Release(addon_entry_t *); + +/** + * addons manager lifecycle + */ +VLC_API addons_manager_t *addons_manager_New( vlc_object_t * ); +VLC_API void addons_manager_Delete( addons_manager_t * ); + +/** + * Charge currently installed, usable and manageable addons + * (default "addons storage" module) + */ +VLC_API int addons_manager_LoadCatalog( addons_manager_t * ); + +/** + * Gather addons info from repository (default "addons finder" module) + * If psz_uri is not NULL, only gather info from the pointed package. + */ +VLC_API void addons_manager_Gather( addons_manager_t *, const char *psz_uri ); + +/** + * Install or Remove the addon identified by its uuid + */ +VLC_API int addons_manager_Install( addons_manager_t *p_manager, const addon_uuid_t uuid ); +VLC_API int addons_manager_Remove( addons_manager_t *p_manager, const addon_uuid_t uuid ); + +/** + * String uuid to binary uuid helpers + */ +static inline bool addons_uuid_read( const char *psz_uuid, addon_uuid_t *p_uuid ) +{ + if ( !psz_uuid ) return false; + if ( strlen( psz_uuid ) < ADDON_UUID_PSZ_SIZE ) return false; + + int i = 0, j = 0; + while ( i + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_H +#define VLC_AOUT_H 1 + +/** + * \file + * This file defines functions, structures and macros for audio output object + */ + +/* Buffers which arrive in advance of more than AOUT_MAX_ADVANCE_TIME + * will be considered as bogus and be trashed */ +#define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + CLOCK_FREQ) + +/* Buffers which arrive in advance of more than AOUT_MAX_PREPARE_TIME + * will cause the calling thread to sleep */ +#define AOUT_MAX_PREPARE_TIME (2 * CLOCK_FREQ) + +/* Buffers which arrive after pts - AOUT_MIN_PREPARE_TIME will be trashed + * to avoid too heavy resampling */ +#define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE + +/* Tolerance values from EBU Recommendation 37 */ +/** Maximum advance of actual audio playback time to coded PTS, + * above which downsampling will be performed */ +#define AOUT_MAX_PTS_ADVANCE (CLOCK_FREQ / 25) + +/** Maximum delay of actual audio playback time from coded PTS, + * above which upsampling will be performed */ +#define AOUT_MAX_PTS_DELAY (3 * CLOCK_FREQ / 50) + +/* Max acceptable resampling (in %) */ +#define AOUT_MAX_RESAMPLING 10 + +#include "vlc_es.h" + +#define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \ + ((p_first)->i_format == (p_second)->i_format) \ + && AOUT_FMTS_SIMILAR(p_first, p_second) ) + +/* Check if i_rate == i_rate and i_channels == i_channels */ +#define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \ + ((p_first)->i_rate == (p_second)->i_rate) \ + && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\ + && ((p_first)->i_original_channels == (p_second)->i_original_channels) ) + +#define AOUT_FMT_LINEAR( p_format ) \ + (aout_BitsPerSample((p_format)->i_format) != 0) + +#define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i') +#define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b') + +#define AOUT_FMT_SPDIF( p_format ) \ + ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \ + || ((p_format)->i_format == VLC_CODEC_SPDIFB) \ + || ((p_format)->i_format == VLC_CODEC_A52) \ + || ((p_format)->i_format == VLC_CODEC_DTS) ) + +/* Values used for the audio-channels object variable */ +#define AOUT_VAR_CHAN_UNSET 0 /* must be zero */ +#define AOUT_VAR_CHAN_STEREO 1 +#define AOUT_VAR_CHAN_RSTEREO 2 +#define AOUT_VAR_CHAN_LEFT 3 +#define AOUT_VAR_CHAN_RIGHT 4 +#define AOUT_VAR_CHAN_DOLBYS 5 + +/***************************************************************************** + * Main audio output structures + *****************************************************************************/ + +/* Size of a frame for S/PDIF output. */ +#define AOUT_SPDIF_SIZE 6144 + +/* Number of samples in an A/52 frame. */ +#define A52_FRAME_NB 1536 + +/* FIXME to remove once aout.h is cleaned a bit more */ +#include + +/** Audio output object */ +struct audio_output +{ + VLC_COMMON_MEMBERS + + struct aout_sys_t *sys; /**< Private data for callbacks */ + + int (*start)(audio_output_t *, audio_sample_format_t *fmt); + /**< Starts a new stream (mandatory, cannot be NULL). + * \param fmt input stream sample format upon entry, + * output stream sample format upon return [IN/OUT] + * \return VLC_SUCCESS on success, non-zero on failure + * \note No other stream may be already started when called. + */ + void (*stop)(audio_output_t *); + /**< Stops the existing stream (optional, may be NULL). + * \note A stream must have been started when called. + */ + int (*time_get)(audio_output_t *, mtime_t *delay); + /**< Estimates playback buffer latency (optional, may be NULL). + * \param delay pointer to the delay until the next sample to be written + * to the playback buffer is rendered [OUT] + * \return 0 on success, non-zero on failure or lack of data + * \note A stream must have been started when called. + */ + void (*play)(audio_output_t *, block_t *); + /**< Queues a block of samples for playback (mandatory, cannot be NULL). + * \note A stream must have been started when called. + */ + void (*pause)( audio_output_t *, bool pause, mtime_t date); + /**< Pauses or resumes playback (optional, may be NULL). + * \param pause pause if true, resume from pause if false + * \param date timestamp when the pause or resume was requested + * \note A stream must have been started when called. + */ + void (*flush)( audio_output_t *, bool wait); + /**< Flushes or drains the playback buffers (mandatory, cannot be NULL). + * \param wait true to wait for playback of pending buffers (drain), + * false to discard pending buffers (flush) + * \note A stream must have been started when called. + */ + int (*volume_set)(audio_output_t *, float volume); + /**< Changes playback volume (optional, may be NULL). + * \param volume requested volume (0. = mute, 1. = nominal) + * \note The volume is always a positive number. + * \warning A stream may or may not have been started when called. + */ + int (*mute_set)(audio_output_t *, bool mute); + /**< Changes muting (optinal, may be NULL). + * \param mute true to mute, false to unmute + * \warning A stream may or may not have been started when called. + */ + int (*device_select)(audio_output_t *, const char *id); + /**< Selects an audio output device (optional, may be NULL). + * \param id nul-terminated device unique identifier. + * \return 0 on success, non-zero on failure. + * \warning A stream may or may not have been started when called. + */ + struct { + void (*volume_report)(audio_output_t *, float); + void (*mute_report)(audio_output_t *, bool); + void (*policy_report)(audio_output_t *, bool); + void (*device_report)(audio_output_t *, const char *); + void (*hotplug_report)(audio_output_t *, const char *, const char *); + int (*gain_request)(audio_output_t *, float); + void (*restart_request)(audio_output_t *, unsigned); + } event; +}; + +/** + * It describes the audio channel order VLC expect. + */ +static const uint32_t pi_vlc_chan_order_wg4[] = +{ + AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, + AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, + AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_REARCENTER, + AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0 +}; + +#define AOUT_RESTART_FILTERS 1 +#define AOUT_RESTART_OUTPUT 2 +#define AOUT_RESTART_DECODER 4 + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * This function computes the reordering needed to go from pi_chan_order_in to + * pi_chan_order_out. + * If pi_chan_order_in or pi_chan_order_out is NULL, it will assume that vlc + * internal (WG4) order is requested. + */ +VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *, + uint32_t mask, uint8_t *table ); +VLC_API void aout_ChannelReorder(void *, size_t, unsigned, const uint8_t *, vlc_fourcc_t); + +VLC_API void aout_Interleave(void *dst, const void *const *planes, + unsigned samples, unsigned channels, + vlc_fourcc_t fourcc); +VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples, + unsigned channels, vlc_fourcc_t fourcc); + +/** + * This function will compute the extraction parameter into pi_selection to go + * from i_channels with their type given by pi_order_src[] into the order + * describe by pi_order_dst. + * It will also set : + * - *pi_channels as the number of channels that will be extracted which is + * lower (in case of non understood channels type) or equal to i_channels. + * - the layout of the channels (*pi_layout). + * + * It will return true if channel extraction is really needed, in which case + * aout_ChannelExtract must be used + * + * XXX It must be used when the source may have channel type not understood + * by VLC. In this case the channel type pi_order_src[] must be set to 0. + * XXX It must also be used if multiple channels have the same type. + */ +VLC_API bool aout_CheckChannelExtraction( int *pi_selection, uint32_t *pi_layout, int *pi_channels, const uint32_t pi_order_dst[AOUT_CHAN_MAX], const uint32_t *pi_order_src, int i_channels ); + +/** + * Do the actual channels extraction using the parameters created by + * aout_CheckChannelExtraction. + * + * XXX this function does not work in place (p_dst and p_src must not overlap). + * XXX Only 8, 16, 24, 32, 64 bits per sample are supported. + */ +VLC_API void aout_ChannelExtract( void *p_dst, int i_dst_channels, const void *p_src, int i_src_channels, int i_sample_count, const int *pi_selection, int i_bits_per_sample ); + +/* */ +static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt) +{ + return popcount(fmt->i_physical_channels); +} + +VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED; +VLC_API void aout_FormatPrepare( audio_sample_format_t * p_format ); +VLC_API void aout_FormatPrint(vlc_object_t *, const char *, + const audio_sample_format_t *); +#define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f) +VLC_API const char * aout_FormatPrintChannels( const audio_sample_format_t * ) VLC_USED; + +VLC_API float aout_VolumeGet (audio_output_t *); +VLC_API int aout_VolumeSet (audio_output_t *, float); +VLC_API int aout_MuteGet (audio_output_t *); +VLC_API int aout_MuteSet (audio_output_t *, bool); +VLC_API char *aout_DeviceGet (audio_output_t *); +VLC_API int aout_DeviceSet (audio_output_t *, const char *); +VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***); + +/** + * Report change of configured audio volume to the core and UI. + */ +static inline void aout_VolumeReport(audio_output_t *aout, float volume) +{ + aout->event.volume_report(aout, volume); +} + +/** + * Report change of muted flag to the core and UI. + */ +static inline void aout_MuteReport(audio_output_t *aout, bool mute) +{ + aout->event.mute_report(aout, mute); +} + +/** + * Report audio policy status. + * \parm cork true to request a cork, false to undo any pending cork. + */ +static inline void aout_PolicyReport(audio_output_t *aout, bool cork) +{ + aout->event.policy_report(aout, cork); +} + +/** + * Report change of output device. + */ +static inline void aout_DeviceReport(audio_output_t *aout, const char *id) +{ + aout->event.device_report(aout, id); +} + +/** + * Report a device hot-plug event. + * @param id device ID + * @param name human-readable device name (NULL for hot unplug) + */ +static inline void aout_HotplugReport(audio_output_t *aout, + const char *id, const char *name) +{ + aout->event.hotplug_report(aout, id, name); +} + +/** + * Request a change of software audio amplification. + * \param gain linear amplitude gain (must be positive) + * \warning Values in excess 1.0 may cause overflow and distorsion. + */ +static inline int aout_GainRequest(audio_output_t *aout, float gain) +{ + return aout->event.gain_request(aout, gain); +} + +static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode) +{ + aout->event.restart_request(aout, mode); +} + +static inline int aout_ChannelsRestart (vlc_object_t *obj, const char *varname, + vlc_value_t oldval, vlc_value_t newval, void *data) +{ + audio_output_t *aout = (audio_output_t *)obj; + (void)varname; (void)oldval; (void)newval; (void)data; + + aout_RestartRequest (aout, AOUT_RESTART_OUTPUT); + return 0; +} + +/* Audio output filters */ +typedef struct aout_filters aout_filters_t; +typedef struct aout_request_vout aout_request_vout_t; + +VLC_API aout_filters_t *aout_FiltersNew(vlc_object_t *, + const audio_sample_format_t *, + const audio_sample_format_t *, + const aout_request_vout_t *) VLC_USED; +#define aout_FiltersNew(o,inf,outf,rv) \ + aout_FiltersNew(VLC_OBJECT(o),inf,outf,rv) +VLC_API void aout_FiltersDelete(vlc_object_t *, aout_filters_t *); +#define aout_FiltersDelete(o,f) \ + aout_FiltersDelete(VLC_OBJECT(o),f) +VLC_API bool aout_FiltersAdjustResampling(aout_filters_t *, int); +VLC_API block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate); + +VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, video_format_t *p_fmt ); + +#endif /* VLC_AOUT_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_aout_volume.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_aout_volume.h new file mode 100644 index 0000000..f571afb --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_aout_volume.h @@ -0,0 +1,54 @@ +/***************************************************************************** + * vlc_aout_volume.h: audio volume module + ***************************************************************************** + * Copyright (C) 2002-2009 VLC authors and VideoLAN + * $Id: 051413ba105d5f7ee552679bf7fcd3a053db112c $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_MIXER_H +#define VLC_AOUT_MIXER_H 1 + +/** + * \file + * This file defines functions, structures and macros for audio output mixer object + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct audio_volume audio_volume_t; + +/** + * Audio volume + */ +struct audio_volume +{ + VLC_COMMON_MEMBERS + + vlc_fourcc_t format; /**< Audio samples format */ + void (*amplify)(audio_volume_t *, block_t *, float); /**< Amplifier */ +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_arrays.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_arrays.h new file mode 100644 index 0000000..dac7a52 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_arrays.h @@ -0,0 +1,622 @@ +/***************************************************************************** + * vlc_arrays.h : Arrays and data structures handling + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 91f540533b3144f00d1e74bd47dc34cf69598276 $ + * + * Authors: Samuel Hocevar + * Clément Stenac + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ARRAYS_H_ +#define VLC_ARRAYS_H_ + +/** + * \file + * This file defines functions, structures and macros for handling arrays in vlc + */ + +/* realloc() that never fails *if* downsizing */ +static inline void *realloc_down( void *ptr, size_t size ) +{ + void *ret = realloc( ptr, size ); + return ret ? ret : ptr; +} + +/** + * Simple dynamic array handling. Array is realloced at each insert/removal + */ +#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem ) \ + do \ + { \ + if( !(i_oldsize) ) (p_ar) = NULL; \ + (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof(*(p_ar)) ); \ + if( !(p_ar) ) abort(); \ + if( (i_oldsize) - (i_pos) ) \ + { \ + memmove( (p_ar) + (i_pos) + 1, (p_ar) + (i_pos), \ + ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) ); \ + } \ + (p_ar)[(i_pos)] = elem; \ + (i_oldsize)++; \ + } \ + while( 0 ) + +#define REMOVE_ELEM( p_ar, i_size, i_pos ) \ + do \ + { \ + if( (i_size) - (i_pos) - 1 ) \ + { \ + memmove( (p_ar) + (i_pos), \ + (p_ar) + (i_pos) + 1, \ + ((i_size) - (i_pos) - 1) * sizeof( *(p_ar) ) ); \ + } \ + if( i_size > 1 ) \ + (p_ar) = realloc_down( p_ar, ((i_size) - 1) * sizeof( *(p_ar) ) );\ + else \ + { \ + free( p_ar ); \ + (p_ar) = NULL; \ + } \ + (i_size)--; \ + } \ + while( 0 ) + +#define TAB_INIT( count, tab ) \ + do { \ + (count) = 0; \ + (tab) = NULL; \ + } while(0) + +#define TAB_CLEAN( count, tab ) \ + do { \ + free( tab ); \ + (count)= 0; \ + (tab)= NULL; \ + } while(0) + +#define TAB_APPEND_CAST( cast, count, tab, p ) \ + do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + (tab)[count] = (p); \ + (count)++; \ + } while(0) + +#define TAB_APPEND( count, tab, p ) \ + TAB_APPEND_CAST( , count, tab, p ) + +#define TAB_FIND( count, tab, p, idx ) \ + do { \ + for( (idx) = 0; (idx) < (count); (idx)++ ) \ + if( (tab)[(idx)] == (p) ) \ + break; \ + if( (idx) >= (count) ) \ + (idx) = -1; \ + } while(0) + + +#define TAB_REMOVE( count, tab, p ) \ + do { \ + int i_index; \ + TAB_FIND( count, tab, p, i_index ); \ + if( i_index >= 0 ) \ + { \ + if( (count) > 1 ) \ + { \ + memmove( ((void**)(tab) + i_index), \ + ((void**)(tab) + i_index+1), \ + ( (count) - i_index - 1 ) * sizeof( *(tab) ) );\ + } \ + (count)--; \ + if( (count) == 0 ) \ + { \ + free( tab ); \ + (tab) = NULL; \ + } \ + } \ + } while(0) + +#define TAB_INSERT_CAST( cast, count, tab, p, index ) do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + if( (count) - (index) > 0 ) \ + memmove( (void**)(tab) + (index) + 1, \ + (void**)(tab) + (index), \ + ((count) - (index)) * sizeof(*(tab)) );\ + (tab)[(index)] = (p); \ + (count)++; \ +} while(0) + +#define TAB_INSERT( count, tab, p, index ) \ + TAB_INSERT_CAST( , count, tab, p, index ) + +/** + * Binary search in a sorted array. The key must be comparable by < and > + * \param entries array of entries + * \param count number of entries + * \param elem key to check within an entry (like .id, or ->i_id) + * \param zetype type of the key + * \param key value of the key + * \param answer index of answer within the array. -1 if not found + */ +#define BSEARCH( entries, count, elem, zetype, key, answer ) \ + do { \ + int low = 0, high = count - 1; \ + answer = -1; \ + while( low <= high ) {\ + int mid = (low + high ) / 2; /* Just don't care about 2^30 tables */ \ + zetype mid_val = entries[mid] elem;\ + if( mid_val < key ) \ + low = mid + 1; \ + else if ( mid_val > key ) \ + high = mid -1; \ + else \ + { \ + answer = mid; break; \ + }\ + } \ + } while(0) + + +/************************************************************************ + * Dynamic arrays with progressive allocation + ************************************************************************/ + +/* Internal functions */ +#define _ARRAY_ALLOC(array, newsize) { \ + (array).i_alloc = newsize; \ + (array).p_elems = realloc( (array).p_elems, (array).i_alloc * \ + sizeof(*(array).p_elems) ); \ + if( !(array).p_elems ) abort(); \ +} + +#define _ARRAY_GROW1(array) { \ + if( (array).i_alloc < 10 ) \ + _ARRAY_ALLOC(array, 10 ) \ + else if( (array).i_alloc == (array).i_size ) \ + _ARRAY_ALLOC(array, (int)(array.i_alloc * 1.5) ) \ +} + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +/* API */ +#define DECL_ARRAY(type) struct { \ + int i_alloc; \ + int i_size; \ + type *p_elems; \ +} + +#define TYPEDEF_ARRAY(type, name) typedef DECL_ARRAY(type) name; + +#define ARRAY_INIT(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_RESET(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + free( (array).p_elems ); (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_APPEND(array, elem) \ + do { \ + _ARRAY_GROW1(array); \ + (array).p_elems[(array).i_size] = elem; \ + (array).i_size++; \ + } while(0) + +#define ARRAY_INSERT(array,elem,pos) \ + do { \ + _ARRAY_GROW1(array); \ + if( (array).i_size - pos ) { \ + memmove( (array).p_elems + pos + 1, (array).p_elems + pos, \ + ((array).i_size-pos) * sizeof(*(array).p_elems) ); \ + } \ + (array).p_elems[pos] = elem; \ + (array).i_size++; \ + } while(0) + +#define _ARRAY_SHRINK(array) { \ + if( (array).i_size > 10 && (array).i_size < (int)((array).i_alloc / 1.5) ) { \ + _ARRAY_ALLOC(array, (array).i_size + 5); \ + } \ +} + +#define ARRAY_REMOVE(array,pos) \ + do { \ + if( (array).i_size - (pos) - 1 ) \ + { \ + memmove( (array).p_elems + pos, (array).p_elems + pos + 1, \ + ( (array).i_size - pos - 1 ) *sizeof(*(array).p_elems) ); \ + } \ + (array).i_size--; \ + _ARRAY_SHRINK(array); \ + } while(0) + +#define ARRAY_VAL(array, pos) array.p_elems[pos] + +#define ARRAY_BSEARCH(array, elem, zetype, key, answer) \ + BSEARCH( (array).p_elems, (array).i_size, elem, zetype, key, answer) + +#define FOREACH_ARRAY( item, array ) { \ + int fe_idx; \ + for( fe_idx = 0 ; fe_idx < (array).i_size ; fe_idx++ ) \ + { \ + item = (array).p_elems[fe_idx]; + +#define FOREACH_END() } } + + +/************************************************************************ + * Dynamic arrays with progressive allocation (Preferred API) + ************************************************************************/ +typedef struct vlc_array_t +{ + int i_count; + void ** pp_elems; +} vlc_array_t; + +static inline void vlc_array_init( vlc_array_t * p_array ) +{ + memset( p_array, 0, sizeof(vlc_array_t) ); +} + +static inline void vlc_array_clear( vlc_array_t * p_array ) +{ + free( p_array->pp_elems ); + memset( p_array, 0, sizeof(vlc_array_t) ); +} + +static inline vlc_array_t * vlc_array_new( void ) +{ + vlc_array_t * ret = (vlc_array_t *)malloc( sizeof(vlc_array_t) ); + if( ret ) vlc_array_init( ret ); + return ret; +} + +static inline void vlc_array_destroy( vlc_array_t * p_array ) +{ + if( !p_array ) + return; + vlc_array_clear( p_array ); + free( p_array ); +} + + +/* Read */ +static inline int +vlc_array_count( vlc_array_t * p_array ) +{ + return p_array->i_count; +} + +static inline void * +vlc_array_item_at_index( vlc_array_t * p_array, int i_index ) +{ + return p_array->pp_elems[i_index]; +} + +static inline int +vlc_array_index_of_item( vlc_array_t * p_array, void * item ) +{ + int i; + for( i = 0; i < p_array->i_count; i++) + { + if( p_array->pp_elems[i] == item ) + return i; + } + return -1; +} + +/* Write */ +static inline void +vlc_array_insert( vlc_array_t * p_array, void * p_elem, int i_index ) +{ + TAB_INSERT_CAST( (void **), p_array->i_count, p_array->pp_elems, p_elem, i_index ); +} + +static inline void +vlc_array_append( vlc_array_t * p_array, void * p_elem ) +{ + vlc_array_insert( p_array, p_elem, p_array->i_count ); +} + +static inline void +vlc_array_remove( vlc_array_t * p_array, int i_index ) +{ + if( i_index >= 0 ) + { + if( p_array->i_count > 1 ) + { + memmove( p_array->pp_elems + i_index, + p_array->pp_elems + i_index+1, + ( p_array->i_count - i_index - 1 ) * sizeof( void* ) ); + } + p_array->i_count--; + if( p_array->i_count == 0 ) + { + free( p_array->pp_elems ); + p_array->pp_elems = NULL; + } + } +} + + +/************************************************************************ + * Dictionaries + ************************************************************************/ + +/* This function is not intended to be crypto-secure, we only want it to be + * fast and not suck too much. This one is pretty fast and did 0 collisions + * in wenglish's dictionary. + */ +static inline uint64_t DictHash( const char *psz_string, int hashsize ) +{ + uint64_t i_hash = 0; + if( psz_string ) + { + while( *psz_string ) + { + i_hash += *psz_string++; + i_hash += i_hash << 10; + i_hash ^= i_hash >> 8; + } + } + return i_hash % hashsize; +} + +typedef struct vlc_dictionary_entry_t +{ + char * psz_key; + void * p_value; + struct vlc_dictionary_entry_t * p_next; +} vlc_dictionary_entry_t; + +typedef struct vlc_dictionary_t +{ + int i_size; + vlc_dictionary_entry_t ** p_entries; +} vlc_dictionary_t; + +static void * const kVLCDictionaryNotFound = NULL; + +static inline void vlc_dictionary_init( vlc_dictionary_t * p_dict, int i_size ) +{ + p_dict->p_entries = NULL; + + if( i_size > 0 ) + { + p_dict->p_entries = (vlc_dictionary_entry_t **)calloc( i_size, sizeof(*p_dict->p_entries) ); + if( !p_dict->p_entries ) + i_size = 0; + } + p_dict->i_size = i_size; +} + +static inline void vlc_dictionary_clear( vlc_dictionary_t * p_dict, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( p_dict->p_entries ) + { + for( int i = 0; i < p_dict->i_size; i++ ) + { + vlc_dictionary_entry_t * p_current, * p_next; + p_current = p_dict->p_entries[i]; + while( p_current ) + { + p_next = p_current->p_next; + if( pf_free != NULL ) + ( * pf_free )( p_current->p_value, p_obj ); + free( p_current->psz_key ); + free( p_current ); + p_current = p_next; + } + } + free( p_dict->p_entries ); + p_dict->p_entries = NULL; + } + p_dict->i_size = 0; +} + +static inline int +vlc_dictionary_has_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return 0; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + return p_dict->p_entries[i_pos] != NULL; +} + +static inline void * +vlc_dictionary_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return kVLCDictionaryNotFound; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + + if( !p_entry ) + return kVLCDictionaryNotFound; + + /* Make sure we return the right item. (Hash collision) */ + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + return p_entry->p_value; + p_entry = p_entry->p_next; + } while( p_entry ); + + return kVLCDictionaryNotFound; +} + +static inline int +vlc_dictionary_keys_count( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + int i, count = 0; + + if( !p_dict->p_entries ) + return 0; + + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) count++; + } + return count; +} + +static inline char ** +vlc_dictionary_all_keys( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + char ** ppsz_ret; + int i, count = vlc_dictionary_keys_count( p_dict ); + + ppsz_ret = (char**)malloc(sizeof(char *) * (count + 1)); + if( unlikely(!ppsz_ret) ) + return NULL; + + count = 0; + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) + ppsz_ret[count++] = strdup( p_entry->psz_key ); + } + ppsz_ret[count] = NULL; + return ppsz_ret; +} + +static inline void +__vlc_dictionary_insert( vlc_dictionary_t * p_dict, const char * psz_key, + void * p_value, bool rebuild ) +{ + if( !p_dict->p_entries ) + vlc_dictionary_init( p_dict, 1 ); + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry; + + p_entry = (vlc_dictionary_entry_t *)malloc(sizeof(*p_entry)); + p_entry->psz_key = strdup( psz_key ); + p_entry->p_value = p_value; + p_entry->p_next = p_dict->p_entries[i_pos]; + p_dict->p_entries[i_pos] = p_entry; + if( rebuild ) + { + /* Count how many items there was */ + int count; + for( count = 1; p_entry->p_next; count++ ) + p_entry = p_entry->p_next; + if( count > 3 ) /* XXX: this need tuning */ + { + /* Here it starts to be not good, rebuild a bigger dictionary */ + struct vlc_dictionary_t new_dict; + int i_new_size = ( (p_dict->i_size+2) * 3) / 2; /* XXX: this need tuning */ + int i; + vlc_dictionary_init( &new_dict, i_new_size ); + for( i = 0; i < p_dict->i_size; i++ ) + { + p_entry = p_dict->p_entries[i]; + while( p_entry ) + { + __vlc_dictionary_insert( &new_dict, p_entry->psz_key, + p_entry->p_value, + false /* To avoid multiple rebuild loop */); + p_entry = p_entry->p_next; + } + } + + vlc_dictionary_clear( p_dict, NULL, NULL ); + p_dict->i_size = new_dict.i_size; + p_dict->p_entries = new_dict.p_entries; + } + } +} + +static inline void +vlc_dictionary_insert( vlc_dictionary_t * p_dict, const char * psz_key, void * p_value ) +{ + __vlc_dictionary_insert( p_dict, psz_key, p_value, true ); +} + +static inline void +vlc_dictionary_remove_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( !p_dict->p_entries ) + return; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + vlc_dictionary_entry_t * p_prev; + + if( !p_entry ) + return; /* Not found, nothing to do */ + + /* Hash collision */ + p_prev = NULL; + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + { + if( pf_free != NULL ) + ( * pf_free )( p_entry->p_value, p_obj ); + if( !p_prev ) + p_dict->p_entries[i_pos] = p_entry->p_next; + else + p_prev->p_next = p_entry->p_next; + free( p_entry->psz_key ); + free( p_entry ); + return; + } + p_prev = p_entry; + p_entry = p_entry->p_next; + } while( p_entry ); + + /* No key was found */ +} + +#ifdef __cplusplus +// C++ helpers +template +void vlc_delete_all( T &container ) +{ + typename T::iterator it = container.begin(); + while ( it != container.end() ) + { + delete *it; + ++it; + } + container.clear(); +} + +#endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_atomic.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_atomic.h new file mode 100644 index 0000000..15ccf8c --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_atomic.h @@ -0,0 +1,430 @@ +/***************************************************************************** + * vlc_atomic.h: + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ATOMIC_H +# define VLC_ATOMIC_H + +/** + * \file + * Atomic operations do not require locking, but they are not very powerful. + */ + +# if !defined (__cplusplus) && (__STDC_VERSION__ >= 201112L) \ + && !defined (__STDC_NO_ATOMICS__) + +/*** Native C11 atomics ***/ +# include + +# else + +# define ATOMIC_FLAG_INIT false + +# define ATOMIC_VAR_INIT(value) (value) + +# define atomic_init(obj, value) \ + do { *(obj) = (value); } while(0) + +# define kill_dependency(y) \ + ((void)0) + +# define atomic_thread_fence(order) \ + __sync_synchronize() + +# define atomic_signal_fence(order) \ + ((void)0) + +# define atomic_is_lock_free(obj) \ + false + +/* In principles, __sync_*() only supports int, long and long long and their + * unsigned equivalents, i.e. 4-bytes and 8-bytes types, although GCC also + * supports 1 and 2-bytes types. Some non-x86 architectures do not support + * 8-byte atomic types (or not efficiently). */ +# if defined (_MSC_VER) +/* Some atomic operations of the Interlocked API are only + available for desktop apps. Thus we define the atomic types to + be at least 32 bits wide. */ +typedef int_least32_t atomic_flag; +typedef int_least32_t atomic_bool; +typedef int_least32_t atomic_char; +typedef int_least32_t atomic_schar; +typedef uint_least32_t atomic_uchar; +typedef int_least32_t atomic_short; +typedef uint_least32_t atomic_ushort; +# else +typedef bool atomic_flag; +typedef bool atomic_bool; +typedef char atomic_char; +typedef signed char atomic_schar; +typedef unsigned char atomic_uchar; +typedef short atomic_short; +typedef unsigned short atomic_ushort; +# endif +typedef int atomic_int; +typedef unsigned int atomic_uint; +typedef long atomic_long; +typedef unsigned long atomic_ulong; +typedef long long atomic_llong; +typedef unsigned long long atomic_ullong; +//typedef char16_t atomic_char16_t; +//typedef char32_t atomic_char32_t; +typedef wchar_t atomic_wchar_t; +typedef int_least8_t atomic_int_least8_t; +typedef uint_least8_t atomic_uint_least8_t; +typedef int_least16_t atomic_int_least16_t; +typedef uint_least16_t atomic_uint_least16_t; +typedef int_least32_t atomic_int_least32_t; +typedef uint_least32_t atomic_uint_least32_t; +typedef int_least64_t atomic_int_least64_t; +typedef uint_least64_t atomic_uint_least64_t; +typedef int_fast8_t atomic_int_fast8_t; +typedef uint_fast8_t atomic_uint_fast8_t; +typedef int_fast16_t atomic_int_fast16_t; +typedef uint_fast16_t atomic_uint_fast16_t; +typedef int_fast32_t atomic_int_fast32_t; +typedef uint_fast32_t atomic_uint_fast32_t; +typedef int_fast64_t atomic_int_fast64_t; +typedef uint_fast64_t atomic_uint_fast64_t; +typedef intptr_t atomic_intptr_t; +typedef uintptr_t atomic_uintptr_t; +typedef size_t atomic_size_t; +typedef ptrdiff_t atomic_ptrdiff_t; +typedef intmax_t atomic_intmax_t; +typedef uintmax_t atomic_uintmax_t; + +# if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || (defined (__clang__) && (defined (__x86_64__) || defined (__i386__))) + +/*** Intel/GCC atomics ***/ + +# define atomic_store(object,desired) \ + do { \ + *(object) = (desired); \ + __sync_synchronize(); \ + } while (0) + +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object,desired) + +# define atomic_load(object) \ + (__sync_synchronize(), *(object)) + +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _old; \ + do \ + _old = atomic_load(_obj); \ + while (!__sync_bool_compare_and_swap(_obj, _old, (desired))); \ + _old; \ +}) + +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object,desired) + +# define atomic_compare_exchange(object,expected,desired) \ +({ \ + typeof (object) _exp = (expected); \ + typeof (*object) _old = *_exp; \ + *_exp = __sync_val_compare_and_swap((object), _old, (desired)); \ + *_exp == _old; \ +}) + +# define atomic_compare_exchange_strong(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order,order_different) \ + atomic_compare_exchange_strong(object, expected, desired) + +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order_equal,order_different) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_add(object,operand) \ + __sync_fetch_and_add(object, operand) + +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object,operand) + +# define atomic_fetch_sub(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_or(object,operand) \ + __sync_fetch_and_or(object, operand) + +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object,operand) + +# define atomic_fetch_xor(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_and(object,operand) \ + __sync_fetch_and_and(object, operand) + +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object,operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# elif defined (__GNUC__) + +/*** No atomics ***/ + +# define atomic_store(object,desired) \ + do { \ + typeof (object) _obj = (object); \ + typeof (*object) _des = (desired); \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + *_obj = _des; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + } while (0) +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object,desired) + +# define atomic_load(object) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _old; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + _old = *_obj; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + _old; \ +}) +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _des = (desired); \ + typeof (*object) _old; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + _old = *_obj; \ + *_obj = _des; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + _old; \ +}) +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object,desired) + +# define atomic_compare_exchange_strong(object,expected,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (object) _exp = (expected); \ + typeof (*object) _des = (desired); \ + bool ret; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + ret = *_obj == *_exp; \ + if (ret) \ + *_obj = _des; \ + else \ + *_exp = *_obj; \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + ret; \ +}) +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_OP(object,desired,op) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _des = (desired); \ + typeof (*object) _old; \ + vlc_global_lock(VLC_ATOMIC_MUTEX); \ + _old = *_obj; \ + *_obj = (*_obj) op (_des); \ + vlc_global_unlock(VLC_ATOMIC_MUTEX); \ + _old; \ +}) + +# define atomic_fetch_add(object,operand) \ + atomic_fetch_OP(object,operand,+) +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object,operand) + +# define atomic_fetch_sub(object,operand) \ + atomic_fetch_OP(object,operand,-) +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_or(object,operand) \ + atomic_fetch_OP(object,operand,|) +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object,operand) + +# define atomic_fetch_xor(object,operand) \ + atomic_fetch_OP(object,operand,^) +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_and(object,operand) \ + atomic_fetch_OP(object,operand,&) +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object,operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# elif defined (_MSC_VER) + +# include + +/*** Use the Interlocked API. ***/ + +/* Define macros in order to dispatch to the correct function depending on the type. + Several ranges are need because some operations are not implemented for all types. */ +# define atomic_type_dispatch_32_64(operation, object, ...) \ + (sizeof(*object) == 4 ? operation((LONG *)object, __VA_ARGS__) : \ + sizeof(*object) == 8 ? operation##64((LONGLONG *)object, __VA_ARGS__) : \ + (abort(), 0)) + +# define atomic_type_dispatch_16_64(operation, object, ...) \ + (sizeof(*object) == 2 ? operation##16((short *)object, __VA_ARGS__) : \ + atomic_type_dispatch_32_64(operation, object, __VA_ARGS__)) + +# define atomic_type_dispatch_8_64(operation, object, ...) \ + (sizeof(*object) == 1 ? operation##8((char *)object, __VA_ARGS__) : \ + atomic_type_dispatch_16_64(operation, object, __VA_ARGS__)) + +# define atomic_store(object,desired) \ + atomic_type_dispatch_16_64(InterlockedExchange, object, desired) +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object, desired) + +# define atomic_load(object) \ + atomic_type_dispatch_16_64(InterlockedCompareExchange, object, 0, 0) +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ + atomic_type_dispatch_16_64(InterlockedExchange, object, desired) +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object, desired) + +# define atomic_compare_exchange_strong(object,expected,desired) \ + atomic_type_dispatch_16_64(InterlockedCompareExchange, object, *expected, desired) == *expected +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_add(object,operand) \ + atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, operand) +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object, operand) + +# define atomic_fetch_sub(object,operand) \ + atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, -(LONGLONG)operand) +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object, operand) + +# define atomic_fetch_or(object,operand) \ + atomic_type_dispatch_8_64(InterlockedOr, object, operand) +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object, operand) + +# define atomic_fetch_xor(object,operand) \ + atomic_type_dispatch_8_64(InterlockedXor, object, operand) +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object, operand) + +# define atomic_fetch_and(object,operand) \ + atomic_type_dispatch_8_64(InterlockedAnd, object, operand) +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object, operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# else +# error FIXME: implement atomic operations for this compiler. +# endif +# endif + +typedef atomic_uint_least32_t vlc_atomic_float; + +static inline void vlc_atomic_init_float(vlc_atomic_float *var, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_init(var, u.i); +} + +/** Helper to retrieve a single precision from an atom. */ +static inline float vlc_atomic_load_float(vlc_atomic_float *atom) +{ + union { float f; uint32_t i; } u; + u.i = atomic_load(atom); + return u.f; +} + +/** Helper to store a single precision into an atom. */ +static inline void vlc_atomic_store_float(vlc_atomic_float *atom, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_store(atom, u.i); +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_avcodec.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_avcodec.h new file mode 100644 index 0000000..664633a --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_avcodec.h @@ -0,0 +1,34 @@ +/***************************************************************************** + * vlc_avcodec.h: VLC thread support for libavcodec + ***************************************************************************** + * Copyright (C) 2009-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AVCODEC_H +# define VLC_AVCODEC_H 1 + +static inline void vlc_avcodec_lock (void) +{ + vlc_global_lock (VLC_AVCODEC_MUTEX); +} + +static inline void vlc_avcodec_unlock (void) +{ + vlc_global_unlock (VLC_AVCODEC_MUTEX); +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_bits.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_bits.h new file mode 100644 index 0000000..80010de --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_bits.h @@ -0,0 +1,197 @@ +/***************************************************************************** + * vlc_bits.h : Bit handling helpers + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 6c2915138c768d9c49b6646dde6c711acf6eabef $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BITS_H +#define VLC_BITS_H 1 + +/** + * \file + * This file defines functions, structures for handling streams of bits in vlc + */ + +typedef struct bs_s +{ + uint8_t *p_start; + uint8_t *p; + uint8_t *p_end; + + ssize_t i_left; /* i_count number of available bits */ +} bs_t; + +static inline void bs_init( bs_t *s, const void *p_data, size_t i_data ) +{ + s->p_start = (void *)p_data; + s->p = s->p_start; + s->p_end = s->p_start + i_data; + s->i_left = 8; +} + +static inline int bs_pos( const bs_t *s ) +{ + return( 8 * ( s->p - s->p_start ) + 8 - s->i_left ); +} + +static inline int bs_eof( const bs_t *s ) +{ + return( s->p >= s->p_end ? 1: 0 ); +} + +static inline uint32_t bs_read( bs_t *s, int i_count ) +{ + static const uint32_t i_mask[33] = + { 0x00, + 0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff, 0x3ff, 0x7ff, 0xfff, + 0x1fff, 0x3fff, 0x7fff, 0xffff, + 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, + 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, + 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, + 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff}; + int i_shr; + uint32_t i_result = 0; + + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + if( ( i_shr = s->i_left - i_count ) >= 0 ) + { + /* more in the buffer than requested */ + i_result |= ( *s->p >> i_shr )&i_mask[i_count]; + s->i_left -= i_count; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + return( i_result ); + } + else + { + /* less in the buffer than requested */ + i_result |= (*s->p&i_mask[s->i_left]) << -i_shr; + i_count -= s->i_left; + s->p++; + s->i_left = 8; + } + } + + return( i_result ); +} + +static inline uint32_t bs_read1( bs_t *s ) +{ + if( s->p < s->p_end ) + { + unsigned int i_result; + + s->i_left--; + i_result = ( *s->p >> s->i_left )&0x01; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + return i_result; + } + + return 0; +} + +static inline uint32_t bs_show( bs_t *s, int i_count ) +{ + bs_t s_tmp = *s; + return bs_read( &s_tmp, i_count ); +} + +static inline void bs_skip( bs_t *s, ssize_t i_count ) +{ + s->i_left -= i_count; + + if( s->i_left <= 0 ) + { + const int i_bytes = ( -s->i_left + 8 ) / 8; + + s->p += i_bytes; + s->i_left += 8 * i_bytes; + } +} + +static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits ) +{ + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + i_count--; + + if( ( i_bits >> i_count )&0x01 ) + { + *s->p |= 1 << ( s->i_left - 1 ); + } + else + { + *s->p &= ~( 1 << ( s->i_left - 1 ) ); + } + s->i_left--; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + } +} + +static inline void bs_align( bs_t *s ) +{ + if( s->i_left != 8 ) + { + s->i_left = 8; + s->p++; + } +} + +static inline void bs_align_0( bs_t *s ) +{ + if( s->i_left != 8 ) + { + bs_write( s, s->i_left, 0 ); + } +} + +static inline void bs_align_1( bs_t *s ) +{ + while( s->i_left != 8 ) + { + bs_write( s, 1, 1 ); + } +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_block.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_block.h new file mode 100644 index 0000000..20377e1 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_block.h @@ -0,0 +1,321 @@ +/***************************************************************************** + * vlc_block.h: Data blocks management functions + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 75f98ff4bd59bf3dad9356f9e84ebe53942efe69 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_H +#define VLC_BLOCK_H 1 + +/** + * \file + * This file implements functions and structures to handle blocks of data in vlc + * + */ + +#include /* for ssize_t */ + +/**************************************************************************** + * block: + **************************************************************************** + * - i_flags may not always be set (ie could be 0, even for a key frame + * it depends where you receive the buffer (before/after a packetizer + * and the demux/packetizer implementations. + * - i_dts/i_pts could be VLC_TS_INVALID, it means no pts/dts + * - i_length: length in microseond of the packet, can be null except in the + * sout where it is mandatory. + * + * - i_buffer number of valid data pointed by p_buffer + * you can freely decrease it but never increase it yourself + * (use block_Realloc) + * - p_buffer: pointer over datas. You should never overwrite it, you can + * only incremment it to skip datas, in others cases use block_Realloc + * (don't duplicate yourself in a bigger buffer, block_Realloc is + * optimised for preheader/postdatas increase) + ****************************************************************************/ + +/** The content doesn't follow the last block, or is probably broken */ +#define BLOCK_FLAG_DISCONTINUITY 0x0001 +/** Intra frame */ +#define BLOCK_FLAG_TYPE_I 0x0002 +/** Inter frame with backward reference only */ +#define BLOCK_FLAG_TYPE_P 0x0004 +/** Inter frame with backward and forward reference */ +#define BLOCK_FLAG_TYPE_B 0x0008 +/** For inter frame when you don't know the real type */ +#define BLOCK_FLAG_TYPE_PB 0x0010 +/** Warn that this block is a header one */ +#define BLOCK_FLAG_HEADER 0x0020 +/** This is the last block of the frame */ +#define BLOCK_FLAG_END_OF_FRAME 0x0040 +/** This is not a key frame for bitrate shaping */ +#define BLOCK_FLAG_NO_KEYFRAME 0x0080 +/** This block contains the last part of a sequence */ +#define BLOCK_FLAG_END_OF_SEQUENCE 0x0100 +/** This block contains a clock reference */ +#define BLOCK_FLAG_CLOCK 0x0200 +/** This block is scrambled */ +#define BLOCK_FLAG_SCRAMBLED 0x0400 +/** This block has to be decoded but not be displayed */ +#define BLOCK_FLAG_PREROLL 0x0800 +/** This block is corrupted and/or there is data loss */ +#define BLOCK_FLAG_CORRUPTED 0x1000 +/** This block contains an interlaced picture with top field first */ +#define BLOCK_FLAG_TOP_FIELD_FIRST 0x2000 +/** This block contains an interlaced picture with bottom field first */ +#define BLOCK_FLAG_BOTTOM_FIELD_FIRST 0x4000 + +/** This block contains an interlaced picture */ +#define BLOCK_FLAG_INTERLACED_MASK \ + (BLOCK_FLAG_TOP_FIELD_FIRST|BLOCK_FLAG_BOTTOM_FIELD_FIRST) + +#define BLOCK_FLAG_TYPE_MASK \ + (BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB) + +/* These are for input core private usage only */ +#define BLOCK_FLAG_CORE_PRIVATE_MASK 0x00ff0000 +#define BLOCK_FLAG_CORE_PRIVATE_SHIFT 16 + +/* These are for module private usage only */ +#define BLOCK_FLAG_PRIVATE_MASK 0xff000000 +#define BLOCK_FLAG_PRIVATE_SHIFT 24 + +typedef void (*block_free_t) (block_t *); + +struct block_t +{ + block_t *p_next; + + uint8_t *p_buffer; /**< Payload start */ + size_t i_buffer; /**< Payload length */ + uint8_t *p_start; /**< Buffer start */ + size_t i_size; /**< Buffer total size */ + + uint32_t i_flags; + unsigned i_nb_samples; /* Used for audio */ + + mtime_t i_pts; + mtime_t i_dts; + mtime_t i_length; + + /* Rudimentary support for overloading block (de)allocation. */ + block_free_t pf_release; +}; + +/**************************************************************************** + * Blocks functions: + **************************************************************************** + * - block_Alloc : create a new block with the requested size ( >= 0 ), return + * NULL for failure. + * - block_Release : release a block allocated with block_Alloc. + * - block_Realloc : realloc a block, + * i_pre: how many bytes to insert before body if > 0, else how many + * bytes of body to skip (the latter can be done without using + * block_Realloc i_buffer -= -i_pre, p_buffer += -i_pre as i_pre < 0) + * i_body (>= 0): the final size of the body (decreasing it can directly + * be done with i_buffer = i_body). + * with preheader and or body (increase + * and decrease are supported). Use it as it is optimised. + * - block_Duplicate : create a copy of a block. + ****************************************************************************/ +VLC_API void block_Init( block_t *, void *, size_t ); +VLC_API block_t *block_Alloc( size_t ) VLC_USED VLC_MALLOC; +VLC_API block_t *block_Realloc( block_t *, ssize_t i_pre, size_t i_body ) VLC_USED; + +static inline void block_CopyProperties( block_t *dst, block_t *src ) +{ + dst->i_flags = src->i_flags; + dst->i_nb_samples = src->i_nb_samples; + dst->i_dts = src->i_dts; + dst->i_pts = src->i_pts; + dst->i_length = src->i_length; +} + +VLC_USED +static inline block_t *block_Duplicate( block_t *p_block ) +{ + block_t *p_dup = block_Alloc( p_block->i_buffer ); + if( p_dup == NULL ) + return NULL; + + block_CopyProperties( p_dup, p_block ); + memcpy( p_dup->p_buffer, p_block->p_buffer, p_block->i_buffer ); + + return p_dup; +} + +static inline void block_Release( block_t *p_block ) +{ + p_block->pf_release( p_block ); +} + +VLC_API block_t *block_heap_Alloc(void *, size_t) VLC_USED VLC_MALLOC; +VLC_API block_t *block_mmap_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; +VLC_API block_t * block_shm_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; +VLC_API block_t *block_File(int fd) VLC_USED VLC_MALLOC; +VLC_API block_t *block_FilePath(const char *) VLC_USED VLC_MALLOC; + +static inline void block_Cleanup (void *block) +{ + block_Release ((block_t *)block); +} +#define block_cleanup_push( block ) vlc_cleanup_push (block_Cleanup, block) + +/**************************************************************************** + * Chains of blocks functions helper + **************************************************************************** + * - block_ChainAppend : append a block to the last block of a chain. Try to + * avoid using with a lot of data as it's really slow, prefer + * block_ChainLastAppend, p_block can be NULL + * - block_ChainLastAppend : use a pointer over a pointer to the next blocks, + * and update it. + * - block_ChainRelease : release a chain of block + * - block_ChainExtract : extract data from a chain, return real bytes counts + * - block_ChainGather : gather a chain, free it and return one block. + ****************************************************************************/ +static inline void block_ChainAppend( block_t **pp_list, block_t *p_block ) +{ + if( *pp_list == NULL ) + { + *pp_list = p_block; + } + else + { + block_t *p = *pp_list; + + while( p->p_next ) p = p->p_next; + p->p_next = p_block; + } +} + +static inline void block_ChainLastAppend( block_t ***ppp_last, block_t *p_block ) +{ + block_t *p_last = p_block; + + **ppp_last = p_block; + + while( p_last->p_next ) p_last = p_last->p_next; + *ppp_last = &p_last->p_next; +} + +static inline void block_ChainRelease( block_t *p_block ) +{ + while( p_block ) + { + block_t *p_next = p_block->p_next; + block_Release( p_block ); + p_block = p_next; + } +} + +static size_t block_ChainExtract( block_t *p_list, void *p_data, size_t i_max ) +{ + size_t i_total = 0; + uint8_t *p = (uint8_t*)p_data; + + while( p_list && i_max ) + { + size_t i_copy = __MIN( i_max, p_list->i_buffer ); + memcpy( p, p_list->p_buffer, i_copy ); + i_max -= i_copy; + i_total += i_copy; + p += i_copy; + + p_list = p_list->p_next; + } + return i_total; +} + +static inline void block_ChainProperties( block_t *p_list, int *pi_count, size_t *pi_size, mtime_t *pi_length ) +{ + size_t i_size = 0; + mtime_t i_length = 0; + int i_count = 0; + + while( p_list ) + { + i_size += p_list->i_buffer; + i_length += p_list->i_length; + i_count++; + + p_list = p_list->p_next; + } + + if( pi_size ) + *pi_size = i_size; + if( pi_length ) + *pi_length = i_length; + if( pi_count ) + *pi_count = i_count; +} + +static inline block_t *block_ChainGather( block_t *p_list ) +{ + size_t i_total = 0; + mtime_t i_length = 0; + block_t *g; + + if( p_list->p_next == NULL ) + return p_list; /* Already gathered */ + + block_ChainProperties( p_list, NULL, &i_total, &i_length ); + + g = block_Alloc( i_total ); + block_ChainExtract( p_list, g->p_buffer, g->i_buffer ); + + g->i_flags = p_list->i_flags; + g->i_pts = p_list->i_pts; + g->i_dts = p_list->i_dts; + g->i_length = i_length; + + /* free p_list */ + block_ChainRelease( p_list ); + return g; +} + +/**************************************************************************** + * Fifos of blocks. + **************************************************************************** + * - block_FifoNew : create and init a new fifo + * - block_FifoRelease : destroy a fifo and free all blocks in it. + * - block_FifoPace : wait for a fifo to drain to a specified number of packets or total data size + * - block_FifoEmpty : free all blocks in a fifo + * - block_FifoPut : put a block + * - block_FifoGet : get a packet from the fifo (and wait if it is empty) + * - block_FifoShow : show the first packet of the fifo (and wait if + * needed), be carefull, you can use it ONLY if you are sure to be the + * only one getting data from the fifo. + * - block_FifoCount : how many packets are waiting in the fifo + * + * block_FifoGet and block_FifoShow are cancellation points. + ****************************************************************************/ + +VLC_API block_fifo_t *block_FifoNew( void ) VLC_USED VLC_MALLOC; +VLC_API void block_FifoRelease( block_fifo_t * ); +VLC_API void block_FifoPace( block_fifo_t *fifo, size_t max_depth, size_t max_size ); +VLC_API void block_FifoEmpty( block_fifo_t * ); +VLC_API size_t block_FifoPut( block_fifo_t *, block_t * ); +VLC_API void block_FifoWake( block_fifo_t * ); +VLC_API block_t * block_FifoGet( block_fifo_t * ) VLC_USED; +VLC_API block_t * block_FifoShow( block_fifo_t * ); +size_t block_FifoSize( const block_fifo_t *p_fifo ) VLC_USED; +VLC_API size_t block_FifoCount( const block_fifo_t *p_fifo ) VLC_USED; + +#endif /* VLC_BLOCK_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_block_helper.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_block_helper.h new file mode 100644 index 0000000..2e6231f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_block_helper.h @@ -0,0 +1,517 @@ +/***************************************************************************** + * vlc_block_helper.h: Helper functions for data blocks management. + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: fdd5fdbeafee1f296c157410ef3e69a7cf57d3e5 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_HELPER_H +#define VLC_BLOCK_HELPER_H 1 + +#include + +typedef struct block_bytestream_t +{ + block_t *p_chain; /**< byte stream head block */ + block_t *p_block; /**< byte stream read pointer block */ + size_t i_offset; /**< byte stream read pointer offset within block */ + /* TODO? add tail pointer for faster push? */ +} block_bytestream_t; + +/***************************************************************************** + * block_bytestream_t management + *****************************************************************************/ +static inline void block_BytestreamInit( block_bytestream_t *p_bytestream ) +{ + p_bytestream->p_chain = p_bytestream->p_block = NULL; + p_bytestream->i_offset = 0; +} + +static inline void block_BytestreamRelease( block_bytestream_t *p_bytestream ) +{ + for( block_t *block = p_bytestream->p_chain; block != NULL; ) + { + block_t *p_next = block->p_next; + + block_Release( block ); + block = p_next; + } +} + +/** + * It flush all data (read and unread) from a block_bytestream_t. + */ +static inline void block_BytestreamEmpty( block_bytestream_t *p_bytestream ) +{ + block_BytestreamRelease( p_bytestream ); + block_BytestreamInit( p_bytestream ); +} + +/** + * It flushes all already read data from a block_bytestream_t. + */ +static inline void block_BytestreamFlush( block_bytestream_t *p_bytestream ) +{ + block_t *block = p_bytestream->p_chain; + + while( block != p_bytestream->p_block ) + { + block_t *p_next = block->p_next; + + block_Release( block ); + block = p_next; + } + + while( block != NULL && block->i_buffer == p_bytestream->i_offset ) + { + block_t *p_next = block->p_next; + + block_Release( block ); + block = p_next; + p_bytestream->i_offset = 0; + } + + p_bytestream->p_chain = p_bytestream->p_block = block; +} + +static inline void block_BytestreamPush( block_bytestream_t *p_bytestream, + block_t *p_block ) +{ + block_ChainAppend( &p_bytestream->p_chain, p_block ); + if( !p_bytestream->p_block ) p_bytestream->p_block = p_block; +} + +VLC_USED +static inline block_t *block_BytestreamPop( block_bytestream_t *p_bytestream ) +{ + block_t *p_block; + + block_BytestreamFlush( p_bytestream ); + + p_block = p_bytestream->p_block; + if( p_block == NULL ) + { + return NULL; + } + else if( !p_block->p_next ) + { + p_block->p_buffer += p_bytestream->i_offset; + p_block->i_buffer -= p_bytestream->i_offset; + p_bytestream->i_offset = 0; + p_bytestream->p_chain = p_bytestream->p_block = NULL; + return p_block; + } + + while( p_block->p_next && p_block->p_next->p_next ) + p_block = p_block->p_next; + + block_t *p_block_old = p_block; + p_block = p_block->p_next; + p_block_old->p_next = NULL; + + return p_block; +} + +static inline int block_SkipByte( block_bytestream_t *p_bytestream ) +{ + /* Most common case first */ + if( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) + { + p_bytestream->i_offset++; + return VLC_SUCCESS; + } + else + { + block_t *p_block; + + /* Less common case which is also slower */ + for( p_block = p_bytestream->p_block->p_next; + p_block != NULL; p_block = p_block->p_next ) + { + if( p_block->i_buffer ) + { + p_bytestream->i_offset = 1; + p_bytestream->p_block = p_block; + return VLC_SUCCESS; + } + } + } + + /* Not enough data, bail out */ + return VLC_EGENERIC; +} + +static inline int block_PeekByte( block_bytestream_t *p_bytestream, + uint8_t *p_data ) +{ + /* Most common case first */ + if( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) + { + *p_data = p_bytestream->p_block->p_buffer[p_bytestream->i_offset]; + return VLC_SUCCESS; + } + else + { + block_t *p_block; + + /* Less common case which is also slower */ + for( p_block = p_bytestream->p_block->p_next; + p_block != NULL; p_block = p_block->p_next ) + { + if( p_block->i_buffer ) + { + *p_data = p_block->p_buffer[0]; + return VLC_SUCCESS; + } + } + } + + /* Not enough data, bail out */ + return VLC_EGENERIC; +} + +static inline int block_GetByte( block_bytestream_t *p_bytestream, + uint8_t *p_data ) +{ + /* Most common case first */ + if( p_bytestream->p_block->i_buffer - p_bytestream->i_offset ) + { + *p_data = p_bytestream->p_block->p_buffer[p_bytestream->i_offset]; + p_bytestream->i_offset++; + return VLC_SUCCESS; + } + else + { + block_t *p_block; + + /* Less common case which is also slower */ + for( p_block = p_bytestream->p_block->p_next; + p_block != NULL; p_block = p_block->p_next ) + { + if( p_block->i_buffer ) + { + *p_data = p_block->p_buffer[0]; + p_bytestream->i_offset = 1; + p_bytestream->p_block = p_block; + return VLC_SUCCESS; + } + } + } + + /* Not enough data, bail out */ + return VLC_EGENERIC; +} + +static inline int block_WaitBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + return VLC_SUCCESS; +} + +static inline int block_SkipBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_data, p_block->i_buffer - i_offset ); + i_data -= i_copy; + + if( !i_data ) break; + + i_offset = 0; + } + + if( i_data ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + p_bytestream->p_block = p_block; + p_bytestream->i_offset = i_offset + i_copy; + return VLC_SUCCESS; +} + +static inline int block_PeekBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Copy the data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +static inline int block_GetBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Copy the data */ + i_offset = p_bytestream->i_offset; + i_size = i_data; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + if( !i_size ) break; + + i_offset = 0; + } + + p_bytestream->p_block = p_block; + p_bytestream->i_offset = i_offset + i_copy; + + return VLC_SUCCESS; +} + +static inline int block_PeekOffsetBytes( block_bytestream_t *p_bytestream, + size_t i_peek_offset, uint8_t *p_data, size_t i_data ) +{ + block_t *p_block; + size_t i_offset, i_copy, i_size; + + /* Check we have that much data */ + i_offset = p_bytestream->i_offset; + i_size = i_data + i_peek_offset; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + i_offset = 0; + + if( !i_size ) break; + } + + if( i_size ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Find the right place */ + i_offset = p_bytestream->i_offset; + i_size = i_peek_offset; + i_copy = 0; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( !i_size ) break; + + i_offset = 0; + } + + /* Copy the data */ + i_offset += i_copy; + i_size = i_data; + i_copy = 0; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +static inline int block_FindStartcodeFromOffset( + block_bytestream_t *p_bytestream, size_t *pi_offset, + const uint8_t *p_startcode, int i_startcode_length ) +{ + block_t *p_block, *p_block_backup = 0; + int i_size = 0; + size_t i_offset, i_offset_backup = 0; + int i_caller_offset_backup = 0, i_match; + + /* Find the right place */ + i_size = *pi_offset + p_bytestream->i_offset; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_size -= p_block->i_buffer; + if( i_size < 0 ) break; + } + + if( i_size >= 0 ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Begin the search. + * We first look for an occurrence of the 1st startcode byte and + * if found, we do a more thorough check. */ + i_size += p_block->i_buffer; + *pi_offset -= i_size; + i_match = 0; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + for( i_offset = i_size; i_offset < p_block->i_buffer; i_offset++ ) + { + if( p_block->p_buffer[i_offset] == p_startcode[i_match] ) + { + if( !i_match ) + { + p_block_backup = p_block; + i_offset_backup = i_offset; + i_caller_offset_backup = *pi_offset; + } + + if( i_match + 1 == i_startcode_length ) + { + /* We have it */ + *pi_offset += i_offset - i_match; + return VLC_SUCCESS; + } + + i_match++; + } + else if ( i_match ) + { + /* False positive */ + p_block = p_block_backup; + i_offset = i_offset_backup; + *pi_offset = i_caller_offset_backup; + i_match = 0; + } + + } + i_size = 0; + *pi_offset += i_offset; + } + + *pi_offset -= i_match; + return VLC_EGENERIC; +} + +#endif /* VLC_BLOCK_HELPER_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_charset.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_charset.h new file mode 100644 index 0000000..fb265c5 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_charset.h @@ -0,0 +1,213 @@ +/***************************************************************************** + * vlc_charset.h: Unicode UTF-8 wrappers function + ***************************************************************************** + * Copyright (C) 2003-2005 VLC authors and VideoLAN + * Copyright © 2005-2010 Rémi Denis-Courmont + * $Id: 3119e89fd6bad58096a18211009d1504b97c9fbe $ + * + * Author: Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CHARSET_H +#define VLC_CHARSET_H 1 + +/** + * \file + * This files handles locale conversions in vlc + */ + +/* iconv wrappers (defined in src/extras/libc.c) */ +typedef void *vlc_iconv_t; +VLC_API vlc_iconv_t vlc_iconv_open( const char *, const char * ) VLC_USED; +VLC_API size_t vlc_iconv( vlc_iconv_t, const char **, size_t *, char **, size_t * ) VLC_USED; +VLC_API int vlc_iconv_close( vlc_iconv_t ); + +#include + +VLC_API int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap ); +VLC_API int utf8_fprintf( FILE *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API char * vlc_strcasestr(const char *, const char *) VLC_USED; + +VLC_API char * EnsureUTF8( char * ); +VLC_API const char * IsUTF8( const char * ) VLC_USED; + +VLC_API char * FromCharset( const char *charset, const void *data, size_t data_size ) VLC_USED; +VLC_API void * ToCharset( const char *charset, const char *in, size_t *outsize ) VLC_USED; + +#ifdef _WIN32 +VLC_USED +static inline char *FromWide (const wchar_t *wide) +{ + size_t len = WideCharToMultiByte (CP_UTF8, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) + return NULL; + + char *out = (char *)malloc (len); + + if (likely(out)) + WideCharToMultiByte (CP_UTF8, 0, wide, -1, out, len, NULL, NULL); + return out; +} + +VLC_USED +static inline wchar_t *ToWide (const char *utf8) +{ + int len = MultiByteToWideChar (CP_UTF8, 0, utf8, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *out = (wchar_t *)malloc (len * sizeof (wchar_t)); + + if (likely(out)) + MultiByteToWideChar (CP_UTF8, 0, utf8, -1, out, len); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *ToCodePage (unsigned cp, const char *utf8) +{ + wchar_t *wide = ToWide (utf8); + if (wide == NULL) + return NULL; + + size_t len = WideCharToMultiByte (cp, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) { + free(wide); + return NULL; + } + + char *out = (char *)malloc (len); + if (likely(out != NULL)) + WideCharToMultiByte (cp, 0, wide, -1, out, len, NULL, NULL); + free (wide); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *FromCodePage (unsigned cp, const char *mb) +{ + int len = MultiByteToWideChar (cp, 0, mb, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *wide = (wchar_t *)malloc (len * sizeof (wchar_t)); + if (unlikely(wide == NULL)) + return NULL; + MultiByteToWideChar (cp, 0, mb, -1, wide, len); + + char *utf8 = FromWide (wide); + free (wide); + return utf8; +} + +VLC_USED VLC_MALLOC +static inline char *FromANSI (const char *ansi) +{ + return FromCodePage (GetACP (), ansi); +} + +VLC_USED VLC_MALLOC +static inline char *ToANSI (const char *utf8) +{ + return ToCodePage (GetACP (), utf8); +} + +# ifdef UNICODE +# define FromT FromWide +# define ToT ToWide +# else +# define FromT FromANSI +# define ToT ToANSI +# endif +# define FromLocale FromANSI +# define ToLocale ToANSI +# define LocaleFree(s) free((char *)(s)) +# define FromLocaleDup FromANSI +# define ToLocaleDup ToANSI + +#elif defined(__OS2__) + +VLC_USED static inline char *FromLocale (const char *locale) +{ + return locale ? FromCharset ((char *)"", locale, strlen(locale)) : NULL; +} + +VLC_USED static inline char *ToLocale (const char *utf8) +{ + size_t outsize; + return utf8 ? (char *)ToCharset ("", utf8, &outsize) : NULL; +} + +VLC_USED static inline void LocaleFree (const char *str) +{ + free ((char *)str); +} + +VLC_USED static inline char *FromLocaleDup (const char *locale) +{ + return FromCharset ("", locale, strlen(locale)); +} + +VLC_USED static inline char *ToLocaleDup (const char *utf8) +{ + size_t outsize; + return (char *)ToCharset ("", utf8, &outsize); +} + +#else + +# define FromLocale(l) (l) +# define ToLocale(u) (u) +# define LocaleFree(s) ((void)(s)) +# define FromLocaleDup strdup +# define ToLocaleDup strdup +#endif + +/** + * Converts a nul-terminated string from ISO-8859-1 to UTF-8. + */ +static inline char *FromLatin1 (const char *latin) +{ + char *str = (char *)malloc (2 * strlen (latin) + 1), *utf8 = str; + unsigned char c; + + if (str == NULL) + return NULL; + + while ((c = *(latin++)) != '\0') + { + if (c >= 0x80) + { + *(utf8++) = 0xC0 | (c >> 6); + *(utf8++) = 0x80 | (c & 0x3F); + } + else + *(utf8++) = c; + } + *(utf8++) = '\0'; + + utf8 = (char *)realloc (str, utf8 - str); + return utf8 ? utf8 : str; +} + +VLC_API double us_strtod( const char *, char ** ) VLC_USED; +VLC_API float us_strtof( const char *, char ** ) VLC_USED; +VLC_API double us_atof( const char * ) VLC_USED; +VLC_API int us_vasprintf( char **, const char *, va_list ); +VLC_API int us_asprintf( char **, const char *, ... ) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_codec.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_codec.h new file mode 100644 index 0000000..be775cd --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_codec.h @@ -0,0 +1,258 @@ +/***************************************************************************** + * vlc_codec.h: Definition of the decoder and encoder structures + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * $Id: 1e7c8a6f160cd27fc3123abf64c62a52b62f5111 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CODEC_H +#define VLC_CODEC_H 1 + +#include +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by decoders and encoders + */ + +typedef struct decoder_owner_sys_t decoder_owner_sys_t; + +/** + * \defgroup decoder Decoder + * + * The structure describing a decoder + * + * @{ + */ + +/* + * BIG FAT WARNING : the code relies in the first 4 members of filter_t + * and decoder_t to be the same, so if you have anything to add, do it + * at the end of the structure. + */ +struct decoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + decoder_sys_t * p_sys; + + /* Input format ie from demuxer (XXX: a lot of field could be invalid) */ + es_format_t fmt_in; + + /* Output format of decoder/packetizer */ + es_format_t fmt_out; + + /* Some decoders only accept packetized data (ie. not truncated) */ + bool b_need_packetized; + + /* Tell the decoder if it is allowed to drop frames */ + bool b_pace_control; + + /* */ + picture_t * ( * pf_decode_video )( decoder_t *, block_t ** ); + block_t * ( * pf_decode_audio )( decoder_t *, block_t ** ); + subpicture_t * ( * pf_decode_sub) ( decoder_t *, block_t ** ); + block_t * ( * pf_packetize ) ( decoder_t *, block_t ** ); + + /* Closed Caption (CEA 608/708) extraction. + * If set, it *may* be called after pf_decode_video/pf_packetize + * returned data. It should return CC for the pictures returned by the + * last pf_packetize/pf_decode_video call only, + * pb_present will be used to known which cc channel are present (but + * globaly, not necessary for the current packet */ + block_t * ( * pf_get_cc ) ( decoder_t *, bool pb_present[4] ); + + /* Meta data at codec level + * The decoder owner set it back to NULL once it has retreived what it needs. + * The decoder owner is responsible of its release except when you overwrite it. + */ + vlc_meta_t *p_description; + + /* + * Owner fields + * XXX You MUST not use them directly. + */ + + /* Video output callbacks + * XXX use decoder_NewPicture/decoder_DeletePicture + * and decoder_LinkPicture/decoder_UnlinkPicture */ + picture_t *(*pf_vout_buffer_new)( decoder_t * ); + void (*pf_vout_buffer_del)( decoder_t *, picture_t * ); + void (*pf_picture_link) ( decoder_t *, picture_t * ); + void (*pf_picture_unlink) ( decoder_t *, picture_t * ); + + /** + * Number of extra (ie in addition to the DPB) picture buffers + * needed for decoding. + */ + int i_extra_picture_buffers; + + /* Audio output callbacks */ + int (*pf_aout_format_update)( decoder_t * ); + + /* SPU output callbacks + * XXX use decoder_NewSubpicture and decoder_DeleteSubpicture */ + subpicture_t *(*pf_spu_buffer_new)( decoder_t *, const subpicture_updater_t * ); + void (*pf_spu_buffer_del)( decoder_t *, subpicture_t * ); + + /* Input attachments + * XXX use decoder_GetInputAttachments */ + int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment ); + + /* Display date + * XXX use decoder_GetDisplayDate */ + mtime_t (*pf_get_display_date)( decoder_t *, mtime_t ); + + /* Display rate + * XXX use decoder_GetDisplayRate */ + int (*pf_get_display_rate)( decoder_t * ); + + /* Private structure for the owner of the decoder */ + decoder_owner_sys_t *p_owner; + + bool b_error; +}; + +/** + * @} + */ + +/** + * \defgroup encoder Encoder + * + * The structure describing a Encoder + * + * @{ + */ + +struct encoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + encoder_sys_t * p_sys; + + /* Properties of the input data fed to the encoder */ + es_format_t fmt_in; + + /* Properties of the output of the encoder */ + es_format_t fmt_out; + + block_t * ( * pf_encode_video )( encoder_t *, picture_t * ); + block_t * ( * pf_encode_audio )( encoder_t *, block_t * ); + block_t * ( * pf_encode_sub )( encoder_t *, subpicture_t * ); + + /* Common encoder options */ + int i_threads; /* Number of threads to use during encoding */ + int i_iframes; /* One I frame per i_iframes */ + int i_bframes; /* One B frame per i_bframes */ + int i_tolerance; /* Bitrate tolerance */ + + /* Encoder config */ + config_chain_t *p_cfg; +}; + +/** + * @} + */ + + +/** + * This function will return a new picture usable by a decoder as an output + * buffer. You have to release it using decoder_DeletePicture or by returning + * it to the caller as a pf_decode_video return value. + */ +VLC_API picture_t * decoder_NewPicture( decoder_t * ) VLC_USED; + +/** + * This function will release a picture create by decoder_NewPicture. + */ +VLC_API void decoder_DeletePicture( decoder_t *, picture_t *p_picture ); + +/** + * This function will increase the picture reference count. + * (picture_Hold is not usable.) + */ +VLC_API void decoder_LinkPicture( decoder_t *, picture_t * ); + +/** + * This function will decrease the picture reference count. + * (picture_Release is not usable.) + */ +VLC_API void decoder_UnlinkPicture( decoder_t *, picture_t * ); + +/** + * This function notifies the audio output pipeline of a new audio output + * format (fmt_out.audio). If there is currently no audio output or if the + * audio output format has changed, a new audio output will be set up. + * @return 0 if the audio output is working, -1 if not. */ +static inline int decoder_UpdateAudioFormat( decoder_t *dec ) +{ + if( dec->pf_aout_format_update != NULL ) + return dec->pf_aout_format_update( dec ); + else + return -1; +} + +/** + * This function will return a new audio buffer usable by a decoder as an + * output buffer. You have to release it using decoder_DeleteAudioBuffer + * or by returning it to the caller as a pf_decode_audio return value. + */ +VLC_API block_t * decoder_NewAudioBuffer( decoder_t *, int i_size ) VLC_USED; + +/** + * This function will return a new subpicture usable by a decoder as an output + * buffer. You have to release it using decoder_DeleteSubpicture or by returning + * it to the caller as a pf_decode_sub return value. + */ +VLC_API subpicture_t * decoder_NewSubpicture( decoder_t *, const subpicture_updater_t * ) VLC_USED; + +/** + * This function will release a subpicture created by decoder_NewSubicture. + */ +VLC_API void decoder_DeleteSubpicture( decoder_t *, subpicture_t *p_subpicture ); + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +VLC_API int decoder_GetInputAttachments( decoder_t *, input_attachment_t ***ppp_attachment, int *pi_attachment ); + +/** + * This function converts a decoder timestamp into a display date comparable + * to mdate(). + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API mtime_t decoder_GetDisplayDate( decoder_t *, mtime_t ) VLC_USED; + +/** + * This function returns the current input rate. + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API int decoder_GetDisplayRate( decoder_t * ) VLC_USED; + +#endif /* _VLC_CODEC_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_common.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_common.h new file mode 100644 index 0000000..8b4b923 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_common.h @@ -0,0 +1,932 @@ +/***************************************************************************** + * vlc_common.h: common definitions + * Collection of useful common types and macros definitions + ***************************************************************************** + * Copyright (C) 1998-2011 VLC authors and VideoLAN + * + * Authors: Samuel Hocevar + * Vincent Seguin + * Gildas Bazin + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file is a collection of common definitions and types + */ + +#ifndef VLC_COMMON_H +# define VLC_COMMON_H 1 + +/***************************************************************************** + * Required vlc headers + *****************************************************************************/ +#include "vlc_config.h" + +/***************************************************************************** + * Required system headers + *****************************************************************************/ +#include +#include + +#include +#include +#include +#include + +#ifndef __cplusplus +# include +#endif + +/***************************************************************************** + * Compilers definitions + *****************************************************************************/ +/* Helper for GCC version checks */ +#ifdef __GNUC__ +# define VLC_GCC_VERSION(maj,min) \ + ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min))) +#else +# define VLC_GCC_VERSION(maj,min) (0) +#endif + +/* Try to fix format strings for all versions of mingw and mingw64 */ +#if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO ) + #undef PRId64 + #define PRId64 "lld" + #undef PRIi64 + #define PRIi64 "lli" + #undef PRIu64 + #define PRIu64 "llu" + #undef PRIo64 + #define PRIo64 "llo" + #undef PRIx64 + #define PRIx64 "llx" + #define snprintf __mingw_snprintf + #define vsnprintf __mingw_vsnprintf + #define swprintf _snwprintf +#endif + +/* Function attributes for compiler warnings */ +#ifdef __GNUC__ +# define VLC_DEPRECATED __attribute__((deprecated)) + +# if defined( _WIN32 ) && VLC_GCC_VERSION(4,4) +# define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y))) +# else +# define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y))) +# endif +# define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x))) + +# define VLC_MALLOC __attribute__ ((malloc)) +# define VLC_NORETURN __attribute__ ((noreturn)) + +# if VLC_GCC_VERSION(3,4) +# define VLC_USED __attribute__ ((warn_unused_result)) +# else +# define VLC_USED +# endif + +#else +# define VLC_DEPRECATED +# define VLC_FORMAT(x,y) +# define VLC_FORMAT_ARG(x) +# define VLC_MALLOC +# define VLC_NORETURN +# define VLC_USED +#endif + + +/* Branch prediction */ +#ifdef __GNUC__ +# define likely(p) __builtin_expect(!!(p), 1) +# define unlikely(p) __builtin_expect(!!(p), 0) +#else +# define likely(p) (!!(p)) +# define unlikely(p) (!!(p)) +#endif + +/* Linkage */ +#ifdef __cplusplus +# define VLC_EXTERN extern "C" +#else +# define VLC_EXTERN +#endif + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define VLC_EXPORT __declspec(dllexport) +#elif VLC_GCC_VERSION(4,0) +# define VLC_EXPORT __attribute__((visibility("default"))) +#else +# define VLC_EXPORT +#endif + +#define VLC_API VLC_EXTERN VLC_EXPORT + + +/***************************************************************************** + * Basic types definitions + *****************************************************************************/ +/** + * High precision date or time interval + * + * Store a high precision date or time interval. The maximum precision is the + * microsecond, and a 64 bits integer is used to avoid overflows (maximum + * time interval is then 292271 years, which should be long enough for any + * video). Dates are stored as microseconds since a common date (usually the + * epoch). Note that date and time intervals can be manipulated using regular + * arithmetic operators, and that no special functions are required. + */ +typedef int64_t mtime_t; + +/** + * The vlc_fourcc_t type. + * + * See http://www.webartz.com/fourcc/ for a very detailed list. + */ +typedef uint32_t vlc_fourcc_t; + +#ifdef WORDS_BIGENDIAN +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \ + | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) ) + +#else +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \ + | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) ) + +#endif + +/** + * Translate a vlc_fourcc into its string representation. This function + * assumes there is enough room in psz_fourcc to store 4 characters in. + * + * \param fcc a vlc_fourcc_t + * \param psz_fourcc string to store string representation of vlc_fourcc in + */ +static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc ) +{ + memcpy( psz_fourcc, &fcc, 4 ); +} + +#define vlc_fourcc_to_char( a, b ) \ + vlc_fourcc_to_char( (vlc_fourcc_t)(a), (char *)(b) ) + +/***************************************************************************** + * Classes declaration + *****************************************************************************/ + +/* Internal types */ +typedef struct vlc_list_t vlc_list_t; +typedef struct vlc_object_t vlc_object_t; +typedef struct libvlc_int_t libvlc_int_t; +typedef struct date_t date_t; + +/* Playlist */ + +/* FIXME */ +/** + * Playlist commands + */ +typedef enum { + PLAYLIST_PLAY, /**< No arg. res=can fail*/ + PLAYLIST_VIEWPLAY, /**< arg1= playlist_item_t*,*/ + /** arg2 = playlist_item_t* , res=can fail */ + PLAYLIST_PAUSE, /**< No arg res=can fail*/ + PLAYLIST_STOP, /**< No arg res=can fail*/ + PLAYLIST_SKIP, /**< arg1=int, res=can fail*/ +} playlist_command_t; + + +typedef struct playlist_t playlist_t; +typedef struct playlist_item_t playlist_item_t; +typedef struct services_discovery_t services_discovery_t; +typedef struct services_discovery_sys_t services_discovery_sys_t; +typedef struct playlist_add_t playlist_add_t; + +/* Modules */ +typedef struct module_t module_t; +typedef struct module_config_t module_config_t; + +typedef struct config_category_t config_category_t; + +/* Input */ +typedef struct input_thread_t input_thread_t; +typedef struct input_item_t input_item_t; +typedef struct input_item_node_t input_item_node_t; +typedef struct access_t access_t; +typedef struct access_sys_t access_sys_t; +typedef struct stream_t stream_t; +typedef struct stream_sys_t stream_sys_t; +typedef struct demux_t demux_t; +typedef struct demux_sys_t demux_sys_t; +typedef struct es_out_t es_out_t; +typedef struct es_out_id_t es_out_id_t; +typedef struct es_out_sys_t es_out_sys_t; +typedef struct seekpoint_t seekpoint_t; +typedef struct info_t info_t; +typedef struct info_category_t info_category_t; +typedef struct input_attachment_t input_attachment_t; + +/* Format */ +typedef struct audio_format_t audio_format_t; +typedef struct video_format_t video_format_t; +typedef struct subs_format_t subs_format_t; +typedef struct es_format_t es_format_t; +typedef struct video_palette_t video_palette_t; + +/* Audio */ +typedef struct audio_output audio_output_t; +typedef struct aout_sys_t aout_sys_t; +typedef audio_format_t audio_sample_format_t; + +/* Video */ +typedef struct vout_thread_t vout_thread_t; + +typedef video_format_t video_frame_format_t; +typedef struct picture_t picture_t; +typedef struct picture_sys_t picture_sys_t; + +/* Subpictures */ +typedef struct spu_t spu_t; +typedef struct subpicture_t subpicture_t; +typedef struct subpicture_region_t subpicture_region_t; + +typedef struct image_handler_t image_handler_t; + +/* Stream output */ +typedef struct sout_instance_t sout_instance_t; + +typedef struct sout_input_t sout_input_t; +typedef struct sout_packetizer_input_t sout_packetizer_input_t; + +typedef struct sout_access_out_t sout_access_out_t; +typedef struct sout_access_out_sys_t sout_access_out_sys_t; + +typedef struct sout_mux_t sout_mux_t; +typedef struct sout_mux_sys_t sout_mux_sys_t; + +typedef struct sout_stream_t sout_stream_t; +typedef struct sout_stream_sys_t sout_stream_sys_t; + +typedef struct config_chain_t config_chain_t; +typedef struct session_descriptor_t session_descriptor_t; + +/* Decoders */ +typedef struct decoder_t decoder_t; +typedef struct decoder_sys_t decoder_sys_t; +typedef struct decoder_synchro_t decoder_synchro_t; + +/* Encoders */ +typedef struct encoder_t encoder_t; +typedef struct encoder_sys_t encoder_sys_t; + +/* Filters */ +typedef struct filter_t filter_t; +typedef struct filter_sys_t filter_sys_t; + +/* Network */ +typedef struct virtual_socket_t v_socket_t; +typedef struct vlc_url_t vlc_url_t; + +/* Misc */ +typedef struct iso639_lang_t iso639_lang_t; + +/* block */ +typedef struct block_t block_t; +typedef struct block_fifo_t block_fifo_t; + +/* Hashing */ +typedef struct md5_s md5_t; + +/* XML */ +typedef struct xml_t xml_t; +typedef struct xml_sys_t xml_sys_t; +typedef struct xml_reader_t xml_reader_t; +typedef struct xml_reader_sys_t xml_reader_sys_t; + +/* vod server */ +typedef struct vod_t vod_t; +typedef struct vod_sys_t vod_sys_t; +typedef struct vod_media_t vod_media_t; + +/* VLM */ +typedef struct vlm_t vlm_t; +typedef struct vlm_message_t vlm_message_t; + +/* misc */ +typedef struct vlc_meta_t vlc_meta_t; +typedef struct input_stats_t input_stats_t; +typedef struct addon_entry_t addon_entry_t; + +/* Update */ +typedef struct update_t update_t; + +/** + * VLC value structure + */ +typedef union +{ + int64_t i_int; + bool b_bool; + float f_float; + char * psz_string; + void * p_address; + vlc_object_t * p_object; + vlc_list_t * p_list; + mtime_t i_time; + struct { int32_t x; int32_t y; } coords; + +} vlc_value_t; + +/** + * VLC list structure + */ +struct vlc_list_t +{ + int i_count; + vlc_value_t * p_values; + int * pi_types; + +}; + +/***************************************************************************** + * Error values (shouldn't be exposed) + *****************************************************************************/ +#define VLC_SUCCESS (-0) /**< No error */ +#define VLC_EGENERIC (-1) /**< Unspecified error */ +#define VLC_ENOMEM (-2) /**< Not enough memory */ +#define VLC_ETIMEOUT (-3) /**< Timeout */ +#define VLC_ENOMOD (-4) /**< Module not found */ +#define VLC_ENOOBJ (-5) /**< Object not found */ +#define VLC_ENOVAR (-6) /**< Variable not found */ +#define VLC_EBADVAR (-7) /**< Bad variable value */ +#define VLC_ENOITEM (-8) /**< Item not found */ + +/***************************************************************************** + * Variable callbacks + *****************************************************************************/ +typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ + char const *, /* variable name */ + vlc_value_t, /* old value */ + vlc_value_t, /* new value */ + void * ); /* callback data */ + +/***************************************************************************** + * OS-specific headers and thread types + *****************************************************************************/ +#if defined( _WIN32 ) +# include +# ifndef PATH_MAX +# define PATH_MAX MAX_PATH +# endif +# include +#endif + +#ifdef __SYMBIAN32__ + #include +#endif + +#ifdef __OS2__ +# define OS2EMX_PLAIN_CHAR +# define INCL_BASE +# define INCL_PM +# include +# include +#endif + +#include "vlc_mtime.h" +#include "vlc_threads.h" + +/***************************************************************************** + * Common structure members + *****************************************************************************/ + +/* VLC_COMMON_MEMBERS : members common to all basic vlc objects */ +#define VLC_COMMON_MEMBERS \ +/** \name VLC_COMMON_MEMBERS \ + * these members are common for all vlc objects \ + */ \ +/**@{*/ \ + const char *psz_object_type; \ + \ + /* Messages header */ \ + char *psz_header; \ + int i_flags; \ + \ + /* Object properties */ \ + bool b_force; /**< set by the outside (eg. module_need()) */ \ + \ + /* Stuff related to the libvlc structure */ \ + libvlc_int_t *p_libvlc; /**< (root of all evil) - 1 */ \ + \ + vlc_object_t * p_parent; /**< our parent */ \ + \ +/**@}*/ \ + +/* VLC_OBJECT: attempt at doing a clever cast */ +#if VLC_GCC_VERSION(4,0) +# ifndef __cplusplus +# define VLC_OBJECT( x ) \ + __builtin_choose_expr( \ + __builtin_offsetof(__typeof__(*(x)), psz_object_type), \ + (void)0 /* screw you */, \ + (vlc_object_t *)(x)) +# else +# define VLC_OBJECT( x ) \ + ((vlc_object_t *)(x) \ + + 0 * __builtin_offsetof(__typeof__(*(x)), psz_object_type)) +# endif +#else +# define VLC_OBJECT( x ) ((vlc_object_t *)(x)) +#endif + +/***************************************************************************** + * Macros and inline functions + *****************************************************************************/ + +/* CEIL: division with round to nearest greater integer */ +#define CEIL(n, d) ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) ) + +/* PAD: PAD(n, d) = CEIL(n ,d) * d */ +#define PAD(n, d) ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) ) + +/* __MAX and __MIN: self explanatory */ +#ifndef __MAX +# define __MAX(a, b) ( ((a) > (b)) ? (a) : (b) ) +#endif +#ifndef __MIN +# define __MIN(a, b) ( ((a) < (b)) ? (a) : (b) ) +#endif + +/* clip v in [min, max] */ +#define VLC_CLIP(v, min, max) __MIN(__MAX((v), (min)), (max)) + +VLC_USED +static inline int64_t GCD ( int64_t a, int64_t b ) +{ + while( b ) + { + int64_t c = a % b; + a = b; + b = c; + } + return a; +} + +/* function imported from libavutil/common.h */ +VLC_USED +static inline uint8_t clip_uint8_vlc( int32_t a ) +{ + if( a&(~255) ) return (-a)>>31; + else return a; +} + +/** Count leading zeroes */ +VLC_USED +static inline unsigned clz (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_clz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x >>= 1; + i--; + } + return i; +#endif +} + +#define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8)) +#define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8)) +/* XXX: this assumes that int is 32-bits or more */ +#define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8)) + +/** Count trailing zeroes */ +VLC_USED +static inline unsigned ctz (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_ctz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x <<= 1; + i--; + } + return i; +#endif +} + +/** Bit weight */ +VLC_USED +static inline unsigned popcount (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_popcount (x); +#else + unsigned count = 0; + while (x) + { + count += x & 1; + x = x >> 1; + } + return count; +#endif +} + +VLC_USED +static inline unsigned parity (unsigned x) +{ +#if VLC_GCC_VERSION(3,4) + return __builtin_parity (x); +#else + for (unsigned i = 4 * sizeof (x); i > 0; i /= 2) + x ^= x >> i; + return x & 1; +#endif +} + +#ifdef __OS2__ +# undef bswap16 +# undef bswap32 +# undef bswap64 +#endif + +/** Byte swap (16 bits) */ +VLC_USED +static inline uint16_t bswap16 (uint16_t x) +{ + return (x << 8) | (x >> 8); +} + +/** Byte swap (32 bits) */ +VLC_USED +static inline uint32_t bswap32 (uint32_t x) +{ +#if VLC_GCC_VERSION(4,3) || defined(__clang__) + return __builtin_bswap32 (x); +#else + return ((x & 0x000000FF) << 24) + | ((x & 0x0000FF00) << 8) + | ((x & 0x00FF0000) >> 8) + | ((x & 0xFF000000) >> 24); +#endif +} + +/** Byte swap (64 bits) */ +VLC_USED +static inline uint64_t bswap64 (uint64_t x) +{ +#if VLC_GCC_VERSION(4,3) || defined(__clang__) + return __builtin_bswap64 (x); +#elif !defined (__cplusplus) + return ((x & 0x00000000000000FF) << 56) + | ((x & 0x000000000000FF00) << 40) + | ((x & 0x0000000000FF0000) << 24) + | ((x & 0x00000000FF000000) << 8) + | ((x & 0x000000FF00000000) >> 8) + | ((x & 0x0000FF0000000000) >> 24) + | ((x & 0x00FF000000000000) >> 40) + | ((x & 0xFF00000000000000) >> 56); +#else + return ((x & 0x00000000000000FFULL) << 56) + | ((x & 0x000000000000FF00ULL) << 40) + | ((x & 0x0000000000FF0000ULL) << 24) + | ((x & 0x00000000FF000000ULL) << 8) + | ((x & 0x000000FF00000000ULL) >> 8) + | ((x & 0x0000FF0000000000ULL) >> 24) + | ((x & 0x00FF000000000000ULL) >> 40) + | ((x & 0xFF00000000000000ULL) >> 56); +#endif +} + + +/* Free and set set the variable to NULL */ +#define FREENULL(a) do { free( a ); a = NULL; } while(0) + +#define EMPTY_STR(str) (!str || !*str) + +VLC_API char const * vlc_error( int ) VLC_USED; + +#include + +/* MSB (big endian)/LSB (little endian) conversions - network order is always + * MSB, and should be used for both network communications and files. */ + +#ifdef WORDS_BIGENDIAN +# define hton16(i) ((uint16_t)(i)) +# define hton32(i) ((uint32_t)(i)) +# define hton64(i) ((uint64_t)(i)) +#else +# define hton16(i) bswap16(i) +# define hton32(i) bswap32(i) +# define hton64(i) bswap64(i) +#endif +#define ntoh16(i) hton16(i) +#define ntoh32(i) hton32(i) +#define ntoh64(i) hton64(i) + +/** Reads 16 bits in network byte order */ +VLC_USED +static inline uint16_t U16_AT (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh16 (x); +} + +/** Reads 32 bits in network byte order */ +VLC_USED +static inline uint32_t U32_AT (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh32 (x); +} + +/** Reads 64 bits in network byte order */ +VLC_USED +static inline uint64_t U64_AT (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh64 (x); +} + +#define GetWBE(p) U16_AT(p) +#define GetDWBE(p) U32_AT(p) +#define GetQWBE(p) U64_AT(p) + +/** Reads 16 bits in little-endian order */ +VLC_USED +static inline uint16_t GetWLE (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap16 (x); +#endif + return x; +} + +/** Reads 32 bits in little-endian order */ +VLC_USED +static inline uint32_t GetDWLE (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap32 (x); +#endif + return x; +} + +/** Reads 64 bits in little-endian order */ +VLC_USED +static inline uint64_t GetQWLE (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap64 (x); +#endif + return x; +} + +/** Writes 16 bits in network byte order */ +static inline void SetWBE (void *p, uint16_t w) +{ + w = hton16 (w); + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in network byte order */ +static inline void SetDWBE (void *p, uint32_t dw) +{ + dw = hton32 (dw); + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in network byte order */ +static inline void SetQWBE (void *p, uint64_t qw) +{ + qw = hton64 (qw); + memcpy (p, &qw, sizeof (qw)); +} + +/** Writes 16 bits in little endian order */ +static inline void SetWLE (void *p, uint16_t w) +{ +#ifdef WORDS_BIGENDIAN + w = bswap16 (w); +#endif + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in little endian order */ +static inline void SetDWLE (void *p, uint32_t dw) +{ +#ifdef WORDS_BIGENDIAN + dw = bswap32 (dw); +#endif + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in little endian order */ +static inline void SetQWLE (void *p, uint64_t qw) +{ +#ifdef WORDS_BIGENDIAN + qw = bswap64 (qw); +#endif + memcpy (p, &qw, sizeof (qw)); +} + +/* */ +#define VLC_UNUSED(x) (void)(x) + +/* Stuff defined in src/extras/libc.c */ + +#if defined(_WIN32) +/* several type definitions */ +# if defined( __MINGW32__ ) +# if !defined( _OFF_T_ ) + typedef long long _off_t; + typedef _off_t off_t; +# define _OFF_T_ +# else +# ifdef off_t +# undef off_t +# endif +# define off_t long long +# endif +# endif + +# ifndef O_NONBLOCK +# define O_NONBLOCK 0 +# endif + +# include +#endif /* _WIN32 */ + +VLC_API bool vlc_ureduce( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ); + +/* Aligned memory allocator */ +#ifdef __APPLE__ +#include +#endif + +#ifdef __MINGW32__ +# define vlc_memalign(align, size) (__mingw_aligned_malloc(size, align)) +# define vlc_free(base) (__mingw_aligned_free(base)) +#elif defined(_MSC_VER) +# define vlc_memalign(align, size) (_aligned_malloc(size, align)) +# define vlc_free(base) (_aligned_free(base)) +#elif defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6) +static inline void *vlc_memalign(size_t align, size_t size) +{ + long diff; + void *ptr; + + ptr = malloc(size+align); + if(!ptr) + return ptr; + diff = ((-(long)ptr - 1)&(align-1)) + 1; + ptr = (char*)ptr + diff; + ((char*)ptr)[-1]= diff; + return ptr; +} + +static void vlc_free(void *ptr) +{ + if (ptr) + free((char*)ptr - ((char*)ptr)[-1]); +} +#else +static inline void *vlc_memalign(size_t align, size_t size) +{ + void *base; + if (unlikely(posix_memalign(&base, align, size))) + base = NULL; + return base; +} +# define vlc_free(base) free(base) +#endif + +VLC_API void vlc_tdestroy( void *, void (*)(void *) ); + +/***************************************************************************** + * I18n stuff + *****************************************************************************/ +VLC_API char *vlc_gettext( const char *msgid ) VLC_FORMAT_ARG(1); +VLC_API char *vlc_ngettext( const char *s, const char *p, unsigned long n ) VLC_FORMAT_ARG(1) VLC_FORMAT_ARG(2); + +#define vlc_pgettext( ctx, id ) \ + vlc_pgettext_aux( ctx "\004" id, id ) + +VLC_FORMAT_ARG(2) +static inline const char *vlc_pgettext_aux( const char *ctx, const char *id ) +{ + const char *tr = vlc_gettext( ctx ); + return (tr == ctx) ? id : tr; +} + +/***************************************************************************** + * Loosy memory allocation functions. Do not use in new code. + *****************************************************************************/ +static inline void *xmalloc (size_t len) +{ + void *ptr = malloc (len); + if (unlikely (ptr == NULL)) + abort (); + return ptr; +} + +static inline void *xrealloc (void *ptr, size_t len) +{ + void *nptr = realloc (ptr, len); + if (unlikely (nptr == NULL)) + abort (); + return nptr; +} + +static inline void *xcalloc (size_t n, size_t size) +{ + void *ptr = calloc (n, size); + if (unlikely (ptr == NULL)) + abort (); + return ptr; +} + +static inline char *xstrdup (const char *str) +{ + char *ptr = strdup (str); + if (unlikely(ptr == NULL)) + abort (); + return ptr; +} + +/***************************************************************************** + * libvlc features + *****************************************************************************/ +VLC_API const char * VLC_CompileBy( void ) VLC_USED; +VLC_API const char * VLC_CompileHost( void ) VLC_USED; +VLC_API const char * VLC_Compiler( void ) VLC_USED; + +/***************************************************************************** + * Additional vlc stuff + *****************************************************************************/ +#include "vlc_messages.h" +#include "vlc_objects.h" +#include "vlc_variables.h" +#include "vlc_main.h" +#include "vlc_configuration.h" + +#if defined( _WIN32 ) || defined( __SYMBIAN32__ ) || defined( __OS2__ ) +# define DIR_SEP_CHAR '\\' +# define DIR_SEP "\\" +# define PATH_SEP_CHAR ';' +# define PATH_SEP ";" +#else +# define DIR_SEP_CHAR '/' +# define DIR_SEP "/" +# define PATH_SEP_CHAR ':' +# define PATH_SEP ":" +#endif + +#define LICENSE_MSG \ + _("This program comes with NO WARRANTY, to the extent permitted by " \ + "law.\nYou may redistribute it under the terms of the GNU General " \ + "Public License;\nsee the file named COPYING for details.\n" \ + "Written by the VideoLAN team; see the AUTHORS file.\n") + +#endif /* !VLC_COMMON_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_config.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_config.h new file mode 100644 index 0000000..50b4887 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_config.h @@ -0,0 +1,114 @@ +/***************************************************************************** + * vlc_config.h: limits and configuration + * Defines all compilation-time configuration constants and size limits + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines of values used in interface, vout, aout and vlc core functions. + */ + +/* Conventions regarding names of symbols and variables + * ---------------------------------------------------- + * + * - Symbols should begin with a prefix indicating in which module they are + * used, such as INTF_, VOUT_ or AOUT_. + */ + +/***************************************************************************** + * General configuration + *****************************************************************************/ + +/* All timestamp below or equal to this define are invalid/unset + * XXX the numerical value is 0 because of historical reason and will change.*/ +#define VLC_TS_INVALID INT64_C(0) +#define VLC_TS_0 INT64_C(1) + +#define CLOCK_FREQ INT64_C(1000000) + +/***************************************************************************** + * Interface configuration + *****************************************************************************/ + +/* Base delay in micro second for interface sleeps */ +#define INTF_IDLE_SLEEP (CLOCK_FREQ/20) + +/***************************************************************************** + * Input thread configuration + *****************************************************************************/ + +/* Used in ErrorThread */ +#define INPUT_IDLE_SLEEP (CLOCK_FREQ/10) + +/* + * General limitations + */ + +/* Duration between the time we receive the data packet, and the time we will + * mark it to be presented */ +#define DEFAULT_PTS_DELAY (3*CLOCK_FREQ/10) + +/***************************************************************************** + * SPU configuration + *****************************************************************************/ + +/* Buffer must avoid arriving more than SPU_MAX_PREPARE_TIME in advanced to + * the SPU */ +#define SPU_MAX_PREPARE_TIME (CLOCK_FREQ/2) + +/***************************************************************************** + * Video configuration + *****************************************************************************/ + +/* + * Default settings for video output threads + */ + +/* Multiplier value for aspect ratio calculation (2^7 * 3^3 * 5^3) */ +#define VOUT_ASPECT_FACTOR 432000 + +/* Maximum width of a scaled source picture - this should be relatively high, + * since higher stream values will result in no display at all. */ +#define VOUT_MAX_WIDTH 4096 + +/* Number of planes in a picture */ +#define VOUT_MAX_PLANES 5 + +/* + * Time settings + */ + +/* Time to sleep when waiting for a buffer (from vout or the video fifo). + * It should be approximately the time needed to perform a complete picture + * loop. Since it only happens when the video heap is full, it does not need + * to be too low, even if it blocks the decoder. */ +#define VOUT_OUTMEM_SLEEP (CLOCK_FREQ/50) + +/* The default video output window title */ +#define VOUT_TITLE "VLC" + +/***************************************************************************** + * Messages and console interfaces configuration + *****************************************************************************/ + +/* Maximal depth of the object tree output by vlc_dumpstructure */ +#define MAX_DUMPSTRUCTURE_DEPTH 100 diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_config_cat.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_config_cat.h new file mode 100644 index 0000000..225e026 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_config_cat.h @@ -0,0 +1,263 @@ +/***************************************************************************** + * vlc_config_cat.h : Definition of configuration categories + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 00d7352f061379bd7eca6cbfea6af347dd5ea0cb $ + * + * Authors: Clément Stenac + * Anil Daoud + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HELP_H +#define VLC_HELP_H 1 +# include + +/* + * First, we need help strings for the General Settings and for the + * Plugins screen + */ +#define MAIN_TITLE N_( "VLC preferences" ) +#define MAIN_HELP N_( \ + "Select \"Advanced Options\" to see all options." ) + +/* Interface */ +#define INTF_TITLE N_("Interface") +#define INTF_HELP N_( "Settings for VLC's interfaces" ) + +#define INTF_GENERAL_HELP N_( "Main interfaces settings" ) + +#define INTF_MAIN_TITLE N_( "Main interfaces" ) +#define INTF_MAIN_HELP N_( "Settings for the main interface" ) + +#define INTF_CONTROL_TITLE N_( "Control interfaces" ) +#define INTF_CONTROL_HELP N_( "Settings for VLC's control interfaces" ) + +#define INTF_HOTKEYS_TITLE N_( "Hotkeys settings" ) +#define INTF_HOTKEYS_HELP N_( "Hotkeys settings" ) + +/* Audio */ +#define AUDIO_TITLE N_( "Audio" ) +#define AUDIO_HELP N_( "Audio settings" ) + +#define AUDIO_GENERAL_HELP N_("General audio settings") + +#define AFILTER_TITLE N_("Filters") +#define AFILTER_HELP N_( "Audio filters are used to process the audio stream." ) + +#define AVISUAL_TITLE N_("Visualizations") +#define AVISUAL_HELP N_( "Audio visualizations" ) + +#define AOUT_TITLE N_( "Output modules" ) +#define AOUT_HELP N_("General settings for audio output modules.") + +#define AMISC_TITLE N_("Miscellaneous") +#define AMISC_HELP N_( "Miscellaneous audio settings and modules." ) + +/* Video */ +#define VIDEO_TITLE N_("Video") +#define VIDEO_HELP N_("Video settings") + +#define VIDEO_GENERAL_HELP N_( "General video settings" ) + +#define _VOUT_TITLE N_("Output modules" ) +#define VOUT_HELP N_("General settings for video output modules.") + +#define VFILTER_TITLE N_("Filters" ) +#define VFILTER_HELP N_("Video filters are used to process the video stream." ) + +#define SUBPIC_TITLE N_( "Subtitles / OSD") +#define SUBPIC_HELP N_( "Settings related to On-Screen-Display,"\ + " subtitles and \"overlay subpictures\"") +/* +#define TEXT_HELP N_( \ + "Use the settings of the \"freetype\" module to choose the font you " \ + "want VLC to use for text rendering (to display subtitles for example).") +*/ +/* Input */ +#define INPUT_TITLE N_( "Input / Codecs" ) +#define INPUT_HELP N_( "Settings for input, demultiplexing, " \ + "decoding and encoding") + +#define ACCESS_TITLE N_( "Access modules" ) +#define ACCESS_HELP N_( \ + "Settings related to the various access methods. " \ + "Common settings you may want to alter are HTTP proxy or " \ + "caching settings." ) + +#define STREAM_FILTER_TITLE N_( "Stream filters" ) +#define STREAM_FILTER_HELP N_( \ + "Stream filters are special modules that allow advanced operations on " \ + "the input side of VLC. Use with care..." ) + +#define DEMUX_TITLE N_("Demuxers") +#define DEMUX_HELP N_( "Demuxers are used to separate audio and video streams." ) + +#define VDEC_TITLE N_( "Video codecs" ) +#define VDEC_HELP N_( "Settings for the video, images or video+audio decoders and encoders." ) + +#define ADEC_TITLE N_( "Audio codecs" ) +#define ADEC_HELP N_( "Settings for the audio-only decoders and encoders." ) + +#define SDEC_TITLE N_( "Subtitle codecs") +#define SDEC_HELP N_( "Settings for subtitle, teletext and CC decoders and encoders." ) + +#define ADVANCED_HELP N_( "General input settings. Use with care..." ) + +/* Sout */ +#define SOUT_TITLE N_( "Stream output" ) +#define SOUT_HELP N_( \ + "Stream output settings are used when acting as a streaming server " \ + "or when saving incoming streams.\n" \ + "Streams are first muxed and then sent through an \"access output\" "\ + "module that can either save the stream to a file, or stream " \ + "it (UDP, HTTP, RTP/RTSP).\n" \ + "Sout streams modules allow advanced stream processing (transcoding, "\ + "duplicating...).") + +#define SOUT_GENERAL_HELP N_( "General stream output settings") + +#define SOUT_MUX_TITLE N_( "Muxers" ) +#define SOUT_MUX_HELP N_( \ + "Muxers create the encapsulation formats that are used to " \ + "put all the elementary streams (video, audio, ...) " \ + "together. This setting allows you to always force a specific muxer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each muxer." ) + +#define SOUT_ACO_TITLE N_( "Access output" ) +#define SOUT_ACO_HELP N_( \ + "Access output modules control the ways the muxed streams are sent. " \ + "This setting allows you to always force a specific access output method. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each access output.") + +#define SOUT_PACKET_TITLE N_( "Packetizers" ) +#define SOUT_PACKET_HELP N_( \ + "Packetizers are used to \"preprocess\" the elementary "\ + "streams before muxing. " \ + "This setting allows you to always force a packetizer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each packetizer." ) + +#define SOUT_STREAM_TITLE N_("Sout stream") +#define SOUT_STREAM_HELP N_( "Sout stream modules allow to build a sout " \ + "processing chain. Please refer to the Streaming Howto for " \ + "more information. You can configure default options for " \ + "each sout stream module here.") + +#define SOUT_VOD_TITLE N_( "VOD" ) +#define SOUT_VOD_HELP N_( "VLC's implementation of Video On Demand" ) + + +/* Playlist */ +#define PLAYLIST_TITLE N_( "Playlist" ) +#define PLAYLIST_HELP N_( "Settings related to playlist behaviour " \ + "(e.g. playback mode) and to modules that automatically add "\ + "items to the playlist (\"service discovery\" modules).") + +#define PGENERAL_HELP N_( "General playlist behaviour") +#define SD_TITLE N_("Services discovery") +#define SD_HELP N_("Services discovery modules are facilities "\ + "that automatically add items to playlist.") + +/* Advanced */ +#define AADVANCED_TITLE N_( "Advanced" ) +#define AADVANCED_HELP N_( "Advanced settings. Use with care...") + +#define MISC_TITLE N_( "Advanced settings" ) + +/* This function is deprecated and is kept only for compatibility */ +static const struct config_category_t categories_array[] = +{ + /* Interface */ + { CAT_INTERFACE, INTF_TITLE, INTF_HELP }, + { SUBCAT_INTERFACE_GENERAL, INTF_TITLE, INTF_GENERAL_HELP }, + { SUBCAT_INTERFACE_MAIN, INTF_MAIN_TITLE, INTF_MAIN_HELP }, + { SUBCAT_INTERFACE_CONTROL, INTF_CONTROL_TITLE, INTF_CONTROL_HELP }, + { SUBCAT_INTERFACE_HOTKEYS, INTF_HOTKEYS_TITLE, INTF_HOTKEYS_HELP }, + + { CAT_AUDIO, AUDIO_TITLE, AUDIO_HELP }, + { SUBCAT_AUDIO_GENERAL, AUDIO_TITLE, AUDIO_GENERAL_HELP }, + { SUBCAT_AUDIO_AOUT, AOUT_TITLE, AOUT_HELP }, + { SUBCAT_AUDIO_AFILTER, AFILTER_TITLE, AFILTER_HELP }, + { SUBCAT_AUDIO_VISUAL, AVISUAL_TITLE, AVISUAL_HELP }, + { SUBCAT_AUDIO_MISC, AMISC_TITLE, AMISC_HELP }, + + { CAT_VIDEO, VIDEO_TITLE, VIDEO_HELP }, + { SUBCAT_VIDEO_GENERAL, VIDEO_TITLE, VIDEO_GENERAL_HELP }, + { SUBCAT_VIDEO_VOUT, _VOUT_TITLE, VOUT_HELP }, + { SUBCAT_VIDEO_VFILTER, VFILTER_TITLE, VFILTER_HELP }, + { SUBCAT_VIDEO_SUBPIC, SUBPIC_TITLE, SUBPIC_HELP }, + + { CAT_INPUT, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_GENERAL, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_ACCESS, ACCESS_TITLE, ACCESS_HELP }, + { SUBCAT_INPUT_DEMUX, DEMUX_TITLE, DEMUX_HELP }, + { SUBCAT_INPUT_VCODEC, VDEC_TITLE, VDEC_HELP }, + { SUBCAT_INPUT_ACODEC, ADEC_TITLE, ADEC_HELP }, + { SUBCAT_INPUT_SCODEC, SDEC_TITLE, SDEC_HELP }, + { SUBCAT_INPUT_STREAM_FILTER, STREAM_FILTER_TITLE, STREAM_FILTER_HELP }, + + { CAT_SOUT, SOUT_TITLE, SOUT_HELP }, + { SUBCAT_SOUT_GENERAL, SOUT_TITLE, SOUT_GENERAL_HELP }, + { SUBCAT_SOUT_STREAM, SOUT_STREAM_TITLE, SOUT_STREAM_HELP }, + { SUBCAT_SOUT_MUX, SOUT_MUX_TITLE, SOUT_MUX_HELP }, + { SUBCAT_SOUT_ACO, SOUT_ACO_TITLE, SOUT_ACO_HELP }, + { SUBCAT_SOUT_PACKETIZER, SOUT_PACKET_TITLE, SOUT_PACKET_HELP }, + { SUBCAT_SOUT_VOD, SOUT_VOD_TITLE, SOUT_VOD_HELP }, + + { CAT_PLAYLIST, PLAYLIST_TITLE , PLAYLIST_HELP }, + { SUBCAT_PLAYLIST_GENERAL, PLAYLIST_TITLE, PGENERAL_HELP }, + { SUBCAT_PLAYLIST_SD, SD_TITLE, SD_HELP }, + + { CAT_ADVANCED, AADVANCED_TITLE, AADVANCED_HELP }, + { SUBCAT_ADVANCED_MISC, MISC_TITLE, AADVANCED_HELP }, + + { -1, NULL, NULL } +}; + +VLC_USED +static inline const char *config_CategoryNameGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_name != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_name); + } + i++; + } + return NULL; +} + +VLC_USED +static inline const char *config_CategoryHelpGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_help != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_help); + } + i++; + } + return NULL; +} + +#endif /* VLC_HELP_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_configuration.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_configuration.h new file mode 100644 index 0000000..778e422 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_configuration.h @@ -0,0 +1,234 @@ +/***************************************************************************** + * vlc_configuration.h : configuration management module + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: fe0aba5ca8b9d5bb60afd0ac9027d023b1862f2f $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CONFIGURATION_H +#define VLC_CONFIGURATION_H 1 + +/** + * \file + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + */ + +#include /* for ssize_t */ + +# ifdef __cplusplus +extern "C" { +# endif + +struct config_category_t +{ + int i_id; + const char *psz_name; + const char *psz_help; +}; + +typedef union +{ + char *psz; + int64_t i; + float f; +} module_value_t; + +typedef int (*vlc_string_list_cb)(vlc_object_t *, const char *, + char ***, char ***); +typedef int (*vlc_integer_list_cb)(vlc_object_t *, const char *, + int64_t **, char ***); + +struct module_config_t +{ + uint8_t i_type; /* Configuration type */ + char i_short; /* Optional short option name */ + unsigned b_advanced:1; /* Advanced option */ + unsigned b_internal:1; /* Hidden from prefs and help */ + unsigned b_unsaveable:1; /* Not stored in configuration */ + unsigned b_safe:1; /* Safe in web plugins and playlists */ + unsigned b_removed:1; /* Deprecated */ + + char *psz_type; /* Configuration subtype */ + char *psz_name; /* Option name */ + char *psz_text; /* Short comment on the configuration option */ + char *psz_longtext; /* Long comment on the configuration option */ + + module_value_t value; /* Option value */ + module_value_t orig; + module_value_t min; + module_value_t max; + + /* Values list */ + uint16_t list_count; /* Options list size */ + union + { + char **psz; /* List of possible values for the option */ + int *i; + vlc_string_list_cb psz_cb; + vlc_integer_list_cb i_cb; + } list; + char **list_text; /* Friendly names for list values */ +}; + +/***************************************************************************** + * Prototypes - these methods are used to get, set or manipulate configuration + * data. + *****************************************************************************/ +VLC_API int config_GetType(vlc_object_t *, const char *) VLC_USED; +VLC_API int64_t config_GetInt(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutInt(vlc_object_t *, const char *, int64_t); +VLC_API float config_GetFloat(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutFloat(vlc_object_t *, const char *, float); +VLC_API char * config_GetPsz(vlc_object_t *, const char *) VLC_USED VLC_MALLOC; +VLC_API void config_PutPsz(vlc_object_t *, const char *, const char *); +VLC_API int config_GetIntChoices(vlc_object_t *, const char *, int64_t **, char ***) VLC_USED; +VLC_API int config_GetPszChoices(vlc_object_t *, const char *, char ***, char ***) VLC_USED; + +VLC_API int config_SaveConfigFile( vlc_object_t * ); +#define config_SaveConfigFile(a) config_SaveConfigFile(VLC_OBJECT(a)) + +VLC_API void config_ResetAll( vlc_object_t * ); +#define config_ResetAll(a) config_ResetAll(VLC_OBJECT(a)) + +VLC_API module_config_t * config_FindConfig( vlc_object_t *, const char * ) VLC_USED; +VLC_API char * config_GetDataDir(void) VLC_USED VLC_MALLOC; +VLC_API char *config_GetLibDir(void) VLC_USED; + +typedef enum vlc_userdir +{ + VLC_HOME_DIR, /* User's home */ + VLC_CONFIG_DIR, /* VLC-specific configuration directory */ + VLC_DATA_DIR, /* VLC-specific data directory */ + VLC_CACHE_DIR, /* VLC-specific user cached data directory */ + /* Generic directories (same as XDG) */ + VLC_DESKTOP_DIR=0x80, + VLC_DOWNLOAD_DIR, + VLC_TEMPLATES_DIR, + VLC_PUBLICSHARE_DIR, + VLC_DOCUMENTS_DIR, + VLC_MUSIC_DIR, + VLC_PICTURES_DIR, + VLC_VIDEOS_DIR, +} vlc_userdir_t; + +VLC_API char * config_GetUserDir( vlc_userdir_t ) VLC_USED VLC_MALLOC; + +VLC_API void config_AddIntf( vlc_object_t *, const char * ); +VLC_API void config_RemoveIntf( vlc_object_t *, const char * ); +VLC_API bool config_ExistIntf( vlc_object_t *, const char * ) VLC_USED; + +#define config_GetType(a,b) config_GetType(VLC_OBJECT(a),b) +#define config_GetInt(a,b) config_GetInt(VLC_OBJECT(a),b) +#define config_PutInt(a,b,c) config_PutInt(VLC_OBJECT(a),b,c) +#define config_GetFloat(a,b) config_GetFloat(VLC_OBJECT(a),b) +#define config_PutFloat(a,b,c) config_PutFloat(VLC_OBJECT(a),b,c) +#define config_GetPsz(a,b) config_GetPsz(VLC_OBJECT(a),b) +#define config_PutPsz(a,b,c) config_PutPsz(VLC_OBJECT(a),b,c) + +#define config_AddIntf(a,b) config_AddIntf(VLC_OBJECT(a),b) +#define config_RemoveIntf(a,b) config_RemoveIntf(VLC_OBJECT(a),b) +#define config_ExistIntf(a,b) config_ExistIntf(VLC_OBJECT(a),b) + +/**************************************************************************** + * config_chain_t: + ****************************************************************************/ +struct config_chain_t +{ + config_chain_t *p_next; /**< Pointer on the next config_chain_t element */ + + char *psz_name; /**< Option name */ + char *psz_value; /**< Option value */ +}; + +/** + * This function will + * - create all options in the array ppsz_options (var_Create). + * - parse the given linked list of config_chain_t and set the value (var_Set). + * + * The option names will be created by adding the psz_prefix prefix. + */ +VLC_API void config_ChainParse( vlc_object_t *, const char *psz_prefix, const char *const *ppsz_options, config_chain_t * ); +#define config_ChainParse( a, b, c, d ) config_ChainParse( VLC_OBJECT(a), b, c, d ) + +/** + * This function will parse a configuration string (psz_opts) and + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*} + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API const char *config_ChainParseOptions( config_chain_t **pp_cfg, const char *ppsz_opts ); + +/** + * This function will parse a configuration string (psz_string) and + * - set the module name (*ppsz_name) + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*}[:modulenext{option=*,...}] + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API char *config_ChainCreate( char **ppsz_name, config_chain_t **pp_cfg, const char *psz_string ) VLC_USED VLC_MALLOC; + +/** + * This function will release a linked list of config_chain_t + * (Including the head) + */ +VLC_API void config_ChainDestroy( config_chain_t * ); + +/** + * This function will duplicate a linked list of config_chain_t + */ +VLC_API config_chain_t * config_ChainDuplicate( const config_chain_t * ) VLC_USED VLC_MALLOC; + +/** + * This function will unescape a string in place and will return a pointer on + * the given string. + * No memory is allocated by it (unlike config_StringEscape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The following sequences will be unescaped (only one time): + * \\ \' and \" + */ +VLC_API char * config_StringUnescape( char *psz_string ); + +/** + * This function will escape a string that can be unescaped by + * config_StringUnescape. + * The returned value is allocated by it. You have to free it once you + * do not need it anymore (unlike config_StringUnescape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The escaped characters are ' " and \ + */ +VLC_API char * config_StringEscape( const char *psz_string ) VLC_USED VLC_MALLOC; + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_CONFIGURATION_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_cpu.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_cpu.h new file mode 100644 index 0000000..910900a --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_cpu.h @@ -0,0 +1,198 @@ +/***************************************************************************** + * vlc_cpu.h: CPU capabilities + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file provides CPU features detection. + */ + +#ifndef VLC_CPU_H +# define VLC_CPU_H 1 + +VLC_API unsigned vlc_CPU(void); + +# if defined (__i386__) || defined (__x86_64__) +# define HAVE_FPU 1 +# define VLC_CPU_MMX 0x00000008 +# define VLC_CPU_3dNOW 0x00000010 +# define VLC_CPU_MMXEXT 0x00000020 +# define VLC_CPU_SSE 0x00000040 +# define VLC_CPU_SSE2 0x00000080 +# define VLC_CPU_SSE3 0x00000100 +# define VLC_CPU_SSSE3 0x00000200 +# define VLC_CPU_SSE4_1 0x00000400 +# define VLC_CPU_SSE4_2 0x00000800 +# define VLC_CPU_SSE4A 0x00001000 +# define VLC_CPU_AVX 0x00002000 +# define VLC_CPU_AVX2 0x00004000 +# define VLC_CPU_XOP 0x00008000 +# define VLC_CPU_FMA4 0x00010000 + +# if defined (__MMX__) +# define vlc_CPU_MMX() (1) +# define VLC_MMX +# else +# define vlc_CPU_MMX() ((vlc_CPU() & VLC_CPU_MMX) != 0) +# if VLC_GCC_VERSION(4, 4) || defined(__clang__) +# define VLC_MMX __attribute__ ((__target__ ("mmx"))) +# else +# define VLC_MMX VLC_MMX_is_not_implemented_on_this_compiler +# endif +# endif + +# if defined (__SSE__) +# define vlc_CPU_MMXEXT() (1) +# define vlc_CPU_SSE() (1) +# define VLC_SSE +# else +# define vlc_CPU_MMXEXT() ((vlc_CPU() & VLC_CPU_MMXEXT) != 0) +# define vlc_CPU_SSE() ((vlc_CPU() & VLC_CPU_SSE) != 0) +# if VLC_GCC_VERSION(4, 4) || defined(__clang__) +# define VLC_SSE __attribute__ ((__target__ ("sse"))) +# else +# define VLC_SSE VLC_SSE_is_not_implemented_on_this_compiler +# endif +# endif + +# ifdef __SSE2__ +# define vlc_CPU_SSE2() (1) +# else +# define vlc_CPU_SSE2() ((vlc_CPU() & VLC_CPU_SSE2) != 0) +# endif + +# ifdef __SSE3__ +# define vlc_CPU_SSE3() (1) +# else +# define vlc_CPU_SSE3() ((vlc_CPU() & VLC_CPU_SSE3) != 0) +# endif + +# ifdef __SSSE3__ +# define vlc_CPU_SSSE3() (1) +# else +# define vlc_CPU_SSSE3() ((vlc_CPU() & VLC_CPU_SSSE3) != 0) +# endif + +# ifdef __SSE4_1__ +# define vlc_CPU_SSE4_1() (1) +# else +# define vlc_CPU_SSE4_1() ((vlc_CPU() & VLC_CPU_SSE4_1) != 0) +# endif + +# ifdef __SSE4_2__ +# define vlc_CPU_SSE4_2() (1) +# else +# define vlc_CPU_SSE4_2() ((vlc_CPU() & VLC_CPU_SSE4_2) != 0) +# endif + +# ifdef __SSE4A__ +# define vlc_CPU_SSE4A() (1) +# else +# define vlc_CPU_SSE4A() ((vlc_CPU() & VLC_CPU_SSE4A) != 0) +# endif + +# ifdef __AVX__ +# define vlc_CPU_AVX() (1) +# else +# define vlc_CPU_AVX() ((vlc_CPU() & VLC_CPU_AVX) != 0) +# endif + +# ifdef __AVX2__ +# define vlc_CPU_AVX2() (1) +# else +# define vlc_CPU_AVX2() ((vlc_CPU() & VLC_CPU_AVX2) != 0) +# endif + +# ifdef __3dNOW__ +# define vlc_CPU_3dNOW() (1) +# else +# define vlc_CPU_3dNOW() ((vlc_CPU() & VLC_CPU_3dNOW) != 0) +# endif + +# ifdef __XOP__ +# define vlc_CPU_XOP() (1) +# else +# define vlc_CPU_XOP() ((vlc_CPU() & VLC_CPU_XOP) != 0) +# endif + +# ifdef __FMA4__ +# define vlc_CPU_FMA4() (1) +# else +# define vlc_CPU_FMA4() ((vlc_CPU() & VLC_CPU_FMA4) != 0) +# endif + +# elif defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__) +# define HAVE_FPU 1 +# define VLC_CPU_ALTIVEC 2 + +# ifdef ALTIVEC +# define vlc_CPU_ALTIVEC() (1) +# else +# define vlc_CPU_ALTIVEC() ((vlc_CPU() & VLC_CPU_ALTIVEC) != 0) +# endif + +# elif defined (__arm__) +# if defined (__VFP_FP__) && !defined (__SOFTFP__) +# define HAVE_FPU 1 +# else +# define HAVE_FPU 0 +# endif +# define VLC_CPU_ARMv6 4 +# define VLC_CPU_ARM_NEON 2 + +# if defined (__ARM_ARCH_7A__) +# define VLC_CPU_ARM_ARCH 7 +# elif defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6T2__) +# define VLC_CPU_ARM_ARCH 6 +# else +# define VLC_CPU_ARM_ARCH 4 +# endif + +# if (VLC_CPU_ARM_ARCH >= 6) +# define vlc_CPU_ARMv6() (1) +# else +# define vlc_CPU_ARMv6() ((vlc_CPU() & VLC_CPU_ARMv6) != 0) +# endif + +# ifdef __ARM_NEON__ +# define vlc_CPU_ARM_NEON() (1) +# else +# define vlc_CPU_ARM_NEON() ((vlc_CPU() & VLC_CPU_ARM_NEON) != 0) +# endif + +# elif defined (__aarch64__) +# define HAVE_FPU 1 + +# elif defined (__sparc__) +# define HAVE_FPU 1 + +# elif defined (__mips_hard_float) +# define HAVE_FPU 1 + +# else +/** + * Are single precision floating point operations "fast"? + * If this preprocessor constant is zero, floating point should be avoided + * (especially relevant for audio codecs). + */ +# define HAVE_FPU 0 + +# endif + +#endif /* !VLC_CPU_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_demux.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_demux.h new file mode 100644 index 0000000..4cd49ce --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_demux.h @@ -0,0 +1,256 @@ +/***************************************************************************** + * vlc_demux.h: Demuxer descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2005 VLC authors and VideoLAN + * $Id: 0dcee0dffe2ac9dafdc9fe8fd5fa363a64cb85e1 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DEMUX_H +#define VLC_DEMUX_H 1 + +/** + * \file + * This files defines functions and structures used by demux objects in vlc + */ + +#include +#include +#include + +/** + * \defgroup demux Demux + * @{ + */ + +struct demux_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* eg informative but needed (we can have access+demux) */ + char *psz_access; + char *psz_demux; + char *psz_location; + char *psz_file; + + /* input stream */ + stream_t *s; /* NULL in case of a access+demux in one */ + + /* es output */ + es_out_t *out; /* our p_es_out */ + + /* set by demuxer */ + int (*pf_demux) ( demux_t * ); /* demux one frame only */ + int (*pf_control)( demux_t *, int i_query, va_list args); + + /* Demux has to maintain them uptodate + * when it is responsible of seekpoint/title */ + struct + { + unsigned int i_update; /* Demux sets them on change, + Input removes them once take into account*/ + /* Seekpoint/Title at demux level */ + int i_title; /* idem, start from 0 (could be menu) */ + int i_seekpoint; /* idem, start from 0 */ + } info; + demux_sys_t *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/* demux_t.info.i_update field */ +#define INPUT_UPDATE_TITLE 0x0010 +#define INPUT_UPDATE_SEEKPOINT 0x0020 +#define INPUT_UPDATE_META 0x0040 +#define INPUT_UPDATE_TITLE_LIST 0x0100 + +/* demux_meta_t is returned by "meta reader" module to the demuxer */ +typedef struct demux_meta_t +{ + VLC_COMMON_MEMBERS + demux_t *p_demux; /** FIXME: use stream_t instead? */ + input_item_t *p_item; /***< the input item that is being read */ + + vlc_meta_t *p_meta; /**< meta data */ + + int i_attachments; /**< number of attachments */ + input_attachment_t **attachments; /**< array of attachments */ +} demux_meta_t; + +enum demux_query_e +{ + /* I. Common queries to access_demux and demux */ + /* POSITION double between 0.0 and 1.0 */ + DEMUX_GET_POSITION, /* arg1= double * res= */ + DEMUX_SET_POSITION, /* arg1= double arg2= bool b_precise res=can fail */ + + /* LENGTH/TIME in microsecond, 0 if unknown */ + DEMUX_GET_LENGTH, /* arg1= int64_t * res= */ + DEMUX_GET_TIME, /* arg1= int64_t * res= */ + DEMUX_SET_TIME, /* arg1= int64_t arg2= bool b_precise res=can fail */ + + /* TITLE_INFO only if more than 1 title or 1 chapter */ + DEMUX_GET_TITLE_INFO, /* arg1=input_title_t*** arg2=int* + arg3=int*pi_title_offset(0), arg4=int*pi_seekpoint_offset(0) can fail */ + /* TITLE/SEEKPOINT, only when TITLE_INFO succeed */ + DEMUX_SET_TITLE, /* arg1= int can fail */ + DEMUX_SET_SEEKPOINT, /* arg1= int can fail */ + + /* DEMUX_SET_GROUP/SET_ES only a hint for demuxer (mainly DVB) to allow not + * reading everything (you should not use this to call es_out_Control) + * if you don't know what to do with it, just IGNORE it, it is safe(r) + * -1 means all group, 0 default group (first es added) */ + DEMUX_SET_GROUP, /* arg1= int, arg2=const vlc_list_t * can fail */ + DEMUX_SET_ES, /* arg1= int can fail */ + + /* Ask the demux to demux until the given date at the next pf_demux call + * but not more (and not less, at the precision available of course). + * XXX: not mandatory (except for subtitle demux) but will help a lot + * for multi-input + */ + DEMUX_SET_NEXT_DEMUX_TIME, /* arg1= int64_t can fail */ + /* FPS for correct subtitles handling */ + DEMUX_GET_FPS, /* arg1= double * res=can fail */ + + /* Meta data */ + DEMUX_GET_META, /* arg1= vlc_meta_t ** res=can fail */ + DEMUX_HAS_UNSUPPORTED_META, /* arg1= bool * res can fail */ + + /* Attachments */ + DEMUX_GET_ATTACHMENTS, /* arg1=input_attachment_t***, int* res=can fail */ + + /* RECORD you are ensured that it is never called twice with the same state + * you should accept it only if the stream can be recorded without + * any modification or header addition. */ + DEMUX_CAN_RECORD, /* arg1=bool* res=can fail(assume false) */ + DEMUX_SET_RECORD_STATE, /* arg1=bool res=can fail */ + + DEMUX_GET_SIGNAL, /* arg1=double *pf_quality, arg2=double *pf_strength + res=can fail */ + + /* II. Specific access_demux queries */ + /* PAUSE you are ensured that it is never called twice with the same state */ + DEMUX_CAN_PAUSE = 0x1000, /* arg1= bool* can fail (assume false)*/ + DEMUX_SET_PAUSE_STATE, /* arg1= bool can fail */ + + DEMUX_GET_PTS_DELAY, /* arg1= int64_t* cannot fail */ + + /* DEMUX_CAN_CONTROL_PACE returns true (*pb_pace) if we can read the + * data at our pace */ + DEMUX_CAN_CONTROL_PACE, /* arg1= bool*pb_pace can fail (assume false) */ + + /* DEMUX_CAN_CONTROL_RATE is called only if DEMUX_CAN_CONTROL_PACE has returned false. + * *pb_rate should be true when the rate can be changed (using DEMUX_SET_RATE) + * *pb_ts_rescale should be true when the timestamps (pts/dts/pcr) have to be rescaled */ + DEMUX_CAN_CONTROL_RATE, /* arg1= bool*pb_rate arg2= bool*pb_ts_rescale can fail(assume false) */ + /* DEMUX_SET_RATE is called only if DEMUX_CAN_CONTROL_RATE has returned true. + * It should return the value really used in *pi_rate */ + DEMUX_SET_RATE, /* arg1= int*pi_rate can fail */ + + DEMUX_CAN_SEEK, /* arg1= bool* can fail (assume false)*/ + + /* Navigation */ + DEMUX_NAV_ACTIVATE, /* res=can fail */ + DEMUX_NAV_UP, /* res=can fail */ + DEMUX_NAV_DOWN, /* res=can fail */ + DEMUX_NAV_LEFT, /* res=can fail */ + DEMUX_NAV_RIGHT, /* res=can fail */ +}; + +VLC_API int demux_vaControlHelper( stream_t *, int64_t i_start, int64_t i_end, int64_t i_bitrate, int i_align, int i_query, va_list args ); + +static inline void demux_UpdateTitleFromStream( demux_t *demux ) +{ + stream_t *s = demux->s; + unsigned title, seekpoint; + + if( stream_Control( s, STREAM_GET_TITLE, &title ) == VLC_SUCCESS + && title != (unsigned)demux->info.i_title ) + { + demux->info.i_title = title; + demux->info.i_update |= INPUT_UPDATE_TITLE; + } + + if( stream_Control( s, STREAM_GET_SEEKPOINT, &seekpoint ) == VLC_SUCCESS + && seekpoint != (unsigned)demux->info.i_seekpoint ) + { + demux->info.i_seekpoint = seekpoint; + demux->info.i_update |= INPUT_UPDATE_SEEKPOINT; + } +} + +/************************************************************************* + * Miscellaneous helpers for demuxers + *************************************************************************/ + +VLC_USED +static inline bool demux_IsPathExtension( demux_t *p_demux, const char *psz_extension ) +{ + const char *name = (p_demux->psz_file != NULL) ? p_demux->psz_file + : p_demux->psz_location; + const char *psz_ext = strrchr ( name, '.' ); + if( !psz_ext || strcasecmp( psz_ext, psz_extension ) ) + return false; + return true; +} + +VLC_USED +static inline bool demux_IsForced( demux_t *p_demux, const char *psz_name ) +{ + if( !p_demux->psz_demux || strcmp( p_demux->psz_demux, psz_name ) ) + return false; + return true; +} + +/** + * This function will create a packetizer suitable for a demuxer that parses + * elementary stream. + * + * The provided es_format_t will be cleaned on error or by + * demux_PacketizerDestroy. + */ +VLC_API decoder_t * demux_PacketizerNew( demux_t *p_demux, es_format_t *p_fmt, const char *psz_msg ) VLC_USED; + +/** + * This function will destroy a packetizer create by demux_PacketizerNew. + */ +VLC_API void demux_PacketizerDestroy( decoder_t *p_packetizer ); + +/** + * This function will return the parent input of this demux. + * It is retained. Can return NULL. + */ +VLC_API input_thread_t * demux_GetParentInput( demux_t *p_demux ) VLC_USED; + +/* */ +#define DEMUX_INIT_COMMON() do { \ + p_demux->pf_control = Control; \ + p_demux->pf_demux = Demux; \ + p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) ); \ + if( !p_demux->p_sys ) return VLC_ENOMEM;\ + } while(0) + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_dialog.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_dialog.h new file mode 100644 index 0000000..168bea4 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_dialog.h @@ -0,0 +1,124 @@ +/***************************************************************************** + * vlc_dialog.h: user interaction dialogs + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DIALOG_H_ +#define VLC_DIALOG_H_ +# include + +/** + * \file vlc_dialog.h + * User interaction dialog APIs + */ + +/** + * A fatal error dialog. + * No response expected from the user. + */ +typedef struct dialog_fatal_t +{ + const char *title; + const char *message; +} dialog_fatal_t; + +VLC_API void dialog_VFatal(vlc_object_t *, bool, const char *, const char *, va_list); + +static inline VLC_FORMAT(3, 4) +void dialog_Fatal (vlc_object_t *obj, const char *title, const char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + dialog_VFatal(obj, false, title, fmt, ap); + va_end (ap); +} +#define dialog_Fatal(o, t, ...) \ + dialog_Fatal(VLC_OBJECT(o), t, __VA_ARGS__) + +static inline VLC_FORMAT(3, 4) +void dialog_FatalWait (vlc_object_t *obj, const char *title, + const char *fmt, ...){ + va_list ap; + + va_start (ap, fmt); + dialog_VFatal(obj, true, title, fmt, ap); + va_end (ap); +} +#define dialog_FatalWait(o, t, ...) \ + dialog_FatalWait(VLC_OBJECT(o), t, __VA_ARGS__) + +/** + * A login dialog. + */ +typedef struct dialog_login_t +{ + const char *title; + const char *message; + char **username; + char **password; +} dialog_login_t; + +VLC_API void dialog_Login(vlc_object_t *, char **, char **, const char *, const char *, ...) VLC_FORMAT (5, 6); +#define dialog_Login(o, u, p, t, ...) \ + dialog_Login(VLC_OBJECT(o), u, p, t, __VA_ARGS__) + +/** + * A question dialog. + */ +typedef struct dialog_question_t +{ + const char *title; + const char *message; + const char *yes; + const char *no; + const char *cancel; + int answer; +} dialog_question_t; + +VLC_API int dialog_Question(vlc_object_t *, const char *, const char *, + const char *, const char *, const char *, ...) +VLC_FORMAT(3, 7); +#define dialog_Question(o, t, m, y, n, ...) \ + dialog_Question(VLC_OBJECT(o), t, m, y, n, __VA_ARGS__) + +typedef struct dialog_progress_bar_t +{ /* Request-time parameters */ + const char *title; + const char *message; + const char *cancel; + /* Permanent parameters */ + void (*pf_update) (void *, const char *, float); + bool (*pf_check) (void *); + void (*pf_destroy) (void *); + void *p_sys; +} dialog_progress_bar_t; + +VLC_API dialog_progress_bar_t * dialog_ProgressCreate(vlc_object_t *, const char *, const char *, const char *) VLC_USED; +#define dialog_ProgressCreate(o, t, m, c) \ + dialog_ProgressCreate(VLC_OBJECT(o), t, m, c) +VLC_API void dialog_ProgressDestroy(dialog_progress_bar_t *); +VLC_API void dialog_ProgressSet(dialog_progress_bar_t *, const char *, float); +VLC_API bool dialog_ProgressCancelled(dialog_progress_bar_t *); + +VLC_API int dialog_Register(vlc_object_t *); +VLC_API int dialog_Unregister(vlc_object_t *); +#define dialog_Register(o) dialog_Register(VLC_OBJECT(o)) +#define dialog_Unregister(o) dialog_Unregister(VLC_OBJECT(o)) + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_epg.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_epg.h new file mode 100644 index 0000000..2ae770f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_epg.h @@ -0,0 +1,97 @@ +/***************************************************************************** + * vlc_epg.h: Electronic Program Guide + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: c0fd0f559ac3bb7ed6201889dcda998ebff3a413 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EPG_H +#define VLC_EPG_H 1 + +/** + * \file + * This file defines functions and structures for storing dvb epg information + */ + +typedef struct +{ + int64_t i_start; /* Interpreted as a value return by time() */ + int i_duration; /* Duration of the event in second */ + + char *psz_name; + char *psz_short_description; + char *psz_description; + + uint8_t i_rating; /* Parental control, set to 0 when undefined */ +} vlc_epg_event_t; + +typedef struct +{ + char *psz_name; + vlc_epg_event_t *p_current; /* Can be null or should be the same than one of pp_event entry */ + + int i_event; + vlc_epg_event_t **pp_event; +} vlc_epg_t; + +/** + * It initializes a vlc_epg_t. + * + * You must call vlc_epg_Clean to release the associated resource. + */ +VLC_API void vlc_epg_Init(vlc_epg_t *p_epg, const char *psz_name); + +/** + * It releases all resources associated to a vlc_epg_t + */ +VLC_API void vlc_epg_Clean(vlc_epg_t *p_epg); + +/** + * It creates and appends a new vlc_epg_event_t to a vlc_epg_t. + * + * \see vlc_epg_t for the definitions of the parameters. + */ +VLC_API void vlc_epg_AddEvent(vlc_epg_t *p_epg, int64_t i_start, int i_duration, const char *psz_name, const char *psz_short_description, const char *psz_description, uint8_t i_rating ); + +/** + * It creates a new vlc_epg_t* + * + * You must call vlc_epg_Delete to release the associated resource. + */ +VLC_API vlc_epg_t * vlc_epg_New(const char *psz_name) VLC_USED; + +/** + * It releases a vlc_epg_t*. + */ +VLC_API void vlc_epg_Delete(vlc_epg_t *p_epg); + +/** + * It set the current event of a vlc_epg_t given a start time + */ +VLC_API void vlc_epg_SetCurrent(vlc_epg_t *p_epg, int64_t i_start); + +/** + * It merges all the event of \p p_src and \p p_dst into \p p_dst. + * + * \p p_src is not modified. + */ +VLC_API void vlc_epg_Merge(vlc_epg_t *p_dst, const vlc_epg_t *p_src); + +#endif + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_es.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_es.h new file mode 100644 index 0000000..e131c73 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_es.h @@ -0,0 +1,468 @@ +/***************************************************************************** + * vlc_es.h: Elementary stream formats descriptions + ***************************************************************************** + * Copyright (C) 1999-2012 VLC authors and VideoLAN + * $Id: 8db588494350b40b0f9225df00234f44189c5072 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_H +#define VLC_ES_H 1 + +#include +#include + +/** + * \file + * This file defines the elementary streams format types + */ + +/** + * video palette data + * \see video_format_t + * \see subs_format_t + */ +#define VIDEO_PALETTE_COLORS_MAX 256 + +struct video_palette_t +{ + int i_entries; /**< to keep the compatibility with libavcodec's palette */ + uint8_t palette[VIDEO_PALETTE_COLORS_MAX][4]; /**< 4-byte RGBA/YUVA palette */ +}; + +/** + * audio replay gain description + */ +#define AUDIO_REPLAY_GAIN_MAX (2) +#define AUDIO_REPLAY_GAIN_TRACK (0) +#define AUDIO_REPLAY_GAIN_ALBUM (1) +typedef struct +{ + /* true if we have the peak value */ + bool pb_peak[AUDIO_REPLAY_GAIN_MAX]; + /* peak value where 1.0 means full sample value */ + float pf_peak[AUDIO_REPLAY_GAIN_MAX]; + + /* true if we have the gain value */ + bool pb_gain[AUDIO_REPLAY_GAIN_MAX]; + /* gain value in dB */ + float pf_gain[AUDIO_REPLAY_GAIN_MAX]; +} audio_replay_gain_t; + +/** + * audio format description + */ +struct audio_format_t +{ + vlc_fourcc_t i_format; /**< audio format fourcc */ + unsigned int i_rate; /**< audio sample-rate */ + + /* Describes the channels configuration of the samples (ie. number of + * channels which are available in the buffer, and positions). */ + uint16_t i_physical_channels; + + /* Describes from which original channels, before downmixing, the + * buffer is derived. */ + uint32_t i_original_channels; + + /* Optional - for A/52, SPDIF and DTS types : */ + /* Bytes used by one compressed frame, depends on bitrate. */ + unsigned int i_bytes_per_frame; + + /* Number of sampleframes contained in one compressed frame. */ + unsigned int i_frame_length; + /* Please note that it may be completely arbitrary - buffers are not + * obliged to contain a integral number of so-called "frames". It's + * just here for the division : + * buffer_size = i_nb_samples * i_bytes_per_frame / i_frame_length + */ + + /* FIXME ? (used by the codecs) */ + unsigned i_bitspersample; + unsigned i_blockalign; + uint8_t i_channels; /* must be <=32 */ +}; + +/* Values available for audio channels */ +#define AOUT_CHAN_CENTER 0x1 +#define AOUT_CHAN_LEFT 0x2 +#define AOUT_CHAN_RIGHT 0x4 +#define AOUT_CHAN_REARCENTER 0x10 +#define AOUT_CHAN_REARLEFT 0x20 +#define AOUT_CHAN_REARRIGHT 0x40 +#define AOUT_CHAN_MIDDLELEFT 0x100 +#define AOUT_CHAN_MIDDLERIGHT 0x200 +#define AOUT_CHAN_LFE 0x1000 + +#define AOUT_CHANS_FRONT (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT) +#define AOUT_CHANS_MIDDLE (AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT) +#define AOUT_CHANS_REAR (AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT) +#define AOUT_CHANS_CENTER (AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_STEREO AOUT_CHANS_2_0 +#define AOUT_CHANS_2_0 (AOUT_CHANS_FRONT) +#define AOUT_CHANS_2_1 (AOUT_CHANS_FRONT | AOUT_CHAN_LFE) +#define AOUT_CHANS_3_0 (AOUT_CHANS_FRONT | AOUT_CHAN_CENTER) +#define AOUT_CHANS_3_1 (AOUT_CHANS_3_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_4_0 (AOUT_CHANS_FRONT | AOUT_CHANS_REAR) +#define AOUT_CHANS_4_1 (AOUT_CHANS_4_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_5_0 (AOUT_CHANS_4_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_5_1 (AOUT_CHANS_5_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_6_0 (AOUT_CHANS_4_0 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_7_0 (AOUT_CHANS_6_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_7_1 (AOUT_CHANS_5_1 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_8_1 (AOUT_CHANS_7_1 | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_4_0_MIDDLE (AOUT_CHANS_FRONT | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_4_CENTER_REAR (AOUT_CHANS_FRONT | AOUT_CHANS_CENTER) +#define AOUT_CHANS_5_0_MIDDLE (AOUT_CHANS_4_0_MIDDLE | AOUT_CHAN_CENTER) +#define AOUT_CHANS_6_1_MIDDLE (AOUT_CHANS_5_0_MIDDLE | AOUT_CHAN_REARCENTER | AOUT_CHAN_LFE) + +/* Values available for original channels only */ +#define AOUT_CHAN_DOLBYSTEREO 0x10000 +#define AOUT_CHAN_DUALMONO 0x20000 +#define AOUT_CHAN_REVERSESTEREO 0x40000 + +#define AOUT_CHAN_PHYSMASK 0xFFFF +#define AOUT_CHAN_MAX 9 + +/** + * Picture orientation. + */ +typedef enum video_orientation_t +{ + ORIENT_TOP_LEFT = 0, /**< Top line represents top, left column left. */ + ORIENT_TOP_RIGHT, /**< Flipped horizontally */ + ORIENT_BOTTOM_LEFT, /**< Flipped vertically */ + ORIENT_BOTTOM_RIGHT, /**< Rotated 180 degrees */ + ORIENT_LEFT_TOP, /**< Transposed */ + ORIENT_LEFT_BOTTOM, /**< Rotated 90 degrees clockwise */ + ORIENT_RIGHT_TOP, /**< Rotated 90 degrees anti-clockwise */ + ORIENT_RIGHT_BOTTOM, /**< Anti-transposed */ + + ORIENT_NORMAL = ORIENT_TOP_LEFT, + ORIENT_TRANSPOSED = ORIENT_LEFT_TOP, + ORIENT_ANTI_TRANSPOSED = ORIENT_RIGHT_BOTTOM, + ORIENT_HFLIPPED = ORIENT_TOP_RIGHT, + ORIENT_VFLIPPED = ORIENT_BOTTOM_LEFT, + ORIENT_ROTATED_180 = ORIENT_BOTTOM_RIGHT, + ORIENT_ROTATED_270 = ORIENT_LEFT_BOTTOM, + ORIENT_ROTATED_90 = ORIENT_RIGHT_TOP, +} video_orientation_t; +/** Convert EXIF orientation to enum video_orientation_t */ +#define ORIENT_FROM_EXIF(exif) ((0x01324675U >> (4 * ((exif) - 1))) & 7) +/** Convert enum video_orientation_t to EXIF */ +#define ORIENT_TO_EXIF(orient) ((0x12435867U >> (4 * (orient))) & 15) +/** If the orientation is natural or mirrored */ +#define ORIENT_IS_MIRROR(orient) parity(orient) +/** If the orientation swaps dimensions */ +#define ORIENT_IS_SWAP(orient) (((orient) & 4) != 0) +/** Applies horizontal flip to an orientation */ +#define ORIENT_HFLIP(orient) ((orient) ^ 1) +/** Applies vertical flip to an orientation */ +#define ORIENT_VFLIP(orient) ((orient) ^ 2) +/** Applies horizontal flip to an orientation */ +#define ORIENT_ROTATE_180(orient) ((orient) ^ 3) + +typedef enum video_transform_t +{ + TRANSFORM_IDENTITY = ORIENT_NORMAL, + TRANSFORM_HFLIP = ORIENT_HFLIPPED, + TRANSFORM_VFLIP = ORIENT_VFLIPPED, + TRANSFORM_R180 = ORIENT_ROTATED_180, + TRANSFORM_R270 = ORIENT_ROTATED_270, + TRANSFORM_R90 = ORIENT_ROTATED_90, + TRANSFORM_TRANSPOSE = ORIENT_TRANSPOSED, + TRANSFORM_ANTI_TRANSPOSE = ORIENT_ANTI_TRANSPOSED +} video_transform_t; + +/** + * video format description + */ +struct video_format_t +{ + vlc_fourcc_t i_chroma; /**< picture chroma */ + + unsigned int i_width; /**< picture width */ + unsigned int i_height; /**< picture height */ + unsigned int i_x_offset; /**< start offset of visible area */ + unsigned int i_y_offset; /**< start offset of visible area */ + unsigned int i_visible_width; /**< width of visible area */ + unsigned int i_visible_height; /**< height of visible area */ + + unsigned int i_bits_per_pixel; /**< number of bits per pixel */ + + unsigned int i_sar_num; /**< sample/pixel aspect ratio */ + unsigned int i_sar_den; + + unsigned int i_frame_rate; /**< frame rate numerator */ + unsigned int i_frame_rate_base; /**< frame rate denominator */ + + uint32_t i_rmask, i_gmask, i_bmask; /**< color masks for RGB chroma */ + int i_rrshift, i_lrshift; + int i_rgshift, i_lgshift; + int i_rbshift, i_lbshift; + video_palette_t *p_palette; /**< video palette from demuxer */ + video_orientation_t orientation; /**< picture orientation */ +}; + +/** + * Initialize a video_format_t structure with chroma 'i_chroma' + * \param p_src pointer to video_format_t structure + * \param i_chroma chroma value to use + */ +static inline void video_format_Init( video_format_t *p_src, vlc_fourcc_t i_chroma ) +{ + memset( p_src, 0, sizeof( video_format_t ) ); + p_src->i_chroma = i_chroma; + p_src->i_sar_num = p_src->i_sar_den = 1; + p_src->p_palette = NULL; +} + +/** + * Copy video_format_t including the palette + * \param p_dst video_format_t to copy to + * \param p_src video_format_t to copy from + */ +static inline int video_format_Copy( video_format_t *p_dst, const video_format_t *p_src ) +{ + memcpy( p_dst, p_src, sizeof( *p_dst ) ); + if( p_src->p_palette ) + { + p_dst->p_palette = (video_palette_t *) malloc( sizeof( video_palette_t ) ); + if( !p_dst->p_palette ) + return VLC_ENOMEM; + memcpy( p_dst->p_palette, p_src->p_palette, sizeof( *p_dst->p_palette ) ); + } + return VLC_SUCCESS; +} + +/** + * Cleanup and free palette of this video_format_t + * \param p_src video_format_t structure to clean + */ +static inline void video_format_Clean( video_format_t *p_src ) +{ + free( p_src->p_palette ); + memset( p_src, 0, sizeof( video_format_t ) ); + p_src->p_palette = NULL; +} + +/** + * It will fill up a video_format_t using the given arguments. + * Note that the video_format_t must already be initialized. + */ +VLC_API void video_format_Setup( video_format_t *, vlc_fourcc_t i_chroma, + int i_width, int i_height, int i_visible_width, int i_visible_height, + int i_sar_num, int i_sar_den ); + +/** + * It will copy the crop properties from a video_format_t to another. + */ +VLC_API void video_format_CopyCrop( video_format_t *, const video_format_t * ); + +/** + * It will compute the crop/ar properties when scaling. + */ +VLC_API void video_format_ScaleCropAr( video_format_t *, const video_format_t * ); + +/** + * This function "normalizes" the formats orientation, by switching the a/r according to the orientation, + * producing a format whose orientation is ORIENT_NORMAL. It makes a shallow copy (pallette is not alloc'ed). + */ +VLC_API void video_format_ApplyRotation(video_format_t * /*restrict*/ out, + const video_format_t *in); + +/** + * This function applies the transform operation to fmt. + */ +VLC_API void video_format_TransformBy(video_format_t *fmt, video_transform_t transform); + +/** + * This function applies the transforms necessary to fmt so that the resulting fmt + * has the dst_orientation. + */ +VLC_API void video_format_TransformTo(video_format_t *fmt, video_orientation_t dst_orientation); + +/** + * Returns the operation required to transform src into dst. + */ +VLC_API video_transform_t video_format_GetTransform(video_orientation_t src, video_orientation_t dst); + +/** + * This function will check if the first video format is similar + * to the second one. + */ +VLC_API bool video_format_IsSimilar( const video_format_t *, const video_format_t * ); + +/** + * It prints details about the given video_format_t + */ +VLC_API void video_format_Print( vlc_object_t *, const char *, const video_format_t * ); + + +static inline video_transform_t transform_Inverse( video_transform_t transform ) +{ + switch ( transform ) { + case TRANSFORM_R90: + return TRANSFORM_R270; + case TRANSFORM_R270: + return TRANSFORM_R90; + default: + return transform; + } +} +/** + * subtitles format description + */ +struct subs_format_t +{ + /* the character encoding of the text of the subtitle. + * all gettext recognized shorts can be used */ + char *psz_encoding; + + + int i_x_origin; /**< x coordinate of the subtitle. 0 = left */ + int i_y_origin; /**< y coordinate of the subtitle. 0 = top */ + + struct + { + /* */ + uint32_t palette[16+1]; + + /* the width of the original movie the spu was extracted from */ + int i_original_frame_width; + /* the height of the original movie the spu was extracted from */ + int i_original_frame_height; + } spu; + + struct + { + int i_id; + } dvb; + struct + { + int i_magazine; + int i_page; + } teletext; + + text_style_t *p_style; /* Default styles to use */ +}; + +/** + * ES language definition + */ +typedef struct extra_languages_t +{ + char *psz_language; + char *psz_description; +} extra_languages_t; + +/** + * ES format definition + */ +#define ES_PRIORITY_NOT_SELECTABLE -2 +#define ES_PRIORITY_NOT_DEFAULTABLE -1 +#define ES_PRIORITY_SELECTABLE_MIN 0 +#define ES_PRIORITY_MIN ES_PRIORITY_NOT_SELECTABLE +struct es_format_t +{ + int i_cat; /**< ES category @see es_format_category_e */ + vlc_fourcc_t i_codec; /**< FOURCC value as used in vlc */ + vlc_fourcc_t i_original_fourcc; /**< original FOURCC from the container */ + + int i_id; /**< es identifier, where means + -1: let the core mark the right id + >=0: valid id */ + int i_group; /**< group identifier, where means: + -1 : standalone + >= 0 then a "group" (program) is created + for each value */ + int i_priority; /**< priority, where means: + -2 : mean not selectable by the users + -1 : mean not selected by default even + when no other stream + >=0: priority */ + + char *psz_language; /**< human readible language name */ + char *psz_description; /**< human readible description of language */ + int i_extra_languages; /**< length in bytes of extra language data pointer */ + extra_languages_t *p_extra_languages; /**< extra language data needed by some decoders */ + + audio_format_t audio; /**< description of audio format */ + audio_replay_gain_t audio_replay_gain; /*< audio replay gain information */ + video_format_t video; /**< description of video format */ + subs_format_t subs; /**< description of subtitle format */ + + unsigned int i_bitrate; /**< bitrate of this ES */ + int i_profile; /**< codec specific information (like real audio flavor, mpeg audio layer, h264 profile ...) */ + int i_level; /**< codec specific information: indicates maximum restrictions on the stream (resolution, bitrate, codec features ...) */ + + bool b_packetized; /**< whether the data is packetized (ie. not truncated) */ + int i_extra; /**< length in bytes of extra data pointer */ + void *p_extra; /**< extra data needed by some decoders or muxers */ + +}; + +/** ES Categories */ +enum es_format_category_e +{ + UNKNOWN_ES = 0x00, + VIDEO_ES, + AUDIO_ES, + SPU_ES, + NAV_ES, +}; +#define ES_CATEGORY_COUNT (NAV_ES + 1) + +/** + * This function will fill all RGB shift from RGB masks. + */ +VLC_API void video_format_FixRgb( video_format_t * ); + +/** + * This function will initialize a es_format_t structure. + */ +VLC_API void es_format_Init( es_format_t *, int i_cat, vlc_fourcc_t i_codec ); + +/** + * This function will initialize a es_format_t structure from a video_format_t. + */ +VLC_API void es_format_InitFromVideo( es_format_t *, const video_format_t * ); + +/** + * This functions will copy a es_format_t. + */ +VLC_API int es_format_Copy( es_format_t *p_dst, const es_format_t *p_src ); + +/** + * This function will clean up a es_format_t and release all associated + * resources. + * You can call it multiple times on the same structure. + */ +VLC_API void es_format_Clean( es_format_t *fmt ); + +/** + * This function will check if the first ES format is similar + * to the second one. + * + * All descriptive fields are ignored. + */ +VLC_API bool es_format_IsSimilar( const es_format_t *, const es_format_t * ); + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_es_out.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_es_out.h new file mode 100644 index 0000000..8e2bad1 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_es_out.h @@ -0,0 +1,163 @@ +/***************************************************************************** + * vlc_es_out.h: es_out (demuxer output) descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: cf1abcec08467eb495ad62474e055c1500f358b6 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_OUT_H +#define VLC_ES_OUT_H 1 + +/** + * \file + * This file defines functions and structures for handling es_out in stream output + */ + +/** + * \defgroup es out Es Out + * @{ + */ + +enum es_out_query_e +{ + /* set ES selected for the es category (audio/video/spu) */ + ES_OUT_SET_ES, /* arg1= es_out_id_t* */ + ES_OUT_RESTART_ES, /* arg1= es_out_id_t* */ + + /* set 'default' tag on ES (copied across from container) */ + ES_OUT_SET_ES_DEFAULT, /* arg1= es_out_id_t* */ + + /* force selection/unselection of the ES (bypass current mode) */ + ES_OUT_SET_ES_STATE,/* arg1= es_out_id_t* arg2=bool */ + ES_OUT_GET_ES_STATE,/* arg1= es_out_id_t* arg2=bool* */ + + /* */ + ES_OUT_SET_GROUP, /* arg1= int */ + + /* PCR handling, DTS/PTS will be automatically computed using thoses PCR + * XXX: SET_PCR(_GROUP) are in charge of the pace control. They will wait + * to slow down the demuxer so that it reads at the right speed. + * XXX: if you want PREROLL just call ES_OUT_SET_NEXT_DISPLAY_TIME and send + * as you would normally do. + */ + ES_OUT_SET_PCR, /* arg1=int64_t i_pcr(microsecond!) (using default group 0)*/ + ES_OUT_SET_GROUP_PCR, /* arg1= int i_group, arg2=int64_t i_pcr(microsecond!)*/ + ES_OUT_RESET_PCR, /* no arg */ + + /* Try not to use this one as it is a bit hacky */ + ES_OUT_SET_ES_FMT, /* arg1= es_out_id_t* arg2=es_format_t* */ + + /* Allow preroll of data (data with dts/pts < i_pts for all ES will be decoded but not displayed */ + ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=int64_t i_pts(microsecond) */ + /* Set meta data for group (dynamic) (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_GROUP_META, /* arg1=int i_group arg2=const vlc_meta_t */ + /* Set epg for group (dynamic) (The vlc_epg_t is not modified nor released) */ + ES_OUT_SET_GROUP_EPG, /* arg1=int i_group arg2=const vlc_epg_t */ + /* */ + ES_OUT_DEL_GROUP, /* arg1=int i_group */ + + /* Set scrambled state for one es */ + ES_OUT_SET_ES_SCRAMBLED_STATE, /* arg1=int i_group arg2=es_out_id_t* */ + + /* Stop any buffering being done, and ask if es_out has no more data to + * play. + * It will not block and so MUST be used carrefully. The only good reason + * is for interactive playback (like for DVD menu). + * XXX You SHALL call ES_OUT_RESET_PCR before any other es_out_Control/Send calls. */ + ES_OUT_GET_EMPTY, /* arg1=bool* res=cannot fail */ + + /* Set global meta data (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_META, /* arg1=const vlc_meta_t * */ + + /* PCR system clock manipulation for external clock synchronization */ + ES_OUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + ES_OUT_MODIFY_PCR_SYSTEM, /* arg1=int is_absolute, arg2=mtime_t, res=can fail */ + + /* First value usable for private control */ + ES_OUT_PRIVATE_START = 0x10000, +}; + +struct es_out_t +{ + es_out_id_t *(*pf_add) ( es_out_t *, const es_format_t * ); + int (*pf_send) ( es_out_t *, es_out_id_t *, block_t * ); + void (*pf_del) ( es_out_t *, es_out_id_t * ); + int (*pf_control)( es_out_t *, int i_query, va_list ); + void (*pf_destroy)( es_out_t * ); + + es_out_sys_t *p_sys; +}; + +VLC_USED +static inline es_out_id_t * es_out_Add( es_out_t *out, const es_format_t *fmt ) +{ + return out->pf_add( out, fmt ); +} + +static inline void es_out_Del( es_out_t *out, es_out_id_t *id ) +{ + out->pf_del( out, id ); +} + +static inline int es_out_Send( es_out_t *out, es_out_id_t *id, + block_t *p_block ) +{ + return out->pf_send( out, id, p_block ); +} + +static inline int es_out_vaControl( es_out_t *out, int i_query, va_list args ) +{ + return out->pf_control( out, i_query, args ); +} + +static inline int es_out_Control( es_out_t *out, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = es_out_vaControl( out, i_query, args ); + va_end( args ); + return i_result; +} + +static inline void es_out_Delete( es_out_t *p_out ) +{ + p_out->pf_destroy( p_out ); +} + +static inline int es_out_ControlSetMeta( es_out_t *out, const vlc_meta_t *p_meta ) +{ + return es_out_Control( out, ES_OUT_SET_META, p_meta ); +} + +static inline int es_out_ControlGetPcrSystem( es_out_t *out, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return es_out_Control( out, ES_OUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +static inline int es_out_ControlModifyPcrSystem( es_out_t *out, bool b_absolute, mtime_t i_system ) +{ + return es_out_Control( out, ES_OUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_events.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_events.h new file mode 100644 index 0000000..b167e91 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_events.h @@ -0,0 +1,263 @@ +/***************************************************************************** + * vlc_events.h: events definitions + * Interface used to send events. + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: c3425102b47c0ed953b527412521d1c8698b083e $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EVENTS_H +# define VLC_EVENTS_H + +#include +#include + +/** + * \file + * This file is the interface definition for events + * (implementation in src/misc/events.c) + */ + +/***************************************************************************** + * Documentation + *****************************************************************************/ +/* + **** Background + * + * This implements a way to send and receive event for an object (which can be + * a simple C struct or less). + * + * This is in direct concurrency with the Variable based Callback + * (see src/misc/variables.c). + * + * It has the following advantages over Variable based Callback: + * - No need to implement the whole VLC_COMMON_MEMBERS in the object, + * thus it reduce it size. This is especially true for input_item_t which + * doesn't have VLC_COMMON_MEMBERS. This is the first reason of existence of + * this implementation. + * - Libvlc can easily be based upon that. + * - Existing event are clearly declared (in include/vlc_events.h) + * + * + **** Example usage + * + * (vlc_cool_object_t doesn't need to have the VLC_COMMON_MEMBERS.) + * + * struct vlc_cool_object_t + * { + * ... + * vlc_event_manager_t p_event_manager; + * ... + * } + * + * vlc_my_cool_object_new() + * { + * ... + * vlc_event_manager_init( &p_self->p_event_manager, p_self, p_a_libvlc_object ); + * vlc_event_manager_register_event_type(p_self->p_event_manager, + * vlc_MyCoolObjectDidSomething, p_e) + * ... + * } + * + * vlc_my_cool_object_release() + * { + * ... + * vlc_event_manager_fini( &p_self->p_event_manager ); + * ... + * } + * + * vlc_my_cool_object_do_something() + * { + * ... + * vlc_event_t event; + * event.type = vlc_MyCoolObjectDidSomething; + * event.u.my_cool_object_did_something.what_it_did = kSomething; + * vlc_event_send( &p_self->p_event_manager, &event ); + * } + * */ + + /***************************************************************************** + * Event Type + *****************************************************************************/ + +/* Private structure defined in misc/events.c */ +struct vlc_event_listeners_group_t; + +/* Event manager type */ +typedef struct vlc_event_manager_t +{ + void * p_obj; + vlc_mutex_t object_lock; + vlc_mutex_t event_sending_lock; + DECL_ARRAY(struct vlc_event_listeners_group_t *) listeners_groups; +} vlc_event_manager_t; + +/* List of event */ +typedef enum vlc_event_type_t { + /* Input (thread) events */ + vlc_InputStateChanged, + vlc_InputSelectedStreamChanged, + + /* Input item events */ + vlc_InputItemMetaChanged, + vlc_InputItemSubItemAdded, + vlc_InputItemSubItemTreeAdded, + vlc_InputItemDurationChanged, + vlc_InputItemPreparsedChanged, + vlc_InputItemNameChanged, + vlc_InputItemInfoChanged, + vlc_InputItemErrorWhenReadingChanged, + + /* Service Discovery event */ + vlc_ServicesDiscoveryItemAdded, + vlc_ServicesDiscoveryItemRemoved, + vlc_ServicesDiscoveryItemRemoveAll, + vlc_ServicesDiscoveryStarted, + vlc_ServicesDiscoveryEnded, + + /* Addons Manager events */ + vlc_AddonFound, + vlc_AddonsDiscoveryEnded, + vlc_AddonChanged +} vlc_event_type_t; + +/* Event definition */ +typedef struct vlc_event_t +{ + vlc_event_type_t type; + void * p_obj; /* Sender object, automatically filled by vlc_event_send() */ + union vlc_event_type_specific + { + /* Input (thread) events */ + struct vlc_input_state_changed + { + int new_state; + } input_state_changed; + struct vlc_input_selected_stream_changed + { + void * unused; + } input_selected_stream_changed; + + /* Input item events */ + struct vlc_input_item_meta_changed + { + vlc_meta_type_t meta_type; + } input_item_meta_changed; + struct vlc_input_item_subitem_added + { + input_item_t * p_new_child; + } input_item_subitem_added; + struct vlc_input_item_subitem_tree_added + { + input_item_node_t * p_root; + } input_item_subitem_tree_added; + struct vlc_input_item_duration_changed + { + mtime_t new_duration; + } input_item_duration_changed; + struct vlc_input_item_preparsed_changed + { + int new_status; + } input_item_preparsed_changed; + struct vlc_input_item_name_changed + { + const char * new_name; + } input_item_name_changed; + struct vlc_input_item_info_changed + { + void * unused; + } input_item_info_changed; + struct input_item_error_when_reading_changed + { + bool new_value; + } input_item_error_when_reading_changed; + + /* Service discovery events */ + struct vlc_services_discovery_item_added + { + input_item_t * p_new_item; + const char * psz_category; + } services_discovery_item_added; + struct vlc_services_discovery_item_removed + { + input_item_t * p_item; + } services_discovery_item_removed; + struct vlc_services_discovery_started + { + void * unused; + } services_discovery_started; + struct vlc_services_discovery_ended + { + void * unused; + } services_discovery_ended; + + /* Addons */ + struct vlc_addon_generic_event + { + addon_entry_t * p_entry; + } addon_generic_event; + } u; +} vlc_event_t; + +/* Event callback type */ +typedef void ( *vlc_event_callback_t )( const vlc_event_t *, void * ); + + /***************************************************************************** + * Event manager + *****************************************************************************/ + +/* + * p_obj points to the object that owns the event manager, and from + * which events are sent + */ +VLC_API int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj ); + +/* + * Destroy + */ +VLC_API void vlc_event_manager_fini( vlc_event_manager_t * p_em ); + +/* + * Tells a specific event manager that it will handle event_type object + */ +VLC_API int vlc_event_manager_register_event_type( vlc_event_manager_t * p_em, + vlc_event_type_t ); + +/* + * Send an event to the listener attached to this p_em. + */ +VLC_API void vlc_event_send( vlc_event_manager_t * p_em, vlc_event_t * ); + +/* + * Add a callback for an event. + */ +VLC_API int vlc_event_attach( vlc_event_manager_t * p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +/* + * Remove a callback for an event. + */ +VLC_API void vlc_event_detach( vlc_event_manager_t *p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +#endif /* VLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_filter.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_filter.h new file mode 100644 index 0000000..91a14a8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_filter.h @@ -0,0 +1,419 @@ +/***************************************************************************** + * vlc_filter.h: filter related structures and functions + ***************************************************************************** + * Copyright (C) 1999-2008 VLC authors and VideoLAN + * $Id: 320cbac3a4a5b8461ec41eabd77f323bbbc509dd $ + * + * Authors: Gildas Bazin + * Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FILTER_H +#define VLC_FILTER_H 1 + +#include +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by video and audio filters + */ + +typedef struct filter_owner_sys_t filter_owner_sys_t; + +/** Structure describing a filter + * @warning BIG FAT WARNING : the code relies on the first 4 members of + * filter_t and decoder_t to be the same, so if you have anything to add, + * do it at the end of the structure. + */ +struct filter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + filter_sys_t * p_sys; + + /* Input format */ + es_format_t fmt_in; + + /* Output format of filter */ + es_format_t fmt_out; + bool b_allow_fmt_out_change; + + /* Filter configuration */ + config_chain_t * p_cfg; + + union + { + struct + { + picture_t * (*pf_filter) ( filter_t *, picture_t * ); + void (*pf_flush)( filter_t * ); + picture_t * (*pf_buffer_new) ( filter_t * ); + void (*pf_buffer_del) ( filter_t *, picture_t * ); + /* Filter mouse state. + * + * If non-NULL, you must convert from output to input formats: + * - If VLC_SUCCESS is returned, the mouse state is propagated. + * - Otherwise, the mouse change is not propagated. + * If NULL, the mouse state is considered unchanged and will be + * propagated. + */ + int (*pf_mouse)( filter_t *, vlc_mouse_t *, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ); + } video; +#define pf_video_filter u.video.pf_filter +#define pf_video_flush u.video.pf_flush +#define pf_video_mouse u.video.pf_mouse +#define pf_video_buffer_new u.video.pf_buffer_new +#define pf_video_buffer_del u.video.pf_buffer_del + + struct + { + block_t * (*pf_filter) ( filter_t *, block_t * ); + } audio; +#define pf_audio_filter u.audio.pf_filter + + struct + { + void (*pf_blend) ( filter_t *, picture_t *, + const picture_t *, int, int, int ); + } blend; +#define pf_video_blend u.blend.pf_blend + + struct + { + subpicture_t * (*pf_source) ( filter_t *, mtime_t ); + subpicture_t * (*pf_buffer_new)( filter_t * ); + void (*pf_buffer_del)( filter_t *, subpicture_t * ); + int (*pf_mouse) ( filter_t *, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + const video_format_t * ); + } sub; +#define pf_sub_source u.sub.pf_source +#define pf_sub_buffer_new u.sub.pf_buffer_new +#define pf_sub_buffer_del u.sub.pf_buffer_del +#define pf_sub_mouse u.sub.pf_mouse + + struct + { + subpicture_t * (*pf_filter) ( filter_t *, subpicture_t * ); + } subf; +#define pf_sub_filter u.subf.pf_filter + + struct + { + int (*pf_text) ( filter_t *, subpicture_region_t *, + subpicture_region_t *, + const vlc_fourcc_t * ); + int (*pf_html) ( filter_t *, subpicture_region_t *, + subpicture_region_t *, + const vlc_fourcc_t * ); + } render; +#define pf_render_text u.render.pf_text +#define pf_render_html u.render.pf_html + + } u; + + /* Input attachments + * XXX use filter_GetInputAttachments */ + int (*pf_get_attachments)( filter_t *, input_attachment_t ***, int * ); + + /* Private structure for the owner of the decoder */ + filter_owner_sys_t *p_owner; +}; + +/** + * This function will return a new picture usable by p_filter as an output + * buffer. You have to release it using filter_DeletePicture or by returning + * it to the caller as a pf_video_filter return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new picture on success or NULL on failure + */ +static inline picture_t *filter_NewPicture( filter_t *p_filter ) +{ + picture_t *p_picture = p_filter->pf_video_buffer_new( p_filter ); + if( !p_picture ) + msg_Warn( p_filter, "can't get output picture" ); + return p_picture; +} + +/** + * This function will release a picture create by filter_NewPicture. + * Provided for convenience. + * + * \param p_filter filter_t object + * \param p_picture picture to be deleted + */ +static inline void filter_DeletePicture( filter_t *p_filter, picture_t *p_picture ) +{ + p_filter->pf_video_buffer_del( p_filter, p_picture ); +} + +/** + * This function will flush the state of a video filter. + */ +static inline void filter_FlushPictures( filter_t *p_filter ) +{ + if( p_filter->pf_video_flush ) + p_filter->pf_video_flush( p_filter ); +} + +/** + * This function will return a new subpicture usable by p_filter as an output + * buffer. You have to release it using filter_DeleteSubpicture or by returning + * it to the caller as a pf_sub_source return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new subpicture + */ +static inline subpicture_t *filter_NewSubpicture( filter_t *p_filter ) +{ + subpicture_t *p_subpicture = p_filter->pf_sub_buffer_new( p_filter ); + if( !p_subpicture ) + msg_Warn( p_filter, "can't get output subpicture" ); + return p_subpicture; +} + +/** + * This function will release a subpicture create by filter_NewSubicture. + * Provided for convenience. + * + * \param p_filter filter_t object + * \param p_subpicture to be released + */ +static inline void filter_DeleteSubpicture( filter_t *p_filter, subpicture_t *p_subpicture ) +{ + p_filter->pf_sub_buffer_del( p_filter, p_subpicture ); +} + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +static inline int filter_GetInputAttachments( filter_t *p_filter, + input_attachment_t ***ppp_attachment, + int *pi_attachment ) +{ + if( !p_filter->pf_get_attachments ) + return VLC_EGENERIC; + return p_filter->pf_get_attachments( p_filter, + ppp_attachment, pi_attachment ); +} + +/** + * It creates a blend filter. + * + * Only the chroma properties of the dest format is used (chroma + * type, rgb masks and shifts) + */ +VLC_API filter_t * filter_NewBlend( vlc_object_t *, const video_format_t *p_dst_chroma ) VLC_USED; + +/** + * It configures blend filter parameters that are allowed to changed + * after the creation. + */ +VLC_API int filter_ConfigureBlend( filter_t *, int i_dst_width, int i_dst_height, const video_format_t *p_src ); + +/** + * It blends a picture into another one. + * + * The input picture is not modified and not released. + */ +VLC_API int filter_Blend( filter_t *, picture_t *p_dst, int i_dst_x, int i_dst_y, const picture_t *p_src, int i_alpha ); + +/** + * It destroys a blend filter created by filter_NewBlend. + */ +VLC_API void filter_DeleteBlend( filter_t * ); + +/** + * Create a picture_t *(*)( filter_t *, picture_t * ) compatible wrapper + * using a void (*)( filter_t *, picture_t *, picture_t * ) function + * + * Currently used by the chroma video filters + */ +#define VIDEO_FILTER_WRAPPER( name ) \ + static picture_t *name ## _Filter ( filter_t *p_filter, \ + picture_t *p_pic ) \ + { \ + picture_t *p_outpic = filter_NewPicture( p_filter ); \ + if( p_outpic ) \ + { \ + name( p_filter, p_pic, p_outpic ); \ + picture_CopyProperties( p_outpic, p_pic ); \ + } \ + picture_Release( p_pic ); \ + return p_outpic; \ + } + +/** + * Filter chain management API + * The filter chain management API is used to dynamically construct filters + * and add them in a chain. + */ + +typedef struct filter_chain_t filter_chain_t; + +/** + * Create new filter chain + * + * \param p_object pointer to a vlc object + * \param psz_capability vlc capability of filters in filter chain + * \param b_allow_format_fmt_change allow changing of fmt + * \param pf_buffer_allocation_init callback function to initialize buffer allocations + * \param pf_buffer_allocation_clear callback function to clear buffer allocation initialization + * \param p_buffer_allocation_data pointer to private allocation data + * \return pointer to a filter chain + */ +VLC_API filter_chain_t * filter_chain_New( vlc_object_t *, const char *, bool, int (*)( filter_t *, void * ), void (*)( filter_t * ), void * ) VLC_USED; +#define filter_chain_New( a, b, c, d, e, f ) filter_chain_New( VLC_OBJECT( a ), b, c, d, e, f ) + +/** + * Delete filter chain will delete all filters in the chain and free all + * allocated data. The pointer to the filter chain is then no longer valid. + * + * \param p_chain pointer to filter chain + */ +VLC_API void filter_chain_Delete( filter_chain_t * ); + +/** + * Reset filter chain will delete all filters in the chain and + * reset p_fmt_in and p_fmt_out to the new values. + * + * \param p_chain pointer to filter chain + * \param p_fmt_in new fmt_in params + * \param p_fmt_out new fmt_out params + */ +VLC_API void filter_chain_Reset( filter_chain_t *, const es_format_t *, const es_format_t * ); + +/** + * Append filter to the end of the chain. + * + * \param p_chain pointer to filter chain + * \param psz_name name of filter + * \param p_cfg + * \param p_fmt_in input es_format_t + * \param p_fmt_out output es_format_t + * \return pointer to filter chain + */ +VLC_API filter_t * filter_chain_AppendFilter( filter_chain_t *, const char *, config_chain_t *, const es_format_t *, const es_format_t * ); + +/** + * Append new filter to filter chain from string. + * + * \param p_chain pointer to filter chain + * \param psz_string string of filters + * \return 0 for success + */ +VLC_API int filter_chain_AppendFromString( filter_chain_t *, const char * ); + +/** + * Delete filter from filter chain. This function also releases the filter + * object and unloads the filter modules. The pointer to p_filter is no + * longer valid after this function successfully returns. + * + * \param p_chain pointer to filter chain + * \param p_filter pointer to filter object + * \return VLC_SUCCESS on succes, else VLC_EGENERIC + */ +VLC_API int filter_chain_DeleteFilter( filter_chain_t *, filter_t * ); + +/** + * Get the number of filters in the filter chain. + * + * \param p_chain pointer to filter chain + * \return number of filters in this filter chain + */ +VLC_API int filter_chain_GetLength( filter_chain_t * ); + +/** + * Get last p_fmt_out in the chain. + * + * \param p_chain pointer to filter chain + * \return last p_fmt (es_format_t) of this filter chain + */ +VLC_API const es_format_t * filter_chain_GetFmtOut( filter_chain_t * ); + +/** + * Apply the filter chain to a video picture. + * + * \param p_chain pointer to filter chain + * \param p_picture picture to apply filters on + * \return modified picture after applying all video filters + */ +VLC_API picture_t * filter_chain_VideoFilter( filter_chain_t *, picture_t * ); + +/** + * Flush a video filter chain. + */ +VLC_API void filter_chain_VideoFlush( filter_chain_t * ); + +/** + * Apply the filter chain to a audio block. + * + * \param p_chain pointer to filter chain + * \param p_block audio frame to apply filters on + * \return modified audio frame after applying all audio filters + */ +VLC_API block_t * filter_chain_AudioFilter( filter_chain_t *, block_t * ); + +/** + * Apply filter chain to subpictures. + * + * \param p_chain pointer to filter chain + * \param display_date of subpictures + */ +VLC_API void filter_chain_SubSource( filter_chain_t *, mtime_t ); + +/** + * Apply filter chain to subpictures. + * + * \param p_chain pointer to filter chain + * \param p_subpicture subpicture to apply filters on + * \return modified subpicture after applying all subpicture filters + */ +VLC_API subpicture_t * filter_chain_SubFilter( filter_chain_t *, subpicture_t * ); + +/** + * Apply the filter chain to a mouse state. + * + * It will be applied from the output to the input. It makes sense only + * for a video filter chain. + * + * The vlc_mouse_t* pointers may be the same. + */ +VLC_API int filter_chain_MouseFilter( filter_chain_t *, vlc_mouse_t *, const vlc_mouse_t * ); + +/** + * Inform the filter chain of mouse state. + * + * It makes sense only for a sub source chain. + */ +VLC_API int filter_chain_MouseEvent( filter_chain_t *, const vlc_mouse_t *, const video_format_t * ); + +#endif /* _VLC_FILTER_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_fingerprinter.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_fingerprinter.h new file mode 100644 index 0000000..e5d3afe --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_fingerprinter.h @@ -0,0 +1,92 @@ +/***************************************************************************** + * vlc_fingerprinter.h: Fingerprinter abstraction layer + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FINGERPRINTER_H +# define VLC_FINGERPRINTER_H + +#include +#include +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct fingerprinter_sys_t fingerprinter_sys_t; + +struct fingerprint_request_t +{ + input_item_t *p_item; + unsigned int i_duration; /* track length hint in seconds, 0 if unkown */ + struct + { + char *psz_fingerprint; + vlc_array_t metas_array; + } results ; +}; +typedef struct fingerprint_request_t fingerprint_request_t; + +static inline fingerprint_request_t *fingerprint_request_New( input_item_t *p_item ) +{ + fingerprint_request_t *p_r = + ( fingerprint_request_t * ) calloc( 1, sizeof( fingerprint_request_t ) ); + if ( !p_r ) return NULL; + p_r->results.psz_fingerprint = NULL; + p_r->i_duration = 0; + vlc_gc_incref( p_item ); + p_r->p_item = p_item; + vlc_array_init( & p_r->results.metas_array ); /* shouldn't be needed */ + return p_r; +} + +static inline void fingerprint_request_Delete( fingerprint_request_t *p_f ) +{ + vlc_gc_decref( p_f->p_item ); + free( p_f->results.psz_fingerprint ); + for( int i = 0; i < vlc_array_count( & p_f->results.metas_array ); i++ ) + vlc_meta_Delete( (vlc_meta_t *) vlc_array_item_at_index( & p_f->results.metas_array, i ) ); + free( p_f ); +} + +struct fingerprinter_thread_t +{ + VLC_COMMON_MEMBERS + + /* Specific interfaces */ + fingerprinter_sys_t * p_sys; + + module_t * p_module; + void ( *pf_run ) ( struct fingerprinter_thread_t * ); + + void ( *pf_enqueue ) ( struct fingerprinter_thread_t *f, fingerprint_request_t *r ); + fingerprint_request_t * ( *pf_getresults ) ( struct fingerprinter_thread_t *f ); + void ( *pf_apply ) ( fingerprint_request_t *, int i_resultid ); +}; +typedef struct fingerprinter_thread_t fingerprinter_thread_t; + +VLC_API fingerprinter_thread_t *fingerprinter_Create( vlc_object_t *p_this ); +VLC_API void fingerprinter_Destroy( fingerprinter_thread_t *p_fingerprint ); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_fourcc.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_fourcc.h new file mode 100644 index 0000000..f691438 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_fourcc.h @@ -0,0 +1,575 @@ +/***************************************************************************** + * vlc_fourcc.h: Definition of various FOURCC and helpers + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: debb5c97d7d74c6591943104a4fb2afc15a1aa49 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FOURCC_H +#define VLC_FOURCC_H 1 + +#include + +/* Video codec */ +#define VLC_CODEC_MPGV VLC_FOURCC('m','p','g','v') +#define VLC_CODEC_MP4V VLC_FOURCC('m','p','4','v') +#define VLC_CODEC_DIV1 VLC_FOURCC('D','I','V','1') +#define VLC_CODEC_DIV2 VLC_FOURCC('D','I','V','2') +#define VLC_CODEC_DIV3 VLC_FOURCC('D','I','V','3') +#define VLC_CODEC_SVQ1 VLC_FOURCC('S','V','Q','1') +#define VLC_CODEC_SVQ3 VLC_FOURCC('S','V','Q','3') +#define VLC_CODEC_H264 VLC_FOURCC('h','2','6','4') +#define VLC_CODEC_H263 VLC_FOURCC('h','2','6','3') +#define VLC_CODEC_H263I VLC_FOURCC('I','2','6','3') +#define VLC_CODEC_H263P VLC_FOURCC('I','L','V','R') +#define VLC_CODEC_FLV1 VLC_FOURCC('F','L','V','1') +#define VLC_CODEC_H261 VLC_FOURCC('h','2','6','1') +#define VLC_CODEC_MJPG VLC_FOURCC('M','J','P','G') +#define VLC_CODEC_MJPGB VLC_FOURCC('m','j','p','b') +#define VLC_CODEC_LJPG VLC_FOURCC('L','J','P','G') +#define VLC_CODEC_WMV1 VLC_FOURCC('W','M','V','1') +#define VLC_CODEC_WMV2 VLC_FOURCC('W','M','V','2') +#define VLC_CODEC_WMV3 VLC_FOURCC('W','M','V','3') +#define VLC_CODEC_WMVA VLC_FOURCC('W','M','V','A') +#define VLC_CODEC_WMVP VLC_FOURCC('W','M','V','P') +#define VLC_CODEC_WMVP2 VLC_FOURCC('W','V','P','2') +#define VLC_CODEC_VC1 VLC_FOURCC('V','C','-','1') +#define VLC_CODEC_THEORA VLC_FOURCC('t','h','e','o') +#define VLC_CODEC_TARKIN VLC_FOURCC('t','a','r','k') +#define VLC_CODEC_DIRAC VLC_FOURCC('d','r','a','c') +#define VLC_CODEC_CAVS VLC_FOURCC('C','A','V','S') +#define VLC_CODEC_NUV VLC_FOURCC('N','J','P','G') +#define VLC_CODEC_RV10 VLC_FOURCC('R','V','1','0') +#define VLC_CODEC_RV13 VLC_FOURCC('R','V','1','3') +#define VLC_CODEC_RV20 VLC_FOURCC('R','V','2','0') +#define VLC_CODEC_RV30 VLC_FOURCC('R','V','3','0') +#define VLC_CODEC_RV40 VLC_FOURCC('R','V','4','0') +#define VLC_CODEC_VP3 VLC_FOURCC('V','P','3',' ') +#define VLC_CODEC_VP5 VLC_FOURCC('V','P','5',' ') +#define VLC_CODEC_VP6 VLC_FOURCC('V','P','6','2') +#define VLC_CODEC_VP6F VLC_FOURCC('V','P','6','F') +#define VLC_CODEC_VP6A VLC_FOURCC('V','P','6','A') +#define VLC_CODEC_MSVIDEO1 VLC_FOURCC('M','S','V','C') +#define VLC_CODEC_FLIC VLC_FOURCC('F','L','I','C') +#define VLC_CODEC_SP5X VLC_FOURCC('S','P','5','X') +#define VLC_CODEC_DV VLC_FOURCC('d','v',' ',' ') +#define VLC_CODEC_MSRLE VLC_FOURCC('m','r','l','e') +#define VLC_CODEC_HUFFYUV VLC_FOURCC('H','F','Y','U') +#define VLC_CODEC_FFVHUFF VLC_FOURCC('F','F','V','H') +#define VLC_CODEC_ASV1 VLC_FOURCC('A','S','V','1') +#define VLC_CODEC_ASV2 VLC_FOURCC('A','S','V','2') +#define VLC_CODEC_FFV1 VLC_FOURCC('F','F','V','1') +#define VLC_CODEC_VCR1 VLC_FOURCC('V','C','R','1') +#define VLC_CODEC_CLJR VLC_FOURCC('C','L','J','R') +#define VLC_CODEC_RPZA VLC_FOURCC('r','p','z','a') +#define VLC_CODEC_SMC VLC_FOURCC('s','m','c',' ') +#define VLC_CODEC_CINEPAK VLC_FOURCC('C','V','I','D') +#define VLC_CODEC_TSCC VLC_FOURCC('T','S','C','C') +#define VLC_CODEC_CSCD VLC_FOURCC('C','S','C','D') +#define VLC_CODEC_ZMBV VLC_FOURCC('Z','M','B','V') +#define VLC_CODEC_VMNC VLC_FOURCC('V','M','n','c') +#define VLC_CODEC_FRAPS VLC_FOURCC('F','P','S','1') +#define VLC_CODEC_TRUEMOTION1 VLC_FOURCC('D','U','C','K') +#define VLC_CODEC_TRUEMOTION2 VLC_FOURCC('T','M','2','0') +#define VLC_CODEC_QTRLE VLC_FOURCC('r','l','e',' ') +#define VLC_CODEC_QDRAW VLC_FOURCC('q','d','r','w') +#define VLC_CODEC_QPEG VLC_FOURCC('Q','P','E','G') +#define VLC_CODEC_ULTI VLC_FOURCC('U','L','T','I') +#define VLC_CODEC_VIXL VLC_FOURCC('V','I','X','L') +#define VLC_CODEC_LOCO VLC_FOURCC('L','O','C','O') +#define VLC_CODEC_WNV1 VLC_FOURCC('W','N','V','1') +#define VLC_CODEC_AASC VLC_FOURCC('A','A','S','C') +#define VLC_CODEC_INDEO2 VLC_FOURCC('I','V','2','0') +#define VLC_CODEC_INDEO3 VLC_FOURCC('I','V','3','1') +#define VLC_CODEC_INDEO4 VLC_FOURCC('I','V','4','1') +#define VLC_CODEC_INDEO5 VLC_FOURCC('I','V','5','0') +#define VLC_CODEC_FLASHSV VLC_FOURCC('F','S','V','1') +#define VLC_CODEC_KMVC VLC_FOURCC('K','M','V','C') +#define VLC_CODEC_SMACKVIDEO VLC_FOURCC('S','M','K','2') +#define VLC_CODEC_DNXHD VLC_FOURCC('A','V','d','n') +#define VLC_CODEC_8BPS VLC_FOURCC('8','B','P','S') +#define VLC_CODEC_MIMIC VLC_FOURCC('M','L','2','O') +#define VLC_CODEC_INTERPLAY VLC_FOURCC('i','m','v','e') +#define VLC_CODEC_IDCIN VLC_FOURCC('I','D','C','I') +#define VLC_CODEC_4XM VLC_FOURCC('4','X','M','V') +#define VLC_CODEC_ROQ VLC_FOURCC('R','o','Q','v') +#define VLC_CODEC_MDEC VLC_FOURCC('M','D','E','C') +#define VLC_CODEC_VMDVIDEO VLC_FOURCC('V','M','D','V') +#define VLC_CODEC_CDG VLC_FOURCC('C','D','G',' ') +#define VLC_CODEC_FRWU VLC_FOURCC('F','R','W','U') +#define VLC_CODEC_AMV VLC_FOURCC('A','M','V',' ') +#define VLC_CODEC_VP7 VLC_FOURCC('V','P','7','0') +#define VLC_CODEC_VP8 VLC_FOURCC('V','P','8','0') +#define VLC_CODEC_VP9 VLC_FOURCC('V','P','9','0') +#define VLC_CODEC_JPEG2000 VLC_FOURCC('J','P','2','K') +#define VLC_CODEC_LAGARITH VLC_FOURCC('L','A','G','S') +#define VLC_CODEC_FLASHSV2 VLC_FOURCC('F','S','V','2') +#define VLC_CODEC_PRORES VLC_FOURCC('a','p','c','n') +#define VLC_CODEC_MXPEG VLC_FOURCC('M','X','P','G') +#define VLC_CODEC_CDXL VLC_FOURCC('C','D','X','L') +#define VLC_CODEC_BMVVIDEO VLC_FOURCC('B','M','V','V') +#define VLC_CODEC_UTVIDEO VLC_FOURCC('U','L','R','A') +#define VLC_CODEC_VBLE VLC_FOURCC('V','B','L','E') +#define VLC_CODEC_DXTORY VLC_FOURCC('x','t','o','r') +#define VLC_CODEC_MSS1 VLC_FOURCC('M','S','S','1') +#define VLC_CODEC_MSS2 VLC_FOURCC('M','S','S','2') +#define VLC_CODEC_MSA1 VLC_FOURCC('M','S','A','1') +#define VLC_CODEC_TSC2 VLC_FOURCC('T','S','C','2') +#define VLC_CODEC_MTS2 VLC_FOURCC('M','T','S','2') +#define VLC_CODEC_HEVC VLC_FOURCC('h','e','v','c') +#define VLC_CODEC_ICOD VLC_FOURCC('i','c','o','d') +#define VLC_CODEC_G2M2 VLC_FOURCC('G','2','M','2') +#define VLC_CODEC_G2M3 VLC_FOURCC('G','2','M','3') +#define VLC_CODEC_G2M4 VLC_FOURCC('G','2','M','4') +#define VLC_CODEC_BINKVIDEO VLC_FOURCC('B','I','K','f') +#define VLC_CODEC_BINKAUDIO_DCT VLC_FOURCC('B','A','U','1') +#define VLC_CODEC_BINKAUDIO_RDFT VLC_FOURCC('B','A','U','2') +#define VLC_CODEC_XAN_WC4 VLC_FOURCC('X','x','a','n') +#define VLC_CODEC_LCL_MSZH VLC_FOURCC('M','S','Z','H') +#define VLC_CODEC_LCL_ZLIB VLC_FOURCC('Z','L','I','B') +#define VLC_CODEC_THP VLC_FOURCC('T','H','P','0') +#define VLC_CODEC_ESCAPE124 VLC_FOURCC('E','1','2','4') +#define VLC_CODEC_KGV1 VLC_FOURCC('K','G','V','1') +#define VLC_CODEC_CLLC VLC_FOURCC('C','L','L','C') +#define VLC_CODEC_AURA VLC_FOURCC('A','U','R','A') +#define VLC_CODEC_FIC VLC_FOURCC('F','I','C','V') + +/* Planar YUV 4:1:0 Y:V:U */ +#define VLC_CODEC_YV9 VLC_FOURCC('Y','V','U','9') +/* Planar YUV 4:2:0 Y:V:U */ +#define VLC_CODEC_YV12 VLC_FOURCC('Y','V','1','2') +/* Planar YUV 4:1:0 Y:U:V */ +#define VLC_CODEC_I410 VLC_FOURCC('I','4','1','0') +/* Planar YUV 4:1:1 Y:U:V */ +#define VLC_CODEC_I411 VLC_FOURCC('I','4','1','1') +/* Planar YUV 4:2:0 Y:U:V 8-bit */ +#define VLC_CODEC_I420 VLC_FOURCC('I','4','2','0') +/* Planar YUV 4:2:0 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I420_9L VLC_FOURCC('I','0','9','L') +#define VLC_CODEC_I420_9B VLC_FOURCC('I','0','9','B') +/* Planar YUV 4:2:0 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I420_10L VLC_FOURCC('I','0','A','L') +#define VLC_CODEC_I420_10B VLC_FOURCC('I','0','A','B') +/* Planar YUV 4:2:2 Y:U:V 8-bit */ +#define VLC_CODEC_I422 VLC_FOURCC('I','4','2','2') +/* Planar YUV 4:2:2 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I422_9L VLC_FOURCC('I','2','9','L') +#define VLC_CODEC_I422_9B VLC_FOURCC('I','2','9','B') +/* Planar YUV 4:2:2 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I422_10L VLC_FOURCC('I','2','A','L') +#define VLC_CODEC_I422_10B VLC_FOURCC('I','2','A','B') +/* Planar YUV 4:4:0 Y:U:V */ +#define VLC_CODEC_I440 VLC_FOURCC('I','4','4','0') +/* Planar YUV 4:4:4 Y:U:V 8-bit */ +#define VLC_CODEC_I444 VLC_FOURCC('I','4','4','4') +/* Planar YUV 4:4:4 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I444_9L VLC_FOURCC('I','4','9','L') +#define VLC_CODEC_I444_9B VLC_FOURCC('I','4','9','B') +/* Planar YUV 4:4:4 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I444_10L VLC_FOURCC('I','4','A','L') +#define VLC_CODEC_I444_10B VLC_FOURCC('I','4','A','B') +/* Planar YUV 4:4:4 Y:U:V 16-bit */ +#define VLC_CODEC_I444_16L VLC_FOURCC('I','4','F','L') +#define VLC_CODEC_I444_16B VLC_FOURCC('I','4','F','B') +/* Planar YUV 4:2:0 Y:U:V full scale */ +#define VLC_CODEC_J420 VLC_FOURCC('J','4','2','0') +/* Planar YUV 4:2:2 Y:U:V full scale */ +#define VLC_CODEC_J422 VLC_FOURCC('J','4','2','2') +/* Planar YUV 4:4:0 Y:U:V full scale */ +#define VLC_CODEC_J440 VLC_FOURCC('J','4','4','0') +/* Planar YUV 4:4:4 Y:U:V full scale */ +#define VLC_CODEC_J444 VLC_FOURCC('J','4','4','4') +/* Palettized YUV with palette element Y:U:V:A */ +#define VLC_CODEC_YUVP VLC_FOURCC('Y','U','V','P') +/* Planar YUV 4:4:4 Y:U:V:A */ +#define VLC_CODEC_YUVA VLC_FOURCC('Y','U','V','A') +/* Planar YUV 4:2:2 Y:U:V:A */ +#define VLC_CODEC_YUV422A VLC_FOURCC('I','4','2','A') +/* Planar YUV 4:2:0 Y:U:V:A */ +#define VLC_CODEC_YUV420A VLC_FOURCC('I','4','0','A') + +/* Palettized RGB with palette element R:G:B */ +#define VLC_CODEC_RGBP VLC_FOURCC('R','G','B','P') +/* 8 bits RGB */ +#define VLC_CODEC_RGB8 VLC_FOURCC('R','G','B','8') +/* 12 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB12 VLC_FOURCC('R','V','1','2') +/* 15 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB15 VLC_FOURCC('R','V','1','5') +/* 16 bits RGB */ +#define VLC_CODEC_RGB16 VLC_FOURCC('R','V','1','6') +/* 24 bits RGB */ +#define VLC_CODEC_RGB24 VLC_FOURCC('R','V','2','4') +/* 24 bits RGB padded to 32 bits */ +#define VLC_CODEC_RGB32 VLC_FOURCC('R','V','3','2') +/* 32 bits RGBA */ +#define VLC_CODEC_RGBA VLC_FOURCC('R','G','B','A') +/* 32 bits ARGB */ +#define VLC_CODEC_ARGB VLC_FOURCC('A','R','G','B') +/* 32 bits BGRA */ +#define VLC_CODEC_BGRA VLC_FOURCC('B','G','R','A') + +/* Planar GBR 4:4:4 8 bits */ +#define VLC_CODEC_GBR_PLANAR VLC_FOURCC('G','B','R','8') +#define VLC_CODEC_GBR_PLANAR_9B VLC_FOURCC('G','B','9','B') +#define VLC_CODEC_GBR_PLANAR_9L VLC_FOURCC('G','B','9','L') +#define VLC_CODEC_GBR_PLANAR_10B VLC_FOURCC('G','B','A','B') +#define VLC_CODEC_GBR_PLANAR_10L VLC_FOURCC('G','B','A','L') +#define VLC_CODEC_GBR_PLANAR_16L VLC_FOURCC('G','B','F','L') +#define VLC_CODEC_GBR_PLANAR_16B VLC_FOURCC('G','B','F','B') + +/* 8 bits grey */ +#define VLC_CODEC_GREY VLC_FOURCC('G','R','E','Y') +/* Packed YUV 4:2:2, U:Y:V:Y */ +#define VLC_CODEC_UYVY VLC_FOURCC('U','Y','V','Y') +/* Packed YUV 4:2:2, V:Y:U:Y */ +#define VLC_CODEC_VYUY VLC_FOURCC('V','Y','U','Y') +/* Packed YUV 4:2:2, Y:U:Y:V */ +#define VLC_CODEC_YUYV VLC_FOURCC('Y','U','Y','2') +/* Packed YUV 4:2:2, Y:V:Y:U */ +#define VLC_CODEC_YVYU VLC_FOURCC('Y','V','Y','U') +/* Packed YUV 2:1:1, Y:U:Y:V */ +#define VLC_CODEC_Y211 VLC_FOURCC('Y','2','1','1') +/* Packed YUV 4:2:2, U:Y:V:Y, reverted */ +#define VLC_CODEC_CYUV VLC_FOURCC('c','y','u','v') +/* 10-bit 4:2:2 Component YCbCr */ +#define VLC_CODEC_V210 VLC_FOURCC('v','2','1','0') +/* 2 planes Y/UV 4:2:0 */ +#define VLC_CODEC_NV12 VLC_FOURCC('N','V','1','2') +/* 2 planes Y/VU 4:2:0 */ +#define VLC_CODEC_NV21 VLC_FOURCC('N','V','2','1') +/* 2 planes Y/UV 4:2:2 */ +#define VLC_CODEC_NV16 VLC_FOURCC('N','V','1','6') +/* 2 planes Y/VU 4:2:2 */ +#define VLC_CODEC_NV61 VLC_FOURCC('N','V','6','1') +/* 2 planes Y/UV 4:4:4 */ +#define VLC_CODEC_NV24 VLC_FOURCC('N','V','2','4') +/* 2 planes Y/VU 4:4:4 */ +#define VLC_CODEC_NV42 VLC_FOURCC('N','V','4','2') + +/* VDPAU video surface YCbCr 4:2:0 */ +#define VLC_CODEC_VDPAU_VIDEO_420 VLC_FOURCC('V','D','V','0') +/* VDPAU video surface YCbCr 4:2:2 */ +#define VLC_CODEC_VDPAU_VIDEO_422 VLC_FOURCC('V','D','V','2') +/* VDPAU video surface YCbCr 4:4:4 */ +#define VLC_CODEC_VDPAU_VIDEO_444 VLC_FOURCC('V','D','V','4') +/* VDPAU output surface RGBA */ +#define VLC_CODEC_VDPAU_OUTPUT VLC_FOURCC('V','D','O','R') + +/* MediaCodec/IOMX opaque buffer type */ +#define VLC_CODEC_ANDROID_OPAQUE VLC_FOURCC('A','N','O','P') + +/* Broadcom MMAL opaque buffer type */ +#define VLC_CODEC_MMAL_OPAQUE VLC_FOURCC('M','M','A','L') + +/* Image codec (video) */ +#define VLC_CODEC_PNG VLC_FOURCC('p','n','g',' ') +#define VLC_CODEC_PPM VLC_FOURCC('p','p','m',' ') +#define VLC_CODEC_PGM VLC_FOURCC('p','g','m',' ') +#define VLC_CODEC_PGMYUV VLC_FOURCC('p','g','m','y') +#define VLC_CODEC_PAM VLC_FOURCC('p','a','m',' ') +#define VLC_CODEC_JPEG VLC_FOURCC('j','p','e','g') +#define VLC_CODEC_JPEGLS VLC_FOURCC('M','J','L','S') +#define VLC_CODEC_BMP VLC_FOURCC('b','m','p',' ') +#define VLC_CODEC_TIFF VLC_FOURCC('t','i','f','f') +#define VLC_CODEC_GIF VLC_FOURCC('g','i','f',' ') +#define VLC_CODEC_TARGA VLC_FOURCC('t','g','a',' ') +#define VLC_CODEC_SVG VLC_FOURCC('s','v','g',' ') +#define VLC_CODEC_SGI VLC_FOURCC('s','g','i',' ') +#define VLC_CODEC_PNM VLC_FOURCC('p','n','m',' ') +#define VLC_CODEC_PCX VLC_FOURCC('p','c','x',' ') +#define VLC_CODEC_XWD VLC_FOURCC('X','W','D',' ') +#define VLC_CODEC_TXD VLC_FOURCC('T','X','D',' ') + + +/* Audio codec */ +#define VLC_CODEC_MPGA VLC_FOURCC('m','p','g','a') +#define VLC_CODEC_MP4A VLC_FOURCC('m','p','4','a') +#define VLC_CODEC_ALS VLC_FOURCC('a','l','s',' ') +#define VLC_CODEC_A52 VLC_FOURCC('a','5','2',' ') +#define VLC_CODEC_EAC3 VLC_FOURCC('e','a','c','3') +#define VLC_CODEC_DTS VLC_FOURCC('d','t','s',' ') +#define VLC_CODEC_WMA1 VLC_FOURCC('W','M','A','1') +#define VLC_CODEC_WMA2 VLC_FOURCC('W','M','A','2') +#define VLC_CODEC_WMAP VLC_FOURCC('W','M','A','P') +#define VLC_CODEC_WMAL VLC_FOURCC('W','M','A','L') +#define VLC_CODEC_WMAS VLC_FOURCC('W','M','A','S') +#define VLC_CODEC_FLAC VLC_FOURCC('f','l','a','c') +#define VLC_CODEC_MLP VLC_FOURCC('m','l','p',' ') +#define VLC_CODEC_TRUEHD VLC_FOURCC('t','r','h','d') +#define VLC_CODEC_DVAUDIO VLC_FOURCC('d','v','a','u') +#define VLC_CODEC_SPEEX VLC_FOURCC('s','p','x',' ') +#define VLC_CODEC_OPUS VLC_FOURCC('O','p','u','s') +#define VLC_CODEC_VORBIS VLC_FOURCC('v','o','r','b') +#define VLC_CODEC_MACE3 VLC_FOURCC('M','A','C','3') +#define VLC_CODEC_MACE6 VLC_FOURCC('M','A','C','6') +#define VLC_CODEC_MUSEPACK7 VLC_FOURCC('M','P','C',' ') +#define VLC_CODEC_MUSEPACK8 VLC_FOURCC('M','P','C','K') +#define VLC_CODEC_RA_144 VLC_FOURCC('1','4','_','4') +#define VLC_CODEC_RA_288 VLC_FOURCC('2','8','_','8') +#define VLC_CODEC_INTERPLAY_DPCM VLC_FOURCC('i','d','p','c') +#define VLC_CODEC_ROQ_DPCM VLC_FOURCC('R','o','Q','a') +#define VLC_CODEC_DSICINAUDIO VLC_FOURCC('D','C','I','A') +#define VLC_CODEC_ADPCM_4XM VLC_FOURCC('4','x','m','a') +#define VLC_CODEC_ADPCM_EA VLC_FOURCC('A','D','E','A') +#define VLC_CODEC_ADPCM_XA VLC_FOURCC('x','a',' ',' ') +#define VLC_CODEC_ADPCM_ADX VLC_FOURCC('a','d','x',' ') +#define VLC_CODEC_ADPCM_IMA_WS VLC_FOURCC('A','I','W','S') +#define VLC_CODEC_ADPCM_G722 VLC_FOURCC('g','7','2','2') +#define VLC_CODEC_ADPCM_G726 VLC_FOURCC('g','7','2','6') +#define VLC_CODEC_ADPCM_SWF VLC_FOURCC('S','W','F','a') +#define VLC_CODEC_ADPCM_MS VLC_FOURCC('m','s',0x00,0x02) +#define VLC_CODEC_ADPCM_IMA_WAV VLC_FOURCC('m','s',0x00,0x11) +#define VLC_CODEC_ADPCM_IMA_AMV VLC_FOURCC('i','m','a','v') +#define VLC_CODEC_ADPCM_IMA_QT VLC_FOURCC('i','m','a','4') +#define VLC_CODEC_ADPCM_YAMAHA VLC_FOURCC('m','s',0x00,0x20) +#define VLC_CODEC_ADPCM_DK3 VLC_FOURCC('m','s',0x00,0x62) +#define VLC_CODEC_ADPCM_DK4 VLC_FOURCC('m','s',0x00,0x61) +#define VLC_CODEC_ADPCM_THP VLC_FOURCC('T','H','P','A') +#define VLC_CODEC_G723_1 VLC_FOURCC('g','7','2', 0x31) +#define VLC_CODEC_G729 VLC_FOURCC('g','7','2','9') +#define VLC_CODEC_VMDAUDIO VLC_FOURCC('v','m','d','a') +#define VLC_CODEC_AMR_NB VLC_FOURCC('s','a','m','r') +#define VLC_CODEC_AMR_WB VLC_FOURCC('s','a','w','b') +#define VLC_CODEC_ALAC VLC_FOURCC('a','l','a','c') +#define VLC_CODEC_QDM2 VLC_FOURCC('Q','D','M','2') +#define VLC_CODEC_COOK VLC_FOURCC('c','o','o','k') +#define VLC_CODEC_SIPR VLC_FOURCC('s','i','p','r') +#define VLC_CODEC_TTA VLC_FOURCC('T','T','A','1') +#define VLC_CODEC_SHORTEN VLC_FOURCC('s','h','n',' ') +#define VLC_CODEC_WAVPACK VLC_FOURCC('W','V','P','K') +#define VLC_CODEC_GSM VLC_FOURCC('g','s','m',' ') +#define VLC_CODEC_GSM_MS VLC_FOURCC('a','g','s','m') +#define VLC_CODEC_ATRAC1 VLC_FOURCC('a','t','r','1') +#define VLC_CODEC_ATRAC3 VLC_FOURCC('a','t','r','c') +#define VLC_CODEC_ATRAC3P VLC_FOURCC('a','t','r','p') +#define VLC_CODEC_IMC VLC_FOURCC(0x1,0x4,0x0,0x0) +#define VLC_CODEC_TRUESPEECH VLC_FOURCC(0x22,0x0,0x0,0x0) +#define VLC_CODEC_NELLYMOSER VLC_FOURCC('N','E','L','L') +#define VLC_CODEC_APE VLC_FOURCC('A','P','E',' ') +#define VLC_CODEC_QCELP VLC_FOURCC('Q','c','l','p') +#define VLC_CODEC_302M VLC_FOURCC('3','0','2','m') +#define VLC_CODEC_DVD_LPCM VLC_FOURCC('l','p','c','m') +#define VLC_CODEC_DVDA_LPCM VLC_FOURCC('a','p','c','m') +#define VLC_CODEC_BD_LPCM VLC_FOURCC('b','p','c','m') +#define VLC_CODEC_WIDI_LPCM VLC_FOURCC('w','p','c','m') +#define VLC_CODEC_SDDS VLC_FOURCC('s','d','d','s') +#define VLC_CODEC_MIDI VLC_FOURCC('M','I','D','I') +#define VLC_CODEC_RALF VLC_FOURCC('R','A','L','F') + +#define VLC_CODEC_S8 VLC_FOURCC('s','8',' ',' ') +#define VLC_CODEC_U8 VLC_FOURCC('u','8',' ',' ') +#define VLC_CODEC_S16L VLC_FOURCC('s','1','6','l') +#define VLC_CODEC_S16B VLC_FOURCC('s','1','6','b') +#define VLC_CODEC_U16L VLC_FOURCC('u','1','6','l') +#define VLC_CODEC_U16B VLC_FOURCC('u','1','6','b') +#define VLC_CODEC_S20B VLC_FOURCC('s','2','0','b') +#define VLC_CODEC_S24L VLC_FOURCC('s','2','4','l') +#define VLC_CODEC_S24B VLC_FOURCC('s','2','4','b') +#define VLC_CODEC_U24L VLC_FOURCC('u','2','4','l') +#define VLC_CODEC_U24B VLC_FOURCC('u','2','4','b') +#define VLC_CODEC_S24L32 VLC_FOURCC('s','2','4','4') +#define VLC_CODEC_S24B32 VLC_FOURCC('S','2','4','4') +#define VLC_CODEC_S32L VLC_FOURCC('s','3','2','l') +#define VLC_CODEC_S32B VLC_FOURCC('s','3','2','b') +#define VLC_CODEC_U32L VLC_FOURCC('u','3','2','l') +#define VLC_CODEC_U32B VLC_FOURCC('u','3','2','b') +#define VLC_CODEC_F32L VLC_FOURCC('f','3','2','l') +#define VLC_CODEC_F32B VLC_FOURCC('f','3','2','b') +#define VLC_CODEC_F64L VLC_FOURCC('f','6','4','l') +#define VLC_CODEC_F64B VLC_FOURCC('f','6','4','b') + +#define VLC_CODEC_ALAW VLC_FOURCC('a','l','a','w') +#define VLC_CODEC_MULAW VLC_FOURCC('m','l','a','w') +#define VLC_CODEC_DAT12 VLC_FOURCC('L','P','1','2') +#define VLC_CODEC_S24DAUD VLC_FOURCC('d','a','u','d') +#define VLC_CODEC_TWINVQ VLC_FOURCC('T','W','I','N') +#define VLC_CODEC_BMVAUDIO VLC_FOURCC('B','M','V','A') +#define VLC_CODEC_ULEAD_DV_AUDIO_NTSC VLC_FOURCC('m','s',0x02,0x15) +#define VLC_CODEC_ULEAD_DV_AUDIO_PAL VLC_FOURCC('m','s',0x02,0x16) +#define VLC_CODEC_INDEO_AUDIO VLC_FOURCC('m','s',0x04,0x02) +#define VLC_CODEC_METASOUND VLC_FOURCC('m','s',0x00,0x75) +#define VLC_CODEC_ON2AVC VLC_FOURCC('m','s',0x05,0x00) +#define VLC_CODEC_TAK VLC_FOURCC('t','a','k',' ') +#define VLC_CODEC_SMACKAUDIO VLC_FOURCC('S','M','K','A') + +/* Subtitle */ +#define VLC_CODEC_SPU VLC_FOURCC('s','p','u',' ') +#define VLC_CODEC_DVBS VLC_FOURCC('d','v','b','s') +#define VLC_CODEC_SUBT VLC_FOURCC('s','u','b','t') +#define VLC_CODEC_XSUB VLC_FOURCC('X','S','U','B') +#define VLC_CODEC_SSA VLC_FOURCC('s','s','a',' ') +#define VLC_CODEC_TEXT VLC_FOURCC('T','E','X','T') +#define VLC_CODEC_TELETEXT VLC_FOURCC('t','e','l','x') +#define VLC_CODEC_KATE VLC_FOURCC('k','a','t','e') +#define VLC_CODEC_CMML VLC_FOURCC('c','m','m','l') +#define VLC_CODEC_ITU_T140 VLC_FOURCC('t','1','4','0') +#define VLC_CODEC_USF VLC_FOURCC('u','s','f',' ') +#define VLC_CODEC_OGT VLC_FOURCC('o','g','t',' ') +#define VLC_CODEC_CVD VLC_FOURCC('c','v','d',' ') +#define VLC_CODEC_TX3G VLC_FOURCC('t','x','3','g') +/* Blu-ray Presentation Graphics */ +#define VLC_CODEC_BD_PG VLC_FOURCC('b','d','p','g') +/* EBU STL (TECH. 3264-E) */ +#define VLC_CODEC_EBU_STL VLC_FOURCC('S','T','L',' ') +#define VLC_CODEC_SCTE_27 VLC_FOURCC('S','C','2','7') + +/* XYZ colorspace 12 bits packed in 16 bits, organisation |XXX0|YYY0|ZZZ0| */ +#define VLC_CODEC_XYZ12 VLC_FOURCC('X','Y','1','2') + + +/* Special endian dependant values + * The suffic N means Native + * The suffix I means Inverted (ie non native) */ +#ifdef WORDS_BIGENDIAN +# define VLC_CODEC_S16N VLC_CODEC_S16B +# define VLC_CODEC_U16N VLC_CODEC_U16B +# define VLC_CODEC_S24N VLC_CODEC_S24B +# define VLC_CODEC_U24N VLC_CODEC_U24B +# define VLC_CODEC_S32N VLC_CODEC_S32B +# define VLC_CODEC_U32N VLC_CODEC_U32B +# define VLC_CODEC_FL32 VLC_CODEC_F32B +# define VLC_CODEC_FL64 VLC_CODEC_F64B + +# define VLC_CODEC_S16I VLC_CODEC_S16L +# define VLC_CODEC_U16I VLC_CODEC_U16L +# define VLC_CODEC_S24I VLC_CODEC_S24L +# define VLC_CODEC_U24I VLC_CODEC_U24L +# define VLC_CODEC_S32I VLC_CODEC_S32L +# define VLC_CODEC_U32I VLC_CODEC_U32L + +#else +# define VLC_CODEC_S16N VLC_CODEC_S16L +# define VLC_CODEC_U16N VLC_CODEC_U16L +# define VLC_CODEC_S24N VLC_CODEC_S24L +# define VLC_CODEC_U24N VLC_CODEC_U24L +# define VLC_CODEC_S32N VLC_CODEC_S32L +# define VLC_CODEC_U32N VLC_CODEC_U32L +# define VLC_CODEC_FL32 VLC_CODEC_F32L +# define VLC_CODEC_FL64 VLC_CODEC_F64L + +# define VLC_CODEC_S16I VLC_CODEC_S16B +# define VLC_CODEC_U16I VLC_CODEC_U16B +# define VLC_CODEC_S24I VLC_CODEC_S24B +# define VLC_CODEC_U24I VLC_CODEC_U24B +# define VLC_CODEC_S32I VLC_CODEC_S32B +# define VLC_CODEC_U32I VLC_CODEC_U32B +#endif + +/* Non official codecs, used to force a profile in an encoder */ +/* MPEG-1 video */ +#define VLC_CODEC_MP1V VLC_FOURCC('m','p','1','v') +/* MPEG-2 video */ +#define VLC_CODEC_MP2V VLC_FOURCC('m','p','2','v') +/* MPEG-I/II layer 2 audio */ +#define VLC_CODEC_MP2 VLC_FOURCC('m','p','2',' ') +/* MPEG-I/II layer 3 audio */ +#define VLC_CODEC_MP3 VLC_FOURCC('m','p','3',' ') + +/** + * It returns the codec associated to a fourcc within a ES category. + * + * If not found, it will return the given fourcc. + * If found, it will always be one of the VLC_CODEC_ defined above. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns the codec associated to a fourcc store in a zero terminated + * string. + * + * If the string is NULL or does not have exactly 4 charateres, it will + * return 0, otherwise it behaves like vlc_fourcc_GetCodec. + * + * Provided for convenience. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char * ); + +/** + * It convert the gives fourcc to an audio codec when possible. + * + * The fourcc converted are aflt, araw/pcm , twos, sowt. When an incompatible i_bits + * is detected, 0 is returned. + * The other fourcc goes through vlc_fourcc_GetCodec and i_bits is not checked. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits ); + +/** + * It returns the description of the given fourcc or NULL if not found. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API const char * vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns a list (terminated with the value 0) of YUV fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetYUVFallback( vlc_fourcc_t ); + +/** + * It returns a list (terminated with the value 0) of RGB fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetRGBFallback( vlc_fourcc_t ); + +/** + * It returns true if the given fourcc is YUV and false otherwise. + */ +VLC_API bool vlc_fourcc_IsYUV( vlc_fourcc_t ); + +/** + * It returns true if the two fourccs are equivalent if their U&V planes are + * swapped. + */ +VLC_API bool vlc_fourcc_AreUVPlanesSwapped(vlc_fourcc_t , vlc_fourcc_t ); + +/** + * Chroma related information. + */ +typedef struct { + unsigned plane_count; + struct { + struct { + unsigned num; + unsigned den; + } w; + struct { + unsigned num; + unsigned den; + } h; + } p[4]; + unsigned pixel_size; /* Number of bytes per pixel for a plane */ + unsigned pixel_bits; /* Number of bits actually used bits per pixel for a plane */ +} vlc_chroma_description_t; + +/** + * It returns a vlc_chroma_description_t describing the request fourcc or NULL + * if not found. + */ +VLC_API const vlc_chroma_description_t * vlc_fourcc_GetChromaDescription( vlc_fourcc_t fourcc ); + +#endif /* _VLC_FOURCC_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_fs.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_fs.h new file mode 100644 index 0000000..533aa9b --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_fs.h @@ -0,0 +1,107 @@ +/***************************************************************************** + * vlc_fs.h: File system helpers + ***************************************************************************** + * Copyright © 2006-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FS_H +#define VLC_FS_H 1 + +/** + * \file + * Those functions convert file paths from UTF-8 to the system-specific + * encoding (especially UTF-16 on Windows). Also, they always mark file + * descriptor with the close-on-exec flag. + */ + +#include +#include + +VLC_API int vlc_open( const char *filename, int flags, ... ) VLC_USED; +VLC_API FILE * vlc_fopen( const char *filename, const char *mode ) VLC_USED; +VLC_API int vlc_openat( int fd, const char *filename, int flags, ... ) VLC_USED; + +VLC_API DIR * vlc_opendir( const char *dirname ) VLC_USED; +VLC_API char * vlc_readdir( DIR *dir ) VLC_USED; +VLC_API int vlc_loaddir( DIR *dir, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); +VLC_API int vlc_scandir( const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); +VLC_API int vlc_mkdir( const char *filename, mode_t mode ); + +VLC_API int vlc_unlink( const char *filename ); +VLC_API int vlc_rename( const char *oldpath, const char *newpath ); +VLC_API char *vlc_getcwd( void ) VLC_USED; + +#if defined( _WIN32 ) +typedef struct vlc_DIR +{ + _WDIR *wdir; /* MUST be first, see */ + char *entry; + union + { + DWORD drives; + bool insert_dot_dot; + } u; +} vlc_DIR; + +static inline int vlc_closedir( DIR *dir ) +{ + vlc_DIR *vdir = (vlc_DIR *)dir; + _WDIR *wdir = vdir->wdir; + + free( vdir->entry ); + free( vdir ); + return (wdir != NULL) ? _wclosedir( wdir ) : 0; +} +# undef closedir +# define closedir vlc_closedir + +static inline void vlc_rewinddir( DIR *dir ) +{ + _WDIR *wdir = *(_WDIR **)dir; + + _wrewinddir( wdir ); +} +# undef rewinddir +# define rewinddir vlc_rewinddir + +# include +# ifndef stat +# define stat _stati64 +# endif +# ifndef fstat +# define fstat _fstati64 +# endif +# ifndef _MSC_VER +# undef lseek +# define lseek _lseeki64 +# endif +#endif + +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + +struct stat; + +VLC_API int vlc_stat( const char *filename, struct stat *buf ); +VLC_API int vlc_lstat( const char *filename, struct stat *buf ); + +VLC_API int vlc_mkstemp( char * ); + +VLC_API int vlc_dup( int ); +VLC_API int vlc_pipe( int[2] ); +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_gcrypt.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_gcrypt.h new file mode 100644 index 0000000..89bdab8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_gcrypt.h @@ -0,0 +1,103 @@ +/***************************************************************************** + * vlc_gcrypt.h: VLC thread support for gcrypt + ***************************************************************************** + * Copyright (C) 2004-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file implements gcrypt support functions in vlc + */ + +#include + +#ifdef LIBVLC_USE_PTHREAD +/** + * If possible, use gcrypt-provided thread implementation. This is so that + * other non-VLC components (inside the process) can also use gcrypt safely. + */ +GCRY_THREAD_OPTION_PTHREAD_IMPL; +# define gcry_threads_vlc gcry_threads_pthread +#else + +/** + * gcrypt thread option VLC implementation + */ + +static int gcry_vlc_mutex_init( void **p_sys ) +{ + vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) ); + if( p_lock == NULL) + return ENOMEM; + + vlc_mutex_init( p_lock ); + *p_sys = p_lock; + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_destroy( void **p_sys ) +{ + vlc_mutex_t *p_lock = (vlc_mutex_t *)*p_sys; + vlc_mutex_destroy( p_lock ); + free( p_lock ); + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_lock( void **p_sys ) +{ + vlc_mutex_lock( (vlc_mutex_t *)*p_sys ); + return VLC_SUCCESS; +} + +static int gcry_vlc_mutex_unlock( void **lock ) +{ + vlc_mutex_unlock( (vlc_mutex_t *)*lock ); + return VLC_SUCCESS; +} + +static const struct gcry_thread_cbs gcry_threads_vlc = +{ + GCRY_THREAD_OPTION_USER, + NULL, + gcry_vlc_mutex_init, + gcry_vlc_mutex_destroy, + gcry_vlc_mutex_lock, + gcry_vlc_mutex_unlock, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; +#endif + +/** + * Initializes gcrypt with proper locking. + */ +static inline void vlc_gcrypt_init (void) +{ + /* This would need a process-wide static mutex with all libraries linking + * to a given instance of libgcrypt. We cannot do this as we have different + * plugins linking with gcrypt, and some underlying libraries may use it + * behind our back. Only way is to always link gcrypt statically (ouch!) or + * have upstream gcrypt provide one shared object per threading system. */ + static bool done = false; + + vlc_global_lock (VLC_GCRYPT_MUTEX); + if (!done) + { + gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc); + done = true; + } + vlc_global_unlock (VLC_GCRYPT_MUTEX); +} diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_http.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_http.h new file mode 100644 index 0000000..9b0510a --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_http.h @@ -0,0 +1,67 @@ +/***************************************************************************** + * vlc_http.h: Shared code for HTTP clients + ***************************************************************************** + * Copyright (C) 2001-2008 VLC authors and VideoLAN + * $Id: ddde13efed1e11a15632f17e1da4437f59750988 $ + * + * Authors: Laurent Aimar + * Christophe Massiot + * Rémi Denis-Courmont + * Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTP_H +#define VLC_HTTP_H 1 + +/** + * \file + * This file defines functions, structures, enums and macros shared between + * HTTP clients. + */ + +/* RFC 2617: Basic and Digest Access Authentication */ +typedef struct http_auth_t +{ + char *psz_realm; + char *psz_domain; + char *psz_nonce; + char *psz_opaque; + char *psz_stale; + char *psz_algorithm; + char *psz_qop; + int i_nonce; + char *psz_cnonce; + char *psz_HA1; /* stored H(A1) value if algorithm = "MD5-sess" */ +} http_auth_t; + + +VLC_API void http_auth_Init( http_auth_t * ); +VLC_API void http_auth_Reset( http_auth_t * ); +VLC_API void http_auth_ParseWwwAuthenticateHeader + ( vlc_object_t *, http_auth_t * , + const char * ); +VLC_API int http_auth_ParseAuthenticationInfoHeader + ( vlc_object_t *, http_auth_t *, + const char *, const char *, + const char *, const char *, + const char * ); +VLC_API char *http_auth_FormatAuthorizationHeader + ( vlc_object_t *, http_auth_t *, + const char *, const char *, + const char *, const char * ) VLC_USED; + +#endif /* VLC_HTTP_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_httpd.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_httpd.h new file mode 100644 index 0000000..ade72f9 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_httpd.h @@ -0,0 +1,153 @@ +/***************************************************************************** + * vlc_httpd.h: builtin HTTP/RTSP server. + ***************************************************************************** + * Copyright (C) 2004-2006 VLC authors and VideoLAN + * $Id: 852a7a8c15f9c419cf00e2565d71986500258da7 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTPD_H +#define VLC_HTTPD_H 1 + +/** + * \file + * HTTP/RTSP server API. + */ + +enum +{ + HTTPD_MSG_NONE, + + /* answer */ + HTTPD_MSG_ANSWER, + + /* http request */ + HTTPD_MSG_GET, + HTTPD_MSG_HEAD, + HTTPD_MSG_POST, + + /* rtsp request */ + HTTPD_MSG_OPTIONS, + HTTPD_MSG_DESCRIBE, + HTTPD_MSG_SETUP, + HTTPD_MSG_PLAY, + HTTPD_MSG_PAUSE, + HTTPD_MSG_GETPARAMETER, + HTTPD_MSG_TEARDOWN, + + /* just to track the count of MSG */ + HTTPD_MSG_MAX +}; + +enum +{ + HTTPD_PROTO_NONE, + HTTPD_PROTO_HTTP, /* HTTP/1.x */ + HTTPD_PROTO_RTSP, /* RTSP/1.x */ + HTTPD_PROTO_HTTP0, /* HTTP/0.x */ +}; + +typedef struct httpd_host_t httpd_host_t; +typedef struct httpd_client_t httpd_client_t; +/* create a new host */ +VLC_API httpd_host_t *vlc_http_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_https_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_rtsp_HostNew( vlc_object_t * ) VLC_USED; +/* delete a host */ +VLC_API void httpd_HostDelete( httpd_host_t * ); + +typedef struct +{ + char * name; + char * value; +} httpd_header; + +typedef struct httpd_message_t +{ + httpd_client_t *cl; /* NULL if not throught a connection e vlc internal */ + + uint8_t i_type; + uint8_t i_proto; + uint8_t i_version; + + /* for an answer */ + int i_status; + + /* for a query */ + char *psz_url; + /* FIXME find a clean way to handle GET(psz_args) + and POST(body) through the same code */ + uint8_t *psz_args; + + /* options */ + size_t i_headers; + httpd_header *p_headers; + + /* body */ + int64_t i_body_offset; + int i_body; + uint8_t *p_body; + +} httpd_message_t; + +typedef struct httpd_url_t httpd_url_t; +typedef struct httpd_callback_sys_t httpd_callback_sys_t; +typedef int (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query ); +/* register a new url */ +VLC_API httpd_url_t * httpd_UrlNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password ) VLC_USED; +/* register callback on a url */ +VLC_API int httpd_UrlCatch( httpd_url_t *, int i_msg, httpd_callback_t, httpd_callback_sys_t * ); +/* delete a url */ +VLC_API void httpd_UrlDelete( httpd_url_t * ); + +VLC_API char* httpd_ClientIP( const httpd_client_t *cl, char *, int * ); +VLC_API char* httpd_ServerIP( const httpd_client_t *cl, char *, int * ); + +/* High level */ + +typedef struct httpd_file_t httpd_file_t; +typedef struct httpd_file_sys_t httpd_file_sys_t; +typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_file_t * httpd_FileNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password, httpd_file_callback_t pf_fill, httpd_file_sys_t * ) VLC_USED; +VLC_API httpd_file_sys_t * httpd_FileDelete( httpd_file_t * ); + + +typedef struct httpd_handler_t httpd_handler_t; +typedef struct httpd_handler_sys_t httpd_handler_sys_t; +typedef int (*httpd_handler_callback_t)( httpd_handler_sys_t *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_handler_t * httpd_HandlerNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password, httpd_handler_callback_t pf_fill, httpd_handler_sys_t * ) VLC_USED; +VLC_API httpd_handler_sys_t * httpd_HandlerDelete( httpd_handler_t * ); + +typedef struct httpd_redirect_t httpd_redirect_t; +VLC_API httpd_redirect_t * httpd_RedirectNew( httpd_host_t *, const char *psz_url_dst, const char *psz_url_src ) VLC_USED; +VLC_API void httpd_RedirectDelete( httpd_redirect_t * ); + + +typedef struct httpd_stream_t httpd_stream_t; +VLC_API httpd_stream_t * httpd_StreamNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password ) VLC_USED; +VLC_API void httpd_StreamDelete( httpd_stream_t * ); +VLC_API int httpd_StreamHeader( httpd_stream_t *, uint8_t *p_data, int i_data ); +VLC_API int httpd_StreamSend( httpd_stream_t *, const block_t *p_block ); +VLC_API int httpd_StreamSetHTTPHeaders(httpd_stream_t *, httpd_header *, size_t); + +/* Msg functions facilities */ +VLC_API void httpd_MsgAdd( httpd_message_t *, const char *psz_name, const char *psz_value, ... ) VLC_FORMAT( 3, 4 ); +/* return "" if not found. The string is not allocated */ +VLC_API const char * httpd_MsgGet( const httpd_message_t *, const char *psz_name ); + +#endif /* _VLC_HTTPD_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_image.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_image.h new file mode 100644 index 0000000..52419af --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_image.h @@ -0,0 +1,81 @@ +/***************************************************************************** + * vlc_image.h : wrapper for image reading/writing facilities + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: 52bce1f24495ffdbadfb6d0aef0953577992b9a2 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_IMAGE_H +#define VLC_IMAGE_H 1 + +/** + * \file + * This file defines functions and structures for image conversions in vlc + */ + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +struct image_handler_t +{ + picture_t * (*pf_read) ( image_handler_t *, block_t *, + video_format_t *, video_format_t * ); + picture_t * (*pf_read_url) ( image_handler_t *, const char *, + video_format_t *, video_format_t * ); + block_t * (*pf_write) ( image_handler_t *, picture_t *, + video_format_t *, video_format_t * ); + int (*pf_write_url) ( image_handler_t *, picture_t *, + video_format_t *, video_format_t *, + const char * ); + + picture_t * (*pf_convert) ( image_handler_t *, picture_t *, + video_format_t *, video_format_t * ); + picture_t * (*pf_filter) ( image_handler_t *, picture_t *, + video_format_t *, const char * ); + + /* Private properties */ + vlc_object_t *p_parent; + decoder_t *p_dec; + encoder_t *p_enc; + filter_t *p_filter; +}; + +VLC_API image_handler_t * image_HandlerCreate( vlc_object_t * ) VLC_USED; +#define image_HandlerCreate( a ) image_HandlerCreate( VLC_OBJECT(a) ) +VLC_API void image_HandlerDelete( image_handler_t * ); + +#define image_Read( a, b, c, d ) a->pf_read( a, b, c, d ) +#define image_ReadUrl( a, b, c, d ) a->pf_read_url( a, b, c, d ) +#define image_Write( a, b, c, d ) a->pf_write( a, b, c, d ) +#define image_WriteUrl( a, b, c, d, e ) a->pf_write_url( a, b, c, d, e ) +#define image_Convert( a, b, c, d ) a->pf_convert( a, b, c, d ) +#define image_Filter( a, b, c, d ) a->pf_filter( a, b, c, d ) + +VLC_API vlc_fourcc_t image_Type2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Ext2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Mime2Fourcc( const char *psz_mime ); + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_IMAGE_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_inhibit.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_inhibit.h new file mode 100644 index 0000000..b1f7330 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_inhibit.h @@ -0,0 +1,54 @@ +/***************************************************************************** + * vlc_inhibit.h: VLC screen saver inhibition + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines the interface for screen-saver inhibition modules + */ + +#ifndef VLC_INHIBIT_H +# define VLC_INHIBIT_H 1 + +typedef struct vlc_inhibit vlc_inhibit_t; +typedef struct vlc_inhibit_sys vlc_inhibit_sys_t; + +enum vlc_inhibit_flags +{ + VLC_INHIBIT_NONE=0 /*< No inhibition */, + VLC_INHIBIT_SUSPEND=0x1 /*< Processor is in use - do not suspend */, + VLC_INHIBIT_DISPLAY=0x2 /*< Display is in use - do not blank/lock */, +#define VLC_INHIBIT_AUDIO (VLC_INHIBIT_SUSPEND) +#define VLC_INHIBIT_VIDEO (VLC_INHIBIT_SUSPEND|VLC_INHIBIT_DISPLAY) +}; + +struct vlc_inhibit +{ + VLC_COMMON_MEMBERS + + vlc_inhibit_sys_t *p_sys; + void (*inhibit) (vlc_inhibit_t *, unsigned flags); +}; + +static inline void vlc_inhibit_Set (vlc_inhibit_t *ih, unsigned flags) +{ + ih->inhibit (ih, flags); +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_input.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_input.h new file mode 100644 index 0000000..f53bcaa --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_input.h @@ -0,0 +1,676 @@ +/***************************************************************************** + * vlc_input.h: Core input structures + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: 13a944a2ac92728542d3f33755daf7857113d5d9 $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/* __ is need because conflict with */ +#ifndef VLC_INPUT_H +#define VLC_INPUT_H 1 + +/** + * \file + * This file defines functions, structures and enums for input objects in vlc + */ + +#include +#include +#include +#include +#include +#include + +#include + +/***************************************************************************** + * Seek point: (generalisation of chapters) + *****************************************************************************/ +struct seekpoint_t +{ + int64_t i_byte_offset; + int64_t i_time_offset; + char *psz_name; +}; + +static inline seekpoint_t *vlc_seekpoint_New( void ) +{ + seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) ); + if( !point ) + return NULL; + point->i_byte_offset = + point->i_time_offset = -1; + point->psz_name = NULL; + return point; +} + +static inline void vlc_seekpoint_Delete( seekpoint_t *point ) +{ + if( !point ) return; + free( point->psz_name ); + free( point ); +} + +static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src ) +{ + seekpoint_t *point = vlc_seekpoint_New(); + if( src->psz_name ) point->psz_name = strdup( src->psz_name ); + point->i_time_offset = src->i_time_offset; + point->i_byte_offset = src->i_byte_offset; + return point; +} + +/***************************************************************************** + * Title: + *****************************************************************************/ +typedef struct input_title_t +{ + char *psz_name; + + bool b_menu; /* Is it a menu or a normal entry */ + + int64_t i_length; /* Length(microsecond) if known, else 0 */ + int64_t i_size; /* Size (bytes) if known, else 0 */ + + /* Title seekpoint */ + int i_seekpoint; + seekpoint_t **seekpoint; + +} input_title_t; + +static inline input_title_t *vlc_input_title_New(void) +{ + input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) ); + if( !t ) + return NULL; + + t->psz_name = NULL; + t->b_menu = false; + t->i_length = 0; + t->i_size = 0; + t->i_seekpoint = 0; + t->seekpoint = NULL; + + return t; +} + +static inline void vlc_input_title_Delete( input_title_t *t ) +{ + int i; + if( t == NULL ) + return; + + free( t->psz_name ); + for( i = 0; i < t->i_seekpoint; i++ ) + { + free( t->seekpoint[i]->psz_name ); + free( t->seekpoint[i] ); + } + free( t->seekpoint ); + free( t ); +} + +static inline input_title_t *vlc_input_title_Duplicate( const input_title_t *t ) +{ + input_title_t *dup = vlc_input_title_New( ); + int i; + + if( t->psz_name ) dup->psz_name = strdup( t->psz_name ); + dup->b_menu = t->b_menu; + dup->i_length = t->i_length; + dup->i_size = t->i_size; + dup->i_seekpoint = t->i_seekpoint; + if( t->i_seekpoint > 0 ) + { + dup->seekpoint = (seekpoint_t**)calloc( t->i_seekpoint, + sizeof(seekpoint_t*) ); + + for( i = 0; i < t->i_seekpoint; i++ ) + { + dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] ); + } + } + + return dup; +} + +/***************************************************************************** + * Attachments + *****************************************************************************/ +struct input_attachment_t +{ + char *psz_name; + char *psz_mime; + char *psz_description; + + int i_data; + void *p_data; +}; + +static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name, + const char *psz_mime, + const char *psz_description, + const void *p_data, + int i_data ) +{ + input_attachment_t *a = + (input_attachment_t*)malloc( sizeof(input_attachment_t) ); + if( !a ) + return NULL; + a->psz_name = strdup( psz_name ? psz_name : "" ); + a->psz_mime = strdup( psz_mime ? psz_mime : "" ); + a->psz_description = strdup( psz_description ? psz_description : "" ); + a->i_data = i_data; + a->p_data = NULL; + if( i_data > 0 ) + { + a->p_data = malloc( i_data ); + if( a->p_data && p_data ) + memcpy( a->p_data, p_data, i_data ); + } + return a; +} +static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a ) +{ + return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description, + a->p_data, a->i_data ); +} +static inline void vlc_input_attachment_Delete( input_attachment_t *a ) +{ + if( !a ) + return; + free( a->psz_name ); + free( a->psz_mime ); + free( a->psz_description ); + free( a->p_data ); + free( a ); +} + +/***************************************************************************** + * input defines/constants. + *****************************************************************************/ + +/** + * This defines private core storage for an input. + */ +typedef struct input_thread_private_t input_thread_private_t; + +/** + * This defines an opaque input resource handler. + */ +typedef struct input_resource_t input_resource_t; + +/** + * Main structure representing an input thread. This structure is mostly + * private. The only public fields are READ-ONLY. You must use the helpers + * to modify them + */ +struct input_thread_t +{ + VLC_COMMON_MEMBERS + + bool b_error; + bool b_eof; + bool b_preparsing; + bool b_dead; + + /* All other data is input_thread is PRIVATE. You can't access it + * outside of src/input */ + input_thread_private_t *p; +}; + +/** + * Record prefix string. + * TODO make it configurable. + */ +#define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%Hh%Mm%Ss-$ N-$ p" + +/***************************************************************************** + * Input events and variables + *****************************************************************************/ + +/** + * \defgroup inputvariable Input variables + * + * The input provides multiples variable you can write to and/or read from. + * + * TODO complete the documentation. + * The read only variables are: + * - "length" + * - "can-seek" (if you can seek, it doesn't say if 'bar display' has be shown + * or not, for that check position != 0.0) + * - "can-pause" + * - "can-rate" + * - "can-rewind" + * - "can-record" (if a stream can be recorded while playing) + * - "teletext-es" (list of id from the spu tracks (spu-es) that are teletext, the + * variable value being the one currently selected, -1 if no teletext) + * - "signal-quality" + * - "signal-strength" + * - "program-scrambled" (if the current program is scrambled) + * - "cache" (level of data cached [0 .. 1]) + * + * The read-write variables are: + * - state (\see input_state_e) + * - rate + * - position, position-offset + * - time, time-offset + * - title, next-title, prev-title + * - chapter, next-chapter, next-chapter-prev + * - program, audio-es, video-es, spu-es + * - audio-delay, spu-delay + * - bookmark (bookmark list) + * - record + * - frame-next + * - navigation (list of "title %2i") + * - "title %2i" + * + * The variable used for event is + * - intf-event (\see input_event_type_e) + */ + +/** + * Input state + * + * This enum is used by the variable "state" + */ +typedef enum input_state_e +{ + INIT_S = 0, + OPENING_S, + PLAYING_S, + PAUSE_S, + END_S, + ERROR_S, +} input_state_e; + +/** + * Input rate. + * + * It is an float used by the variable "rate" in the + * range [INPUT_RATE_DEFAULT/INPUT_RATE_MAX, INPUT_RATE_DEFAULT/INPUT_RATE_MIN] + * the default value being 1. It represents the ratio of playback speed to + * nominal speed (bigger is faster). + * + * Internally, the rate is stored as a value in the range + * [INPUT_RATE_MIN, INPUT_RATE_MAX]. + * internal rate = INPUT_RATE_DEFAULT / rate variable + */ + +/** + * Default rate value + */ +#define INPUT_RATE_DEFAULT 1000 +/** + * Minimal rate value + */ +#define INPUT_RATE_MIN 32 /* Up to 32/1 */ +/** + * Maximal rate value + */ +#define INPUT_RATE_MAX 32000 /* Up to 1/32 */ + +/** + * Input events + * + * You can catch input event by adding a callback on the variable "intf-event". + * This variable is an integer that will hold a input_event_type_e value. + */ +typedef enum input_event_type_e +{ + /* "state" has changed */ + INPUT_EVENT_STATE, + /* b_dead is true */ + INPUT_EVENT_DEAD, + /* a *user* abort has been requested */ + INPUT_EVENT_ABORT, + + /* "rate" has changed */ + INPUT_EVENT_RATE, + + /* At least one of "position" or "time" */ + INPUT_EVENT_POSITION, + + /* "length" has changed */ + INPUT_EVENT_LENGTH, + + /* A title has been added or removed or selected. + * It imply that chapter has changed (not chapter event is sent) */ + INPUT_EVENT_TITLE, + /* A chapter has been added or removed or selected. */ + INPUT_EVENT_CHAPTER, + + /* A program ("program") has been added or removed or selected, + * or "program-scrambled" has changed.*/ + INPUT_EVENT_PROGRAM, + /* A ES has been added or removed or selected */ + INPUT_EVENT_ES, + /* "teletext-es" has changed */ + INPUT_EVENT_TELETEXT, + + /* "record" has changed */ + INPUT_EVENT_RECORD, + + /* input_item_t media has changed */ + INPUT_EVENT_ITEM_META, + /* input_item_t info has changed */ + INPUT_EVENT_ITEM_INFO, + /* input_item_t name has changed */ + INPUT_EVENT_ITEM_NAME, + /* input_item_t epg has changed */ + INPUT_EVENT_ITEM_EPG, + + /* Input statistics have been updated */ + INPUT_EVENT_STATISTICS, + /* At least one of "signal-quality" or "signal-strength" has changed */ + INPUT_EVENT_SIGNAL, + + /* "audio-delay" has changed */ + INPUT_EVENT_AUDIO_DELAY, + /* "spu-delay" has changed */ + INPUT_EVENT_SUBTITLE_DELAY, + + /* "bookmark" has changed */ + INPUT_EVENT_BOOKMARK, + + /* cache" has changed */ + INPUT_EVENT_CACHE, + + /* A audio_output_t object has been created/deleted by *the input* */ + INPUT_EVENT_AOUT, + /* A vout_thread_t object has been created/deleted by *the input* */ + INPUT_EVENT_VOUT, + +} input_event_type_e; + +/** + * Input queries + */ +enum input_query_e +{ + /* input variable "position" */ + INPUT_GET_POSITION, /* arg1= double * res= */ + INPUT_SET_POSITION, /* arg1= double res=can fail */ + + /* input variable "length" */ + INPUT_GET_LENGTH, /* arg1= int64_t * res=can fail */ + + /* input variable "time" */ + INPUT_GET_TIME, /* arg1= int64_t * res= */ + INPUT_SET_TIME, /* arg1= int64_t res=can fail */ + + /* input variable "rate" (nominal is INPUT_RATE_DEFAULT) */ + INPUT_GET_RATE, /* arg1= int * res= */ + INPUT_SET_RATE, /* arg1= int res=can fail */ + + /* input variable "state" */ + INPUT_GET_STATE, /* arg1= int * res= */ + INPUT_SET_STATE, /* arg1= int res=can fail */ + + /* input variable "audio-delay" and "sub-delay" */ + INPUT_GET_AUDIO_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_AUDIO_DELAY, /* arg1 = int res=can fail */ + INPUT_GET_SPU_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_SPU_DELAY, /* arg1 = int res=can fail */ + + /* Menu navigation */ + INPUT_NAV_ACTIVATE, + INPUT_NAV_UP, + INPUT_NAV_DOWN, + INPUT_NAV_LEFT, + INPUT_NAV_RIGHT, + + /* Meta datas */ + INPUT_ADD_INFO, /* arg1= char* arg2= char* arg3=... res=can fail */ + INPUT_REPLACE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_MERGE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_GET_INFO, /* arg1= char* arg2= char* arg3= char** res=can fail */ + INPUT_DEL_INFO, /* arg1= char* arg2= char* res=can fail */ + INPUT_SET_NAME, /* arg1= char* res=can fail */ + + /* Input properties */ + INPUT_GET_VIDEO_FPS, /* arg1= double * res=can fail */ + + /* bookmarks */ + INPUT_GET_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_GET_BOOKMARKS, /* arg1= seekpoint_t *** arg2= int * res=can fail */ + INPUT_CLEAR_BOOKMARKS, /* res=can fail */ + INPUT_ADD_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_CHANGE_BOOKMARK, /* arg1= seekpoint_t * arg2= int * res=can fail */ + INPUT_DEL_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_SET_BOOKMARK, /* arg1= int res=can fail */ + + /* titles */ + INPUT_GET_TITLE_INFO, /* arg1=input_title_t** arg2= int * res=can fail */ + + /* Attachments */ + INPUT_GET_ATTACHMENTS, /* arg1=input_attachment_t***, arg2=int* res=can fail */ + INPUT_GET_ATTACHMENT, /* arg1=input_attachment_t**, arg2=char* res=can fail */ + + /* On the fly input slave */ + INPUT_ADD_SLAVE, /* arg1= const char * */ + INPUT_ADD_SUBTITLE, /* arg1= const char *, arg2=bool b_check_extension */ + + /* On the fly record while playing */ + INPUT_SET_RECORD_STATE, /* arg1=bool res=can fail */ + INPUT_GET_RECORD_STATE, /* arg1=bool* res=can fail */ + + /* ES */ + INPUT_RESTART_ES, /* arg1=int (-AUDIO/VIDEO/SPU_ES for the whole category) */ + + /* Input ressources + * XXX You must call vlc_object_release as soon as possible */ + INPUT_GET_AOUT, /* arg1=audio_output_t ** res=can fail */ + INPUT_GET_VOUTS, /* arg1=vout_thread_t ***, size_t * res=can fail */ + INPUT_GET_ES_OBJECTS, /* arg1=int id, vlc_object_t **dec, vout_thread_t **, audio_output_t ** */ + + /* External clock managments */ + INPUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + INPUT_MODIFY_PCR_SYSTEM,/* arg1=int absolute, arg2=mtime_t res=can fail */ +}; + +/** @}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +VLC_API input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *, const char *psz_log, input_resource_t * ) VLC_USED; +#define input_Create(a,b,c,d) input_Create(VLC_OBJECT(a),b,c,d) + +VLC_API input_thread_t * input_CreateAndStart( vlc_object_t *p_parent, input_item_t *, const char *psz_log ) VLC_USED; +#define input_CreateAndStart(a,b,c) input_CreateAndStart(VLC_OBJECT(a),b,c) + +VLC_API int input_Start( input_thread_t * ); + +VLC_API void input_Stop( input_thread_t *, bool b_abort ); + +VLC_API int input_Read( vlc_object_t *, input_item_t * ); +#define input_Read(a,b) input_Read(VLC_OBJECT(a),b) + +VLC_API int input_vaControl( input_thread_t *, int i_query, va_list ); + +VLC_API int input_Control( input_thread_t *, int i_query, ... ); + +VLC_API void input_Close( input_thread_t * ); +void input_Join( input_thread_t * ); +void input_Release( input_thread_t * ); + +/** + * Get the input item for an input thread + * + * You have to keep a reference to the input or to the input_item_t until + * you do not need it anymore. + */ +VLC_API input_item_t* input_GetItem( input_thread_t * ) VLC_USED; + +/** + * It will return the current state of the input. + * Provided for convenience. + */ +static inline input_state_e input_GetState( input_thread_t * p_input ) +{ + input_state_e state = INIT_S; + input_Control( p_input, INPUT_GET_STATE, &state ); + return state; +} + +/** + * Return one of the video output (if any). If possible, you should use + * INPUT_GET_VOUTS directly and process _all_ video outputs instead. + * @param p_input an input thread from which to get a video output + * @return NULL on error, or a video output thread pointer (which needs to be + * released with vlc_object_release()). + */ +static inline vout_thread_t *input_GetVout( input_thread_t *p_input ) +{ + vout_thread_t **pp_vout, *p_vout; + size_t i_vout; + + if( input_Control( p_input, INPUT_GET_VOUTS, &pp_vout, &i_vout ) ) + return NULL; + + for( size_t i = 1; i < i_vout; i++ ) + vlc_object_release( (vlc_object_t *)(pp_vout[i]) ); + + p_vout = (i_vout >= 1) ? pp_vout[0] : NULL; + free( pp_vout ); + return p_vout; +} + +/** + * It will add a new subtitle source to the input. + * Provided for convenience. + */ +static inline int input_AddSubtitleOSD( input_thread_t *p_input, const char *psz_url, + bool b_check_extension, bool b_osd ) +{ + int i_result = input_Control( p_input, INPUT_ADD_SUBTITLE, psz_url, b_check_extension ); + if( i_result != VLC_SUCCESS || !b_osd ) + return i_result; + + vout_thread_t *p_vout = input_GetVout( p_input ); + if( p_vout ) + { + vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s", + vlc_gettext("Subtitle track added") ); + vlc_object_release( (vlc_object_t *)p_vout ); + } + return i_result; +} +#define input_AddSubtitle(a, b, c) input_AddSubtitleOSD(a, b, c, false) + + +/** + * Return the audio output (if any) associated with an input. + * @param p_input an input thread + * @return NULL on error, or the audio output (which needs to be + * released with vlc_object_release()). + */ +static inline audio_output_t *input_GetAout( input_thread_t *p_input ) +{ + audio_output_t *p_aout; + return input_Control( p_input, INPUT_GET_AOUT, &p_aout ) ? NULL : p_aout; +} + +/** + * Returns the objects associated to an ES. + * + * You must release all non NULL object using vlc_object_release. + * You may set pointer of pointer to NULL to avoid retreiving it. + */ +static inline int input_GetEsObjects( input_thread_t *p_input, int i_id, + vlc_object_t **pp_decoder, + vout_thread_t **pp_vout, audio_output_t **pp_aout ) +{ + return input_Control( p_input, INPUT_GET_ES_OBJECTS, i_id, + pp_decoder, pp_vout, pp_aout ); +} + +/** + * \see input_clock_GetSystemOrigin + */ +static inline int input_GetPcrSystem( input_thread_t *p_input, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return input_Control( p_input, INPUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +/** + * \see input_clock_ChangeSystemOrigin + */ +static inline int input_ModifyPcrSystem( input_thread_t *p_input, bool b_absolute, mtime_t i_system ) +{ + return input_Control( p_input, INPUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/* */ +VLC_API decoder_t * input_DecoderCreate( vlc_object_t *, es_format_t *, input_resource_t * ) VLC_USED; +VLC_API void input_DecoderDelete( decoder_t * ); +VLC_API void input_DecoderDecode( decoder_t *, block_t *, bool b_do_pace ); + +/** + * This function creates a sane filename path. + */ +VLC_API char * input_CreateFilename( input_thread_t *, const char *psz_path, const char *psz_prefix, const char *psz_extension ) VLC_USED; + +/** + * It creates an empty input resource handler. + * + * The given object MUST stay alive as long as the input_resource_t is + * not deleted. + */ +VLC_API input_resource_t * input_resource_New( vlc_object_t * ) VLC_USED; + +/** + * It releases an input resource. + */ +VLC_API void input_resource_Release( input_resource_t * ); + +/** + * Forcefully destroys the video output (e.g. when the playlist is stopped). + */ +VLC_API void input_resource_TerminateVout( input_resource_t * ); + +/** + * This function releases all resources (object). + */ +VLC_API void input_resource_Terminate( input_resource_t * ); + +/** + * \return the current audio output if any. + * Use vlc_object_release() to drop the reference. + */ +VLC_API audio_output_t *input_resource_HoldAout( input_resource_t * ); + +/** + * This function creates or recycles an audio output. + */ +VLC_API audio_output_t *input_resource_GetAout( input_resource_t * ); + +/** + * This function retains or destroys an audio output. + */ +VLC_API void input_resource_PutAout( input_resource_t *, audio_output_t * ); + +/** + * Prevents the existing audio output (if any) from being recycled. + */ +VLC_API void input_resource_ResetAout( input_resource_t * ); + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_input_item.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_input_item.h new file mode 100644 index 0000000..8dd17a8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_input_item.h @@ -0,0 +1,351 @@ +/***************************************************************************** + * vlc_input_item.h: Core input item + ***************************************************************************** + * Copyright (C) 1999-2009 VLC authors and VideoLAN + * $Id: f4eb4bb23416e1b7ed774b447c5948b3086f9cfe $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INPUT_ITEM_H +#define VLC_INPUT_ITEM_H 1 + +/** + * \file + * This file defines functions, structures and enums for input items in vlc + */ + +#include +#include +#include + +#include + +/***************************************************************************** + * input_item_t: Describes an input and is used to spawn input_thread_t objects + *****************************************************************************/ +struct info_t +{ + char *psz_name; /**< Name of this info */ + char *psz_value; /**< Value of the info */ +}; + +struct info_category_t +{ + char *psz_name; /**< Name of this category */ + int i_infos; /**< Number of infos in the category */ + struct info_t **pp_infos; /**< Pointer to an array of infos */ +}; + +struct input_item_t +{ + int i_id; /**< Identifier of the item */ + + char *psz_name; /**< text describing this item */ + char *psz_uri; /**< mrl of this item */ + + int i_options; /**< Number of input options */ + char **ppsz_options; /**< Array of input options */ + uint8_t *optflagv; /**< Some flags of input options */ + unsigned optflagc; + + mtime_t i_duration; /**< Duration in microseconds */ + + + int i_categories; /**< Number of info categories */ + info_category_t **pp_categories; /**< Pointer to the first info category */ + + int i_es; /**< Number of es format descriptions */ + es_format_t **es; /**< Es formats */ + + input_stats_t *p_stats; /**< Statistics */ + int i_nb_played; /**< Number of times played */ + + vlc_meta_t *p_meta; + + int i_epg; /**< Number of EPG entries */ + vlc_epg_t **pp_epg; /**< EPG entries */ + + vlc_event_manager_t event_manager; + + vlc_mutex_t lock; /**< Lock for the item */ + + uint8_t i_type; /**< Type (file, disc, ... see input_item_type_e) */ + bool b_fixed_name; /**< Can the interface change the name ?*/ + bool b_error_when_reading;/**< Error When Reading */ +}; + +TYPEDEF_ARRAY(input_item_t*, input_item_array_t) + +enum input_item_type_e +{ + ITEM_TYPE_UNKNOWN, + ITEM_TYPE_FILE, + ITEM_TYPE_DIRECTORY, + ITEM_TYPE_DISC, + ITEM_TYPE_CDDA, + ITEM_TYPE_CARD, + ITEM_TYPE_NET, + ITEM_TYPE_PLAYLIST, + ITEM_TYPE_NODE, + + /* This one is not a real type but the number of input_item types. */ + ITEM_TYPE_NUMBER +}; + +struct input_item_node_t +{ + input_item_t * p_item; + int i_children; + input_item_node_t **pp_children; + input_item_node_t *p_parent; +}; + +VLC_API void input_item_CopyOptions( input_item_t *p_parent, input_item_t *p_child ); +VLC_API void input_item_SetName( input_item_t *p_item, const char *psz_name ); + +/** + * Add one subitem to this item + * + * This won't hold the item, but can tell to interested third parties + * Like the playlist, that there is a new sub item. With this design + * It is not the input item's responsability to keep all the ref of + * the input item children. + * + * Sends a vlc_InputItemSubItemTreeAdded and a vlc_InputItemSubItemAdded event + */ +VLC_API void input_item_PostSubItem( input_item_t *p_parent, input_item_t *p_child ); + +/** + * Start adding multiple subitems. + * + * Create a root node to hold a tree of subitems for given item + */ +VLC_API input_item_node_t * input_item_node_Create( input_item_t *p_input ) VLC_USED; + +/** + * Add a new child node to this parent node that will point to this subitem. + */ +VLC_API input_item_node_t * input_item_node_AppendItem( input_item_node_t *p_node, input_item_t *p_item ); + +/** + * Add an already created node to children of this parent node. + */ +VLC_API void input_item_node_AppendNode( input_item_node_t *p_parent, input_item_node_t *p_child ); + +/** + * Delete a node created with input_item_node_Create() and all its children. + */ +VLC_API void input_item_node_Delete( input_item_node_t *p_node ); + +/** + * End adding multiple subitems. + * + * Sends a vlc_InputItemSubItemTreeAdded event to notify that the item pointed to + * by the given root node has created new subitems that are pointed to by all the + * children of the node. + * + * Also sends vlc_InputItemSubItemAdded event for every child under the given root node; + * + * In the end deletes the node and all its children nodes. + */ +VLC_API void input_item_node_PostAndDelete( input_item_node_t *p_node ); + + +/** + * Option flags + */ +enum input_item_option_e +{ + /* Allow VLC to trust the given option. + * By default options are untrusted */ + VLC_INPUT_OPTION_TRUSTED = 0x2, + + /* Add the option, unless the same option + * is already present. */ + VLC_INPUT_OPTION_UNIQUE = 0x100, +}; + +/** + * This function allows to add an option to an existing input_item_t. + */ +VLC_API int input_item_AddOption(input_item_t *, const char *, unsigned i_flags ); + +/* */ +VLC_API bool input_item_HasErrorWhenReading( input_item_t * ); +VLC_API void input_item_SetMeta( input_item_t *, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API bool input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz ); +VLC_API char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type ) VLC_USED; +VLC_API char * input_item_GetName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetTitleFbName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetURI( input_item_t * p_i ) VLC_USED; +VLC_API void input_item_SetURI( input_item_t * p_i, const char *psz_uri ); +VLC_API mtime_t input_item_GetDuration( input_item_t * p_i ); +VLC_API void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration ); +VLC_API bool input_item_IsPreparsed( input_item_t *p_i ); +VLC_API bool input_item_IsArtFetched( input_item_t *p_i ); + +static inline char *input_item_GetNowPlayingFb( input_item_t *p_item ) +{ + char *psz_meta = input_item_GetMeta( p_item, vlc_meta_NowPlaying ); + if( !psz_meta || strlen( psz_meta ) == 0 ) + { + free( psz_meta ); + return input_item_GetMeta( p_item, vlc_meta_ESNowPlaying ); + } + return psz_meta; +} + +#define INPUT_META( name ) \ +static inline \ +void input_item_Set ## name (input_item_t *p_input, const char *val) \ +{ \ + input_item_SetMeta (p_input, vlc_meta_ ## name, val); \ +} \ +static inline \ +char *input_item_Get ## name (input_item_t *p_input) \ +{ \ + return input_item_GetMeta (p_input, vlc_meta_ ## name); \ +} + +INPUT_META(Title) +INPUT_META(Artist) +INPUT_META(Genre) +INPUT_META(Copyright) +INPUT_META(Album) +INPUT_META(TrackNumber) +INPUT_META(Description) +INPUT_META(Rating) +INPUT_META(Date) +INPUT_META(Setting) +INPUT_META(URL) +INPUT_META(Language) +INPUT_META(NowPlaying) +INPUT_META(ESNowPlaying) +INPUT_META(Publisher) +INPUT_META(EncodedBy) +INPUT_META(ArtworkURL) +INPUT_META(TrackID) +INPUT_META(TrackTotal) +INPUT_META(Director) +INPUT_META(Season) +INPUT_META(Episode) +INPUT_META(ShowName) +INPUT_META(Actors) + +#define input_item_SetTrackNum input_item_SetTrackNumber +#define input_item_GetTrackNum input_item_GetTrackNumber +#define input_item_SetArtURL input_item_SetArtworkURL +#define input_item_GetArtURL input_item_GetArtworkURL + +VLC_API char * input_item_GetInfo( input_item_t *p_i, const char *psz_cat,const char *psz_name ) VLC_USED; +VLC_API int input_item_AddInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name, const char *psz_format, ... ) VLC_FORMAT( 4, 5 ); +VLC_API int input_item_DelInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name ); +VLC_API void input_item_ReplaceInfos( input_item_t *, info_category_t * ); +VLC_API void input_item_MergeInfos( input_item_t *, info_category_t * ); + +/** + * This function creates a new input_item_t with the provided information. + * + * XXX You may also use input_item_New or input_item_NewExt as they need + * less arguments. + */ +VLC_API input_item_t * input_item_NewWithType( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration, int i_type ) VLC_USED; + +/** + * This function creates a new input_item_t with the provided information. + * + * Provided for convenience. + */ +VLC_API input_item_t * input_item_NewExt( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration ) VLC_USED; + +/** + * This function creates a new input_item_t with the provided information. + * + * Provided for convenience. + */ +#define input_item_New( a,b ) input_item_NewExt( a, b, 0, NULL, 0, -1 ) + +/** + * This function creates a new input_item_t as a copy of another. + */ +VLC_API input_item_t * input_item_Copy(input_item_t * ) VLC_USED; + +/** Holds an input item, i.e. creates a new reference. */ +VLC_API input_item_t *input_item_Hold(input_item_t *); + +/** Releases an input item, i.e. decrements its reference counter. */ +VLC_API void input_item_Release(input_item_t *); + +/* Historical hack... */ +#define vlc_gc_incref(i) input_item_Hold(i) +#define vlc_gc_decref(i) input_item_Release(i) + +typedef enum input_item_meta_request_option_t +{ + META_REQUEST_OPTION_NONE = 0x00, + META_REQUEST_OPTION_SCOPE_LOCAL = 0x01, + META_REQUEST_OPTION_SCOPE_NETWORK = 0x02, + META_REQUEST_OPTION_SCOPE_ANY = 0x03 +} input_item_meta_request_option_t; + +VLC_API int libvlc_MetaRequest(libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t ); +VLC_API int libvlc_ArtRequest(libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t ); + +/****************** + * Input stats + ******************/ +struct input_stats_t +{ + vlc_mutex_t lock; + + /* Input */ + int64_t i_read_packets; + int64_t i_read_bytes; + float f_input_bitrate; + float f_average_input_bitrate; + + /* Demux */ + int64_t i_demux_read_packets; + int64_t i_demux_read_bytes; + float f_demux_bitrate; + float f_average_demux_bitrate; + int64_t i_demux_corrupted; + int64_t i_demux_discontinuity; + + /* Decoders */ + int64_t i_decoded_audio; + int64_t i_decoded_video; + + /* Vout */ + int64_t i_displayed_pictures; + int64_t i_lost_pictures; + + /* Sout */ + int64_t i_sent_packets; + int64_t i_sent_bytes; + float f_send_bitrate; + + /* Aout */ + int64_t i_played_abuffers; + int64_t i_lost_abuffers; +}; + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_keys.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_keys.h new file mode 100644 index 0000000..bf31710 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_keys.h @@ -0,0 +1,237 @@ +/***************************************************************************** + * vlc_keys.h: keycode defines + ***************************************************************************** + * Copyright (C) 2003-2009 VLC authors and VideoLAN + * $Id: 49edab323f602e2149b6371bdb3b3277732b9cc0 $ + * + * Authors: Sigmund Augdal Helberg + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_KEYS_H +#define VLC_KEYS_H 1 + +/** + * \file + * This file defines keys and functions + */ + +#define KEY_MODIFIER 0xFF000000 +#define KEY_MODIFIER_ALT 0x01000000 +#define KEY_MODIFIER_SHIFT 0x02000000 +#define KEY_MODIFIER_CTRL 0x04000000 +#define KEY_MODIFIER_META 0x08000000 +#define KEY_MODIFIER_COMMAND 0x10000000 + +#define KEY_UNSET 0x00000000 +#define KEY_BACKSPACE 0x08 +#define KEY_TAB 0x09 +#define KEY_ENTER 0x0D +#define KEY_ESC 0x1B +/* End of Unicode range: 0x0010FFFF */ +#define KEY_LEFT 0x00210000 +#define KEY_RIGHT 0x00220000 +#define KEY_UP 0x00230000 +#define KEY_DOWN 0x00240000 +#define KEY_F1 0x00270000 +#define KEY_F2 0x00280000 +#define KEY_F3 0x00290000 +#define KEY_F4 0x002A0000 +#define KEY_F5 0x002B0000 +#define KEY_F6 0x002C0000 +#define KEY_F7 0x002D0000 +#define KEY_F8 0x002E0000 +#define KEY_F9 0x002F0000 +#define KEY_F10 0x00300000 +#define KEY_F11 0x00310000 +#define KEY_F12 0x00320000 +#define KEY_HOME 0x00330000 +#define KEY_END 0x00340000 +#define KEY_INSERT 0x00350000 +#define KEY_DELETE 0x00360000 +#define KEY_MENU 0x00370000 +#define KEY_PAGEUP 0x00390000 +#define KEY_PAGEDOWN 0x003A0000 +#define KEY_PRINT 0x003B0000 +#define KEY_PAUSE 0x003D0000 + +#define KEY_BROWSER_BACK 0x003F0000 +#define KEY_BROWSER_FORWARD 0x00400000 +#define KEY_BROWSER_REFRESH 0x00410000 +#define KEY_BROWSER_STOP 0x00420000 +#define KEY_BROWSER_SEARCH 0x00430000 +#define KEY_BROWSER_FAVORITES 0x00440000 +#define KEY_BROWSER_HOME 0x00450000 +#define KEY_VOLUME_MUTE 0x00460000 +#define KEY_VOLUME_DOWN 0x00470000 +#define KEY_VOLUME_UP 0x00480000 +#define KEY_MEDIA_NEXT_TRACK 0x00490000 +#define KEY_MEDIA_PREV_TRACK 0x004A0000 +#define KEY_MEDIA_STOP 0x004B0000 +#define KEY_MEDIA_PLAY_PAUSE 0x004C0000 +#define KEY_MEDIA_RECORD 0x004D0000 +#define KEY_MEDIA_REWIND 0x004E0000 +#define KEY_MEDIA_FORWARD 0x004F0000 +#define KEY_MEDIA_REPEAT 0x00500000 +#define KEY_MEDIA_SHUFFLE 0x00510000 +#define KEY_MEDIA_SUBTITLE 0x00520000 +#define KEY_MEDIA_AUDIO 0x00530000 +#define KEY_MEDIA_ANGLE 0x00540000 +#define KEY_MEDIA_TIME 0x00550000 +#define KEY_MEDIA_FRAME_PREV 0x00560000 +#define KEY_MEDIA_FRAME_NEXT 0x00570000 +#define KEY_MEDIA_SELECT 0x00580000 +#define KEY_MEDIA_VIEW 0x00590000 +#define KEY_MEDIA_MENU 0x005A0000 +#define KEY_ZOOM_IN 0x00600000 +#define KEY_ZOOM_OUT 0x00610000 +#define KEY_BRIGHTNESS_UP 0x00620000 +#define KEY_BRIGHTNESS_DOWN 0x00630000 + +#define KEY_MOUSEWHEELUP 0x00F00000 +#define KEY_MOUSEWHEELDOWN 0x00F10000 +#define KEY_MOUSEWHEELLEFT 0x00F20000 +#define KEY_MOUSEWHEELRIGHT 0x00F30000 + +VLC_API char *vlc_keycode2str(uint_fast32_t i_key, bool locale) VLC_USED; +VLC_API uint_fast32_t vlc_str2keycode(const char *str) VLC_USED; + +typedef enum vlc_action { + ACTIONID_NONE = 0, + ACTIONID_QUIT, + ACTIONID_PLAY_PAUSE, + ACTIONID_PLAY, + ACTIONID_PAUSE, + ACTIONID_STOP, + ACTIONID_PREV, + ACTIONID_NEXT, + ACTIONID_SLOWER, + ACTIONID_FASTER, + ACTIONID_TOGGLE_FULLSCREEN, + ACTIONID_VOL_UP, + ACTIONID_VOL_DOWN, + ACTIONID_NAV_ACTIVATE, + ACTIONID_NAV_UP, + ACTIONID_NAV_DOWN, + ACTIONID_NAV_LEFT, + ACTIONID_NAV_RIGHT, + ACTIONID_JUMP_BACKWARD_EXTRASHORT, + ACTIONID_JUMP_FORWARD_EXTRASHORT, + ACTIONID_JUMP_BACKWARD_SHORT, + ACTIONID_JUMP_FORWARD_SHORT, + ACTIONID_JUMP_BACKWARD_MEDIUM, + ACTIONID_JUMP_FORWARD_MEDIUM, + ACTIONID_JUMP_BACKWARD_LONG, + ACTIONID_JUMP_FORWARD_LONG, + ACTIONID_FRAME_NEXT, + ACTIONID_POSITION, + ACTIONID_VOL_MUTE, +/* let ACTIONID_SET_BOOMARK* and ACTIONID_PLAY_BOOKMARK* be contiguous */ + ACTIONID_SET_BOOKMARK1, + ACTIONID_SET_BOOKMARK2, + ACTIONID_SET_BOOKMARK3, + ACTIONID_SET_BOOKMARK4, + ACTIONID_SET_BOOKMARK5, + ACTIONID_SET_BOOKMARK6, + ACTIONID_SET_BOOKMARK7, + ACTIONID_SET_BOOKMARK8, + ACTIONID_SET_BOOKMARK9, + ACTIONID_SET_BOOKMARK10, + ACTIONID_PLAY_BOOKMARK1, + ACTIONID_PLAY_BOOKMARK2, + ACTIONID_PLAY_BOOKMARK3, + ACTIONID_PLAY_BOOKMARK4, + ACTIONID_PLAY_BOOKMARK5, + ACTIONID_PLAY_BOOKMARK6, + ACTIONID_PLAY_BOOKMARK7, + ACTIONID_PLAY_BOOKMARK8, + ACTIONID_PLAY_BOOKMARK9, + ACTIONID_PLAY_BOOKMARK10, + /* end of contiguous zone */ + ACTIONID_PLAY_CLEAR, + ACTIONID_SUBDELAY_UP, + ACTIONID_SUBDELAY_DOWN, + ACTIONID_SUBSYNC_MARKAUDIO, + ACTIONID_SUBSYNC_MARKSUB, + ACTIONID_SUBSYNC_APPLY, + ACTIONID_SUBSYNC_RESET, + ACTIONID_SUBPOS_UP, + ACTIONID_SUBPOS_DOWN, + ACTIONID_AUDIO_TRACK, + ACTIONID_SUBTITLE_TRACK, + ACTIONID_SUBTITLE_TOGGLE, + ACTIONID_INTF_TOGGLE_FSC, + ACTIONID_INTF_HIDE, + ACTIONID_INTF_BOSS, + /* chapter and title navigation */ + ACTIONID_TITLE_PREV, + ACTIONID_TITLE_NEXT, + ACTIONID_CHAPTER_PREV, + ACTIONID_CHAPTER_NEXT, + /* end of chapter and title navigation */ + ACTIONID_AUDIODELAY_UP, + ACTIONID_AUDIODELAY_DOWN, + ACTIONID_SNAPSHOT, + ACTIONID_RECORD, + ACTIONID_DISC_MENU, + ACTIONID_ASPECT_RATIO, + ACTIONID_CROP, + ACTIONID_DEINTERLACE, + ACTIONID_DEINTERLACE_MODE, + ACTIONID_ZOOM, + ACTIONID_UNZOOM, + ACTIONID_CROP_TOP, + ACTIONID_UNCROP_TOP, + ACTIONID_CROP_LEFT, + ACTIONID_UNCROP_LEFT, + ACTIONID_CROP_BOTTOM, + ACTIONID_UNCROP_BOTTOM, + ACTIONID_CROP_RIGHT, + ACTIONID_UNCROP_RIGHT, + ACTIONID_RANDOM, + ACTIONID_LOOP, + ACTIONID_WALLPAPER, + ACTIONID_LEAVE_FULLSCREEN, + /* Zoom */ + ACTIONID_ZOOM_QUARTER, + ACTIONID_ZOOM_HALF, + ACTIONID_ZOOM_ORIGINAL, + ACTIONID_ZOOM_DOUBLE, + /* Cycle Through Audio Devices */ + ACTIONID_AUDIODEVICE_CYCLE, + /* scaling */ + ACTIONID_TOGGLE_AUTOSCALE, + ACTIONID_SCALE_UP, + ACTIONID_SCALE_DOWN, + /* */ + ACTIONID_RATE_NORMAL, + ACTIONID_RATE_SLOWER_FINE, + ACTIONID_RATE_FASTER_FINE, + /* Cycle Through Program Service IDs */ + ACTIONID_PROGRAM_SID_NEXT, + ACTIONID_PROGRAM_SID_PREV, + ACTIONID_INTF_POPUP_MENU, + +} vlc_action_t; + +VLC_API vlc_action_t vlc_GetActionId(const char *psz_key) VLC_USED; + +struct hotkey +{ + const char *psz_action; +}; + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_main.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_main.h new file mode 100644 index 0000000..142ce01 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_main.h @@ -0,0 +1,43 @@ +/***************************************************************************** + * vlc_main.h: access to all program variables + * Declaration and extern access to LibVLC instance object. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002, 2008 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_int_t internal libvlc instance + */ + +struct hotkey; + +/***************************************************************************** + * libvlc_internal_instance_t + ***************************************************************************** + * This structure is a LibVLC instance, for use by libvlc core and plugins + *****************************************************************************/ +struct libvlc_int_t +{ + VLC_COMMON_MEMBERS + + /* Structure storing the action name / key associations */ + const struct hotkey *p_hotkeys; +}; + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_md5.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_md5.h new file mode 100644 index 0000000..9b8c579 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_md5.h @@ -0,0 +1,59 @@ +/***************************************************************************** + * vlc_md5.h: MD5 hash + ***************************************************************************** + * Copyright © 2004-2011 VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MD5_H +# define VLC_MD5_H + +/** + * \file + * This file defines functions and structures to compute MD5 digests + */ + +struct md5_s +{ + uint32_t A, B, C, D; /* chaining variables */ + uint32_t nblocks; + uint8_t buf[64]; + int count; +}; + +VLC_API void InitMD5( struct md5_s * ); +VLC_API void AddMD5( struct md5_s *, const void *, size_t ); +VLC_API void EndMD5( struct md5_s * ); + +/** + * Returns a char representation of the md5 hash, as shown by UNIX md5 or + * md5sum tools. + */ +static inline char * psz_md5_hash( struct md5_s *md5_s ) +{ + char *psz = malloc( 33 ); /* md5 string is 32 bytes + NULL character */ + if( likely(psz) ) + { + for( int i = 0; i < 16; i++ ) + sprintf( &psz[2*i], "%02" PRIx8, md5_s->buf[i] ); + } + return psz; +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_media_library.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_media_library.h new file mode 100644 index 0000000..e7e1f70 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_media_library.h @@ -0,0 +1,127 @@ +/***************************************************************************** + * vlc_media_library.h: SQL-based media library + ***************************************************************************** + * Copyright (C) 2008-2010 the VideoLAN Team and AUTHORS + * $Id: a35d9729ca3705ec792b7be9e1819919f6e601f6 $ + * + * Authors: Antoine Lejeune + * Jean-Philippe André + * Rémi Duraffort + * Adrien Maglo + * Srikanth Raju + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MEDIA_LIBRARY_H +# define VLC_MEDIA_LIBRARY_H + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * ML Enums + *****************************************************************************/ + +#define ML_PERSON_ARTIST "Artist" +#define ML_PERSON_ALBUM_ARTIST "Album Artist" +#define ML_PERSON_ENCODER "Encoder" +#define ML_PERSON_PUBLISHER "Publisher" + + +/** List of Query select types. + * In a query array or variable argument list, each select type is followed + * by an argument (X) of variable type (char* or int, @see ml_element_t). + * These types can be used either in the query list or in the result array. + * Some types are reserved for the result array: + */ +typedef enum +{ + ML_ALBUM = 1, /**< Album Title */ + ML_ALBUM_ID, /**< Album ID */ + ML_ALBUM_COVER, /**< Album Cover art url */ + /* FIXME: Remove ML_ARTIST */ + ML_ARTIST, /**< Artist, interpreted as ML_PEOPLE + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_ARTIST_ID, /**< Artist ID, interpreted as ML_PEOPLE_ID + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_COMMENT, /**< Comment about media */ + ML_COUNT_MEDIA, /**< Number of medias */ + ML_COUNT_ALBUM, /**< Number of albums */ + ML_COUNT_PEOPLE, /**< Number of people */ + ML_COVER, /**< Cover art url */ + ML_DURATION, /**< Duration in ms */ + ML_DISC_NUMBER, /**< Disc number of the track */ + ML_EXTRA, /**< Extra/comment (string) on the media */ + ML_FIRST_PLAYED, /**< First time media was played */ + ML_FILESIZE, /**< Size of the media file */ + ML_GENRE, /**< Genre of the media (if any) */ + ML_ID, /**< Media ID */ + ML_IMPORT_TIME, /**< Date when media was imported */ + ML_LANGUAGE, /**< Language */ + ML_LAST_PLAYED, /**< Last play UNIX timestamp */ + ML_LAST_SKIPPED, /**< Time when media was last skipped */ + ML_ORIGINAL_TITLE, /**< Media original title (if any) */ + ML_PEOPLE, /**< Any People associated with this media */ + ML_PEOPLE_ID, /**< Id of a person */ + ML_PEOPLE_ROLE, /**< Person role */ + ML_PLAYED_COUNT, /**< Media play count */ + ML_PREVIEW, /**< Url of the video preview */ + ML_SKIPPED_COUNT, /**< Number of times skipped */ + ML_SCORE, /**< Computed media score */ + ML_TITLE, /**< Media title */ + ML_TRACK_NUMBER, /**< Media track number (if any) */ + ML_TYPE, /**< Media type. @see ml_type_e */ + ML_URI, /**< Media full URI. */ + ML_VOTE, /**< Media user vote value */ + ML_YEAR, /**< Media publishing year */ + ML_DIRECTORY, /**< Monitored directory */ + ML_MEDIA, /**< Full media descriptor. @see ml_media_t */ + ML_MEDIA_SPARSE, /**< Sparse media. @see ml_media_t */ + ML_MEDIA_EXTRA, /**< Sparse + Extra = Full media */ + + /* Some special elements */ + ML_LIMIT = -1, /**< Limit a query to X results */ + ML_SORT_DESC = -2, /**< Sort a query descending on argument X */ + ML_SORT_ASC = -3, /**< Sort a query ascending on argument X */ + ML_DISTINCT = -4, /**< Add DISTINCT to SELECT statements. */ + ML_END = -42 /**< End of argument list */ +} ml_select_e; + +/** Media types (audio, video, etc...) */ +typedef enum +{ + ML_UNKNOWN = 0, /**< Unknown media type */ + ML_AUDIO = 1 << 0, /**< Audio only media */ + ML_VIDEO = 1 << 1, /**< Video media. May contain audio channels */ + ML_STREAM = 1 << 2, /**< Streamed media = not a local file */ + ML_NODE = 1 << 3, /**< Nodes like simple nodes, directories, playlists, etc */ + ML_REMOVABLE = 1 << 4, /**< Removable media: CD/DVD/Card/... */ +} ml_type_e; + +/** Query result item/list type: integers, strings, medias, timestamps */ +typedef enum { + ML_TYPE_INT, /**< Object is an int */ + ML_TYPE_PSZ, /**< A string char* */ + ML_TYPE_TIME, /**< A timestamp mtime_t */ + ML_TYPE_MEDIA, /**< A pointer to a media ml_media_t* */ +} ml_result_type_e; + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* VLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_messages.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_messages.h new file mode 100644 index 0000000..e5b1833 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_messages.h @@ -0,0 +1,90 @@ +/***************************************************************************** + * vlc_messages.h: messages interface + * This library provides basic functions for threads to interact with user + * interface, such as message output. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002 VLC authors and VideoLAN + * $Id: f746f61c09afd91f89dee61340a1d090bd96416c $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MESSAGES_H_ +#define VLC_MESSAGES_H_ + +/** + * \file + * This file defines structures and functions to handle messages and statistics gathering + */ + +#include + +/** + * \defgroup messages Messages + * This library provides basic functions for threads to interact with user + * interface, such as message output. + * + * @{ + */ + +/** Message types */ +enum vlc_log_type +{ + VLC_MSG_INFO=0, /**< Important information */ + VLC_MSG_ERR, /**< Error */ + VLC_MSG_WARN, /**< Warning */ + VLC_MSG_DBG, /**< Debug */ +}; + +/** + * Log message + */ +typedef struct vlc_log_t +{ + uintptr_t i_object_id; /**< Emitter (temporaly) unique object ID or 0 */ + const char *psz_object_type; /**< Emitter object type name */ + const char *psz_module; /**< Emitter module (source code) */ + const char *psz_header; /**< Additional header (used by VLM media) */ +} vlc_log_t; + +VLC_API void vlc_Log(vlc_object_t *, int, + const char *, const char *, ...) VLC_FORMAT( 4, 5 ); +VLC_API void vlc_vaLog(vlc_object_t *, int, + const char *, const char *, va_list); +#define msg_GenericVa(a, b, c, d, e) vlc_vaLog(VLC_OBJECT(a), b, c, d, e) + +#define msg_Info( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_INFO, MODULE_STRING, __VA_ARGS__ ) +#define msg_Err( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_ERR, MODULE_STRING, __VA_ARGS__ ) +#define msg_Warn( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_WARN, MODULE_STRING, __VA_ARGS__ ) +#define msg_Dbg( p_this, ... ) \ + vlc_Log( VLC_OBJECT(p_this), VLC_MSG_DBG, MODULE_STRING, __VA_ARGS__ ) + +#ifndef MODULE_STRING +# define MODULE_STRING __FILE__ +#endif + +VLC_API const char *vlc_strerror(int); +VLC_API const char *vlc_strerror_c(int); + +/** + * @} + */ +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_meta.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_meta.h new file mode 100644 index 0000000..75cf8b3 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_meta.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_meta.h: Stream meta-data + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: 4292095290d804f6e22303de88ecae86be983fc0 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_H +#define VLC_META_H 1 + +/** + * \file + * This file defines functions and structures for stream meta-data in vlc + * + */ + +typedef enum vlc_meta_type_t +{ + vlc_meta_Title, + vlc_meta_Artist, + vlc_meta_Genre, + vlc_meta_Copyright, + vlc_meta_Album, + vlc_meta_TrackNumber, + vlc_meta_Description, + vlc_meta_Rating, + vlc_meta_Date, + vlc_meta_Setting, + vlc_meta_URL, + vlc_meta_Language, + vlc_meta_NowPlaying, + vlc_meta_ESNowPlaying, + vlc_meta_Publisher, + vlc_meta_EncodedBy, + vlc_meta_ArtworkURL, + vlc_meta_TrackID, + vlc_meta_TrackTotal, + vlc_meta_Director, + vlc_meta_Season, + vlc_meta_Episode, + vlc_meta_ShowName, + vlc_meta_Actors, +} vlc_meta_type_t; + +#define VLC_META_TYPE_COUNT 24 + +#define ITEM_PREPARSED 1 +#define ITEM_ARTURL_FETCHED 2 +#define ITEM_ART_FETCHED 4 +#define ITEM_ART_NOTFOUND 8 + +/** + * Basic function to deal with meta + */ +struct vlc_meta_t; + +VLC_API vlc_meta_t * vlc_meta_New( void ) VLC_USED; +VLC_API void vlc_meta_Delete( vlc_meta_t *m ); +VLC_API void vlc_meta_Set( vlc_meta_t *p_meta, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API const char * vlc_meta_Get( const vlc_meta_t *p_meta, vlc_meta_type_t meta_type ); + +VLC_API void vlc_meta_AddExtra( vlc_meta_t *m, const char *psz_name, const char *psz_value ); +VLC_API const char * vlc_meta_GetExtra( const vlc_meta_t *m, const char *psz_name ); +VLC_API unsigned vlc_meta_GetExtraCount( const vlc_meta_t *m ); + +/** + * Allocate a copy of all extra meta names and a table with it. + * Be sure to free both the returned pointers and its name. + */ +VLC_API char ** vlc_meta_CopyExtraNames( const vlc_meta_t *m ) VLC_USED; + +VLC_API void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src ); + +VLC_API int vlc_meta_GetStatus( vlc_meta_t *m ); +VLC_API void vlc_meta_SetStatus( vlc_meta_t *m, int status ); + +/** + * Returns a localizes string describing the meta + */ +VLC_API const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type ); + +/* deprecated (album-art variable) */ +enum { + ALBUM_ART_WHEN_ASKED, + ALBUM_ART_WHEN_PLAYED, + ALBUM_ART_ALL +}; + + +typedef struct meta_export_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + const char *psz_file; +} meta_export_t; + +VLC_API int input_item_WriteMeta(vlc_object_t *, input_item_t *); + +/* Setters for meta. + * Warning: Make sure to use the input_item meta setters (defined in vlc_input_item.h) + * instead of those one. */ +#define vlc_meta_SetTitle( meta, b ) vlc_meta_Set( meta, vlc_meta_Title, b ) +#define vlc_meta_SetArtist( meta, b ) vlc_meta_Set( meta, vlc_meta_Artist, b ) +#define vlc_meta_SetGenre( meta, b ) vlc_meta_Set( meta, vlc_meta_Genre, b ) +#define vlc_meta_SetCopyright( meta, b ) vlc_meta_Set( meta, vlc_meta_Copyright, b ) +#define vlc_meta_SetAlbum( meta, b ) vlc_meta_Set( meta, vlc_meta_Album, b ) +#define vlc_meta_SetTrackNum( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackNumber, b ) +#define vlc_meta_SetDescription( meta, b ) vlc_meta_Set( meta, vlc_meta_Description, b ) +#define vlc_meta_SetRating( meta, b ) vlc_meta_Set( meta, vlc_meta_Rating, b ) +#define vlc_meta_SetDate( meta, b ) vlc_meta_Set( meta, vlc_meta_Date, b ) +#define vlc_meta_SetSetting( meta, b ) vlc_meta_Set( meta, vlc_meta_Setting, b ) +#define vlc_meta_SetURL( meta, b ) vlc_meta_Set( meta, vlc_meta_URL, b ) +#define vlc_meta_SetLanguage( meta, b ) vlc_meta_Set( meta, vlc_meta_Language, b ) +#define vlc_meta_SetNowPlaying( meta, b ) vlc_meta_Set( meta, vlc_meta_NowPlaying, b ) +#define vlc_meta_SetPublisher( meta, b ) vlc_meta_Set( meta, vlc_meta_Publisher, b ) +#define vlc_meta_SetEncodedBy( meta, b ) vlc_meta_Set( meta, vlc_meta_EncodedBy, b ) +#define vlc_meta_SetArtURL( meta, b ) vlc_meta_Set( meta, vlc_meta_ArtworkURL, b ) +#define vlc_meta_SetTrackID( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackID, b ) +#define vlc_meta_SetTrackTotal( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackTotal, b ) +#define vlc_meta_SetDirector( meta, b ) vlc_meta_Set( meta, vlc_meta_Director, b ) +#define vlc_meta_SetSeason( meta, b ) vlc_meta_Set( meta, vlc_meta_Season, b ) +#define vlc_meta_SetEpisode( meta, b ) vlc_meta_Set( meta, vlc_meta_Episode, b ) +#define vlc_meta_SetShowName( meta, b ) vlc_meta_Set( meta, vlc_meta_ShowName, b ) +#define vlc_meta_SetActors( meta, b ) vlc_meta_Set( meta, vlc_meta_Actors, b ) + +#define VLC_META_TITLE vlc_meta_TypeToLocalizedString( vlc_meta_Title ) +#define VLC_META_ARTIST vlc_meta_TypeToLocalizedString( vlc_meta_Artist ) +#define VLC_META_GENRE vlc_meta_TypeToLocalizedString( vlc_meta_Genre ) +#define VLC_META_COPYRIGHT vlc_meta_TypeToLocalizedString( vlc_meta_Copyright ) +#define VLC_META_ALBUM vlc_meta_TypeToLocalizedString( vlc_meta_Album ) +#define VLC_META_TRACK_NUMBER vlc_meta_TypeToLocalizedString( vlc_meta_TrackNumber ) +#define VLC_META_DESCRIPTION vlc_meta_TypeToLocalizedString( vlc_meta_Description ) +#define VLC_META_RATING vlc_meta_TypeToLocalizedString( vlc_meta_Rating ) +#define VLC_META_DATE vlc_meta_TypeToLocalizedString( vlc_meta_Date ) +#define VLC_META_SETTING vlc_meta_TypeToLocalizedString( vlc_meta_Setting ) +#define VLC_META_URL vlc_meta_TypeToLocalizedString( vlc_meta_URL ) +#define VLC_META_LANGUAGE vlc_meta_TypeToLocalizedString( vlc_meta_Language ) +#define VLC_META_NOW_PLAYING vlc_meta_TypeToLocalizedString( vlc_meta_NowPlaying ) +#define VLC_META_PUBLISHER vlc_meta_TypeToLocalizedString( vlc_meta_Publisher ) +#define VLC_META_ENCODED_BY vlc_meta_TypeToLocalizedString( vlc_meta_EncodedBy ) +#define VLC_META_ART_URL vlc_meta_TypeToLocalizedString( vlc_meta_ArtworkURL ) +#define VLC_META_TRACKID vlc_meta_TypeToLocalizedString( vlc_meta_TrackID ) +#define VLC_META_DIRECTOR vlc_meta_TypeToLocalizedString( vlc_meta_Director ) +#define VLC_META_SEASON vlc_meta_TypeToLocalizedString( vlc_meta_Season ) +#define VLC_META_EPISODE vlc_meta_TypeToLocalizedString( vlc_meta_Episode ) +#define VLC_META_SHOW_NAME vlc_meta_TypeToLocalizedString( vlc_meta_ShowName ) +#define VLC_META_ACTORS vlc_meta_TypeToLocalizedString( vlc_meta_Actors ) + +#define VLC_META_EXTRA_MB_ALBUMID "MB_ALBUMID" + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_meta_fetcher.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_meta_fetcher.h new file mode 100644 index 0000000..e806145 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_meta_fetcher.h @@ -0,0 +1,38 @@ +/***************************************************************************** + * vlc_meta_fetcher.h + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_FETCHER_H +#define VLC_META_FETCHER_H 1 + +typedef enum meta_fetcher_scope_t +{ + FETCHER_SCOPE_LOCAL = 0x01, + FETCHER_SCOPE_NETWORK = 0x02, + FETCHER_SCOPE_ANY = 0x03 +} meta_fetcher_scope_t; + +typedef struct meta_fetcher_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + meta_fetcher_scope_t e_scope; +} meta_fetcher_t; + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_mime.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_mime.h new file mode 100644 index 0000000..f04fc95 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_mime.h @@ -0,0 +1,31 @@ +/***************************************************************************** + * vlc_mime.h: Mime type recognition + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MIME_H +#define VLC_MIME_H 1 + +/** + * \file + * Mime type recognition helpers. + */ + +VLC_API const char * vlc_mime_Ext2Mime( const char *psz_url ); + +#endif /* _VLC_MIME_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_modules.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_modules.h new file mode 100644 index 0000000..be68094 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_modules.h @@ -0,0 +1,77 @@ +/***************************************************************************** + * vlc_modules.h : Module descriptor and load functions + ***************************************************************************** + * Copyright (C) 2001-2011 VLC authors and VideoLAN + * $Id: 7f45217969b63e32af360d2e48789f5a16809b9a $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines functions for modules in vlc + */ + +typedef int (*vlc_activate_t)(void *func, va_list args); +typedef void (*vlc_deactivate_t)(void *func, va_list args); + +/***************************************************************************** + * Exported functions. + *****************************************************************************/ + +VLC_API module_t * vlc_module_load( vlc_object_t *obj, const char *cap, const char *name, bool strict, vlc_activate_t probe, ... ) VLC_USED; +#define vlc_module_load(o,c,n,s,...) \ + vlc_module_load(VLC_OBJECT(o),c,n,s,__VA_ARGS__) +VLC_API void vlc_module_unload( module_t *, vlc_deactivate_t deinit, ... ); + +VLC_API module_t * module_need( vlc_object_t *, const char *, const char *, bool ) VLC_USED; +#define module_need(a,b,c,d) module_need(VLC_OBJECT(a),b,c,d) +VLC_API void module_unneed( vlc_object_t *, module_t * ); +#define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b) +VLC_API bool module_exists(const char *) VLC_USED; +VLC_API module_t * module_find(const char *) VLC_USED; + +int module_start(vlc_object_t *, const module_t *); +#define module_start(o, m) module_start(VLC_OBJECT(o),m) +void module_stop(vlc_object_t *, const module_t *); +#define module_stop(o, m) module_stop(VLC_OBJECT(o),m) + +VLC_API module_config_t * module_config_get( const module_t *, unsigned * ) VLC_USED; +VLC_API void module_config_free( module_config_t * ); + +VLC_API void module_list_free(module_t **); +VLC_API module_t ** module_list_get(size_t *n) VLC_USED; + +VLC_API bool module_provides( const module_t *m, const char *cap ); +VLC_API const char * module_get_object( const module_t *m ) VLC_USED; +VLC_API const char * module_get_name( const module_t *m, bool long_name ) VLC_USED; +#define module_GetLongName( m ) module_get_name( m, true ) +VLC_API const char * module_get_help( const module_t *m ) VLC_USED; +VLC_API const char * module_get_capability( const module_t *m ) VLC_USED; +VLC_API int module_get_score( const module_t *m ) VLC_USED; +VLC_API const char * module_gettext( const module_t *, const char * ) VLC_USED; + +VLC_USED static inline module_t *module_get_main (void) +{ + return module_find ("core"); +} +#define module_get_main(a) module_get_main() + +VLC_USED static inline bool module_is_main( const module_t * p_module ) +{ + return !strcmp( module_get_object( p_module ), "core" ); +} diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_mouse.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_mouse.h new file mode 100644 index 0000000..c62ee3c --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_mouse.h @@ -0,0 +1,148 @@ +/***************************************************************************** + * vlc_mouse.h: mouse related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: b48853570a09ad1d77cc95cda0c5b04b5028ee80 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef _VLC_MOUSE_H +#define _VLC_MOUSE_H 1 + +/** + * Mouse buttons + */ +enum +{ + MOUSE_BUTTON_LEFT=0, + MOUSE_BUTTON_CENTER, + MOUSE_BUTTON_RIGHT, + MOUSE_BUTTON_WHEEL_UP, + MOUSE_BUTTON_WHEEL_DOWN, + MOUSE_BUTTON_WHEEL_LEFT, + MOUSE_BUTTON_WHEEL_RIGHT, + MOUSE_BUTTON_MAX +}; + +/** + * Mouse state + */ +typedef struct +{ + /* Coordinate */ + int i_x; + int i_y; + /* Mask of pressed button */ + int i_pressed; + /* Is double clicked */ + bool b_double_click; +} vlc_mouse_t; + +static inline void vlc_mouse_Init( vlc_mouse_t *p_mouse ) +{ + p_mouse->i_x = 0; + p_mouse->i_y = 0; + p_mouse->i_pressed = 0; + p_mouse->b_double_click = false; +} + +/* */ +static inline void vlc_mouse_SetPressed( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed |= 1 << i_button; +} +static inline void vlc_mouse_SetReleased( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed &= ~(1 << i_button); +} +static inline void vlc_mouse_SetPosition( vlc_mouse_t *p_mouse, + int i_x, int i_y ) +{ + p_mouse->i_x = i_x; + p_mouse->i_y = i_y; +} + +/* */ +static inline bool vlc_mouse_IsPressed( const vlc_mouse_t *p_mouse, + int i_button ) +{ + return ( p_mouse->i_pressed & (1 << i_button) ) != 0; +} +static inline bool vlc_mouse_IsLeftPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_LEFT ); +} +static inline bool vlc_mouse_IsCenterPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_CENTER ); +} +static inline bool vlc_mouse_IsRightPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_RIGHT ); +} +static inline bool vlc_mouse_IsWheelUpPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_UP ); +} +static inline bool vlc_mouse_IsWheelDownPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_DOWN ); +} +static inline void vlc_mouse_GetMotion( int *pi_x, int *pi_y, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + *pi_x = p_new->i_x - p_old->i_x; + *pi_y = p_new->i_y - p_old->i_y; +} + +/* */ +static inline bool vlc_mouse_HasChanged( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y || + p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasMoved( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y; +} +static inline bool vlc_mouse_HasButton( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasPressed( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) == 0 && (p_new->i_pressed & i_mask); +} +static inline bool vlc_mouse_HasReleased( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) && (p_new->i_pressed & i_mask) == 0; +} +#endif /* _VLC_MOUSE_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_mtime.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_mtime.h new file mode 100644 index 0000000..42172e0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_mtime.h @@ -0,0 +1,79 @@ +/***************************************************************************** + * vlc_mtime.h: high resolution time management functions + ***************************************************************************** + * This header provides portable high precision time management functions, + * which should be the only ones used in other segments of the program, since + * functions like gettimeofday() and ftime() are not always supported. + * Most functions are declared as inline or as macros since they are only + * interfaces to system calls and have to be called frequently. + * 'm' stands for 'micro', since maximum resolution is the microsecond. + * Functions prototyped are implemented in interface/mtime.c. + ***************************************************************************** + * Copyright (C) 1996, 1997, 1998, 1999, 2000 VLC authors and VideoLAN + * $Id: ab89a972120c8ee3f45d9823994eac584f8fe527 $ + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef __VLC_MTIME_H +# define __VLC_MTIME_H 1 + +/***************************************************************************** + * LAST_MDATE: date which will never happen + ***************************************************************************** + * This date can be used as a 'never' date, to mark missing events in a function + * supposed to return a date, such as nothing to display in a function + * returning the date of the first image to be displayed. It can be used in + * comparaison with other values: all existing dates will be earlier. + *****************************************************************************/ +#define LAST_MDATE ((mtime_t)((uint64_t)(-1)/2)) + +/***************************************************************************** + * MSTRTIME_MAX_SIZE: maximum possible size of mstrtime + ***************************************************************************** + * This values is the maximal possible size of the string returned by the + * mstrtime() function, including '-' and the final '\0'. It should be used to + * allocate the buffer. + *****************************************************************************/ +#define MSTRTIME_MAX_SIZE 22 + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API char * mstrtime( char *psz_buffer, mtime_t date ); +VLC_API char * secstotimestr( char *psz_buffer, int32_t secs ); + +/***************************************************************************** + * date_t: date incrementation without long-term rounding errors + *****************************************************************************/ +struct date_t +{ + mtime_t date; + uint32_t i_divider_num; + uint32_t i_divider_den; + uint32_t i_remainder; +}; + +VLC_API void date_Init( date_t *, uint32_t, uint32_t ); +VLC_API void date_Change( date_t *, uint32_t, uint32_t ); +VLC_API void date_Set( date_t *, mtime_t ); +VLC_API mtime_t date_Get( const date_t * ); +VLC_API void date_Move( date_t *, mtime_t ); +VLC_API mtime_t date_Increment( date_t *, uint32_t ); +VLC_API mtime_t date_Decrement( date_t *, uint32_t ); +VLC_API uint64_t NTPtime64( void ); +#endif /* !__VLC_MTIME_ */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_network.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_network.h new file mode 100644 index 0000000..3461c9f --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_network.h @@ -0,0 +1,370 @@ +/***************************************************************************** + * vlc_network.h: interface to communicate with network plug-ins + ***************************************************************************** + * Copyright (C) 2002-2005 VLC authors and VideoLAN + * Copyright © 2006-2007 Rémi Denis-Courmont + * $Id: 70281a229d0acf031b71e0d22ac0a08be0712c68 $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_NETWORK_H +# define VLC_NETWORK_H + +/** + * \file + * This file defines interface to communicate with network plug-ins + */ + +#if defined( _WIN32 ) +# define _NO_OLDNAMES 1 +# include +# include +# include +# define net_errno (WSAGetLastError()) + +struct iovec +{ + void *iov_base; + size_t iov_len; +}; + +struct msghdr +{ + void *msg_name; + size_t msg_namelen; + struct iovec *msg_iov; + size_t msg_iovlen; + void *msg_control; + size_t msg_controllen; + int msg_flags; +}; + +# ifndef IPV6_V6ONLY +# define IPV6_V6ONLY 27 +# endif +#else +# include +# include +# include +# include +# include +# define net_errno errno +#endif + +#if defined( __SYMBIAN32__ ) +# undef AF_INET6 +# undef IN6_IS_ADDR_MULTICAST +# undef IPV6_V6ONLY +# undef IPV6_MULTICAST_HOPS +# undef IPV6_MULTICAST_IF +# undef IPV6_TCLASS +# undef IPV6_JOIN_GROUP +#endif + +VLC_API int vlc_socket (int, int, int, bool nonblock) VLC_USED; + +struct sockaddr; +VLC_API int vlc_accept( int, struct sockaddr *, socklen_t *, bool ) VLC_USED; + +# ifdef __cplusplus +extern "C" { +# endif + +/* Portable networking layer communication */ +int net_Socket (vlc_object_t *obj, int family, int socktype, int proto); + +VLC_API int net_Connect(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); +#define net_Connect(a, b, c, d, e) net_Connect(VLC_OBJECT(a), b, c, d, e) + +VLC_API int * net_Listen(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); + +#define net_ListenTCP(a, b, c) net_Listen(VLC_OBJECT(a), b, c, \ + SOCK_STREAM, IPPROTO_TCP) + +static inline int net_ConnectTCP (vlc_object_t *obj, const char *host, int port) +{ + return net_Connect (obj, host, port, SOCK_STREAM, IPPROTO_TCP); +} +#define net_ConnectTCP(a, b, c) net_ConnectTCP(VLC_OBJECT(a), b, c) + +VLC_API int net_AcceptSingle(vlc_object_t *obj, int lfd); + +VLC_API int net_Accept( vlc_object_t *, int * ); +#define net_Accept(a, b) \ + net_Accept(VLC_OBJECT(a), b) + +VLC_API int net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim, int proto ); +#define net_ConnectDgram(a, b, c, d, e ) \ + net_ConnectDgram(VLC_OBJECT(a), b, c, d, e) + +static inline int net_ConnectUDP (vlc_object_t *obj, const char *host, int port, int hlim) +{ + return net_ConnectDgram (obj, host, port, hlim, IPPROTO_UDP); +} + +VLC_API int net_OpenDgram( vlc_object_t *p_this, const char *psz_bind, int i_bind, const char *psz_server, int i_server, int proto ); +#define net_OpenDgram( a, b, c, d, e, g ) \ + net_OpenDgram(VLC_OBJECT(a), b, c, d, e, g) + +static inline int net_ListenUDP1 (vlc_object_t *obj, const char *host, int port) +{ + return net_OpenDgram (obj, host, port, NULL, 0, IPPROTO_UDP); +} + +VLC_API void net_ListenClose( int *fd ); + +int net_Subscribe (vlc_object_t *obj, int fd, const struct sockaddr *addr, + socklen_t addrlen); + +VLC_API int net_SetCSCov( int fd, int sendcov, int recvcov ); + +/* Functions to read from or write to the networking layer */ +struct virtual_socket_t +{ + void *p_sys; + int (*pf_recv) ( void *, void *, size_t ); + int (*pf_send) ( void *, const void *, size_t ); +}; + +VLC_API ssize_t net_Read( vlc_object_t *p_this, int fd, const v_socket_t *, void *p_data, size_t i_data, bool b_retry ); +#define net_Read(a,b,c,d,e,f) net_Read(VLC_OBJECT(a),b,c,d,e,f) +VLC_API ssize_t net_Write( vlc_object_t *p_this, int fd, const v_socket_t *, const void *p_data, size_t i_data ); +#define net_Write(a,b,c,d,e) net_Write(VLC_OBJECT(a),b,c,d,e) +VLC_API char * net_Gets( vlc_object_t *p_this, int fd, const v_socket_t * ); +#define net_Gets(a,b,c) net_Gets(VLC_OBJECT(a),b,c) + + +VLC_API ssize_t net_Printf( vlc_object_t *p_this, int fd, const v_socket_t *, const char *psz_fmt, ... ) VLC_FORMAT( 4, 5 ); +#define net_Printf(o,fd,vs,...) net_Printf(VLC_OBJECT(o),fd,vs, __VA_ARGS__) +VLC_API ssize_t net_vaPrintf( vlc_object_t *p_this, int fd, const v_socket_t *, const char *psz_fmt, va_list args ); +#define net_vaPrintf(a,b,c,d,e) net_vaPrintf(VLC_OBJECT(a),b,c,d,e) + +#ifdef _WIN32 +/* Microsoft: same semantic, same value, different name... go figure */ +# define SHUT_RD SD_RECEIVE +# define SHUT_WR SD_SEND +# define SHUT_RDWR SD_BOTH +# define net_Close( fd ) closesocket ((SOCKET)fd) +#else +# ifdef __OS2__ +# define SHUT_RD 0 +# define SHUT_WR 1 +# define SHUT_RDWR 2 +# endif +# define net_Close( fd ) (void)close (fd) +#endif + +/* Portable network names/addresses resolution layer */ + +/* GAI error codes */ +# ifndef EAI_BADFLAGS +# define EAI_BADFLAGS -1 +# endif +# ifndef EAI_NONAME +# define EAI_NONAME -2 +# endif +# ifndef EAI_AGAIN +# define EAI_AGAIN -3 +# endif +# ifndef EAI_FAIL +# define EAI_FAIL -4 +# endif +# ifndef EAI_NODATA +# define EAI_NODATA -5 +# endif +# ifndef EAI_FAMILY +# define EAI_FAMILY -6 +# endif +# ifndef EAI_SOCKTYPE +# define EAI_SOCKTYPE -7 +# endif +# ifndef EAI_SERVICE +# define EAI_SERVICE -8 +# endif +# ifndef EAI_ADDRFAMILY +# define EAI_ADDRFAMILY -9 +# endif +# ifndef EAI_MEMORY +# define EAI_MEMORY -10 +# endif +#ifndef EAI_OVERFLOW +# define EAI_OVERFLOW -11 +#endif +# ifndef EAI_SYSTEM +# define EAI_SYSTEM -12 +# endif + + +# ifndef NI_MAXHOST +# define NI_MAXHOST 1025 +# define NI_MAXSERV 32 +# endif +# define NI_MAXNUMERICHOST 64 + +#ifndef AI_NUMERICSERV +# define AI_NUMERICSERV 0 +#endif +#ifndef AI_IDN +# define AI_IDN 0 /* GNU/libc extension */ +#endif + +#ifdef _WIN32 +# undef gai_strerror +# define gai_strerror gai_strerrorA +#endif + +#ifdef __OS2__ +# ifndef NI_NUMERICHOST +# define NI_NUMERICHOST 0x01 +# define NI_NUMERICSERV 0x02 +# define NI_NOFQDN 0x04 +# define NI_NAMEREQD 0x08 +# define NI_DGRAM 0x10 +# endif + +# define AI_PASSIVE 1 +# define AI_CANONNAME 2 +# define AI_NUMERICHOST 4 + +VLC_API const char *gai_strerror( int errnum ); + +VLC_API int getaddrinfo ( const char *, const char *, + const struct addrinfo *, struct addrinfo ** ); +VLC_API void freeaddrinfo( struct addrinfo * ); +VLC_API int getnameinfo ( const struct sockaddr *, socklen_t, + char *, int, char *, int, int ); +#endif + +VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int ); +VLC_API int vlc_getaddrinfo (const char *, unsigned, + const struct addrinfo *, struct addrinfo **); + + +#ifdef __OS2__ +/* OS/2 does not support IPv6, yet. But declare these only for compilation */ +struct in6_addr +{ + uint8_t s6_addr[16]; +}; + +struct sockaddr_in6 +{ + uint8_t sin6_len; + uint8_t sin6_family; + uint16_t sin6_port; + uint32_t sin6_flowinfo; + struct in6_addr sin6_addr; + uint32_t sin6_scope_id; +}; + +# define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff) + +static const struct in6_addr in6addr_any = + { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; +#endif + +static inline bool +net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len) +{ + switch (addr->sa_family) + { +#ifdef IN_MULTICAST + case AF_INET: + { + const struct sockaddr_in *v4 = (const struct sockaddr_in *)addr; + if ((size_t)len < sizeof (*v4)) + return false; + return IN_MULTICAST (ntohl (v4->sin_addr.s_addr)) != 0; + } +#endif + +#ifdef IN6_IS_ADDR_MULTICAST + case AF_INET6: + { + const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr; + if ((size_t)len < sizeof (*v6)) + return false; + return IN6_IS_ADDR_MULTICAST (&v6->sin6_addr) != 0; + } +#endif + } + + return false; +} + + +static inline int net_GetSockAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getsockname( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline int net_GetPeerAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getpeername( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline uint16_t net_GetPort (const struct sockaddr *addr) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + return ((const struct sockaddr_in6 *)addr)->sin6_port; +#endif + case AF_INET: + return ((const struct sockaddr_in *)addr)->sin_port; + } + return 0; +} + +static inline void net_SetPort (struct sockaddr *addr, uint16_t port) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + ((struct sockaddr_in6 *)addr)->sin6_port = port; + break; +#endif + case AF_INET: + ((struct sockaddr_in *)addr)->sin_port = port; + break; + } +} + +VLC_API char *vlc_getProxyUrl(const char *); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_objects.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_objects.h new file mode 100644 index 0000000..db3f8fe --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_objects.h @@ -0,0 +1,79 @@ +/***************************************************************************** + * vlc_objects.h: vlc_object_t definition and manipulation methods + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: c6708750ee9cd68a9fce0246f019ad8aec80432b $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines the vlc_object_t structure and object types. + */ + +/** + * \defgroup vlc_object Objects + * @{ + */ + +/* Object flags */ +#define OBJECT_FLAGS_QUIET 0x0002 +#define OBJECT_FLAGS_NOINTERACT 0x0004 + +/***************************************************************************** + * The vlc_object_t type. Yes, it's that simple :-) + *****************************************************************************/ +/** The main vlc_object_t structure */ +struct vlc_object_t +{ + VLC_COMMON_MEMBERS +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API void *vlc_object_create( vlc_object_t *, size_t ) VLC_MALLOC VLC_USED; +VLC_API vlc_object_t *vlc_object_find_name( vlc_object_t *, const char * ) VLC_USED VLC_DEPRECATED; +VLC_API void * vlc_object_hold( vlc_object_t * ); +VLC_API void vlc_object_release( vlc_object_t * ); +VLC_API vlc_list_t *vlc_list_children( vlc_object_t * ) VLC_USED; +VLC_API void vlc_list_release( vlc_list_t * ); +VLC_API char *vlc_object_get_name( const vlc_object_t * ) VLC_USED; +#define vlc_object_get_name(o) vlc_object_get_name(VLC_OBJECT(o)) + +/**}@*/ + +#define vlc_object_create(a,b) vlc_object_create( VLC_OBJECT(a), b ) + +#define vlc_object_find_name(a,b) \ + vlc_object_find_name( VLC_OBJECT(a),b) + +#define vlc_object_hold(a) \ + vlc_object_hold( VLC_OBJECT(a) ) + +#define vlc_object_release(a) \ + vlc_object_release( VLC_OBJECT(a) ) + +#define vlc_list_children(a) \ + vlc_list_children( VLC_OBJECT(a) ) + +/* Objects and threading */ +VLC_API VLC_USED VLC_DEPRECATED bool vlc_object_alive (vlc_object_t *); +#define vlc_object_alive(a) vlc_object_alive( VLC_OBJECT(a) ) + +/** @} */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_opengl.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_opengl.h new file mode 100644 index 0000000..1cc8ca2 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_opengl.h @@ -0,0 +1,95 @@ +/***************************************************************************** + * vlc_opengl.h: VLC GL API + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * Copyright (C) 2011 Rémi Denis-Courmont + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_GL_H +#define VLC_GL_H 1 + +/** + * \file + * This file defines GL structures and functions. + */ + +struct vout_window_t; + +/** + * A VLC GL context (and its underlying surface) + */ +typedef struct vlc_gl_t vlc_gl_t; + +struct vlc_gl_t +{ + VLC_COMMON_MEMBERS + + struct vout_window_t *surface; + module_t *module; + void *sys; + + int (*makeCurrent)(vlc_gl_t *); + void (*releaseCurrent)(vlc_gl_t *); + void (*swap)(vlc_gl_t *); + int (*lock)(vlc_gl_t *); + void (*unlock)(vlc_gl_t *); + void*(*getProcAddress)(vlc_gl_t *, const char *); +}; + +enum { + VLC_OPENGL, + VLC_OPENGL_ES, + VLC_OPENGL_ES2, +}; + +VLC_API vlc_gl_t *vlc_gl_Create(struct vout_window_t *, unsigned, const char *) VLC_USED; +VLC_API void vlc_gl_Destroy(vlc_gl_t *); + +static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl) +{ + return gl->makeCurrent(gl); +} + +static inline void vlc_gl_ReleaseCurrent(vlc_gl_t *gl) +{ + gl->releaseCurrent(gl); +} + +static inline int vlc_gl_Lock(vlc_gl_t *gl) +{ + return (gl->lock != NULL) ? gl->lock(gl) : VLC_SUCCESS; +} + +static inline void vlc_gl_Unlock(vlc_gl_t *gl) +{ + if (gl->unlock != NULL) + gl->unlock(gl); +} + +static inline void vlc_gl_Swap(vlc_gl_t *gl) +{ + gl->swap(gl); +} + +static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name) +{ + return (gl->getProcAddress != NULL) ? gl->getProcAddress(gl, name) : NULL; +} + +#endif /* VLC_GL_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture.h new file mode 100644 index 0000000..0dc2b08 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture.h @@ -0,0 +1,285 @@ +/***************************************************************************** + * vlc_picture.h: picture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: e45374ba04791df4b80ebda3987d4897757b5663 $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_H +#define VLC_PICTURE_H 1 + +/** + * \file + * This file defines picture structures and functions in vlc + */ + +#include +#if (defined (__LIBVLC__) && !defined (__PLUGIN__)) +# include +#endif + +/** Description of a planar graphic field */ +typedef struct plane_t +{ + uint8_t *p_pixels; /**< Start of the plane's data */ + + /* Variables used for fast memcpy operations */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + + /** Size of a macropixel, defaults to 1 */ + int i_pixel_pitch; + + /* Variables used for pictures with margins */ + int i_visible_lines; /**< How many visible lines are there ? */ + int i_visible_pitch; /**< How many visible pixels are there ? */ + +} plane_t; + +/** + * Maximum number of plane for a picture + */ +#define PICTURE_PLANE_MAX (VOUT_MAX_PLANES) + + +/** + * A private definition to help overloading picture release + */ +typedef struct picture_gc_sys_t picture_gc_sys_t; + +/** + * Video picture + */ +struct picture_t +{ + /** + * The properties of the picture + */ + video_frame_format_t format; + + plane_t p[PICTURE_PLANE_MAX]; /**< description of the planes */ + int i_planes; /**< number of allocated planes */ + + /** \name Picture management properties + * These properties can be modified using the video output thread API, + * but should never be written directly */ + /**@{*/ + mtime_t date; /**< display date */ + bool b_force; + /**@}*/ + + /** \name Picture dynamic properties + * Those properties can be changed by the decoder + * @{ + */ + bool b_progressive; /**< is it a progressive frame ? */ + bool b_top_field_first; /**< which field is first */ + unsigned int i_nb_fields; /**< # of displayed fields */ + void * context; /**< video format-specific data pointer, + * must point to a (void (*)(void*)) pointer to free the context */ + /**@}*/ + + /** Private data - the video output plugin might want to put stuff here to + * keep track of the picture */ + picture_sys_t * p_sys; + + /** This way the picture_Release can be overloaded */ + struct + { +#if (defined (__LIBVLC__) && !defined (__PLUGIN__)) + atomic_uintptr_t refcount; +#else + uintptr_t refcount_placeholder_keep_off; +#endif + void (*pf_destroy)( picture_t * ); + picture_gc_sys_t *p_sys; + } gc; + + /** Next picture in a FIFO a pictures */ + struct picture_t *p_next; +}; + +/** + * This function will create a new picture. + * The picture created will implement a default release management compatible + * with picture_Hold and picture_Release. This default management will release + * p_sys, gc.p_sys fields if non NULL. + */ +VLC_API picture_t * picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den ) VLC_USED; + +/** + * This function will create a new picture using the given format. + * + * When possible, it is preferred to use this function over picture_New + * as more information about the format is kept. + */ +VLC_API picture_t * picture_NewFromFormat( const video_format_t *p_fmt ) VLC_USED; + +/** + * Resource for a picture. + */ +typedef struct +{ + picture_sys_t *p_sys; + void (*pf_destroy)(picture_t *); + + /* Plane resources + * XXX all fields MUST be set to the right value. + */ + struct + { + uint8_t *p_pixels; /**< Start of the plane's data */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + } p[PICTURE_PLANE_MAX]; + +} picture_resource_t; + +/** + * This function will create a new picture using the provided resource. + * + * If the resource is NULL then a plain picture_NewFromFormat is returned. + */ +VLC_API picture_t * picture_NewFromResource( const video_format_t *, const picture_resource_t * ) VLC_USED; + +/** + * This function will increase the picture reference count. + * It will not have any effect on picture obtained from vout + * + * It returns the given picture for convenience. + */ +VLC_API picture_t *picture_Hold( picture_t *p_picture ); + +/** + * This function will release a picture. + * It will not have any effect on picture obtained from vout + */ +VLC_API void picture_Release( picture_t *p_picture ); + +/** + * This function will return true if you are not the only owner of the + * picture. + * + * It is only valid if it is created using picture_New. + */ +VLC_API bool picture_IsReferenced( picture_t *p_picture ); + +/** + * This function will copy all picture dynamic properties. + */ +VLC_API void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src ); + +/** + * This function will reset a picture information (properties and quantizers). + * It is sometimes useful for reusing pictures (like from a pool). + */ +VLC_API void picture_Reset( picture_t * ); + +/** + * This function will copy the picture pixels. + * You can safely copy between pictures that do not have the same size, + * only the compatible(smaller) part will be copied. + */ +VLC_API void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ); +VLC_API void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ); + +/** + * This function will copy both picture dynamic properties and pixels. + * You have to notice that sometime a simple picture_Hold may do what + * you want without the copy overhead. + * Provided for convenience. + * + * \param p_dst pointer to the destination picture. + * \param p_src pointer to the source picture. + */ +VLC_API void picture_Copy( picture_t *p_dst, const picture_t *p_src ); + +/** + * This function will export a picture to an encoded bitstream. + * + * pp_image will contain the encoded bitstream in psz_format format. + * + * p_fmt can be NULL otherwise it will be set with the format used for the + * picture before encoding. + * + * i_override_width/height allow to override the width and/or the height of the + * picture to be encoded: + * - if strictly lower than 0, the original dimension will be used. + * - if equal to 0, it will be deduced from the other dimension which must be + * different to 0. + * - if strictly higher than 0, it will override the dimension. + * If at most one of them is > 0 then the picture aspect ratio will be kept. + */ +VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ); + +/** + * This function will setup all fields of a picture_t without allocating any + * memory. + * XXX The memory must already be initialized. + * It does not need to be released. + * + * It will return VLC_EGENERIC if the core does not understand the requested + * format. + * + * It can be useful to get the properties of planes. + */ +VLC_API int picture_Setup( picture_t *, const video_format_t * ); + + +/** + * This function will blend a given subpicture onto a picture. + * + * The subpicture and all its region must: + * - be absolute. + * - not be ephemere. + * - not have the fade flag. + * - contains only picture (no text rendering). + * \return the number of region(s) succesfully blent + */ +VLC_API unsigned picture_BlendSubpicture( picture_t *, filter_t *p_blend, subpicture_t * ); + + +/***************************************************************************** + * Shortcuts to access image components + *****************************************************************************/ + +/* Plane indices */ +enum +{ + Y_PLANE = 0, + U_PLANE = 1, + V_PLANE = 2, + A_PLANE = 3, +}; + +/* Shortcuts */ +#define Y_PIXELS p[Y_PLANE].p_pixels +#define Y_PITCH p[Y_PLANE].i_pitch +#define U_PIXELS p[U_PLANE].p_pixels +#define U_PITCH p[U_PLANE].i_pitch +#define V_PIXELS p[V_PLANE].p_pixels +#define V_PITCH p[V_PLANE].i_pitch +#define A_PIXELS p[A_PLANE].p_pixels +#define A_PITCH p[A_PLANE].i_pitch + +/**@}*/ + +#endif /* VLC_PICTURE_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_fifo.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_fifo.h new file mode 100644 index 0000000..d337a3b --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_fifo.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * vlc_picture_fifo.h: picture fifo definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: 73d1b20c279f628cf94bc7cfc83b2548878bcc07 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_FIFO_H +#define VLC_PICTURE_FIFO_H 1 + +/** + * \file + * This file defines picture fifo structures and functions in vlc + */ + +#include + +/** + * Picture fifo handle + * + * It is thread safe (push/pop). + */ +typedef struct picture_fifo_t picture_fifo_t; + +/** + * It creates an empty picture_fifo_t. + */ +VLC_API picture_fifo_t * picture_fifo_New( void ) VLC_USED; + +/** + * It destroys a fifo created by picture_fifo_New. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Delete( picture_fifo_t * ); + +/** + * It retreives a picture_t from the fifo. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Pop( picture_fifo_t * ) VLC_USED; + +/** + * It returns the first picture_t pointer from the fifo but does not + * remove it. The picture returned has been hold for you so you + * must call picture_Release on it. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Peek( picture_fifo_t * ) VLC_USED; + +/** + * It saves a picture_t into the fifo. + */ +VLC_API void picture_fifo_Push( picture_fifo_t *, picture_t * ); + +/** + * It release all picture inside the fifo that have a lower or equal date + * if flush_before or higher or equal to if not flush_before than the given one. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Flush( picture_fifo_t *, mtime_t date, bool flush_before ); + +/** + * It applies a delta on all the picture timestamp. + */ +VLC_API void picture_fifo_OffsetDate( picture_fifo_t *, mtime_t delta ); + + +#endif /* VLC_PICTURE_FIFO_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_pool.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_pool.h new file mode 100644 index 0000000..147d9c8 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_picture_pool.h @@ -0,0 +1,126 @@ +/***************************************************************************** + * vlc_picture_pool.h: picture pool definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: d4574dc5a1dfd2d873c6f286ee612462f886bb33 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_POOL_H +#define VLC_PICTURE_POOL_H 1 + +/** + * \file + * This file defines picture pool structures and functions in vlc + */ + +#include + +/** + * Picture pool handle + * + * XXX it is not thread safe, all pool manipulations and picture_Release + * must be properly locked if needed. + */ +typedef struct picture_pool_t picture_pool_t; + +/** + * Picture pool configuration + */ +typedef struct { + int picture_count; + picture_t **picture; + + int (*lock)(picture_t *); + void (*unlock)(picture_t *); +} picture_pool_configuration_t; + +/** + * It creates a picture_pool_t wrapping the given configuration. + * + * It avoids useless picture creations/destructions. + * The given picture must not have a reference count greater than 1. + * The pool takes ownership of the picture and MUST not be used directly. + * When deleted, the pool will release the pictures using picture_Release. + * If defined, picture_pool_configuration_t::lock will be called before + * a picture is used, and picture_pool_configuration_t::unlock will be called + * as soon as a picture is unused. They are allowed to modify picture_t::p and + * access picture_t::p_sys. + */ +VLC_API picture_pool_t * picture_pool_NewExtended( const picture_pool_configuration_t * ) VLC_USED; + +/** + * It creates a picture_pool_t wrapping the given arrays of picture. + * + * It is provided as convenience. + */ +VLC_API picture_pool_t * picture_pool_New( int picture_count, picture_t *picture[] ) VLC_USED; + +/** + * It creates a picture_pool_t creating images using the given format. + * + * Provided for convenience. + */ +VLC_API picture_pool_t * picture_pool_NewFromFormat( const video_format_t *, int picture_count ) VLC_USED; + +/** + * It destroys a pool created by picture_pool_New. + * + * All pictures must already be released to the pool. The pool will then + * released them. + */ +VLC_API void picture_pool_Delete( picture_pool_t * ); + +/** + * It retreives a picture_t from a pool. + * + * The picture must be release by using picture_Release. + */ +VLC_API picture_t * picture_pool_Get( picture_pool_t * ) VLC_USED; + +/** + * It forces the next picture_pool_Get to return a picture even if no + * pictures are free. + * + * If b_reset is true, all pictures will be marked as free. + * + * It does it by releasing itself the oldest used picture if none is + * available. + * XXX it should be used with great care, the only reason you may need + * it is to workaround a bug. + */ +VLC_API void picture_pool_NonEmpty( picture_pool_t *, bool reset ); + +/** + * It reserves picture_count pictures from the given pool and returns + * a new pool with thoses pictures. + * + * The master pool must be full. + * The returned pool must be deleted before the master pool. + * When deleted, all pictures return to the master pool. + */ +VLC_API picture_pool_t * picture_pool_Reserve(picture_pool_t *, int picture_count) VLC_USED; + +/** + * It returns the size of the given pool. + */ +VLC_API int picture_pool_GetSize(picture_pool_t *); + + +#endif /* VLC_PICTURE_POOL_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_playlist.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_playlist.h new file mode 100644 index 0000000..6b0f684 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_playlist.h @@ -0,0 +1,412 @@ +/***************************************************************************** + * vlc_playlist.h : Playlist functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 49dcd1535bdff782f18463b5b45c80b298f8e5c5 $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PLAYLIST_H_ +#define VLC_PLAYLIST_H_ + +# ifdef __cplusplus +extern "C" { +# endif + +#include +#include + +TYPEDEF_ARRAY(playlist_item_t*, playlist_item_array_t) + +struct intf_thread_t; + +/** + * \file + * This file contain structures and function prototypes related + * to the playlist in vlc + * + * \defgroup vlc_playlist Playlist + * + * The VLC playlist system has a tree structure. This allows advanced + * categorization, like for SAP streams (which are grouped by "sap groups"). + * + * The base structure for all playlist operations is the input_item_t. This + * contains all information needed to play a stream and get info, ie, mostly, + * mrl and metadata. This structure contains a unique i_id field. ids are + * not recycled when an item is destroyed. + * + * Input items are not used directly, but through playlist items. + * The playlist items are themselves in a tree structure. They only contain + * a link to the input item, a unique id and a few flags. the playlist + * item id is NOT the same as the input item id. + * Several playlist items can be attached to a single input item. The input + * item is refcounted and is automatically destroyed when it is not used + * anymore. + * + * The top-level items are the main media sources and include: + * playlist, media library, SAP, Shoutcast, devices, ... + * + * It is envisioned that a third tree will appear: VLM, but it's not done yet + * + * The playlist also stores, for utility purposes, an array of all input + * items, an array of all playlist items and an array of all playlist items + * and nodes (both are represented by the same structure). + * + * So, here is an example: + * \verbatim + * Inputs array + * - input 1 -> name = foo 1 uri = ... + * - input 2 -> name = foo 2 uri = ... + * + * Playlist items tree + * - playlist (id 1) + * - category 1 (id 2) + * - foo 2 (id 6 - input 2) + * - media library (id 2) + * - foo 1 (id 5 - input 1) + * \endverbatim + * + * Sometimes, an item creates subitems. This happens for the directory access + * for example. In that case, if the item is under the "playlist" top-level item + * and playlist is configured to be flat then the item will be deleted and + * replaced with new subitems. If the item is under another top-level item, it + * will be transformed to a node and removed from the list of all items without + * nodes. + * + * For "standard" item addition, you can use playlist_Add, playlist_AddExt + * (more options) or playlist_AddInput if you already created your input + * item. This will add the item at the root of "Playlist" or of "Media library" + * in each of the two trees. + * + * You can create nodes with playlist_NodeCreate and can create items from + * existing input items to be placed under any node with playlist_NodeAddInput. + * + * To delete an item, use playlist_DeleteFromInput( p_item ) which will + * remove all occurrences of the input. + * + * + * The playlist defines the following event variables: + * + * - "item-change": It will contain the input_item_t->i_id of a changed input + * item monitored by the playlist. + * item being played. + * + * - "playlist-item-append": It will contain a pointer to a playlist_add_t. + * - "playlist-item-deleted": It will contain the playlist_item_t->i_id of a + * deleted playlist_item_t. + * + * - "leaf-to-parent": It will contain the playlist_item_t->i_id of an item that is transformed + * into a node. + * + * The playlist contains rate-variable which is propagated to current input if available + * also rate-slower/rate-faster is in use + * + * XXX Be really carefull, playlist_item_t->i_id and input_item_t->i_id are not + * the same. Yes, the situation is pretty bad. + * + * @{ + */ + +/** Helper structure to export to file part of the playlist */ +typedef struct playlist_export_t +{ + VLC_COMMON_MEMBERS + const char *psz_filename; + FILE *p_file; + playlist_item_t *p_root; +} playlist_export_t; + +/** playlist item / node */ +struct playlist_item_t +{ + input_item_t *p_input; /**< Linked input item */ + + playlist_item_t **pp_children; /**< Children nodes/items */ + playlist_item_t *p_parent; /**< Item parent */ + int i_children; /**< Number of children, -1 if not a node */ + + int i_id; /**< Playlist item specific id */ + uint8_t i_flags; /**< Flags \see playlist_item_flags_e */ + + playlist_t *p_playlist; /**< Parent playlist */ +}; + +typedef enum { + PLAYLIST_SAVE_FLAG = 0x0001, /**< Must it be saved */ + PLAYLIST_SKIP_FLAG = 0x0002, /**< Must playlist skip after it ? */ + PLAYLIST_DBL_FLAG = 0x0004, /**< Is it disabled ? */ + PLAYLIST_RO_FLAG = 0x0008, /**< Write-enabled ? */ + PLAYLIST_REMOVE_FLAG = 0x0010, /**< Remove this item at the end */ + PLAYLIST_EXPANDED_FLAG = 0x0020, /**< Expanded node */ + PLAYLIST_SUBITEM_STOP_FLAG = 0x0040, /**< Must playlist stop if the item gets subitems ?*/ +} playlist_item_flags_e; + +/** Playlist status */ +typedef enum +{ PLAYLIST_STOPPED,PLAYLIST_RUNNING,PLAYLIST_PAUSED } playlist_status_t; + +/** Structure containing information about the playlist */ +struct playlist_t +{ + VLC_COMMON_MEMBERS + + playlist_item_array_t items; /**< Arrays of items */ + playlist_item_array_t all_items; /**< Array of items and nodes */ + + playlist_item_array_t current; /**< Items currently being played */ + int i_current_index; /**< Index in current array */ + + /* Predefined items */ + playlist_item_t * p_root; + playlist_item_t * p_playing; + playlist_item_t * p_media_library; + + //Phony ones, point to those above; + playlist_item_t * p_root_category; /**< Root of category tree */ + playlist_item_t * p_root_onelevel; /**< Root of onelevel tree */ + playlist_item_t * p_local_category; /** < "Playlist" in CATEGORY view */ + playlist_item_t * p_ml_category; /** < "Library" in CATEGORY view */ + playlist_item_t * p_local_onelevel; /** < "Playlist" in ONELEVEL view */ + playlist_item_t * p_ml_onelevel; /** < "Library" in ONELEVEL view */ +}; + +/** Helper to add an item */ +struct playlist_add_t +{ + int i_node; /**< Playist id of the parent node */ + int i_item; /**< Playist id of the playlist_item_t */ +}; + +/* A bit of macro magic to generate an enum out of the following list, + * and later, to generate a list of static functions out of the same list. + * There is also SORT_RANDOM, which is always last and handled specially. + */ +#define VLC_DEFINE_SORT_FUNCTIONS \ + DEF( SORT_ID )\ + DEF( SORT_TITLE )\ + DEF( SORT_TITLE_NODES_FIRST )\ + DEF( SORT_ARTIST )\ + DEF( SORT_GENRE )\ + DEF( SORT_DURATION )\ + DEF( SORT_TITLE_NUMERIC )\ + DEF( SORT_ALBUM )\ + DEF( SORT_TRACK_NUMBER )\ + DEF( SORT_DESCRIPTION )\ + DEF( SORT_RATING )\ + DEF( SORT_URI ) + +#define DEF( s ) s, +enum +{ + VLC_DEFINE_SORT_FUNCTIONS + SORT_RANDOM, + NUM_SORT_FNS=SORT_RANDOM +}; +#undef DEF +#ifndef VLC_INTERNAL_PLAYLIST_SORT_FUNCTIONS +#undef VLC_DEFINE_SORT_FUNCTIONS +#endif + +enum +{ + ORDER_NORMAL = 0, + ORDER_REVERSE = 1, +}; + +/* Used by playlist_Import */ +#define PLAYLIST_INSERT 0x0001 +#define PLAYLIST_APPEND 0x0002 +#define PLAYLIST_GO 0x0004 +#define PLAYLIST_PREPARSE 0x0008 +#define PLAYLIST_SPREPARSE 0x0010 +#define PLAYLIST_NO_REBUILD 0x0020 + +#define PLAYLIST_END -666 + +enum pl_locked_state +{ + pl_Locked = true, + pl_Unlocked = false +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/* Helpers */ +#define PL_LOCK playlist_Lock( p_playlist ) +#define PL_UNLOCK playlist_Unlock( p_playlist ) +#define PL_ASSERT_LOCKED playlist_AssertLocked( p_playlist ) + +/* Playlist control */ +#define playlist_Play(p) playlist_Control(p,PLAYLIST_PLAY, pl_Unlocked ) +#define playlist_Pause(p) playlist_Control(p,PLAYLIST_PAUSE, pl_Unlocked ) +#define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP, pl_Unlocked ) +#define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, 1) +#define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, -1) +#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, (i) ) + +VLC_API void playlist_Lock( playlist_t * ); +VLC_API void playlist_Unlock( playlist_t * ); +VLC_API void playlist_AssertLocked( playlist_t * ); +VLC_API void playlist_Deactivate( playlist_t * ); + +/** + * Do a playlist action. + * If there is something in the playlist then you can do playlist actions. + * Possible queries are listed in vlc_common.h + * \param p_playlist the playlist to do the command on + * \param i_query the command to do + * \param b_locked TRUE if playlist is locked when entering this function + * \param variable number of arguments + * \return VLC_SUCCESS or an error + */ +VLC_API int playlist_Control( playlist_t *p_playlist, int i_query, bool b_locked, ... ); + +/** Get current playing input. The object is retained. + */ +VLC_API input_thread_t * playlist_CurrentInput( playlist_t *p_playlist ) VLC_USED; + +/** Get the duration of all items in a node. + */ +VLC_API mtime_t playlist_GetNodeDuration( playlist_item_t * ); + +/** Clear the playlist + * \param b_locked TRUE if playlist is locked when entering this function + */ +VLC_API void playlist_Clear( playlist_t *, bool ); + +/* Playlist sorting */ +VLC_API int playlist_TreeMove( playlist_t *, playlist_item_t *, playlist_item_t *, int ); +VLC_API int playlist_TreeMoveMany( playlist_t *, int, playlist_item_t **, playlist_item_t *, int ); +VLC_API int playlist_RecursiveNodeSort( playlist_t *, playlist_item_t *,int, int ); + +VLC_API playlist_item_t * playlist_CurrentPlayingItem( playlist_t * ) VLC_USED; +VLC_API int playlist_Status( playlist_t * ); + +/** + * Export a node of the playlist to a certain type of playlistfile + * \param p_playlist the playlist to export + * \param psz_filename the location where the exported file will be saved + * \param p_export_root the root node to export + * \param psz_type the type of playlist file to create (m3u, pls, ..) + * \return VLC_SUCCESS on success + */ +VLC_API int playlist_Export( playlist_t *p_playlist, const char *psz_name, playlist_item_t *p_export_root, const char *psz_type ); + +/** + * Open a playlist file, add its content to the current playlist + */ +VLC_API int playlist_Import( playlist_t *p_playlist, const char *psz_file ); + +/********************** Services discovery ***********************/ + +/** Add a list of comma-separated service discovery modules */ +VLC_API int playlist_ServicesDiscoveryAdd(playlist_t *, const char *); +/** Remove a services discovery module by name */ +VLC_API int playlist_ServicesDiscoveryRemove(playlist_t *, const char *); +/** Check whether a given SD is loaded */ +VLC_API bool playlist_IsServicesDiscoveryLoaded( playlist_t *,const char *) VLC_DEPRECATED; +/** Query a services discovery */ +VLC_API int playlist_ServicesDiscoveryControl( playlist_t *, const char *, int, ... ); + + + +/******************************************************** + * Item management + ********************************************************/ + +/*************************** Item deletion **************************/ +VLC_API int playlist_DeleteFromInput( playlist_t *, input_item_t *, bool ); + +/******************** Item addition ********************/ +VLC_API int playlist_Add( playlist_t *, const char *, const char *, int, int, bool, bool ); +VLC_API int playlist_AddExt( playlist_t *, const char *, const char *, int, int, mtime_t, int, const char *const *, unsigned, bool, bool ); +VLC_API int playlist_AddInput( playlist_t *, input_item_t *, int, int, bool, bool ); +VLC_API playlist_item_t * playlist_NodeAddInput( playlist_t *, input_item_t *, playlist_item_t *, int, int, bool ); +VLC_API int playlist_NodeAddCopy( playlist_t *, playlist_item_t *, playlist_item_t *, int ); + +/********************************** Item search *************************/ +VLC_API playlist_item_t * playlist_ItemGetById(playlist_t *, int ) VLC_USED; +VLC_API playlist_item_t * playlist_ItemGetByInput(playlist_t *,input_item_t * ) VLC_USED; + +VLC_API int playlist_LiveSearchUpdate(playlist_t *, playlist_item_t *, const char *, bool ); + +/******************************************************** + * Tree management + ********************************************************/ +/* Node management */ +VLC_API playlist_item_t * playlist_NodeCreate( playlist_t *, const char *, playlist_item_t * p_parent, int i_pos, int i_flags, input_item_t * ); +VLC_API int playlist_NodeAppend(playlist_t *,playlist_item_t*,playlist_item_t *); +VLC_API int playlist_NodeInsert(playlist_t *,playlist_item_t*,playlist_item_t *, int); +VLC_API int playlist_NodeRemoveItem(playlist_t *,playlist_item_t*,playlist_item_t *); +VLC_API playlist_item_t * playlist_ChildSearchName(playlist_item_t*, const char* ) VLC_USED; +VLC_API int playlist_NodeDelete( playlist_t *, playlist_item_t *, bool , bool ); + +VLC_API playlist_item_t * playlist_GetNextLeaf( playlist_t *p_playlist, playlist_item_t *p_root, playlist_item_t *p_item, bool b_ena, bool b_unplayed ) VLC_USED; +VLC_API playlist_item_t * playlist_GetPrevLeaf( playlist_t *p_playlist, playlist_item_t *p_root, playlist_item_t *p_item, bool b_ena, bool b_unplayed ) VLC_USED; + +/************************** + * Audio output management + **************************/ + +VLC_API audio_output_t *playlist_GetAout( playlist_t * ); + +#define AOUT_VOLUME_DEFAULT 256 +#define AOUT_VOLUME_MAX 512 + +VLC_API float playlist_VolumeGet( playlist_t * ); +VLC_API int playlist_VolumeSet( playlist_t *, float ); +VLC_API int playlist_VolumeUp( playlist_t *, int, float * ); +#define playlist_VolumeDown(a, b, c) playlist_VolumeUp(a, -(b), c) +VLC_API int playlist_MuteSet( playlist_t *, bool ); +VLC_API int playlist_MuteGet( playlist_t * ); + +static inline int playlist_MuteToggle( playlist_t *pl ) +{ + int val = playlist_MuteGet( pl ); + if (val >= 0) + val = playlist_MuteSet( pl, !val ); + return val; +} + +VLC_API void playlist_EnableAudioFilter( playlist_t *, const char *, bool ); + +/*********************************************************************** + * Inline functions + ***********************************************************************/ +/** Tell if the playlist is empty */ +static inline bool playlist_IsEmpty( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->items.i_size == 0; +} + +/** Tell the number of items in the current playing context */ +static inline int playlist_CurrentSize( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->current.i_size; +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_plugin.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_plugin.h new file mode 100644 index 0000000..14c48f0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_plugin.h @@ -0,0 +1,538 @@ +/***************************************************************************** + * vlc_plugin.h : Macros used from within a module. + ***************************************************************************** + * Copyright (C) 2001-2006 VLC authors and VideoLAN + * Copyright © 2007-2009 Rémi Denis-Courmont + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MODULES_MACROS_H +# define LIBVLC_MODULES_MACROS_H 1 + +/** + * \file + * This file implements plugin (module) macros used to define a vlc module. + */ + +enum vlc_module_properties +{ + VLC_MODULE_CREATE, + VLC_CONFIG_CREATE, + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_MODULE_CPU_REQUIREMENT=0x100, + VLC_MODULE_SHORTCUT, + VLC_MODULE_CAPABILITY, + VLC_MODULE_SCORE, + VLC_MODULE_CB_OPEN, + VLC_MODULE_CB_CLOSE, + VLC_MODULE_NO_UNLOAD, + VLC_MODULE_NAME, + VLC_MODULE_SHORTNAME, + VLC_MODULE_DESCRIPTION, + VLC_MODULE_HELP, + VLC_MODULE_TEXTDOMAIN, + /* Insert new VLC_MODULE_* here */ + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_CONFIG_NAME=0x1000, + /* command line name (args=const char *) */ + + VLC_CONFIG_VALUE, + /* actual value (args=int/double/const char *) */ + + VLC_CONFIG_RANGE, + /* minimum value (args=int/double/const char * twice) */ + + VLC_CONFIG_ADVANCED, + /* enable advanced flag (args=none) */ + + VLC_CONFIG_VOLATILE, + /* don't write variable to storage (args=none) */ + + VLC_CONFIG_PERSISTENT_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_PRIVATE, + /* hide from user (args=none) */ + + VLC_CONFIG_REMOVED, + /* tag as no longer supported (args=none) */ + + VLC_CONFIG_CAPABILITY, + /* capability for a module or list thereof (args=const char*) */ + + VLC_CONFIG_SHORTCUT, + /* one-character (short) command line option name (args=char) */ + + VLC_CONFIG_OLDNAME_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_SAFE, + /* tag as modifiable by untrusted input item "sources" (args=none) */ + + VLC_CONFIG_DESC, + /* description (args=const char *, const char *, const char *) */ + + VLC_CONFIG_LIST_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_ADD_ACTION_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_LIST, + /* list of suggested values + * (args=size_t, const *, const char *const *) */ + + VLC_CONFIG_LIST_CB, + /* callback for suggested values + * (args=size_t (*)(vlc_object_t *, **, char ***)) */ + + /* Insert new VLC_CONFIG_* here */ +}; + +/* Configuration hint types */ +#define CONFIG_HINT_CATEGORY 0x02 /* Start of new category */ +#define CONFIG_HINT_USAGE 0x05 /* Usage information */ + +#define CONFIG_CATEGORY 0x06 /* Set category */ +#define CONFIG_SUBCATEGORY 0x07 /* Set subcategory */ +#define CONFIG_SECTION 0x08 /* Start of new section */ + +/* Configuration item types */ +#define CONFIG_ITEM_FLOAT 0x20 /* Float option */ +#define CONFIG_ITEM_INTEGER 0x40 /* Integer option */ +#define CONFIG_ITEM_RGB 0x41 /* RGB color option */ +#define CONFIG_ITEM_BOOL 0x60 /* Bool option */ +#define CONFIG_ITEM_STRING 0x80 /* String option */ +#define CONFIG_ITEM_PASSWORD 0x81 /* Password option (*) */ +#define CONFIG_ITEM_KEY 0x82 /* Hot key option */ +#define CONFIG_ITEM_MODULE 0x84 /* Module option */ +#define CONFIG_ITEM_MODULE_CAT 0x85 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST 0x86 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST_CAT 0x87 /* Module option */ +#define CONFIG_ITEM_LOADFILE 0x8C /* Read file option */ +#define CONFIG_ITEM_SAVEFILE 0x8D /* Written file option */ +#define CONFIG_ITEM_DIRECTORY 0x8E /* Directory option */ +#define CONFIG_ITEM_FONT 0x8F /* Font option */ + +#define CONFIG_ITEM(x) (((x) & ~0xF) != 0) + +/* Categories and subcategories */ +#define CAT_INTERFACE 1 +#define SUBCAT_INTERFACE_GENERAL 101 +#define SUBCAT_INTERFACE_MAIN 102 +#define SUBCAT_INTERFACE_CONTROL 103 +#define SUBCAT_INTERFACE_HOTKEYS 104 + +#define CAT_AUDIO 2 +#define SUBCAT_AUDIO_GENERAL 201 +#define SUBCAT_AUDIO_AOUT 202 +#define SUBCAT_AUDIO_AFILTER 203 +#define SUBCAT_AUDIO_VISUAL 204 +#define SUBCAT_AUDIO_MISC 205 + +#define CAT_VIDEO 3 +#define SUBCAT_VIDEO_GENERAL 301 +#define SUBCAT_VIDEO_VOUT 302 +#define SUBCAT_VIDEO_VFILTER 303 +#define SUBCAT_VIDEO_SUBPIC 305 + +#define CAT_INPUT 4 +#define SUBCAT_INPUT_GENERAL 401 +#define SUBCAT_INPUT_ACCESS 402 +#define SUBCAT_INPUT_DEMUX 403 +#define SUBCAT_INPUT_VCODEC 404 +#define SUBCAT_INPUT_ACODEC 405 +#define SUBCAT_INPUT_SCODEC 406 +#define SUBCAT_INPUT_STREAM_FILTER 407 + +#define CAT_SOUT 5 +#define SUBCAT_SOUT_GENERAL 501 +#define SUBCAT_SOUT_STREAM 502 +#define SUBCAT_SOUT_MUX 503 +#define SUBCAT_SOUT_ACO 504 +#define SUBCAT_SOUT_PACKETIZER 505 +#define SUBCAT_SOUT_VOD 507 + +#define CAT_ADVANCED 6 +#define SUBCAT_ADVANCED_MISC 602 +#define SUBCAT_ADVANCED_NETWORK 603 + +#define CAT_PLAYLIST 7 +#define SUBCAT_PLAYLIST_GENERAL 701 +#define SUBCAT_PLAYLIST_SD 702 +#define SUBCAT_PLAYLIST_EXPORT 703 + + +/** + * Current plugin ABI version + */ +# define MODULE_SYMBOL 2_2_0b +# define MODULE_SUFFIX "__2_2_0b" + +/***************************************************************************** + * Add a few defines. You do not want to read this section. Really. + *****************************************************************************/ + +/* Explanation: + * + * if linking a module statically, we will need: + * #define MODULE_FUNC( zog ) module_foo_zog + * + * this can't easily be done with the C preprocessor, thus a few ugly hacks. + */ + +/* I need to do _this_ to change « foo bar » to « module_foo_bar » ! */ +#define CONCATENATE( y, z ) CRUDE_HACK( y, z ) +#define CRUDE_HACK( y, z ) y##__##z + +/* If the module is built-in, then we need to define foo_InitModule instead + * of InitModule. Same for Activate- and DeactivateModule. */ +#ifdef __PLUGIN__ +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_SYMBOL ) +#else +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_NAME ) +#endif + +#define CDECL_SYMBOL +#if defined (__PLUGIN__) +# if defined (_WIN32) +# define DLL_SYMBOL __declspec(dllexport) +# undef CDECL_SYMBOL +# define CDECL_SYMBOL __cdecl +# elif VLC_GCC_VERSION(4,0) +# define DLL_SYMBOL __attribute__((visibility("default"))) +# else +# define DLL_SYMBOL +# endif +#else +# define DLL_SYMBOL +#endif + +#if defined( __cplusplus ) +# define EXTERN_SYMBOL extern "C" +#else +# define EXTERN_SYMBOL +#endif + +typedef int (*vlc_set_cb) (void *, void *, int, ...); + +#define vlc_plugin_set(...) vlc_set (opaque, NULL, __VA_ARGS__) +#define vlc_module_set(...) vlc_set (opaque, module, __VA_ARGS__) +#define vlc_config_set(...) vlc_set (opaque, config, __VA_ARGS__) + +/* + * InitModule: this function is called once and only once, when the module + * is looked at for the first time. We get the useful data from it, for + * instance the module name, its shortcuts, its capabilities... we also create + * a copy of its config because the module can be unloaded at any time. + */ +#define vlc_module_begin() \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \ +{ \ + module_t *module; \ + module_config_t *config = NULL; \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; \ + if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \ + goto error; + +#define vlc_module_end() \ + (void) config; \ + return 0; \ +error: \ + return -1; \ +} \ +VLC_METADATA_EXPORTS + +#define add_submodule( ) \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; + +#define add_shortcut( ... ) \ +{ \ + const char *shortcuts[] = { __VA_ARGS__ }; \ + if (vlc_module_set (VLC_MODULE_SHORTCUT, \ + sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts)) \ + goto error; \ +} + +#define set_shortname( shortname ) \ + if (vlc_module_set (VLC_MODULE_SHORTNAME, (const char *)(shortname))) \ + goto error; + +#define set_description( desc ) \ + if (vlc_module_set (VLC_MODULE_DESCRIPTION, (const char *)(desc))) \ + goto error; + +#define set_help( help ) \ + if (vlc_module_set (VLC_MODULE_HELP, (const char *)(help))) \ + goto error; + +#define set_capability( cap, score ) \ + if (vlc_module_set (VLC_MODULE_CAPABILITY, (const char *)(cap)) \ + || vlc_module_set (VLC_MODULE_SCORE, (int)(score))) \ + goto error; + +#define set_callbacks( activate, deactivate ) \ + if (vlc_module_set (VLC_MODULE_CB_OPEN, activate) \ + || vlc_module_set (VLC_MODULE_CB_CLOSE, deactivate)) \ + goto error; + +#define cannot_unload_broken_library( ) \ + if (vlc_module_set (VLC_MODULE_NO_UNLOAD)) \ + goto error; + +#define set_text_domain( dom ) \ + if (vlc_plugin_set (VLC_MODULE_TEXTDOMAIN, (dom))) \ + goto error; + +/***************************************************************************** + * Macros used to build the configuration structure. + * + * Note that internally we support only 3 types of config data: int, float + * and string. + * The other types declared here just map to one of these 3 basic types but + * have the advantage of also providing very good hints to a configuration + * interface so as to make it more user friendly. + * The configuration structure also includes category hints. These hints can + * provide a configuration interface with some very useful data and again + * allow for a more user friendly interface. + *****************************************************************************/ + +#define add_type_inner( type ) \ + vlc_plugin_set (VLC_CONFIG_CREATE, (type), &config); + +#define add_typedesc_inner( type, text, longtext ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_DESC, \ + (const char *)(text), (const char *)(longtext)); + +#define add_typeadv_inner( type, text, longtext, advc ) \ + add_typedesc_inner( type, text, longtext ) \ + if (advc) vlc_config_set (VLC_CONFIG_ADVANCED); + +#define add_typename_inner( type, name, text, longtext, advc ) \ + add_typeadv_inner( type, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); + +#define add_string_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (const char *)(v)); + +#define add_int_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(v)); + + +#define set_category( i_id ) \ + add_type_inner( CONFIG_CATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_subcategory( i_id ) \ + add_type_inner( CONFIG_SUBCATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_section( text, longtext ) \ + add_typedesc_inner( CONFIG_SECTION, text, longtext ) + +#define add_category_hint( text, longtext, advc ) \ + add_typeadv_inner( CONFIG_HINT_CATEGORY, text, longtext, advc ) + +#define add_usage_hint( text ) \ + add_typedesc_inner( CONFIG_HINT_USAGE, text, NULL ) + +#define add_string( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_STRING, name, text, longtext, advc, \ + value ) + +#define add_password( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_PASSWORD, name, text, longtext, advc, \ + value ) + +#define add_loadfile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_LOADFILE, name, text, longtext, advc, \ + value ) + +#define add_savefile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_SAVEFILE, name, text, longtext, advc, \ + value ) + +#define add_directory( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_DIRECTORY, name, text, longtext, advc, \ + value ) + +#define add_font( name, value, text, longtext, advc )\ + add_string_inner( CONFIG_ITEM_FONT, name, text, longtext, advc, \ + value ) + +#define add_module( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#define add_module_list( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#ifndef __PLUGIN__ +#define add_module_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_CAT, name, text, longtext, advc, \ + value ) \ + change_integer_range (i_subcategory /* gruik */, 0); + +#define add_module_list_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST_CAT, name, text, longtext, \ + advc, value ) \ + change_integer_range (i_subcategory /* gruik */, 0); +#endif + +#define add_integer( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_INTEGER, name, text, longtext, advc, value ) + +#define add_rgb( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_RGB, name, text, longtext, advc, value ) \ + change_integer_range( 0, 0xFFFFFF ) + +#define add_key( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_KEY, "global-" name, text, longtext, advc, \ + KEY_UNSET ) \ + add_string_inner( CONFIG_ITEM_KEY, name, text, longtext, advc, value ) + +#define add_integer_with_range( name, value, i_min, i_max, text, longtext, advc ) \ + add_integer( name, value, text, longtext, advc ) \ + change_integer_range( i_min, i_max ) + +#define add_float( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_FLOAT, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (double)(v)); + +#define add_float_with_range( name, value, f_min, f_max, text, longtext, advc ) \ + add_float( name, value, text, longtext, advc ) \ + change_float_range( f_min, f_max ) + +#define add_bool( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_BOOL, name, text, longtext, advc ) \ + if (v) vlc_config_set (VLC_CONFIG_VALUE, (int64_t)true); + +/* For removed option */ +#define add_obsolete_inner( name, type ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); \ + vlc_config_set (VLC_CONFIG_REMOVED); + +#define add_obsolete_bool( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_BOOL ) + +#define add_obsolete_integer( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_INTEGER ) + +#define add_obsolete_float( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_FLOAT ) + +#define add_obsolete_string( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_STRING ) + +/* Modifier macros for the config options (used for fine tuning) */ + +#define change_short( ch ) \ + vlc_config_set (VLC_CONFIG_SHORTCUT, (int)(ch)); + +#define change_string_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (char *)), \ + (const char *const *)(list), \ + (const char *const *)(list_text)); + +#define change_string_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, (cb)); + +#define change_integer_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (int)), \ + (const int *)(list), \ + (const char *const *)(list_text)); + +#define change_integer_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, (cb)); + +#define change_integer_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (int64_t)(minv), (int64_t)(maxv)); + +#define change_float_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (double)(minv), (double)(maxv)); + +#define change_action_add( pf_action, text ) \ + (void)(pf_action, text); + +/* For options that are saved but hidden from the preferences panel */ +#define change_private() \ + vlc_config_set (VLC_CONFIG_PRIVATE); + +/* For options that cannot be saved in the configuration */ +#define change_volatile() \ + change_private() \ + vlc_config_set (VLC_CONFIG_VOLATILE); + +#define change_safe() \ + vlc_config_set (VLC_CONFIG_SAFE); + +/* Meta data plugin exports */ +#define VLC_META_EXPORT( name, value ) \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void); \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void) \ + { \ + return value; \ + } + +#if defined (__LIBVLC__) +# define VLC_COPYRIGHT_EXPORT VLC_META_EXPORT (copyright, \ + "\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x74\x68" \ + "\x65\x20\x56\x69\x64\x65\x6f\x4c\x41\x4e\x20\x56\x4c\x43\x20\x6d" \ + "\x65\x64\x69\x61\x20\x70\x6c\x61\x79\x65\x72\x20\x64\x65\x76\x65" \ + "\x6c\x6f\x70\x65\x72\x73" ) +# define VLC_LICENSE_EXPORT VLC_META_EXPORT (license, \ + "\x4c\x69\x63\x65\x6e\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74" \ + "\x68\x65\x20\x74\x65\x72\x6d\x73\x20\x6f\x66\x20\x74\x68\x65\x20" \ + "\x47\x4e\x55\x20\x4c\x65\x73\x73\x65\x72\x20\x47\x65\x6e\x65\x72" \ + "\x61\x6c\x20\x50\x75\x62\x6c\x69\x63\x20\x4c\x69\x63\x65\x6e\x73" \ + "\x65\x2c\x20\x76\x65\x72\x73\x69\x6f\x6e\x20\x32\x2e\x31\x20\x6f" \ + "\x72\x20\x6c\x61\x74\x65\x72\x2e" ) +#else +# if !defined (VLC_COPYRIGHT_EXPORT) +# define VLC_COPYRIGHT_EXPORT +# endif +# if !defined (VLC_LICENSE_EXPORT) +# define VLC_LICENSE_EXPORT +# endif +#endif + +#define VLC_METADATA_EXPORTS \ + VLC_COPYRIGHT_EXPORT \ + VLC_LICENSE_EXPORT + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_probe.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_probe.h new file mode 100644 index 0000000..efa4d97 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_probe.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * vlc_probe.h: service probing interface + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PROBE_H +# define VLC_PROBE_H 1 + +# include + +/** + * \file + * This file defines functions and structures to run-time probe VLC extensions + */ + +# ifdef __cplusplus +extern "C" { +# endif + +void *vlc_probe (vlc_object_t *, const char *, size_t *); +#define vlc_probe(obj, cap, pcount) \ + vlc_probe(VLC_OBJECT(obj), cap, pcount) + +struct vlc_probe_t +{ + VLC_COMMON_MEMBERS + + void *list; + size_t count; +}; + +typedef struct vlc_probe_t vlc_probe_t; + +static inline int vlc_probe_add(vlc_probe_t *obj, const void *data, + size_t len) +{ + char *tab = (char *)realloc (obj->list, (obj->count + 1) * len); + + if (unlikely(tab == NULL)) + return VLC_ENOMEM; + memcpy(tab + (obj->count * len), data, len); + obj->list = tab; + obj->count++; + return VLC_SUCCESS; +} + +# define VLC_PROBE_CONTINUE VLC_EGENERIC +# define VLC_PROBE_STOP VLC_SUCCESS + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_rand.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_rand.h new file mode 100644 index 0000000..761cee5 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_rand.h @@ -0,0 +1,37 @@ +/***************************************************************************** + * vlc_rand.h: RNG + ***************************************************************************** + * Copyright © 2007 Rémi Denis-Courmont + * $Id: 3ae95ac04c55f46d116481eb89255b013f6d1c32 $ + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_RAND_H +# define VLC_RAND_H + +/** + * \file + * This file defined random number generator function in vlc + */ + +VLC_API void vlc_rand_bytes(void *buf, size_t len); + +/* Interlocked (but not reproducible) functions for the POSIX PRNG */ +VLC_API double vlc_drand48(void) VLC_USED; +VLC_API long vlc_lrand48(void) VLC_USED; +VLC_API long vlc_mrand48(void) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_services_discovery.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_services_discovery.h new file mode 100644 index 0000000..3652230 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_services_discovery.h @@ -0,0 +1,185 @@ +/***************************************************************************** + * vlc_services_discovery.h : Services Discover functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: d9c231b28f3ec075343e0f8016792b8fa33f60f5 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SERVICES_DISCOVERY_H_ +#define VLC_SERVICES_DISCOVERY_H_ + +#include +#include +#include + +/** + * \file + * This file lists functions and structures for service discovery (SD) in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * @{ + */ + +/** + * Main service discovery structure to build a SD module + */ +struct services_discovery_t +{ + VLC_COMMON_MEMBERS + module_t * p_module; /**< Loaded module */ + + /**< Event manager + * You should access it through setters, outside of the core */ + vlc_event_manager_t event_manager; + + char *psz_name; /**< Main name of the SD */ + config_chain_t *p_cfg; /**< Configuration for the SD */ + + /** Control function + * \see services_discovery_command_e + */ + int ( *pf_control ) ( services_discovery_t *, int, va_list ); + + services_discovery_sys_t *p_sys; /**< Custom private data */ +}; + +/** + * Service discovery categories + * \see vlc_sd_probe_Add + */ +enum services_discovery_category_e +{ + SD_CAT_DEVICES = 1, /**< Devices, like portable music players */ + SD_CAT_LAN, /**< LAN/WAN services, like Upnp or SAP */ + SD_CAT_INTERNET, /**< Internet or Website channels services */ + SD_CAT_MYCOMPUTER /**< Computer services, like Discs or Apps */ +}; + +/** + * Service discovery control commands + */ +enum services_discovery_command_e +{ + SD_CMD_SEARCH = 1, /**< arg1 = query */ + SD_CMD_DESCRIPTOR /**< arg1 = services_discovery_descriptor_t* */ +}; + +/** + * Service discovery capabilities + */ +enum services_discovery_capability_e +{ + SD_CAP_SEARCH = 1 /**< One can search in the SD */ +}; + +/** + * Service discovery descriptor + * \see services_discovery_command_e + */ +typedef struct +{ + char *psz_short_desc; /**< The short description, human-readable */ + char *psz_icon_url; /**< URL to the icon that represents it */ + char *psz_url; /**< URL for the service */ + int i_capabilities; /**< \see services_discovery_capability_e */ +} services_discovery_descriptor_t; + + +/*********************************************************************** + * Service Discovery + ***********************************************************************/ + +/** + * Ask for a research in the SD + * @param p_sd: the Service Discovery + * @param i_control: the command to issue + * @param args: the argument list + * @return VLC_SUCCESS in case of success, the error code overwise + */ +static inline int vlc_sd_control( services_discovery_t *p_sd, int i_control, va_list args ) +{ + if( p_sd->pf_control ) + return p_sd->pf_control( p_sd, i_control, args ); + else + return VLC_EGENERIC; +} + +/* Get the services discovery modules names to use in Create(), in a null + * terminated string array. Array and string must be freed after use. */ +VLC_API char ** vlc_sd_GetNames( vlc_object_t *, char ***, int ** ) VLC_USED; +#define vlc_sd_GetNames(obj, pln, pcat ) \ + vlc_sd_GetNames(VLC_OBJECT(obj), pln, pcat) + +/* Creation of a services_discovery object */ +VLC_API services_discovery_t * vlc_sd_Create( vlc_object_t *, const char * ) VLC_USED; +VLC_API bool vlc_sd_Start( services_discovery_t * ); +VLC_API void vlc_sd_Stop( services_discovery_t * ); +VLC_API void vlc_sd_Destroy( services_discovery_t * ); + +/** + * Helper to stop and destroy the Service Discovery + */ +static inline void vlc_sd_StopAndDestroy( services_discovery_t * p_this ) +{ + vlc_sd_Stop( p_this ); + vlc_sd_Destroy( p_this ); +} + +/* Read info from discovery object */ +VLC_API char * services_discovery_GetLocalizedName( services_discovery_t * p_this ) VLC_USED; + +/* Receive event notification (preferred way to get new items) */ +VLC_API vlc_event_manager_t * services_discovery_EventManager( services_discovery_t * p_this ) VLC_USED; + +/* Used by services_discovery to post update about their items */ + /* About the psz_category, it is a legacy way to add info to the item, + * for more options, directly set the (meta) data on the input item */ +VLC_API void services_discovery_AddItem( services_discovery_t * p_this, input_item_t * p_item, const char * psz_category ); +VLC_API void services_discovery_RemoveItem( services_discovery_t * p_this, input_item_t * p_item ); +VLC_API void services_discovery_RemoveAll( services_discovery_t * p_sd ); + + +/* SD probing */ + +VLC_API int vlc_sd_probe_Add(vlc_probe_t *, const char *, const char *, int category); + +#define VLC_SD_PROBE_SUBMODULE \ + add_submodule() \ + set_capability( "services probe", 100 ) \ + set_callbacks( vlc_sd_probe_Open, NULL ) + +#define VLC_SD_PROBE_HELPER(name, longname, cat) \ +static int vlc_sd_probe_Open (vlc_object_t *obj) \ +{ \ + return vlc_sd_probe_Add ((struct vlc_probe_t *)obj, \ + name "{longname=\"" longname "\"}", \ + longname, cat); \ +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_sout.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_sout.h new file mode 100644 index 0000000..7df3a52 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_sout.h @@ -0,0 +1,252 @@ +/***************************************************************************** + * vlc_sout.h : stream output module + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: b9366f790374562525f49d5449ec882fff348ddf $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Eric Petit + * Jean-Paul Saman + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SOUT_H_ +#define VLC_SOUT_H_ + +/** + * \file + * This file defines structures and functions for stream output in vlc + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** Stream output instance (FIXME: should be private to src/ to avoid + * invalid unsynchronized access) */ +struct sout_instance_t +{ + VLC_COMMON_MEMBERS + + char *psz_sout; + + /** count of output that can't control the space */ + int i_out_pace_nocontrol; + + vlc_mutex_t lock; + sout_stream_t *p_stream; +}; + +/**************************************************************************** + * sout_stream_id_sys_t: opaque (private for all sout_stream_t) + ****************************************************************************/ +typedef struct sout_stream_id_sys_t sout_stream_id_sys_t; + +/** Stream output access_output */ +struct sout_access_out_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + char *psz_access; + + char *psz_path; + sout_access_out_sys_t *p_sys; + int (*pf_seek)( sout_access_out_t *, off_t ); + ssize_t (*pf_read)( sout_access_out_t *, block_t * ); + ssize_t (*pf_write)( sout_access_out_t *, block_t * ); + int (*pf_control)( sout_access_out_t *, int, va_list ); + + config_chain_t *p_cfg; +}; + +enum access_out_query_e +{ + ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */ + ACCESS_OUT_CAN_SEEK, /* arg1=bool *, can fail (assume true) */ +}; + +VLC_API sout_access_out_t * sout_AccessOutNew( vlc_object_t *, const char *psz_access, const char *psz_name ) VLC_USED; +#define sout_AccessOutNew( obj, access, name ) \ + sout_AccessOutNew( VLC_OBJECT(obj), access, name ) +VLC_API void sout_AccessOutDelete( sout_access_out_t * ); +VLC_API int sout_AccessOutSeek( sout_access_out_t *, off_t ); +VLC_API ssize_t sout_AccessOutRead( sout_access_out_t *, block_t * ); +VLC_API ssize_t sout_AccessOutWrite( sout_access_out_t *, block_t * ); +VLC_API int sout_AccessOutControl( sout_access_out_t *, int, ... ); + +static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao ) +{ + bool b; + if( sout_AccessOutControl( p_ao, ACCESS_OUT_CONTROLS_PACE, &b ) ) + return true; + return b; +} + +/** Muxer structure */ +struct sout_mux_t +{ + VLC_COMMON_MEMBERS + module_t *p_module; + + sout_instance_t *p_sout; + + char *psz_mux; + config_chain_t *p_cfg; + + sout_access_out_t *p_access; + + int (*pf_addstream)( sout_mux_t *, sout_input_t * ); + int (*pf_delstream)( sout_mux_t *, sout_input_t * ); + int (*pf_mux) ( sout_mux_t * ); + int (*pf_control) ( sout_mux_t *, int, va_list ); + + /* here are all inputs accepted by muxer */ + int i_nb_inputs; + sout_input_t **pp_inputs; + + /* mux private */ + sout_mux_sys_t *p_sys; + + /* XXX private to stream_output.c */ + /* if muxer doesn't support adding stream at any time then we first wait + * for stream then we refuse all stream and start muxing */ + bool b_add_stream_any_time; + bool b_waiting_stream; + /* we wait one second after first stream added */ + mtime_t i_add_stream_start; +}; + +enum sout_mux_query_e +{ + /* capabilities */ + MUX_CAN_ADD_STREAM_WHILE_MUXING, /* arg1= bool *, res=cannot fail */ + /* properties */ + MUX_GET_ADD_STREAM_WAIT, /* arg1= bool *, res=cannot fail */ + MUX_GET_MIME, /* arg1= char ** res=can fail */ +}; + +struct sout_input_t +{ + es_format_t *p_fmt; + block_fifo_t *p_fifo; + + void *p_sys; +}; + + +VLC_API sout_mux_t * sout_MuxNew( sout_instance_t*, const char *, sout_access_out_t * ) VLC_USED; +VLC_API sout_input_t * sout_MuxAddStream( sout_mux_t *, es_format_t * ) VLC_USED; +VLC_API void sout_MuxDeleteStream( sout_mux_t *, sout_input_t * ); +VLC_API void sout_MuxDelete( sout_mux_t * ); +VLC_API int sout_MuxSendBuffer( sout_mux_t *, sout_input_t *, block_t * ); +VLC_API int sout_MuxGetStream(sout_mux_t *, int , mtime_t *); + +static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = p_mux->pf_control( p_mux, i_query, args ); + va_end( args ); + return i_result; +} + +/**************************************************************************** + * sout_stream: + ****************************************************************************/ +struct sout_stream_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + sout_instance_t *p_sout; + + char *psz_name; + config_chain_t *p_cfg; + sout_stream_t *p_next; + + /* add, remove a stream */ + sout_stream_id_sys_t *(*pf_add)( sout_stream_t *, es_format_t * ); + int (*pf_del)( sout_stream_t *, sout_stream_id_sys_t * ); + /* manage a packet */ + int (*pf_send)( sout_stream_t *, sout_stream_id_sys_t *, block_t* ); + + sout_stream_sys_t *p_sys; + bool pace_nocontrol; +}; + +VLC_API void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last ); +VLC_API sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout, + char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED; + +static inline sout_stream_id_sys_t *sout_StreamIdAdd( sout_stream_t *s, es_format_t *fmt ) +{ + return s->pf_add( s, fmt ); +} +static inline int sout_StreamIdDel( sout_stream_t *s, sout_stream_id_sys_t *id ) +{ + return s->pf_del( s, id ); +} +static inline int sout_StreamIdSend( sout_stream_t *s, sout_stream_id_sys_t *id, block_t *b ) +{ + return s->pf_send( s, id, b ); +} + +/**************************************************************************** + * Encoder + ****************************************************************************/ + +VLC_API encoder_t * sout_EncoderCreate( vlc_object_t *obj ); +#define sout_EncoderCreate(o) sout_EncoderCreate(VLC_OBJECT(o)) + +/**************************************************************************** + * Announce handler + ****************************************************************************/ +VLC_API session_descriptor_t* sout_AnnounceRegisterSDP( vlc_object_t *, const char *, const char * ) VLC_USED; +VLC_API int sout_AnnounceUnRegister(vlc_object_t *,session_descriptor_t* ); +#define sout_AnnounceRegisterSDP(o, sdp, addr) \ + sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr) +#define sout_AnnounceUnRegister(o, a) \ + sout_AnnounceUnRegister(VLC_OBJECT (o), a) + +/** SDP */ + +struct sockaddr; + +VLC_API char * vlc_sdp_Start( vlc_object_t *obj, const char *cfgpref, const struct sockaddr *src, size_t srclen, const struct sockaddr *addr, size_t addrlen ) VLC_USED; +VLC_API char * sdp_AddMedia(char **sdp, const char *type, const char *protocol, int dport, unsigned pt, bool bw_indep, unsigned bw, const char *ptname, unsigned clockrate, unsigned channels, const char *fmtp); +VLC_API char * sdp_AddAttribute(char **sdp, const char *name, const char *fmt, ...) VLC_FORMAT( 3, 4 ); + +/** Description module */ +typedef struct sout_description_data_t +{ + int i_es; + es_format_t **es; + vlc_sem_t *sem; +} sout_description_data_t; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_spu.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_spu.h new file mode 100644 index 0000000..cbd20ea --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_spu.h @@ -0,0 +1,112 @@ +/***************************************************************************** + * vlc_spu.h: spu_t definition and functions. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2010 Laurent Aimar + * $Id: d448d06f8c9f9c91d70239ff0d07cb5ceac06423 $ + * + * Authors: Gildas Bazin + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SPU_H +#define VLC_SPU_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************** + * Base SPU structures + **********************************************************************/ +/** + * \defgroup spu Subpicture Unit + * This module describes the programming interface for the subpicture unit. + * It includes functions allowing to create/destroy an spu, and render + * subpictures. + * @{ + */ + +typedef struct spu_private_t spu_private_t; + +/* Default subpicture channel ID */ +#define SPU_DEFAULT_CHANNEL (1) + +/** + * Subpicture unit descriptor + */ +struct spu_t +{ + VLC_COMMON_MEMBERS + + spu_private_t *p; +}; + +VLC_API spu_t * spu_Create( vlc_object_t * ); +#define spu_Create(a) spu_Create(VLC_OBJECT(a)) +VLC_API void spu_Destroy( spu_t * ); + +/** + * This function sends a subpicture to the spu_t core. + * + * You cannot use the provided subpicture anymore. The spu_t core + * will destroy it at its convenience. + */ +VLC_API void spu_PutSubpicture( spu_t *, subpicture_t * ); + +/** + * This function will return an unique subpicture containing the OSD and + * subtitles visibles at the requested date. + * + * \param p_chroma_list is a list of supported chroma for the output (can be NULL) + * \param p_fmt_dst is the format of the picture on which the return subpicture will be rendered. + * \param p_fmt_src is the format of the original(source) video. + * + * The returned value if non NULL must be released by subpicture_Delete(). + */ +VLC_API subpicture_t * spu_Render( spu_t *, const vlc_fourcc_t *p_chroma_list, const video_format_t *p_fmt_dst, const video_format_t *p_fmt_src, mtime_t render_subtitle_date, mtime_t render_osd_date, bool ignore_osd ); + +/** + * It registers a new SPU channel. + */ +VLC_API int spu_RegisterChannel( spu_t * ); + +/** + * It clears all subpictures associated to a SPU channel. + */ +VLC_API void spu_ClearChannel( spu_t *, int ); + +/** + * It changes the sub sources list + */ +VLC_API void spu_ChangeSources( spu_t *, const char * ); + +/** + * It changes the sub filters list + */ +VLC_API void spu_ChangeFilters( spu_t *, const char * ); + +/** @}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_SPU_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_stream.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_stream.h new file mode 100644 index 0000000..5cec1b3 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_stream.h @@ -0,0 +1,233 @@ +/***************************************************************************** + * vlc_stream.h: Stream (between access and demux) descriptor and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 10a98ef2811fdfddb4b934c04806fea6813aaab5 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STREAM_H +#define VLC_STREAM_H 1 + +#include + +/** + * \file + * This file defines structures and functions for stream (between access and demux) descriptor in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \defgroup stream Stream + * + * This will allow you to easily handle read/seek in demuxer modules. + * @{ + */ + +/* Opaque definition for text reader context */ +typedef struct stream_text_t stream_text_t; + +/** + * stream_t definition + */ + +struct stream_t +{ + VLC_COMMON_MEMBERS + bool b_error; + + /* Module properties for stream filter */ + module_t *p_module; + + char *psz_access; + /* Real or virtual path (it can only be changed during stream_t opening) */ + char *psz_path; + + /* Stream source for stream filter */ + stream_t *p_source; + + /* */ + int (*pf_read) ( stream_t *, void *p_read, unsigned int i_read ); + int (*pf_peek) ( stream_t *, const uint8_t **pp_peek, unsigned int i_peek ); + int (*pf_control)( stream_t *, int i_query, va_list ); + + /* */ + void (*pf_destroy)( stream_t *); + + /* Private data for module */ + stream_sys_t *p_sys; + + /* Text reader state */ + stream_text_t *p_text; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/** + * Possible commands to send to stream_Control() and stream_vaControl() + */ +enum stream_query_e +{ + /* capabilities */ + STREAM_CAN_SEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_FASTSEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_PAUSE, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_CONTROL_PACE, /**< arg1= bool * res=cannot fail*/ + + /* */ + STREAM_SET_POSITION, /**< arg1= uint64_t res=can fail */ + STREAM_GET_POSITION, /**< arg1= uint64_t * res=cannot fail*/ + + STREAM_GET_SIZE, /**< arg1= uint64_t * res=cannot fail (0 if no sense)*/ + + /* You should update size of source if any and then update size + * FIXME find a way to avoid it */ + STREAM_UPDATE_SIZE, + + /* */ + STREAM_GET_PTS_DELAY = 0x101,/**< arg1= int64_t* res=cannot fail */ + STREAM_GET_TITLE_INFO, /**< arg1=input_title_t*** arg2=int* res=can fail */ + STREAM_GET_TITLE, /**< arg1=unsigned * res=can fail */ + STREAM_GET_SEEKPOINT, /**< arg1=unsigned * res=can fail */ + STREAM_GET_META, /**< arg1= vlc_meta_t ** res=can fail */ + STREAM_GET_CONTENT_TYPE, /**< arg1= char ** res=can fail */ + STREAM_GET_SIGNAL, /**< arg1=double *pf_quality, arg2=double *pf_strength res=can fail */ + + STREAM_SET_PAUSE_STATE = 0x200, /**< arg1= bool res=can fail */ + STREAM_SET_TITLE, /**< arg1= int res=can fail */ + STREAM_SET_SEEKPOINT, /**< arg1= int res=can fail */ + + /* XXX only data read through stream_Read/Block will be recorded */ + STREAM_SET_RECORD_STATE, /**< arg1=bool, arg2=const char *psz_ext (if arg1 is true) res=can fail */ + + STREAM_SET_PRIVATE_ID_STATE = 0x1000, /* arg1= int i_private_data, bool b_selected res=can fail */ + STREAM_SET_PRIVATE_ID_CA, /* arg1= int i_program_number, uint16_t i_vpid, uint16_t i_apid1, uint16_t i_apid2, uint16_t i_apid3, uint8_t i_length, uint8_t *p_data */ + STREAM_GET_PRIVATE_ID_STATE, /* arg1=int i_private_data arg2=bool * res=can fail */ +}; + +VLC_API int stream_Read( stream_t *s, void *p_read, int i_read ); +VLC_API int stream_Peek( stream_t *s, const uint8_t **pp_peek, int i_peek ); +VLC_API int stream_vaControl( stream_t *s, int i_query, va_list args ); +VLC_API void stream_Delete( stream_t *s ); +VLC_API int stream_Control( stream_t *s, int i_query, ... ); +VLC_API block_t * stream_Block( stream_t *s, int i_size ); +VLC_API block_t * stream_BlockRemaining( stream_t *s, int i_max_size ); +VLC_API char * stream_ReadLine( stream_t * ); + +/** + * Get the current position in a stream + */ +static inline int64_t stream_Tell( stream_t *s ) +{ + uint64_t i_pos; + stream_Control( s, STREAM_GET_POSITION, &i_pos ); + if( i_pos >> 62 ) + return (int64_t)1 << 62; + return i_pos; +} + +/** + * Get the size of the stream. + */ +static inline int64_t stream_Size( stream_t *s ) +{ + uint64_t i_pos; + stream_Control( s, STREAM_GET_SIZE, &i_pos ); + if( i_pos >> 62 ) + return (int64_t)1 << 62; + return i_pos; +} + +static inline int stream_Seek( stream_t *s, uint64_t i_pos ) +{ + return stream_Control( s, STREAM_SET_POSITION, i_pos ); +} + +/** + * Get the Content-Type of a stream, or NULL if unknown. + * Result must be free()'d. + */ +static inline char *stream_ContentType( stream_t *s ) +{ + char *res; + if( stream_Control( s, STREAM_GET_CONTENT_TYPE, &res ) ) + return NULL; + return res; +} + +/** + * Create a special stream and a demuxer, this allows chaining demuxers + * You must delete it using stream_Delete. + */ +VLC_API stream_t * stream_DemuxNew( demux_t *p_demux, const char *psz_demux, es_out_t *out ); + +/** + * Send data to a stream handle created by stream_DemuxNew(). + */ +VLC_API void stream_DemuxSend( stream_t *s, block_t *p_block ); + +/** + * Perform a demux (i.e. DEMUX_...) control request on a stream handle + * created by stream_DemuxNew(). + */ +VLC_API int stream_DemuxControlVa( stream_t *s, int, va_list ); + +static inline int stream_DemuxControl( stream_t *s, int query, ... ) +{ + va_list ap; + int ret; + + va_start( ap, query ); + ret = stream_DemuxControlVa( s, query, ap ); + va_end( ap ); + return ret; +} + +/** + * Create a stream_t reading from memory. + * You must delete it using stream_Delete. + */ +VLC_API stream_t * stream_MemoryNew(vlc_object_t *p_obj, uint8_t *p_buffer, uint64_t i_size, bool b_preserve_memory ); +#define stream_MemoryNew( a, b, c, d ) stream_MemoryNew( VLC_OBJECT(a), b, c, d ) + +/** + * Create a stream_t reading from a URL. + * You must delete it using stream_Delete. + */ +VLC_API stream_t * stream_UrlNew(vlc_object_t *p_this, const char *psz_url ); +#define stream_UrlNew( a, b ) stream_UrlNew( VLC_OBJECT(a), b ) + + +/** + * Try to add a stream filter to an open stream. + * @return New stream to use, or NULL if the filter could not be added. + **/ +VLC_API stream_t* stream_FilterNew( stream_t *p_source, const char *psz_stream_filter ); +/** + * @} + */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_strings.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_strings.h new file mode 100644 index 0000000..52a5bde --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_strings.h @@ -0,0 +1,67 @@ +/***************************************************************************** + * vlc_strings.h: String functions + ***************************************************************************** + * Copyright (C) 2006 VLC authors and VideoLAN + * $Id: 3ce4884e7ac610205103c2e1cbab521a4c1ebab4 $ + * + * Authors: Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STRINGS_H +#define VLC_STRINGS_H 1 + +/** + * \file + * This file defines functions and structures handling misc strings + */ + +/** + * \defgroup strings Strings + * @{ + */ + +VLC_API void resolve_xml_special_chars( char *psz_value ); +VLC_API char * convert_xml_special_chars( const char *psz_content ); + +VLC_API char * vlc_b64_encode_binary( const uint8_t *, size_t ); +VLC_API char * vlc_b64_encode( const char * ); + +VLC_API size_t vlc_b64_decode_binary_to_buffer( uint8_t *p_dst, size_t i_dst_max, const char *psz_src ); +VLC_API size_t vlc_b64_decode_binary( uint8_t **pp_dst, const char *psz_src ); +VLC_API char * vlc_b64_decode( const char *psz_src ); + +VLC_API char * str_format_time( const char * ); +VLC_API char * str_format_meta( input_thread_t *, const char * ); + +static inline char *str_format( input_thread_t *input, const char *fmt ) +{ + char *s1 = str_format_time( fmt ); + char *s2 = str_format_meta( input, s1 ); + free( s1 ); + return s2; +} + +VLC_API void filename_sanitize( char * ); +VLC_API void path_sanitize( char * ); + +VLC_API time_t str_duration( const char * ); + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_subpicture.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_subpicture.h new file mode 100644 index 0000000..8d78bb4 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_subpicture.h @@ -0,0 +1,208 @@ +/***************************************************************************** + * vlc_subpicture.h: subpicture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: 6bfede171002b78b80c7635e87fdd51ea7d15ea4 $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SUBPICTURE_H +#define VLC_SUBPICTURE_H 1 + +/** + * \file + * This file defines subpicture structures and functions in vlc + */ + +#include +#include + +/** + * \defgroup subpicture Video Subpictures + * Subpictures are pictures that should be displayed on top of the video, like + * subtitles and OSD + * \ingroup video_output + * @{ + */ + +/** + * Video subtitle region spu core private + */ +typedef struct subpicture_region_private_t subpicture_region_private_t; + +/** + * Video subtitle region + * + * A subtitle region is defined by a picture (graphic) and its rendering + * coordinates. + * Subtitles contain a list of regions. + */ +struct subpicture_region_t +{ + video_format_t fmt; /**< format of the picture */ + picture_t *p_picture; /**< picture comprising this region */ + + int i_x; /**< position of region */ + int i_y; /**< position of region */ + int i_align; /**< alignment within a region */ + int i_alpha; /**< transparency */ + + char *psz_text; /**< text string comprising this region */ + char *psz_html; /**< HTML version of subtitle (NULL = use psz_text) */ + text_style_t *p_style; /**< a description of the text style formatting */ + bool b_renderbg; /**< render black background under text */ + + subpicture_region_t *p_next; /**< next region in the list */ + subpicture_region_private_t *p_private; /**< Private data for spu_t *only* */ +}; + +/* Subpicture region position flags */ +#define SUBPICTURE_ALIGN_LEFT 0x1 +#define SUBPICTURE_ALIGN_RIGHT 0x2 +#define SUBPICTURE_ALIGN_TOP 0x4 +#define SUBPICTURE_ALIGN_BOTTOM 0x8 +#define SUBPICTURE_ALIGN_LEAVETEXT 0x10 /**< Align the subpicture, but not the text inside */ +#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \ + SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM| \ + SUBPICTURE_ALIGN_LEAVETEXT ) +/** + * This function will create a new subpicture region. + * + * You must use subpicture_region_Delete to destroy it. + */ +VLC_API subpicture_region_t * subpicture_region_New( const video_format_t *p_fmt ); + +/** + * This function will destroy a subpicture region allocated by + * subpicture_region_New. + * + * You may give it NULL. + */ +VLC_API void subpicture_region_Delete( subpicture_region_t *p_region ); + +/** + * This function will destroy a list of subpicture regions allocated by + * subpicture_region_New. + * + * Provided for convenience. + */ +VLC_API void subpicture_region_ChainDelete( subpicture_region_t *p_head ); + +/** + * + */ +typedef struct subpicture_updater_sys_t subpicture_updater_sys_t; +typedef struct +{ + int (*pf_validate)( subpicture_t *, + bool has_src_changed, const video_format_t *p_fmt_src, + bool has_dst_changed, const video_format_t *p_fmt_dst, + mtime_t); + void (*pf_update) ( subpicture_t *, + const video_format_t *p_fmt_src, + const video_format_t *p_fmt_dst, + mtime_t ); + void (*pf_destroy) ( subpicture_t * ); + subpicture_updater_sys_t *p_sys; +} subpicture_updater_t; + +typedef struct subpicture_private_t subpicture_private_t; + +/** + * Video subtitle + * + * Any subtitle destined to be displayed by a video output thread should + * be stored in this structure from it's creation to it's effective display. + * Subtitle type and flags should only be modified by the output thread. Note + * that an empty subtitle MUST have its flags set to 0. + */ +struct subpicture_t +{ + /** \name Channel ID */ + /**@{*/ + int i_channel; /**< subpicture channel ID */ + /**@}*/ + + /** \name Type and flags + Should NOT be modified except by the vout thread */ + /**@{*/ + int64_t i_order; /** an increasing unique number */ + subpicture_t * p_next; /**< next subtitle to be displayed */ + /**@}*/ + + subpicture_region_t *p_region; /**< region list composing this subtitle */ + + /** \name Date properties */ + /**@{*/ + mtime_t i_start; /**< beginning of display date */ + mtime_t i_stop; /**< end of display date */ + bool b_ephemer; /**< If this flag is set to true the subtitle + will be displayed untill the next one appear */ + bool b_fade; /**< enable fading */ + /**@}*/ + + /** \name Display properties + * These properties are only indicative and may be + * changed by the video output thread, or simply ignored depending of the + * subtitle type. */ + /**@{*/ + bool b_subtitle; /**< the picture is a movie subtitle */ + bool b_absolute; /**< position is absolute */ + int i_original_picture_width; /**< original width of the movie */ + int i_original_picture_height;/**< original height of the movie */ + int i_alpha; /**< transparency */ + /**@}*/ + + subpicture_updater_t updater; + + subpicture_private_t *p_private; /* Reserved to the core */ +}; + +/** + * This function create a new empty subpicture. + * + * You must use subpicture_Delete to destroy it. + */ +VLC_API subpicture_t * subpicture_New( const subpicture_updater_t * ); + +/** + * This function delete a subpicture created by subpicture_New. + * You may give it NULL. + */ +VLC_API void subpicture_Delete( subpicture_t *p_subpic ); + +/** + * This function will create a subpicture having one region in the requested + * chroma showing the given picture. + * + * The picture_t given is not released nor used inside the + * returned subpicture_t. + */ +VLC_API subpicture_t * subpicture_NewFromPicture( vlc_object_t *, picture_t *, vlc_fourcc_t i_chroma ); + +/** + * This function will update the content of a subpicture created with + * a non NULL subpicture_updater_t. + */ +VLC_API void subpicture_Update( subpicture_t *, const video_format_t *src, const video_format_t *, mtime_t ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_text_style.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_text_style.h new file mode 100644 index 0000000..10a1b5b --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_text_style.h @@ -0,0 +1,107 @@ +/***************************************************************************** + * vlc_text_style.h: text_style_t definition and helpers. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * $Id: 51677243e472c3e7712f1a0b168a647433f7470b $ + * + * Authors: Derk-Jan Hartman + * basOS G + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TEXT_STYLE_H +#define VLC_TEXT_STYLE_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Text style + * + * A text style is used to specify the formatting of text. + * A font renderer can use the supplied information to render the + * text specified. + */ +typedef struct +{ + char * psz_fontname; /**< The name of the font */ + char * psz_monofontname; /**< The name of the mono font */ + int i_font_size; /**< The font size in pixels */ + int i_font_color; /**< The color of the text 0xRRGGBB + (native endianness) */ + unsigned i_font_alpha; /**< The transparency of the text. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_style_flags; /**< Formatting style flags */ + int i_outline_color; /**< The color of the outline 0xRRGGBB */ + int i_outline_alpha; /**< The transparency of the outline. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_shadow_color; /**< The color of the shadow 0xRRGGBB */ + int i_shadow_alpha; /**< The transparency of the shadow. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_background_color;/**< The color of the background 0xRRGGBB */ + int i_background_alpha;/**< The transparency of the background. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_karaoke_background_color;/**< Background color for karaoke 0xRRGGBB */ + int i_karaoke_background_alpha;/**< The transparency of the karaoke bg. + 0x00 is fully opaque, + 0xFF fully transparent */ + int i_outline_width; /**< The width of the outline in pixels */ + int i_shadow_width; /**< The width of the shadow in pixels */ + int i_spacing; /**< The spaceing between glyphs in pixels */ +} text_style_t; + +/* Style flags for \ref text_style_t */ +#define STYLE_BOLD 1 +#define STYLE_ITALIC 2 +#define STYLE_OUTLINE 4 +#define STYLE_SHADOW 8 +#define STYLE_BACKGROUND 16 +#define STYLE_UNDERLINE 32 +#define STYLE_STRIKEOUT 64 + +#define STYLE_DEFAULT_FONT_SIZE 22 + +/** + * Create a default text style + */ +VLC_API text_style_t * text_style_New( void ); + +/** + * Copy a text style into another + */ +VLC_API text_style_t * text_style_Copy( text_style_t *, const text_style_t * ); + +/** + * Duplicate a text style + */ +VLC_API text_style_t * text_style_Duplicate( const text_style_t * ); + +/** + * Delete a text style created by text_style_New or text_style_Duplicate + */ +VLC_API void text_style_Delete( text_style_t * ); + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_TEXT_STYLE_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_threads.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_threads.h new file mode 100644 index 0000000..a6ac360 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_threads.h @@ -0,0 +1,481 @@ +/***************************************************************************** + * vlc_threads.h : threads implementation for the VideoLAN client + * This header provides portable declarations for mutexes & conditions + ***************************************************************************** + * Copyright (C) 1999, 2002 VLC authors and VideoLAN + * Copyright © 2007-2008 Rémi Denis-Courmont + * + * Authors: Jean-Marc Dressler + * Samuel Hocevar + * Gildas Bazin + * Christophe Massiot + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_THREADS_H_ +#define VLC_THREADS_H_ + +/** + * \file + * This file defines structures and functions for handling threads in vlc + * + */ + +#if defined (_WIN32) +# include +# ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +# endif + +typedef struct vlc_thread *vlc_thread_t; +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + CRITICAL_SECTION mutex; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +typedef struct +{ + HANDLE handle; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { 0, 0 } +typedef HANDLE vlc_sem_t; +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_AUDIO THREAD_PRIORITY_HIGHEST +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL + +#elif defined (__OS2__) +# include + +typedef struct vlc_thread *vlc_thread_t; +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + HMTX hmtx; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +typedef struct +{ + HEV hev; + unsigned waiters; + HEV hevAck; + unsigned signaled; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { NULLHANDLE, 0, NULLHANDLE, 0, 0 } +#define LIBVLC_NEED_SEMAPHORE +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_AUDIO MAKESHORT(PRTYD_MAXIMUM, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_HIGHEST MAKESHORT(0, PRTYC_TIMECRITICAL) + +# define pthread_sigmask sigprocmask + +#elif defined (__ANDROID__) /* pthreads subset without pthread_cancel() */ +# include +# include +# include +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_NEED_SEMAPHORE +# define LIBVLC_NEED_RWLOCK + +typedef struct vlc_thread *vlc_thread_t; +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef struct +{ + pthread_cond_t cond; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { PTHREAD_COND_INITIALIZER, CLOCK_REALTIME } + +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 0 +# define VLC_THREAD_PRIORITY_AUDIO 0 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 0 +# define VLC_THREAD_PRIORITY_HIGHEST 0 + +#elif defined (__APPLE__) +# define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */ +# include +# include +/* Unnamed POSIX semaphores not supported on Mac OS X */ +# include +# include +# define LIBVLC_USE_PTHREAD 1 +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_USE_PTHREAD_CANCEL 1 + +typedef pthread_t vlc_thread_t; +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef struct +{ + pthread_cond_t cond; + unsigned clock; +} vlc_cond_t; +#define VLC_STATIC_COND { PTHREAD_COND_INITIALIZER, 0 } +typedef semaphore_t vlc_sem_t; +typedef pthread_rwlock_t vlc_rwlock_t; +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 22 +# define VLC_THREAD_PRIORITY_AUDIO 22 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 22 +# define VLC_THREAD_PRIORITY_HIGHEST 22 + +#else /* POSIX threads */ +# include /* _POSIX_SPIN_LOCKS */ +# include +# include +# define LIBVLC_USE_PTHREAD 1 +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_USE_PTHREAD_CANCEL 1 + +typedef pthread_t vlc_thread_t; +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef pthread_cond_t vlc_cond_t; +#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER +typedef sem_t vlc_sem_t; +typedef pthread_rwlock_t vlc_rwlock_t; +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 10 +# define VLC_THREAD_PRIORITY_AUDIO 5 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 15 +# define VLC_THREAD_PRIORITY_HIGHEST 20 + +#endif + +#ifdef LIBVLC_NEED_SEMAPHORE +typedef struct vlc_sem +{ + vlc_mutex_t lock; + vlc_cond_t wait; + unsigned value; +} vlc_sem_t; +#endif + +#ifdef LIBVLC_NEED_RWLOCK +typedef struct vlc_rwlock +{ + vlc_mutex_t mutex; + vlc_cond_t wait; + long state; +} vlc_rwlock_t; +# define VLC_STATIC_RWLOCK { VLC_STATIC_MUTEX, VLC_STATIC_COND, 0 } +#endif + +/***************************************************************************** + * Function definitions + *****************************************************************************/ +VLC_API void vlc_mutex_init( vlc_mutex_t * ); +VLC_API void vlc_mutex_init_recursive( vlc_mutex_t * ); +VLC_API void vlc_mutex_destroy( vlc_mutex_t * ); +VLC_API void vlc_mutex_lock( vlc_mutex_t * ); +VLC_API int vlc_mutex_trylock( vlc_mutex_t * ) VLC_USED; +VLC_API void vlc_mutex_unlock( vlc_mutex_t * ); +VLC_API void vlc_cond_init( vlc_cond_t * ); +VLC_API void vlc_cond_init_daytime( vlc_cond_t * ); +VLC_API void vlc_cond_destroy( vlc_cond_t * ); +VLC_API void vlc_cond_signal(vlc_cond_t *); +VLC_API void vlc_cond_broadcast(vlc_cond_t *); +VLC_API void vlc_cond_wait(vlc_cond_t *, vlc_mutex_t *); +VLC_API int vlc_cond_timedwait(vlc_cond_t *, vlc_mutex_t *, mtime_t); +VLC_API void vlc_sem_init(vlc_sem_t *, unsigned); +VLC_API void vlc_sem_destroy(vlc_sem_t *); +VLC_API int vlc_sem_post(vlc_sem_t *); +VLC_API void vlc_sem_wait(vlc_sem_t *); + +VLC_API void vlc_rwlock_init(vlc_rwlock_t *); +VLC_API void vlc_rwlock_destroy(vlc_rwlock_t *); +VLC_API void vlc_rwlock_rdlock(vlc_rwlock_t *); +VLC_API void vlc_rwlock_wrlock(vlc_rwlock_t *); +VLC_API void vlc_rwlock_unlock(vlc_rwlock_t *); +VLC_API int vlc_threadvar_create(vlc_threadvar_t * , void (*) (void *) ); +VLC_API void vlc_threadvar_delete(vlc_threadvar_t *); +VLC_API int vlc_threadvar_set(vlc_threadvar_t, void *); +VLC_API void * vlc_threadvar_get(vlc_threadvar_t); + +VLC_API int vlc_clone(vlc_thread_t *, void * (*) (void *), void *, int) VLC_USED; +VLC_API void vlc_cancel(vlc_thread_t); +VLC_API void vlc_join(vlc_thread_t, void **); +VLC_API void vlc_control_cancel (int cmd, ...); + +VLC_API mtime_t mdate(void); +VLC_API void mwait(mtime_t deadline); +VLC_API void msleep(mtime_t delay); + +#define VLC_HARD_MIN_SLEEP 10000 /* 10 milliseconds = 1 tick at 100Hz */ +#define VLC_SOFT_MIN_SLEEP 9000000 /* 9 seconds */ + +#if VLC_GCC_VERSION(4,3) +/* Linux has 100, 250, 300 or 1000Hz + * + * HZ=100 by default on FreeBSD, but some architectures use a 1000Hz timer + */ + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("sorry, cannot sleep for such short a time"))) +mtime_t impossible_delay( mtime_t delay ) +{ + (void) delay; + return VLC_HARD_MIN_SLEEP; +} + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((warning("use proper event handling instead of short delay"))) +mtime_t harmful_delay( mtime_t delay ) +{ + return delay; +} + +# define check_delay( d ) \ + ((__builtin_constant_p(d < VLC_HARD_MIN_SLEEP) \ + && (d < VLC_HARD_MIN_SLEEP)) \ + ? impossible_delay(d) \ + : ((__builtin_constant_p(d < VLC_SOFT_MIN_SLEEP) \ + && (d < VLC_SOFT_MIN_SLEEP)) \ + ? harmful_delay(d) \ + : d)) + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("deadlines can not be constant"))) +mtime_t impossible_deadline( mtime_t deadline ) +{ + return deadline; +} + +# define check_deadline( d ) \ + (__builtin_constant_p(d) ? impossible_deadline(d) : d) +#else +# define check_delay(d) (d) +# define check_deadline(d) (d) +#endif + +VLC_API int vlc_timer_create(vlc_timer_t *, void (*) (void *), void *) VLC_USED; +VLC_API void vlc_timer_destroy(vlc_timer_t); +VLC_API void vlc_timer_schedule(vlc_timer_t, bool, mtime_t, mtime_t); +VLC_API unsigned vlc_timer_getoverrun(vlc_timer_t) VLC_USED; + +VLC_API unsigned vlc_GetCPUCount(void); + +VLC_API int vlc_savecancel(void); +VLC_API void vlc_restorecancel(int state); +VLC_API void vlc_testcancel(void); + +#if defined (LIBVLC_USE_PTHREAD_CLEANUP) +/** + * Registers a new procedure to run if the thread is cancelled (or otherwise + * exits prematurely). Any call to vlc_cleanup_push() must paired with a + * call to either vlc_cleanup_pop() or vlc_cleanup_run(). Branching into or out + * of the block between these two function calls is not allowed (read: it will + * likely crash the whole process). If multiple procedures are registered, + * they are handled in last-in first-out order. + * + * @param routine procedure to call if the thread ends + * @param arg argument for the procedure + */ +# define vlc_cleanup_push( routine, arg ) pthread_cleanup_push (routine, arg) + +/** + * Removes a cleanup procedure that was previously registered with + * vlc_cleanup_push(). + */ +# define vlc_cleanup_pop( ) pthread_cleanup_pop (0) + +/** + * Removes a cleanup procedure that was previously registered with + * vlc_cleanup_push(), and executes it. + */ +# define vlc_cleanup_run( ) pthread_cleanup_pop (1) + +#else +enum +{ + VLC_CLEANUP_PUSH, + VLC_CLEANUP_POP, +}; +typedef struct vlc_cleanup_t vlc_cleanup_t; + +struct vlc_cleanup_t +{ + vlc_cleanup_t *next; + void (*proc) (void *); + void *data; +}; + +/* This macros opens a code block on purpose. This is needed for multiple + * calls within a single function. This also prevent Win32 developers from + * writing code that would break on POSIX (POSIX opens a block as well). */ +# define vlc_cleanup_push( routine, arg ) \ + do { \ + vlc_cleanup_t vlc_cleanup_data = { NULL, routine, arg, }; \ + vlc_control_cancel (VLC_CLEANUP_PUSH, &vlc_cleanup_data) + +# define vlc_cleanup_pop( ) \ + vlc_control_cancel (VLC_CLEANUP_POP); \ + } while (0) + +# define vlc_cleanup_run( ) \ + vlc_control_cancel (VLC_CLEANUP_POP); \ + vlc_cleanup_data.proc (vlc_cleanup_data.data); \ + } while (0) + +#endif /* !LIBVLC_USE_PTHREAD_CLEANUP */ + +#ifndef LIBVLC_USE_PTHREAD_CANCEL +/* poll() with cancellation */ +# ifdef __OS2__ +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + static int (*vlc_poll_os2)(struct pollfd *, unsigned, int) = NULL; + + if (!vlc_poll_os2) + { + HMODULE hmod; + CHAR szFailed[CCHMAXPATH]; + + if (DosLoadModule(szFailed, sizeof(szFailed), "vlccore", &hmod)) + return -1; + + if (DosQueryProcAddr(hmod, 0, "_vlc_poll_os2", (PFN *)&vlc_poll_os2)) + return -1; + } + + return (*vlc_poll_os2)(fds, nfds, timeout); +} +# else +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + int val; + + do + { + int ugly_timeout = ((unsigned)timeout >= 50) ? 50 : timeout; + if (timeout >= 0) + timeout -= ugly_timeout; + + vlc_testcancel (); + val = poll (fds, nfds, ugly_timeout); + } + while (val == 0 && timeout != 0); + + return val; +} +# endif + +# define poll(u,n,t) vlc_poll(u, n, t) + +#endif /* LIBVLC_USE_PTHREAD_CANCEL */ + +static inline void vlc_cleanup_lock (void *lock) +{ + vlc_mutex_unlock ((vlc_mutex_t *)lock); +} +#define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock, lock) + +#ifdef __cplusplus +/** + * Helper C++ class to lock a mutex. + * The mutex is locked when the object is created, and unlocked when the object + * is destroyed. + */ +class vlc_mutex_locker +{ + private: + vlc_mutex_t *lock; + public: + vlc_mutex_locker (vlc_mutex_t *m) : lock (m) + { + vlc_mutex_lock (lock); + } + + ~vlc_mutex_locker (void) + { + vlc_mutex_unlock (lock); + } +}; +#endif + +enum +{ + VLC_AVCODEC_MUTEX = 0, + VLC_GCRYPT_MUTEX, + VLC_XLIB_MUTEX, + VLC_MOSAIC_MUTEX, + VLC_HIGHLIGHT_MUTEX, + VLC_ATOMIC_MUTEX, + /* Insert new entry HERE */ + VLC_MAX_MUTEX +}; + +VLC_API void vlc_global_mutex( unsigned, bool ); +#define vlc_global_lock( n ) vlc_global_mutex( n, true ) +#define vlc_global_unlock( n ) vlc_global_mutex( n, false ) + +#endif /* !_VLC_THREADS_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_tls.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_tls.h new file mode 100644 index 0000000..e9db9cc --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_tls.h @@ -0,0 +1,82 @@ +/***************************************************************************** + * vlc_tls.h: Transport Layer Security API + ***************************************************************************** + * Copyright (C) 2004-2011 Rémi Denis-Courmont + * Copyright (C) 2005-2006 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TLS_H +# define VLC_TLS_H + +/** + * \file + * This file defines Transport Layer Security API (TLS) in vlc + */ + +# include + +typedef struct vlc_tls vlc_tls_t; +typedef struct vlc_tls_sys vlc_tls_sys_t; +typedef struct vlc_tls_creds vlc_tls_creds_t; +typedef struct vlc_tls_creds_sys vlc_tls_creds_sys_t; + +/** TLS session */ +struct vlc_tls +{ + VLC_COMMON_MEMBERS + + vlc_tls_sys_t *sys; + + struct virtual_socket_t sock; + int (*handshake) (vlc_tls_t *, const char *host, const char *service); +}; + +VLC_API vlc_tls_t *vlc_tls_ClientSessionCreate (vlc_tls_creds_t *, int fd, + const char *host, const char *service); +vlc_tls_t *vlc_tls_SessionCreate (vlc_tls_creds_t *, int fd, const char *host); +int vlc_tls_SessionHandshake (vlc_tls_t *, const char *host, const char *serv); +VLC_API void vlc_tls_SessionDelete (vlc_tls_t *); + +/* NOTE: It is assumed that a->sock.p_sys = a */ +# define tls_Send( a, b, c ) (((vlc_tls_t *)a)->sock.pf_send (a, b, c)) + +# define tls_Recv( a, b, c ) (((vlc_tls_t *)a)->sock.pf_recv (a, b, c)) + + +/** TLS credentials (certificate, private and trust settings) */ +struct vlc_tls_creds +{ + VLC_COMMON_MEMBERS + + module_t *module; + vlc_tls_creds_sys_t *sys; + + int (*add_CA) (vlc_tls_creds_t *, const char *path); + int (*add_CRL) (vlc_tls_creds_t *, const char *path); + + int (*open) (vlc_tls_creds_t *, vlc_tls_t *, int fd, const char *host); + void (*close) (vlc_tls_creds_t *, vlc_tls_t *); +}; + +VLC_API vlc_tls_creds_t *vlc_tls_ClientCreate (vlc_object_t *); +vlc_tls_creds_t *vlc_tls_ServerCreate (vlc_object_t *, + const char *cert, const char *key); +VLC_API void vlc_tls_Delete (vlc_tls_creds_t *); +int vlc_tls_ServerAddCA (vlc_tls_creds_t *srv, const char *path); +int vlc_tls_ServerAddCRL (vlc_tls_creds_t *srv, const char *path); + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_url.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_url.h new file mode 100644 index 0000000..f548ef4 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_url.h @@ -0,0 +1,55 @@ +/***************************************************************************** + * vlc_url.h: URL related macros + ***************************************************************************** + * Copyright (C) 2002-2006 VLC authors and VideoLAN + * $Id: 820250f963fbc31ff56ef1e866fe6bd020686ef0 $ + * + * Authors: Christophe Massiot + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_URL_H +# define VLC_URL_H + +/** + * \file + * This file defines functions for manipulating URL in vlc + */ + +VLC_API char *vlc_path2uri (const char *path, const char *scheme) VLC_MALLOC; + +struct vlc_url_t +{ + char *psz_protocol; + char *psz_username; + char *psz_password; + char *psz_host; + unsigned i_port; + char *psz_path; + char *psz_option; + + char *psz_buffer; /* to be freed */ +}; + +VLC_API char * decode_URI_duplicate( const char *psz ) VLC_MALLOC; +VLC_API char * decode_URI( char *psz ); +VLC_API char * encode_URI_component( const char *psz ) VLC_MALLOC; +VLC_API char * make_path( const char *url ) VLC_MALLOC; + +VLC_API void vlc_UrlParse (vlc_url_t *, const char *, unsigned char); +VLC_API void vlc_UrlClean (vlc_url_t *); +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_variables.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_variables.h new file mode 100644 index 0000000..b5b83ab --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_variables.h @@ -0,0 +1,755 @@ +/***************************************************************************** + * vlc_variables.h: variables handling + ***************************************************************************** + * Copyright (C) 2002-2004 VLC authors and VideoLAN + * $Id: 420f0b4d026725d423f32ed510276bd53ffcf207 $ + * + * Authors: Samuel Hocevar + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VARIABLES_H +#define VLC_VARIABLES_H 1 + +/** + * \file + * This file defines functions and structures for dynamic variables in vlc + */ + +/** + * \defgroup variables Variables + * + * Functions for using the object variables in vlc. + * + * Vlc have a very powerful "object variable" infrastructure useful + * for many things. + * + * @{ + */ + +#define VLC_VAR_TYPE 0x00ff +#define VLC_VAR_CLASS 0x00f0 +#define VLC_VAR_FLAGS 0xff00 + +/** + * \defgroup var_type Variable types + * These are the different types a vlc variable can have. + * @{ + */ +#define VLC_VAR_VOID 0x0010 +#define VLC_VAR_BOOL 0x0020 +#define VLC_VAR_INTEGER 0x0030 +#define VLC_VAR_HOTKEY 0x0031 +#define VLC_VAR_STRING 0x0040 +#define VLC_VAR_VARIABLE 0x0044 +#define VLC_VAR_FLOAT 0x0050 +#define VLC_VAR_TIME 0x0060 +#define VLC_VAR_ADDRESS 0x0070 +#define VLC_VAR_COORDS 0x00A0 +/**@}*/ + +/** \defgroup var_flags Additive flags + * These flags are added to the type field of the variable. Most as a result of + * a var_Change() call, but some may be added at creation time + * @{ + */ +#define VLC_VAR_HASCHOICE 0x0100 +#define VLC_VAR_HASMIN 0x0200 +#define VLC_VAR_HASMAX 0x0400 +#define VLC_VAR_HASSTEP 0x0800 + +#define VLC_VAR_ISCOMMAND 0x2000 + +/** Creation flag */ +/* If the variable is not found on the current module + search all parents and finally module config until found */ +#define VLC_VAR_DOINHERIT 0x8000 +/**@}*/ + +/** + * \defgroup var_action Variable actions + * These are the different actions that can be used with var_Change(). + * The parameters given are the meaning of the two last parameters of + * var_Change() when this action is being used. + * @{ + */ + +/** + * Set the minimum value of this variable + * \param p_val The new minimum value + * \param p_val2 Unused + */ +#define VLC_VAR_SETMIN 0x0010 +/** + * Set the maximum value of this variable + * \param p_val The new maximum value + * \param p_val2 Unused + */ +#define VLC_VAR_SETMAX 0x0011 +#define VLC_VAR_SETSTEP 0x0012 + +/** + * Set the value of this variable without triggering any callbacks + * \param p_val The new value + * \param p_val2 Unused + */ +#define VLC_VAR_SETVALUE 0x0013 + +#define VLC_VAR_SETTEXT 0x0014 +#define VLC_VAR_GETTEXT 0x0015 + +#define VLC_VAR_GETMIN 0x0016 +#define VLC_VAR_GETMAX 0x0017 +#define VLC_VAR_GETSTEP 0x0018 + +#define VLC_VAR_ADDCHOICE 0x0020 +#define VLC_VAR_DELCHOICE 0x0021 +#define VLC_VAR_CLEARCHOICES 0x0022 +#define VLC_VAR_SETDEFAULT 0x0023 +#define VLC_VAR_GETCHOICES 0x0024 +#define VLC_VAR_GETLIST 0x0025 +#define VLC_VAR_CHOICESCOUNT 0x0026 + +/**@}*/ + +/** \defgroup var_GetAndSet Variable actions + * These are the different actions that can be used with var_GetAndSet() + * @{ + */ +enum { + VLC_VAR_BOOL_TOGGLE, /**< Invert a boolean value (param ignored) */ + VLC_VAR_INTEGER_ADD, /**< Add parameter to an integer value */ + VLC_VAR_INTEGER_OR, /**< Binary OR over an integer bits field */ + VLC_VAR_INTEGER_NAND,/**< Binary NAND over an integer bits field */ +}; +/**@}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API int var_Create( vlc_object_t *, const char *, int ); +#define var_Create(a,b,c) var_Create( VLC_OBJECT(a), b, c ) + +VLC_API int var_Destroy( vlc_object_t *, const char * ); +#define var_Destroy(a,b) var_Destroy( VLC_OBJECT(a), b ) + +VLC_API int var_Change( vlc_object_t *, const char *, int, vlc_value_t *, vlc_value_t * ); +#define var_Change(a,b,c,d,e) var_Change( VLC_OBJECT(a), b, c, d, e ) + +VLC_API int var_Type( vlc_object_t *, const char * ) VLC_USED; +#define var_Type(a,b) var_Type( VLC_OBJECT(a), b ) + +VLC_API int var_Set( vlc_object_t *, const char *, vlc_value_t ); +#define var_Set(a,b,c) var_Set( VLC_OBJECT(a), b, c ) + +VLC_API int var_Get( vlc_object_t *, const char *, vlc_value_t * ); +#define var_Get(a,b,c) var_Get( VLC_OBJECT(a), b, c ) + +VLC_API int var_SetChecked( vlc_object_t *, const char *, int, vlc_value_t ); +#define var_SetChecked(o,n,t,v) var_SetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetChecked( vlc_object_t *, const char *, int, vlc_value_t * ); +#define var_GetChecked(o,n,t,v) var_GetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetAndSet( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API int var_Inherit( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API void var_FreeList( vlc_value_t *, vlc_value_t * ); + + +/***************************************************************************** + * Variable callbacks + ***************************************************************************** + * int MyCallback( vlc_object_t *p_this, + * char const *psz_variable, + * vlc_value_t oldvalue, + * vlc_value_t newvalue, + * void *p_data); + *****************************************************************************/ +VLC_API int var_AddCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API int var_DelCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API int var_TriggerCallback( vlc_object_t *, const char * ); + +#define var_AddCallback(a,b,c,d) var_AddCallback( VLC_OBJECT(a), b, c, d ) +#define var_DelCallback(a,b,c,d) var_DelCallback( VLC_OBJECT(a), b, c, d ) +#define var_TriggerCallback(a,b) var_TriggerCallback( VLC_OBJECT(a), b ) + +/***************************************************************************** + * helpers functions + *****************************************************************************/ + +/** + * Set the value of an integer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param i The new integer value of this variable + */ +static inline int var_SetInteger( vlc_object_t *p_obj, const char *psz_name, + int64_t i ) +{ + vlc_value_t val; + val.i_int = i; + return var_SetChecked( p_obj, psz_name, VLC_VAR_INTEGER, val ); +} + +/** + * Set the value of an boolean variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param b The new boolean value of this variable + */ +static inline int var_SetBool( vlc_object_t *p_obj, const char *psz_name, bool b ) +{ + vlc_value_t val; + val.b_bool = b; + return var_SetChecked( p_obj, psz_name, VLC_VAR_BOOL, val ); +} + +/** + * Set the value of a time variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param i The new time value of this variable + */ +static inline int var_SetTime( vlc_object_t *p_obj, const char *psz_name, int64_t i ) +{ + vlc_value_t val; + val.i_time = i; + return var_SetChecked( p_obj, psz_name, VLC_VAR_TIME, val ); +} + +static inline int var_SetCoords( vlc_object_t *obj, const char *name, + int32_t x, int32_t y ) +{ + vlc_value_t val; + val.coords.x = x; + val.coords.y = y; + return var_SetChecked (obj, name, VLC_VAR_COORDS, val); +} +#define var_SetCoords(o,n,x,y) var_SetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Set the value of a float variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param f The new float value of this variable + */ +static inline int var_SetFloat( vlc_object_t *p_obj, const char *psz_name, float f ) +{ + vlc_value_t val; + val.f_float = f; + return var_SetChecked( p_obj, psz_name, VLC_VAR_FLOAT, val ); +} + +/** + * Set the value of a string variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param psz_string The new string value of this variable + */ +static inline int var_SetString( vlc_object_t *p_obj, const char *psz_name, const char *psz_string ) +{ + vlc_value_t val; + val.psz_string = (char *)psz_string; + return var_SetChecked( p_obj, psz_name, VLC_VAR_STRING, val ); +} + +/** + * Set the value of a pointer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param ptr The new pointer value of this variable + */ +static inline +int var_SetAddress( vlc_object_t *p_obj, const char *psz_name, void *ptr ) +{ + vlc_value_t val; + val.p_address = ptr; + return var_SetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, val ); +} + +#define var_SetInteger(a,b,c) var_SetInteger( VLC_OBJECT(a),b,c) +#define var_SetBool(a,b,c) var_SetBool( VLC_OBJECT(a),b,c) +#define var_SetTime(a,b,c) var_SetTime( VLC_OBJECT(a),b,c) +#define var_SetFloat(a,b,c) var_SetFloat( VLC_OBJECT(a),b,c) +#define var_SetString(a,b,c) var_SetString( VLC_OBJECT(a),b,c) +#define var_SetAddress(o, n, p) var_SetAddress(VLC_OBJECT(o), n, p) + + +/** + * Get an integer value +* + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_GetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_INTEGER, &val ) ) + return val.i_int; + else + return 0; +} + +/** + * Get a boolean value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_GetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.b_bool = false; + + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_BOOL, &val ) ) + return val.b_bool; + else + return false; +} + +/** + * Get a time value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_GetTime( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.i_time = 0L; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_TIME, &val ) ) + return val.i_time; + else + return 0; +} + +static inline void var_GetCoords( vlc_object_t *obj, const char *name, + int32_t *px, int32_t *py ) +{ + vlc_value_t val; + + if (likely(!var_GetChecked (obj, name, VLC_VAR_COORDS, &val))) + { + *px = val.coords.x; + *py = val.coords.y; + } + else + *px = *py = 0; +} +#define var_GetCoords(o,n,x,y) var_GetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Get a float value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_GetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.f_float = 0.0; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_FLOAT, &val ) ) + return val.f_float; + else + return 0.0; +} + +/** + * Get a string value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_GetString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.psz_string = NULL; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + else + return val.psz_string; +} + +VLC_USED VLC_MALLOC +static inline char *var_GetNonEmptyString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + if( val.psz_string && *val.psz_string ) + return val.psz_string; + free( val.psz_string ); + return NULL; +} + +VLC_USED +static inline void *var_GetAddress( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, &val ) ) + return NULL; + else + return val.p_address; +} + +/** + * Increment an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_IncInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = 1; + var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ); + return val.i_int; +} +#define var_IncInteger(a,b) var_IncInteger( VLC_OBJECT(a), b ) + +/** + * Decrement an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_DecInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = -1; + var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ); + return val.i_int; +} +#define var_DecInteger(a,b) var_DecInteger( VLC_OBJECT(a), b ) + +static inline uint64_t var_OrInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + var_GetAndSet( obj, name, VLC_VAR_INTEGER_OR, &val ); + return val.i_int; +} +#define var_OrInteger(a,b,c) var_OrInteger(VLC_OBJECT(a),b,c) + +static inline uint64_t var_NAndInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + var_GetAndSet( obj, name, VLC_VAR_INTEGER_NAND, &val ); + return val.i_int; +} +#define var_NAndInteger(a,b,c) var_NAndInteger(VLC_OBJECT(a),b,c) + +/** + * Create a integer variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a time variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetTime( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT ); + return var_GetTime( p_obj, psz_name ); +} + +/** + * Create a float variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +/** + * Create an address variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline void *var_CreateGetAddress( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT ); + return var_GetAddress( p_obj, psz_name ); +} + +#define var_CreateGetInteger(a,b) var_CreateGetInteger( VLC_OBJECT(a),b) +#define var_CreateGetBool(a,b) var_CreateGetBool( VLC_OBJECT(a),b) +#define var_CreateGetTime(a,b) var_CreateGetTime( VLC_OBJECT(a),b) +#define var_CreateGetFloat(a,b) var_CreateGetFloat( VLC_OBJECT(a),b) +#define var_CreateGetString(a,b) var_CreateGetString( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyString(a,b) var_CreateGetNonEmptyString( VLC_OBJECT(a),b) +#define var_CreateGetAddress(a,b) var_CreateGetAddress( VLC_OBJECT(a),b) + +/** + * Create a integer command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetIntegerCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBoolCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a time command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetTimeCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetTime( p_obj, psz_name ); +} + +/** + * Create a float command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloatCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +#define var_CreateGetIntegerCommand(a,b) var_CreateGetIntegerCommand( VLC_OBJECT(a),b) +#define var_CreateGetBoolCommand(a,b) var_CreateGetBoolCommand( VLC_OBJECT(a),b) +#define var_CreateGetTimeCommand(a,b) var_CreateGetTimeCommand( VLC_OBJECT(a),b) +#define var_CreateGetFloatCommand(a,b) var_CreateGetFloatCommand( VLC_OBJECT(a),b) +#define var_CreateGetStringCommand(a,b) var_CreateGetStringCommand( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyStringCommand(a,b) var_CreateGetNonEmptyStringCommand( VLC_OBJECT(a),b) + +VLC_USED +static inline int var_CountChoices( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t count; + if( var_Change( p_obj, psz_name, VLC_VAR_CHOICESCOUNT, &count, NULL ) ) + return 0; + return count.i_int; +} +#define var_CountChoices(a,b) var_CountChoices( VLC_OBJECT(a),b) + + +static inline bool var_ToggleBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + var_GetAndSet( p_obj, psz_name, VLC_VAR_BOOL_TOGGLE, &val ); + return val.b_bool; +} +#define var_ToggleBool(a,b) var_ToggleBool( VLC_OBJECT(a),b ) + + +VLC_USED +static inline bool var_InheritBool( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_BOOL, &val ) ) + val.b_bool = false; + return val.b_bool; +} +#define var_InheritBool(o, n) var_InheritBool(VLC_OBJECT(o), n) + +VLC_USED +static inline int64_t var_InheritInteger( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_INTEGER, &val ) ) + val.i_int = 0; + return val.i_int; +} +#define var_InheritInteger(o, n) var_InheritInteger(VLC_OBJECT(o), n) + +VLC_USED +static inline float var_InheritFloat( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_FLOAT, &val ) ) + val.f_float = 0.; + return val.f_float; +} +#define var_InheritFloat(o, n) var_InheritFloat(VLC_OBJECT(o), n) + +VLC_USED VLC_MALLOC +static inline char *var_InheritString( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_STRING, &val ) ) + val.psz_string = NULL; + else if( val.psz_string && !*val.psz_string ) + { + free( val.psz_string ); + val.psz_string = NULL; + } + return val.psz_string; +} +#define var_InheritString(o, n) var_InheritString(VLC_OBJECT(o), n) + +VLC_USED +static inline mtime_t var_InheritTime( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_TIME, &val ) ) + val.i_time = 0; + return val.i_time; +} +#define var_InheritTime(o, n) var_InheritTime(VLC_OBJECT(o), n) + +VLC_USED +static inline void *var_InheritAddress( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_ADDRESS, &val ) ) + val.p_address = NULL; + return val.p_address; +} +#define var_InheritAddress(o, n) var_InheritAddress(VLC_OBJECT(o), n) + +VLC_API int var_InheritURational( vlc_object_t *, unsigned *num, unsigned *den, const char *var ); +#define var_InheritURational(a,b,c,d) var_InheritURational(VLC_OBJECT(a), b, c, d) + +#define var_GetInteger(a,b) var_GetInteger( VLC_OBJECT(a),b) +#define var_GetBool(a,b) var_GetBool( VLC_OBJECT(a),b) +#define var_GetTime(a,b) var_GetTime( VLC_OBJECT(a),b) +#define var_GetFloat(a,b) var_GetFloat( VLC_OBJECT(a),b) +#define var_GetString(a,b) var_GetString( VLC_OBJECT(a),b) +#define var_GetNonEmptyString(a,b) var_GetNonEmptyString( VLC_OBJECT(a),b) +#define var_GetAddress(a,b) var_GetAddress( VLC_OBJECT(a),b) + +VLC_API int var_LocationParse(vlc_object_t *, const char *mrl, const char *prefix); +#define var_LocationParse(o, m, p) var_LocationParse(VLC_OBJECT(o), m, p) + +/** + * @} + */ +#endif /* _VLC_VARIABLES_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_video_splitter.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_video_splitter.h new file mode 100644 index 0000000..419a4ca --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_video_splitter.h @@ -0,0 +1,158 @@ +/***************************************************************************** + * vlc_video_splitter.h: "video splitter" related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: eb2bf00f85a3ee2df1c35a90f12da4099a95a463 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VIDEO_SPLITTER_H +#define VLC_VIDEO_SPLITTER_H 1 + +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by video splitter filters. + */ + +typedef struct video_splitter_t video_splitter_t; +typedef struct video_splitter_sys_t video_splitter_sys_t; +typedef struct video_splitter_owner_t video_splitter_owner_t; + +/** Structure describing a video splitter output properties + */ +typedef struct +{ + /* Video format of the output */ + video_format_t fmt; + + /* Window hints */ + struct + { + /* Relative position. + * (0,0) is equal to the default position. + */ + int i_x; + int i_y; + + /* Alignment inside the window + */ + int i_align; + } window; + + /* Video output module + * Use NULL for default + */ + char *psz_module; + +} video_splitter_output_t; + +/** Structure describing a video splitter + */ +struct video_splitter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* configuration */ + config_chain_t *p_cfg; + + /* Input format + * It is filled by the creator and cannot be modified. + */ + video_format_t fmt; + + /* Output formats + * + * It can only be set in the open() function and must remain + * constant. + * The module is responsible for the allocation and deallocation. + */ + int i_output; + video_splitter_output_t *p_output; + + int (*pf_filter)( video_splitter_t *, picture_t *pp_dst[], + picture_t *p_src ); + int (*pf_mouse) ( video_splitter_t *, vlc_mouse_t *, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ); + + video_splitter_sys_t *p_sys; + + /* Buffer allocation */ + int (*pf_picture_new) ( video_splitter_t *, picture_t *pp_picture[] ); + void (*pf_picture_del) ( video_splitter_t *, picture_t *pp_picture[] ); + video_splitter_owner_t *p_owner; +}; + +/** + * It will create an array of pictures suitable as output. + * + * You must either returned them through pf_filter or by calling + * video_splitter_DeletePicture. + * + * If VLC_SUCCESS is not returned, pp_picture values are undefined. + */ +static inline int video_splitter_NewPicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + int i_ret = p_splitter->pf_picture_new( p_splitter, pp_picture ); + if( i_ret ) + msg_Warn( p_splitter, "can't get output pictures" ); + return i_ret; +} + +/** + * It will release an array of pictures created by video_splitter_NewPicture. + * Provided for convenience. + */ +static inline void video_splitter_DeletePicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + p_splitter->pf_picture_del( p_splitter, pp_picture ); +} + +/* */ +VLC_API video_splitter_t * video_splitter_New( vlc_object_t *, const char *psz_name, const video_format_t * ); +VLC_API void video_splitter_Delete( video_splitter_t * ); + +static inline int video_splitter_Filter( video_splitter_t *p_splitter, + picture_t *pp_dst[], picture_t *p_src ) +{ + return p_splitter->pf_filter( p_splitter, pp_dst, p_src ); +} +static inline int video_splitter_Mouse( video_splitter_t *p_splitter, + vlc_mouse_t *p_mouse, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ) +{ + if( !p_splitter->pf_mouse ) + { + *p_mouse = *p_new; + return VLC_SUCCESS; + } + return p_splitter->pf_mouse( p_splitter, p_mouse, i_index, p_old, p_new ); +} + +#endif /* VLC_VIDEO_SPLITTER_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_vlm.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vlm.h new file mode 100644 index 0000000..58680b6 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vlm.h @@ -0,0 +1,369 @@ +/***************************************************************************** + * vlc_vlm.h: VLM core structures + ***************************************************************************** + * Copyright (C) 2000, 2001 VLC authors and VideoLAN + * $Id: 11111da6edb9fbecaa750af4c2851a5f0c338f0b $ + * + * Authors: Simon Latapie + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VLM_H +#define VLC_VLM_H 1 + +/** + * \file + * This file defines VLM core functions and structures in vlc + */ + +#include + +/** + * \defgroup server VLM + * VLM is the server core in vlc that allows streaming of multiple media streams + * at the same time. It provides broadcast, schedule and video on demand features + * for streaming using several streaming and network protocols. + * @{ + */ + +/** VLM media */ +typedef struct +{ + int64_t id; /*< numeric id for vlm_media_t item */ + bool b_enabled; /*< vlm_media_t is enabled */ + + char *psz_name; /*< descriptive name of vlm_media_t item */ + + int i_input; /*< number of input options */ + char **ppsz_input; /*< array of input options */ + + int i_option; /*< number of output options */ + char **ppsz_option; /*< array of output options */ + + char *psz_output; /*< */ + + bool b_vod; /*< vlm_media_t is of type VOD */ + struct + { + bool b_loop; /*< this vlc_media_t broadcast item should loop */ + } broadcast; /*< Broadcast specific information */ + struct + { + char *psz_mux; /*< name of muxer to use */ + } vod; /*< VOD specific information */ + +} vlm_media_t; + +/** VLM media instance */ +typedef struct +{ + char *psz_name; /*< vlm media instance descriptive name */ + + int64_t i_time; /*< vlm media instance vlm media current time */ + int64_t i_length; /*< vlm media instance vlm media item length */ + double d_position; /*< vlm media instance position in stream */ + bool b_paused; /*< vlm media instance is paused */ + int i_rate; // normal is INPUT_RATE_DEFAULT +} vlm_media_instance_t; + +#if 0 +typedef struct +{ + +} vlm_schedule_t +#endif + +/** VLM events + * You can catch vlm event by adding a callback on the variable "intf-event" + * of the VLM object. + * This variable is an address that will hold a vlm_event_t* value. + */ +enum vlm_event_type_e +{ + /* */ + VLM_EVENT_MEDIA_ADDED = 0x100, + VLM_EVENT_MEDIA_REMOVED, + VLM_EVENT_MEDIA_CHANGED, + + /* */ + VLM_EVENT_MEDIA_INSTANCE_STARTED = 0x200, + VLM_EVENT_MEDIA_INSTANCE_STOPPED, + VLM_EVENT_MEDIA_INSTANCE_STATE, +}; + +typedef struct +{ + int i_type; /* a vlm_event_type_e value */ + int64_t id; /* Media ID */ + const char *psz_name; /* Media name */ + const char *psz_instance_name; /* Instance name or NULL */ + input_state_e input_state; /* Input instance event type */ +} vlm_event_t; + +/** VLM control query */ +enum vlm_query_e +{ + /* --- Media control */ + /* Get all medias */ + VLM_GET_MEDIAS, /* arg1=vlm_media_t ***, int *pi_media */ + /* Delete all medias */ + VLM_CLEAR_MEDIAS, /* no arg */ + + /* Add a new media */ + VLM_ADD_MEDIA, /* arg1=vlm_media_t* arg2=int64_t *p_id res=can fail */ + /* Delete an existing media */ + VLM_DEL_MEDIA, /* arg1=int64_t id */ + /* Change properties of an existing media (all fields but id and b_vod) */ + VLM_CHANGE_MEDIA, /* arg1=vlm_media_t* res=can fail */ + /* Get 1 media by it's ID */ + VLM_GET_MEDIA, /* arg1=int64_t id arg2=vlm_media_t ** */ + /* Get media ID from its name */ + VLM_GET_MEDIA_ID, /* arg1=const char *psz_name arg2=int64_t* */ + + /* Media instance control XXX VOD control are for internal use only */ + /* Get all media instances */ + VLM_GET_MEDIA_INSTANCES, /* arg1=int64_t id arg2=vlm_media_instance_t *** arg3=int *pi_instance */ + /* Delete all media instances */ + VLM_CLEAR_MEDIA_INSTANCES, /* arg1=int64_t id */ + /* Control broadcast instance */ + VLM_START_MEDIA_BROADCAST_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index res=can fail */ + /* Control VOD instance */ + VLM_START_MEDIA_VOD_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index char *psz_vod_output res=can fail */ + /* Stop an instance */ + VLM_STOP_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Pause an instance */ + VLM_PAUSE_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Get instance position time (in microsecond) */ + VLM_GET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t * */ + /* Set instance position time (in microsecond) */ + VLM_SET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t */ + /* Get instance position ([0.0 .. 1.0]) */ + VLM_GET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double * */ + /* Set instance position ([0.0 .. 1.0]) */ + VLM_SET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double */ + + /* Schedule control */ + VLM_CLEAR_SCHEDULES, /* no arg */ + /* TODO: missing schedule control */ + + /* */ +}; + + +/* VLM specific - structures and functions */ + +/* ok, here is the structure of a vlm_message: + The parent node is ( name_of_the_command , NULL ), or + ( name_of_the_command , message_error ) on error. + If a node has children, it should not have a value (=NULL).*/ +struct vlm_message_t +{ + char *psz_name; /*< message name */ + char *psz_value; /*< message value */ + + int i_child; /*< number of child messages */ + vlm_message_t **child; /*< array of vlm_message_t */ +}; + + +#ifdef __cplusplus +extern "C" { +#endif + +VLC_API vlm_t * vlm_New( vlc_object_t * ); +#define vlm_New( a ) vlm_New( VLC_OBJECT(a) ) +VLC_API void vlm_Delete( vlm_t * ); +VLC_API int vlm_ExecuteCommand( vlm_t *, const char *, vlm_message_t ** ); +VLC_API int vlm_Control( vlm_t *p_vlm, int i_query, ... ); + +VLC_API vlm_message_t * vlm_MessageSimpleNew( const char * ); +VLC_API vlm_message_t * vlm_MessageNew( const char *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API vlm_message_t * vlm_MessageAdd( vlm_message_t *, vlm_message_t * ); +VLC_API void vlm_MessageDelete( vlm_message_t * ); + +/* media helpers */ + +/** + * Initialize a vlm_media_t instance + * \param p_media vlm_media_t instance to initialize + */ +static inline void vlm_media_Init( vlm_media_t *p_media ) +{ + memset( p_media, 0, sizeof(vlm_media_t) ); + p_media->id = 0; // invalid id + p_media->psz_name = NULL; + TAB_INIT( p_media->i_input, p_media->ppsz_input ); + TAB_INIT( p_media->i_option, p_media->ppsz_option ); + p_media->psz_output = NULL; + p_media->b_vod = false; + + p_media->vod.psz_mux = NULL; + p_media->broadcast.b_loop = false; +} + +/** + * Copy a vlm_media_t instance into another vlm_media_t instance + * \param p_dst vlm_media_t instance to copy to + * \param p_src vlm_media_t instance to copy from + */ +static inline void +#ifndef __cplusplus +vlm_media_Copy( vlm_media_t *restrict p_dst, const vlm_media_t *restrict p_src ) +#else +vlm_media_Copy( vlm_media_t *p_dst, const vlm_media_t *p_src ) +#endif +{ + int i; + + memset( p_dst, 0, sizeof(vlm_media_t) ); + p_dst->id = p_src->id; + p_dst->b_enabled = p_src->b_enabled; + if( p_src->psz_name ) + p_dst->psz_name = strdup( p_src->psz_name ); + + for( i = 0; i < p_src->i_input; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_input, p_dst->ppsz_input, strdup(p_src->ppsz_input[i]) ); + for( i = 0; i < p_src->i_option; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_option, p_dst->ppsz_option, strdup(p_src->ppsz_option[i]) ); + + if( p_src->psz_output ) + p_dst->psz_output = strdup( p_src->psz_output ); + + p_dst->b_vod = p_src->b_vod; + if( p_src->b_vod ) + { + if( p_src->vod.psz_mux ) + p_dst->vod.psz_mux = strdup( p_src->vod.psz_mux ); + } + else + { + p_dst->broadcast.b_loop = p_src->broadcast.b_loop; + } +} + +/** + * Cleanup and release memory associated with this vlm_media_t instance. + * You still need to release p_media itself with vlm_media_Delete(). + * \param p_media vlm_media_t to cleanup + */ +static inline void vlm_media_Clean( vlm_media_t *p_media ) +{ + int i; + free( p_media->psz_name ); + + for( i = 0; i < p_media->i_input; i++ ) + free( p_media->ppsz_input[i]); + TAB_CLEAN(p_media->i_input, p_media->ppsz_input ); + + for( i = 0; i < p_media->i_option; i++ ) + free( p_media->ppsz_option[i]); + TAB_CLEAN(p_media->i_option, p_media->ppsz_option ); + + free( p_media->psz_output ); + if( p_media->b_vod ) + free( p_media->vod.psz_mux ); +} + +/** + * Allocate a new vlm_media_t instance + * \return vlm_media_t instance + */ +static inline vlm_media_t *vlm_media_New(void) +{ + vlm_media_t *p_media = (vlm_media_t *)malloc( sizeof(vlm_media_t) ); + if( p_media ) + vlm_media_Init( p_media ); + return p_media; +} + +/** + * Delete a vlm_media_t instance + * \param p_media vlm_media_t instance to delete + */ +static inline void vlm_media_Delete( vlm_media_t *p_media ) +{ + vlm_media_Clean( p_media ); + free( p_media ); +} + +/** + * Copy a vlm_media_t instance + * \param p_src vlm_media_t instance to copy + * \return vlm_media_t duplicate of p_src + */ +static inline vlm_media_t *vlm_media_Duplicate( vlm_media_t *p_src ) +{ + vlm_media_t *p_dst = vlm_media_New(); + if( p_dst ) + vlm_media_Copy( p_dst, p_src ); + return p_dst; +} + +/* media instance helpers */ +/** + * Initialize vlm_media_instance_t + * \param p_instance vlm_media_instance_t to initialize + */ +static inline void vlm_media_instance_Init( vlm_media_instance_t *p_instance ) +{ + memset( p_instance, 0, sizeof(vlm_media_instance_t) ); + p_instance->psz_name = NULL; + p_instance->i_time = 0; + p_instance->i_length = 0; + p_instance->d_position = 0.0; + p_instance->b_paused = false; + p_instance->i_rate = INPUT_RATE_DEFAULT; +} + +/** + * Cleanup vlm_media_instance_t + * \param p_instance vlm_media_instance_t to cleanup + */ +static inline void vlm_media_instance_Clean( vlm_media_instance_t *p_instance ) +{ + free( p_instance->psz_name ); +} + +/** + * Allocate a new vlm_media_instance_t + * \return a new vlm_media_instance_t + */ +static inline vlm_media_instance_t *vlm_media_instance_New(void) +{ + vlm_media_instance_t *p_instance = (vlm_media_instance_t *) malloc( sizeof(vlm_media_instance_t) ); + if( p_instance ) + vlm_media_instance_Init( p_instance ); + return p_instance; +} + +/** + * Delete a vlm_media_instance_t + * \param p_instance vlm_media_instance_t to delete + */ +static inline void vlm_media_instance_Delete( vlm_media_instance_t *p_instance ) +{ + vlm_media_instance_Clean( p_instance ); + free( p_instance ); +} + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout.h new file mode 100644 index 0000000..2ff13aa --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_vout.h: common video definitions + ***************************************************************************** + * Copyright (C) 1999 - 2008 VLC authors and VideoLAN + * $Id: b39e49b564e8367df07a2a85ee8bddfac6b548c4 $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_H_ +#define VLC_VOUT_H_ 1 + +/** + * \file + * This file defines common video output structures and functions in vlc + */ + +#include +#include +#include + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * \defgroup video_output Video Output + * This module describes the programming interface for video output threads. + * It includes functions allowing to open a new thread, send pictures to a + * thread, and destroy a previously opened video output thread. + * @{ + */ + +/** + * Vout configuration + */ +typedef struct { + vout_thread_t *vout; + vlc_object_t *input; + bool change_fmt; + const video_format_t *fmt; + unsigned dpb_size; +} vout_configuration_t; + +/** + * Video output thread private structure + */ +typedef struct vout_thread_sys_t vout_thread_sys_t; + +/** + * Video output thread descriptor + * + * Any independent video output device, such as an X11 window or a GGI device, + * is represented by a video output thread, and described using the following + * structure. + */ +struct vout_thread_t { + VLC_COMMON_MEMBERS + + /* Private vout_thread data */ + vout_thread_sys_t *p; +}; + +/* Alignment flags */ +#define VOUT_ALIGN_LEFT 0x0001 +#define VOUT_ALIGN_RIGHT 0x0002 +#define VOUT_ALIGN_HMASK 0x0003 +#define VOUT_ALIGN_TOP 0x0004 +#define VOUT_ALIGN_BOTTOM 0x0008 +#define VOUT_ALIGN_VMASK 0x000C + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * Returns a suitable vout or release the given one. + * + * If cfg->fmt is non NULL and valid, a vout will be returned, reusing cfg->vout + * is possible, otherwise it returns NULL. + * If cfg->vout is not used, it will be closed and released. + * + * You can release the returned value either by vout_Request or vout_Close() + * followed by a vlc_object_release() or shorter vout_CloseAndRelease() + * + * \param object a vlc object + * \param cfg the video configuration requested. + * \return a vout + */ +VLC_API vout_thread_t * vout_Request( vlc_object_t *object, const vout_configuration_t *cfg ); +#define vout_Request(a,b) vout_Request(VLC_OBJECT(a),b) + +/** + * This function will close a vout created by vout_Request. + * The associated vout module is closed. + * Note: It is not released yet, you'll have to call vlc_object_release() + * or use the convenient vout_CloseAndRelease(). + * + * \param p_vout the vout to close + */ +VLC_API void vout_Close( vout_thread_t *p_vout ); + +/** + * This function will close a vout created by vout_Create + * and then release it. + * + * \param p_vout the vout to close and release + */ +static inline void vout_CloseAndRelease( vout_thread_t *p_vout ) +{ + vout_Close( p_vout ); + vlc_object_release( p_vout ); +} + +/** + * This function will handle a snapshot request. + * + * pp_image, pp_picture and p_fmt can be NULL otherwise they will be + * set with returned value in case of success. + * + * pp_image will hold an encoded picture in psz_format format. + * + * i_timeout specifies the time the function will wait for a snapshot to be + * available. + * + */ +VLC_API int vout_GetSnapshot( vout_thread_t *p_vout, + block_t **pp_image, picture_t **pp_picture, + video_format_t *p_fmt, + const char *psz_format, mtime_t i_timeout ); + +VLC_API void vout_ChangeAspectRatio( vout_thread_t *p_vout, + unsigned int i_num, unsigned int i_den ); + +/* */ +VLC_API picture_t * vout_GetPicture( vout_thread_t * ); +VLC_API void vout_PutPicture( vout_thread_t *, picture_t * ); + +VLC_API void vout_HoldPicture( vout_thread_t *, picture_t * ); +VLC_API void vout_ReleasePicture( vout_thread_t *, picture_t * ); + +/* */ +VLC_API void vout_PutSubpicture( vout_thread_t *, subpicture_t * ); +VLC_API int vout_RegisterSubpictureChannel( vout_thread_t * ); +VLC_API void vout_FlushSubpictureChannel( vout_thread_t *, int ); + +VLC_API void vout_EnableFilter( vout_thread_t *, const char *,bool , bool ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_display.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_display.h new file mode 100644 index 0000000..8142b91 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_display.h @@ -0,0 +1,453 @@ +/***************************************************************************** + * vlc_vout_display.h: vout_display_t definitions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: f5f68177a4b543fcd986363dc2563dbce0f81298 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_DISPLAY_H +#define VLC_VOUT_DISPLAY_H 1 + +/** + * \file + * This file defines vout display structures and functions in vlc + */ + +#include +#include +#include +#include +#include +#include +#include + +/* XXX + * Do NOT use video_format_t::i_aspect but i_sar_num/den everywhere. i_aspect + * will be removed as soon as possible. + * + */ +typedef struct vout_display_t vout_display_t; +typedef struct vout_display_sys_t vout_display_sys_t; +typedef struct vout_display_owner_t vout_display_owner_t; +typedef struct vout_display_owner_sys_t vout_display_owner_sys_t; + +/** + * Possible alignments for vout_display. + */ +typedef enum +{ + VOUT_DISPLAY_ALIGN_CENTER, + /* */ + VOUT_DISPLAY_ALIGN_LEFT, + VOUT_DISPLAY_ALIGN_RIGHT, + /* */ + VOUT_DISPLAY_ALIGN_TOP, + VOUT_DISPLAY_ALIGN_BOTTOM, +} vout_display_align_t; + +/** + * Window management state. + */ +enum { + VOUT_WINDOW_STATE_NORMAL=0, + VOUT_WINDOW_STATE_ABOVE=1, + VOUT_WINDOW_STATE_BELOW=2, + VOUT_WINDOW_STACK_MASK=3, +}; + +/** + * Initial/Current configuration for a vout_display_t + */ +typedef struct { + bool is_fullscreen; /* Is the display fullscreen */ + + /* Display properties */ + struct { + /* Window title (may be NULL) */ + const char *title; + + /* Display size */ + unsigned width; + unsigned height; + + /* Display SAR */ + struct { + unsigned num; + unsigned den; + } sar; + } display; + + /* Alignment of the picture inside the display */ + struct { + int horizontal; + int vertical; + } align; + + /* Do we fill up the display with the video */ + bool is_display_filled; + + /* Zoom to use + * It will be applied to the whole display if b_display_filled is set, otherwise + * only on the video source */ + struct { + int num; + int den; + } zoom; + +} vout_display_cfg_t; + +/** + * Information from a vout_display_t to configure + * the core behaviour. + * + * By default they are all false or NULL. + * + */ +typedef struct { + bool is_slow; /* The picture memory has slow read/write */ + bool has_double_click; /* Is double-click generated */ + bool has_hide_mouse; /* Is mouse automatically hidden */ + bool has_pictures_invalid; /* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */ + bool has_event_thread; /* Will events (key at least) be emitted using an independent thread */ + const vlc_fourcc_t *subpicture_chromas; /* List of supported chromas for subpicture rendering. */ +} vout_display_info_t; + +/** + * Control query for vout_display_t + */ +enum { + /* Hide the mouse. It will be sent when + * vout_display_t::info.b_hide_mouse is false */ + VOUT_DISPLAY_HIDE_MOUSE, + + /* Ask to reset the internal buffers after a VOUT_DISPLAY_EVENT_PICTURES_INVALID + * request. + */ + VOUT_DISPLAY_RESET_PICTURES, + + /* Ask the module to acknowledge/refuse the fullscreen state change after + * being requested (externally or by VOUT_DISPLAY_EVENT_FULLSCREEN */ + VOUT_DISPLAY_CHANGE_FULLSCREEN, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse the window management state change + * after being requested externally or by VOUT_DISPLAY_WINDOW_STATE */ + VOUT_DISPLAY_CHANGE_WINDOW_STATE, /* unsigned state */ + + /* Ask the module to acknowledge/refuse the display size change requested + * (externally or by VOUT_DISPLAY_EVENT_DISPLAY_SIZE) */ + VOUT_DISPLAY_CHANGE_DISPLAY_SIZE, /* const vout_display_cfg_t *p_cfg, int is_forced */ + + /* Ask the module to acknowledge/refuse fill display state change after + * being requested externally */ + VOUT_DISPLAY_CHANGE_DISPLAY_FILLED, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse zoom change after being requested + * externally */ + VOUT_DISPLAY_CHANGE_ZOOM, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse source aspect ratio after being + * requested externally */ + VOUT_DISPLAY_CHANGE_SOURCE_ASPECT, /* const video_format_t *p_source */ + + /* Ask the module to acknowledge/refuse source crop change after being + * requested externally. + * The cropping requested is stored by video_format_t::i_x/y_offset and + * video_format_t::i_visible_width/height */ + VOUT_DISPLAY_CHANGE_SOURCE_CROP, /* const video_format_t *p_source */ + + /* Ask an opengl interface if available. */ + VOUT_DISPLAY_GET_OPENGL, /* vlc_gl_t ** */ +}; + +/** + * Event from vout_display_t + * + * Events modifiying the state may be sent multiple times. + * Only the transition will be retained and acted upon. + */ +enum { + /* TODO: + * ZOOM ? DISPLAY_FILLED ? ON_TOP ? + */ + /* */ + VOUT_DISPLAY_EVENT_PICTURES_INVALID, /* The buffer are now invalid and need to be changed */ + + VOUT_DISPLAY_EVENT_FULLSCREEN, + VOUT_DISPLAY_EVENT_WINDOW_STATE, + + VOUT_DISPLAY_EVENT_DISPLAY_SIZE, /* The display size need to change : int i_width, int i_height, bool is_fullscreen */ + + /* */ + VOUT_DISPLAY_EVENT_CLOSE, + VOUT_DISPLAY_EVENT_KEY, + + /* Full mouse state. + * You can use it OR use the other mouse events. The core will do + * the conversion. + */ + VOUT_DISPLAY_EVENT_MOUSE_STATE, + + /* Mouse event */ + VOUT_DISPLAY_EVENT_MOUSE_MOVED, + VOUT_DISPLAY_EVENT_MOUSE_PRESSED, + VOUT_DISPLAY_EVENT_MOUSE_RELEASED, + VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK, +}; + +/** + * Vout owner structures + */ +struct vout_display_owner_t { + /* Private place holder for the vout_display_t creator + */ + vout_display_owner_sys_t *sys; + + /* Event coming from the module + * + * This function is set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_SendEvent* + * wrapper. + * + * You can send it at any time i.e. from any vout_display_t functions or + * from another thread. + * Be careful, it does not ensure correct serialization if it is used + * from multiple threads. + */ + void (*event)(vout_display_t *, int, va_list); + + /* Window management + * + * These functions are set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_*Window + * wrapper */ + vout_window_t *(*window_new)(vout_display_t *, const vout_window_cfg_t *); + void (*window_del)(vout_display_t *, vout_window_t *); +}; + +struct vout_display_t { + VLC_COMMON_MEMBERS + + /* Module */ + module_t *module; + + /* Initial and current configuration. + * You cannot modify it directly, you must use the appropriate events. + * + * It reflects the current values, i.e. after the event has been accepted + * and applied/configured if needed. + */ + const vout_display_cfg_t *cfg; + + /* video source format. + * + * Cropping is not requested while in the open function. + * You cannot change it. + */ + video_format_t source; + + /* picture_t format. + * + * You can only change it inside the module open function to + * match what you want, and when a VOUT_DISPLAY_RESET_PICTURES control + * request is made and succeeds. + * + * By default, it is equal to ::source except for the aspect ratio + * which is undefined(0) and is ignored. + */ + video_format_t fmt; + + /* Information + * + * You can only set them in the open function. + */ + vout_display_info_t info; + + /* Return a pointer over the current picture_pool_t* (mandatory). + * + * For performance reasons, it is best to provide at least count + * pictures but it is not mandatory. + * You can return NULL when you cannot/do not want to allocate + * pictures. + * The vout display module keeps the ownership of the pool and can + * destroy it only when closing or on invalid pictures control. + */ + picture_pool_t *(*pool)(vout_display_t *, unsigned count); + + /* Prepare a picture and an optional subpicture for display (optional). + * + * It is called before the next pf_display call to provide as much + * time as possible to prepare the given picture and the subpicture + * for display. + * You are guaranted that pf_display will always be called and using + * the exact same picture_t and subpicture_t. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + */ + void (*prepare)(vout_display_t *, picture_t *, subpicture_t *); + + /* Display a picture and an optional subpicture (mandatory). + * + * The picture and the optional subpicture must be displayed as soon as + * possible. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + * + * This function gives away the ownership of the picture and of the + * subpicture, so you must release them as soon as possible. + */ + void (*display)(vout_display_t *, picture_t *, subpicture_t *); + + /* Control on the module (mandatory) */ + int (*control)(vout_display_t *, int, va_list); + + /* Manage pending event (optional) */ + void (*manage)(vout_display_t *); + + /* Private place holder for the vout_display_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_display_sys_t *sys; + + /* Reserved for the vout_display_t owner. + * + * It must not be overwritten nor used directly by a module. + */ + vout_display_owner_t owner; +}; + +static inline void vout_display_SendEvent(vout_display_t *vd, int query, ...) +{ + va_list args; + va_start(args, query); + vd->owner.event(vd, query, args); + va_end(args); +} + +static inline void vout_display_SendEventDisplaySize(vout_display_t *vd, int width, int height, bool is_fullscreen) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_DISPLAY_SIZE, width, height, is_fullscreen); +} +static inline void vout_display_SendEventPicturesInvalid(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_PICTURES_INVALID); +} +static inline void vout_display_SendEventClose(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_CLOSE); +} +static inline void vout_display_SendEventKey(vout_display_t *vd, int key) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_KEY, key); +} +static inline void vout_display_SendEventFullscreen(vout_display_t *vd, bool is_fullscreen) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_FULLSCREEN, is_fullscreen); +} +static inline void vout_display_SendWindowState(vout_display_t *vd, unsigned state) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_WINDOW_STATE, state); +} +/* The mouse position (State and Moved event) must be expressed against vout_display_t::source unit */ +static inline void vout_display_SendEventMouseState(vout_display_t *vd, int x, int y, int button_mask) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_STATE, x, y, button_mask); +} +static inline void vout_display_SendEventMouseMoved(vout_display_t *vd, int x, int y) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_MOVED, x, y); +} +static inline void vout_display_SendEventMousePressed(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_PRESSED, button); +} +static inline void vout_display_SendEventMouseReleased(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_RELEASED, button); +} +static inline void vout_display_SendEventMouseDoubleClick(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK); +} + +/** + * Asks for a new window with the given configuration as hint. + * + * b_standalone/i_x/i_y may be overwritten by the core + */ +static inline vout_window_t *vout_display_NewWindow(vout_display_t *vd, const vout_window_cfg_t *cfg) +{ + return vd->owner.window_new(vd, cfg); +} +/** + * Deletes a window created by vout_display_NewWindow if window is non NULL + * or any unused windows otherwise. + */ +static inline void vout_display_DeleteWindow(vout_display_t *vd, + vout_window_t *window) +{ + vd->owner.window_del(vd, window); +} + +/** + * Computes the default display size given the source and + * the display configuration. + * + * This asssumes that the picture is already cropped. + */ +VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height, const video_format_t *source, const vout_display_cfg_t *); + + +/** + * Structure used to store the result of a vout_display_PlacePicture. + */ +typedef struct { + int x; + int y; + unsigned width; + unsigned height; +} vout_display_place_t; + +/** + * Computes how to place a picture inside the display to respect + * the given parameters. + * This assumes that cropping is done by an external mean. + * + * \param p_place Place inside the window (window pixel unit) + * \param p_source Video source format + * \param p_cfg Display configuration + * \param b_clip If true, prevent the video to go outside the display (break zoom). + */ +VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping); + + +/** + * Helper function that applies the necessary transforms to the mouse position + * and then calls vout_display_SendEventMouseMoved. + * + * \param vd vout_display_t. + * \param orient_display The orientation of the picture as seen on screen (probably ORIENT_NORMAL). + * \param m_x Mouse x position (relative to place, origin is top left). + * \param m_y Mouse y position (relative to place, origin is top left). + * \param place Place of the picture. + */ +VLC_API void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y, + vout_display_place_t *place); +#endif /* VLC_VOUT_DISPLAY_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_osd.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_osd.h new file mode 100644 index 0000000..8b2b27d --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_osd.h @@ -0,0 +1,98 @@ +/***************************************************************************** + * vlc_vout_osd.h: vout OSD + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2004-2005 M2X + * $Id: 74d79379258cf0af1cdafcd45946c7b4cf23b01f $ + * + * Authors: Jean-Paul Saman + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_OSD_H +#define VLC_VOUT_OSD_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * OSD menu position and picture type defines + */ +enum +{ + /* Icons */ + OSD_PLAY_ICON = 1, + OSD_PAUSE_ICON, + OSD_SPEAKER_ICON, + OSD_MUTE_ICON, + /* Sliders */ + OSD_HOR_SLIDER, + OSD_VERT_SLIDER, +}; + +/********************************************************************** + * Vout text and widget overlays + **********************************************************************/ +VLC_API int vout_OSDEpg( vout_thread_t *, input_item_t * ); + +/** + * \brief Write an informative message if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param position Position of the text + * \param duration Duration of the text being displayed + * \param text Text to be displayed + */ +VLC_API void vout_OSDText( vout_thread_t *vout, int channel, int position, mtime_t duration, const char *text ); + +/** + * \brief Write an informative message at the default location, + * for the default duration and only if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param format printf style formatting + * + * Provided for convenience. + */ +VLC_API void vout_OSDMessage( vout_thread_t *, int, const char *, ... ) VLC_FORMAT( 3, 4 ); + +/** + * Display a slider on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_postion Current position in the slider + * \param i_type Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER. + */ +VLC_API void vout_OSDSlider( vout_thread_t *, int, int , short ); + +/** + * Display an Icon on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_type Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON + */ +VLC_API void vout_OSDIcon( vout_thread_t *, int, short ); + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_VOUT_OSD_H */ + diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_window.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_window.h new file mode 100644 index 0000000..85dd6d0 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_vout_window.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_vout_window.h: vout_window_t definitions + ***************************************************************************** + * Copyright (C) 2008 Rémi Denis-Courmont + * Copyright (C) 2009 Laurent Aimar + * $Id: ed7d42c89657225e42bcf8dab18a61710f41d635 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_WINDOW_H +#define VLC_VOUT_WINDOW_H 1 + +/** + * \file + * This file defines vout windows structures and functions in vlc + */ + +#include + +/* */ +typedef struct vout_window_t vout_window_t; +typedef struct vout_window_sys_t vout_window_sys_t; + + +/** + * Window handle type + */ +enum { + VOUT_WINDOW_TYPE_INVALID=0, + VOUT_WINDOW_TYPE_XID, + VOUT_WINDOW_TYPE_HWND, + VOUT_WINDOW_TYPE_NSOBJECT, + VOUT_WINDOW_TYPE_ANDROID_NATIVE, +}; + +/** + * Control query for vout_window_t + */ +enum { + VOUT_WINDOW_SET_STATE, /* unsigned state */ + VOUT_WINDOW_SET_SIZE, /* unsigned i_width, unsigned i_height */ + VOUT_WINDOW_SET_FULLSCREEN, /* int b_fullscreen */ +}; + +typedef struct { + /* If true, a standalone window is requested */ + bool is_standalone; + + /* Window handle type */ + unsigned type; + + /* Window position hint */ + int x; + int y; + + /* Windows size hint */ + unsigned width; + unsigned height; + +} vout_window_cfg_t; + +/** + * FIXME do we need an event system in the window too ? + * or the window user will take care of it ? + */ +struct vout_window_t { + VLC_COMMON_MEMBERS + + unsigned type; /**< Window handle type */ + + /* window handle (mandatory) + * + * It must be filled in the open function. + */ + union { + void *hwnd; /* Win32 window handle */ + uint32_t xid; /* X11 windows ID */ + void *nsobject; /* Mac OSX view object */ + void *anativewindow; /* Android native window. */ + } handle; + + /* display server (mandatory) */ + union { + char *x11; /* X11 display (NULL = use default) */ + } display; + + /* Control on the module (mandatory) + * + * Do not use it directly; use vout_window_Control instead. + */ + int (*control)(vout_window_t *, int query, va_list); + + /* Private place holder for the vout_window_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_window_sys_t *sys; +}; + +/** + * Creates a new window. + * + * @param module plugin name (usually "$window") + * @note If you are inside a "vout display", you must use + / vout_display_NewWindow() and vout_display_DeleteWindow() instead. + * This enables recycling windows. + */ +VLC_API vout_window_t * vout_window_New(vlc_object_t *, const char *module, const vout_window_cfg_t *); + +/** + * Deletes a window created by vout_window_New(). + * + * @note See vout_window_New() about window recycling. + */ +VLC_API void vout_window_Delete(vout_window_t *); + + +/** + * Reconfigures a window. + * + * @note The vout_window_* wrappers should be used instead of this function. + * + * @warning The caller must own the window, as vout_window_t is not thread safe. + */ +VLC_API int vout_window_Control(vout_window_t *, int query, ...); + +/** + * Configures the window manager state for this window. + */ +static inline int vout_window_SetState(vout_window_t *window, unsigned state) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_STATE, state); +} + +/** + * Configures the window display (i.e. inner/useful) size. + */ +static inline int vout_window_SetSize(vout_window_t *window, + unsigned width, unsigned height) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_SIZE, width, height); +} + +/** + * Sets fullscreen mode. + */ +static inline int vout_window_SetFullScreen(vout_window_t *window, bool full) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_FULLSCREEN, full); +} + +#endif /* VLC_VOUT_WINDOW_H */ diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_xlib.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_xlib.h new file mode 100644 index 0000000..b6818c1 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_xlib.h @@ -0,0 +1,57 @@ +/***************************************************************************** + * vlc_xlib.h: initialization of Xlib + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XLIB_H +# define VLC_XLIB_H 1 + +# include +# include +# include +# include + +static inline bool vlc_xlib_init (vlc_object_t *obj) +{ + if (!var_InheritBool (obj, "xlib")) + return false; + + bool ok = false; + + /* XInitThreads() can be called multiple times, + * but it is not reentrant, so we need this global lock. */ + vlc_global_lock (VLC_XLIB_MUTEX); + + if (_Xglobal_lock == NULL && unlikely(_XErrorFunction != NULL)) + /* (_Xglobal_lock == NULL) => Xlib threads not initialized */ + /* (_XErrorFunction != NULL) => Xlib already in use */ + fprintf (stderr, "%s:%u:%s: Xlib not initialized for threads.\n" + "This process is probably using LibVLC incorrectly.\n" + "Pass \"--no-xlib\" to libvlc_new() to fix this.\n", + __FILE__, __LINE__, __func__); + else if (XInitThreads ()) + ok = true; + + vlc_global_unlock (VLC_XLIB_MUTEX); + + if (!ok) + msg_Err (obj, "Xlib not initialized for threads"); + return ok; +} + +#endif diff --git a/vlcdemo/vlc/vlc2/include64/plugins/vlc_xml.h b/vlcdemo/vlc/vlc2/include64/plugins/vlc_xml.h new file mode 100644 index 0000000..3bb8312 --- /dev/null +++ b/vlcdemo/vlc/vlc2/include64/plugins/vlc_xml.h @@ -0,0 +1,120 @@ +/***************************************************************************** + * vlc_xml.h: XML abstraction layer + ***************************************************************************** + * Copyright (C) 2004-2010 VLC authors and VideoLAN + * + * Author: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XML_H +#define VLC_XML_H + +/** +* \file +* This file defines functions and structures to handle xml tags in vlc +* +*/ + +# ifdef __cplusplus +extern "C" { +# endif + +struct xml_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + xml_sys_t *p_sys; + + void (*pf_catalog_load) ( xml_t *, const char * ); + void (*pf_catalog_add) ( xml_t *, const char *, const char *, + const char * ); +}; + +VLC_API xml_t * xml_Create( vlc_object_t * ) VLC_USED; +#define xml_Create( a ) xml_Create( VLC_OBJECT(a) ) +VLC_API void xml_Delete( xml_t * ); + +static inline void xml_CatalogLoad( xml_t *xml, const char *catalog ) +{ + xml->pf_catalog_load( xml, catalog ); +} + +static inline void xml_CatalogAdd( xml_t *xml, const char *type, + const char *orig, const char *value ) +{ + xml->pf_catalog_add( xml, type, orig, value ); +} + + +struct xml_reader_t +{ + VLC_COMMON_MEMBERS + + xml_reader_sys_t *p_sys; + stream_t *p_stream; + module_t *p_module; + + int (*pf_next_node) ( xml_reader_t *, const char ** ); + const char *(*pf_next_attr) ( xml_reader_t *, const char ** ); + + int (*pf_use_dtd) ( xml_reader_t * ); + int (*pf_is_empty) ( xml_reader_t * ); +}; + +VLC_API xml_reader_t * xml_ReaderCreate(vlc_object_t *, stream_t *) VLC_USED; +#define xml_ReaderCreate( a, s ) xml_ReaderCreate(VLC_OBJECT(a), s) +VLC_API void xml_ReaderDelete(xml_reader_t *); +VLC_API xml_reader_t * xml_ReaderReset(xml_reader_t *, stream_t *) VLC_USED; + +static inline int xml_ReaderNextNode( xml_reader_t *reader, const char **pval ) +{ + return reader->pf_next_node( reader, pval ); +} + +static inline const char *xml_ReaderNextAttr( xml_reader_t *reader, + const char **pval ) +{ + return reader->pf_next_attr( reader, pval ); +} + +static inline int xml_ReaderUseDTD( xml_reader_t *reader ) +{ + return reader->pf_use_dtd( reader ); +} + +static inline int xml_ReaderIsEmptyElement( xml_reader_t *reader ) +{ + if(reader->pf_is_empty == NULL) + return -2; + + return reader->pf_is_empty( reader ); +} + +enum { + XML_READER_NONE=0, + XML_READER_STARTELEM, + XML_READER_ENDELEM, + XML_READER_TEXT, +}; + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc2/winlib/libvlc.lib b/vlcdemo/vlc/vlc2/winlib/libvlc.lib new file mode 100644 index 0000000000000000000000000000000000000000..02d3e00f79623cfb63ebc622d92abe671ecbbd77 GIT binary patch literal 226748 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 literal 0 HcmV?d00001 diff --git a/vlcdemo/vlc/vlc2/winlib/libvlccore.lib b/vlcdemo/vlc/vlc2/winlib/libvlccore.lib new file mode 100644 index 0000000000000000000000000000000000000000..895582bead24b34bafa26efce8e9ba8e69352819 GIT binary patch literal 520972 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 literal 0 HcmV?d00001 diff --git a/vlcdemo/vlc/vlc2/winlib64/libvlc.lib b/vlcdemo/vlc/vlc2/winlib64/libvlc.lib new file mode 100644 index 0000000000000000000000000000000000000000..4008a0b6df0f4b363587247c35a2273c873b48f3 GIT binary patch literal 227294 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 literal 0 HcmV?d00001 diff --git a/vlcdemo/vlc/vlc2/winlib64/libvlccore.lib b/vlcdemo/vlc/vlc2/winlib64/libvlccore.lib new file mode 100644 index 0000000000000000000000000000000000000000..9c8d552720c659eb4850b8fa4315e091a0eec00d GIT binary patch literal 522246 zcmeFa4}4r#btir`lB|#d4G=>3(_mZ^(lj-)EK7EphS;(lJGC8Q*$HGr#-o`hY2wk$ zFf)?vG!1SR(ln&03oHdnX_i7arIcoYrO>4%%NEK~%2HryVJT2bDN8A(Eu}yy{LZ=O z{(XN&cb+f)eIB}FpBcS#&iixU``+`;J?H*;#x<2rb?Mp*pS{ukY@OV>eQIKQ>$dTY z8{t2E%D?Wo_uRr5(tB$}@4JC9qz_z9^g+08q(A*A(MR6G7}Cei5Pf2nF{DqzH6wlc@kE~; zVGQZ7K2P+8M;Jr;+t(6(`Ci75{$9}6nv5a+^I@WIOfrV_Ehs0_zkQwPyWeFDXlUs7 ziALVQhLFbYBD(N4HiYz;9Yhyh#)gm{{}rMqzMBmpUHW38rygZPNSAFQdd6ef5Ymr+ ziRg0pMf$Oi5?%F9HiY!-*Aq?L&4!S+A1B&z9UDUW$&EzUUdV=!uKPOC%!kk^a7%f zL%ERt9PS;`r|u;B%UjtH(&rY4{u-VW(ibly`qJ0f5Ypely+Hcv!$kl1dNzdg^}C7w z^(Y%c`t~@{zi(zkKqWRpRQeDrA&tJ4=z<0-A^p$|M323am5?5{f#?Z;#7an)ypHI} zcd!!D({>X*eG@AoZDK^5Kf_8$&w3}(mG`p}(oft@|FF~1*UUrJ;KOJNxq*uYcNBULR7wOmjg6Kgw57KYEjOaHTtc3Ji zus_n9Yec^b}v=Mkdsy@r*5hD%MN(JR?7(%5&1F8mN1MtaOcL>H~H zVWcPQA-ZHE8%DbH>qJj|KO086>{Ue1IL?NVHeW$>`4`wQ(vQ8J=&HNfFw(P^h$i;4 zVWjPwiKf5FhLNuRAkj~~fej;F_W;ohTsP9b8;A}}v00!85q_;sCk=}8b=v`abFw(m(CVCIt zBc%TU*MRg#UnKftzyi_--%9kSFJr?61;OPv66akv8P&TCBhU-9j%Vwg7zrjY3-u4lqcf6O4 zAiWE&0qNa$5WT0#Mv&gSo9KNPvk{~}hUba&K{zMUpEig-0_Q;b*kg(Q&zIQ<(qFuj z=>M*=5v0!?CHgD49;7e8eL?ynTo2O!yNBp2a1W9Gff4=V$Jq$d*B>VO*E4Jc>Dz!u zq<@EV1C6qaiAw*(Mv+E8N_4?n*eKEu-ADA;RW^$BxP3$yKZT7VUGiR(%dJAZu%e_MSA|biEe#_jUtubN;LllHi{Iz zo@nVoHi~ot?gLWucA^)~vQebo6w%2m*eKE+Pb2!-5*tN&(btLY{vsPiddd5V?tPez zBE9srL=QZ`Mv;E`ZlYJfy+ityC8F2tXQN2Jb{)}!m$Ol%-+;0rz44!j9{K_sMfzL;rfyOU<1*6KF&sw-un>I`_8gaqz{}T`jg{q6zRh^ z5dGOC8%6p!?2q(`PZ53cO>7kD)Atd5_I5Uk^!X!1e{(e(Mf%dEL|^_g8%6s2_Y-~X zK{kr?&#xo;#+_^w>08eu`p&g%6zO}LIc*sFF5@)v8MXmw>;ps>zJ_f;dQ5}pq8r!- zq$gZKbjd|*1Jb2mAbRS1*#@M`UQ6_hQ)~m$=9dvY>m6(Z(v@e4e&Qjv0crddMBDCS z8<3_tL_3$*2Bd3lA$rb1wgGAP1kqkNH`4wML^ph!Z9qEo6{1-v3liX$(@lTKHXuF! z?L@b}lWjmMKTI@#Kihy5!TFJvZX-G|&Nd)5;ao`VZxVIkJV>kWCp!Hg+kkZEokTBM zU>lI`zMAMIPhlI7e*POo_kEOYK>9_v2BfoZB6|5N*#@Ln!nGj18mqde&1*boGG~0mmr{5*|$QRiLq>l;u1e_1)lOH7d^doEo(r4j(NS}u?A%PFU=}Vi~ z1|+~Pr@wzI+ko`7`-%P;u!i&vC@0c4zfSaTUtt@Nz6<998XJ0qXynao3~B6Mq6?SU z7}8^|A-d=yHiq>0uMj=)Lu?G`(%&R{>RC31bXkq)8N1mS(&np(p2gT0(vN+b=&E5bo2X(Zh4T6A-w?3iFEuHqUshlhO}@2(bA{c7}AM{iJJGbF{Bs5y+P{j zAUX-7M5rISPtJcW%RorP;edilqRUitfM z4C&SHCVK5_*cj5U_lRD9n2jO55w02Oq0L0U4Zlclc{I_(UuR=TZ~GL{JK#Pbz3a_H z?|u^-Lwe6^iQaoJ8$)^@oCoOxw-Wsclo#p4mk|9~iH#wB?BhhAfcu2>NhmAQrwhnmTQf+l2zFBWpmLpbPiYm3d$6%+H8|5Q#fT(jM z>P9_QF4vdaK&txgRd zOfTx1$8p}rI>T(EQjKQo)!s@+-tug@CAmK8?THpDD~+DGuDSXhsfS2cjC;Y!rC6eUZ@8&Rd3_8gBuWili}d$Hc_MV+~o`8GZInWajz z8CkGA5@jjzW6ZAf^zLSXZGqHHK^Q1XF4wwoZqL!^lvPH_lJdDm9ju6XHqa1EsdFgm zb}Ne(5J5?DrPhIJ%K`(aaF&$sZ7;@7gB&geqad(mY8YIub*R#Wt4L9_1zh()SLp4l zH{h|@fJ+MbKKomZn!J5vDHCkYfXX-5thBpJE$hyjY^j%WI8c*ZsU+Wq<<{J?S%qL^ z2%m#@Ya=pVTxlXhKUEW%hK~J$(+3oMLvvS6l|!o`6Lt2UimEHUXr{HiTxptmF#+l( zPHCJ=zA43n18vDc=VrBXu%+s*+C~Yy;c6>Y^)L+%mo^*q<_Y-}P)H1v^%`Ax6?eP! zRx@^CX)?J-s;Vjn?K#t^N6nr%w&jw@qoirrvOc>>p9afNUyeHEZgmN6Lc_cXF#$g| z*IkTy;B|C5E6P%;!x$p1UxPPPr*+!6g>-1i*P8GyHeUDYsDjP)mO!PpT7fH89%GVk zbKs)PbE_jD-`1>|9%ib@W+ty!9o)QTD1Wumtm^kDmP|AGG3CvW-~|oILOI+)xZ|x( zxoQ-}V46B98oZpKUWHda{MZ_jDULC5B061d)l4YBE{aQ974w#M!AYYtw5lhpo82V_ z-zQowpRCla{Ul4u+b!+OV4*?ISyEnaCidqnDVKLl-$XowM$GQx~BaL#q z)0&UUrp7d_AHZh5<)D}*o9n^NhZb+*_H-;hX;Oojw@nQO z{aLBm_aAK-a<~*8PI>;c(P+aPu9>LQuD8wV$TvB^(p#EX>C}x!(v~cgx4;>*&n!7o zYSm*Dikggn8b{@ue4qK-pRM#zCk(YXwqd0O2VAaI^IltQJR&%6y`Iq?F- zZ1D}vMk`H^bGg2{UaQ6D$B25B^3l`n z=xFO;s|wJ#BdX2yI`yXMNG@k9sbfGK0wWnKrm^SyX@RM0UKAc3wCG9ThHbO>QOGZc z@}vAv)X~jcyeXQg&H-$STnuU(su$3RYoqGF@oVxu)*X^_b^PHC}8Pq|F`K`vq(815Fd zOoUFtj{+6Lk6KI^e#zncM?HLh)td{dxsO+9aD`U&q-p#>0U1IDkOAuwKZ4>4t=UfN z)ahd#6=k9GC@yL(v{pLRYWYC-`NwWD?u^AY^sbM3pt!HnXv|kE4^Qk6liPb9xqf%w zJx#g2C*1#Pr{0DLi3v)5PE&60IRg!p>b_2EIbn|V-f^9jBkWqK>FA8UZBSgkGl^67 zOWsns3xATvH7vn3R?Ko}0QS=|&Iv)EV>dxKz8Q7rPFC7&9R}1FoT5WVu-&)?<;O*< z5MF==mJx5MmJKHEO`8ytfq-QPj1|Rw1-l1tMdL24t(!bz%%Qgrq5OKA4c?vU?WPFz zd1~h$%Cy#?cWY|%$QLnaQdS1B2xrujT z&3GrmO9r!CI!Xr9u*P*N=xSKw+|pme+S#b(8{np{zEl@=neT&tYM z0~j}e>sm5vk2FnwNBDj<@uJa{-(ssH&3C|SfOw2~=eed9aNS0$XABe5};67_(W9~r$TNj#X5vEjkDT8h8VTi5$ zX2I`LPt)9k1eWfBE@V^cjY{enw9wiI9-z8y^2wQ}vEw2x!XXzM<9M}J1y1l$^FVVc>ePG3cpANvVoCU>Q`u%o=X(8gM{AP!>l_*RO7WUX`|Mc1_tV6s3CH=x&2M_1cY zB4MPr;jfCd2j4<&;zWwG(yl=c%CMgXL;V@mj21l!DTxz;3$+cc*nc}1X0AFvev9qaT9N`#${-R7tzQKVzkIh!u zdxC0Hw%nE^Pk;~7(8;=b!G{VIRhFTi%~;*d5^TW$e@6qw=83H%kjOY#SH5VRYi!F) zrz^nyn2^p!k<2NX9P#&|Xt~unowy9m7JAgbBcZ3+LT^vBymAV=&)FBG*`{9Na9j!zI-|uC z=Nj7>Qq>2N`*JR7)mA#DCt3}4^i@ia5n`ew1tVZWVhQod(0P41XMel%KqveRVRAu&W_MKz&tGgaB}r2E;^D z_H`sQQ;x?{#AzO}p+j(Z|rdDHRIXWgIj7ffs zqnlePf*1>)jku5$fnpsq6Zmni+CB=6Htd2Ak5PKG>9PbjehKnOOlevP+BjEli%I~! zR;iv)HHja7E<-K*II<>EEnQnLTLUn)=H;M{I>HgzgW)hl73W&2vsNDkCBj`2mLf}P z@eeeidL^KN#}g7u+cJ7-5{qZOZqg(c4+1XQK~0m`Jg@-G_DbrNW98?v_#Q?RELEhK zhoGXT)Go=k^ipaT>LFX{fdQ4?zRlBH&~;@F+^g!6)vC&tD+wAxIN9#gsrMr$P1!2} zQ@x9UP6+VDE7L(}wyP+XK5(X@R#|SR!21Akl@^p~wiB%$j4Cqtkt#Bo2-`ijC!Q&` z1P~+0IL~1zGWBx z4e4AY*lilg1RaSX@puFV8g^9wzEqLLJltyTU2gZ(yWKpNlG%Gud}kkTQOoPLcC!@X z`@;Re_OY@=u|1VIzF)?fn5735(-@1FDvC4Hjthsek88gR%}W*%dDMmaLJOMhU73_m z@@@g&Ss+ zL2u(XL;=`z86?ur_mWpc#d zhahVpho+Nbm?99Y15N0`0?GPWaJ0qsrAcBu-Ve??v^)-%#I)^{K!z~Jwp#J&vN#vs zyG`}_&Jf1f+)q|X^bDb3@9IEy*_;9($;X7eo#HS#b&L)q5`u9qZFhuYP(B)Umiasr zH|f@2UzIGOc(|G3n1DMqMvF63oDi7qPlhnYhU8NAnWQkbkM5WfJVQwAIs`+?O$Y;&XJMclbV;#1&i*=aY2RIiFuspfSu%uiHU+*gc3~ky7sXIW z-`8lA_farJ+zmqGlsuyr8Tw!sj~zLXR2F<&(`ad@2y9mRHNauHz}AgLb~1zp`$z=s z;wl6(7h3YYlO?tI$$G<|h3wH{=px9#gH6BxrqI|2>dVdb-jdOqEJJ9sb<7~iH#m6T z4pn-p2Y9N;V#2toj61|TW|Pd=<3Ja}a&7EHDqr>)LW>PHdmjw?fbsT86dmXqQe!Wp zkrU^d+m-HK?3sS^QUn>x3d{v0$EmHMWQf7Sq~crfZOxGs>ozo7j2*4>Xaq+ z5j?SFjJ-2C^<@~M!+YgU?BfH!frE z<7pRRuyGt<4SVWq&&pz{4eR>iT(v!8ybWSZ+N2I7@XpjrKnE29p^M?~&H>pYCB~%9BhUc=29X<+BP97YC*|Do zAlBIrbr-=PSmhBcIv#9*QHslvMRJ_7A>~{KTj)`%HGY!?Wc6LPF-%Uibp-3`(K5sj zDS5OPZlzqG!6rSLyC?P(6ccsIl@$o`Q508Sm&w&yychh}Gzt z%;s9gD^;|>Cm+KuE%j#kCLAeY2L7|8DSUn$f%Z(XB>)e5&J50H2;=O1nP-9n3Zb=+ z3A_}6#nM$G!L}HDzRG=>S7M5j`M0C`{Fsq8^ipJyH~j1#<4;#d9c0KJ-6apsvw+R2Ny}G>O53+zj4wZXCot z$dcOpRAr`hcw-=b37l!@V9+sfAR4(S#(zQ+4+hvmH=0D;K+`zww~e&t>@yrrg}hHoGZ3r&Vxk=OF~B*=~bi%Vl4ZWkRgn* zt(QW&EY9TvarGpznPMS;(W7c+4vQr=z$=cLIMJZhDJnx)!$A%@s=FU@87hXKE+g(N zO#TpIRkjM5k9H=x&jJH>{LsA4W z)*gN{V|P|ukC4Up(D|e^NsKqM)Y6lsrpqK3il4}Xr^^g(`VCFFlfdHdQER+|aUfGD z*)Y5*1AC@KYGb?uaSgqpVeW}#fVm9+^wTh8V)j`WuPVbE8Nwvn=+=@Ulx%vxX5Q$8 z*xoPwcGFH$MthX;Jp)riSmOv&MVe{B5D&mGVTt)jDUq9;kG-!=0pI2lv%cUid|ODW zod}TJ+Go zIR;a~Kt5WQJ6&dR_h#w~iPVO9A7}Wf_JNZmZcn;QaJkLYLn`82wav$F=&`{`zTiM= zZMJ)deP+Sa8j#pcXdq8(?1PcCNgd(}EqKDmpf}(iH8WAEg=rTk`9gCa z^oE$>sIt#$@P#IHIp~4`RoU+ZTQK;TI3CQfW9*sYguuQMeLQ*hIVU~@+B}MuSzH`l zqvkqJlbAfqtxORJ77x_N?}=p2<519YcWJo{wXh|p2aa=T8z$I>AwCH;gH3u%QL3K7 zCOwG!Ck`fgq+u9ggF%0yiJ8@1P-0BIDIS%2RxC43i7lDRJVi%^0bE8Gda%H+va>TaV~8q0YRJ! zjt7KBF-|8VdYKp zj}YhbZ3-sx-ir9@hLOk8f@g~30`aI4Y>R=pVu_3t0kQb~?iyX65^R&9aTMp8+vJ;B z*GQ)k0#kQa?e>)}^eXCBV8H;LLGG)U2s#R&nlzdJZqM9oy#PeaH!lu}P(IaEI0XZeDJ~i&T#Pu~^0i=E%fjiF1u@H8GdX zJK6#eLN^zA1igLu=qz?&o|+WL*4qcV$ByokQ$dRj^ac*?*)DYD78Lj(G?>a0M}@#( zs6ThdWxJV_ZH zHhX*vG$$*W8YH-m%|5bazS~_xjh#WgIv#NIq}06t{uqJlGC$X`ajCam@=@>6*?QAb z?;`l);uJk8m%r3+6?=ehsev6}TQC?egx~!hV~axz=;>J>^Pb@;hGXYJW%GWOvUH4l zHJqhm+@}$)gLlCGhEjbjL#)&{e+@lV15CO68};Ph z@!v-SW0>JLKFMKze;&jCa>4Kt?`j0<@Zor13%#WkSZ|1bIEt)0jfFf9IOlhlaE|vE z@2UQnHiND?fqbqkF^s=h_ZZvFzv-*Q?uI|kZ3Rgmb)q{yJ~cH?6+>EaG}ftBe0svD z6Jxv}FNQ~QA^$5`C$Ros1@c=3Ht}a88+WwgV08`4#7~j(bw*ofWp(k6Pr}I-jPo+B zXIb$bpwmv*Q*{E%aUJN~k*+r-FYEE}$9|zBc~Ig6JSv0YhlP za}t6c1%D9&32nHqz@72d#M2HZ?L9N^A-C>Kpq1Y(JOk`S)?Hg}$>Ddv!ZiUtJaLJz{(NPFHM$o5DZnp#*FT zOek#Qa~%}hFE_9)8WwWnl^ArdA)K(-lHmul=Cd5l(n_xnG)q&=*JMO^ONJjbZ+Ap!G54I;AvArW154jf}^jdz$apQe`KK+i{jq~>N zJ9_DQ3BTj6bUlUbOW>If>UTU~VfzQe|9BEdw~6m@!NH#rYr?mQWa)O$YP#4BK~!}q z@PqPgt|(7NMgqz=pA*V|(L(u*80A`QD}JfKw6@|ZNx@Oxj-gzZI%&z3#1GCV+;BcU zW#%ZU75N}oxV5bLDZ>h$Piua+ao&E`{Qh*kgf)L;5ZGv zm?6L1TIuphqidqC_e=}Ar11H4x`mFPNVIGGFNhj}KPC1C_~usL`ED3B!+jq=b!Mw$ zoxxOpENYH;TdU6046L2cI@2`H+po@;b=uHN)R~MrsOrqq;F%9vXI^U88R!aEjpVoj z%%~JKdVU#PJAQQixRx0FyTtBvr_hzQ?eBwSM zbD7A5Vm22)^phQ?)Bi$^tO?US0!Ey^k8zoOgyeapCd)Ex?j%0s=d*P+N zR;%{7;T4}x@BVzp_3`~Zs2_7r0{8U>P7hLKKjtaiI+)(Pa`pI|s|VlQn>R2|rB27Y zkom#7YkoHPGW;p}^x0n$$2wn;e*O6D!oKrTry`vsesJ!bs|_|Cfu4o)JU0Esah&hM z^)7qs&8CY|ry^a-{9xTRV>^}XmvF|xe_1d6Auob@FsT3X9|`Mnxrst!{Bit^XZkIh z1qXjhY#zS3-y%zEKwGi=AlflEI~BYX{)Doucb>@N-4fA!n77O@trIUr3~raDwg7J3 zk8>NLCr2Soy5>{2CcTtbI9P78r}+77d1mz0P2`pE?Sr2feiQlB`_lDPvuYC@V^GWe za}wu^xWrmVPx~fjmcZ*Oax3&lu>kPVIi>x?;NK;75Bv&io^=N-_-88lvG|S|)~V39 zl0Uy#jZrlrkHtSjH36n;(v<*DQe^Zy_pP)`Z6H1-@PhJft{KzNJH9W<^Yo5?kwUqA zyB8bb7xO!0+V?932Y+ZpHMj2oWLaVx-iqr7+pbyC&IEE0n<*itK4S`yqgA zSz;U7it7j4t{KkYhxEmE9zWz~6t)k*B+bRf^&ox-FRcw~V);R|Yc4Zoq*BQ5Xg?&+ zd>3~pMDJ}c7Ti)}jmD3T2x8n+eoE{({3(49EUgV_&hdk1*L-F0KKR4&>3y6gJi`RM zqBjPdVO@A1Mu`nvn_NHGcFtTTbMc`sp|;g|;@GDM+lMMm@TxVu3yp8*IJRAC1L84( zACx=hEvI%SNB)Fypc>`aQ*_Y0&DSh|F0%!< zxp$H*xqs~uB{nc_vAv*s z!Z|M)(2eFO%OlT&?iE5e4Ah-#R@&XAR>AW(&geEvY@pj>`$4yBW-_!l5!{*R&J*qK zDRe8-U1;0w9PI`e%M#n*R$M>WcFj?Sv1@&?ooAdwS7BSY;y1RV=3=AJ_;wz<2Kcs1 zZKFIU^MiHAtmX80vbXG6cxA6OPIHM~>)igG&)%{frHZC!xzo~bRFp2 zldh-w2;!LBL4EKJVSQg?rMski3F@x0MUEkEg!_RX-SXT`4E|kWXW*Cn;~Awlke{XD z2mh{_&Co}dKRK!fYPKSU|2(n97Yh9IV2dzrc#Xmukzc#+ZV zvPKK{&8f5oss+OjnnS)b4W)^e=UVgL=E-+13pB$L^otSAn{cE8D~=Z(+0OY+Y-HOd zH&LDx`a!&7zH>T^OirsAs;#*Rq=Uv<8ie>=9odORgp9ifnyVEU4N-LDJC97xz5_-L z=%eJNCTw-hjZP*<0b#^$t*GNsBU*PpqmH*3=j|7DG^3)1Uc&ZgL@`xO!22+0O*m0n zZ7dgRB_n;klt)9~ORm^!wnH(OCO;)M3x5hoi}L!JUt+6k=5t3fmU6EHc8?nvI-l4r z!pw%ZbL@(-Epzqdb|Zq`rp5NgpDZA&<0;AvfTYB5m>$-EM5#5nlOjJ>+BFXv#%l6s zNEJ638_$#DubW8c7%w);oyKZvlw*k#_~uMM$ac(nPK9`QUu0hl(n0-?B@@|Vm9-*A zQ=H=A8rh=632;lkAAGxJHG}2ui|;&^d(p)Au3F(+mIGRDEO7$doaqPIu9?h`>FJAX zv|58&?gftQy{Dq;N-vseEiYG^g-5qjz8yt1^~NGpyXJiBHt zwELP4(y;K1dbtTrICw4z?BxZJF`SgdZLCldJk5x5RFRZ(UM}WLa`gk!;6& z}9ywLU?XA z>dg~)@FL^c&1(icQ)vx23x*#wJLegbBXdHYQF|GAMxh<&Xzn$-Zh z|AT?@#i-X>jXIr`X0c-}&i0&x*(h}!=cdRH(p|Hbp^so+r03})c#DDbTGZ`zTBi#g zQN(u|ess2H3o-b&7&DLFI!C!IaU9}`?+4$mSur_TfVa)}f$!}*U2~lQ z-`??ka}3|$dae)eMBx}qoQ7}C_k(Ze>}MEdi2%>?PV%%fZ;Ii&7B!+C#8Zmwp*XiQ z6~;xW(_k(|evs~(`wS74zLq=>(vQWE{)6C)4~}%{c#GcO&k=E5++g}awriF%tdH5(hGS3CK}V&{5wc}) ztk9@-S|1bRD6+H$rWMN%qFu9@VFYnsMCY;9M>wJ(>J9mwR;OIW6BOC^cD2<;i8ZcG zrXOUxW-x=T?u+a^w)(jivWtysS6eLsYy?a+%MYTRGnL8N)WYoEx~F&^TRkfgU9EI6 zQMrz6wJfn^s}<7^vYm63$&r=;+2@Ar8zr(QPDH1xtyLu zn;3@u&u!@Ng|+C!a(8@u`wrLqV;F0Rk0LXcmuKwoAwqAfdIHjL@F{ZJ&~>b3mr84Z zSuniV;vKHp#?U52z-6L2Pn+-{p*dPEpRCjiV~_DJjNli1F!zdekTK^rp)9R|XT|b^ zXxFS_Ks0}HS^4uki2iAX=yt2Sju6dDYa^Oieh}@NJq(EUj_4Z{qU+7|WTSa$ZA25x z529VOhG7luzKG5fw>zK^E%Ro@_Me6Er(Z=BZ{y|`W6e!gDt4$x_&>rI+^*MZJzx}F**mdF3tPuQ-t%X7U- zr`UZ{v2No>N9`^r2LCQGoPd_cMpS7HRBN6eOuJ?d!-yIFbO_qX^$^fj4cg1&dV%S3 zyVIJF%6wk!BF8;kN6d6B1>#RTQU70+c~!wA|d#MeEK1~ zC9-E|l7%8$Z1+e=S(MfSwdDE1v~zYb+2b@s_jKQ-JZ;5YglQPYRjYTPz7!eL&TU0e zS_9FN;|I^Kxy9gppoz}3(Rn=U>j=-4)o6W5L@B+!Q)CmKw1b$HN zoRv(*w?hl_+*+7d6Uuwtc6mPxH8>odEH=Vjdqs835*zro*j~^*<(!uc{x=%&tn5u5 z|9dB)8wN4C8na-kJE$lgZg3@ZE&|BzWv1W7~Bc zZztlVH9<`bKWGklNd!_HrIVZqUveGEwMHG}LG!dgbEUR^@{%~iJ(kvlv*7r_bI40_ z=*GN?1fIVi>!MB(o*~U%od_}ls{ySze(>y?R}66t?|7b2c&7R4is576ZAe;Z*SH3v7iZT~YiLM@A2hpW5`(wg z7tMLR<*f?MMe#MzTSoZdt-zLZ9&efN@5@_u%@Bq>cwhA9$%Bs*dgpJCs=aat7V?5= zs_`U6w#lw}@RnU_!#2kRUTpMs=S*Rks~Qm)i|MI0VV<5$&o)uM)N0_YFhxeVYfmPD za9-jByou`v+pbx{9mzf(_ril-Yc{9j1O|?Y^EsQ-?Z$cg&F0ig*Gt5q?@HHG*v@0Y zx0u+51vbkfU07s%<63?A(UH3eV({-0Yr`-1V#rXdQYSF3C4O-3nm-I{G4dxxa8J(g zlxHo*pD=O0P=~Y&0lmmLcU_B7*l}Iz1keqUAEY~H7DK-#gnAaz@l8Ew-_)y2q>B|c zi;Qx7tKmmm^DV^S-zA2NO&Zo*lsEx#$@hbA*Zg9btB*e=pZNZ96W^6aeHB`qMaH*l zuT){hsl*9*3$`D0hx}t2Y7_qWTK$~z@SURx#B$hO&j(CwOy45QS&qx%X2-M!A~bu)^W zU@S`loY*jjFXG-!*D@o%hIh(>QOx$oHvqy@aQIcePn|u`1a(Fa2sI8ORf-o8Ah*neTQ5gC7MrbyV6sja)o~ z;_y{X&<-mOulICTu@|r5V_XNmQhHDgX3t}jGUzJcX%6j4*Gy*c#PM-@jeBo4kS*sR zD6*&G8uum;%M!;8xZ?Y<+^!kS(2u(>zVr0s{!zj=4xpOc0Y@(~wq0jtT^6M^P%Sxr z@Er1#X*f;z-)oJ4%o7*fM0jr1RvHlx3|4A|#}0*H0hz}a*+|$v(d|Xc*qd%$_#&dT2Bsy)51w6fl-rZG`c4NtA0^{<-eZBc8RzX6 z3tURqOZXz4bUhUd%rgq-=>pF<+eVSGjCC15+D2bS4E|kWx56*C(I@PAMV4vX4~|1N zlHYBDsq!TfIR1Y4)Rz&C>&sDj@2TFzA^4-vcy{)wtr8m++UEPgw_`SPdTTOg^9lgP zT7HMQw)6QMt&q{1iAQM>&^Wsju04&u6Mojh_kHPl%1&>BV+@+J`4Pf*)T@+_o^D4+ zTL)WJ==pX>RGaH{>di&Gt|Hs-AH@Q|N89iH#Ngj0b`Sh=`<;CU4Dk0+@>3IBvzKAy zC4YXg8l!3gTDd`M!qaq3n2UO_5_@lj=Us}7e%Fzg%Lr^;>KNh;fftl-bIn$U*?9V* zJWp@fr&=g4wrzLq4J*-Y%=VyJeh}@Nr3{Gnj_9XoL>GQO?ST-DrHxr?&hmq3*Suut zA=nqudE(qp)`&h7brvH$L6N->=N={Kg;0rOxE4%5$ac+81|PdGvh(=Zmuh5Rzb<`j zUFsOZ4S^q&yXGl(CTD;M{a|&Ez^6bR7_=q%Bn#ybHtbYpS}V<7(e3zCxjisrDcEa9 zeoAZ={#3CP0JKr^B-%}(AH=(6FGEj3{>ZXoCzzEU6!DiN5npJJ1>bG>(NV+n5%Rnl zDUlv`#x>s$zFo7Kp^eF(T^7FcL`|M(;k(%0_&{w;z;FtzJ@xJ0=A73|=I6tx1?{8c zX=7fj5xoay8SG&rv&d~sd~4xHTkMR!RM^H8C5|~IlIzD>JLWW}b|&ZR3I4anb{_xx z2^!lot@df|X�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 KRsa5o?EXJk{0Tt- literal 0 HcmV?d00001 diff --git a/vlcdemo/vlc/vlc3/include/deprecated.h b/vlcdemo/vlc/vlc3/include/deprecated.h new file mode 100644 index 0000000..f47cea7 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/deprecated.h @@ -0,0 +1,489 @@ +/***************************************************************************** + * deprecated.h: libvlc deprecated API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 27323a434498604ca281900c3e4087a42d22a5d8 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_DEPRECATED_H +#define LIBVLC_DEPRECATED_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \ingroup libvlc libvlc_media_player + * @{ + */ + +/** + * Get movie fps rate + * + * This function is provided for backward compatibility. It cannot deal with + * multiple video tracks. In LibVLC versions prior to 3.0, it would also fail + * if the file format did not convey the frame rate explicitly. + * + * \deprecated Consider using libvlc_media_tracks_get() instead. + * + * \param p_mi the Media Player + * \return frames per second (fps) for this playing movie, or 0 if unspecified + */ +LIBVLC_DEPRECATED +LIBVLC_API float libvlc_media_player_get_fps( libvlc_media_player_t *p_mi ); + +/** end bug */ + +/** + * \deprecated Use libvlc_media_player_set_nsobject() instead + */ +LIBVLC_DEPRECATED +LIBVLC_API void libvlc_media_player_set_agl ( libvlc_media_player_t *p_mi, uint32_t drawable ); + +/** + * \deprecated Use libvlc_media_player_get_nsobject() instead + */ +LIBVLC_DEPRECATED +LIBVLC_API uint32_t libvlc_media_player_get_agl ( libvlc_media_player_t *p_mi ); + +/** + * \deprecated Use libvlc_track_description_list_release() instead + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_track_description_release( libvlc_track_description_t *p_track_description ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_video + * @{ + */ + +/** + * Get current video height. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel height or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_height( libvlc_media_player_t *p_mi ); + +/** + * Get current video width. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel width or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_width( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available titles. + * + * \param p_mi the media player + * \return list containing description of available titles. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_track_description_t * + libvlc_video_get_title_description( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available chapters for specific title. + * + * \param p_mi the media player + * \param i_title selected title + * \return list containing description of available chapter for title i_title. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_track_description_t * + libvlc_video_get_chapter_description( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Set new video subtitle file. + * \deprecated Use libvlc_media_player_add_slave() instead. + * + * \param p_mi the media player + * \param psz_subtitle new video subtitle file + * \return the success status (boolean) + */ +LIBVLC_DEPRECATED LIBVLC_API int +libvlc_video_set_subtitle_file( libvlc_media_player_t *p_mi, const char *psz_subtitle ); + +/** + * Toggle teletext transparent status on video output. + * \deprecated use libvlc_video_set_teletext() instead. + * + * \param p_mi the media player + */ +LIBVLC_DEPRECATED LIBVLC_API void +libvlc_toggle_teletext( libvlc_media_player_t *p_mi ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_audio + * @{ + */ + +/** + * Backward compatibility stub. Do not use in new code. + * \deprecated Use libvlc_audio_output_device_list_get() instead. + * \return always 0. + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_audio_output_device_count( libvlc_instance_t *p_instance, const char *psz_audio_output ); + +/** + * Backward compatibility stub. Do not use in new code. + * \deprecated Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_longname( libvlc_instance_t *p_instance, const char *psz_output, + int i_device ); + +/** + * Backward compatibility stub. Do not use in new code. + * \deprecated Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_id( libvlc_instance_t *p_instance, const char *psz_audio_output, int i_device ); + +/** + * Stub for backward compatibility. + * \return always -1. + */ +LIBVLC_DEPRECATED +LIBVLC_API int libvlc_audio_output_get_device_type( libvlc_media_player_t *p_mi ); + +/** + * Stub for backward compatibility. + */ +LIBVLC_DEPRECATED +LIBVLC_API void libvlc_audio_output_set_device_type( libvlc_media_player_t *p_mp, + int device_type ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_media + * @{ + */ + +/** + * Parse a media. + * + * This fetches (local) art, meta data and tracks information. + * The method is synchronous. + * + * \deprecated This function could block indefinitely. + * Use libvlc_media_parse_with_options() instead + * + * \see libvlc_media_parse_with_options + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_DEPRECATED LIBVLC_API void +libvlc_media_parse( libvlc_media_t *p_md ); + +/** + * Parse a media. + * + * This fetches (local) art, meta data and tracks information. + * The method is the asynchronous of libvlc_media_parse(). + * + * To track when this is over you can listen to libvlc_MediaParsedChanged + * event. However if the media was already parsed you will not receive this + * event. + * + * \deprecated You can't be sure to receive the libvlc_MediaParsedChanged + * event (you can wait indefinitely for this event). + * Use libvlc_media_parse_with_options() instead + * + * \see libvlc_media_parse + * \see libvlc_MediaParsedChanged + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_DEPRECATED LIBVLC_API void +libvlc_media_parse_async( libvlc_media_t *p_md ); + +/** + * Return true is the media descriptor object is parsed + * + * \deprecated This can return true in case of failure. + * Use libvlc_media_get_parsed_status() instead + * + * \see libvlc_MediaParsedChanged + * + * \param p_md media descriptor object + * \return true if media object has been parsed otherwise it returns false + * + * \libvlc_return_bool + */ +LIBVLC_DEPRECATED LIBVLC_API int + libvlc_media_is_parsed( libvlc_media_t *p_md ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \deprecated Use libvlc_media_tracks_get() instead + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed by the caller) [OUT] + * + * \return the number of Elementary Streams + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_media_get_tracks_info( libvlc_media_t *p_md, + libvlc_media_track_info_t **tracks ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_media_list + * @{ + */ + +LIBVLC_DEPRECATED int + libvlc_media_list_add_file_content( libvlc_media_list_t * p_ml, + const char * psz_uri ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_media_discoverer + * @{ + */ + +/** + * \deprecated Use libvlc_media_discoverer_new() and libvlc_media_discoverer_start(). + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_media_discoverer_t * +libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, + const char * psz_name ); + +/** + * Get media service discover object its localized name. + * + * \deprecated Useless, use libvlc_media_discoverer_list_get() to get the + * longname of the service discovery. + * + * \param p_mdis media discover object + * \return localized name or NULL if the media_discoverer is not started + */ +LIBVLC_DEPRECATED LIBVLC_API char * +libvlc_media_discoverer_localized_name( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get event manager from media service discover object. + * + * \deprecated Useless, media_discoverer events are only triggered when calling + * libvlc_media_discoverer_start() and libvlc_media_discoverer_stop(). + * + * \param p_mdis media service discover object + * \return event manager object. + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_event_manager_t * +libvlc_media_discoverer_event_manager( libvlc_media_discoverer_t * p_mdis ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_core + * @{ + */ + +/** + * Waits until an interface causes the instance to exit. + * You should start at least one interface first, using libvlc_add_intf(). + * + * \param p_instance the instance + * \warning This function wastes one thread doing basically nothing. + * libvlc_set_exit_handler() should be used instead. + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_wait( libvlc_instance_t *p_instance ); + + +/** @}*/ + +/** + * \ingroup libvlc_core + * \defgroup libvlc_log_deprecated LibVLC logging (legacy) + * @{ + */ + +/** This structure is opaque. It represents a libvlc log iterator */ +typedef struct libvlc_log_iterator_t libvlc_log_iterator_t; + +typedef struct libvlc_log_message_t +{ + int i_severity; /* 0=INFO, 1=ERR, 2=WARN, 3=DBG */ + const char *psz_type; /* module type */ + const char *psz_name; /* module name */ + const char *psz_header; /* optional header */ + const char *psz_message; /* message */ +} libvlc_log_message_t; + +/** + * Always returns minus one. + * This function is only provided for backward compatibility. + * + * \param p_instance ignored + * \return always -1 + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_get_log_verbosity( const libvlc_instance_t *p_instance ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_instance ignored + * \param level ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_set_log_verbosity( libvlc_instance_t *p_instance, unsigned level ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_instance libvlc instance + * \return an unique pointer or NULL on error + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_t *libvlc_log_open( libvlc_instance_t *p_instance ); + +/** + * Frees memory allocated by libvlc_log_open(). + * + * \param p_log libvlc log instance or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_close( libvlc_log_t *p_log ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_log ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_log_count( const libvlc_log_t *p_log ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_log ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_clear( libvlc_log_t *p_log ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_log ignored + * \return an unique pointer or NULL on error or if the parameter was NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_iterator_t *libvlc_log_get_iterator( const libvlc_log_t *p_log ); + +/** + * Frees memory allocated by libvlc_log_get_iterator(). + * + * \param p_iter libvlc log iterator or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_iterator_free( libvlc_log_iterator_t *p_iter ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_iter ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_log_iterator_has_next( const libvlc_log_iterator_t *p_iter ); + +/** + * Always returns NULL. + * This function is only provided for backward compatibility. + * + * \param p_iter libvlc log iterator or NULL + * \param p_buf ignored + * \return always NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterator_t *p_iter, + libvlc_log_message_t *p_buf ); + +/** @}*/ + +/** + * \ingroup libvlc + * \defgroup libvlc_playlist LibVLC playlist (legacy) + * @deprecated Use @ref libvlc_media_list instead. + * @{ + * \file + * LibVLC deprecated playlist API + */ + +/** + * Start playing (if there is any item in the playlist). + * + * Additionnal playlist item options can be specified for addition to the + * item before it is played. + * + * \param p_instance the playlist instance + * \param i_id the item to play. If this is a negative number, the next + * item will be selected. Otherwise, the item with the given ID will be + * played + * \param i_options the number of options to add to the item + * \param ppsz_options the options to add to the item + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_playlist_play( libvlc_instance_t *p_instance, int i_id, + int i_options, char **ppsz_options ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_DEPRECATED_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc.h b/vlcdemo/vlc/vlc3/include/libvlc.h new file mode 100644 index 0000000..41e20dd --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc.h @@ -0,0 +1,580 @@ +/***************************************************************************** + * libvlc.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: b12d900469fa6438c41421f2ac7697b93ffc8a35 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \defgroup libvlc LibVLC + * LibVLC is the external programming interface of the VLC media player. + * It is used to embed VLC into other applications or frameworks. + * @{ + * \file + * LibVLC core external API + */ + +#ifndef VLC_LIBVLC_H +#define VLC_LIBVLC_H 1 + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define LIBVLC_API __declspec(dllexport) +#elif defined (__GNUC__) && (__GNUC__ >= 4) +# define LIBVLC_API __attribute__((visibility("default"))) +#else +# define LIBVLC_API +#endif + +#ifdef __LIBVLC__ +/* Avoid unhelpful warnings from libvlc with our deprecated APIs */ +# define LIBVLC_DEPRECATED +#elif defined(__GNUC__) && \ + (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) +# define LIBVLC_DEPRECATED __attribute__((deprecated)) +#else +# define LIBVLC_DEPRECATED +#endif + +#include +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_core LibVLC core + * \ingroup libvlc + * Before it can do anything useful, LibVLC must be initialized. + * You can create one (or more) instance(s) of LibVLC in a given process, + * with libvlc_new() and destroy them with libvlc_release(). + * + * \version Unless otherwise stated, these functions are available + * from LibVLC versions numbered 1.1.0 or more. + * Earlier versions (0.9.x and 1.0.x) are not compatible. + * @{ + */ + +/** This structure is opaque. It represents a libvlc instance */ +typedef struct libvlc_instance_t libvlc_instance_t; + +typedef int64_t libvlc_time_t; + +/** \defgroup libvlc_error LibVLC error handling + * @{ + */ + +/** + * A human-readable error message for the last LibVLC error in the calling + * thread. The resulting string is valid until another error occurs (at least + * until the next LibVLC call). + * + * @warning + * This will be NULL if there was no error. + */ +LIBVLC_API const char *libvlc_errmsg (void); + +/** + * Clears the LibVLC error status for the current thread. This is optional. + * By default, the error status is automatically overridden when a new error + * occurs, and destroyed when the thread exits. + */ +LIBVLC_API void libvlc_clearerr (void); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param ap the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_vprinterr (const char *fmt, va_list ap); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param args the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_printerr (const char *fmt, ...); + +/**@} */ + +/** + * Create and initialize a libvlc instance. + * This functions accept a list of "command line" arguments similar to the + * main(). These arguments affect the LibVLC instance default configuration. + * + * \note + * LibVLC may create threads. Therefore, any thread-unsafe process + * initialization must be performed before calling libvlc_new(). In particular + * and where applicable: + * - setlocale() and textdomain(), + * - setenv(), unsetenv() and putenv(), + * - with the X11 display system, XInitThreads() + * (see also libvlc_media_player_set_xwindow()) and + * - on Microsoft Windows, SetErrorMode(). + * - sigprocmask() shall never be invoked; pthread_sigmask() can be used. + * + * On POSIX systems, the SIGCHLD signal must not be ignored, i.e. the + * signal handler must set to SIG_DFL or a function pointer, not SIG_IGN. + * Also while LibVLC is active, the wait() function shall not be called, and + * any call to waitpid() shall use a strictly positive value for the first + * parameter (i.e. the PID). Failure to follow those rules may lead to a + * deadlock or a busy loop. + * Also on POSIX systems, it is recommended that the SIGPIPE signal be blocked, + * even if it is not, in principles, necessary, e.g.: + * @code + sigset_t set; + + signal(SIGCHLD, SIG_DFL); + sigemptyset(&set); + sigaddset(&set, SIGPIPE); + pthread_sigmask(SIG_BLOCK, &set, NULL); + * @endcode + * + * On Microsoft Windows Vista/2008, the process error mode + * SEM_FAILCRITICALERRORS flag must be set before using LibVLC. + * On later versions, that is optional and unnecessary. + * Also on Microsoft Windows (Vista and any later version), setting the default + * DLL directories to SYSTEM32 exclusively is strongly recommended for + * security reasons: + * @code + SetErrorMode(SEM_FAILCRITICALERRORS); + SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); + * @endcode + * + * \version + * Arguments are meant to be passed from the command line to LibVLC, just like + * VLC media player does. The list of valid arguments depends on the LibVLC + * version, the operating system and platform, and set of available LibVLC + * plugins. Invalid or unsupported arguments will cause the function to fail + * (i.e. return NULL). Also, some arguments may alter the behaviour or + * otherwise interfere with other LibVLC functions. + * + * \warning + * There is absolutely no warranty or promise of forward, backward and + * cross-platform compatibility with regards to libvlc_new() arguments. + * We recommend that you do not use them, other than when debugging. + * + * \param argc the number of arguments (should be 0) + * \param argv list of arguments (should be NULL) + * \return the libvlc instance or NULL in case of error + */ +LIBVLC_API libvlc_instance_t * +libvlc_new( int argc , const char *const *argv ); + +/** + * Decrement the reference count of a libvlc instance, and destroy it + * if it reaches zero. + * + * \param p_instance the instance to destroy + */ +LIBVLC_API void libvlc_release( libvlc_instance_t *p_instance ); + +/** + * Increments the reference count of a libvlc instance. + * The initial reference count is 1 after libvlc_new() returns. + * + * \param p_instance the instance to reference + */ +LIBVLC_API void libvlc_retain( libvlc_instance_t *p_instance ); + +/** + * Try to start a user interface for the libvlc instance. + * + * \param p_instance the instance + * \param name interface name, or NULL for default + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_add_intf( libvlc_instance_t *p_instance, const char *name ); + +/** + * Registers a callback for the LibVLC exit event. This is mostly useful if + * the VLC playlist and/or at least one interface are started with + * libvlc_playlist_play() or libvlc_add_intf() respectively. + * Typically, this function will wake up your application main loop (from + * another thread). + * + * \note This function should be called before the playlist or interface are + * started. Otherwise, there is a small race condition: the exit event could + * be raised before the handler is registered. + * + * \param p_instance LibVLC instance + * \param cb callback to invoke when LibVLC wants to exit, + * or NULL to disable the exit handler (as by default) + * \param opaque data pointer for the callback + * \warning This function and libvlc_wait() cannot be used at the same time. + */ +LIBVLC_API +void libvlc_set_exit_handler( libvlc_instance_t *p_instance, + void (*cb) (void *), void *opaque ); + +/** + * Sets the application name. LibVLC passes this as the user agent string + * when a protocol requires it. + * + * \param p_instance LibVLC instance + * \param name human-readable application name, e.g. "FooBar player 1.2.3" + * \param http HTTP User Agent, e.g. "FooBar/1.2.3 Python/2.6.0" + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_set_user_agent( libvlc_instance_t *p_instance, + const char *name, const char *http ); + +/** + * Sets some meta-information about the application. + * See also libvlc_set_user_agent(). + * + * \param p_instance LibVLC instance + * \param id Java-style application identifier, e.g. "com.acme.foobar" + * \param version application version numbers, e.g. "1.2.3" + * \param icon application icon name, e.g. "foobar" + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API +void libvlc_set_app_id( libvlc_instance_t *p_instance, const char *id, + const char *version, const char *icon ); + +/** + * Retrieve libvlc version. + * + * Example: "1.1.0-git The Luggage" + * + * \return a string containing the libvlc version + */ +LIBVLC_API const char * libvlc_get_version(void); + +/** + * Retrieve libvlc compiler version. + * + * Example: "gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu6)" + * + * \return a string containing the libvlc compiler version + */ +LIBVLC_API const char * libvlc_get_compiler(void); + +/** + * Retrieve libvlc changeset. + * + * Example: "aa9bce0bc4" + * + * \return a string containing the libvlc changeset + */ +LIBVLC_API const char * libvlc_get_changeset(void); + +/** + * Frees an heap allocation returned by a LibVLC function. + * If you know you're using the same underlying C run-time as the LibVLC + * implementation, then you can call ANSI C free() directly instead. + * + * \param ptr the pointer + */ +LIBVLC_API void libvlc_free( void *ptr ); + +/** \defgroup libvlc_event LibVLC asynchronous events + * LibVLC emits asynchronous events. + * + * Several LibVLC objects (such @ref libvlc_instance_t as + * @ref libvlc_media_player_t) generate events asynchronously. Each of them + * provides @ref libvlc_event_manager_t event manager. You can subscribe to + * events with libvlc_event_attach() and unsubscribe with + * libvlc_event_detach(). + * @{ + */ + +/** + * Event manager that belongs to a libvlc object, and from whom events can + * be received. + */ +typedef struct libvlc_event_manager_t libvlc_event_manager_t; + +struct libvlc_event_t; + +/** + * Type of a LibVLC event. + */ +typedef int libvlc_event_type_t; + +/** + * Callback function notification + * \param p_event the event triggering the callback + */ +typedef void ( *libvlc_callback_t )( const struct libvlc_event_t *p_event, void *p_data ); + +/** + * Register for an event notification. + * + * \param p_event_manager the event manager to which you want to attach to. + * Generally it is obtained by vlc_my_object_event_manager() where + * my_object is the object you want to listen to. + * \param i_event_type the desired event to which we want to listen + * \param f_callback the function to call when i_event_type occurs + * \param user_data user provided data to carry with the event + * \return 0 on success, ENOMEM on error + */ +LIBVLC_API int libvlc_event_attach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *user_data ); + +/** + * Unregister an event notification. + * + * \param p_event_manager the event manager + * \param i_event_type the desired event to which we want to unregister + * \param f_callback the function to call when i_event_type occurs + * \param p_user_data user provided data to carry with the event + */ +LIBVLC_API void libvlc_event_detach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *p_user_data ); + +/** + * Get an event's type name. + * + * \param event_type the desired event + */ +LIBVLC_API const char * libvlc_event_type_name( libvlc_event_type_t event_type ); + +/** @} */ + +/** \defgroup libvlc_log LibVLC logging + * libvlc_log_* functions provide access to the LibVLC messages log. + * This is used for logging and debugging. + * @{ + */ + +/** + * Logging messages level. + * \note Future LibVLC versions may define new levels. + */ +enum libvlc_log_level +{ + LIBVLC_DEBUG=0, /**< Debug message */ + LIBVLC_NOTICE=2, /**< Important informational message */ + LIBVLC_WARNING=3, /**< Warning (potential error) message */ + LIBVLC_ERROR=4 /**< Error message */ +}; + +typedef struct vlc_log_t libvlc_log_t; + +/** + * Gets log message debug infos. + * + * This function retrieves self-debug information about a log message: + * - the name of the VLC module emitting the message, + * - the name of the source code module (i.e. file) and + * - the line number within the source code module. + * + * The returned module name and file name will be NULL if unknown. + * The returned line number will similarly be zero if unknown. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param module module name storage (or NULL) [OUT] + * \param file source code file name storage (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_context(const libvlc_log_t *ctx, + const char **module, const char **file, unsigned *line); + +/** + * Gets log message info. + * + * This function retrieves meta-information about a log message: + * - the type name of the VLC object emitting the message, + * - the object header if any, and + * - a temporaly-unique object identifier. + * + * This information is mainly meant for manual troubleshooting. + * + * The returned type name may be "generic" if unknown, but it cannot be NULL. + * The returned header will be NULL if unset; in current versions, the header + * is used to distinguish for VLM inputs. + * The returned object ID will be zero if the message is not associated with + * any VLC object. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param name object name storage (or NULL) [OUT] + * \param header object header (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_object(const libvlc_log_t *ctx, + const char **name, const char **header, uintptr_t *id); + +/** + * Callback prototype for LibVLC log message handler. + * + * \param data data pointer as given to libvlc_log_set() + * \param level message level (@ref libvlc_log_level) + * \param ctx message context (meta-information about the message) + * \param fmt printf() format string (as defined by ISO C11) + * \param args variable argument list for the format + * \note Log message handlers must be thread-safe. + * \warning The message context pointer, the format string parameters and the + * variable arguments are only valid until the callback returns. + */ +typedef void (*libvlc_log_cb)(void *data, int level, const libvlc_log_t *ctx, + const char *fmt, va_list args); + +/** + * Unsets the logging callback. + * + * This function deregisters the logging callback for a LibVLC instance. + * This is rarely needed as the callback is implicitly unset when the instance + * is destroyed. + * + * \note This function will wait for any pending callbacks invocation to + * complete (causing a deadlock if called from within the callback). + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_unset( libvlc_instance_t *p_instance ); + +/** + * Sets the logging callback for a LibVLC instance. + * + * This function is thread-safe: it will wait for any pending callbacks + * invocation to complete. + * + * \param cb callback function pointer + * \param data opaque data pointer for the callback function + * + * \note Some log messages (especially debug) are emitted by LibVLC while + * is being initialized. These messages cannot be captured with this interface. + * + * \warning A deadlock may occur if this function is called from the callback. + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set( libvlc_instance_t *p_instance, + libvlc_log_cb cb, void *data ); + + +/** + * Sets up logging to a file. + * \param p_instance libvlc instance + * \param stream FILE pointer opened for writing + * (the FILE pointer must remain valid until libvlc_log_unset()) + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set_file( libvlc_instance_t *p_instance, FILE *stream ); + +/** @} */ + +/** + * Description of a module. + */ +typedef struct libvlc_module_description_t +{ + char *psz_name; + char *psz_shortname; + char *psz_longname; + char *psz_help; + struct libvlc_module_description_t *p_next; +} libvlc_module_description_t; + +/** + * Release a list of module descriptions. + * + * \param p_list the list to be released + */ +LIBVLC_API +void libvlc_module_description_list_release( libvlc_module_description_t *p_list ); + +/** + * Returns a list of audio filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_audio_filter_list_get( libvlc_instance_t *p_instance ); + +/** + * Returns a list of video filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_video_filter_list_get( libvlc_instance_t *p_instance ); + +/** @} */ + +/** \defgroup libvlc_clock LibVLC time + * These functions provide access to the LibVLC time/clock. + * @{ + */ + +/** + * Return the current time as defined by LibVLC. The unit is the microsecond. + * Time increases monotonically (regardless of time zone changes and RTC + * adjustements). + * The origin is arbitrary but consistent across the whole system + * (e.g. the system uptim, the time since the system was booted). + * \note On systems that support it, the POSIX monotonic clock is used. + */ +LIBVLC_API +int64_t libvlc_clock(void); + +/** + * Return the delay (in microseconds) until a certain timestamp. + * \param pts timestamp + * \return negative if timestamp is in the past, + * positive if it is in the future + */ +static inline int64_t libvlc_delay(int64_t pts) +{ + return pts - libvlc_clock(); +} + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /** @} */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_dialog.h b/vlcdemo/vlc/vlc3/include/libvlc_dialog.h new file mode 100644 index 0000000..b176b93 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_dialog.h @@ -0,0 +1,241 @@ +/***************************************************************************** + * libvlc_dialog.h: libvlc dialog API + ***************************************************************************** + * Copyright © 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_DIALOG_H +#define LIBVLC_DIALOG_H 1 + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct libvlc_dialog_id libvlc_dialog_id; + +/** + * @defgroup libvlc_dialog LibVLC dialog + * @ingroup libvlc + * @{ + * @file + * LibVLC dialog external API + */ + +typedef enum libvlc_dialog_question_type +{ + LIBVLC_DIALOG_QUESTION_NORMAL, + LIBVLC_DIALOG_QUESTION_WARNING, + LIBVLC_DIALOG_QUESTION_CRITICAL, +} libvlc_dialog_question_type; + +/** + * Dialog callbacks to be implemented + */ +typedef struct libvlc_dialog_cbs +{ + /** + * Called when an error message needs to be displayed + * + * @param p_data opaque pointer for the callback + * @param psz_title title of the dialog + * @param psz_text text of the dialog + */ + void (*pf_display_error)(void *p_data, const char *psz_title, + const char *psz_text); + + /** + * Called when a login dialog needs to be displayed + * + * You can interact with this dialog by calling libvlc_dialog_post_login() + * to post an answer or libvlc_dialog_dismiss() to cancel this dialog. + * + * @note to receive this callback, libvlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param psz_default_username user name that should be set on the user form + * @param b_ask_store if true, ask the user if he wants to save the + * credentials + */ + void (*pf_display_login)(void *p_data, libvlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + const char *psz_default_username, + bool b_ask_store); + + /** + * Called when a question dialog needs to be displayed + * + * You can interact with this dialog by calling libvlc_dialog_post_action() + * to post an answer or libvlc_dialog_dismiss() to cancel this dialog. + * + * @note to receive this callback, libvlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param i_type question type (or severity) of the dialog + * @param psz_cancel text of the cancel button + * @param psz_action1 text of the first button, if NULL, don't display this + * button + * @param psz_action2 text of the second button, if NULL, don't display + * this button + */ + void (*pf_display_question)(void *p_data, libvlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + libvlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2); + + /** + * Called when a progress dialog needs to be displayed + * + * If cancellable (psz_cancel != NULL), you can cancel this dialog by + * calling libvlc_dialog_dismiss() + * + * @note to receive this callback, libvlc_dialog_cbs.pf_cancel and + * libvlc_dialog_cbs.pf_update_progress should not be NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param b_indeterminate true if the progress dialog is indeterminate + * @param f_position initial position of the progress bar (between 0.0 and + * 1.0) + * @param psz_cancel text of the cancel button, if NULL the dialog is not + * cancellable + */ + void (*pf_display_progress)(void *p_data, libvlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + bool b_indeterminate, float f_position, + const char *psz_cancel); + + /** + * Called when a displayed dialog needs to be cancelled + * + * The implementation must call libvlc_dialog_dismiss() to really release + * the dialog. + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + */ + void (*pf_cancel)(void *p_data, libvlc_dialog_id *p_id); + + /** + * Called when a progress dialog needs to be updated + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + * @param f_position osition of the progress bar (between 0.0 and 1.0) + * @param psz_text new text of the progress dialog + */ + void (*pf_update_progress)(void *p_data, libvlc_dialog_id *p_id, + float f_position, const char *psz_text); +} libvlc_dialog_cbs; + +/** + * Register callbacks in order to handle VLC dialogs + * + * @version LibVLC 3.0.0 and later. + * + * @param p_cbs a pointer to callbacks, or NULL to unregister callbacks. + * @param p_data opaque pointer for the callback + */ +LIBVLC_API void +libvlc_dialog_set_callbacks(libvlc_instance_t *p_instance, + const libvlc_dialog_cbs *p_cbs, void *p_data); + +/** + * Associate an opaque pointer with the dialog id + * + * @version LibVLC 3.0.0 and later. + */ +LIBVLC_API void +libvlc_dialog_set_context(libvlc_dialog_id *p_id, void *p_context); + +/** + * Return the opaque pointer associated with the dialog id + * + * @version LibVLC 3.0.0 and later. + */ +LIBVLC_API void * +libvlc_dialog_get_context(libvlc_dialog_id *p_id); + +/** + * Post a login answer + * + * After this call, p_id won't be valid anymore + * + * @see libvlc_dialog_cbs.pf_display_login + * + * @version LibVLC 3.0.0 and later. + * + * @param p_id id of the dialog + * @param psz_username valid and non empty string + * @param psz_password valid string (can be empty) + * @param b_store if true, store the credentials + * @return 0 on success, or -1 on error + */ +LIBVLC_API int +libvlc_dialog_post_login(libvlc_dialog_id *p_id, const char *psz_username, + const char *psz_password, bool b_store); + +/** + * Post a question answer + * + * After this call, p_id won't be valid anymore + * + * @see libvlc_dialog_cbs.pf_display_question + * + * @version LibVLC 3.0.0 and later. + * + * @param p_id id of the dialog + * @param i_action 1 for action1, 2 for action2 + * @return 0 on success, or -1 on error + */ +LIBVLC_API int +libvlc_dialog_post_action(libvlc_dialog_id *p_id, int i_action); + +/** + * Dismiss a dialog + * + * After this call, p_id won't be valid anymore + * + * @see libvlc_dialog_cbs.pf_cancel + * + * @version LibVLC 3.0.0 and later. + * + * @param p_id id of the dialog + * @return 0 on success, or -1 on error + */ +LIBVLC_API int +libvlc_dialog_dismiss(libvlc_dialog_id *p_id); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* LIBVLC_DIALOG_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_events.h b/vlcdemo/vlc/vlc3/include/libvlc_events.h new file mode 100644 index 0000000..f8b0e9b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_events.h @@ -0,0 +1,296 @@ +/***************************************************************************** + * libvlc_events.h: libvlc_events external API structure + ***************************************************************************** + * Copyright (C) 1998-2010 VLC authors and VideoLAN + * $Id $ + * + * Authors: Filippo Carone + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_EVENTS_H +#define LIBVLC_EVENTS_H 1 + +/** + * \file + * This file defines libvlc_event external API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct libvlc_renderer_item_t libvlc_renderer_item_t; + +/** + * \ingroup libvlc_event + * @{ + */ + +/** + * Event types + */ +enum libvlc_event_e { + /* Append new event types at the end of a category. + * Do not remove, insert or re-order any entry. + * Keep this in sync with lib/event.c:libvlc_event_type_name(). */ + libvlc_MediaMetaChanged=0, + libvlc_MediaSubItemAdded, + libvlc_MediaDurationChanged, + libvlc_MediaParsedChanged, + libvlc_MediaFreed, + libvlc_MediaStateChanged, + libvlc_MediaSubItemTreeAdded, + + libvlc_MediaPlayerMediaChanged=0x100, + libvlc_MediaPlayerNothingSpecial, + libvlc_MediaPlayerOpening, + libvlc_MediaPlayerBuffering, + libvlc_MediaPlayerPlaying, + libvlc_MediaPlayerPaused, + libvlc_MediaPlayerStopped, + libvlc_MediaPlayerForward, + libvlc_MediaPlayerBackward, + libvlc_MediaPlayerEndReached, + libvlc_MediaPlayerEncounteredError, + libvlc_MediaPlayerTimeChanged, + libvlc_MediaPlayerPositionChanged, + libvlc_MediaPlayerSeekableChanged, + libvlc_MediaPlayerPausableChanged, + libvlc_MediaPlayerTitleChanged, + libvlc_MediaPlayerSnapshotTaken, + libvlc_MediaPlayerLengthChanged, + libvlc_MediaPlayerVout, + libvlc_MediaPlayerScrambledChanged, + libvlc_MediaPlayerESAdded, + libvlc_MediaPlayerESDeleted, + libvlc_MediaPlayerESSelected, + libvlc_MediaPlayerCorked, + libvlc_MediaPlayerUncorked, + libvlc_MediaPlayerMuted, + libvlc_MediaPlayerUnmuted, + libvlc_MediaPlayerAudioVolume, + libvlc_MediaPlayerAudioDevice, + libvlc_MediaPlayerChapterChanged, + + libvlc_MediaListItemAdded=0x200, + libvlc_MediaListWillAddItem, + libvlc_MediaListItemDeleted, + libvlc_MediaListWillDeleteItem, + libvlc_MediaListEndReached, + + libvlc_MediaListViewItemAdded=0x300, + libvlc_MediaListViewWillAddItem, + libvlc_MediaListViewItemDeleted, + libvlc_MediaListViewWillDeleteItem, + + libvlc_MediaListPlayerPlayed=0x400, + libvlc_MediaListPlayerNextItemSet, + libvlc_MediaListPlayerStopped, + + /** + * \deprecated Useless event, it will be triggered only when calling + * libvlc_media_discoverer_start() + */ + libvlc_MediaDiscovererStarted=0x500, + /** + * \deprecated Useless event, it will be triggered only when calling + * libvlc_media_discoverer_stop() + */ + libvlc_MediaDiscovererEnded, + + libvlc_RendererDiscovererItemAdded, + libvlc_RendererDiscovererItemDeleted, + + libvlc_VlmMediaAdded=0x600, + libvlc_VlmMediaRemoved, + libvlc_VlmMediaChanged, + libvlc_VlmMediaInstanceStarted, + libvlc_VlmMediaInstanceStopped, + libvlc_VlmMediaInstanceStatusInit, + libvlc_VlmMediaInstanceStatusOpening, + libvlc_VlmMediaInstanceStatusPlaying, + libvlc_VlmMediaInstanceStatusPause, + libvlc_VlmMediaInstanceStatusEnd, + libvlc_VlmMediaInstanceStatusError +}; + +/** + * A LibVLC event + */ +typedef struct libvlc_event_t +{ + int type; /**< Event type (see @ref libvlc_event_e) */ + void *p_obj; /**< Object emitting the event */ + union + { + /* media descriptor */ + struct + { + libvlc_meta_t meta_type; + } media_meta_changed; + struct + { + libvlc_media_t * new_child; + } media_subitem_added; + struct + { + int64_t new_duration; + } media_duration_changed; + struct + { + int new_status; /**< see @ref libvlc_media_parsed_status_t */ + } media_parsed_changed; + struct + { + libvlc_media_t * md; + } media_freed; + struct + { + int new_state; /**< see @ref libvlc_state_t */ + } media_state_changed; + struct + { + libvlc_media_t * item; + } media_subitemtree_added; + + /* media instance */ + struct + { + float new_cache; + } media_player_buffering; + struct + { + int new_chapter; + } media_player_chapter_changed; + struct + { + float new_position; + } media_player_position_changed; + struct + { + libvlc_time_t new_time; + } media_player_time_changed; + struct + { + int new_title; + } media_player_title_changed; + struct + { + int new_seekable; + } media_player_seekable_changed; + struct + { + int new_pausable; + } media_player_pausable_changed; + struct + { + int new_scrambled; + } media_player_scrambled_changed; + struct + { + int new_count; + } media_player_vout; + + /* media list */ + struct + { + libvlc_media_t * item; + int index; + } media_list_item_added; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_add_item; + struct + { + libvlc_media_t * item; + int index; + } media_list_item_deleted; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_delete_item; + + /* media list player */ + struct + { + libvlc_media_t * item; + } media_list_player_next_item_set; + + /* snapshot taken */ + struct + { + char* psz_filename ; + } media_player_snapshot_taken ; + + /* Length changed */ + struct + { + libvlc_time_t new_length; + } media_player_length_changed; + + /* VLM media */ + struct + { + const char * psz_media_name; + const char * psz_instance_name; + } vlm_media_event; + + /* Extra MediaPlayer */ + struct + { + libvlc_media_t * new_media; + } media_player_media_changed; + + struct + { + libvlc_track_type_t i_type; + int i_id; + } media_player_es_changed; + + struct + { + float volume; + } media_player_audio_volume; + + struct + { + const char *device; + } media_player_audio_device; + + struct + { + libvlc_renderer_item_t *item; + } renderer_discoverer_item_added; + struct + { + libvlc_renderer_item_t *item; + } renderer_discoverer_item_deleted; + } u; /**< Type-dependent event description */ +} libvlc_event_t; + + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_media.h b/vlcdemo/vlc/vlc3/include/libvlc_media.h new file mode 100644 index 0000000..0a668ef --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_media.h @@ -0,0 +1,893 @@ +/***************************************************************************** + * libvlc_media.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 383f366b6940f7b3d89f5945e015793833ea541f $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_H +#define VLC_LIBVLC_MEDIA_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media LibVLC media + * \ingroup libvlc + * @ref libvlc_media_t is an abstract representation of a playable media. + * It consists of a media location and various optional meta data. + * @{ + * \file + * LibVLC media item/descriptor external API + */ + +typedef struct libvlc_media_t libvlc_media_t; + +/** Meta data types */ +typedef enum libvlc_meta_t { + libvlc_meta_Title, + libvlc_meta_Artist, + libvlc_meta_Genre, + libvlc_meta_Copyright, + libvlc_meta_Album, + libvlc_meta_TrackNumber, + libvlc_meta_Description, + libvlc_meta_Rating, + libvlc_meta_Date, + libvlc_meta_Setting, + libvlc_meta_URL, + libvlc_meta_Language, + libvlc_meta_NowPlaying, + libvlc_meta_Publisher, + libvlc_meta_EncodedBy, + libvlc_meta_ArtworkURL, + libvlc_meta_TrackID, + libvlc_meta_TrackTotal, + libvlc_meta_Director, + libvlc_meta_Season, + libvlc_meta_Episode, + libvlc_meta_ShowName, + libvlc_meta_Actors, + libvlc_meta_AlbumArtist, + libvlc_meta_DiscNumber, + libvlc_meta_DiscTotal + /* Add new meta types HERE */ +} libvlc_meta_t; + +/** + * Note the order of libvlc_state_t enum must match exactly the order of + * \see mediacontrol_PlayerStatus, \see input_state_e enums, + * and VideoLAN.LibVLC.State (at bindings/cil/src/media.cs). + * + * Expected states by web plugins are: + * IDLE/CLOSE=0, OPENING=1, PLAYING=3, PAUSED=4, + * STOPPING=5, ENDED=6, ERROR=7 + */ +typedef enum libvlc_state_t +{ + libvlc_NothingSpecial=0, + libvlc_Opening, + libvlc_Buffering, /* XXX: Deprecated value. Check the + * libvlc_MediaPlayerBuffering event to know the + * buffering state of a libvlc_media_player */ + libvlc_Playing, + libvlc_Paused, + libvlc_Stopped, + libvlc_Ended, + libvlc_Error +} libvlc_state_t; + +enum +{ + libvlc_media_option_trusted = 0x2, + libvlc_media_option_unique = 0x100 +}; + +typedef enum libvlc_track_type_t +{ + libvlc_track_unknown = -1, + libvlc_track_audio = 0, + libvlc_track_video = 1, + libvlc_track_text = 2 +} libvlc_track_type_t; + +typedef struct libvlc_media_stats_t +{ + /* Input */ + int i_read_bytes; + float f_input_bitrate; + + /* Demux */ + int i_demux_read_bytes; + float f_demux_bitrate; + int i_demux_corrupted; + int i_demux_discontinuity; + + /* Decoders */ + int i_decoded_video; + int i_decoded_audio; + + /* Video Output */ + int i_displayed_pictures; + int i_lost_pictures; + + /* Audio output */ + int i_played_abuffers; + int i_lost_abuffers; + + /* Stream output */ + int i_sent_packets; + int i_sent_bytes; + float f_send_bitrate; +} libvlc_media_stats_t; + +typedef struct libvlc_media_track_info_t +{ + /* Codec fourcc */ + uint32_t i_codec; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + struct { + /* Audio specific */ + unsigned i_channels; + unsigned i_rate; + } audio; + struct { + /* Video specific */ + unsigned i_height; + unsigned i_width; + } video; + } u; + +} libvlc_media_track_info_t; + + +typedef struct libvlc_audio_track_t +{ + unsigned i_channels; + unsigned i_rate; +} libvlc_audio_track_t; + +typedef enum libvlc_video_orient_t +{ + libvlc_video_orient_top_left, /**< Normal. Top line represents top, left column left. */ + libvlc_video_orient_top_right, /**< Flipped horizontally */ + libvlc_video_orient_bottom_left, /**< Flipped vertically */ + libvlc_video_orient_bottom_right, /**< Rotated 180 degrees */ + libvlc_video_orient_left_top, /**< Transposed */ + libvlc_video_orient_left_bottom, /**< Rotated 90 degrees clockwise (or 270 anti-clockwise) */ + libvlc_video_orient_right_top, /**< Rotated 90 degrees anti-clockwise */ + libvlc_video_orient_right_bottom /**< Anti-transposed */ +} libvlc_video_orient_t; + +typedef enum libvlc_video_projection_t +{ + libvlc_video_projection_rectangular, + libvlc_video_projection_equirectangular, /**< 360 spherical */ + + libvlc_video_projection_cubemap_layout_standard = 0x100, +} libvlc_video_projection_t; + +/** + * Viewpoint + * + * \warning allocate using libvlc_video_new_viewpoint() + */ +typedef struct libvlc_video_viewpoint_t +{ + float f_yaw; /**< view point yaw in degrees ]-180;180] */ + float f_pitch; /**< view point pitch in degrees ]-90;90] */ + float f_roll; /**< view point roll in degrees ]-180;180] */ + float f_field_of_view; /**< field of view in degrees ]0;180[ (default 80.)*/ +} libvlc_video_viewpoint_t; + +typedef struct libvlc_video_track_t +{ + unsigned i_height; + unsigned i_width; + unsigned i_sar_num; + unsigned i_sar_den; + unsigned i_frame_rate_num; + unsigned i_frame_rate_den; + + libvlc_video_orient_t i_orientation; + libvlc_video_projection_t i_projection; + libvlc_video_viewpoint_t pose; /**< Initial view point */ +} libvlc_video_track_t; + +typedef struct libvlc_subtitle_track_t +{ + char *psz_encoding; +} libvlc_subtitle_track_t; + +typedef struct libvlc_media_track_t +{ + /* Codec fourcc */ + uint32_t i_codec; + uint32_t i_original_fourcc; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + libvlc_audio_track_t *audio; + libvlc_video_track_t *video; + libvlc_subtitle_track_t *subtitle; + }; + + unsigned int i_bitrate; + char *psz_language; + char *psz_description; + +} libvlc_media_track_t; + +/** + * Media type + * + * \see libvlc_media_get_type + */ +typedef enum libvlc_media_type_t { + libvlc_media_type_unknown, + libvlc_media_type_file, + libvlc_media_type_directory, + libvlc_media_type_disc, + libvlc_media_type_stream, + libvlc_media_type_playlist, +} libvlc_media_type_t; + +/** + * Parse flags used by libvlc_media_parse_with_options() + * + * \see libvlc_media_parse_with_options + */ +typedef enum libvlc_media_parse_flag_t +{ + /** + * Parse media if it's a local file + */ + libvlc_media_parse_local = 0x00, + /** + * Parse media even if it's a network file + */ + libvlc_media_parse_network = 0x01, + /** + * Fetch meta and covert art using local resources + */ + libvlc_media_fetch_local = 0x02, + /** + * Fetch meta and covert art using network resources + */ + libvlc_media_fetch_network = 0x04, + /** + * Interact with the user (via libvlc_dialog_cbs) when preparsing this item + * (and not its sub items). Set this flag in order to receive a callback + * when the input is asking for credentials. + */ + libvlc_media_do_interact = 0x08, +} libvlc_media_parse_flag_t; + +/** + * Parse status used sent by libvlc_media_parse_with_options() or returned by + * libvlc_media_get_parsed_status() + * + * \see libvlc_media_parse_with_options + * \see libvlc_media_get_parsed_status + */ +typedef enum libvlc_media_parsed_status_t +{ + libvlc_media_parsed_status_skipped = 1, + libvlc_media_parsed_status_failed, + libvlc_media_parsed_status_timeout, + libvlc_media_parsed_status_done, +} libvlc_media_parsed_status_t; + +/** + * Type of a media slave: subtitle or audio. + */ +typedef enum libvlc_media_slave_type_t +{ + libvlc_media_slave_type_subtitle, + libvlc_media_slave_type_audio, +} libvlc_media_slave_type_t; + +/** + * A slave of a libvlc_media_t + * \see libvlc_media_slaves_get + */ +typedef struct libvlc_media_slave_t +{ + char * psz_uri; + libvlc_media_slave_type_t i_type; + unsigned int i_priority; +} libvlc_media_slave_t; + +/** + * Callback prototype to open a custom bitstream input media. + * + * The same media item can be opened multiple times. Each time, this callback + * is invoked. It should allocate and initialize any instance-specific + * resources, then store them in *datap. The instance resources can be freed + * in the @ref libvlc_media_close_cb callback. + * + * \param opaque private pointer as passed to libvlc_media_new_callbacks() + * \param datap storage space for a private data pointer [OUT] + * \param sizep byte length of the bitstream or UINT64_MAX if unknown [OUT] + * + * \note For convenience, *datap is initially NULL and *sizep is initially 0. + * + * \return 0 on success, non-zero on error. In case of failure, the other + * callbacks will not be invoked and any value stored in *datap and *sizep is + * discarded. + */ +typedef int (*libvlc_media_open_cb)(void *opaque, void **datap, + uint64_t *sizep); + +/** + * Callback prototype to read data from a custom bitstream input media. + * + * \param opaque private pointer as set by the @ref libvlc_media_open_cb + * callback + * \param buf start address of the buffer to read data into + * \param len bytes length of the buffer + * + * \return strictly positive number of bytes read, 0 on end-of-stream, + * or -1 on non-recoverable error + * + * \note If no data is immediately available, then the callback should sleep. + * \warning The application is responsible for avoiding deadlock situations. + * In particular, the callback should return an error if playback is stopped; + * if it does not return, then libvlc_media_player_stop() will never return. + */ +typedef int (*libvlc_media_read_cb)(void *opaque, unsigned char *buf, + size_t len); + +/** + * Callback prototype to seek a custom bitstream input media. + * + * \param opaque private pointer as set by the @ref libvlc_media_open_cb + * callback + * \param offset absolute byte offset to seek to + * \return 0 on success, -1 on error. + */ +typedef int (*libvlc_media_seek_cb)(void *opaque, uint64_t offset); + +/** + * Callback prototype to close a custom bitstream input media. + * + * \param opaque private pointer as set by the @ref libvlc_media_open_cb + * callback + */ +typedef void (*libvlc_media_close_cb)(void *opaque); + +/** + * Create a media with a certain given media resource location, + * for instance a valid URL. + * + * \note To refer to a local file with this function, + * the file://... URI syntax must be used (see IETF RFC3986). + * We recommend using libvlc_media_new_path() instead when dealing with + * local files. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_mrl the media location + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_location( + libvlc_instance_t *p_instance, + const char * psz_mrl ); + +/** + * Create a media for a certain file path. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param path local filesystem path + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_path( + libvlc_instance_t *p_instance, + const char *path ); + +/** + * Create a media for an already open file descriptor. + * The file descriptor shall be open for reading (or reading and writing). + * + * Regular file descriptors, pipe read descriptors and character device + * descriptors (including TTYs) are supported on all platforms. + * Block device descriptors are supported where available. + * Directory descriptors are supported on systems that provide fdopendir(). + * Sockets are supported on all platforms where they are file descriptors, + * i.e. all except Windows. + * + * \note This library will not automatically close the file descriptor + * under any circumstance. Nevertheless, a file descriptor can usually only be + * rendered once in a media player. To render it a second time, the file + * descriptor should probably be rewound to the beginning with lseek(). + * + * \see libvlc_media_release + * + * \version LibVLC 1.1.5 and later. + * + * \param p_instance the instance + * \param fd open file descriptor + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_fd( + libvlc_instance_t *p_instance, + int fd ); + +/** + * Create a media with custom callbacks to read the data from. + * + * \param instance LibVLC instance + * \param open_cb callback to open the custom bitstream input media + * \param read_cb callback to read data (must not be NULL) + * \param seek_cb callback to seek, or NULL if seeking is not supported + * \param close_cb callback to close the media, or NULL if unnecessary + * \param opaque data pointer for the open callback + * + * \return the newly created media or NULL on error + * + * \note If open_cb is NULL, the opaque pointer will be passed to read_cb, + * seek_cb and close_cb, and the stream size will be treated as unknown. + * + * \note The callbacks may be called asynchronously (from another thread). + * A single stream instance need not be reentrant. However the open_cb needs to + * be reentrant if the media is used by multiple player instances. + * + * \warning The callbacks may be used until all or any player instances + * that were supplied the media item are stopped. + * + * \see libvlc_media_release + * + * \version LibVLC 3.0.0 and later. + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_callbacks( + libvlc_instance_t *instance, + libvlc_media_open_cb open_cb, + libvlc_media_read_cb read_cb, + libvlc_media_seek_cb seek_cb, + libvlc_media_close_cb close_cb, + void *opaque ); + +/** + * Create a media as an empty node with a given name. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_name the name of the node + * \return the new empty media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_as_node( + libvlc_instance_t *p_instance, + const char * psz_name ); + +/** + * Add an option to the media. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * \note The options are listed in 'vlc --long-help' from the command line, + * e.g. "-sout-all". Keep in mind that available options and their semantics + * vary across LibVLC versions and builds. + * \warning Not all options affects libvlc_media_t objects: + * Specifically, due to architectural issues most audio and video options, + * such as text renderer options, have no effects on an individual media. + * These options must be set through libvlc_new() instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + */ +LIBVLC_API void libvlc_media_add_option( + libvlc_media_t *p_md, + const char * psz_options ); + +/** + * Add an option to the media with configurable flags. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * The options are detailed in vlc --long-help, for instance + * "--sout-all". Note that all options are not usable on medias: + * specifically, due to architectural issues, video-related options + * such as text renderer options cannot be set on a single media. They + * must be set on the whole libvlc instance instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + * \param i_flags the flags for this option + */ +LIBVLC_API void libvlc_media_add_option_flag( + libvlc_media_t *p_md, + const char * psz_options, + unsigned i_flags ); + + +/** + * Retain a reference to a media descriptor object (libvlc_media_t). Use + * libvlc_media_release() to decrement the reference count of a + * media descriptor object. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_retain( libvlc_media_t *p_md ); + +/** + * Decrement the reference count of a media descriptor object. If the + * reference count is 0, then libvlc_media_release() will release the + * media descriptor object. It will send out an libvlc_MediaFreed event + * to all listeners. If the media descriptor object has been released it + * should not be used again. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_release( libvlc_media_t *p_md ); + + +/** + * Get the media resource locator (mrl) from a media descriptor object + * + * \param p_md a media descriptor object + * \return string with mrl of media descriptor object + */ +LIBVLC_API char *libvlc_media_get_mrl( libvlc_media_t *p_md ); + +/** + * Duplicate a media descriptor object. + * + * \param p_md a media descriptor object. + */ +LIBVLC_API libvlc_media_t *libvlc_media_duplicate( libvlc_media_t *p_md ); + +/** + * Read the meta of the media. + * + * If the media has not yet been parsed this will return NULL. + * + * \see libvlc_media_parse + * \see libvlc_media_parse_with_options + * \see libvlc_MediaMetaChanged + * + * \param p_md the media descriptor + * \param e_meta the meta to read + * \return the media's meta + */ +LIBVLC_API char *libvlc_media_get_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta ); + +/** + * Set the meta of the media (this function will not save the meta, call + * libvlc_media_save_meta in order to save the meta) + * + * \param p_md the media descriptor + * \param e_meta the meta to write + * \param psz_value the media's meta + */ +LIBVLC_API void libvlc_media_set_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta, + const char *psz_value ); + + +/** + * Save the meta previously set + * + * \param p_md the media desriptor + * \return true if the write operation was successful + */ +LIBVLC_API int libvlc_media_save_meta( libvlc_media_t *p_md ); + + +/** + * Get current state of media descriptor object. Possible media states are + * libvlc_NothingSpecial=0, libvlc_Opening, libvlc_Playing, libvlc_Paused, + * libvlc_Stopped, libvlc_Ended, libvlc_Error. + * + * \see libvlc_state_t + * \param p_md a media descriptor object + * \return state of media descriptor object + */ +LIBVLC_API libvlc_state_t libvlc_media_get_state( + libvlc_media_t *p_md ); + + +/** + * Get the current statistics about the media + * \param p_md: media descriptor object + * \param p_stats: structure that contain the statistics about the media + * (this structure must be allocated by the caller) + * \return true if the statistics are available, false otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_get_stats( libvlc_media_t *p_md, + libvlc_media_stats_t *p_stats ); + +/* The following method uses libvlc_media_list_t, however, media_list usage is optionnal + * and this is here for convenience */ +#define VLC_FORWARD_DECLARE_OBJECT(a) struct a + +/** + * Get subitems of media descriptor object. This will increment + * the reference count of supplied media descriptor object. Use + * libvlc_media_list_release() to decrement the reference counting. + * + * \param p_md media descriptor object + * \return list of media descriptor subitems or NULL + */ +LIBVLC_API VLC_FORWARD_DECLARE_OBJECT(libvlc_media_list_t *) +libvlc_media_subitems( libvlc_media_t *p_md ); + +/** + * Get event manager from media descriptor object. + * NOTE: this function doesn't increment reference counting. + * + * \param p_md a media descriptor object + * \return event manager object + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_event_manager( libvlc_media_t *p_md ); + +/** + * Get duration (in ms) of media descriptor object item. + * + * \param p_md media descriptor object + * \return duration of media item or -1 on error + */ +LIBVLC_API libvlc_time_t + libvlc_media_get_duration( libvlc_media_t *p_md ); + +/** + * Parse the media asynchronously with options. + * + * This fetches (local or network) art, meta data and/or tracks information. + * This method is the extended version of libvlc_media_parse_with_options(). + * + * To track when this is over you can listen to libvlc_MediaParsedChanged + * event. However if this functions returns an error, you will not receive any + * events. + * + * It uses a flag to specify parse options (see libvlc_media_parse_flag_t). All + * these flags can be combined. By default, media is parsed if it's a local + * file. + * + * \note Parsing can be aborted with libvlc_media_parse_stop(). + * + * \see libvlc_MediaParsedChanged + * \see libvlc_media_get_meta + * \see libvlc_media_tracks_get + * \see libvlc_media_get_parsed_status + * \see libvlc_media_parse_flag_t + * + * \param p_md media descriptor object + * \param parse_flag parse options: + * \param timeout maximum time allowed to preparse the media. If -1, the + * default "preparse-timeout" option will be used as a timeout. If 0, it will + * wait indefinitely. If > 0, the timeout will be used (in milliseconds). + * \return -1 in case of error, 0 otherwise + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API int +libvlc_media_parse_with_options( libvlc_media_t *p_md, + libvlc_media_parse_flag_t parse_flag, + int timeout ); + +/** + * Stop the parsing of the media + * + * When the media parsing is stopped, the libvlc_MediaParsedChanged event will + * be sent with the libvlc_media_parsed_status_timeout status. + * + * \see libvlc_media_parse_with_options + * + * \param p_md media descriptor object + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API void +libvlc_media_parse_stop( libvlc_media_t *p_md ); + +/** + * Get Parsed status for media descriptor object. + * + * \see libvlc_MediaParsedChanged + * \see libvlc_media_parsed_status_t + * + * \param p_md media descriptor object + * \return a value of the libvlc_media_parsed_status_t enum + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API libvlc_media_parsed_status_t + libvlc_media_get_parsed_status( libvlc_media_t *p_md ); + +/** + * Sets media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + * \param p_new_user_data pointer to user data + */ +LIBVLC_API void + libvlc_media_set_user_data( libvlc_media_t *p_md, void *p_new_user_data ); + +/** + * Get media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + */ +LIBVLC_API void *libvlc_media_get_user_data( libvlc_media_t *p_md ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \version LibVLC 2.1.0 and later. + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed with libvlc_media_tracks_release + by the caller) [OUT] + * + * \return the number of Elementary Streams (zero on error) + */ +LIBVLC_API +unsigned libvlc_media_tracks_get( libvlc_media_t *p_md, + libvlc_media_track_t ***tracks ); + +/** + * Get codec description from media elementary stream + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_track_t + * + * \param i_type i_type from libvlc_media_track_t + * \param i_codec i_codec or i_original_fourcc from libvlc_media_track_t + * + * \return codec description + */ +LIBVLC_API +const char *libvlc_media_get_codec_description( libvlc_track_type_t i_type, + uint32_t i_codec ); + +/** + * Release media descriptor's elementary streams description array + * + * \version LibVLC 2.1.0 and later. + * + * \param p_tracks tracks info array to release + * \param i_count number of elements in the array + */ +LIBVLC_API +void libvlc_media_tracks_release( libvlc_media_track_t **p_tracks, + unsigned i_count ); + +/** + * Get the media type of the media descriptor object + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_type_t + * + * \param p_md media descriptor object + * + * \return media type + */ +LIBVLC_API +libvlc_media_type_t libvlc_media_get_type( libvlc_media_t *p_md ); + +/** + * Add a slave to the current media. + * + * A slave is an external input source that may contains an additional subtitle + * track (like a .srt) or an additional audio track (like a .ac3). + * + * \note This function must be called before the media is parsed (via + * libvlc_media_parse_with_options()) or before the media is played (via + * libvlc_media_player_play()) + * + * \version LibVLC 3.0.0 and later. + * + * \param p_md media descriptor object + * \param i_type subtitle or audio + * \param i_priority from 0 (low priority) to 4 (high priority) + * \param psz_uri Uri of the slave (should contain a valid scheme). + * + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_media_slaves_add( libvlc_media_t *p_md, + libvlc_media_slave_type_t i_type, + unsigned int i_priority, + const char *psz_uri ); + +/** + * Clear all slaves previously added by libvlc_media_slaves_add() or + * internally. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_md media descriptor object + */ +LIBVLC_API +void libvlc_media_slaves_clear( libvlc_media_t *p_md ); + +/** + * Get a media descriptor's slave list + * + * The list will contain slaves parsed by VLC or previously added by + * libvlc_media_slaves_add(). The typical use case of this function is to save + * a list of slave in a database for a later use. + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_slaves_add + * + * \param p_md media descriptor object + * \param ppp_slaves address to store an allocated array of slaves (must be + * freed with libvlc_media_slaves_release()) [OUT] + * + * \return the number of slaves (zero on error) + */ +LIBVLC_API +unsigned int libvlc_media_slaves_get( libvlc_media_t *p_md, + libvlc_media_slave_t ***ppp_slaves ); + +/** + * Release a media descriptor's slave list + * + * \version LibVLC 3.0.0 and later. + * + * \param pp_slaves slave array to release + * \param i_count number of elements in the array + */ +LIBVLC_API +void libvlc_media_slaves_release( libvlc_media_slave_t **pp_slaves, + unsigned int i_count ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_media_discoverer.h b/vlcdemo/vlc/vlc3/include/libvlc_media_discoverer.h new file mode 100644 index 0000000..c82b5f7 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_media_discoverer.h @@ -0,0 +1,188 @@ +/***************************************************************************** + * libvlc_media_discoverer.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 96c0515ffec98f439867814d68525288b2702b0f $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_DISCOVERER_H +#define VLC_LIBVLC_MEDIA_DISCOVERER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * Category of a media discoverer + * \see libvlc_media_discoverer_list_get() + */ +typedef enum libvlc_media_discoverer_category_t { + /** devices, like portable music player */ + libvlc_media_discoverer_devices, + /** LAN/WAN services, like Upnp, SMB, or SAP */ + libvlc_media_discoverer_lan, + /** Podcasts */ + libvlc_media_discoverer_podcasts, + /** Local directories, like Video, Music or Pictures directories */ + libvlc_media_discoverer_localdirs, +} libvlc_media_discoverer_category_t; + +/** + * Media discoverer description + * \see libvlc_media_discoverer_list_get() + */ +typedef struct libvlc_media_discoverer_description_t { + char *psz_name; + char *psz_longname; + libvlc_media_discoverer_category_t i_cat; +} libvlc_media_discoverer_description_t; + +/** \defgroup libvlc_media_discoverer LibVLC media discovery + * \ingroup libvlc + * LibVLC media discovery finds available media via various means. + * This corresponds to the service discovery functionality in VLC media player. + * Different plugins find potential medias locally (e.g. user media directory), + * from peripherals (e.g. video capture device), on the local network + * (e.g. SAP) or on the Internet (e.g. Internet radios). + * @{ + * \file + * LibVLC media discovery external API + */ + +typedef struct libvlc_media_discoverer_t libvlc_media_discoverer_t; + +/** + * Create a media discoverer object by name. + * + * After this object is created, you should attach to media_list events in + * order to be notified of new items discovered. + * + * You need to call libvlc_media_discoverer_start() in order to start the + * discovery. + * + * \see libvlc_media_discoverer_media_list + * \see libvlc_media_discoverer_event_manager + * \see libvlc_media_discoverer_start + * + * \param p_inst libvlc instance + * \param psz_name service name; use libvlc_media_discoverer_list_get() to get + * a list of the discoverer names available in this libVLC instance + * \return media discover object or NULL in case of error + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API libvlc_media_discoverer_t * +libvlc_media_discoverer_new( libvlc_instance_t * p_inst, + const char * psz_name ); + +/** + * Start media discovery. + * + * To stop it, call libvlc_media_discoverer_stop() or + * libvlc_media_discoverer_list_release() directly. + * + * \see libvlc_media_discoverer_stop + * + * \param p_mdis media discover object + * \return -1 in case of error, 0 otherwise + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API int +libvlc_media_discoverer_start( libvlc_media_discoverer_t * p_mdis ); + +/** + * Stop media discovery. + * + * \see libvlc_media_discoverer_start + * + * \param p_mdis media discover object + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API void +libvlc_media_discoverer_stop( libvlc_media_discoverer_t * p_mdis ); + +/** + * Release media discover object. If the reference count reaches 0, then + * the object will be released. + * + * \param p_mdis media service discover object + */ +LIBVLC_API void +libvlc_media_discoverer_release( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media service discover media list. + * + * \param p_mdis media service discover object + * \return list of media items + */ +LIBVLC_API libvlc_media_list_t * +libvlc_media_discoverer_media_list( libvlc_media_discoverer_t * p_mdis ); + +/** + * Query if media service discover object is running. + * + * \param p_mdis media service discover object + * \return true if running, false if not + * + * \libvlc_return_bool + */ +LIBVLC_API int +libvlc_media_discoverer_is_running( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media discoverer services by category + * + * \version LibVLC 3.0.0 and later. + * + * \param p_inst libvlc instance + * \param i_cat category of services to fetch + * \param ppp_services address to store an allocated array of media discoverer + * services (must be freed with libvlc_media_discoverer_list_release() by + * the caller) [OUT] + * + * \return the number of media discoverer services (0 on error) + */ +LIBVLC_API size_t +libvlc_media_discoverer_list_get( libvlc_instance_t *p_inst, + libvlc_media_discoverer_category_t i_cat, + libvlc_media_discoverer_description_t ***ppp_services ); + +/** + * Release an array of media discoverer services + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_discoverer_list_get() + * + * \param pp_services array to release + * \param i_count number of elements in the array + */ +LIBVLC_API void +libvlc_media_discoverer_list_release( libvlc_media_discoverer_description_t **pp_services, + size_t i_count ); + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_media_library.h b/vlcdemo/vlc/vlc3/include/libvlc_media_library.h new file mode 100644 index 0000000..a5c32d1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_media_library.h @@ -0,0 +1,96 @@ +/***************************************************************************** + * libvlc_media_library.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: facbf813aa16140461c6e72f166d2985c52b1d6f $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_LIBRARY_H +#define VLC_LIBVLC_MEDIA_LIBRARY_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_library LibVLC media library + * \ingroup libvlc + * @{ + * \file + * LibVLC media library external API + */ + +typedef struct libvlc_media_library_t libvlc_media_library_t; + +/** + * Create an new Media Library object + * + * \param p_instance the libvlc instance + * \return a new object or NULL on error + */ +LIBVLC_API libvlc_media_library_t * + libvlc_media_library_new( libvlc_instance_t * p_instance ); + +/** + * Release media library object. This functions decrements the + * reference count of the media library object. If it reaches 0, + * then the object will be released. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_release( libvlc_media_library_t * p_mlib ); + +/** + * Retain a reference to a media library object. This function will + * increment the reference counting for this object. Use + * libvlc_media_library_release() to decrement the reference count. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_retain( libvlc_media_library_t * p_mlib ); + +/** + * Load media library. + * + * \param p_mlib media library object + * \return 0 on success, -1 on error + */ +LIBVLC_API int + libvlc_media_library_load( libvlc_media_library_t * p_mlib ); + +/** + * Get media library subitems. + * + * \param p_mlib media library object + * \return media list subitems + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_library_media_list( libvlc_media_library_t * p_mlib ); + + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_media_list.h b/vlcdemo/vlc/vlc3/include/libvlc_media_list.h new file mode 100644 index 0000000..2e25d87 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_media_list.h @@ -0,0 +1,202 @@ +/***************************************************************************** + * libvlc_media_list.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: fa3b90932be8c3a9cce27925d4867aeddde748d7 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_H +#define LIBVLC_MEDIA_LIST_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_list LibVLC media list + * \ingroup libvlc + * A LibVLC media list holds multiple @ref libvlc_media_t media descriptors. + * @{ + * \file + * LibVLC media list (playlist) external API + */ + +typedef struct libvlc_media_list_t libvlc_media_list_t; + +/** + * Create an empty media list. + * + * \param p_instance libvlc instance + * \return empty media list, or NULL on error + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_list_new( libvlc_instance_t *p_instance ); + +/** + * Release media list created with libvlc_media_list_new(). + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_release( libvlc_media_list_t *p_ml ); + +/** + * Retain reference to a media list + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_retain( libvlc_media_list_t *p_ml ); + +/** + * Associate media instance with this media list instance. + * If another media instance was present it will be released. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance to add + */ +LIBVLC_API void +libvlc_media_list_set_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Get media instance from this media list instance. This action will increase + * the refcount on the media instance. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \return media instance + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_media( libvlc_media_list_t *p_ml ); + +/** + * Add media instance to media list + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_add_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Insert media instance in media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_insert_media( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md, int i_pos ); + +/** + * Remove media instance from media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the list is read-only or the item was not found + */ +LIBVLC_API int +libvlc_media_list_remove_index( libvlc_media_list_t *p_ml, int i_pos ); + +/** + * Get count on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \return number of items in media list + */ +LIBVLC_API int + libvlc_media_list_count( libvlc_media_list_t *p_ml ); + +/** + * List media instance in media list at a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return media instance at position i_pos, or NULL if not found. + * In case of success, libvlc_media_retain() is called to increase the refcount + * on the media. + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_item_at_index( libvlc_media_list_t *p_ml, int i_pos ); +/** + * Find index position of List media instance in media list. + * Warning: the function will return the first matched position. + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance + * \return position of media instance or -1 if media not found + */ +LIBVLC_API int + libvlc_media_list_index_of_item( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md ); + +/** + * This indicates if this media list is read-only from a user point of view + * + * \param p_ml media list instance + * \return 1 on readonly, 0 on readwrite + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_is_readonly( libvlc_media_list_t * p_ml ); + +/** + * Get lock on media list items + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_lock( libvlc_media_list_t *p_ml ); + +/** + * Release lock on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_unlock( libvlc_media_list_t *p_ml ); + +/** + * Get libvlc_event_manager from this media list instance. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_ml a media list instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_event_manager( libvlc_media_list_t *p_ml ); + +/** @} media_list */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_MEDIA_LIST_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_media_list_player.h b/vlcdemo/vlc/vlc3/include/libvlc_media_list_player.h new file mode 100644 index 0000000..4597182 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_media_list_player.h @@ -0,0 +1,239 @@ +/***************************************************************************** + * libvlc_media_list_player.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 04f7d9b9f0d47e1b8304b51ca20fd2b1045a0ff2 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_PLAYER_H +#define LIBVLC_MEDIA_LIST_PLAYER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_list_player LibVLC media list player + * \ingroup libvlc + * The LibVLC media list player plays a @ref libvlc_media_list_t list of media, + * in a certain order. + * This is required to especially support playlist files. + * The normal @ref libvlc_media_player_t LibVLC media player can only play a + * single media, and does not handle playlist files properly. + * @{ + * \file + * LibVLC media list player external API + */ + +typedef struct libvlc_media_list_player_t libvlc_media_list_player_t; + +/** + * Defines playback modes for playlist. + */ +typedef enum libvlc_playback_mode_t +{ + libvlc_playback_mode_default, + libvlc_playback_mode_loop, + libvlc_playback_mode_repeat +} libvlc_playback_mode_t; + +/** + * Create new media_list_player. + * + * \param p_instance libvlc instance + * \return media list player instance or NULL on error + */ +LIBVLC_API libvlc_media_list_player_t * + libvlc_media_list_player_new( libvlc_instance_t * p_instance ); + +/** + * Release a media_list_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_list_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_release( libvlc_media_list_player_t * p_mlp ); + +/** + * Retain a reference to a media player list object. Use + * libvlc_media_list_player_release() to decrement reference count. + * + * \param p_mlp media player list object + */ +LIBVLC_API void + libvlc_media_list_player_retain( libvlc_media_list_player_t *p_mlp ); + +/** + * Return the event manager of this media_list_player. + * + * \param p_mlp media list player instance + * \return the event manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_player_event_manager(libvlc_media_list_player_t * p_mlp); + +/** + * Replace media player in media_list_player with this instance. + * + * \param p_mlp media list player instance + * \param p_mi media player instance + */ +LIBVLC_API void + libvlc_media_list_player_set_media_player( + libvlc_media_list_player_t * p_mlp, + libvlc_media_player_t * p_mi ); + +/** + * Get media player of the media_list_player instance. + * + * \param p_mlp media list player instance + * \return media player instance + * \note the caller is responsible for releasing the returned instance + */ +LIBVLC_API libvlc_media_player_t * + libvlc_media_list_player_get_media_player(libvlc_media_list_player_t * p_mlp); + +/** + * Set the media list associated with the player + * + * \param p_mlp media list player instance + * \param p_mlist list of media + */ +LIBVLC_API void + libvlc_media_list_player_set_media_list( + libvlc_media_list_player_t * p_mlp, + libvlc_media_list_t * p_mlist ); + +/** + * Play media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_play(libvlc_media_list_player_t * p_mlp); + +/** + * Toggle pause (or resume) media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_pause(libvlc_media_list_player_t * p_mlp); + +/** + * Pause or resume media list + * + * \param p_mlp media list player instance + * \param do_pause play/resume if zero, pause if non-zero + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API +void libvlc_media_list_player_set_pause(libvlc_media_list_player_t * p_mlp, + int do_pause); + +/** + * Is media list playing? + * + * \param p_mlp media list player instance + * \return true for playing and false for not playing + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_player_is_playing( libvlc_media_list_player_t * p_mlp ); + +/** + * Get current libvlc_state of media list player + * + * \param p_mlp media list player instance + * \return libvlc_state_t for media list player + */ +LIBVLC_API libvlc_state_t + libvlc_media_list_player_get_state( libvlc_media_list_player_t * p_mlp ); + +/** + * Play media list item at position index + * + * \param p_mlp media list player instance + * \param i_index index in media list to play + * \return 0 upon success -1 if the item wasn't found + */ +LIBVLC_API +int libvlc_media_list_player_play_item_at_index(libvlc_media_list_player_t * p_mlp, + int i_index); + +/** + * Play the given media item + * + * \param p_mlp media list player instance + * \param p_md the media instance + * \return 0 upon success, -1 if the media is not part of the media list + */ +LIBVLC_API +int libvlc_media_list_player_play_item(libvlc_media_list_player_t * p_mlp, + libvlc_media_t * p_md); + +/** + * Stop playing media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_stop( libvlc_media_list_player_t * p_mlp); + +/** + * Play next item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no next item + */ +LIBVLC_API +int libvlc_media_list_player_next(libvlc_media_list_player_t * p_mlp); + +/** + * Play previous item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no previous item + */ +LIBVLC_API +int libvlc_media_list_player_previous(libvlc_media_list_player_t * p_mlp); + + + +/** + * Sets the playback mode for the playlist + * + * \param p_mlp media list player instance + * \param e_mode playback mode specification + */ +LIBVLC_API +void libvlc_media_list_player_set_playback_mode(libvlc_media_list_player_t * p_mlp, + libvlc_playback_mode_t e_mode ); + +/** @} media_list_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* LIBVLC_MEDIA_LIST_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_media_player.h b/vlcdemo/vlc/vlc3/include/libvlc_media_player.h new file mode 100644 index 0000000..f260e95 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_media_player.h @@ -0,0 +1,2091 @@ +/***************************************************************************** + * libvlc_media_player.h: libvlc_media_player external API + ***************************************************************************** + * Copyright (C) 1998-2015 VLC authors and VideoLAN + * $Id: 4336df9442b5bae28ec93d540f2ee5907f34e077 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_PLAYER_H +#define VLC_LIBVLC_MEDIA_PLAYER_H 1 + +# ifdef __cplusplus +extern "C" { +# else +# include +# endif + +/** \defgroup libvlc_media_player LibVLC media player + * \ingroup libvlc + * A LibVLC media player plays one media (usually in a custom drawable). + * @{ + * \file + * LibVLC simple media player external API + */ + +typedef struct libvlc_media_player_t libvlc_media_player_t; + +/** + * Description for video, audio tracks and subtitles. It contains + * id, name (description string) and pointer to next record. + */ +typedef struct libvlc_track_description_t +{ + int i_id; + char *psz_name; + struct libvlc_track_description_t *p_next; + +} libvlc_track_description_t; + +/** + * Description for titles + */ +enum +{ + libvlc_title_menu = 0x01, + libvlc_title_interactive = 0x02 +}; + +typedef struct libvlc_title_description_t +{ + int64_t i_duration; /**< duration in milliseconds */ + char *psz_name; /**< title name */ + unsigned i_flags; /**< info if item was recognized as a menu, interactive or plain content by the demuxer */ +} libvlc_title_description_t; + +/** + * Description for chapters + */ +typedef struct libvlc_chapter_description_t +{ + int64_t i_time_offset; /**< time-offset of the chapter in milliseconds */ + int64_t i_duration; /**< duration of the chapter in milliseconds */ + char *psz_name; /**< chapter name */ +} libvlc_chapter_description_t; + +/** + * Description for audio output. It contains + * name, description and pointer to next record. + */ +typedef struct libvlc_audio_output_t +{ + char *psz_name; + char *psz_description; + struct libvlc_audio_output_t *p_next; + +} libvlc_audio_output_t; + +/** + * Description for audio output device. + */ +typedef struct libvlc_audio_output_device_t +{ + struct libvlc_audio_output_device_t *p_next; /**< Next entry in list */ + char *psz_device; /**< Device identifier string */ + char *psz_description; /**< User-friendly device description */ + /* More fields may be added here in later versions */ +} libvlc_audio_output_device_t; + +/** + * Marq options definition + */ +typedef enum libvlc_video_marquee_option_t { + libvlc_marquee_Enable = 0, + libvlc_marquee_Text, /** string argument */ + libvlc_marquee_Color, + libvlc_marquee_Opacity, + libvlc_marquee_Position, + libvlc_marquee_Refresh, + libvlc_marquee_Size, + libvlc_marquee_Timeout, + libvlc_marquee_X, + libvlc_marquee_Y +} libvlc_video_marquee_option_t; + +/** + * Navigation mode + */ +typedef enum libvlc_navigate_mode_t +{ + libvlc_navigate_activate = 0, + libvlc_navigate_up, + libvlc_navigate_down, + libvlc_navigate_left, + libvlc_navigate_right, + libvlc_navigate_popup +} libvlc_navigate_mode_t; + +/** + * Enumeration of values used to set position (e.g. of video title). + */ +typedef enum libvlc_position_t { + libvlc_position_disable=-1, + libvlc_position_center, + libvlc_position_left, + libvlc_position_right, + libvlc_position_top, + libvlc_position_top_left, + libvlc_position_top_right, + libvlc_position_bottom, + libvlc_position_bottom_left, + libvlc_position_bottom_right +} libvlc_position_t; + +/** + * Enumeration of teletext keys than can be passed via + * libvlc_video_set_teletext() + */ +typedef enum libvlc_teletext_key_t { + libvlc_teletext_key_red = 'r' << 16, + libvlc_teletext_key_green = 'g' << 16, + libvlc_teletext_key_yellow = 'y' << 16, + libvlc_teletext_key_blue = 'b' << 16, + libvlc_teletext_key_index = 'i' << 16, +} libvlc_teletext_key_t; + +/** + * Opaque equalizer handle. + * + * Equalizer settings can be applied to a media player. + */ +typedef struct libvlc_equalizer_t libvlc_equalizer_t; + +/** + * Create an empty Media Player object + * + * \param p_libvlc_instance the libvlc instance in which the Media Player + * should be created. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new( libvlc_instance_t *p_libvlc_instance ); + +/** + * Create a Media Player object from a Media + * + * \param p_md the media. Afterwards the p_md can be safely + * destroyed. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new_from_media( libvlc_media_t *p_md ); + +/** + * Release a media_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mi the Media Player to free + */ +LIBVLC_API void libvlc_media_player_release( libvlc_media_player_t *p_mi ); + +/** + * Retain a reference to a media player object. Use + * libvlc_media_player_release() to decrement reference count. + * + * \param p_mi media player object + */ +LIBVLC_API void libvlc_media_player_retain( libvlc_media_player_t *p_mi ); + +/** + * Set the media that will be used by the media_player. If any, + * previous md will be released. + * + * \param p_mi the Media Player + * \param p_md the Media. Afterwards the p_md can be safely + * destroyed. + */ +LIBVLC_API void libvlc_media_player_set_media( libvlc_media_player_t *p_mi, + libvlc_media_t *p_md ); + +/** + * Get the media used by the media_player. + * + * \param p_mi the Media Player + * \return the media associated with p_mi, or NULL if no + * media is associated + */ +LIBVLC_API libvlc_media_t * libvlc_media_player_get_media( libvlc_media_player_t *p_mi ); + +/** + * Get the Event Manager from which the media player send event. + * + * \param p_mi the Media Player + * \return the event manager associated with p_mi + */ +LIBVLC_API libvlc_event_manager_t * libvlc_media_player_event_manager ( libvlc_media_player_t *p_mi ); + +/** + * is_playing + * + * \param p_mi the Media Player + * \return 1 if the media player is playing, 0 otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_playing ( libvlc_media_player_t *p_mi ); + +/** + * Play + * + * \param p_mi the Media Player + * \return 0 if playback started (and was already started), or -1 on error. + */ +LIBVLC_API int libvlc_media_player_play ( libvlc_media_player_t *p_mi ); + +/** + * Pause or resume (no effect if there is no media) + * + * \param mp the Media Player + * \param do_pause play/resume if zero, pause if non-zero + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API void libvlc_media_player_set_pause ( libvlc_media_player_t *mp, + int do_pause ); + +/** + * Toggle pause (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_pause ( libvlc_media_player_t *p_mi ); + +/** + * Stop (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_stop ( libvlc_media_player_t *p_mi ); + +/** + * Set a renderer to the media player + * + * \note must be called before the first call of libvlc_media_player_play() to + * take effect. + * + * \see libvlc_renderer_discoverer_new + * + * \param p_mi the Media Player + * \param p_item an item discovered by libvlc_renderer_discoverer_start() + * \return 0 on success, -1 on error. + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API int libvlc_media_player_set_renderer( libvlc_media_player_t *p_mi, + libvlc_renderer_item_t *p_item ); + +/** + * Callback prototype to allocate and lock a picture buffer. + * + * Whenever a new video frame needs to be decoded, the lock callback is + * invoked. Depending on the video chroma, one or three pixel planes of + * adequate dimensions must be returned via the second parameter. Those + * planes must be aligned on 32-bytes boundaries. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param planes start address of the pixel planes (LibVLC allocates the array + * of void pointers, this callback must initialize the array) [OUT] + * \return a private pointer for the display and unlock callbacks to identify + * the picture buffers + */ +typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes); + +/** + * Callback prototype to unlock a picture buffer. + * + * When the video frame decoding is complete, the unlock callback is invoked. + * This callback might not be needed at all. It is only an indication that the + * application can now read the pixel values if it needs to. + * + * \note A picture buffer is unlocked after the picture is decoded, + * but before the picture is displayed. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + * \param planes pixel planes as defined by the @ref libvlc_video_lock_cb + * callback (this parameter is only for convenience) [IN] + */ +typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture, + void *const *planes); + +/** + * Callback prototype to display a picture. + * + * When the video frame needs to be shown, as determined by the media playback + * clock, the display callback is invoked. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + */ +typedef void (*libvlc_video_display_cb)(void *opaque, void *picture); + +/** + * Callback prototype to configure picture buffers format. + * This callback gets the format of the video as output by the video decoder + * and the chain of video filters (if any). It can opt to change any parameter + * as it needs. In that case, LibVLC will attempt to convert the video format + * (rescaling and chroma conversion) but these operations can be CPU intensive. + * + * \param opaque pointer to the private pointer passed to + * libvlc_video_set_callbacks() [IN/OUT] + * \param chroma pointer to the 4 bytes video format identifier [IN/OUT] + * \param width pointer to the pixel width [IN/OUT] + * \param height pointer to the pixel height [IN/OUT] + * \param pitches table of scanline pitches in bytes for each pixel plane + * (the table is allocated by LibVLC) [OUT] + * \param lines table of scanlines count for each plane [OUT] + * \return the number of picture buffers allocated, 0 indicates failure + * + * \note + * For each pixels plane, the scanline pitch must be bigger than or equal to + * the number of bytes per pixel multiplied by the pixel width. + * Similarly, the number of scanlines must be bigger than of equal to + * the pixel height. + * Furthermore, we recommend that pitches and lines be multiple of 32 + * to not break assumptions that might be held by optimized code + * in the video decoders, video filters and/or video converters. + */ +typedef unsigned (*libvlc_video_format_cb)(void **opaque, char *chroma, + unsigned *width, unsigned *height, + unsigned *pitches, + unsigned *lines); + +/** + * Callback prototype to configure picture buffers format. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() + * (and possibly modified by @ref libvlc_video_format_cb) [IN] + */ +typedef void (*libvlc_video_cleanup_cb)(void *opaque); + + +/** + * Set callbacks and private data to render decoded video to a custom area + * in memory. + * Use libvlc_video_set_format() or libvlc_video_set_format_callbacks() + * to configure the decoded format. + * + * \warning Rendering video into custom memory buffers is considerably less + * efficient than rendering in a custom window as normal. + * + * For optimal perfomances, VLC media player renders into a custom window, and + * does not use this function and associated callbacks. It is highly + * recommended that other LibVLC-based application do likewise. + * To embed video in a window, use libvlc_media_player_set_xid() or equivalent + * depending on the operating system. + * + * If window embedding does not fit the application use case, then a custom + * LibVLC video output display plugin is required to maintain optimal video + * rendering performances. + * + * The following limitations affect performance: + * - Hardware video decoding acceleration will either be disabled completely, + * or require (relatively slow) copy from video/DSP memory to main memory. + * - Sub-pictures (subtitles, on-screen display, etc.) must be blent into the + * main picture by the CPU instead of the GPU. + * - Depending on the video format, pixel format conversion, picture scaling, + * cropping and/or picture re-orientation, must be performed by the CPU + * instead of the GPU. + * - Memory copying is required between LibVLC reference picture buffers and + * application buffers (between lock and unlock callbacks). + * + * \param mp the media player + * \param lock callback to lock video memory (must not be NULL) + * \param unlock callback to unlock video memory (or NULL if not needed) + * \param display callback to display video (or NULL if not needed) + * \param opaque private pointer for the three callbacks (as first parameter) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_video_set_callbacks( libvlc_media_player_t *mp, + libvlc_video_lock_cb lock, + libvlc_video_unlock_cb unlock, + libvlc_video_display_cb display, + void *opaque ); + +/** + * Set decoded video chroma and dimensions. + * This only works in combination with libvlc_video_set_callbacks(), + * and is mutually exclusive with libvlc_video_set_format_callbacks(). + * + * \param mp the media player + * \param chroma a four-characters string identifying the chroma + * (e.g. "RV32" or "YUYV") + * \param width pixel width + * \param height pixel height + * \param pitch line pitch (in bytes) + * \version LibVLC 1.1.1 or later + * \bug All pixel planes are expected to have the same pitch. + * To use the YCbCr color space with chrominance subsampling, + * consider using libvlc_video_set_format_callbacks() instead. + */ +LIBVLC_API +void libvlc_video_set_format( libvlc_media_player_t *mp, const char *chroma, + unsigned width, unsigned height, + unsigned pitch ); + +/** + * Set decoded video chroma and dimensions. This only works in combination with + * libvlc_video_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the video format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_video_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_video_format_cb setup, + libvlc_video_cleanup_cb cleanup ); + +/** + * Set the NSView handler where the media player should render its video output. + * + * Use the vout called "macosx". + * + * The drawable is an NSObject that follow the VLCOpenGLVideoViewEmbedding + * protocol: + * + * @code{.m} + * \@protocol VLCOpenGLVideoViewEmbedding + * - (void)addVoutSubview:(NSView *)view; + * - (void)removeVoutSubview:(NSView *)view; + * \@end + * @endcode + * + * Or it can be an NSView object. + * + * If you want to use it along with Qt see the QMacCocoaViewContainer. Then + * the following code should work: + * @code{.mm} + * { + * NSView *video = [[NSView alloc] init]; + * QMacCocoaViewContainer *container = new QMacCocoaViewContainer(video, parent); + * libvlc_media_player_set_nsobject(mp, video); + * [video release]; + * } + * @endcode + * + * You can find a live example in VLCVideoView in VLCKit.framework. + * + * \param p_mi the Media Player + * \param drawable the drawable that is either an NSView or an object following + * the VLCOpenGLVideoViewEmbedding protocol. + */ +LIBVLC_API void libvlc_media_player_set_nsobject ( libvlc_media_player_t *p_mi, void * drawable ); + +/** + * Get the NSView handler previously set with libvlc_media_player_set_nsobject(). + * + * \param p_mi the Media Player + * \return the NSView handler or 0 if none where set + */ +LIBVLC_API void * libvlc_media_player_get_nsobject ( libvlc_media_player_t *p_mi ); + +/** + * Set an X Window System drawable where the media player should render its + * video output. The call takes effect when the playback starts. If it is + * already started, it might need to be stopped before changes apply. + * If LibVLC was built without X11 output support, then this function has no + * effects. + * + * By default, LibVLC will capture input events on the video rendering area. + * Use libvlc_video_set_mouse_input() and libvlc_video_set_key_input() to + * disable that and deliver events to the parent window / to the application + * instead. By design, the X11 protocol delivers input events to only one + * recipient. + * + * \warning + * The application must call the XInitThreads() function from Xlib before + * libvlc_new(), and before any call to XOpenDisplay() directly or via any + * other library. Failure to call XInitThreads() will seriously impede LibVLC + * performance. Calling XOpenDisplay() before XInitThreads() will eventually + * crash the process. That is a limitation of Xlib. + * + * \param p_mi media player + * \param drawable X11 window ID + * + * \note + * The specified identifier must correspond to an existing Input/Output class + * X11 window. Pixmaps are not currently supported. The default X11 + * server is assumed, i.e. that specified in the DISPLAY environment variable. + * + * \warning + * LibVLC can deal with invalid X11 handle errors, however some display drivers + * (EGL, GLX, VA and/or VDPAU) can unfortunately not. Thus the window handle + * must remain valid until playback is stopped, otherwise the process may + * abort or crash. + * + * \bug + * No more than one window handle per media player instance can be specified. + * If the media has multiple simultaneously active video tracks, extra tracks + * will be rendered into external windows beyond the control of the + * application. + */ +LIBVLC_API void libvlc_media_player_set_xwindow(libvlc_media_player_t *p_mi, + uint32_t drawable); + +/** + * Get the X Window System window identifier previously set with + * libvlc_media_player_set_xwindow(). Note that this will return the identifier + * even if VLC is not currently using it (for instance if it is playing an + * audio-only input). + * + * \param p_mi the Media Player + * \return an X window ID, or 0 if none where set. + */ +LIBVLC_API uint32_t libvlc_media_player_get_xwindow ( libvlc_media_player_t *p_mi ); + +/** + * Set a Win32/Win64 API window handle (HWND) where the media player should + * render its video output. If LibVLC was built without Win32/Win64 API output + * support, then this has no effects. + * + * \param p_mi the Media Player + * \param drawable windows handle of the drawable + */ +LIBVLC_API void libvlc_media_player_set_hwnd ( libvlc_media_player_t *p_mi, void *drawable ); + +/** + * Get the Windows API window handle (HWND) previously set with + * libvlc_media_player_set_hwnd(). The handle will be returned even if LibVLC + * is not currently outputting any video to it. + * + * \param p_mi the Media Player + * \return a window handle or NULL if there are none. + */ +LIBVLC_API void *libvlc_media_player_get_hwnd ( libvlc_media_player_t *p_mi ); + +/** + * Set the android context. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param p_awindow_handler org.videolan.libvlc.AWindow jobject owned by the + * org.videolan.libvlc.MediaPlayer class from the libvlc-android project. + */ +LIBVLC_API void libvlc_media_player_set_android_context( libvlc_media_player_t *p_mi, + void *p_awindow_handler ); + +/** + * Set the EFL Evas Object. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param p_evas_object a valid EFL Evas Object (Evas_Object) + * \return -1 if an error was detected, 0 otherwise. + */ +LIBVLC_API int libvlc_media_player_set_evas_object( libvlc_media_player_t *p_mi, + void *p_evas_object ); + + +/** + * Callback prototype for audio playback. + * + * The LibVLC media player decodes and post-processes the audio signal + * asynchronously (in an internal thread). Whenever audio samples are ready + * to be queued to the output, this callback is invoked. + * + * The number of samples provided per invocation may depend on the file format, + * the audio coding algorithm, the decoder plug-in, the post-processing + * filters and timing. Application must not assume a certain number of samples. + * + * The exact format of audio samples is determined by libvlc_audio_set_format() + * or libvlc_audio_set_format_callbacks() as is the channels layout. + * + * Note that the number of samples is per channel. For instance, if the audio + * track sampling rate is 48000 Hz, then 1200 samples represent 25 milliseconds + * of audio signal - regardless of the number of audio channels. + * + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param samples pointer to a table of audio samples to play back [IN] + * \param count number of audio samples to play back + * \param pts expected play time stamp (see libvlc_delay()) + */ +typedef void (*libvlc_audio_play_cb)(void *data, const void *samples, + unsigned count, int64_t pts); + +/** + * Callback prototype for audio pause. + * + * LibVLC invokes this callback to pause audio playback. + * + * \note The pause callback is never called if the audio is already paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the pause request (should be elapsed already) + */ +typedef void (*libvlc_audio_pause_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio resumption. + * + * LibVLC invokes this callback to resume audio playback after it was + * previously paused. + * + * \note The resume callback is never called if the audio is not paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the resumption request (should be elapsed already) + */ +typedef void (*libvlc_audio_resume_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer flush. + * + * LibVLC invokes this callback if it needs to discard all pending buffers and + * stop playback as soon as possible. This typically occurs when the media is + * stopped. + * + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_flush_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer drain. + * + * LibVLC may invoke this callback when the decoded audio track is ending. + * There will be no further decoded samples for the track, but playback should + * nevertheless continue until all already pending buffers are rendered. + * + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_drain_cb)(void *data); + +/** + * Callback prototype for audio volume change. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param volume software volume (1. = nominal, 0. = mute) + * \param mute muted flag + */ +typedef void (*libvlc_audio_set_volume_cb)(void *data, + float volume, bool mute); + +/** + * Sets callbacks and private data for decoded audio. + * + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \note The audio callbacks override any other audio output mechanism. + * If the callbacks are set, LibVLC will not output audio in any way. + * + * \param mp the media player + * \param play callback to play audio samples (must not be NULL) + * \param pause callback to pause playback (or NULL to ignore) + * \param resume callback to resume playback (or NULL to ignore) + * \param flush callback to flush audio buffers (or NULL to ignore) + * \param drain callback to drain audio buffers (or NULL to ignore) + * \param opaque private pointer for the audio callbacks (as first parameter) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_callbacks( libvlc_media_player_t *mp, + libvlc_audio_play_cb play, + libvlc_audio_pause_cb pause, + libvlc_audio_resume_cb resume, + libvlc_audio_flush_cb flush, + libvlc_audio_drain_cb drain, + void *opaque ); + +/** + * Set callbacks and private data for decoded audio. This only works in + * combination with libvlc_audio_set_callbacks(). + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \param mp the media player + * \param set_volume callback to apply audio volume, + * or NULL to apply volume in software + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_volume_callback( libvlc_media_player_t *mp, + libvlc_audio_set_volume_cb set_volume ); + +/** + * Callback prototype to setup the audio playback. + * + * This is called when the media player needs to create a new audio output. + * \param opaque pointer to the data pointer passed to + * libvlc_audio_set_callbacks() [IN/OUT] + * \param format 4 bytes sample format [IN/OUT] + * \param rate sample rate [IN/OUT] + * \param channels channels count [IN/OUT] + * \return 0 on success, anything else to skip audio playback + */ +typedef int (*libvlc_audio_setup_cb)(void **data, char *format, unsigned *rate, + unsigned *channels); + +/** + * Callback prototype for audio playback cleanup. + * + * This is called when the media player no longer needs an audio output. + * \param opaque data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_cleanup_cb)(void *data); + +/** + * Sets decoded audio format via callbacks. + * + * This only works in combination with libvlc_audio_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the audio format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_audio_setup_cb setup, + libvlc_audio_cleanup_cb cleanup ); + +/** + * Sets a fixed decoded audio format. + * + * This only works in combination with libvlc_audio_set_callbacks(), + * and is mutually exclusive with libvlc_audio_set_format_callbacks(). + * + * \param mp the media player + * \param format a four-characters string identifying the sample format + * (e.g. "S16N" or "FL32") + * \param rate sample rate (expressed in Hz) + * \param channels channels count + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format( libvlc_media_player_t *mp, const char *format, + unsigned rate, unsigned channels ); + +/** \bug This might go away ... to be replaced by a broader system */ + +/** + * Get the current movie length (in ms). + * + * \param p_mi the Media Player + * \return the movie length (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_length( libvlc_media_player_t *p_mi ); + +/** + * Get the current movie time (in ms). + * + * \param p_mi the Media Player + * \return the movie time (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi ); + +/** + * Set the movie time (in ms). This has no effect if no media is being played. + * Not all formats and protocols support this. + * + * \param p_mi the Media Player + * \param i_time the movie time (in ms). + */ +LIBVLC_API void libvlc_media_player_set_time( libvlc_media_player_t *p_mi, libvlc_time_t i_time ); + +/** + * Get movie position as percentage between 0.0 and 1.0. + * + * \param p_mi the Media Player + * \return movie position, or -1. in case of error + */ +LIBVLC_API float libvlc_media_player_get_position( libvlc_media_player_t *p_mi ); + +/** + * Set movie position as percentage between 0.0 and 1.0. + * This has no effect if playback is not enabled. + * This might not work depending on the underlying input format and protocol. + * + * \param p_mi the Media Player + * \param f_pos the position + */ +LIBVLC_API void libvlc_media_player_set_position( libvlc_media_player_t *p_mi, float f_pos ); + +/** + * Set movie chapter (if applicable). + * + * \param p_mi the Media Player + * \param i_chapter chapter number to play + */ +LIBVLC_API void libvlc_media_player_set_chapter( libvlc_media_player_t *p_mi, int i_chapter ); + +/** + * Get movie chapter. + * + * \param p_mi the Media Player + * \return chapter number currently playing, or -1 if there is no media. + */ +LIBVLC_API int libvlc_media_player_get_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get movie chapter count + * + * \param p_mi the Media Player + * \return number of chapters in movie, or -1. + */ +LIBVLC_API int libvlc_media_player_get_chapter_count( libvlc_media_player_t *p_mi ); + +/** + * Is the player able to play + * + * \param p_mi the Media Player + * \return boolean + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_will_play( libvlc_media_player_t *p_mi ); + +/** + * Get title chapter count + * + * \param p_mi the Media Player + * \param i_title title + * \return number of chapters in title, or -1 + */ +LIBVLC_API int libvlc_media_player_get_chapter_count_for_title( + libvlc_media_player_t *p_mi, int i_title ); + +/** + * Set movie title + * + * \param p_mi the Media Player + * \param i_title title number to play + */ +LIBVLC_API void libvlc_media_player_set_title( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Get movie title + * + * \param p_mi the Media Player + * \return title number currently playing, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title( libvlc_media_player_t *p_mi ); + +/** + * Get movie title count + * + * \param p_mi the Media Player + * \return title number count, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title_count( libvlc_media_player_t *p_mi ); + +/** + * Set previous chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_previous_chapter( libvlc_media_player_t *p_mi ); + +/** + * Set next chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_next_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get the requested movie play rate. + * @warning Depending on the underlying media, the requested rate may be + * different from the real playback rate. + * + * \param p_mi the Media Player + * \return movie play rate + */ +LIBVLC_API float libvlc_media_player_get_rate( libvlc_media_player_t *p_mi ); + +/** + * Set movie play rate + * + * \param p_mi the Media Player + * \param rate movie play rate to set + * \return -1 if an error was detected, 0 otherwise (but even then, it might + * not actually work depending on the underlying media protocol) + */ +LIBVLC_API int libvlc_media_player_set_rate( libvlc_media_player_t *p_mi, float rate ); + +/** + * Get current movie state + * + * \param p_mi the Media Player + * \return the current state of the media player (playing, paused, ...) \see libvlc_state_t + */ +LIBVLC_API libvlc_state_t libvlc_media_player_get_state( libvlc_media_player_t *p_mi ); + +/** + * How many video outputs does this media player have? + * + * \param p_mi the media player + * \return the number of video outputs + */ +LIBVLC_API unsigned libvlc_media_player_has_vout( libvlc_media_player_t *p_mi ); + +/** + * Is this media player seekable? + * + * \param p_mi the media player + * \return true if the media player can seek + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_seekable( libvlc_media_player_t *p_mi ); + +/** + * Can this media player be paused? + * + * \param p_mi the media player + * \return true if the media player can pause + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi ); + +/** + * Check if the current program is scrambled + * + * \param p_mi the media player + * \return true if the current program is scrambled + * + * \libvlc_return_bool + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_program_scrambled( libvlc_media_player_t *p_mi ); + +/** + * Display the next frame (if supported) + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_media_player_next_frame( libvlc_media_player_t *p_mi ); + +/** + * Navigate through DVD Menu + * + * \param p_mi the Media Player + * \param navigate the Navigation mode + * \version libVLC 2.0.0 or later + */ +LIBVLC_API void libvlc_media_player_navigate( libvlc_media_player_t* p_mi, + unsigned navigate ); + +/** + * Set if, and how, the video title will be shown when media is played. + * + * \param p_mi the media player + * \param position position at which to display the title, or libvlc_position_disable to prevent the title from being displayed + * \param timeout title display timeout in milliseconds (ignored if libvlc_position_disable) + * \version libVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_media_player_set_video_title_display( libvlc_media_player_t *p_mi, libvlc_position_t position, unsigned int timeout ); + +/** + * Add a slave to the current media player. + * + * \note If the player is playing, the slave will be added directly. This call + * will also update the slave list of the attached libvlc_media_t. + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_slaves_add + * + * \param p_mi the media player + * \param i_type subtitle or audio + * \param psz_uri Uri of the slave (should contain a valid scheme). + * \param b_select True if this slave should be selected when it's loaded + * + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_media_player_add_slave( libvlc_media_player_t *p_mi, + libvlc_media_slave_type_t i_type, + const char *psz_uri, bool b_select ); + +/** + * Release (free) libvlc_track_description_t + * + * \param p_track_description the structure to release + */ +LIBVLC_API void libvlc_track_description_list_release( libvlc_track_description_t *p_track_description ); + +/** \defgroup libvlc_video LibVLC video controls + * @{ + */ + +/** + * Toggle fullscreen status on non-embedded video outputs. + * + * @warning The same limitations applies to this function + * as to libvlc_set_fullscreen(). + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_toggle_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable fullscreen. + * + * @warning With most window managers, only a top-level windows can be in + * full-screen mode. Hence, this function will not operate properly if + * libvlc_media_player_set_xwindow() was used to embed the video in a + * non-top-level window. In that case, the embedding window must be reparented + * to the root window before fullscreen mode is enabled. You will want + * to reparent it back to its normal parent when disabling fullscreen. + * + * \param p_mi the media player + * \param b_fullscreen boolean for fullscreen status + */ +LIBVLC_API void libvlc_set_fullscreen( libvlc_media_player_t *p_mi, int b_fullscreen ); + +/** + * Get current fullscreen status. + * + * \param p_mi the media player + * \return the fullscreen status (boolean) + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_get_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable key press events handling, according to the LibVLC hotkeys + * configuration. By default and for historical reasons, keyboard events are + * handled by the LibVLC video widget. + * + * \note On X11, there can be only one subscriber for key press and mouse + * click events per window. If your application has subscribed to those events + * for the X window ID of the video widget, then LibVLC will not be able to + * handle key presses and mouse clicks in any case. + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle key press events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_key_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Enable or disable mouse click events handling. By default, those events are + * handled. This is needed for DVD menus to work, as well as a few video + * filters such as "puzzle". + * + * \see libvlc_video_set_key_input(). + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle mouse click events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_mouse_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Get the pixel dimensions of a video. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the pixel width [OUT] + * \param py pointer to get the pixel height [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_size( libvlc_media_player_t *p_mi, unsigned num, + unsigned *px, unsigned *py ); + +/** + * Get the mouse pointer coordinates over a video. + * Coordinates are expressed in terms of the decoded video resolution, + * not in terms of pixels on the screen/viewport (to get the latter, + * you can query your windowing system directly). + * + * Either of the coordinates may be negative or larger than the corresponding + * dimension of the video, if the cursor is outside the rendering area. + * + * @warning The coordinates may be out-of-date if the pointer is not located + * on the video rendering area. LibVLC does not track the pointer if it is + * outside of the video widget. + * + * @note LibVLC does not support multiple pointers (it does of course support + * multiple input devices sharing the same pointer) at the moment. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the abscissa [OUT] + * \param py pointer to get the ordinate [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_cursor( libvlc_media_player_t *p_mi, unsigned num, + int *px, int *py ); + +/** + * Get the current video scaling factor. + * See also libvlc_video_set_scale(). + * + * \param p_mi the media player + * \return the currently configured zoom factor, or 0. if the video is set + * to fit to the output window/drawable automatically. + */ +LIBVLC_API float libvlc_video_get_scale( libvlc_media_player_t *p_mi ); + +/** + * Set the video scaling factor. That is the ratio of the number of pixels on + * screen to the number of pixels in the original decoded video in each + * dimension. Zero is a special value; it will adjust the video to the output + * window/drawable (in windowed mode) or the entire screen. + * + * Note that not all video outputs support scaling. + * + * \param p_mi the media player + * \param f_factor the scaling factor, or zero + */ +LIBVLC_API void libvlc_video_set_scale( libvlc_media_player_t *p_mi, float f_factor ); + +/** + * Get current video aspect ratio. + * + * \param p_mi the media player + * \return the video aspect ratio or NULL if unspecified + * (the result must be released with free() or libvlc_free()). + */ +LIBVLC_API char *libvlc_video_get_aspect_ratio( libvlc_media_player_t *p_mi ); + +/** + * Set new video aspect ratio. + * + * \param p_mi the media player + * \param psz_aspect new video aspect-ratio or NULL to reset to default + * \note Invalid aspect ratios are ignored. + */ +LIBVLC_API void libvlc_video_set_aspect_ratio( libvlc_media_player_t *p_mi, const char *psz_aspect ); + +/** + * Create a video viewpoint structure. + * + * \version LibVLC 3.0.0 and later + * + * \return video viewpoint or NULL + * (the result must be released with free() or libvlc_free()). + */ +LIBVLC_API libvlc_video_viewpoint_t *libvlc_video_new_viewpoint(void); + +/** + * Update the video viewpoint information. + * + * \note It is safe to call this function before the media player is started. + * + * \version LibVLC 3.0.0 and later + * + * \param p_mi the media player + * \param p_viewpoint video viewpoint allocated via libvlc_video_new_viewpoint() + * \param b_absolute if true replace the old viewpoint with the new one. If + * false, increase/decrease it. + * \return -1 in case of error, 0 otherwise + * + * \note the values are set asynchronously, it will be used by the next frame displayed. + */ +LIBVLC_API int libvlc_video_update_viewpoint( libvlc_media_player_t *p_mi, + const libvlc_video_viewpoint_t *p_viewpoint, + bool b_absolute); + +/** + * Get current video subtitle. + * + * \param p_mi the media player + * \return the video subtitle selected, or -1 if none + */ +LIBVLC_API int libvlc_video_get_spu( libvlc_media_player_t *p_mi ); + +/** + * Get the number of available video subtitles. + * + * \param p_mi the media player + * \return the number of available video subtitles + */ +LIBVLC_API int libvlc_video_get_spu_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video subtitles. + * + * \param p_mi the media player + * \return list containing description of available video subtitles. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_spu_description( libvlc_media_player_t *p_mi ); + +/** + * Set new video subtitle. + * + * \param p_mi the media player + * \param i_spu video subtitle track to select (i_id from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API int libvlc_video_set_spu( libvlc_media_player_t *p_mi, int i_spu ); + +/** + * Get the current subtitle delay. Positive values means subtitles are being + * displayed later, negative values earlier. + * + * \param p_mi media player + * \return time (in microseconds) the display of subtitles is being delayed + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int64_t libvlc_video_get_spu_delay( libvlc_media_player_t *p_mi ); + +/** + * Set the subtitle delay. This affects the timing of when the subtitle will + * be displayed. Positive values result in subtitles being displayed later, + * while negative values will result in subtitles being displayed earlier. + * + * The subtitle delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay time (in microseconds) the display of subtitles should be delayed + * \return 0 on success, -1 on error + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int libvlc_video_set_spu_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the full description of available titles + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param titles address to store an allocated array of title descriptions + * descriptions (must be freed with libvlc_title_descriptions_release() + * by the caller) [OUT] + * + * \return the number of titles (-1 on error) + */ +LIBVLC_API int libvlc_media_player_get_full_title_descriptions( libvlc_media_player_t *p_mi, + libvlc_title_description_t ***titles ); + +/** + * Release a title description + * + * \version LibVLC 3.0.0 and later + * + * \param p_titles title description array to release + * \param i_count number of title descriptions to release + */ +LIBVLC_API + void libvlc_title_descriptions_release( libvlc_title_description_t **p_titles, + unsigned i_count ); + +/** + * Get the full description of available chapters + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param i_chapters_of_title index of the title to query for chapters (uses current title if set to -1) + * \param pp_chapters address to store an allocated array of chapter descriptions + * descriptions (must be freed with libvlc_chapter_descriptions_release() + * by the caller) [OUT] + * + * \return the number of chapters (-1 on error) + */ +LIBVLC_API int libvlc_media_player_get_full_chapter_descriptions( libvlc_media_player_t *p_mi, + int i_chapters_of_title, + libvlc_chapter_description_t *** pp_chapters ); + +/** + * Release a chapter description + * + * \version LibVLC 3.0.0 and later + * + * \param p_chapters chapter description array to release + * \param i_count number of chapter descriptions to release + */ +LIBVLC_API +void libvlc_chapter_descriptions_release( libvlc_chapter_description_t **p_chapters, + unsigned i_count ); + +/** + * Get current crop filter geometry. + * + * \param p_mi the media player + * \return the crop filter geometry or NULL if unset + */ +LIBVLC_API char *libvlc_video_get_crop_geometry( libvlc_media_player_t *p_mi ); + +/** + * Set new crop filter geometry. + * + * \param p_mi the media player + * \param psz_geometry new crop filter geometry (NULL to unset) + */ +LIBVLC_API +void libvlc_video_set_crop_geometry( libvlc_media_player_t *p_mi, const char *psz_geometry ); + +/** + * Get current teletext page requested or 0 if it's disabled. + * + * Teletext is disabled by default, call libvlc_video_set_teletext() to enable + * it. + * + * \param p_mi the media player + * \return the current teletext page requested. + */ +LIBVLC_API int libvlc_video_get_teletext( libvlc_media_player_t *p_mi ); + +/** + * Set new teletext page to retrieve. + * + * This function can also be used to send a teletext key. + * + * \param p_mi the media player + * \param i_page teletex page number requested. This value can be 0 to disable + * teletext, a number in the range ]0;1000[ to show the requested page, or a + * \ref libvlc_teletext_key_t. 100 is the default teletext page. + */ +LIBVLC_API void libvlc_video_set_teletext( libvlc_media_player_t *p_mi, int i_page ); + +/** + * Get number of available video tracks. + * + * \param p_mi media player + * \return the number of available video tracks (int) + */ +LIBVLC_API int libvlc_video_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video tracks. + * + * \param p_mi media player + * \return list with description of available video tracks, or NULL on error. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current video track. + * + * \param p_mi media player + * \return the video track ID (int) or -1 if no active input + */ +LIBVLC_API int libvlc_video_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set video track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API +int libvlc_video_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Take a snapshot of the current video window. + * + * If i_width AND i_height is 0, original size is used. + * If i_width XOR i_height is 0, original aspect-ratio is preserved. + * + * \param p_mi media player instance + * \param num number of video output (typically 0 for the first/only one) + * \param psz_filepath the path of a file or a folder to save the screenshot into + * \param i_width the snapshot's width + * \param i_height the snapshot's height + * \return 0 on success, -1 if the video was not found + */ +LIBVLC_API +int libvlc_video_take_snapshot( libvlc_media_player_t *p_mi, unsigned num, + const char *psz_filepath, unsigned int i_width, + unsigned int i_height ); + +/** + * Enable or disable deinterlace filter + * + * \param p_mi libvlc media player + * \param psz_mode type of deinterlace filter, NULL to disable + */ +LIBVLC_API void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi, + const char *psz_mode ); + +/** + * Get an integer marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_int_option_t + */ +LIBVLC_API int libvlc_video_get_marquee_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Get a string marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_string_option_t + */ +LIBVLC_API char *libvlc_video_get_marquee_string( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Enable, disable or set an integer marquee option + * + * Setting libvlc_marquee_Enable has the side effect of enabling (arg !0) + * or disabling (arg 0) the marq filter. + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_int_option_t + * \param i_val marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_int( libvlc_media_player_t *p_mi, + unsigned option, int i_val ); + +/** + * Set a marquee string option + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_string_option_t + * \param psz_text marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_text ); + +/** option values for libvlc_video_{get,set}_logo_{int,string} */ +enum libvlc_video_logo_option_t { + libvlc_logo_enable, + libvlc_logo_file, /**< string argument, "file,d,t;file,d,t;..." */ + libvlc_logo_x, + libvlc_logo_y, + libvlc_logo_delay, + libvlc_logo_repeat, + libvlc_logo_opacity, + libvlc_logo_position +}; + +/** + * Get integer logo option. + * + * \param p_mi libvlc media player instance + * \param option logo option to get, values of libvlc_video_logo_option_t + */ +LIBVLC_API int libvlc_video_get_logo_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set logo option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_logo_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the logo filter. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Set logo option as string. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param psz_value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_value ); + + +/** option values for libvlc_video_{get,set}_adjust_{int,float,bool} */ +enum libvlc_video_adjust_option_t { + libvlc_adjust_Enable = 0, + libvlc_adjust_Contrast, + libvlc_adjust_Brightness, + libvlc_adjust_Hue, + libvlc_adjust_Saturation, + libvlc_adjust_Gamma +}; + +/** + * Get integer adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API int libvlc_video_get_adjust_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_adjust_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the adjust filter. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Get float adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as float. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, + unsigned option, float value ); + +/** @} video */ + +/** \defgroup libvlc_audio LibVLC audio controls + * @{ + */ + +/** + * Audio device types + */ +typedef enum libvlc_audio_output_device_types_t { + libvlc_AudioOutputDevice_Error = -1, + libvlc_AudioOutputDevice_Mono = 1, + libvlc_AudioOutputDevice_Stereo = 2, + libvlc_AudioOutputDevice_2F2R = 4, + libvlc_AudioOutputDevice_3F2R = 5, + libvlc_AudioOutputDevice_5_1 = 6, + libvlc_AudioOutputDevice_6_1 = 7, + libvlc_AudioOutputDevice_7_1 = 8, + libvlc_AudioOutputDevice_SPDIF = 10 +} libvlc_audio_output_device_types_t; + +/** + * Audio channels + */ +typedef enum libvlc_audio_output_channel_t { + libvlc_AudioChannel_Error = -1, + libvlc_AudioChannel_Stereo = 1, + libvlc_AudioChannel_RStereo = 2, + libvlc_AudioChannel_Left = 3, + libvlc_AudioChannel_Right = 4, + libvlc_AudioChannel_Dolbys = 5 +} libvlc_audio_output_channel_t; + + +/** + * Gets the list of available audio output modules. + * + * \param p_instance libvlc instance + * \return list of available audio outputs. It must be freed with +* \see libvlc_audio_output_list_release \see libvlc_audio_output_t . + * In case of error, NULL is returned. + */ +LIBVLC_API libvlc_audio_output_t * +libvlc_audio_output_list_get( libvlc_instance_t *p_instance ); + +/** + * Frees the list of available audio output modules. + * + * \param p_list list with audio outputs for release + */ +LIBVLC_API +void libvlc_audio_output_list_release( libvlc_audio_output_t *p_list ); + +/** + * Selects an audio output module. + * \note Any change will take be effect only after playback is stopped and + * restarted. Audio output cannot be changed while playing. + * + * \param p_mi media player + * \param psz_name name of audio output, + * use psz_name of \see libvlc_audio_output_t + * \return 0 if function succeeded, -1 on error + */ +LIBVLC_API int libvlc_audio_output_set( libvlc_media_player_t *p_mi, + const char *psz_name ); + +/** + * Gets a list of potential audio output devices, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support enumerating devices. + * The audio output may be functional even if the list is empty (NULL). + * + * \note The list may not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param mp media player + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed with libvlc_audio_output_device_list_release() + * \version LibVLC 2.2.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_enum( libvlc_media_player_t *mp ); + +/** + * Gets a list of audio output devices for a given audio output module, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support this. In particular, an empty (NULL) + * list of devices does not imply that the specified audio output does + * not work. + * + * \note The list might not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param p_instance libvlc instance + * \param aout audio output name + * (as returned by libvlc_audio_output_list_get()) + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed with libvlc_audio_output_device_list_release() + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_list_get( libvlc_instance_t *p_instance, + const char *aout ); + +/** + * Frees a list of available audio output devices. + * + * \param p_list list with audio outputs for release + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API void libvlc_audio_output_device_list_release( + libvlc_audio_output_device_t *p_list ); + +/** + * Configures an explicit audio output device. + * + * If the module paramater is NULL, audio output will be moved to the device + * specified by the device identifier string immediately. This is the + * recommended usage. + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_enum(). + * + * However passing NULL is supported in LibVLC version 2.2.0 and later only; + * in earlier versions, this function would have no effects when the module + * parameter was NULL. + * + * If the module parameter is not NULL, the device parameter of the + * corresponding audio output, if it exists, will be set to the specified + * string. Note that some audio output modules do not have such a parameter + * (notably MMDevice and PulseAudio). + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_list_get(). + * + * \note This function does not select the specified audio output plugin. + * libvlc_audio_output_set() is used for that purpose. + * + * \warning The syntax for the device parameter depends on the audio output. + * + * Some audio output modules require further parameters (e.g. a channels map + * in the case of ALSA). + * + * \param mp media player + * \param module If NULL, current audio output module. + * if non-NULL, name of audio output module + (\see libvlc_audio_output_t) + * \param device_id device identifier string + * \return Nothing. Errors are ignored (this is a design bug). + */ +LIBVLC_API void libvlc_audio_output_device_set( libvlc_media_player_t *mp, + const char *module, + const char *device_id ); + +/** + * Get the current audio output device identifier. + * + * This complements libvlc_audio_output_device_set(). + * + * \warning The initial value for the current audio output device identifier + * may not be set or may be some unknown value. A LibVLC application should + * compare this value against the known device identifiers (e.g. those that + * were previously retrieved by a call to libvlc_audio_output_device_enum or + * libvlc_audio_output_device_list_get) to find the current audio output device. + * + * It is possible that the selected audio output device changes (an external + * change) without a call to libvlc_audio_output_device_set. That may make this + * method unsuitable to use if a LibVLC application is attempting to track + * dynamic audio device changes as they happen. + * + * \param mp media player + * \return the current audio output device identifier + * NULL if no device is selected or in case of error + * (the result must be released with free() or libvlc_free()). + * \version LibVLC 3.0.0 or later. + */ +LIBVLC_API char *libvlc_audio_output_device_get( libvlc_media_player_t *mp ); + +/** + * Toggle mute status. + * + * \param p_mi media player + * \warning Toggling mute atomically is not always possible: On some platforms, + * other processes can mute the VLC audio playback stream asynchronously. Thus, + * there is a small race condition where toggling will not work. + * See also the limitations of libvlc_audio_set_mute(). + */ +LIBVLC_API void libvlc_audio_toggle_mute( libvlc_media_player_t *p_mi ); + +/** + * Get current mute status. + * + * \param p_mi media player + * \return the mute status (boolean) if defined, -1 if undefined/unapplicable + */ +LIBVLC_API int libvlc_audio_get_mute( libvlc_media_player_t *p_mi ); + +/** + * Set mute status. + * + * \param p_mi media player + * \param status If status is true then mute, otherwise unmute + * \warning This function does not always work. If there are no active audio + * playback stream, the mute status might not be available. If digital + * pass-through (S/PDIF, HDMI...) is in use, muting may be unapplicable. Also + * some audio output plugins do not support muting at all. + * \note To force silent playback, disable all audio tracks. This is more + * efficient and reliable than mute. + */ +LIBVLC_API void libvlc_audio_set_mute( libvlc_media_player_t *p_mi, int status ); + +/** + * Get current software audio volume. + * + * \param p_mi media player + * \return the software volume in percents + * (0 = mute, 100 = nominal / 0dB) + */ +LIBVLC_API int libvlc_audio_get_volume( libvlc_media_player_t *p_mi ); + +/** + * Set current software audio volume. + * + * \param p_mi media player + * \param i_volume the volume in percents (0 = mute, 100 = 0dB) + * \return 0 if the volume was set, -1 if it was out of range + */ +LIBVLC_API int libvlc_audio_set_volume( libvlc_media_player_t *p_mi, int i_volume ); + +/** + * Get number of available audio tracks. + * + * \param p_mi media player + * \return the number of available audio tracks (int), or -1 if unavailable + */ +LIBVLC_API int libvlc_audio_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available audio tracks. + * + * \param p_mi media player + * \return list with description of available audio tracks, or NULL. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_API libvlc_track_description_t * + libvlc_audio_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current audio track. + * + * \param p_mi media player + * \return the audio track ID or -1 if no active input. + */ +LIBVLC_API int libvlc_audio_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set current audio track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Get current audio channel. + * + * \param p_mi media player + * \return the audio channel \see libvlc_audio_output_channel_t + */ +LIBVLC_API int libvlc_audio_get_channel( libvlc_media_player_t *p_mi ); + +/** + * Set current audio channel. + * + * \param p_mi media player + * \param channel the audio channel, \see libvlc_audio_output_channel_t + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_channel( libvlc_media_player_t *p_mi, int channel ); + +/** + * Get current audio delay. + * + * \param p_mi media player + * \return the audio delay (microseconds) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int64_t libvlc_audio_get_delay( libvlc_media_player_t *p_mi ); + +/** + * Set current audio delay. The audio delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay the audio delay (microseconds) + * \return 0 on success, -1 on error + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int libvlc_audio_set_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the number of equalizer presets. + * + * \return number of presets + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_preset_count( void ); + +/** + * Get the name of a particular equalizer preset. + * + * This name can be used, for example, to prepare a preset label or menu in a user + * interface. + * + * \param u_index index of the preset, counting from zero + * \return preset name, or NULL if there is no such preset + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API const char *libvlc_audio_equalizer_get_preset_name( unsigned u_index ); + +/** + * Get the number of distinct frequency bands for an equalizer. + * + * \return number of frequency bands + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_band_count( void ); + +/** + * Get a particular equalizer band frequency. + * + * This value can be used, for example, to create a label for an equalizer band control + * in a user interface. + * + * \param u_index index of the band, counting from zero + * \return equalizer band frequency (Hz), or -1 if there is no such band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_band_frequency( unsigned u_index ); + +/** + * Create a new default equalizer, with all frequency values zeroed. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new( void ); + +/** + * Create a new equalizer, with initial frequency values copied from an existing + * preset. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \param u_index index of the preset, counting from zero + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new_from_preset( unsigned u_index ); + +/** + * Release a previously created equalizer instance. + * + * The equalizer was previously created by using libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is safe to invoke this method with a NULL p_equalizer parameter for no effect. + * + * \param p_equalizer opaque equalizer handle, or NULL + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API void libvlc_audio_equalizer_release( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new pre-amplification value for an equalizer. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_preamp preamp value (-20.0 to 20.0 Hz) + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_preamp( libvlc_equalizer_t *p_equalizer, float f_preamp ); + +/** + * Get the current pre-amplification value from an equalizer. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \return preamp value (Hz) + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_preamp( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new amplification value for a particular equalizer frequency band. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_amp amplification value (-20.0 to 20.0 Hz) + * \param u_band index, counting from zero, of the frequency band to set + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_amp_at_index( libvlc_equalizer_t *p_equalizer, float f_amp, unsigned u_band ); + +/** + * Get the amplification value for a particular equalizer frequency band. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param u_band index, counting from zero, of the frequency band to get + * \return amplification value (Hz); NaN if there is no such frequency band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_amp_at_index( libvlc_equalizer_t *p_equalizer, unsigned u_band ); + +/** + * Apply new equalizer settings to a media player. + * + * The equalizer is first created by invoking libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is possible to apply new equalizer settings to a media player whether the media + * player is currently playing media or not. + * + * Invoking this method will immediately apply the new equalizer settings to the audio + * output of the currently playing media if there is any. + * + * If there is no currently playing media, the new equalizer settings will be applied + * later if and when new media is played. + * + * Equalizer settings will automatically be applied to subsequently played media. + * + * To disable the equalizer for a media player invoke this method passing NULL for the + * p_equalizer parameter. + * + * The media player does not keep a reference to the supplied equalizer so it is safe + * for an application to release the equalizer reference any time after this method + * returns. + * + * \param p_mi opaque media player handle + * \param p_equalizer opaque equalizer handle, or NULL to disable the equalizer for this media player + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_set_equalizer( libvlc_media_player_t *p_mi, libvlc_equalizer_t *p_equalizer ); + +/** + * Media player roles. + * + * \version LibVLC 3.0.0 and later. + * + * See \ref libvlc_media_player_set_role() + */ +typedef enum libvlc_media_player_role { + libvlc_role_None = 0, /**< Don't use a media player role */ + libvlc_role_Music, /**< Music (or radio) playback */ + libvlc_role_Video, /**< Video playback */ + libvlc_role_Communication, /**< Speech, real-time communication */ + libvlc_role_Game, /**< Video game */ + libvlc_role_Notification, /**< User interaction feedback */ + libvlc_role_Animation, /**< Embedded animation (e.g. in web page) */ + libvlc_role_Production, /**< Audio editting/production */ + libvlc_role_Accessibility, /**< Accessibility */ + libvlc_role_Test /** Testing */ +#define libvlc_role_Last libvlc_role_Test +} libvlc_media_player_role_t; + +/** + * Gets the media role. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi media player + * \return the media player role (\ref libvlc_media_player_role_t) + */ +LIBVLC_API int libvlc_media_player_get_role(libvlc_media_player_t *p_mi); + +/** + * Sets the media role. + * + * \param p_mi media player + * \param role the media player role (\ref libvlc_media_player_role_t) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_media_player_set_role(libvlc_media_player_t *p_mi, + unsigned role); + +/** @} audio */ + +/** @} media_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc3/include/libvlc_renderer_discoverer.h b/vlcdemo/vlc/vlc3/include/libvlc_renderer_discoverer.h new file mode 100644 index 0000000..e63a8c9 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_renderer_discoverer.h @@ -0,0 +1,255 @@ +/***************************************************************************** + * libvlc_renderer_discoverer.h: libvlc external API + ***************************************************************************** + * Copyright © 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_RENDERER_DISCOVERER_H +#define VLC_LIBVLC_RENDERER_DISCOVERER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * @defgroup libvlc_renderer_discoverer LibVLC renderer discoverer + * @ingroup libvlc + * LibVLC renderer discoverer finds available renderers available on the local + * network + * @{ + * @file + * LibVLC renderer discoverer external API + */ + +typedef struct libvlc_renderer_discoverer_t libvlc_renderer_discoverer_t; + +/** + * Renderer discoverer description + * + * \see libvlc_renderer_discoverer_list_get() + */ +typedef struct libvlc_rd_description_t +{ + char *psz_name; + char *psz_longname; +} libvlc_rd_description_t; + +/** The renderer can render audio */ +#define LIBVLC_RENDERER_CAN_AUDIO 0x0001 +/** The renderer can render video */ +#define LIBVLC_RENDERER_CAN_VIDEO 0x0002 + +/** + * Renderer item + * + * This struct is passed by a @ref libvlc_event_t when a new renderer is added + * or deleted. + * + * An item is valid until the @ref libvlc_RendererDiscovererItemDeleted event + * is called with the same pointer. + * + * \see libvlc_renderer_discoverer_event_manager() + */ +typedef struct libvlc_renderer_item_t libvlc_renderer_item_t; + + +/** + * Hold a renderer item, i.e. creates a new reference + * + * This functions need to called from the libvlc_RendererDiscovererItemAdded + * callback if the libvlc user wants to use this item after. (for display or + * for passing it to the mediaplayer for example). + * + * \version LibVLC 3.0.0 or later + * + * \return the current item + */ +LIBVLC_API libvlc_renderer_item_t * +libvlc_renderer_item_hold(libvlc_renderer_item_t *p_item); + +/** + * Releases a renderer item, i.e. decrements its reference counter + * + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API void +libvlc_renderer_item_release(libvlc_renderer_item_t *p_item); + +/** + * Get the human readable name of a renderer item + * + * \version LibVLC 3.0.0 or later + * + * \return the name of the item (can't be NULL, must *not* be freed) + */ +LIBVLC_API const char * +libvlc_renderer_item_name(const libvlc_renderer_item_t *p_item); + +/** + * Get the type (not translated) of a renderer item. For now, the type can only + * be "chromecast" ("upnp", "airplay" may come later). + * + * \version LibVLC 3.0.0 or later + * + * \return the type of the item (can't be NULL, must *not* be freed) + */ +LIBVLC_API const char * +libvlc_renderer_item_type(const libvlc_renderer_item_t *p_item); + +/** + * Get the icon uri of a renderer item + * + * \version LibVLC 3.0.0 or later + * + * \return the uri of the item's icon (can be NULL, must *not* be freed) + */ +LIBVLC_API const char * +libvlc_renderer_item_icon_uri(const libvlc_renderer_item_t *p_item); + +/** + * Get the flags of a renderer item + * + * \see LIBVLC_RENDERER_CAN_AUDIO + * \see LIBVLC_RENDERER_CAN_VIDEO + * + * \version LibVLC 3.0.0 or later + * + * \return bitwise flag: capabilities of the renderer, see + */ +LIBVLC_API int +libvlc_renderer_item_flags(const libvlc_renderer_item_t *p_item); + +/** + * Create a renderer discoverer object by name + * + * After this object is created, you should attach to events in order to be + * notified of the discoverer events. + * + * You need to call libvlc_renderer_discoverer_start() in order to start the + * discovery. + * + * \see libvlc_renderer_discoverer_event_manager() + * \see libvlc_renderer_discoverer_start() + * + * \version LibVLC 3.0.0 or later + * + * \param p_inst libvlc instance + * \param psz_name service name; use libvlc_renderer_discoverer_list_get() to + * get a list of the discoverer names available in this libVLC instance + * \return media discover object or NULL in case of error + */ +LIBVLC_API libvlc_renderer_discoverer_t * +libvlc_renderer_discoverer_new( libvlc_instance_t *p_inst, + const char *psz_name ); + +/** + * Release a renderer discoverer object + * + * \version LibVLC 3.0.0 or later + * + * \param p_rd renderer discoverer object + */ +LIBVLC_API void +libvlc_renderer_discoverer_release( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Start renderer discovery + * + * To stop it, call libvlc_renderer_discoverer_stop() or + * libvlc_renderer_discoverer_release() directly. + * + * \see libvlc_renderer_discoverer_stop() + * + * \version LibVLC 3.0.0 or later + * + * \param p_rd renderer discoverer object + * \return -1 in case of error, 0 otherwise + */ +LIBVLC_API int +libvlc_renderer_discoverer_start( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Stop renderer discovery. + * + * \see libvlc_renderer_discoverer_start() + * + * \version LibVLC 3.0.0 or later + * + * \param p_rd renderer discoverer object + */ +LIBVLC_API void +libvlc_renderer_discoverer_stop( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Get the event manager of the renderer discoverer + * + * The possible events to attach are @ref libvlc_RendererDiscovererItemAdded + * and @ref libvlc_RendererDiscovererItemDeleted. + * + * The @ref libvlc_renderer_item_t struct passed to event callbacks is owned by + * VLC, users should take care of holding/releasing this struct for their + * internal usage. + * + * \see libvlc_event_t.u.renderer_discoverer_item_added.item + * \see libvlc_event_t.u.renderer_discoverer_item_removed.item + * + * \version LibVLC 3.0.0 or later + * + * \return a valid event manager (can't fail) + */ +LIBVLC_API libvlc_event_manager_t * +libvlc_renderer_discoverer_event_manager( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Get media discoverer services + * + * \see libvlc_renderer_list_release() + * + * \version LibVLC 3.0.0 and later + * + * \param p_inst libvlc instance + * \param ppp_services address to store an allocated array of renderer + * discoverer services (must be freed with libvlc_renderer_list_release() by + * the caller) [OUT] + * + * \return the number of media discoverer services (0 on error) + */ +LIBVLC_API size_t +libvlc_renderer_discoverer_list_get( libvlc_instance_t *p_inst, + libvlc_rd_description_t ***ppp_services ); + +/** + * Release an array of media discoverer services + * + * \see libvlc_renderer_discoverer_list_get() + * + * \version LibVLC 3.0.0 and later + * + * \param pp_services array to release + * \param i_count number of elements in the array + */ +LIBVLC_API void +libvlc_renderer_discoverer_list_release( libvlc_rd_description_t **pp_services, + size_t i_count ); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/libvlc_version.h b/vlcdemo/vlc/vlc3/include/libvlc_version.h new file mode 100644 index 0000000..c1f4365 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_version.h @@ -0,0 +1,55 @@ +/***************************************************************************** + * libvlc_version.h + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines version macros for LibVLC. + * Those macros are primilarly intended for conditional (pre)compilation. + * To get the run-time LibVLC version, use libvlc_get_version() instead + * (the run-time version may be more recent than build-time one, thanks to + * backward binary compatibility). + * + * \version This header file is available in LibVLC 1.1.4 and higher. + */ + +#ifndef LIBVLC_VERSION_H +# define LIBVLC_VERSION_H 1 + +/** LibVLC major version number */ +# define LIBVLC_VERSION_MAJOR (3) + +/** LibVLC minor version number */ +# define LIBVLC_VERSION_MINOR (0) + +/** LibVLC revision */ +# define LIBVLC_VERSION_REVISION (6) + +# define LIBVLC_VERSION_EXTRA (0) + +/** Makes a single integer from a LibVLC version numbers */ +# define LIBVLC_VERSION(maj,min,rev,extra) \ + ((maj << 24) | (min << 16) | (rev << 8) | (extra)) + +/** LibVLC full version as a single integer (for comparison) */ +# define LIBVLC_VERSION_INT \ + LIBVLC_VERSION(LIBVLC_VERSION_MAJOR, LIBVLC_VERSION_MINOR, \ + LIBVLC_VERSION_REVISION, LIBVLC_VERSION_EXTRA) + +#endif diff --git a/vlcdemo/vlc/vlc3/include/libvlc_vlm.h b/vlcdemo/vlc/vlc3/include/libvlc_vlm.h new file mode 100644 index 0000000..ed6f0b0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/libvlc_vlm.h @@ -0,0 +1,342 @@ +/***************************************************************************** + * libvlc_vlm.h: libvlc_* new external API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: cfa2d956463056b287cdb0a4faeb46442040a010 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_VLM_H +#define LIBVLC_VLM_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_vlm LibVLC VLM + * \ingroup libvlc + * @{ + * \file + * LibVLC stream output manager external API + */ + +/** + * Release the vlm instance related to the given libvlc_instance_t + * + * \param p_instance the instance + */ +LIBVLC_API void libvlc_vlm_release( libvlc_instance_t *p_instance ); + +/** + * Add a broadcast, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const* ppsz_options, + int b_enabled, int b_loop ); + +/** + * Add a vod, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new vod media + * \param psz_input the input MRL + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new vod + * \param psz_mux the muxer of the vod media + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_vod( libvlc_instance_t * p_instance, + const char *psz_name, const char *psz_input, + int i_options, const char * const* ppsz_options, + int b_enabled, const char *psz_mux ); + +/** + * Delete a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to delete + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_del_media( libvlc_instance_t * p_instance, + const char *psz_name ); + +/** + * Enable or disable a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_enabled the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_enabled( libvlc_instance_t *p_instance, + const char *psz_name, int b_enabled ); + +/** + * Set the output for a media. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_output( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_output ); + +/** + * Set a media's input MRL. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Add a media's input MRL. This will add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Set a media's loop status. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_loop the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_loop( libvlc_instance_t *p_instance, + const char *psz_name, + int b_loop ); + +/** + * Set a media's vod muxer. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_mux the new muxer + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_mux( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_mux ); + +/** + * Edit the parameters of a media. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_change_media( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const *ppsz_options, + int b_enabled, int b_loop ); + +/** + * Play the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_play_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Stop the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_stop_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Pause the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_pause_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Seek in the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \param f_percentage the percentage to seek to + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_seek_media( libvlc_instance_t *p_instance, + const char *psz_name, + float f_percentage ); + +/** + * Return information about the named media as a JSON + * string representation. + * + * This function is mainly intended for debugging use, + * if you want programmatic access to the state of + * a vlm_media_instance_t, please use the corresponding + * libvlc_vlm_get_media_instance_xxx -functions. + * Currently there are no such functions available for + * vlm_media_t though. + * + * \param p_instance the instance + * \param psz_name the name of the media, + * if the name is an empty string, all media is described + * \return string with information about named media, or NULL on error + */ +LIBVLC_API const char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Get vlm_media instance position by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return position as float or -1. on error + */ +LIBVLC_API float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance time by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return time as integer or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_time( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance length by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return length of media item or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_length( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance playback rate by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return playback rate or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_rate( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); +#if 0 +/** + * Get vlm_media instance title number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return title as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_title( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance ); + +/** + * Get vlm_media instance chapter number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return chapter as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_chapter( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance ); + +/** + * Is libvlc instance seekable ? + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return 1 if seekable, 0 if not, -1 if media does not exist + */ +LIBVLC_API int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance ); +#endif +/** + * Get libvlc_event_manager from a vlm media. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_instance a libvlc instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_vlm_get_event_manager( libvlc_instance_t *p_instance ); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_about.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_about.h new file mode 100644 index 0000000..a878a41 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_about.h @@ -0,0 +1,1525 @@ +/* Automatically generated file - DO NOT EDIT */ +static const char psz_license[] = +" GNU GENERAL PUBLIC LICENSE\n" +" Version 2, June 1991\n" +"\n" +" Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" +" Everyone is permitted to copy and distribute verbatim copies\n" +" of this license document, but changing it is not allowed.\n" +"\n" +" Preamble\n" +"\n" +" The licenses for most software are designed to take away your\n" +"freedom to share and change it. By contrast, the GNU General Public\n" +"License is intended to guarantee your freedom to share and change free\n" +"software--to make sure the software is free for all its users. This\n" +"General Public License applies to most of the Free Software\n" +"Foundation's software and to any other program whose authors commit to\n" +"using it. (Some other Free Software Foundation software is covered by\n" +"the GNU Lesser General Public License instead.) You can apply it to\n" +"your programs, too.\n" +"\n" +" When we speak of free software, we are referring to freedom, not\n" +"price. Our General Public Licenses are designed to make sure that you\n" +"have the freedom to distribute copies of free software (and charge for\n" +"this service if you wish), that you receive source code or can get it\n" +"if you want it, that you can change the software or use pieces of it\n" +"in new free programs; and that you know you can do these things.\n" +"\n" +" To protect your rights, we need to make restrictions that forbid\n" +"anyone to deny you these rights or to ask you to surrender the rights.\n" +"These restrictions translate to certain responsibilities for you if you\n" +"distribute copies of the software, or if you modify it.\n" +"\n" +" For example, if you distribute copies of such a program, whether\n" +"gratis or for a fee, you must give the recipients all the rights that\n" +"you have. You must make sure that they, too, receive or can get the\n" +"source code. And you must show them these terms so they know their\n" +"rights.\n" +"\n" +" We protect your rights with two steps: (1) copyright the software, and\n" +"(2) offer you this license which gives you legal permission to copy,\n" +"distribute and/or modify the software.\n" +"\n" +" Also, for each author's protection and ours, we want to make certain\n" +"that everyone understands that there is no warranty for this free\n" +"software. If the software is modified by someone else and passed on, we\n" +"want its recipients to know that what they have is not the original, so\n" +"that any problems introduced by others will not reflect on the original\n" +"authors' reputations.\n" +"\n" +" Finally, any free program is threatened constantly by software\n" +"patents. We wish to avoid the danger that redistributors of a free\n" +"program will individually obtain patent licenses, in effect making the\n" +"program proprietary. To prevent this, we have made it clear that any\n" +"patent must be licensed for everyone's free use or not licensed at all.\n" +"\n" +" The precise terms and conditions for copying, distribution and\n" +"modification follow.\n" +"\n" +" GNU GENERAL PUBLIC LICENSE\n" +" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" +"\n" +" 0. This License applies to any program or other work which contains\n" +"a notice placed by the copyright holder saying it may be distributed\n" +"under the terms of this General Public License. The \"Program\", below,\n" +"refers to any such program or work, and a \"work based on the Program\"\n" +"means either the Program or any derivative work under copyright law:\n" +"that is to say, a work containing the Program or a portion of it,\n" +"either verbatim or with modifications and/or translated into another\n" +"language. (Hereinafter, translation is included without limitation in\n" +"the term \"modification\".) Each licensee is addressed as \"you\".\n" +"\n" +"Activities other than copying, distribution and modification are not\n" +"covered by this License; they are outside its scope. The act of\n" +"running the Program is not restricted, and the output from the Program\n" +"is covered only if its contents constitute a work based on the\n" +"Program (independent of having been made by running the Program).\n" +"Whether that is true depends on what the Program does.\n" +"\n" +" 1. You may copy and distribute verbatim copies of the Program's\n" +"source code as you receive it, in any medium, provided that you\n" +"conspicuously and appropriately publish on each copy an appropriate\n" +"copyright notice and disclaimer of warranty; keep intact all the\n" +"notices that refer to this License and to the absence of any warranty;\n" +"and give any other recipients of the Program a copy of this License\n" +"along with the Program.\n" +"\n" +"You may charge a fee for the physical act of transferring a copy, and\n" +"you may at your option offer warranty protection in exchange for a fee.\n" +"\n" +" 2. You may modify your copy or copies of the Program or any portion\n" +"of it, thus forming a work based on the Program, and copy and\n" +"distribute such modifications or work under the terms of Section 1\n" +"above, provided that you also meet all of these conditions:\n" +"\n" +" a) You must cause the modified files to carry prominent notices\n" +" stating that you changed the files and the date of any change.\n" +"\n" +" b) You must cause any work that you distribute or publish, that in\n" +" whole or in part contains or is derived from the Program or any\n" +" part thereof, to be licensed as a whole at no charge to all third\n" +" parties under the terms of this License.\n" +"\n" +" c) If the modified program normally reads commands interactively\n" +" when run, you must cause it, when started running for such\n" +" interactive use in the most ordinary way, to print or display an\n" +" announcement including an appropriate copyright notice and a\n" +" notice that there is no warranty (or else, saying that you provide\n" +" a warranty) and that users may redistribute the program under\n" +" these conditions, and telling the user how to view a copy of this\n" +" License. (Exception: if the Program itself is interactive but\n" +" does not normally print such an announcement, your work based on\n" +" the Program is not required to print an announcement.)\n" +"\n" +"These requirements apply to the modified work as a whole. If\n" +"identifiable sections of that work are not derived from the Program,\n" +"and can be reasonably considered independent and separate works in\n" +"themselves, then this License, and its terms, do not apply to those\n" +"sections when you distribute them as separate works. But when you\n" +"distribute the same sections as part of a whole which is a work based\n" +"on the Program, the distribution of the whole must be on the terms of\n" +"this License, whose permissions for other licensees extend to the\n" +"entire whole, and thus to each and every part regardless of who wrote it.\n" +"\n" +"Thus, it is not the intent of this section to claim rights or contest\n" +"your rights to work written entirely by you; rather, the intent is to\n" +"exercise the right to control the distribution of derivative or\n" +"collective works based on the Program.\n" +"\n" +"In addition, mere aggregation of another work not based on the Program\n" +"with the Program (or with a work based on the Program) on a volume of\n" +"a storage or distribution medium does not bring the other work under\n" +"the scope of this License.\n" +"\n" +" 3. You may copy and distribute the Program (or a work based on it,\n" +"under Section 2) in object code or executable form under the terms of\n" +"Sections 1 and 2 above provided that you also do one of the following:\n" +"\n" +" a) Accompany it with the complete corresponding machine-readable\n" +" source code, which must be distributed under the terms of Sections\n" +" 1 and 2 above on a medium customarily used for software interchange; or,\n" +"\n" +" b) Accompany it with a written offer, valid for at least three\n" +" years, to give any third party, for a charge no more than your\n" +" cost of physically performing source distribution, a complete\n" +" machine-readable copy of the corresponding source code, to be\n" +" distributed under the terms of Sections 1 and 2 above on a medium\n" +" customarily used for software interchange; or,\n" +"\n" +" c) Accompany it with the information you received as to the offer\n" +" to distribute corresponding source code. (This alternative is\n" +" allowed only for noncommercial distribution and only if you\n" +" received the program in object code or executable form with such\n" +" an offer, in accord with Subsection b above.)\n" +"\n" +"The source code for a work means the preferred form of the work for\n" +"making modifications to it. For an executable work, complete source\n" +"code means all the source code for all modules it contains, plus any\n" +"associated interface definition files, plus the scripts used to\n" +"control compilation and installation of the executable. However, as a\n" +"special exception, the source code distributed need not include\n" +"anything that is normally distributed (in either source or binary\n" +"form) with the major components (compiler, kernel, and so on) of the\n" +"operating system on which the executable runs, unless that component\n" +"itself accompanies the executable.\n" +"\n" +"If distribution of executable or object code is made by offering\n" +"access to copy from a designated place, then offering equivalent\n" +"access to copy the source code from the same place counts as\n" +"distribution of the source code, even though third parties are not\n" +"compelled to copy the source along with the object code.\n" +"\n" +" 4. You may not copy, modify, sublicense, or distribute the Program\n" +"except as expressly provided under this License. Any attempt\n" +"otherwise to copy, modify, sublicense or distribute the Program is\n" +"void, and will automatically terminate your rights under this License.\n" +"However, parties who have received copies, or rights, from you under\n" +"this License will not have their licenses terminated so long as such\n" +"parties remain in full compliance.\n" +"\n" +" 5. You are not required to accept this License, since you have not\n" +"signed it. However, nothing else grants you permission to modify or\n" +"distribute the Program or its derivative works. These actions are\n" +"prohibited by law if you do not accept this License. Therefore, by\n" +"modifying or distributing the Program (or any work based on the\n" +"Program), you indicate your acceptance of this License to do so, and\n" +"all its terms and conditions for copying, distributing or modifying\n" +"the Program or works based on it.\n" +"\n" +" 6. Each time you redistribute the Program (or any work based on the\n" +"Program), the recipient automatically receives a license from the\n" +"original licensor to copy, distribute or modify the Program subject to\n" +"these terms and conditions. You may not impose any further\n" +"restrictions on the recipients' exercise of the rights granted herein.\n" +"You are not responsible for enforcing compliance by third parties to\n" +"this License.\n" +"\n" +" 7. If, as a consequence of a court judgment or allegation of patent\n" +"infringement or for any other reason (not limited to patent issues),\n" +"conditions are imposed on you (whether by court order, agreement or\n" +"otherwise) that contradict the conditions of this License, they do not\n" +"excuse you from the conditions of this License. If you cannot\n" +"distribute so as to satisfy simultaneously your obligations under this\n" +"License and any other pertinent obligations, then as a consequence you\n" +"may not distribute the Program at all. For example, if a patent\n" +"license would not permit royalty-free redistribution of the Program by\n" +"all those who receive copies directly or indirectly through you, then\n" +"the only way you could satisfy both it and this License would be to\n" +"refrain entirely from distribution of the Program.\n" +"\n" +"If any portion of this section is held invalid or unenforceable under\n" +"any particular circumstance, the balance of the section is intended to\n" +"apply and the section as a whole is intended to apply in other\n" +"circumstances.\n" +"\n" +"It is not the purpose of this section to induce you to infringe any\n" +"patents or other property right claims or to contest validity of any\n" +"such claims; this section has the sole purpose of protecting the\n" +"integrity of the free software distribution system, which is\n" +"implemented by public license practices. Many people have made\n" +"generous contributions to the wide range of software distributed\n" +"through that system in reliance on consistent application of that\n" +"system; it is up to the author/donor to decide if he or she is willing\n" +"to distribute software through any other system and a licensee cannot\n" +"impose that choice.\n" +"\n" +"This section is intended to make thoroughly clear what is believed to\n" +"be a consequence of the rest of this License.\n" +"\n" +" 8. If the distribution and/or use of the Program is restricted in\n" +"certain countries either by patents or by copyrighted interfaces, the\n" +"original copyright holder who places the Program under this License\n" +"may add an explicit geographical distribution limitation excluding\n" +"those countries, so that distribution is permitted only in or among\n" +"countries not thus excluded. In such case, this License incorporates\n" +"the limitation as if written in the body of this License.\n" +"\n" +" 9. The Free Software Foundation may publish revised and/or new versions\n" +"of the General Public License from time to time. Such new versions will\n" +"be similar in spirit to the present version, but may differ in detail to\n" +"address new problems or concerns.\n" +"\n" +"Each version is given a distinguishing version number. If the Program\n" +"specifies a version number of this License which applies to it and \"any\n" +"later version\", you have the option of following the terms and conditions\n" +"either of that version or of any later version published by the Free\n" +"Software Foundation. If the Program does not specify a version number of\n" +"this License, you may choose any version ever published by the Free Software\n" +"Foundation.\n" +"\n" +" 10. If you wish to incorporate parts of the Program into other free\n" +"programs whose distribution conditions are different, write to the author\n" +"to ask for permission. For software which is copyrighted by the Free\n" +"Software Foundation, write to the Free Software Foundation; we sometimes\n" +"make exceptions for this. Our decision will be guided by the two goals\n" +"of preserving the free status of all derivatives of our free software and\n" +"of promoting the sharing and reuse of software generally.\n" +"\n" +" NO WARRANTY\n" +"\n" +" 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" +"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" +"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" +"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" +"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" +"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" +"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" +"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" +"REPAIR OR CORRECTION.\n" +"\n" +" 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" +"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" +"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" +"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" +"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" +"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" +"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" +"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" +"POSSIBILITY OF SUCH DAMAGES.\n" +"\n" +" END OF TERMS AND CONDITIONS\n" +"\n" +" How to Apply These Terms to Your New Programs\n" +"\n" +" If you develop a new program, and you want it to be of the greatest\n" +"possible use to the public, the best way to achieve this is to make it\n" +"free software which everyone can redistribute and change under these terms.\n" +"\n" +" To do so, attach the following notices to the program. It is safest\n" +"to attach them to the start of each source file to most effectively\n" +"convey the exclusion of warranty; and each file should have at least\n" +"the \"copyright\" line and a pointer to where the full notice is found.\n" +"\n" +" \n" +" Copyright (C) \n" +"\n" +" This program is free software; you can redistribute it and/or modify\n" +" it under the terms of the GNU General Public License as published by\n" +" the Free Software Foundation; either version 2 of the License, or\n" +" (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be useful,\n" +" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +" GNU General Public License for more details.\n" +"\n" +" You should have received a copy of the GNU General Public License along\n" +" with this program; if not, write to the Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n" +"\n" +"Also add information on how to contact you by electronic and paper mail.\n" +"\n" +"If the program is interactive, make it output a short notice like this\n" +"when it starts in an interactive mode:\n" +"\n" +" Gnomovision version 69, Copyright (C) year name of author\n" +" Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" +" This is free software, and you are welcome to redistribute it\n" +" under certain conditions; type `show c' for details.\n" +"\n" +"The hypothetical commands `show w' and `show c' should show the appropriate\n" +"parts of the General Public License. Of course, the commands you use may\n" +"be called something other than `show w' and `show c'; they could even be\n" +"mouse-clicks or menu items--whatever suits your program.\n" +"\n" +"You should also get your employer (if you work as a programmer) or your\n" +"school, if any, to sign a \"copyright disclaimer\" for the program, if\n" +"necessary. Here is a sample; alter the names:\n" +"\n" +" Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" +" `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" +"\n" +" , 1 April 1989\n" +" Ty Coon, President of Vice\n" +"\n" +"This General Public License does not permit incorporating your program into\n" +"proprietary programs. If your program is a subroutine library, you may\n" +"consider it more useful to permit linking proprietary applications with the\n" +"library. If this is what you want to do, use the GNU Lesser General\n" +"Public License instead of this License.\n" +; +static const char psz_thanks[] = +"Some VLC plugins use external libraries and make extensive use of the\n" +"following persons' or companies' code:\n" +"\n" +"FAAD2 - Copyright (c) Nero AG, www.nero.com\" - GPLv2 or later\n" +"FFmpeg - Copyright (c) 2000-2017 the FFmpeg developers - LGPLv2.1 or later\n" +"FluidLite - Copyright (c) 2016 Robin Lobel - LGPLv2.1 or later\n" +"FluidSynth - Copyright (c) 2003-2010 Peter Hanappe, Conrad Berhörster, Antoine\n" +" Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson - LGPLv2.1 or\n" +" later\n" +"Fontconfig - Copyright (c) 2000,2001,2002,2003,2004,2006,2007 Keith Packard,\n" +" (c) 2005 Patrick Lam, (c) 2009 Roozbeh Pournader, (c) 2008,2009 Red Hat,\n" +" Inc., (c) 2008 Danilo Šegan, (c) 2012 Google, Inc. - MIT License\n" +"freetype - David Turner, Robert Wilhelm, and Werner Lemberg - FreeType License\n" +"GSM - Copyright (c) 1992 - 1994, 2009 Jutta Degener & Carsten Bormann - GSM\n" +" permissive license\n" +"GNU FriBidi - Copyright (c) 2004-2012 Behdad Esfahbod, Dov Grobgeld, Roozbeh\n" +" Pournader - LGPLv2.1 or later\n" +"GnuTLS - Copyright (C) 2000-2012 Free Software Foundation, Inc. - LGPLv2.1 or\n" +" later\n" +"harfbuzz - Copyright (c) 2010, 2011, 2012 Google, Inc., (c) 2012 Mozilla\n" +" Foundation, (c) 2011 Codethink Limited, (c) 2008, 2010 Nokia Corporation\n" +" and/or its subsidiary(-ies), (c) 2009 Keith Stribley, (c) 2009 Martin Hosken\n" +" and SIL International, (c) 2007 Chris Wilson, (c) 2006 Behdad Esfahbod,\n" +" (c) 2005 David Turner, (c) 2004, 2007, 2008, 2009, 2010 Red Hat, Inc.,\n" +" (c) 1998-2004 David Turner and Werner Lemberg - Old MIT License\n" +"liba52 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libav - Copyright (c) 2000 - 2015 the libav developers - LGPLv2.1 or later\n" +"libass - Copyright (c) 2006-2015 Grigori Goronzy et al. - ISC License\n" +"libbluray - Copyright (c) 2009-2015 VideoLAN and authors - LGPLv2.1 or later\n" +"libcaca - Copyright (c) 2004 Sam Hocevar - WTFPL / LGPLv2.1 or later /\n" +" GPLv2 or later / ISC\n" +"libdca - Copyright (c) 2004-2007 VideoLAN and authors - GPLv2 or later\n" +"libdvbpsi - Copyright (c) 2001-2017 VideoLAN and authors - LGPLv2.1 or later\n" +"libdvdcss - Copyright (c) 2001-2017 VideoLAN and authors - GPLv2 or later\n" +"libdvdread - GPLv2 or later\n" +"libdvdnav - GPLv2 or later\n" +"libebml - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libFLAC - Copyright (c) 2001 - 2014 Josh Coalson et al. - Xiph.org BSD license\n" +"libgme - LGPLv2.1 or later\n" +"libgpg-error - Copyright 2003, 2004, 2005, 2006, 2007, 2013 g10 Code GmbH\n" +" - LGPLv2.1 or later\n" +"libkate - Copyright (c) 2008-2011 Vincent Penquerc'h - 3-clause BSD License\n" +"liblive555 - Copyright (c) 1996-2015 Live Networks, Inc. - LGPLv2.1 or later\n" +"libmad - Copyright (c) 2000-2004 Robert Leslie, et al. - GPLv2 or later\n" +"libmatroska - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libmpeg2 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libmodplug - Oliver Lapicque, Konstanty - Public domain\n" +"libogg, libvorbis - Copyright (c) 2002-2015 Xiph.org Foundation - Xiph.org BSD\n" +" license\n" +"libpostproc - Copyright (C) 2001-2015 Michael Niedermayer, et al. - GPLv2 or\n" +" later\n" +"libpng - Copyright (c) 2004, 2006-2014 Glenn Randers-Perhson, et al. - libpng\n" +" license\n" +"libsamplerate - Copyright (c) 2002-2011 Erik de Castro Lopo - GPLv2 or later\n" +"libschroedinger - Copyright (c) 2006 BBC and Fluendo - MIT License\n" +"libsdl - Copyright (c) 1997-2014 Sam Lantinga et al. - LGPLv2.1 or later\n" +"libshout - Copyright (c) 2012 - LGPLv2.1 or later\n" +"libtheora - Copyright (c) Xiph.org Foundation - Xiph.org BSD license\n" +"libtiff - Copyright (c) 1988-1997 Sam Leffler, (c) 1991-1997 Silicon Graphics,\n" +" Inc. - BSD-like\n" +"libtwolame - Copyright (c) 2001-2004 Michael Cheng, (c) 2004-2006 The TwoLAME\n" +" Project - LGPLv2.1 or later\n" +"libupnp - Copyright (c) 2000-2003 Intel Corporation - 3-clause BSD License\n" +"libvpx - Copyright (c) 2010-2015, Google Inc. - 3-clause BSD License\n" +"libxml2 - Copyright (c) 1998-2014 Daniel Veillard - MIT License\n" +"lua - Copyright (c) 1994-2008 Lua.org, PUC-Rio. - MIT License\n" +"Musepack decoder library - Copyright (c) 2005-2011, The Musepack Development\n" +" Team - 3-clause BSD License\n" +"OpenJPEG - Copyright (c) 2002-2014, Communcations and Remote Sensing\n" +" Laboratory, UCL, Belgium - ISC License\n" +"Opus - Copyright 2001-2013 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin,\n" +" Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding,\n" +" Erik de Castro Lopo - Xiph.org BSD License\n" +"Sparkle — Andy Matuschak et al. - MIT License\n" +"Speex, Speexdsp - Copyright (c) 1992-2015 Xiph.org Foundation, Jean-Marc Valin,\n" +" Analog Devices Inc. Commonwealth Scientific and Industrial Research\n" +" Organisation, David Row, Jutta Degener, Carsten Bormann - 3-clause BSD\n" +" License\n" +"taglib - Copyright (c) 2004-2016 Scott Wheeler, et al. - LGPLv2.1 or later\n" +"x264 - Copyright (c) 2004-2017 VideoLAN and authors - GPLv2 or later\n" +"x265 - Copyright (c) 2004-2015 x265 project - GPLv2 or later\n" +"Zapping VBI library - Copyright (c) 2000-2003 Michael H. Schimek, Iñaki García\n" +" Etxebarria - LGPLv2.1 or later\n" +"zlib - Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler - zlib license\n" +"\n" +"The VideoLAN team would like to thank the following donators:\n" +"\n" +"Julian Cain, who made a $1000 donation\n" +"The French website MacBidouille gave €500 to help us buy a PowerMac G5\n" +"The French magazine à vos MAC gave €500 to help us buy a PowerMac G5\n" +"Laurent Dupuy, who made a €540 donation\n" +"The French company Cybervia (Actech) gave €2000 to pay for webserver hosting\n" +"Dennis Perov - Hardware donation\n" +"\n" +"...the following active members of our user community:\n" +"\n" +"Alan Wright\n" +"David J LaBarre \"DJ\"\n" +"Eric Adler\n" +"Julien Bouquillon\n" +"\n" +"...and code auditors and testers:\n" +"\n" +"David Thiel\n" +"Philippe A. aka \"Lotesdelère\"\n" +"Sebastien Chaumat\n" +; +static const char psz_authors[] = +"VideoLAN and the VLC team would like to acknowledge the following contributors:\n" +"\n" +"Programming\n" +"-----------\n" +"Rémi Denis-Courmont\n" +"Jean-Baptiste Kempf\n" +"Laurent Aimar\n" +"François Cartegnie\n" +"Gildas Bazin\n" +"Felix Paul Kühne\n" +"Rafaël Carré\n" +"Pierre d'Herbemont\n" +"Thomas Guillem\n" +"Rémi Duraffort\n" +"Derk-Jan Hartman\n" +"Antoine Cellerier\n" +"Samuel Hocevar\n" +"Jean-Paul Saman\n" +"Steve Lhomme\n" +"Christophe Mutricy\n" +"Clément Stenac\n" +"Christophe Massiot\n" +"Ilkka Ollakka\n" +"Pierre Ynard\n" +"Filip Roséen\n" +"Damien Fouilleul\n" +"Sigmund Augdal Helberg\n" +"Erwan Tulou\n" +"David Fuhrmann\n" +"Marvin Scholz\n" +"Olivier Teulière\n" +"Cyril Deguet\n" +"Eric Petit\n" +"Filippo Carone\n" +"Rocky Bernstein\n" +"Hugo Beauzée-Luyssen\n" +"Olivier Aubert\n" +"Pavlov Konstantin\n" +"Jakob Leben\n" +"Benjamin Pracht\n" +"Jean-Philippe André\n" +"Stéphane Borel\n" +"JP Dinger\n" +"Geoffroy Couprie\n" +"Martin Storsjö\n" +"Marian Ďurkovič\n" +"Ludovic Fauvet\n" +"Petri Hintukainen\n" +"Yoann Peronneau\n" +"Denis Charmet\n" +"Sébastien Escudier\n" +"Jon Lech Johansen\n" +"KO Myung-Hun\n" +"Edward Wang\n" +"Dennis van Amerongen\n" +"Faustino Osuna\n" +"Mirsal Ennaime\n" +"Sean McGovern\n" +"Jérôme Decoodt\n" +"Loïc Minier\n" +"David Flynn\n" +"Frédéric Yhuel\n" +"Kaarlo Raiha\n" +"Mark Moriarty\n" +"Christopher Mueller\n" +"Fabio Ritrovato\n" +"Tony Castley\n" +"Srikanth Raju\n" +"Michel Kaempf\n" +"Jean-Marc Dressler\n" +"Johan Bilien\n" +"Vincent Seguin\n" +"Simon Latapie\n" +"Bernie Purcell\n" +"Henri Fallon\n" +"Sebastien Zwickert\n" +"Christoph Miebach\n" +"Adrien Maglo\n" +"Emmanuel Puig\n" +"Renaud Dartus\n" +"Alexis de Lattre\n" +"Vincent Penquerc'h\n" +"Arnaud de Bossoreille de Ribou\n" +"Mohammed Adnène Trojette\n" +"Salah-Eddin Shaban\n" +"Vittorio Giovara\n" +"Boris Dorès\n" +"Jai Menon\n" +"Anil Daoud\n" +"Daniel Mierswa\n" +"Naohiro Koriyama\n" +"Rob Jonson\n" +"Pierre Baillet\n" +"Dominique Leuenberger\n" +"Andre Pang\n" +"Zoran Turalija\n" +"Akash Mehrotra\n" +"André Weber\n" +"Anthony Loiseau\n" +"Lukas Durfina\n" +"Xavier Marchesini\n" +"Cyril Mathé\n" +"Devin Heitmueller\n" +"Juho Vähä-Herttua\n" +"Ken Self\n" +"Alexis Ballier\n" +"Juha Jeronen\n" +"Nicolas Chauvet\n" +"Richard Hosking\n" +"Éric Lassauge\n" +"Marc Ariberti\n" +"Sébastien Toque\n" +"Tobias Güntner\n" +"Benoit Steiner\n" +"Michel Lespinasse\n" +"Carlo Calabrò\n" +"Cheng Sun\n" +"Michał Trzebiatowski\n" +"Brad Smith\n" +"Brendon Justin\n" +"Alexey Sokolov\n" +"Basos G\n" +"Philippe Morin\n" +"Steinar H. Gunderson\n" +"Vicente Jimenez Aguilar\n" +"Yuval Tze\n" +"Yves Duret\n" +"Benjamin Drung\n" +"Michael Hanselmann\n" +"Alex Merry\n" +"Damien Lucas\n" +"Grigori Goronzy\n" +"Richard Shepherd\n" +"Gaël Hendryckx\n" +"Michael Feurstein\n" +"Stephan Assmus\n" +"Adrien Grand\n" +"Colin Guthrie\n" +"David Menestrina\n" +"Dominique Martinet\n" +"Gleb Pinigin\n" +"Jason Luka\n" +"Luc Saillard\n" +"Luca Barbato\n" +"Mario Speiß\n" +"Pankaj Yadav\n" +"Ramiro Polla\n" +"Ronald Wright\n" +"Rui Zhang\n" +"Can Wu\n" +"Christophe Courtaut\n" +"FUJISAWA Tooru\n" +"Hannes Domani\n" +"Manol Manolov\n" +"Timothy B. Terriberry\n" +"Antoine Lejeune\n" +"Arnaud Schauly\n" +"Branko Kokanovic\n" +"Dylan Yudaken\n" +"Florian G. Pflug\n" +"François Revol\n" +"G Finch\n" +"Keary Griffin\n" +"Konstanty Bialkowski\n" +"Ming Hu\n" +"Philippe Coent\n" +"Przemyslaw Fiala\n" +"Tanguy Krotoff\n" +"Vianney BOYER\n" +"Casian Andrei\n" +"Chris Smowton\n" +"David Kaplan\n" +"Eugenio Jarosiewicz\n" +"Fabian Keil\n" +"Guillaume Poussel\n" +"John Peterson\n" +"Justus Piater\n" +"Mark Lee\n" +"Martin T. H. Sandsmark\n" +"Rune Botten\n" +"Søren Bøg\n" +"Toralf Niebuhr\n" +"Tristan Matthews\n" +"Angelo Haller\n" +"Aurélien Nephtali\n" +"Austin Burrow\n" +"Bill C. Riemers\n" +"Colin Delacroix\n" +"Cristian Maglie\n" +"Elminster2031\n" +"Jakub Wieczorek\n" +"John Freed\n" +"Mark Hassman\n" +"Martin Briza\n" +"Mike Houben\n" +"Romain Goyet\n" +"Adrian Yanes\n" +"Alexander Lakhin\n" +"Anatoliy Anischovich\n" +"Barry Wardell\n" +"Ben Hutchings\n" +"Besnard Jean-Baptiste\n" +"Brian Weaver\n" +"Clement Chesnin\n" +"David Geldreich\n" +"Diego Elio Pettenò\n" +"Diego Fernando Nieto\n" +"Georgi Chorbadzhiyski\n" +"Jon Stacey\n" +"Jonathan Rosser\n" +"Joris van Rooij\n" +"Kaloyan Kovachev\n" +"Katsushi Kobayashi\n" +"Kelly Anderson\n" +"Loren Merritt\n" +"Maciej Blizinski\n" +"Mark Bidewell\n" +"Miguel Angel Cabrera Moya\n" +"Niles Bindel\n" +"Samuel Pitoiset\n" +"Scott Caudle\n" +"Sean Robinson\n" +"Sergey Radionov\n" +"Simon Hailes\n" +"Stephen Parry\n" +"Sukrit Sangwan\n" +"Thierry Reding\n" +"Xavier Martin\n" +"Alex Converse\n" +"Alexander Bethke\n" +"Alexandre Ratchov\n" +"Andres Krapf\n" +"Andrey Utkin\n" +"Andri Pálsson\n" +"Andy Chenee\n" +"Anuradha Suraparaju\n" +"Benjamin Poulain\n" +"Brieuc Jeunhomme\n" +"Chris Clayton\n" +"Clément Lecigne\n" +"Cédric Cocquebert\n" +"Daniel Peng\n" +"Danny Wood\n" +"David K\n" +"Edouard Gomez\n" +"Emmanuel de Roux\n" +"Frode Tennebø\n" +"GBX\n" +"Gaurav Narula\n" +"Geraud CONTINSOUZAS\n" +"Hugues Fruchet\n" +"Jan Winter\n" +"Jean-François Massol\n" +"Jean-Philippe Grimaldi\n" +"Josh Watzman\n" +"Kai Lauterbach\n" +"Konstantin Bogdanov\n" +"Kuan-Chung Chiu\n" +"Kuang Rufan\n" +"Matthias Dahl\n" +"Michael McEll\n" +"Michael Ploujnikov\n" +"Mike Schrag\n" +"Nickolai Zeldovich\n" +"Nicolas Bertrand\n" +"Niklas Hayer\n" +"Olafs Vandāns\n" +"Olivier Gambier\n" +"Paul Corke\n" +"Ron Frederick\n" +"Rov Juvano\n" +"Sabourin Gilles\n" +"Sam Lade\n" +"Sandeep Kumar\n" +"Sasha Koruga\n" +"Sreng Jean\n" +"Sven Petai\n" +"Tomas Krotil\n" +"Tomer Barletz\n" +"Tristan Leteurtre\n" +"Wang Bo\n" +"maxime Ripard\n" +"xxcv\n" +"Adam Hoka\n" +"Adrian Knoth\n" +"Adrien Cunin\n" +"Alan Fischer\n" +"Alan McCosh\n" +"Alex Helfet\n" +"Alexander Terentyev\n" +"Alexandre Ferreira\n" +"Alina Friedrichsen\n" +"An L. Ber\n" +"Andreas Schlick\n" +"Andrew Schubert\n" +"Andrey Makhnutin\n" +"Arnaud Vallat\n" +"Asad Mehmood\n" +"Ashok Bhat\n" +"Austin English\n" +"Baptiste Coudurier\n" +"Benoit Calvez\n" +"Björn Stenberg\n" +"Blake Livingston\n" +"Brandon Brooks\n" +"Brian Johnson\n" +"Brian Kurle\n" +"Cezar Elnazli\n" +"Chris White\n" +"Christian Masus\n" +"Christoph Pfister\n" +"Christoph Seibert\n" +"Christopher Key\n" +"Christopher Rath\n" +"Claudio Ortelli\n" +"Cody Russell\n" +"Cristian Morales Vega\n" +"Dan Rosenberg\n" +"Daniel Marth\n" +"Daniel Tisza\n" +"Detlef Schroeder\n" +"Diego Biurrun\n" +"Dominik 'Rathann' Mierzejewski\n" +"Duncan Salerno\n" +"Edward Sheldrake\n" +"Elliot Murphy\n" +"Eren Inan Canpolat\n" +"Ernest E. Teem III\n" +"Etienne Membrives\n" +"Fargier Sylvain\n" +"Fathi Boudra\n" +"Felix Geyer\n" +"Filipe Azevedo\n" +"Finn Hughes\n" +"Florian Hubold\n" +"Florian Roeske\n" +"Frank Enderle\n" +"Frédéric Crozat\n" +"Georg Seifert\n" +"Gertjan Van Droogenbroeck\n" +"Gilles Chanteperdrix\n" +"Greg Farrell\n" +"Gregory Maxwell\n" +"Gwenole Beauchesne\n" +"Götz Waschk\n" +"Hans-Kristian Arntzen\n" +"Harry Sintonen\n" +"Iain Wade\n" +"Ibraheem Paredath\n" +"Isamu Arimoto\n" +"Ismael Luceno\n" +"James Bates\n" +"James Bond\n" +"James Turner\n" +"Janne Grunau\n" +"Janne Kujanpää\n" +"Jarmo Torvinen\n" +"Jason Scheunemann\n" +"Jeff Lu\n" +"Jeroen Ost\n" +"Joe Taber\n" +"Johann Ransay\n" +"Johannes Weißl\n" +"John Hendrikx\n" +"John Stebbins\n" +"Jonas Gehring\n" +"Joseph S. Atkinson\n" +"Juergen Lock\n" +"Julien 'Lta' BALLET\n" +"Julien / Gellule\n" +"Julien Humbert\n" +"Kamil Baldyga\n" +"Kamil Klimek\n" +"Karlheinz Wohlmuth\n" +"Kevin Anthony\n" +"Kevin DuBois\n" +"Lari Natri\n" +"Lorenzo Pistone\n" +"Lucas C. Villa Real\n" +"Lukáš Lalinský\n" +"Mal Graty\n" +"Malte Tancred\n" +"Martin Pöhlmann\n" +"Martin Zeman\n" +"Marton Balint\n" +"Mathew King\n" +"Mathieu Sonet\n" +"Matthew A. Townsend\n" +"Matthias Bauer\n" +"Mika Tiainen\n" +"Mike Cardillo\n" +"Mounir Lamouri (volkmar)\n" +"Natanael Copa\n" +"Nathan Phillip Brink\n" +"Nick Briggs\n" +"Nick Pope\n" +"Nil Geiswiller\n" +"Pascal Thomet\n" +"Pere Orga\n" +"Peter Bak Nielsen\n" +"Phil Roffe and David Grellscheid\n" +"Philip Sequeira\n" +"Pierre Souchay\n" +"Piotr Fusik\n" +"Pádraig Brady\n" +"R.M\n" +"Ralph Giles\n" +"Ramon Gabarró\n" +"Robert Forsman\n" +"Robert Jedrzejczyk\n" +"Robert Paciorek\n" +"Rolf Ahrenberg\n" +"Roman Pen\n" +"Ruud Althuizen\n" +"Samuli Suominen\n" +"Scott Lyons\n" +"Sebastian Birk\n" +"Sergey Puzanov\n" +"Sergio Ammirata\n" +"Sharad Dixit\n" +"Song Ye Wen\n" +"Stephan Krempel\n" +"Steven Kramer\n" +"Steven Sheehy\n" +"Sveinung Kvilhaugsvik\n" +"Sylvain Cadhillac\n" +"Sylver Bruneau\n" +"Takahito HIRANO\n" +"Theron Lewis\n" +"Thijs Alkemade\n" +"Tillmann Karras\n" +"Timo Paulssen\n" +"Timo Rothenpieler\n" +"Tobias Rapp\n" +"Tomasen\n" +"Tony Vankrunkelsven\n" +"Tristan Heaven\n" +"Varphone Wong\n" +"Vasily Fomin\n" +"Vikram Narayanan\n" +"Yannick Bréhon\n" +"Yavor Doganov\n" +"Yohann Martineau\n" +"dharani.prabhu.s\n" +"suheaven\n" +"wucan\n" +"김정은\n" +"Adam Sampson\n" +"Alexander Gall\n" +"Alex Antropoff\n" +"Alexis Guillard\n" +"Alex Izvorski\n" +"Amir Gouini\n" +"Andrea Guzzo\n" +"Andrew Flintham\n" +"Andrew Zaikin\n" +"Andy Lindsay\n" +"Arai/Fujisawa Tooru\n" +"Arkadiusz Miskiewicz\n" +"Arnaud Gomes-do-Vale\n" +"Arwed v. Merkatz\n" +"Barak Ori\n" +"Basil Achermann\n" +"Benjamin Mironer\n" +"Bill\n" +"Bob Maguire\n" +"Brian C. Wiles\n" +"Brian Raymond\n" +"Brian Robb\n" +"Carsten Gottbehüt\n" +"Carsten Haitzler\n" +"Charles Hordis\n" +"Chris Clepper\n" +"Christian Henz\n" +"Christof Baumgaertner\n" +"Christophe Burgalat\n" +"Christopher Johnson\n" +"Cian Duffy\n" +"Colin Simmonds\n" +"Damian Ivereigh\n" +"Daniel Fischer\n" +"Daniel Stränger\n" +"Danko Dolch\n" +"Dennis Lou\n" +"Dermot McGahon\n" +"Douglas West\n" +"Dugal Harris\n" +"Emmanuel Blindauer\n" +"Enrico Gueli\n" +"Enrique Osuna\n" +"Eren Türkay\n" +"Eric Dudiak\n" +"Espen Skoglund\n" +"Ethan C. Baldridge\n" +"François Seingier\n" +"Frans van Veen\n" +"Frédéric Ruget\n" +"Gerald Hansink\n" +"Gisle Vanem\n" +"Glen Gray\n" +"Goetz Waschk\n" +"Gregory Hazel\n" +"Gustaf Neumann\n" +"Hang Su\n" +"Hans Lambermont\n" +"Hans-Peter Jansen\n" +"Harris Dugal\n" +"Heiko Panther\n" +"Igor Helman\n" +"Isaac Osunkunle\n" +"Jan David Mol\n" +"Jan Gerber\n" +"Jan Van Boghout\n" +"Jasper Alias\n" +"Jean-Alexis Montignies\n" +"Jean-Baptiste Le Stang\n" +"Jeffrey Baker\n" +"Jeroen Massar\n" +"Jérôme Guilbaud\n" +"Johannes Buchner\n" +"Johen Michael Zorko\n" +"Johnathan Rosser\n" +"John Dalgliesh\n" +"John Paul Lorenti\n" +"Jörg\n" +"Joseph Tulou\n" +"Julien Blache\n" +"Julien Plissonneau Duquène\n" +"Julien Robert\n" +"Kenneth Ostby\n" +"Kenneth Self\n" +"Kevin H. Patterson\n" +"Koehler, Vitally\n" +"K. Staring\n" +"Lahiru Lakmal Priyadarshana\n" +"Laurent Mutricy\n" +"Leo Spalteholz\n" +"Loox Thefuture\n" +"Marc Nolette\n" +"Marco Munderloh\n" +"Mark Gritter\n" +"Markus Kern\n" +"Markus Kuespert\n" +"Martin Hamrle\n" +"Martin Kahr\n" +"Mateus Krepsky Ludwich\n" +"Mathias Kretschmer\n" +"Mats Rojestal\n" +"Matthias P. Nowak\n" +"Matthieu Lochegnies\n" +"Michael Mondragon\n" +"Michael S. Feurstein\n" +"Michel Lanners\n" +"Mickael Hoerdt\n" +"Miguel Angel Cabrera\n" +"Mikko Hirvonen\n" +"Moritz Bunkus\n" +"Nilmoni Deb\n" +"Olivier Houchard\n" +"Olivier Pomel\n" +"Ondrej Kuda aka Albert\n" +"Øyvind Kolbu\n" +"Pascal Levesque\n" +"Patrick Horn\n" +"Patrick McLean\n" +"Pauline Castets\n" +"Paul Mackerras\n" +"Peter Surda\n" +"Petr Vacek\n" +"Philippe Van Hecke\n" +"Pierre-Luc Beaudoin\n" +"Pierre Marc Dumuid\n" +"Régis Duchesne\n" +"Remco Poortinga\n" +"Rene Gollent\n" +"Rob Casey\n" +"Robson Braga Araujo\n" +"Roine Gustafsson\n" +"Roman Bednarek\n" +"Rudolf Cornelissen\n" +"Sašo Kiselkov\n" +"Sebastian Jenny\n" +"Shane Harper\n" +"Stefán Freyr Stefánsson\n" +"Steve Brown\n" +"Steven M. Schultz\n" +"Tapio Hiltunen\n" +"Thomas L. Wood\n" +"Thomas Mühlgrabner\n" +"Thomas Parmelan\n" +"Tim 'O Callagha\n" +"Tim Schuerewegen\n" +"Tong Ka Man\n" +"Torsten Spindler\n" +"Udo Richter\n" +"Vincent Dimar\n" +"Vincent Penne\n" +"Vitalijus Slavinskas\n" +"Vitaly V. Bursov\n" +"Vladimir Chernyshov\n" +"Wade Majors\n" +"Wallace Wadge\n" +"Watanabe Go\n" +"William Hawkins\n" +"Xavier Maillard\n" +"Ye zhang\n" +"Yuehua Zhao\n" +"Abylay Ospan\n" +"Adam Leggett\n" +"Adrian Haensler\n" +"Ago Allikmaa\n" +"Ajith Manjula Senarathne\n" +"Alain Degreffe\n" +"Alan Pope\n" +"Aleksandr Pasechnik\n" +"Alexandre Fernandez\n" +"Alexandre Pereira Nunes\n" +"Alexandre Perraud\n" +"Alex Peak\n" +"Alex Warhawk\n" +"Alex Woods\n" +"Allan Odgaard\n" +"Ancelot Mark Pinto\n" +"Andrea Giudiceandrea\n" +"Andreas Hartmetz\n" +"Andreas Mieke\n" +"André Silva\n" +"Andrew Clayton\n" +"Andrey Gursky\n" +"Andrii Zui\n" +"Andy Tather\n" +"Antti Ajanki\n" +"Ara Qadir\n" +"Arjun Sreedharan\n" +"Arne de Bruijn\n" +"Arun Pandian G\n" +"A S Alam\n" +"Avani Sharma\n" +"Avishay Spitzer\n" +"Bastien Penavayre\n" +"Benjamin Adolphi\n" +"Ben Littler\n" +"Benoit du Payrat\n" +"Benoît Noël du Payrat\n" +"Bernd Kuhls\n" +"Boris Egorov\n" +"Boy van Amstel\n" +"Brian Schmidt\n" +"Brion Vibber\n" +"Cameron Mozie\n" +"Carlos Fenollosa\n" +"Carola Nitz\n" +"Christian Suloway\n" +"Clemens Werther\n" +"C.W. Betts\n" +"Daniel Amm\n" +"Daniel Verkamp\n" +"Darko Jankovic\n" +"Darrell Walisser\n" +"David Robison\n" +"David R Robison\n" +"Dennis Hamester\n" +"Derek Buitenhuis\n" +"Diogo Silva\n" +"Dominko Azdajic\n" +"Donald Campbell\n" +"Doney den Ouden\n" +"Duncan McNamara\n" +"Duncan McNAMARA\n" +"Elodie Thomann\n" +"Emeric Grange\n" +"Eric Engestrom\n" +"Etienne BRATEAU\n" +"Eugen Geist\n" +"Fabian Yamaguchi\n" +"Fabrizio Ge\n" +"Fabrizio Gennari\n" +"Fahad Al-Saidi\n" +"Felix Abecassis\n" +"Florent Pillet\n" +"Forteve Zepushisti\n" +"Frank Praznik\n" +"Gabriel de Perthuis\n" +"Gal Vinograd\n" +"Gaurav Pruthi\n" +"Geoffrey Métais\n" +"Gian Marco Sibilla\n" +"Gilles Sabourin\n" +"Gina Dobrescu\n" +"Gonzalo Higuera Díaz\n" +"Goran Dokic\n" +"Guillaume Gomez\n" +"Harald Sitter\n" +"Heorhi Valakhanovich\n" +"Ian Chamberlain\n" +"Ibrahima SARR\n" +"Igor Prokopenkov\n" +"Ion Agorria\n" +"Jarrad Whitaker\n" +"Jean-Yves Avenard\n" +"Jed Smith\n" +"Jérémy Carrier\n" +"Jeremy Huddleston Sequoia\n" +"Jerome Forissier\n" +"Jim Bankoski\n" +"Jonas Lundqvist\n" +"Jonatan \"jaw\" Wallmander\n" +"Jonathan Calmels\n" +"Jonathan Heard\n" +"Jonathan McGowan\n" +"Jonathan Thambidurai\n" +"Joni Räsänen\n" +"Josef Andersson\n" +"Joseph DeVore\n" +"Julian Scheel\n" +"Justin Kim\n" +"Kaarlo Räihä\n" +"Kamil Rytarowski\n" +"Kazuki Yamaguchi\n" +"Konstantin K. Beliak\n" +"Konstantinos Tsanaktsidis\n" +"Konstantin Pavlov\n" +"Kornel Lesiński\n" +"Olivier Langlois\n" +"Lochlin Duperron\n" +"Lukas Juhrich\n" +"Lyndon Brown\n" +"Marc Aldorasi\n" +"Marcel Schnirring\n" +"Marc Etcheverry\n" +"Mariusz Wasak\n" +"Mark Becwar\n" +"Martell Malone\n" +"Mathieu Malaterre\n" +"Mathieu Parent\n" +"Mathieu Velten\n" +"Matthias Keiser\n" +"Matthias Treydte\n" +"Max Dilipovich\n" +"Maxim Bublis\n" +"Maxime CHAPELET\n" +"Maxime Mouchet\n" +"Michael Tänzer\n" +"Miha Sokolov\n" +"Mohammed (Shaan) Huzaifa Danish\n" +"Moti Zilberman\n" +"Nathan Egge\n" +"Niklas Haas\n" +"Odd-Arild Kristensen\n" +"O. Hartmann\n" +"Olaf Hering\n" +"Oliver Collyer\n" +"Paul B Mahol\n" +"Paul Clark\n" +"Paulo Vitor Magacho da Silva\n" +"Pavol Babincak\n" +"Paweł Stankowski\n" +"Petter Reinholdtsen\n" +"Philip Höhlein\n" +"Pierre-Hugues Husson\n" +"Pierre Lamot\n" +"Pyry Kontio\n" +"Radek Vybiral\n" +"Rafael Waldo Delgado Doblas\n" +"Rajeesh K V\n" +"Ray Tiley\n" +"Reka Inovan\n" +"Remita Amine\n" +"Ricardo Ribalda Delgado\n" +"Richard Diamond\n" +"Rinat Ibragimov\n" +"Robert Mourning\n" +"Romain Bentz\n" +"Romain Fliedel\n" +"Romain Vimont\n" +"Ronald S. Bultje\n" +"Ross Finlayson\n" +"Sam Malone\n" +"Samuel Martin\n" +"Samuel Thibault\n" +"Sanchit Arora\n" +"Santiago Gimeno\n" +"Sebastian Ramacher\n" +"Sebastian Roth\n" +"Sergey Bolshakov\n" +"Shaleen Jain\n" +"Shlomi Fish\n" +"Simona-Marinela Prodea\n" +"Stanislas Plessia\n" +"Stefan Pöschel\n" +"Steven Toth\n" +"Sushma Reddy\n" +"Takahito Hirano\n" +"T. Chomphuming\n" +"Thierry Foucu\n" +"Thomas Nigro\n" +"Tim Allen\n" +"Tim Walker\n" +"Tobias Conradi\n" +"Tony Gaillard\n" +"Benoît Tuduri\n" +"Tzu-Jung Lee\n" +"Uwe L. Korn\n" +"Valentin Deniaud\n" +"Valentin Vetter\n" +"Valter Correia\n" +"Vianney Boyer\n" +"Victorien Le Couviour--Tuffet\n" +"Vikram Fugro\n" +"Vinson Lee\n" +"Wayne McDougall\n" +"Wieland Hoffmann\n" +"Wills Wang\n" +"Xabier Aramendi\n" +"Yaşar Tay\n" +"Yidong Ren\n" +"Yuudai Yamashigi\n" +"Zhao Zhili\n" +"أحمد المحم ودي (Ahmed El-Mahmoudy)\n" +"Баярсайхан Энхтайван\n" +"Сергей Дарьичев\n" +"\n" +"Artwork\n" +"-------\n" +"Damien Erambert\n" +"Daniel Dreibrodt, aka aLtgLasS\n" +"David Weber\n" +"Davor Orel\n" +"Dominic Spitaler\n" +"Doney den Ouden\n" +"Eurodata Computer Club\n" +"Geoffrey Roussel\n" +"Joeri van Dooren\n" +"kty0ne\n" +"Max Rudberg\n" +"Richard Øiestad\n" +"Simon Damkjær Andersen\n" +"Tom Bigelajzen\n" +"Vincent van den Heuvel\n" +"\n" +"Documentation\n" +"-------------\n" +"Bill Eldridge\n" +"\n" +"Localization\n" +"------------\n" +"Abdul Fousan - Tamil\n" +"A. Decorte - Friulian\n" +"A. Regnander - Swedish\n" +"Adem Gunes - Turkish\n" +"Adi Nugroho - Tagalog\n" +"Adnan Memija - Bosnian\n" +"airplanez - Korean\n" +"Ajith Manjula - Sinhala\n" +"Aled Powell - Welsh\n" +"Alexander Didebulidze - Georgian\n" +"Alexander Henket - Dutch\n" +"Alexander Jansen - Norwegian Bokmål\n" +"Alexander Lakhin - Russian\n" +"Alexey Lugin - Ukrainian\n" +"Alexey Salmin - Russian\n" +"Alfred John - Acoli\n" +"Amanpreet Singh Alam - Punjabi\n" +"André de Barros Martins Ribeiro - Brazilian portuguese\n" +"Andrey Brilevskiy - Russian\n" +"Andrey Wolk - Russian\n" +"Andri Pálsson - Icelandic\n" +"Andriy Bandura - Ukrainian\n" +"Anh Phan - Vietnamese\n" +"Aniket Eknath Kudale - Marathi\n" +"Animesh Swar - Nepalese\n" +"Aputsiaĸ Niels Janussen - Danish\n" +"Ara Bextiyar - Sorani (Kurdish)\n" +"Ari Constâncio - Portuguese\n" +"Arkadiusz Lipiec - Polish\n" +"Ask Hjorth Larsen - Danish\n" +"Audrey Prevost - French\n" +"Auk Piseth - Khmer\n" +"Bayarsaikhan Enkhtaivan Баярсайхан Энхтайван - Mongolian\n" +"Biraj Karmakar - Bengali (India)\n" +"Bruno Queirós - Portuguese\n" +"Bruno Vella - Italian\n" +"Caner Başaran - Turkish\n" +"Carlo Calabrò - Italian\n" +"Chandan Kumar - Hindi\n" +"Chesús Daniel Trigo - Aragonese\n" +"Christoph Miebach - German\n" +"Chynggyz Jumaliev - Kirgyz\n" +"Circo Radu - Romanian\n" +"Cristian Secară - Romanian\n" +"Daniel Nylander - Swedish\n" +"Daniel Winzen - German\n" +"David González - Spanish\n" +"David Planella - Catalan\n" +"Dean Lee - Simplified Chinese\n" +"Denis Arnaud - Breton\n" +"Derk-Jan Hartman - Dutch\n" +"DirektX - Hungarian\n" +"Dominko Aždajić - Croatian\n" +"Dylan Aïssi - French\n" +"Đorđe Vasiljević - Serbian\n" +"Eduard Babayan - Armenian\n" +"Eero - Estonian\n" +"Eirik U. Birkeland - Norwegian Nynorsk\n" +"Elizabeth Da Conceicao Baptista - Tetum\n" +"Emilio Sepúlveda - Interlingua\n" +"Emin Mastizada - Azerbaijani\n" +"Éric Lassauge - French\n" +"Farzaneh Sarafraz - Persian\n" +"Florence Tushabe - Chiga\n" +"Fouzia Bourai - Arabic\n" +"Frank Chao - Traditional Chinese\n" +"Freyr Gunnar Ólafsson - Icelandic\n" +"Friedel Wolff - Afrikaans\n" +"Fumio Nakayama - Japanese\n" +"Gabor Kelemen - Hungarian\n" +"Gaurav Kumar - Hindi\n" +"Gaëtan Rousseaux - Walloon\n" +"Ghjuvan Pasquinu - Corsican\n" +"Goce Manevski - Macedonian\n" +"Golam Maruf Oovee - Bengali\n" +"Gonçalo Cordeiro - Galician\n" +"Gorana Milicevic - Serbian\n" +"Goswami Hardikpuri Kishorpuri - Gujarati\n" +"Haakon Meland Eriksen - Norwegian\n" +"Han HoJoong - Korean\n" +"Hardik Kishorpuri Goswami - Gujarati\n" +"Hemanta Nandi - Bengali (India)\n" +"Huw Waters - Welsh\n" +"H.Shalitha Vikum - Sinhala\n" +"Ibrahima Sarr - Fulah\n" +"Ingmārs Dīriņš - Latvian\n" +"Israt Jahan - Bengali\n" +"Ivar Smolin - Estonian\n" +"Iván Seoane Pardo - Galician\n" +"Ivo Ivanov - Bulgarian\n" +"Iñaki Larrañaga Murgoitio - Basque\n" +"Iñigo Varela - Asturian; Bable\n" +"Jakub Žáček - Czech\n" +"James Olweny - Ganda\n" +"Jamil Ahmed - Bengali\n" +"Javier Varela - Spanish\n" +"Jean-Pierre Kuypers - French\n" +"Jens Seidel - German\n" +"Joao Almeida - Portuguese\n" +"Joel Arvidsson - Swedish\n" +"jogijs - Latvian\n" +"Jonas Larsen - Danish\n" +"Jon Stødle - Norwegian Nynorsk\n" +"Jouni Kähkönen - Finnish\n" +"Juha Jeronen - Finnish\n" +"Julen Ruiz Aizpuru - Basque\n" +"Kai Hermann - German\n" +"Kamil Páral - Czech\n" +"Kang Jeong-Hee - Korean\n" +"Kasper Tvede - Danish\n" +"Kaya Zeren - Turkish\n" +"Kenneth Nielsen - Danish\n" +"Khin Mi Mi Aung - Burmese\n" +"Khoem Sokhem - Khmer\n" +"Kola - Albanian\n" +"Kypchak Kypchak - Kazakh\n" +"Laurent Jonqueres - Occitan\n" +"Loba Yeasmeen - Bengali\n" +"Lorena Gomes - Catalan\n" +"Lorenzo Porta - Italian\n" +"Luqman Hakim - Indonesian\n" +"L. Balasubramaniam - Hindi\n" +"Mahrazi Mohd Kamal - Malay\n" +"Manolis Stefanis - Modern Greek\n" +"Manuela Silva/Alfredo Silva - Portuguese\n" +"Marián Hikaník - Slovak\n" +"Mario Siegmann - German\n" +"Marko Uskokovic - Serbian\n" +"Martin Srebotnjak - Slovenian\n" +"Martin Zicha - Czech\n" +"Matej Urbančič - Slovenian\n" +"Mathias C. Berens, welcome-soft - German\n" +"Mattias Põldaru - Estonian\n" +"Md. Rezwan Shahid - Bengali\n" +"Meelad Zakaria - Persian\n" +"Michael Bauer - Scottish Gaelic\n" +"Michal Halenka - Czech\n" +"Michał Trzebiatowski - Polish\n" +"Miguel Sousa - Portuguese\n" +"Mihkel Kirjutas - Estonian\n" +"Mindaugas Baranauskas - Lithuanian\n" +"Miroslav Oujeský - Czech\n" +"Morten Brix Pedersen - Danish\n" +"Mustafa Sandal - Czech\n" +"Myckel Habets - Dutch\n" +"Namhyung Kim - Korean\n" +"Niels Fanøe - Danish\n" +"Niklas 'Nille' Åkerström - Swedish\n" +"Olav Dahlum - Norwegian Bokmål\n" +"Oleksandr Natalenko - Ukrainian\n" +"Omer Ensari - Kurmanji (Kurdish)\n" +"Osama Khalid - Arabic\n" +"Otto Kekäläinen - Finnish\n" +"Paras Nath Chaudhary - Nepali\n" +"Pasindu Kavinda - Sinhala\n" +"Pau Iranzo - Catalan\n" +"Paula Iglesias - Galician\n" +"Pedro Valadares - Portuguese\n" +"Peter Jespersen - Danish\n" +"Petr Šimáček - Czech\n" +"Phan Anh - Vietnamese\n" +"Philipp Weissenbacher - German\n" +"Pittayakom Saingtong - Thai\n" +"Prasannajit Acharya - Oriya\n" +"Praveen Illa - Telugu\n" +"Predrag Ljubenović - Serbian\n" +"Pyae Sone - Burmese\n" +"Rajnikant Kumbhar - Marathi\n" +"Ricardo Perdigão - Portuguese\n" +"Ricardo Pérez López - Spanish\n" +"Roustam Ghizdatov - Russian\n" +"Ruei-Yuan Lu - Traditional Chinese\n" +"Saad Liaquat Kiani - Urdu\n" +"Sadia Afroz - Bengali\n" +"Said Marjan Zazai - Pashto\n" +"Salar Khalilzadeh - Persian\n" +"Sam Askari - Spanish\n" +"Sam Hocevar - British\n" +"Samuel Hocevar - French\n" +"Saúl Ortega - Spanish\n" +"Savvas Nesseris - Modern Greek\n" +"Sayan Chowdhury - Hindi\n" +"Seanán Ó Coistín - Irish\n" +"Semsudin Abdic - Bosnian\n" +"Shambhu Kumar - Hindi\n" +"Shantanu Sarkar - Hindi\n" +"Shashi Ranjan - Hindi\n" +"Siarhei Daryichau Дар'ічаў Сяргей - Belarusian\n" +"Sidney Doria - Brazilian Portuguese\n" +"Sigmund Augdal - Norwegian Bokmål\n" +"Simos Xenitellis - Modern Greek\n" +"Sipho Sibiya - Zulu\n" +"Sok Sophea - Khmer\n" +"Solomon Gizaw - Amharic\n" +"Sreejith P - Malayalam\n" +"Suraj Kawade - Marathi\n" +"Stian Jørgensrud - Norwegian Bokmål\n" +"Sveinn í Felli - Icelandic\n" +"Tadashi Jokagi - Japanese\n" +"Tarsem Singh - Hindi\n" +"Thanakrit Chomphuming - Thai\n" +"Tero Pelander - Finnish\n" +"Thomas De Rocker - Dutch\n" +"Thomas Graf - gettext support, German\n" +"Tomáš Chvátal - Czech\n" +"Tòni Galhard - Occitan\n" +"Umesh Agarwal - Bengali (India)\n" +"Umidjon Almasov - Uzbek\n" +"Václav Pavlíček - Czech\n" +"Valek Filippov - Russian\n" +"Vicente Jimenez Aguilar - Spanish\n" +"Vincenzo Reale - Italian\n" +"Vít Pelčák - Czech\n" +"viyyer - Hindi\n" +"Vladimir Yermolayev - Russian\n" +"Vojtěch Smejkal - Czech\n" +"Wei Mingzhi - Simplified Chinese\n" +"Xènia Albà Cantero - Catalan\n" +"Xuacu Saturio - Asturian\n" +"Yaron Shahrabani - Hebrew\n" +"Yaşar Tay - Turkish\n" +"Yhal Htet Aung - Burmese\n" +"Yogesh K S - Kannada\n" +"Yoyo - Simplified Chinese\n" +"Yuksel Yildirim - Turkish\n" +"Zabeeh Khan - Pashto\n" +"Zhang Tong - Chinese\n" +; diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_access.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_access.h new file mode 100644 index 0000000..4356be6 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_access.h @@ -0,0 +1,81 @@ +/***************************************************************************** + * vlc_access.h: Access descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: da06554814885d03823aefbf58e858f6941b3400 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ACCESS_H +#define VLC_ACCESS_H 1 + +#include + +/** + * \defgroup access Access + * \ingroup stream + * Raw input byte streams + * @{ + * \file + * Input byte stream modules interface + */ + +/** + * Special redirection error code. + * + * In case of redirection, the access open function should clean up (as in + * normal failure case), store the heap-allocated redirection URL in + * stream_t.psz_url, and return this value. + */ +#define VLC_ACCESS_REDIRECT VLC_ETIMEOUT + +/** + * Opens a new read-only byte stream. + * + * This function might block. + * The initial offset is of course always zero. + * + * \param obj parent VLC object + * \param mrl media resource location to read + * \return a new access object on success, NULL on failure + */ +VLC_API stream_t *vlc_access_NewMRL(vlc_object_t *obj, const char *mrl); + +/** + * \defgroup access_helper Access Helpers + * @{ + */ + +/** + * Default pf_control callback for directory accesses. + */ +VLC_API int access_vaDirectoryControlHelper( stream_t *p_access, int i_query, va_list args ); + +#define ACCESS_SET_CALLBACKS( read, block, control, seek ) \ + do { \ + p_access->pf_read = (read); \ + p_access->pf_block = (block); \ + p_access->pf_control = (control); \ + p_access->pf_seek = (seek); \ + } while(0) + +/** + * @} @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_actions.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_actions.h new file mode 100644 index 0000000..5d78f5e --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_actions.h @@ -0,0 +1,275 @@ +/***************************************************************************** + * vlc_actions.h: handle vlc actions + ***************************************************************************** + * Copyright (C) 2003-2016 VLC authors and VideoLAN + * $Id: 404c1662a82ef3f3ffc983a81fa73b90f5773eef $ + * + * Authors: Sigmund Augdal Helberg + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ACTIONS_H +#define VLC_ACTIONS_H 1 + +/* Called from src/libvlc.c */ +int +libvlc_InternalActionsInit(libvlc_int_t *p_libvlc); + +/* Called from src/libvlc.c */ +void +libvlc_InternalActionsClean(libvlc_int_t *p_libvlc); + +/** + * \file + * This file defines keys and functions + */ + +#define KEY_MODIFIER 0xFF000000 +#define KEY_MODIFIER_ALT 0x01000000 +#define KEY_MODIFIER_SHIFT 0x02000000 +#define KEY_MODIFIER_CTRL 0x04000000 +#define KEY_MODIFIER_META 0x08000000 +#define KEY_MODIFIER_COMMAND 0x10000000 + +#define KEY_UNSET 0x00000000 +#define KEY_BACKSPACE 0x08 +#define KEY_TAB 0x09 +#define KEY_ENTER 0x0D +#define KEY_ESC 0x1B +/* End of Unicode range: 0x0010FFFF */ +#define KEY_LEFT 0x00210000 +#define KEY_RIGHT 0x00220000 +#define KEY_UP 0x00230000 +#define KEY_DOWN 0x00240000 +#define KEY_F1 0x00270000 +#define KEY_F2 0x00280000 +#define KEY_F3 0x00290000 +#define KEY_F4 0x002A0000 +#define KEY_F5 0x002B0000 +#define KEY_F6 0x002C0000 +#define KEY_F7 0x002D0000 +#define KEY_F8 0x002E0000 +#define KEY_F9 0x002F0000 +#define KEY_F10 0x00300000 +#define KEY_F11 0x00310000 +#define KEY_F12 0x00320000 +#define KEY_HOME 0x00330000 +#define KEY_END 0x00340000 +#define KEY_INSERT 0x00350000 +#define KEY_DELETE 0x00360000 +#define KEY_MENU 0x00370000 +#define KEY_PAGEUP 0x00390000 +#define KEY_PAGEDOWN 0x003A0000 +#define KEY_PRINT 0x003B0000 +#define KEY_PAUSE 0x003D0000 + +#define KEY_BROWSER_BACK 0x003F0000 +#define KEY_BROWSER_FORWARD 0x00400000 +#define KEY_BROWSER_REFRESH 0x00410000 +#define KEY_BROWSER_STOP 0x00420000 +#define KEY_BROWSER_SEARCH 0x00430000 +#define KEY_BROWSER_FAVORITES 0x00440000 +#define KEY_BROWSER_HOME 0x00450000 +#define KEY_VOLUME_MUTE 0x00460000 +#define KEY_VOLUME_DOWN 0x00470000 +#define KEY_VOLUME_UP 0x00480000 +#define KEY_MEDIA_NEXT_TRACK 0x00490000 +#define KEY_MEDIA_PREV_TRACK 0x004A0000 +#define KEY_MEDIA_STOP 0x004B0000 +#define KEY_MEDIA_PLAY_PAUSE 0x004C0000 +#define KEY_MEDIA_RECORD 0x004D0000 +#define KEY_MEDIA_REWIND 0x004E0000 +#define KEY_MEDIA_FORWARD 0x004F0000 +#define KEY_MEDIA_REPEAT 0x00500000 +#define KEY_MEDIA_SHUFFLE 0x00510000 +#define KEY_MEDIA_SUBTITLE 0x00520000 +#define KEY_MEDIA_AUDIO 0x00530000 +#define KEY_MEDIA_ANGLE 0x00540000 +#define KEY_MEDIA_TIME 0x00550000 +#define KEY_MEDIA_FRAME_PREV 0x00560000 +#define KEY_MEDIA_FRAME_NEXT 0x00570000 +#define KEY_MEDIA_SELECT 0x00580000 +#define KEY_MEDIA_VIEW 0x00590000 +#define KEY_MEDIA_MENU 0x005A0000 +#define KEY_ZOOM_IN 0x00600000 +#define KEY_ZOOM_OUT 0x00610000 +#define KEY_BRIGHTNESS_UP 0x00620000 +#define KEY_BRIGHTNESS_DOWN 0x00630000 + +#define KEY_MOUSEWHEELUP 0x00F00000 +#define KEY_MOUSEWHEELDOWN 0x00F10000 +#define KEY_MOUSEWHEELLEFT 0x00F20000 +#define KEY_MOUSEWHEELRIGHT 0x00F30000 + +VLC_API char *vlc_keycode2str(uint_fast32_t i_key, bool locale) VLC_USED; +VLC_API uint_fast32_t vlc_str2keycode(const char *str) VLC_USED; + +typedef enum vlc_action_id { + ACTIONID_NONE = 0, + ACTIONID_QUIT, + ACTIONID_PLAY_PAUSE, + ACTIONID_PLAY, + ACTIONID_PAUSE, + ACTIONID_STOP, + ACTIONID_PREV, + ACTIONID_NEXT, + ACTIONID_SLOWER, + ACTIONID_FASTER, + ACTIONID_TOGGLE_FULLSCREEN, + ACTIONID_VOL_UP, + ACTIONID_VOL_DOWN, + ACTIONID_NAV_ACTIVATE, + ACTIONID_NAV_UP, + ACTIONID_NAV_DOWN, + ACTIONID_NAV_LEFT, + ACTIONID_NAV_RIGHT, + ACTIONID_JUMP_BACKWARD_EXTRASHORT, + ACTIONID_JUMP_FORWARD_EXTRASHORT, + ACTIONID_JUMP_BACKWARD_SHORT, + ACTIONID_JUMP_FORWARD_SHORT, + ACTIONID_JUMP_BACKWARD_MEDIUM, + ACTIONID_JUMP_FORWARD_MEDIUM, + ACTIONID_JUMP_BACKWARD_LONG, + ACTIONID_JUMP_FORWARD_LONG, + ACTIONID_FRAME_NEXT, + ACTIONID_POSITION, + ACTIONID_VOL_MUTE, +/* let ACTIONID_SET_BOOMARK* and ACTIONID_PLAY_BOOKMARK* be contiguous */ + ACTIONID_SET_BOOKMARK1, + ACTIONID_SET_BOOKMARK2, + ACTIONID_SET_BOOKMARK3, + ACTIONID_SET_BOOKMARK4, + ACTIONID_SET_BOOKMARK5, + ACTIONID_SET_BOOKMARK6, + ACTIONID_SET_BOOKMARK7, + ACTIONID_SET_BOOKMARK8, + ACTIONID_SET_BOOKMARK9, + ACTIONID_SET_BOOKMARK10, + ACTIONID_PLAY_BOOKMARK1, + ACTIONID_PLAY_BOOKMARK2, + ACTIONID_PLAY_BOOKMARK3, + ACTIONID_PLAY_BOOKMARK4, + ACTIONID_PLAY_BOOKMARK5, + ACTIONID_PLAY_BOOKMARK6, + ACTIONID_PLAY_BOOKMARK7, + ACTIONID_PLAY_BOOKMARK8, + ACTIONID_PLAY_BOOKMARK9, + ACTIONID_PLAY_BOOKMARK10, + /* end of contiguous zone */ + ACTIONID_PLAY_CLEAR, + ACTIONID_SUBDELAY_UP, + ACTIONID_SUBDELAY_DOWN, + ACTIONID_SUBSYNC_MARKAUDIO, + ACTIONID_SUBSYNC_MARKSUB, + ACTIONID_SUBSYNC_APPLY, + ACTIONID_SUBSYNC_RESET, + ACTIONID_SUBPOS_UP, + ACTIONID_SUBPOS_DOWN, + ACTIONID_AUDIO_TRACK, + ACTIONID_SUBTITLE_REVERSE_TRACK, + ACTIONID_SUBTITLE_TRACK, + ACTIONID_SUBTITLE_TOGGLE, + ACTIONID_SUBTITLE_TEXT_SCALE_NORMAL, + ACTIONID_SUBTITLE_TEXT_SCALE_UP, + ACTIONID_SUBTITLE_TEXT_SCALE_DOWN, + ACTIONID_INTF_TOGGLE_FSC, + ACTIONID_INTF_HIDE, + ACTIONID_INTF_BOSS, + /* chapter and title navigation */ + ACTIONID_TITLE_PREV, + ACTIONID_TITLE_NEXT, + ACTIONID_CHAPTER_PREV, + ACTIONID_CHAPTER_NEXT, + /* end of chapter and title navigation */ + ACTIONID_AUDIODELAY_UP, + ACTIONID_AUDIODELAY_DOWN, + ACTIONID_SNAPSHOT, + ACTIONID_RECORD, + ACTIONID_DISC_MENU, + ACTIONID_ASPECT_RATIO, + ACTIONID_CROP, + ACTIONID_DEINTERLACE, + ACTIONID_DEINTERLACE_MODE, + ACTIONID_ZOOM, + ACTIONID_UNZOOM, + ACTIONID_CROP_TOP, + ACTIONID_UNCROP_TOP, + ACTIONID_CROP_LEFT, + ACTIONID_UNCROP_LEFT, + ACTIONID_CROP_BOTTOM, + ACTIONID_UNCROP_BOTTOM, + ACTIONID_CROP_RIGHT, + ACTIONID_UNCROP_RIGHT, + ACTIONID_RANDOM, + ACTIONID_LOOP, + ACTIONID_WALLPAPER, + ACTIONID_LEAVE_FULLSCREEN, + /* Zoom */ + ACTIONID_ZOOM_QUARTER, + ACTIONID_ZOOM_HALF, + ACTIONID_ZOOM_ORIGINAL, + ACTIONID_ZOOM_DOUBLE, + /* Cycle Through Audio Devices */ + ACTIONID_AUDIODEVICE_CYCLE, + /* scaling */ + ACTIONID_TOGGLE_AUTOSCALE, + ACTIONID_SCALE_UP, + ACTIONID_SCALE_DOWN, + /* */ + ACTIONID_RATE_NORMAL, + ACTIONID_RATE_SLOWER_FINE, + ACTIONID_RATE_FASTER_FINE, + /* Cycle Through Program Service IDs */ + ACTIONID_PROGRAM_SID_NEXT, + ACTIONID_PROGRAM_SID_PREV, + ACTIONID_INTF_POPUP_MENU, + /* Viewpoint */ + ACTIONID_VIEWPOINT_FOV_IN, + ACTIONID_VIEWPOINT_FOV_OUT, + ACTIONID_VIEWPOINT_ROLL_CLOCK, + ACTIONID_VIEWPOINT_ROLL_ANTICLOCK, + /* Combo Actions */ + ACTIONID_COMBO_VOL_FOV_UP, + ACTIONID_COMBO_VOL_FOV_DOWN, + +} vlc_action_id_t; + +/** + * Get the action ID from an action key name + * \return the action ID or ACTIONID_NONE on error. + */ +VLC_API vlc_action_id_t +vlc_actions_get_id(const char *psz_key_name); + +/** + * Get keycodes from a action key name and vlc configuration + * \return The number of keycodes for this action, or 0 in case of an error. + * The list needs to be released with free() + */ +VLC_API size_t +vlc_actions_get_keycodes(vlc_object_t *p_obj, const char *psz_key_name, + bool b_global, uint_fast32_t **pp_keycodes ); +#define vlc_actions_get_keycodes(a, b, c, d) vlc_actions_get_keycodes(VLC_OBJECT(a), b, c, d) + +/** + * Get a list a key names + * \return A NULL terminated list of const char * + */ +VLC_API const char* const* +vlc_actions_get_key_names(vlc_object_t *p_obj); +#define vlc_actions_get_key_names(x) vlc_actions_get_key_names(VLC_OBJECT(x)) + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_addons.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_addons.h new file mode 100644 index 0000000..23cb134 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_addons.h @@ -0,0 +1,227 @@ +/***************************************************************************** + * vlc_addons.h : addons handling and describing + ***************************************************************************** + * Copyright (C) 2013 VideoLAN and authors + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ADDONS_H +#define VLC_ADDONS_H 1 + +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef enum addon_type_t +{ + ADDON_UNKNOWN = 0, + ADDON_EXTENSION, + ADDON_PLAYLIST_PARSER, + ADDON_SERVICE_DISCOVERY, + ADDON_SKIN2, + ADDON_PLUGIN, + ADDON_INTERFACE, + ADDON_META, + ADDON_OTHER +} addon_type_t; + +typedef enum addon_state_t +{ + ADDON_NOTINSTALLED = 0, + ADDON_INSTALLING, + ADDON_INSTALLED, + ADDON_UNINSTALLING +} addon_state_t; + +typedef enum addon_flags_t +{ + ADDON_BROKEN = 1, /* Have install inconsistency */ + ADDON_MANAGEABLE = 1 << 1, /* Have manifest, can install or uninstall files */ + ADDON_UPDATABLE = 1 << 2, +} addon_flags_t; + +#define ADDON_MAX_SCORE (5 * 100) +#define ADDON_UUID_SIZE 16 +#define ADDON_UUID_PSZ_SIZE (ADDON_UUID_SIZE * 2 + 4) +typedef uint8_t addon_uuid_t[ADDON_UUID_SIZE]; + +typedef struct addon_file_t +{ + addon_type_t e_filetype; + char *psz_download_uri; + char *psz_filename; +} addon_file_t; + +struct addon_entry_t +{ + vlc_mutex_t lock; + + addon_type_t e_type; + addon_state_t e_state; + addon_flags_t e_flags; + + /* data describing addon */ + addon_uuid_t uuid; + char *psz_name; + char *psz_summary; + char *psz_description; + char *psz_author; + char *psz_source_uri; /* webpage, ... */ + char *psz_image_uri; + char *psz_image_data; /* base64, png */ + char *psz_version; + + /* stats */ + long int i_downloads; + int i_score; /* score 0..5 in hundredth */ + + /* Lister */ + char *psz_source_module; + + /* files list */ + char *psz_archive_uri; /* Archive */ + DECL_ARRAY(addon_file_t *) files; + + /* custom data storage (if needed by module/source) */ + void * p_custom; +}; + +typedef struct addons_finder_t addons_finder_t; +typedef struct addons_finder_sys_t addons_finder_sys_t; +struct addons_finder_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_find )( addons_finder_t * ); + int ( * pf_retrieve )( addons_finder_t *, addon_entry_t * ); + DECL_ARRAY( addon_entry_t * ) entries; + char *psz_uri; + + addons_finder_sys_t *p_sys; +}; + +typedef struct addons_storage_t addons_storage_t; +typedef struct addons_storage_sys_t addons_storage_sys_t; +struct addons_storage_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_install )( addons_storage_t *, addon_entry_t * ); + int ( * pf_remove )( addons_storage_t *, addon_entry_t * ); + int ( * pf_catalog ) ( addons_storage_t *, addon_entry_t **, int ); + + addons_storage_sys_t *p_sys; +}; + +typedef struct addons_manager_t addons_manager_t; + +struct addons_manager_owner +{ + void *sys; + void (*addon_found)(struct addons_manager_t *, struct addon_entry_t *); + void (*discovery_ended)(struct addons_manager_t *); + void (*addon_changed)(struct addons_manager_t *, struct addon_entry_t *); +}; + +typedef struct addons_manager_private_t addons_manager_private_t; +struct addons_manager_t +{ + struct addons_manager_owner owner; + addons_manager_private_t *p_priv; +}; + +/** + * addon entry lifecycle + */ +VLC_API addon_entry_t *addon_entry_New( void ); +VLC_API addon_entry_t *addon_entry_Hold(addon_entry_t *); +VLC_API void addon_entry_Release(addon_entry_t *); + +/** + * addons manager lifecycle + */ +VLC_API addons_manager_t *addons_manager_New( vlc_object_t *, + const struct addons_manager_owner * ); +VLC_API void addons_manager_Delete( addons_manager_t * ); + +/** + * Charge currently installed, usable and manageable addons + * (default "addons storage" module) + */ +VLC_API int addons_manager_LoadCatalog( addons_manager_t * ); + +/** + * Gather addons info from repository (default "addons finder" module) + * If psz_uri is not NULL, only gather info from the pointed package. + */ +VLC_API void addons_manager_Gather( addons_manager_t *, const char *psz_uri ); + +/** + * Install or Remove the addon identified by its uuid + */ +VLC_API int addons_manager_Install( addons_manager_t *p_manager, const addon_uuid_t uuid ); +VLC_API int addons_manager_Remove( addons_manager_t *p_manager, const addon_uuid_t uuid ); + +/** + * String uuid to binary uuid helpers + */ +static inline bool addons_uuid_read( const char *psz_uuid, addon_uuid_t *p_uuid ) +{ + if ( !psz_uuid ) return false; + if ( strlen( psz_uuid ) < ADDON_UUID_PSZ_SIZE ) return false; + + int i = 0, j = 0; + while ( i + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_H +#define VLC_AOUT_H 1 + +#include + +/** + * \defgroup audio_output Audio output + * \ingroup output + * @{ + * \file + * Audio output modules interface + */ + +/* Buffers which arrive in advance of more than AOUT_MAX_ADVANCE_TIME + * will be considered as bogus and be trashed */ +#define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + CLOCK_FREQ) + +/* Buffers which arrive in advance of more than AOUT_MAX_PREPARE_TIME + * will cause the calling thread to sleep */ +#define AOUT_MAX_PREPARE_TIME (2 * CLOCK_FREQ) + +/* Buffers which arrive after pts - AOUT_MIN_PREPARE_TIME will be trashed + * to avoid too heavy resampling */ +#define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE + +/* Tolerance values from EBU Recommendation 37 */ +/** Maximum advance of actual audio playback time to coded PTS, + * above which downsampling will be performed */ +#define AOUT_MAX_PTS_ADVANCE (CLOCK_FREQ / 25) + +/** Maximum delay of actual audio playback time from coded PTS, + * above which upsampling will be performed */ +#define AOUT_MAX_PTS_DELAY (3 * CLOCK_FREQ / 50) + +/* Max acceptable resampling (in %) */ +#define AOUT_MAX_RESAMPLING 10 + +#include "vlc_es.h" + +#define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \ + ((p_first)->i_format == (p_second)->i_format) \ + && AOUT_FMTS_SIMILAR(p_first, p_second) ) + +/* Check if i_rate == i_rate and i_channels == i_channels */ +#define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \ + ((p_first)->i_rate == (p_second)->i_rate) \ + && ((p_first)->channel_type == (p_second)->channel_type) \ + && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\ + && ((p_first)->i_chan_mode == (p_second)->i_chan_mode) ) + +#define AOUT_FMT_LINEAR( p_format ) \ + (aout_BitsPerSample((p_format)->i_format) != 0) + +#define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i') +#define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b') + +#define AOUT_FMT_SPDIF( p_format ) \ + ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \ + || ((p_format)->i_format == VLC_CODEC_SPDIFB) \ + || ((p_format)->i_format == VLC_CODEC_A52) \ + || ((p_format)->i_format == VLC_CODEC_DTS) ) + +#define AOUT_FMT_HDMI( p_format ) \ + ( (p_format)->i_format == VLC_CODEC_EAC3 \ + ||(p_format)->i_format == VLC_CODEC_TRUEHD \ + ||(p_format)->i_format == VLC_CODEC_MLP \ + ) + +/* Values used for the audio-channels object variable */ +#define AOUT_VAR_CHAN_UNSET 0 /* must be zero */ +#define AOUT_VAR_CHAN_STEREO 1 +#define AOUT_VAR_CHAN_RSTEREO 2 +#define AOUT_VAR_CHAN_LEFT 3 +#define AOUT_VAR_CHAN_RIGHT 4 +#define AOUT_VAR_CHAN_DOLBYS 5 +#define AOUT_VAR_CHAN_HEADPHONES 6 +#define AOUT_VAR_CHAN_MONO 7 + +/***************************************************************************** + * Main audio output structures + *****************************************************************************/ + +/* Size of a frame for S/PDIF output. */ +#define AOUT_SPDIF_SIZE 6144 + +/* Number of samples in an A/52 frame. */ +#define A52_FRAME_NB 1536 + +/* FIXME to remove once aout.h is cleaned a bit more */ +#include + +/** Audio output object */ +struct audio_output +{ + VLC_COMMON_MEMBERS + + struct aout_sys_t *sys; /**< Private data for callbacks */ + + int (*start)(audio_output_t *, audio_sample_format_t *fmt); + /**< Starts a new stream (mandatory, cannot be NULL). + * \param fmt input stream sample format upon entry, + * output stream sample format upon return [IN/OUT] + * \return VLC_SUCCESS on success, non-zero on failure + * \note No other stream may be already started when called. + */ + void (*stop)(audio_output_t *); + /**< Stops the existing stream (optional, may be NULL). + * \note A stream must have been started when called. + */ + int (*time_get)(audio_output_t *, mtime_t *delay); + /**< Estimates playback buffer latency (optional, may be NULL). + * \param delay pointer to the delay until the next sample to be written + * to the playback buffer is rendered [OUT] + * \return 0 on success, non-zero on failure or lack of data + * \note A stream must have been started when called. + */ + void (*play)(audio_output_t *, block_t *); + /**< Queues a block of samples for playback (mandatory, cannot be NULL). + * \note A stream must have been started when called. + */ + void (*pause)( audio_output_t *, bool pause, mtime_t date); + /**< Pauses or resumes playback (optional, may be NULL). + * \param pause pause if true, resume from pause if false + * \param date timestamp when the pause or resume was requested + * \note A stream must have been started when called. + */ + void (*flush)( audio_output_t *, bool wait); + /**< Flushes or drains the playback buffers (mandatory, cannot be NULL). + * \param wait true to wait for playback of pending buffers (drain), + * false to discard pending buffers (flush) + * \note A stream must have been started when called. + */ + int (*volume_set)(audio_output_t *, float volume); + /**< Changes playback volume (optional, may be NULL). + * \param volume requested volume (0. = mute, 1. = nominal) + * \note The volume is always a positive number. + * \warning A stream may or may not have been started when called. + */ + int (*mute_set)(audio_output_t *, bool mute); + /**< Changes muting (optinal, may be NULL). + * \param mute true to mute, false to unmute + * \warning A stream may or may not have been started when called. + */ + int (*device_select)(audio_output_t *, const char *id); + /**< Selects an audio output device (optional, may be NULL). + * \param id nul-terminated device unique identifier. + * \return 0 on success, non-zero on failure. + * \warning A stream may or may not have been started when called. + */ + + struct { + bool headphones; /**< Default to false, set it to true if the current + sink is using headphones */ + } current_sink_info; + /**< Current sink informations set by the module from the start() function */ + + struct { + void (*volume_report)(audio_output_t *, float); + void (*mute_report)(audio_output_t *, bool); + void (*policy_report)(audio_output_t *, bool); + void (*device_report)(audio_output_t *, const char *); + void (*hotplug_report)(audio_output_t *, const char *, const char *); + int (*gain_request)(audio_output_t *, float); + void (*restart_request)(audio_output_t *, unsigned); + } event; +}; + +typedef enum +{ + AOUT_CHANIDX_DISABLE = -1, + AOUT_CHANIDX_LEFT, + AOUT_CHANIDX_RIGHT, + AOUT_CHANIDX_MIDDLELEFT, + AOUT_CHANIDX_MIDDLERIGHT, + AOUT_CHANIDX_REARLEFT, + AOUT_CHANIDX_REARRIGHT, + AOUT_CHANIDX_REARCENTER, + AOUT_CHANIDX_CENTER, + AOUT_CHANIDX_LFE, + AOUT_CHANIDX_MAX +} vlc_chan_order_idx_t; + +static_assert(AOUT_CHANIDX_MAX == AOUT_CHAN_MAX, "channel count mismatch"); + +#define AOUT_CHAN_REMAP_INIT { \ + AOUT_CHANIDX_LEFT, \ + AOUT_CHANIDX_RIGHT, \ + AOUT_CHANIDX_MIDDLELEFT, \ + AOUT_CHANIDX_MIDDLERIGHT, \ + AOUT_CHANIDX_REARLEFT, \ + AOUT_CHANIDX_REARRIGHT, \ + AOUT_CHANIDX_REARCENTER, \ + AOUT_CHANIDX_CENTER, \ + AOUT_CHANIDX_LFE, \ +} + +/** + * It describes the audio channel order VLC expect. + */ +static const uint32_t pi_vlc_chan_order_wg4[] = +{ + AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, + AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, + AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_REARCENTER, + AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0 +}; + +#define AOUT_RESTART_FILTERS 0x1 +#define AOUT_RESTART_OUTPUT (AOUT_RESTART_FILTERS|0x2) +#define AOUT_RESTART_STEREOMODE (AOUT_RESTART_OUTPUT|0x4) + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * This function computes the reordering needed to go from pi_chan_order_in to + * pi_chan_order_out. + * If pi_chan_order_in or pi_chan_order_out is NULL, it will assume that vlc + * internal (WG4) order is requested. + */ +VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *, + uint32_t mask, uint8_t *table ); +VLC_API void aout_ChannelReorder(void *, size_t, uint8_t, const uint8_t *, vlc_fourcc_t); + +VLC_API void aout_Interleave(void *dst, const void *const *planes, + unsigned samples, unsigned channels, + vlc_fourcc_t fourcc); +VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples, + unsigned channels, vlc_fourcc_t fourcc); + +/** + * This function will compute the extraction parameter into pi_selection to go + * from i_channels with their type given by pi_order_src[] into the order + * describe by pi_order_dst. + * It will also set : + * - *pi_channels as the number of channels that will be extracted which is + * lower (in case of non understood channels type) or equal to i_channels. + * - the layout of the channels (*pi_layout). + * + * It will return true if channel extraction is really needed, in which case + * aout_ChannelExtract must be used + * + * XXX It must be used when the source may have channel type not understood + * by VLC. In this case the channel type pi_order_src[] must be set to 0. + * XXX It must also be used if multiple channels have the same type. + */ +VLC_API bool aout_CheckChannelExtraction( int *pi_selection, uint32_t *pi_layout, int *pi_channels, const uint32_t pi_order_dst[AOUT_CHAN_MAX], const uint32_t *pi_order_src, int i_channels ); + +/** + * Do the actual channels extraction using the parameters created by + * aout_CheckChannelExtraction. + * + * XXX this function does not work in place (p_dst and p_src must not overlap). + * XXX Only 8, 16, 32, 64 bits per sample are supported. + */ +VLC_API void aout_ChannelExtract( void *p_dst, int i_dst_channels, const void *p_src, int i_src_channels, int i_sample_count, const int *pi_selection, int i_bits_per_sample ); + +/* */ +static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt) +{ + return popcount(fmt->i_physical_channels); +} + +VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED; +VLC_API void aout_FormatPrepare( audio_sample_format_t * p_format ); +VLC_API void aout_FormatPrint(vlc_object_t *, const char *, + const audio_sample_format_t *); +#define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f) +VLC_API const char * aout_FormatPrintChannels( const audio_sample_format_t * ) VLC_USED; + +#define AOUT_VOLUME_DEFAULT 256 +#define AOUT_VOLUME_MAX 512 + +VLC_API float aout_VolumeGet (audio_output_t *); +VLC_API int aout_VolumeSet (audio_output_t *, float); +VLC_API int aout_VolumeUpdate (audio_output_t *, int, float *); +VLC_API int aout_MuteGet (audio_output_t *); +VLC_API int aout_MuteSet (audio_output_t *, bool); +VLC_API char *aout_DeviceGet (audio_output_t *); +VLC_API int aout_DeviceSet (audio_output_t *, const char *); +VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***); + +/** + * Report change of configured audio volume to the core and UI. + */ +static inline void aout_VolumeReport(audio_output_t *aout, float volume) +{ + aout->event.volume_report(aout, volume); +} + +/** + * Report change of muted flag to the core and UI. + */ +static inline void aout_MuteReport(audio_output_t *aout, bool mute) +{ + aout->event.mute_report(aout, mute); +} + +/** + * Report audio policy status. + * \param cork true to request a cork, false to undo any pending cork. + */ +static inline void aout_PolicyReport(audio_output_t *aout, bool cork) +{ + aout->event.policy_report(aout, cork); +} + +/** + * Report change of output device. + */ +static inline void aout_DeviceReport(audio_output_t *aout, const char *id) +{ + aout->event.device_report(aout, id); +} + +/** + * Report a device hot-plug event. + * @param id device ID + * @param name human-readable device name (NULL for hot unplug) + */ +static inline void aout_HotplugReport(audio_output_t *aout, + const char *id, const char *name) +{ + aout->event.hotplug_report(aout, id, name); +} + +/** + * Request a change of software audio amplification. + * \param gain linear amplitude gain (must be positive) + * \warning Values in excess 1.0 may cause overflow and distorsion. + */ +static inline int aout_GainRequest(audio_output_t *aout, float gain) +{ + return aout->event.gain_request(aout, gain); +} + +static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode) +{ + aout->event.restart_request(aout, mode); +} + +/* Audio output filters */ + +typedef struct +{ + /** + * If the remap order differs from the WG4 order, a remap audio filter will + * be inserted to remap channels according to this array. + */ + int remap[AOUT_CHANIDX_MAX]; + /** + * If true, a filter will be inserted to add a headphones effect (like a + * binauralizer audio filter). + */ + bool headphones; +} aout_filters_cfg_t; + +#define AOUT_FILTERS_CFG_INIT (aout_filters_cfg_t) \ + { .remap = AOUT_CHAN_REMAP_INIT, \ + .headphones = false, \ + }; + +typedef struct aout_filters aout_filters_t; +typedef struct aout_request_vout aout_request_vout_t; + +VLC_API aout_filters_t *aout_FiltersNew(vlc_object_t *, + const audio_sample_format_t *, + const audio_sample_format_t *, + const aout_request_vout_t *, + const aout_filters_cfg_t *cfg) VLC_USED; +#define aout_FiltersNew(o,inf,outf,rv,remap) \ + aout_FiltersNew(VLC_OBJECT(o),inf,outf,rv,remap) +VLC_API void aout_FiltersDelete(vlc_object_t *, aout_filters_t *); +#define aout_FiltersDelete(o,f) \ + aout_FiltersDelete(VLC_OBJECT(o),f) +VLC_API bool aout_FiltersAdjustResampling(aout_filters_t *, int); +VLC_API block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate); +VLC_API block_t *aout_FiltersDrain(aout_filters_t *); +VLC_API void aout_FiltersFlush(aout_filters_t *); +VLC_API void aout_FiltersChangeViewpoint(aout_filters_t *, const vlc_viewpoint_t *vp); + +VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, const video_format_t *p_fmt ); + +/** @} */ + +#endif /* VLC_AOUT_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_aout_volume.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_aout_volume.h new file mode 100644 index 0000000..7a61af5 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_aout_volume.h @@ -0,0 +1,59 @@ +/***************************************************************************** + * vlc_aout_volume.h: audio volume module + ***************************************************************************** + * Copyright (C) 2002-2009 VLC authors and VideoLAN + * $Id: df85b8fd14e00454e88c08061e3059fa67927dab $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_MIXER_H +#define VLC_AOUT_MIXER_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup audio_volume Audio output volume + * \ingroup audio_output + * @{ + * \file + * This file defines functions, structures and macros for audio output mixer object + */ + +typedef struct audio_volume audio_volume_t; + +/** + * Audio volume + */ +struct audio_volume +{ + VLC_COMMON_MEMBERS + + vlc_fourcc_t format; /**< Audio samples format */ + void (*amplify)(audio_volume_t *, block_t *, float); /**< Amplifier */ +}; + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_arrays.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_arrays.h new file mode 100644 index 0000000..136a636 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_arrays.h @@ -0,0 +1,627 @@ +/***************************************************************************** + * vlc_arrays.h : Arrays and data structures handling + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 39b69952ffce040330da239f52778c3e82024bc4 $ + * + * Authors: Samuel Hocevar + * Clément Stenac + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ARRAYS_H_ +#define VLC_ARRAYS_H_ + +/** + * \file + * This file defines functions, structures and macros for handling arrays in vlc + */ + +/* realloc() that never fails *if* downsizing */ +static inline void *realloc_down( void *ptr, size_t size ) +{ + void *ret = realloc( ptr, size ); + return ret ? ret : ptr; +} + +#define TAB_INIT( count, tab ) \ + do { \ + (count) = 0; \ + (tab) = NULL; \ + } while(0) + +#define TAB_CLEAN( count, tab ) \ + do { \ + free( tab ); \ + (count)= 0; \ + (tab)= NULL; \ + } while(0) + +#define TAB_APPEND_CAST( cast, count, tab, p ) \ + do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + (tab)[count] = (p); \ + (count)++; \ + } while(0) + +#define TAB_APPEND( count, tab, p ) \ + TAB_APPEND_CAST( , count, tab, p ) + +#define TAB_FIND( count, tab, p, idx ) \ + do { \ + for( (idx) = 0; (idx) < (count); (idx)++ ) \ + if( (tab)[(idx)] == (p) ) \ + break; \ + if( (idx) >= (count) ) \ + (idx) = -1; \ + } while(0) + + +#define TAB_ERASE( count, tab, index ) \ + do { \ + if( (count) > 1 ) \ + memmove( (tab) + (index), \ + (tab) + (index) + 1, \ + ((count) - (index) - 1 ) * sizeof( *(tab) ) );\ + (count)--; \ + if( (count) == 0 ) \ + { \ + free( tab ); \ + (tab) = NULL; \ + } \ + } while(0) + +#define TAB_REMOVE( count, tab, p ) \ + do { \ + int i_index; \ + TAB_FIND( count, tab, p, i_index ); \ + if( i_index >= 0 ) \ + TAB_ERASE( count, tab, i_index ); \ + } while(0) + +#define TAB_INSERT_CAST( cast, count, tab, p, index ) do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + if( (count) - (index) > 0 ) \ + memmove( (tab) + (index) + 1, \ + (tab) + (index), \ + ((count) - (index)) * sizeof( *(tab) ) );\ + (tab)[(index)] = (p); \ + (count)++; \ +} while(0) + +#define TAB_INSERT( count, tab, p, index ) \ + TAB_INSERT_CAST( , count, tab, p, index ) + +/** + * Binary search in a sorted array. The key must be comparable by < and > + * \param entries array of entries + * \param count number of entries + * \param elem key to check within an entry (like .id, or ->i_id) + * \param zetype type of the key + * \param key value of the key + * \param answer index of answer within the array. -1 if not found + */ +#define BSEARCH( entries, count, elem, zetype, key, answer ) \ + do { \ + int low = 0, high = count - 1; \ + answer = -1; \ + while( low <= high ) {\ + int mid = ((unsigned int)low + (unsigned int)high) >> 1;\ + zetype mid_val = entries[mid] elem;\ + if( mid_val < key ) \ + low = mid + 1; \ + else if ( mid_val > key ) \ + high = mid -1; \ + else \ + { \ + answer = mid; break; \ + }\ + } \ + } while(0) + + +/************************************************************************ + * Dynamic arrays with progressive allocation + ************************************************************************/ + +/* Internal functions */ +#define _ARRAY_ALLOC(array, newsize) { \ + (array).i_alloc = newsize; \ + (array).p_elems = realloc( (array).p_elems, (array).i_alloc * \ + sizeof(*(array).p_elems) ); \ + if( !(array).p_elems ) abort(); \ +} + +#define _ARRAY_GROW1(array) { \ + if( (array).i_alloc < 10 ) \ + _ARRAY_ALLOC(array, 10 ) \ + else if( (array).i_alloc == (array).i_size ) \ + _ARRAY_ALLOC(array, (int)((array).i_alloc * 1.5) ) \ +} + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +/* API */ +#define DECL_ARRAY(type) struct { \ + int i_alloc; \ + int i_size; \ + type *p_elems; \ +} + +#define TYPEDEF_ARRAY(type, name) typedef DECL_ARRAY(type) name; + +#define ARRAY_INIT(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_RESET(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + free( (array).p_elems ); (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_APPEND(array, elem) \ + do { \ + _ARRAY_GROW1(array); \ + (array).p_elems[(array).i_size] = elem; \ + (array).i_size++; \ + } while(0) + +#define ARRAY_INSERT(array,elem,pos) \ + do { \ + _ARRAY_GROW1(array); \ + if( (array).i_size - pos ) { \ + memmove( (array).p_elems + pos + 1, (array).p_elems + pos, \ + ((array).i_size-pos) * sizeof(*(array).p_elems) ); \ + } \ + (array).p_elems[pos] = elem; \ + (array).i_size++; \ + } while(0) + +#define _ARRAY_SHRINK(array) { \ + if( (array).i_size > 10 && (array).i_size < (int)((array).i_alloc / 1.5) ) { \ + _ARRAY_ALLOC(array, (array).i_size + 5); \ + } \ +} + +#define ARRAY_REMOVE(array,pos) \ + do { \ + if( (array).i_size - (pos) - 1 ) \ + { \ + memmove( (array).p_elems + pos, (array).p_elems + pos + 1, \ + ( (array).i_size - pos - 1 ) *sizeof(*(array).p_elems) ); \ + } \ + (array).i_size--; \ + _ARRAY_SHRINK(array); \ + } while(0) + +#define ARRAY_VAL(array, pos) array.p_elems[pos] + +#define ARRAY_BSEARCH(array, elem, zetype, key, answer) \ + BSEARCH( (array).p_elems, (array).i_size, elem, zetype, key, answer) + +#define FOREACH_ARRAY( item, array ) { \ + int fe_idx; \ + for( fe_idx = 0 ; fe_idx < (array).i_size ; fe_idx++ ) \ + { \ + item = (array).p_elems[fe_idx]; + +#define FOREACH_END() } } + + +/************************************************************************ + * Dynamic arrays with progressive allocation (Preferred API) + ************************************************************************/ +typedef struct vlc_array_t +{ + size_t i_count; + void ** pp_elems; +} vlc_array_t; + +static inline void vlc_array_init( vlc_array_t * p_array ) +{ + p_array->i_count = 0; + p_array->pp_elems = NULL; +} + +static inline void vlc_array_clear( vlc_array_t * p_array ) +{ + free( p_array->pp_elems ); + vlc_array_init( p_array ); +} + +/* Read */ +static inline size_t vlc_array_count( vlc_array_t * p_array ) +{ + return p_array->i_count; +} + +#ifndef __cplusplus +# define vlc_array_item_at_index(ar, idx) \ + _Generic((ar), \ + const vlc_array_t *: ((ar)->pp_elems[idx]), \ + vlc_array_t *: ((ar)->pp_elems[idx])) +#else +static inline void *vlc_array_item_at_index( vlc_array_t *ar, size_t idx ) +{ + return ar->pp_elems[idx]; +} + +static inline const void *vlc_array_item_at_index( const vlc_array_t *ar, + size_t idx ) +{ + return ar->pp_elems[idx]; +} +#endif + +static inline int vlc_array_index_of_item( const vlc_array_t *ar, + const void *elem ) +{ + for( size_t i = 0; i < ar->i_count; i++ ) + { + if( ar->pp_elems[i] == elem ) + return i; + } + return -1; +} + +/* Write */ +static inline int vlc_array_insert( vlc_array_t *ar, void *elem, int idx ) +{ + void **pp = (void **)realloc( ar->pp_elems, + sizeof( void * ) * (ar->i_count + 1) ); + if( unlikely(pp == NULL) ) + return -1; + + size_t tail = ar->i_count - idx; + if( tail > 0 ) + memmove( pp + idx + 1, pp + idx, sizeof( void * ) * tail ); + + pp[idx] = elem; + ar->i_count++; + ar->pp_elems = pp; + return 0; +} + +static inline void vlc_array_insert_or_abort( vlc_array_t *ar, void *elem, int idx ) +{ + if( vlc_array_insert( ar, elem, idx ) ) + abort(); +} + +static inline int vlc_array_append( vlc_array_t *ar, void *elem ) +{ + void **pp = (void **)realloc( ar->pp_elems, + sizeof( void * ) * (ar->i_count + 1) ); + if( unlikely(pp == NULL) ) + return -1; + + pp[ar->i_count++] = elem; + ar->pp_elems = pp; + return 0; +} + +static inline void vlc_array_append_or_abort( vlc_array_t *ar, void *elem ) +{ + if( vlc_array_append( ar, elem ) != 0 ) + abort(); +} + +static inline void vlc_array_remove( vlc_array_t *ar, size_t idx ) +{ + void **pp = ar->pp_elems; + size_t tail = ar->i_count - idx - 1; + + if( tail > 0 ) + memmove( pp + idx, pp + idx + 1, sizeof( void * ) * tail ); + + ar->i_count--; + + if( ar->i_count > 0 ) + { + pp = (void **)realloc( pp, sizeof( void * ) * ar->i_count ); + if( likely(pp != NULL) ) + ar->pp_elems = pp; + } + else + { + free( pp ); + ar->pp_elems = NULL; + } +} + + +/************************************************************************ + * Dictionaries + ************************************************************************/ + +/* This function is not intended to be crypto-secure, we only want it to be + * fast and not suck too much. This one is pretty fast and did 0 collisions + * in wenglish's dictionary. + */ +static inline uint64_t DictHash( const char *psz_string, int hashsize ) +{ + uint64_t i_hash = 0; + if( psz_string ) + { + while( *psz_string ) + { + i_hash += *psz_string++; + i_hash += i_hash << 10; + i_hash ^= i_hash >> 8; + } + } + return i_hash % hashsize; +} + +typedef struct vlc_dictionary_entry_t +{ + char * psz_key; + void * p_value; + struct vlc_dictionary_entry_t * p_next; +} vlc_dictionary_entry_t; + +typedef struct vlc_dictionary_t +{ + int i_size; + vlc_dictionary_entry_t ** p_entries; +} vlc_dictionary_t; + +static void * const kVLCDictionaryNotFound = NULL; + +static inline void vlc_dictionary_init( vlc_dictionary_t * p_dict, int i_size ) +{ + p_dict->p_entries = NULL; + + if( i_size > 0 ) + { + p_dict->p_entries = (vlc_dictionary_entry_t **)calloc( i_size, sizeof(*p_dict->p_entries) ); + if( !p_dict->p_entries ) + i_size = 0; + } + p_dict->i_size = i_size; +} + +static inline void vlc_dictionary_clear( vlc_dictionary_t * p_dict, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( p_dict->p_entries ) + { + for( int i = 0; i < p_dict->i_size; i++ ) + { + vlc_dictionary_entry_t * p_current, * p_next; + p_current = p_dict->p_entries[i]; + while( p_current ) + { + p_next = p_current->p_next; + if( pf_free != NULL ) + ( * pf_free )( p_current->p_value, p_obj ); + free( p_current->psz_key ); + free( p_current ); + p_current = p_next; + } + } + free( p_dict->p_entries ); + p_dict->p_entries = NULL; + } + p_dict->i_size = 0; +} + +static inline int +vlc_dictionary_has_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return 0; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + const vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + for( ; p_entry != NULL; p_entry = p_entry->p_next ) + { + if( !strcmp( psz_key, p_entry->psz_key ) ) + break; + } + return p_entry != NULL; +} + +static inline void * +vlc_dictionary_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return kVLCDictionaryNotFound; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + + if( !p_entry ) + return kVLCDictionaryNotFound; + + /* Make sure we return the right item. (Hash collision) */ + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + return p_entry->p_value; + p_entry = p_entry->p_next; + } while( p_entry ); + + return kVLCDictionaryNotFound; +} + +static inline int +vlc_dictionary_keys_count( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + int i, count = 0; + + if( !p_dict->p_entries ) + return 0; + + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) count++; + } + return count; +} + +static inline bool +vlc_dictionary_is_empty( const vlc_dictionary_t * p_dict ) +{ + if( p_dict->p_entries ) + for( int i = 0; i < p_dict->i_size; i++ ) + if( p_dict->p_entries[i] ) + return false; + return true; +} + +static inline char ** +vlc_dictionary_all_keys( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + char ** ppsz_ret; + int i, count = vlc_dictionary_keys_count( p_dict ); + + ppsz_ret = (char**)malloc(sizeof(char *) * (count + 1)); + if( unlikely(!ppsz_ret) ) + return NULL; + + count = 0; + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) + ppsz_ret[count++] = strdup( p_entry->psz_key ); + } + ppsz_ret[count] = NULL; + return ppsz_ret; +} + +static inline void +vlc_dictionary_insert_impl_( vlc_dictionary_t * p_dict, const char * psz_key, + void * p_value, bool rebuild ) +{ + if( !p_dict->p_entries ) + vlc_dictionary_init( p_dict, 1 ); + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry; + + p_entry = (vlc_dictionary_entry_t *)malloc(sizeof(*p_entry)); + p_entry->psz_key = strdup( psz_key ); + p_entry->p_value = p_value; + p_entry->p_next = p_dict->p_entries[i_pos]; + p_dict->p_entries[i_pos] = p_entry; + if( rebuild ) + { + /* Count how many items there was */ + int count; + for( count = 1; p_entry->p_next; count++ ) + p_entry = p_entry->p_next; + if( count > 3 ) /* XXX: this need tuning */ + { + /* Here it starts to be not good, rebuild a bigger dictionary */ + struct vlc_dictionary_t new_dict; + int i_new_size = ( (p_dict->i_size+2) * 3) / 2; /* XXX: this need tuning */ + int i; + vlc_dictionary_init( &new_dict, i_new_size ); + for( i = 0; i < p_dict->i_size; i++ ) + { + p_entry = p_dict->p_entries[i]; + while( p_entry ) + { + vlc_dictionary_insert_impl_( &new_dict, p_entry->psz_key, + p_entry->p_value, + false /* To avoid multiple rebuild loop */); + p_entry = p_entry->p_next; + } + } + + vlc_dictionary_clear( p_dict, NULL, NULL ); + p_dict->i_size = new_dict.i_size; + p_dict->p_entries = new_dict.p_entries; + } + } +} + +static inline void +vlc_dictionary_insert( vlc_dictionary_t * p_dict, const char * psz_key, void * p_value ) +{ + vlc_dictionary_insert_impl_( p_dict, psz_key, p_value, true ); +} + +static inline void +vlc_dictionary_remove_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( !p_dict->p_entries ) + return; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + vlc_dictionary_entry_t * p_prev; + + if( !p_entry ) + return; /* Not found, nothing to do */ + + /* Hash collision */ + p_prev = NULL; + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + { + if( pf_free != NULL ) + ( * pf_free )( p_entry->p_value, p_obj ); + if( !p_prev ) + p_dict->p_entries[i_pos] = p_entry->p_next; + else + p_prev->p_next = p_entry->p_next; + free( p_entry->psz_key ); + free( p_entry ); + return; + } + p_prev = p_entry; + p_entry = p_entry->p_next; + } while( p_entry ); + + /* No key was found */ +} + +#ifdef __cplusplus +// C++ helpers +template +void vlc_delete_all( T &container ) +{ + typename T::iterator it = container.begin(); + while ( it != container.end() ) + { + delete *it; + ++it; + } + container.clear(); +} + +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_atomic.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_atomic.h new file mode 100644 index 0000000..31d1454 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_atomic.h @@ -0,0 +1,224 @@ +/***************************************************************************** + * vlc_atomic.h: + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ATOMIC_H +# define VLC_ATOMIC_H + +/** + * \file + * Atomic operations do not require locking, but they are not very powerful. + */ + +/* Clang older versions support atomics but lacks the stdatomic.h header */ +#if defined(__clang__) +# if !defined(__has_include) || !__has_include() +# define __STDC_NO_ATOMICS__ 1 +# endif +#endif + +# ifndef __cplusplus +# if !defined (__STDC_NO_ATOMICS__) +/*** Native C11 atomics ***/ +# include + +# else +/*** Intel/GCC atomics ***/ + +# define ATOMIC_FLAG_INIT false + +# define ATOMIC_VAR_INIT(value) (value) + +# define atomic_init(obj, value) \ + do { *(obj) = (value); } while(0) + +# define kill_dependency(y) \ + ((void)0) + +# define atomic_thread_fence(order) \ + __sync_synchronize() + +# define atomic_signal_fence(order) \ + ((void)0) + +# define atomic_is_lock_free(obj) \ + false + +typedef bool atomic_flag; +typedef bool atomic_bool; +typedef char atomic_char; +typedef signed char atomic_schar; +typedef unsigned char atomic_uchar; +typedef short atomic_short; +typedef unsigned short atomic_ushort; +typedef int atomic_int; +typedef unsigned int atomic_uint; +typedef long atomic_long; +typedef unsigned long atomic_ulong; +typedef long long atomic_llong; +typedef unsigned long long atomic_ullong; +//typedef char16_t atomic_char16_t; +//typedef char32_t atomic_char32_t; +typedef wchar_t atomic_wchar_t; +typedef int_least8_t atomic_int_least8_t; +typedef uint_least8_t atomic_uint_least8_t; +typedef int_least16_t atomic_int_least16_t; +typedef uint_least16_t atomic_uint_least16_t; +typedef int_least32_t atomic_int_least32_t; +typedef uint_least32_t atomic_uint_least32_t; +typedef int_least64_t atomic_int_least64_t; +typedef uint_least64_t atomic_uint_least64_t; +typedef int_fast8_t atomic_int_fast8_t; +typedef uint_fast8_t atomic_uint_fast8_t; +typedef int_fast16_t atomic_int_fast16_t; +typedef uint_fast16_t atomic_uint_fast16_t; +typedef int_fast32_t atomic_int_fast32_t; +typedef uint_fast32_t atomic_uint_fast32_t; +typedef int_fast64_t atomic_int_fast64_t; +typedef uint_fast64_t atomic_uint_fast64_t; +typedef intptr_t atomic_intptr_t; +typedef uintptr_t atomic_uintptr_t; +typedef size_t atomic_size_t; +typedef ptrdiff_t atomic_ptrdiff_t; +typedef intmax_t atomic_intmax_t; +typedef uintmax_t atomic_uintmax_t; + +# define atomic_store(object,desired) \ + do { \ + *(object) = (desired); \ + __sync_synchronize(); \ + } while (0) + +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object,desired) + +# define atomic_load(object) \ + (__sync_synchronize(), *(object)) + +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _old; \ + do \ + _old = atomic_load(_obj); \ + while (!__sync_bool_compare_and_swap(_obj, _old, (desired))); \ + _old; \ +}) + +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object,desired) + +# define atomic_compare_exchange(object,expected,desired) \ +({ \ + typeof (object) _exp = (expected); \ + typeof (*object) _old = *_exp; \ + *_exp = __sync_val_compare_and_swap((object), _old, (desired)); \ + *_exp == _old; \ +}) + +# define atomic_compare_exchange_strong(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order,order_different) \ + atomic_compare_exchange_strong(object, expected, desired) + +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order_equal,order_different) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_add(object,operand) \ + __sync_fetch_and_add(object, operand) + +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object,operand) + +# define atomic_fetch_sub(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_or(object,operand) \ + __sync_fetch_and_or(object, operand) + +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object,operand) + +# define atomic_fetch_xor(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_and(object,operand) \ + __sync_fetch_and_and(object, operand) + +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object,operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# endif /* !C11 */ + +typedef atomic_uint_least32_t vlc_atomic_float; + +static inline void vlc_atomic_init_float(vlc_atomic_float *var, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_init(var, u.i); +} + +/** Helper to retrieve a single precision from an atom. */ +static inline float vlc_atomic_load_float(vlc_atomic_float *atom) +{ + union { float f; uint32_t i; } u; + u.i = atomic_load(atom); + return u.f; +} + +/** Helper to store a single precision into an atom. */ +static inline void vlc_atomic_store_float(vlc_atomic_float *atom, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_store(atom, u.i); +} + +# else /* C++ */ +/*** Native C++11 atomics ***/ +# include +# endif /* C++ */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_avcodec.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_avcodec.h new file mode 100644 index 0000000..664633a --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_avcodec.h @@ -0,0 +1,34 @@ +/***************************************************************************** + * vlc_avcodec.h: VLC thread support for libavcodec + ***************************************************************************** + * Copyright (C) 2009-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AVCODEC_H +# define VLC_AVCODEC_H 1 + +static inline void vlc_avcodec_lock (void) +{ + vlc_global_lock (VLC_AVCODEC_MUTEX); +} + +static inline void vlc_avcodec_unlock (void) +{ + vlc_global_unlock (VLC_AVCODEC_MUTEX); +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_bits.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_bits.h new file mode 100644 index 0000000..edd095b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_bits.h @@ -0,0 +1,269 @@ +/***************************************************************************** + * vlc_bits.h : Bit handling helpers + ***************************************************************************** + * Copyright (C) 2001, 2002, 2003, 2006, 2015 VLC authors and VideoLAN + * $Id: 395a789eba46ac42413f5fb5418619332589f824 $ + * + * Authors: Laurent Aimar + * Gildas Bazin + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#ifndef VLC_BITS_H +#define VLC_BITS_H 1 + +#include + +/** + * \file + * This file defines functions, structures for handling streams of bits in vlc + */ + +typedef struct bs_s +{ + uint8_t *p_start; + uint8_t *p; + uint8_t *p_end; + + ssize_t i_left; /* i_count number of available bits */ + bool b_read_only; + + /* forward read modifier (p_start, p_end, p_fwpriv, count) */ + uint8_t *(*pf_forward)(uint8_t *, uint8_t *, void *, size_t); + void *p_fwpriv; +} bs_t; + +static inline void bs_write_init( bs_t *s, void *p_data, size_t i_data ) +{ + s->p_start = (uint8_t *)p_data; + s->p = s->p_start; + s->p_end = s->p_start + i_data; + s->i_left = 8; + s->b_read_only = false; + s->p_fwpriv = NULL; + s->pf_forward = NULL; +} + +static inline void bs_init( bs_t *s, const void *p_data, size_t i_data ) +{ + bs_write_init( s, (void*) p_data, i_data ); + s->b_read_only = true; +} + +static inline int bs_pos( const bs_t *s ) +{ + return( 8 * ( s->p - s->p_start ) + 8 - s->i_left ); +} + +static inline int bs_remain( const bs_t *s ) +{ + if( s->p >= s->p_end ) + return 0; + else + return( 8 * ( s->p_end - s->p ) - 8 + s->i_left ); +} + +static inline int bs_eof( const bs_t *s ) +{ + return( s->p >= s->p_end ? 1: 0 ); +} + +#define bs_forward( s, i ) \ + s->p = s->pf_forward ? s->pf_forward( s->p, s->p_end, s->p_fwpriv, i ) : s->p + i + +static inline uint32_t bs_read( bs_t *s, int i_count ) +{ + static const uint32_t i_mask[33] = + { 0x00, + 0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff, 0x3ff, 0x7ff, 0xfff, + 0x1fff, 0x3fff, 0x7fff, 0xffff, + 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, + 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, + 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, + 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff}; + int i_shr, i_drop = 0; + uint32_t i_result = 0; + + if( i_count > 32 ) + { + i_drop = i_count - 32; + i_count = 32; + } + + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + if( ( i_shr = s->i_left - i_count ) >= 0 ) + { + /* more in the buffer than requested */ + i_result |= ( *s->p >> i_shr )&i_mask[i_count]; + s->i_left -= i_count; + if( s->i_left == 0 ) + { + bs_forward( s, 1 ); + s->i_left = 8; + } + break; + } + else + { + /* less in the buffer than requested */ + if( -i_shr == 32 ) + i_result = 0; + else + i_result |= (*s->p&i_mask[s->i_left]) << -i_shr; + i_count -= s->i_left; + bs_forward( s, 1); + s->i_left = 8; + } + } + + if( i_drop ) + bs_forward( s, i_drop ); + + return( i_result ); +} + +static inline uint32_t bs_read1( bs_t *s ) +{ + if( s->p < s->p_end ) + { + unsigned int i_result; + + s->i_left--; + i_result = ( *s->p >> s->i_left )&0x01; + if( s->i_left == 0 ) + { + bs_forward( s, 1 ); + s->i_left = 8; + } + return i_result; + } + + return 0; +} + +static inline uint32_t bs_show( bs_t *s, int i_count ) +{ + bs_t s_tmp = *s; + return bs_read( &s_tmp, i_count ); +} + +static inline void bs_skip( bs_t *s, ssize_t i_count ) +{ + s->i_left -= i_count; + + if( s->i_left <= 0 ) + { + const size_t i_bytes = 1 + s->i_left / -8; + bs_forward( s, i_bytes ); + if( i_bytes * 8 < i_bytes /* ofw */ ) + s->i_left = i_bytes; + else + s->i_left += 8 * i_bytes; + } +} + +static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits ) +{ + if( s->b_read_only ) + return; + + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + i_count--; + + if( ( i_bits >> i_count )&0x01 ) + { + *s->p |= 1 << ( s->i_left - 1 ); + } + else + { + *s->p &= ~( 1 << ( s->i_left - 1 ) ); + } + s->i_left--; + if( s->i_left == 0 ) + { + bs_forward( s, 1 ); + s->i_left = 8; + } + } +} + +static inline bool bs_aligned( bs_t *s ) +{ + return s->i_left % 8 == 0; +} + +static inline void bs_align( bs_t *s ) +{ + if( s->i_left != 8 ) + { + s->i_left = 8; + s->p++; + } +} + +static inline void bs_align_0( bs_t *s ) +{ + if( s->i_left != 8 ) + { + bs_write( s, s->i_left, 0 ); + } +} + +static inline void bs_align_1( bs_t *s ) +{ + while( !s->b_read_only && s->i_left != 8 ) + { + bs_write( s, 1, 1 ); + } +} + +/* Read unsigned Exp-Golomb code */ +static inline uint_fast32_t bs_read_ue( bs_t * bs ) +{ + unsigned i = 0; + + while( bs_read1( bs ) == 0 && bs->p < bs->p_end && i < 31 ) + i++; + + return (1U << i) - 1 + bs_read( bs, i ); +} + +/* Read signed Exp-Golomb code */ +static inline int_fast32_t bs_read_se( bs_t *s ) +{ + uint_fast32_t val = bs_read_ue( s ); + + return (val & 0x01) ? (int_fast32_t)((val + 1) / 2) + : -(int_fast32_t)(val / 2); +} + +#undef bs_forward + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_block.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_block.h new file mode 100644 index 0000000..9990104 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_block.h @@ -0,0 +1,626 @@ +/***************************************************************************** + * vlc_block.h: Data blocks management functions + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 1c9478301687233398adbb7de7da4ffc4a101f89 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_H +#define VLC_BLOCK_H 1 + +/** + * \defgroup block Data blocks + * \ingroup input + * + * Blocks of binary data. + * + * @ref block_t is a generic structure to represent a binary blob within VLC. + * The primary goal of the structure is to avoid memory copying as data is + * passed around. It is notably used between the \ref demux, the packetizer + * (if present) and the \ref decoder, and for audio, between the \ref decoder, + * the audio filters, and the \ref audio_output. + * + * @{ + * \file + * Data block definition and functions + */ + +#include /* for ssize_t */ + +/**************************************************************************** + * block: + **************************************************************************** + * - i_flags may not always be set (ie could be 0, even for a key frame + * it depends where you receive the buffer (before/after a packetizer + * and the demux/packetizer implementations. + * - i_dts/i_pts could be VLC_TS_INVALID, it means no pts/dts + * - i_length: length in microseond of the packet, can be null except in the + * sout where it is mandatory. + * + * - i_buffer number of valid data pointed by p_buffer + * you can freely decrease it but never increase it yourself + * (use block_Realloc) + * - p_buffer: pointer over datas. You should never overwrite it, you can + * only incremment it to skip datas, in others cases use block_Realloc + * (don't duplicate yourself in a bigger buffer, block_Realloc is + * optimised for preheader/postdatas increase) + ****************************************************************************/ + +/** The content doesn't follow the last block, possible some blocks in between + * have been lost */ +#define BLOCK_FLAG_DISCONTINUITY 0x0001 +/** Intra frame */ +#define BLOCK_FLAG_TYPE_I 0x0002 +/** Inter frame with backward reference only */ +#define BLOCK_FLAG_TYPE_P 0x0004 +/** Inter frame with backward and forward reference */ +#define BLOCK_FLAG_TYPE_B 0x0008 +/** For inter frame when you don't know the real type */ +#define BLOCK_FLAG_TYPE_PB 0x0010 +/** Warn that this block is a header one */ +#define BLOCK_FLAG_HEADER 0x0020 +/** This block contains the last part of a sequence */ +#define BLOCK_FLAG_END_OF_SEQUENCE 0x0040 +/** This block contains a clock reference */ +#define BLOCK_FLAG_CLOCK 0x0080 +/** This block is scrambled */ +#define BLOCK_FLAG_SCRAMBLED 0x0100 +/** This block has to be decoded but not be displayed */ +#define BLOCK_FLAG_PREROLL 0x0200 +/** This block is corrupted and/or there is data loss */ +#define BLOCK_FLAG_CORRUPTED 0x0400 +/** This block contains an interlaced picture with top field stored first */ +#define BLOCK_FLAG_TOP_FIELD_FIRST 0x0800 +/** This block contains an interlaced picture with bottom field stored first */ +#define BLOCK_FLAG_BOTTOM_FIELD_FIRST 0x1000 +/** This block contains a single field from interlaced picture. */ +#define BLOCK_FLAG_SINGLE_FIELD 0x2000 + +/** This block contains an interlaced picture */ +#define BLOCK_FLAG_INTERLACED_MASK \ + (BLOCK_FLAG_TOP_FIELD_FIRST|BLOCK_FLAG_BOTTOM_FIELD_FIRST|BLOCK_FLAG_SINGLE_FIELD) + +#define BLOCK_FLAG_TYPE_MASK \ + (BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB) + +/* These are for input core private usage only */ +#define BLOCK_FLAG_CORE_PRIVATE_MASK 0x00ff0000 +#define BLOCK_FLAG_CORE_PRIVATE_SHIFT 16 + +/* These are for module private usage only */ +#define BLOCK_FLAG_PRIVATE_MASK 0xff000000 +#define BLOCK_FLAG_PRIVATE_SHIFT 24 + +typedef void (*block_free_t) (block_t *); + +struct block_t +{ + block_t *p_next; + + uint8_t *p_buffer; /**< Payload start */ + size_t i_buffer; /**< Payload length */ + uint8_t *p_start; /**< Buffer start */ + size_t i_size; /**< Buffer total size */ + + uint32_t i_flags; + unsigned i_nb_samples; /* Used for audio */ + + mtime_t i_pts; + mtime_t i_dts; + mtime_t i_length; + + /* Rudimentary support for overloading block (de)allocation. */ + block_free_t pf_release; +}; + +VLC_API void block_Init( block_t *, void *, size_t ); + +/** + * Allocates a block. + * + * Creates a new block with the requested size. + * The block must be released with block_Release(). + * + * @param size size in bytes (possibly zero) + * @return the created block, or NULL on memory error. + */ +VLC_API block_t *block_Alloc(size_t size) VLC_USED VLC_MALLOC; + +VLC_API block_t *block_TryRealloc(block_t *, ssize_t pre, size_t body) VLC_USED; + +/** + * Reallocates a block. + * + * This function expands, shrinks or moves a data block. + * In many cases, this function can return without any memory allocation by + * reusing spare buffer space. Otherwise, a new block is created and data is + * copied. + * + * @param pre count of bytes to prepend if positive, + * count of leading bytes to discard if negative + * @param body new bytes size of the block + * + * @return the reallocated block on succes, NULL on error. + * + * @note Skipping leading bytes can be achieved directly by subtracting from + * block_t.i_buffer and adding block_t.p_buffer. + * @note Discard trailing bytes can be achieved directly by subtracting from + * block_t.i_buffer. + * @note On error, the block is discarded. + * To avoid that, use block_TryRealloc() instead. + */ +VLC_API block_t *block_Realloc(block_t *, ssize_t pre, size_t body) VLC_USED; + +/** + * Releases a block. + * + * This function works for any @ref block_t block, regardless of the way it was + * allocated. + * + * @note + * If the block is in a chain, this function does not release any + * subsequent block in the chain. Use block_ChainRelease() for that purpose. + * + * @param block block to release (cannot be NULL) + */ +static inline void block_Release(block_t *block) +{ + block->pf_release(block); +} + +static inline void block_CopyProperties( block_t *dst, block_t *src ) +{ + dst->i_flags = src->i_flags; + dst->i_nb_samples = src->i_nb_samples; + dst->i_dts = src->i_dts; + dst->i_pts = src->i_pts; + dst->i_length = src->i_length; +} + +/** + * Duplicates a block. + * + * Creates a writeable duplicate of a block. + * + * @return the duplicate on success, NULL on error. + */ +VLC_USED +static inline block_t *block_Duplicate( block_t *p_block ) +{ + block_t *p_dup = block_Alloc( p_block->i_buffer ); + if( p_dup == NULL ) + return NULL; + + block_CopyProperties( p_dup, p_block ); + memcpy( p_dup->p_buffer, p_block->p_buffer, p_block->i_buffer ); + + return p_dup; +} + +/** + * Wraps heap in a block. + * + * Creates a @ref block_t out of an existing heap allocation. + * This is provided by LibVLC so that manually heap-allocated blocks can safely + * be deallocated even after the origin plugin has been unloaded from memory. + * + * When block_Release() is called, VLC will free() the specified pointer. + * + * @param addr base address of the heap allocation (will be free()'d) + * @param length bytes length of the heap allocation + * @return NULL in case of error (ptr free()'d in that case), or a valid + * block_t pointer. + */ +VLC_API block_t *block_heap_Alloc(void *, size_t) VLC_USED VLC_MALLOC; + +/** + * Wraps a memory mapping in a block + * + * Creates a @ref block_t from a virtual address memory mapping (mmap). + * This is provided by LibVLC so that mmap blocks can safely be deallocated + * even after the allocating plugin has been unloaded from memory. + * + * @param addr base address of the mapping (as returned by mmap) + * @param length length (bytes) of the mapping (as passed to mmap) + * @return NULL if addr is MAP_FAILED, or an error occurred (in the later + * case, munmap(addr, length) is invoked before returning). + */ +VLC_API block_t *block_mmap_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; + +/** + * Wraps a System V memory segment in a block + * + * Creates a @ref block_t from a System V shared memory segment (shmget()). + * This is provided by LibVLC so that segments can safely be deallocated + * even after the allocating plugin has been unloaded from memory. + * + * @param addr base address of the segment (as returned by shmat()) + * @param length length (bytes) of the segment (as passed to shmget()) + * @return NULL if an error occurred (in that case, shmdt(addr) is invoked + * before returning NULL). + */ +VLC_API block_t * block_shm_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; + +/** + * Maps a file handle in memory. + * + * Loads a file into a block of memory through a file descriptor. + * If possible a private file mapping is created. Otherwise, the file is read + * normally. This function is a cancellation point. + * + * @note On 32-bits platforms, + * this function will not work for very large files, + * due to memory space constraints. + * + * @param fd file descriptor to load from + * @param write If true, request a read/write private mapping. + * If false, request a read-only potentially shared mapping. + * + * @return a new block with the file content at p_buffer, and file length at + * i_buffer (release it with block_Release()), or NULL upon error (see errno). + */ +VLC_API block_t *block_File(int fd, bool write) VLC_USED VLC_MALLOC; + +/** + * Maps a file in memory. + * + * Loads a file into a block of memory from a path to the file. + * See also block_File(). + * + * @param write If true, request a read/write private mapping. + * If false, request a read-only potentially shared mapping. + */ +VLC_API block_t *block_FilePath(const char *, bool write) VLC_USED VLC_MALLOC; + +static inline void block_Cleanup (void *block) +{ + block_Release ((block_t *)block); +} +#define block_cleanup_push( block ) vlc_cleanup_push (block_Cleanup, block) + +/** + * \defgroup block_fifo Block chain + * @{ + */ + +/**************************************************************************** + * Chains of blocks functions helper + **************************************************************************** + * - block_ChainAppend : append a block to the last block of a chain. Try to + * avoid using with a lot of data as it's really slow, prefer + * block_ChainLastAppend, p_block can be NULL + * - block_ChainLastAppend : use a pointer over a pointer to the next blocks, + * and update it. + * - block_ChainRelease : release a chain of block + * - block_ChainExtract : extract data from a chain, return real bytes counts + * - block_ChainGather : gather a chain, free it and return one block. + ****************************************************************************/ +static inline void block_ChainAppend( block_t **pp_list, block_t *p_block ) +{ + if( *pp_list == NULL ) + { + *pp_list = p_block; + } + else + { + block_t *p = *pp_list; + + while( p->p_next ) p = p->p_next; + p->p_next = p_block; + } +} + +static inline void block_ChainLastAppend( block_t ***ppp_last, block_t *p_block ) +{ + block_t *p_last = p_block; + + **ppp_last = p_block; + + while( p_last->p_next ) p_last = p_last->p_next; + *ppp_last = &p_last->p_next; +} + +static inline void block_ChainRelease( block_t *p_block ) +{ + while( p_block ) + { + block_t *p_next = p_block->p_next; + block_Release( p_block ); + p_block = p_next; + } +} + +static size_t block_ChainExtract( block_t *p_list, void *p_data, size_t i_max ) +{ + size_t i_total = 0; + uint8_t *p = (uint8_t*)p_data; + + while( p_list && i_max ) + { + size_t i_copy = __MIN( i_max, p_list->i_buffer ); + memcpy( p, p_list->p_buffer, i_copy ); + i_max -= i_copy; + i_total += i_copy; + p += i_copy; + + p_list = p_list->p_next; + } + return i_total; +} + +static inline void block_ChainProperties( block_t *p_list, int *pi_count, size_t *pi_size, mtime_t *pi_length ) +{ + size_t i_size = 0; + mtime_t i_length = 0; + int i_count = 0; + + while( p_list ) + { + i_size += p_list->i_buffer; + i_length += p_list->i_length; + i_count++; + + p_list = p_list->p_next; + } + + if( pi_size ) + *pi_size = i_size; + if( pi_length ) + *pi_length = i_length; + if( pi_count ) + *pi_count = i_count; +} + +static inline block_t *block_ChainGather( block_t *p_list ) +{ + size_t i_total = 0; + mtime_t i_length = 0; + block_t *g; + + if( p_list->p_next == NULL ) + return p_list; /* Already gathered */ + + block_ChainProperties( p_list, NULL, &i_total, &i_length ); + + g = block_Alloc( i_total ); + if( !g ) + return NULL; + block_ChainExtract( p_list, g->p_buffer, g->i_buffer ); + + g->i_flags = p_list->i_flags; + g->i_pts = p_list->i_pts; + g->i_dts = p_list->i_dts; + g->i_length = i_length; + + /* free p_list */ + block_ChainRelease( p_list ); + return g; +} + +/** + * @} + * \defgroup fifo Block FIFO + * Thread-safe block queue functions + * @{ + */ + +/** + * Creates a thread-safe FIFO queue of blocks. + * + * See also block_FifoPut() and block_FifoGet(). + * The created queue must be released with block_FifoRelease(). + * + * @return the FIFO or NULL on memory error + */ +VLC_API block_fifo_t *block_FifoNew(void) VLC_USED VLC_MALLOC; + +/** + * Destroys a FIFO created by block_FifoNew(). + * + * @note Any queued blocks are also destroyed. + * @warning No other threads may be using the FIFO when this function is + * called. Otherwise, undefined behaviour will occur. + */ +VLC_API void block_FifoRelease(block_fifo_t *); + +/** + * Clears all blocks in a FIFO. + */ +VLC_API void block_FifoEmpty(block_fifo_t *); + +/** + * Immediately queue one block at the end of a FIFO. + * + * @param fifo queue + * @param block head of a block list to queue (may be NULL) + */ +VLC_API void block_FifoPut(block_fifo_t *fifo, block_t *block); + +/** + * Dequeue the first block from the FIFO. If necessary, wait until there is + * one block in the queue. This function is (always) cancellation point. + * + * @return a valid block + */ +VLC_API block_t *block_FifoGet(block_fifo_t *) VLC_USED; + +/** + * Peeks the first block in the FIFO. + * + * @warning This function leaves the block in the FIFO. + * You need to protect against concurrent threads who could dequeue the block. + * Preferably, there should be only one thread reading from the FIFO. + * + * @warning This function is undefined if the FIFO is empty. + * + * @return a valid block. + */ +VLC_API block_t *block_FifoShow(block_fifo_t *); + +size_t block_FifoSize(block_fifo_t *) VLC_USED VLC_DEPRECATED; +VLC_API size_t block_FifoCount(block_fifo_t *) VLC_USED VLC_DEPRECATED; + +typedef struct block_fifo_t vlc_fifo_t; + +/** + * Locks a block FIFO. + * + * No more than one thread can lock the FIFO at any given + * time, and no other thread can modify the FIFO while it is locked. + * vlc_fifo_Unlock() releases the lock. + * + * @note If the FIFO is already locked by another thread, this function waits. + * This function is not a cancellation point. + * + * @warning Recursively locking a single FIFO is undefined. Locking more than + * one FIFO at a time may lead to lock inversion; mind the locking order. + */ +VLC_API void vlc_fifo_Lock(vlc_fifo_t *); + +/** + * Unlocks a block FIFO. + * + * The calling thread must have locked the FIFO previously with + * vlc_fifo_Lock(). Otherwise, the behaviour is undefined. + * + * @note This function is not a cancellation point. + */ +VLC_API void vlc_fifo_Unlock(vlc_fifo_t *); + +/** + * Wakes up one thread waiting on the FIFO, if any. + * + * @note This function is not a cancellation point. + * + * @warning For race-free operations, the FIFO should be locked by the calling + * thread. The function can be called on a unlocked FIFO however. + */ +VLC_API void vlc_fifo_Signal(vlc_fifo_t *); + +/** + * Waits on the FIFO. + * + * Atomically unlocks the FIFO and waits until one thread signals the FIFO, + * then locks the FIFO again. A signal can be sent by queueing a block to the + * previously empty FIFO or by calling vlc_fifo_Signal() directly. + * This function may also return spuriously at any moment. + * + * @note This function is a cancellation point. In case of cancellation, the + * the FIFO will be locked before cancellation cleanup handlers are processed. + */ +VLC_API void vlc_fifo_Wait(vlc_fifo_t *); + +VLC_API void vlc_fifo_WaitCond(vlc_fifo_t *, vlc_cond_t *); + +/** + * Timed variant of vlc_fifo_WaitCond(). + * + * Atomically unlocks the FIFO and waits until one thread signals the FIFO up + * to a certain date, then locks the FIFO again. See vlc_fifo_Wait(). + */ +int vlc_fifo_TimedWaitCond(vlc_fifo_t *, vlc_cond_t *, mtime_t); + +/** + * Queues a linked-list of blocks into a locked FIFO. + * + * @param block the head of the list of blocks + * (if NULL, this function has no effects) + * + * @note This function is not a cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + */ +VLC_API void vlc_fifo_QueueUnlocked(vlc_fifo_t *, block_t *); + +/** + * Dequeues the first block from a locked FIFO, if any. + * + * @note This function is not a cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return the first block in the FIFO or NULL if the FIFO is empty + */ +VLC_API block_t *vlc_fifo_DequeueUnlocked(vlc_fifo_t *) VLC_USED; + +/** + * Dequeues the all blocks from a locked FIFO. + * + * This is equivalent to calling vlc_fifo_DequeueUnlocked() repeatedly until + * the FIFO is emptied, but this function is much faster. + * + * @note This function is not a cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return a linked-list of all blocks in the FIFO (possibly NULL) + */ +VLC_API block_t *vlc_fifo_DequeueAllUnlocked(vlc_fifo_t *) VLC_USED; + +/** + * Counts blocks in a FIFO. + * + * Checks how many blocks are queued in a locked FIFO. + * + * @note This function is not cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return the number of blocks in the FIFO (zero if it is empty) + */ +VLC_API size_t vlc_fifo_GetCount(const vlc_fifo_t *) VLC_USED; + +/** + * Counts bytes in a FIFO. + * + * Checks how many bytes are queued in a locked FIFO. + * + * @note This function is not cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return the total number of bytes + * + * @note Zero bytes does not necessarily mean that the FIFO is empty since + * a block could contain zero bytes. Use vlc_fifo_GetCount() to determine if + * a FIFO is empty. + */ +VLC_API size_t vlc_fifo_GetBytes(const vlc_fifo_t *) VLC_USED; + +VLC_USED static inline bool vlc_fifo_IsEmpty(const vlc_fifo_t *fifo) +{ + return vlc_fifo_GetCount(fifo) == 0; +} + +static inline void vlc_fifo_Cleanup(void *fifo) +{ + vlc_fifo_Unlock((vlc_fifo_t *)fifo); +} +#define vlc_fifo_CleanupPush(fifo) vlc_cleanup_push(vlc_fifo_Cleanup, fifo) + +/** @} */ + +/** @} */ + +#endif /* VLC_BLOCK_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_block_helper.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_block_helper.h new file mode 100644 index 0000000..4071c2b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_block_helper.h @@ -0,0 +1,369 @@ +/***************************************************************************** + * vlc_block_helper.h: Helper functions for data blocks management. + ***************************************************************************** + * Copyright (C) 2003-2017 VLC authors and VideoLAN + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_HELPER_H +#define VLC_BLOCK_HELPER_H 1 + +#include + +typedef struct block_bytestream_t +{ + block_t *p_chain; /**< byte stream head block */ + block_t **pp_last; /**< tail ppointer for appends */ + block_t *p_block; /**< byte stream read pointer block */ + size_t i_block_offset; /**< byte stream read pointer offset within block */ + size_t i_base_offset; /**< block base offset (previous blocks total size) */ + size_t i_total; /**< total bytes over all linked blocks */ +} block_bytestream_t; + +/***************************************************************************** + * block_bytestream_t management + *****************************************************************************/ +static inline void block_BytestreamInit( block_bytestream_t *p_bytestream ) +{ + p_bytestream->p_chain = p_bytestream->p_block = NULL; + p_bytestream->pp_last = &p_bytestream->p_chain; + p_bytestream->i_block_offset = 0; + p_bytestream->i_base_offset = 0; + p_bytestream->i_total = 0; +} + +static inline void block_BytestreamRelease( block_bytestream_t *p_bytestream ) +{ + block_ChainRelease( p_bytestream->p_chain ); +} + +/** + * It flush all data (read and unread) from a block_bytestream_t. + */ +static inline void block_BytestreamEmpty( block_bytestream_t *p_bytestream ) +{ + block_BytestreamRelease( p_bytestream ); + block_BytestreamInit( p_bytestream ); +} + +/** + * It flushes all already read data from a block_bytestream_t. + */ +static inline void block_BytestreamFlush( block_bytestream_t *p_bytestream ) +{ + block_t *block = p_bytestream->p_chain; + + while( block != p_bytestream->p_block ) + { + block_t *p_next = block->p_next; + + p_bytestream->i_total -= block->i_buffer; + p_bytestream->i_base_offset -= block->i_buffer; + block_Release( block ); + block = p_next; + } + + while( block != NULL && block->i_buffer == p_bytestream->i_block_offset ) + { + block_t *p_next = block->p_next; + + p_bytestream->i_total -= block->i_buffer; + block_Release( block ); + block = p_next; + p_bytestream->i_block_offset = 0; + } + + p_bytestream->p_chain = p_bytestream->p_block = block; + if( p_bytestream->p_chain == NULL ) + p_bytestream->pp_last = &p_bytestream->p_chain; +} + +static inline void block_BytestreamPush( block_bytestream_t *p_bytestream, + block_t *p_block ) +{ + block_ChainLastAppend( &p_bytestream->pp_last, p_block ); + if( !p_bytestream->p_block ) p_bytestream->p_block = p_block; + for( ; p_block; p_block = p_block->p_next ) + p_bytestream->i_total += p_block->i_buffer; +} + +static inline size_t block_BytestreamRemaining( const block_bytestream_t *p_bytestream ) +{ + return ( p_bytestream->i_total > p_bytestream->i_base_offset + p_bytestream->i_block_offset ) ? + p_bytestream->i_total - p_bytestream->i_base_offset - p_bytestream->i_block_offset : 0; +} + +VLC_USED +static inline block_t *block_BytestreamPop( block_bytestream_t *p_bytestream ) +{ + block_t *p_block; + + block_BytestreamFlush( p_bytestream ); + + p_block = p_bytestream->p_block; + if( unlikely( p_block == NULL ) ) + { + return NULL; + } + else if( !p_block->p_next ) + { + p_block->p_buffer += p_bytestream->i_block_offset; + p_block->i_buffer -= p_bytestream->i_block_offset; + p_bytestream->i_block_offset = 0; + p_bytestream->i_total = 0; + p_bytestream->p_chain = p_bytestream->p_block = NULL; + p_bytestream->pp_last = &p_bytestream->p_chain; + return p_block; + } + + while( p_block->p_next && p_block->p_next->p_next ) + p_block = p_block->p_next; + + block_t *p_block_old = p_block; + p_block = p_block->p_next; + p_block_old->p_next = NULL; + p_bytestream->pp_last = &p_block_old->p_next; + if( p_block ) + p_bytestream->i_total -= p_block->i_buffer; + + return p_block; +} + +static inline int block_WaitBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + if( block_BytestreamRemaining( p_bytestream ) >= i_data ) + return VLC_SUCCESS; + return VLC_EGENERIC; +} + +static inline int block_PeekBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + if( block_BytestreamRemaining( p_bytestream ) < i_data ) + return VLC_EGENERIC; + + /* Copy the data */ + size_t i_offset = p_bytestream->i_block_offset; + size_t i_size = i_data; + for( block_t *p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + size_t i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +static inline int block_GetBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + if( block_BytestreamRemaining( p_bytestream ) < i_data ) + return VLC_EGENERIC; + + /* Copy the data */ + size_t i_offset = p_bytestream->i_block_offset; + size_t i_size = i_data; + size_t i_copy = 0; + block_t *p_block; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy && p_data != NULL ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + if( i_size == 0 ) + break; + + p_bytestream->i_base_offset += p_block->i_buffer; + i_offset = 0; + } + + p_bytestream->p_block = p_block; + p_bytestream->i_block_offset = i_offset + i_copy; + + return VLC_SUCCESS; +} + +static inline int block_SkipBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + return block_GetBytes( p_bytestream, NULL, i_data ); +} + +static inline int block_SkipByte( block_bytestream_t *p_bytestream ) +{ + return block_GetBytes( p_bytestream, NULL, 1 ); +} + +static inline int block_PeekOffsetBytes( block_bytestream_t *p_bytestream, + size_t i_peek_offset, uint8_t *p_data, size_t i_data ) +{ + const size_t i_remain = block_BytestreamRemaining( p_bytestream ); + if( i_remain < i_data + i_peek_offset ) + return VLC_EGENERIC; + + /* Find the right place */ + size_t i_offset = p_bytestream->i_block_offset; + size_t i_size = i_peek_offset; + size_t i_copy = 0; + block_t *p_block; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( !i_size ) break; + + i_offset = 0; + } + + /* Copy the data */ + i_offset += i_copy; + i_size = i_data; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +typedef const uint8_t * (*block_startcode_helper_t)( const uint8_t *, const uint8_t * ); +typedef bool (*block_startcode_matcher_t)( uint8_t, size_t, const uint8_t * ); + +static inline int block_FindStartcodeFromOffset( + block_bytestream_t *p_bytestream, size_t *pi_offset, + const uint8_t *p_startcode, int i_startcode_length, + block_startcode_helper_t p_startcode_helper, + block_startcode_matcher_t p_startcode_matcher ) +{ + block_t *p_block, *p_block_backup = 0; + ssize_t i_size = 0; + size_t i_offset, i_offset_backup = 0; + int i_caller_offset_backup = 0, i_match; + + /* Find the right place */ + i_size = *pi_offset + p_bytestream->i_block_offset; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_size -= p_block->i_buffer; + if( i_size < 0 ) break; + } + + if( unlikely( i_size >= 0 ) ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Begin the search. + * We first look for an occurrence of the 1st startcode byte and + * if found, we do a more thorough check. */ + i_size += p_block->i_buffer; + *pi_offset -= i_size; + i_match = 0; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + for( i_offset = i_size; i_offset < p_block->i_buffer; i_offset++ ) + { + /* Use optimized helper when possible */ + if( p_startcode_helper && !i_match && + (p_block->i_buffer - i_offset) > ((size_t)i_startcode_length - 1) ) + { + const uint8_t *p_res = p_startcode_helper( &p_block->p_buffer[i_offset], + &p_block->p_buffer[p_block->i_buffer] ); + if( p_res ) + { + *pi_offset += i_offset + (p_res - &p_block->p_buffer[i_offset]); + return VLC_SUCCESS; + } + /* Then parsing boundary with legacy code */ + i_offset = p_block->i_buffer - (i_startcode_length - 1); + } + + bool b_matched = ( p_startcode_matcher ) + ? p_startcode_matcher( p_block->p_buffer[i_offset], i_match, p_startcode ) + : p_block->p_buffer[i_offset] == p_startcode[i_match]; + if( b_matched ) + { + if( i_match == 0 ) + { + p_block_backup = p_block; + i_offset_backup = i_offset; + i_caller_offset_backup = *pi_offset; + } + + if( i_match + 1 == i_startcode_length ) + { + /* We have it */ + *pi_offset += i_offset - i_match; + return VLC_SUCCESS; + } + + i_match++; + } + else if ( i_match > 0 ) + { + /* False positive */ + p_block = p_block_backup; + i_offset = i_offset_backup; + *pi_offset = i_caller_offset_backup; + i_match = 0; + } + + } + i_size = 0; + *pi_offset += i_offset; + } + + *pi_offset -= i_match; + return VLC_EGENERIC; +} + +#endif /* VLC_BLOCK_HELPER_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_boxes.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_boxes.h new file mode 100644 index 0000000..aa02ffa --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_boxes.h @@ -0,0 +1,165 @@ +/***************************************************************************** + * vlc_boxes.h : Boxes/Atoms handling helpers + ***************************************************************************** + * Copyright (C) 2001, 2002, 2003, 2006, 2015 VLC authors and VideoLAN + * + * Authors: Laurent Aimar + * Gildas Bazin + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#ifndef VLC_BOXES_H +#define VLC_BOXES_H + +#include +#include + +/** + * \file + * This file defines functions, structures for handling boxes/atoms in vlc + */ + +typedef struct bo_t +{ + block_t *b; + size_t basesize; +} bo_t; + +static inline bool bo_init(bo_t *p_bo, int i_size) +{ + p_bo->b = block_Alloc(i_size); + if (p_bo->b == NULL) + return false; + + p_bo->b->i_buffer = 0; + p_bo->basesize = i_size; + + return true; +} + +static inline void bo_deinit(bo_t *p_bo) +{ + if(p_bo->b) + block_Release(p_bo->b); +} + +static inline void bo_free(bo_t *p_bo) +{ + if(!p_bo) + return; + bo_deinit(p_bo); + free(p_bo); +} + +static inline int bo_extend(bo_t *p_bo, size_t i_total) +{ + if(!p_bo->b) + return false; + const size_t i_size = p_bo->b->i_size - (p_bo->b->p_buffer - p_bo->b->p_start); + if (i_total >= i_size) + { + int i_growth = p_bo->basesize; + while(i_total >= i_size + i_growth) + i_growth += p_bo->basesize; + + int i = p_bo->b->i_buffer; /* Realloc would set payload size == buffer size */ + p_bo->b = block_Realloc(p_bo->b, 0, i_size + i_growth); + if (!p_bo->b) + return false; + p_bo->b->i_buffer = i; + } + return true; +} + +#define BO_SET_DECL_S(func, handler, type) static inline bool func(bo_t *p_bo, size_t i_offset, type val)\ + {\ + if (!bo_extend(p_bo, i_offset + sizeof(type)))\ + return false;\ + handler(&p_bo->b->p_buffer[i_offset], val);\ + return true;\ + } + +#define BO_ADD_DECL_S(func, handler, type) static inline bool func(bo_t *p_bo, type val)\ + {\ + if(!p_bo->b || !handler(p_bo, p_bo->b->i_buffer, val))\ + return false;\ + p_bo->b->i_buffer += sizeof(type);\ + return true;\ + } + +#define BO_FUNC_DECL(suffix, handler, type ) \ + BO_SET_DECL_S( bo_set_ ## suffix ## be, handler ## BE, type )\ + BO_SET_DECL_S( bo_set_ ## suffix ## le, handler ## LE, type )\ + BO_ADD_DECL_S( bo_add_ ## suffix ## be, bo_set_ ## suffix ## be, type )\ + BO_ADD_DECL_S( bo_add_ ## suffix ## le, bo_set_ ## suffix ## le, type ) + +static inline bool bo_set_8(bo_t *p_bo, size_t i_offset, uint8_t i) +{ + if (!bo_extend(p_bo, i_offset + 1)) + return false; + p_bo->b->p_buffer[i_offset] = i; + return true; +} + +static inline bool bo_add_8(bo_t *p_bo, uint8_t i) +{ + if(!p_bo->b || !bo_set_8( p_bo, p_bo->b->i_buffer, i )) + return false; + p_bo->b->i_buffer++; + return true; +} + +/* declares all bo_[set,add]_[16,32,64] */ +BO_FUNC_DECL( 16, SetW, uint16_t ) +BO_FUNC_DECL( 32, SetDW, uint32_t ) +BO_FUNC_DECL( 64, SetQW, uint64_t ) + +#undef BO_FUNC_DECL +#undef BO_SET_DECL_S +#undef BO_ADD_DECL_S + +static inline bool bo_add_24be(bo_t *p_bo, uint32_t i) +{ + if(!p_bo->b || !bo_extend(p_bo, p_bo->b->i_buffer + 3)) + return false; + p_bo->b->p_buffer[p_bo->b->i_buffer++] = ((i >> 16) & 0xff); + p_bo->b->p_buffer[p_bo->b->i_buffer++] = ((i >> 8) & 0xff); + p_bo->b->p_buffer[p_bo->b->i_buffer++] = (i & 0xff); + return true; +} + +static inline void bo_swap_32be (bo_t *p_bo, size_t i_pos, uint32_t i) +{ + if (!p_bo->b || p_bo->b->i_buffer < i_pos + 4) + return; + p_bo->b->p_buffer[i_pos ] = (i >> 24)&0xff; + p_bo->b->p_buffer[i_pos + 1] = (i >> 16)&0xff; + p_bo->b->p_buffer[i_pos + 2] = (i >> 8)&0xff; + p_bo->b->p_buffer[i_pos + 3] = (i )&0xff; +} + +static inline bool bo_add_mem(bo_t *p_bo, size_t i_size, const void *p_mem) +{ + if(!p_bo->b || !bo_extend(p_bo, p_bo->b->i_buffer + i_size)) + return false; + memcpy(&p_bo->b->p_buffer[p_bo->b->i_buffer], p_mem, i_size); + p_bo->b->i_buffer += i_size; + return true; +} + +#define bo_add_fourcc(p_bo, fcc) bo_add_mem(p_bo, 4, fcc) + +#endif // VLC_BOXES_H diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_charset.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_charset.h new file mode 100644 index 0000000..1798b1c --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_charset.h @@ -0,0 +1,291 @@ +/***************************************************************************** + * vlc_charset.h: Unicode UTF-8 wrappers function + ***************************************************************************** + * Copyright (C) 2003-2005 VLC authors and VideoLAN + * Copyright © 2005-2010 Rémi Denis-Courmont + * $Id: 05092257a4a1f09451dc1e956d07b02093908dd4 $ + * + * Author: Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CHARSET_H +#define VLC_CHARSET_H 1 + +/** + * \file + * Characters sets handling + * + * \ingroup strings + * @{ + */ + +/** + * Decodes a code point from UTF-8. + * + * Converts the first character in a UTF-8 sequence into a Unicode code point. + * + * \param str an UTF-8 bytes sequence [IN] + * \param pwc address of a location to store the code point [OUT] + * + * \return the number of bytes occupied by the decoded code point + * + * \retval (size_t)-1 not a valid UTF-8 sequence + * \retval 0 null character (i.e. str points to an empty string) + * \retval 1 (non-null) ASCII character + * \retval 2-4 non-ASCII character + */ +VLC_API size_t vlc_towc(const char *str, uint32_t *pwc); + +/** + * Checks UTF-8 valiaodity. + * + * Checks whether a null-terminated string is a valid UTF-8 bytes sequence. + * + * \param str string to check + * + * \retval str the string is a valid null-terminated UTF-8 sequence + * \retval NULL the string is not an UTF-8 sequence + */ +VLC_USED static inline const char *IsUTF8(const char *str) +{ + size_t n; + uint32_t cp; + + while ((n = vlc_towc(str, &cp)) != 0) + if (likely(n != (size_t)-1)) + str += n; + else + return NULL; + return str; +} + +/** + * Removes non-UTF-8 sequences. + * + * Replaces invalid or over-long UTF-8 bytes sequences within a + * null-terminated string with question marks. This is so that the string can + * be printed at least partially. + * + * \warning Do not use this were correctness is critical. use IsUTF8() and + * handle the error case instead. This function is mainly for display or debug. + * + * \note Converting from Latin-1 to UTF-8 in place is not possible (the string + * size would be increased). So it is not attempted even if it would otherwise + * be less disruptive. + * + * \retval str the string is a valid null-terminated UTF-8 sequence + * (i.e. no changes were made) + * \retval NULL the string is not an UTF-8 sequence + */ +static inline char *EnsureUTF8(char *str) +{ + char *ret = str; + size_t n; + uint32_t cp; + + while ((n = vlc_towc(str, &cp)) != 0) + if (likely(n != (size_t)-1)) + str += n; + else + { + *str++ = '?'; + ret = NULL; + } + return ret; +} + +/* iconv wrappers (defined in src/extras/libc.c) */ +#define VLC_ICONV_ERR ((size_t) -1) +typedef void *vlc_iconv_t; +VLC_API vlc_iconv_t vlc_iconv_open( const char *, const char * ) VLC_USED; +VLC_API size_t vlc_iconv( vlc_iconv_t, const char **, size_t *, char **, size_t * ) VLC_USED; +VLC_API int vlc_iconv_close( vlc_iconv_t ); + +#include + +VLC_API int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap ); +VLC_API int utf8_fprintf( FILE *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API char * vlc_strcasestr(const char *, const char *) VLC_USED; + +VLC_API char * FromCharset( const char *charset, const void *data, size_t data_size ) VLC_USED; +VLC_API void * ToCharset( const char *charset, const char *in, size_t *outsize ) VLC_USED; + +#ifdef _WIN32 +VLC_USED +static inline char *FromWide (const wchar_t *wide) +{ + size_t len = WideCharToMultiByte (CP_UTF8, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) + return NULL; + + char *out = (char *)malloc (len); + + if (likely(out)) + WideCharToMultiByte (CP_UTF8, 0, wide, -1, out, len, NULL, NULL); + return out; +} + +VLC_USED +static inline wchar_t *ToWide (const char *utf8) +{ + int len = MultiByteToWideChar (CP_UTF8, 0, utf8, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *out = (wchar_t *)malloc (len * sizeof (wchar_t)); + + if (likely(out)) + MultiByteToWideChar (CP_UTF8, 0, utf8, -1, out, len); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *ToCodePage (unsigned cp, const char *utf8) +{ + wchar_t *wide = ToWide (utf8); + if (wide == NULL) + return NULL; + + size_t len = WideCharToMultiByte (cp, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) { + free(wide); + return NULL; + } + + char *out = (char *)malloc (len); + if (likely(out != NULL)) + WideCharToMultiByte (cp, 0, wide, -1, out, len, NULL, NULL); + free (wide); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *FromCodePage (unsigned cp, const char *mb) +{ + int len = MultiByteToWideChar (cp, 0, mb, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *wide = (wchar_t *)malloc (len * sizeof (wchar_t)); + if (unlikely(wide == NULL)) + return NULL; + MultiByteToWideChar (cp, 0, mb, -1, wide, len); + + char *utf8 = FromWide (wide); + free (wide); + return utf8; +} + +VLC_USED VLC_MALLOC +static inline char *FromANSI (const char *ansi) +{ + return FromCodePage (GetACP (), ansi); +} + +VLC_USED VLC_MALLOC +static inline char *ToANSI (const char *utf8) +{ + return ToCodePage (GetACP (), utf8); +} + +# ifdef UNICODE +# define FromT FromWide +# define ToT ToWide +# else +# define FromT FromANSI +# define ToT ToANSI +# endif +# define FromLocale FromANSI +# define ToLocale ToANSI +# define LocaleFree(s) free((char *)(s)) +# define FromLocaleDup FromANSI +# define ToLocaleDup ToANSI + +#elif defined(__OS2__) + +VLC_USED static inline char *FromLocale (const char *locale) +{ + return locale ? FromCharset ((char *)"", locale, strlen(locale)) : NULL; +} + +VLC_USED static inline char *ToLocale (const char *utf8) +{ + size_t outsize; + return utf8 ? (char *)ToCharset ("", utf8, &outsize) : NULL; +} + +VLC_USED static inline void LocaleFree (const char *str) +{ + free ((char *)str); +} + +VLC_USED static inline char *FromLocaleDup (const char *locale) +{ + return FromCharset ("", locale, strlen(locale)); +} + +VLC_USED static inline char *ToLocaleDup (const char *utf8) +{ + size_t outsize; + return (char *)ToCharset ("", utf8, &outsize); +} + +#else + +# define FromLocale(l) (l) +# define ToLocale(u) (u) +# define LocaleFree(s) ((void)(s)) +# define FromLocaleDup strdup +# define ToLocaleDup strdup +#endif + +/** + * Converts a nul-terminated string from ISO-8859-1 to UTF-8. + */ +static inline char *FromLatin1 (const char *latin) +{ + char *str = (char *)malloc (2 * strlen (latin) + 1), *utf8 = str; + unsigned char c; + + if (str == NULL) + return NULL; + + while ((c = *(latin++)) != '\0') + { + if (c >= 0x80) + { + *(utf8++) = 0xC0 | (c >> 6); + *(utf8++) = 0x80 | (c & 0x3F); + } + else + *(utf8++) = c; + } + *(utf8++) = '\0'; + + utf8 = (char *)realloc (str, utf8 - str); + return utf8 ? utf8 : str; +} + +/** @} */ + +VLC_API double us_strtod( const char *, char ** ) VLC_USED; +VLC_API float us_strtof( const char *, char ** ) VLC_USED; +VLC_API double us_atof( const char * ) VLC_USED; +VLC_API int us_vasprintf( char **, const char *, va_list ); +VLC_API int us_asprintf( char **, const char *, ... ) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_codec.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_codec.h new file mode 100644 index 0000000..6c77776 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_codec.h @@ -0,0 +1,422 @@ +/***************************************************************************** + * vlc_codec.h: Definition of the decoder and encoder structures + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * $Id: 3499ede27c1dbb94ff665a51d000c55bd45f2794 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CODEC_H +#define VLC_CODEC_H 1 + +#include + +#include +#include +#include +#include + +/** + * \defgroup codec Codec + * Decoders and encoders + * @{ + * \file + * Decoder and encoder modules interface + * + * \defgroup decoder Decoder + * Audio, video and text decoders + * @{ + */ + +typedef struct decoder_owner_sys_t decoder_owner_sys_t; + +typedef struct decoder_cc_desc_t decoder_cc_desc_t; + +/* + * BIG FAT WARNING : the code relies in the first 4 members of filter_t + * and decoder_t to be the same, so if you have anything to add, do it + * at the end of the structure. + */ +struct decoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + decoder_sys_t * p_sys; + + /* Input format ie from demuxer (XXX: a lot of field could be invalid) */ + es_format_t fmt_in; + + /* Output format of decoder/packetizer */ + es_format_t fmt_out; + + /* Tell the decoder if it is allowed to drop frames */ + bool b_frame_drop_allowed; + +# define VLCDEC_SUCCESS VLC_SUCCESS +# define VLCDEC_ECRITICAL VLC_EGENERIC +# define VLCDEC_RELOAD (-100) + /* This function is called to decode one packetized block. + * + * The module implementation will own the input block (p_block) and should + * process and release it. Depending of the decoder type, the module should + * send output frames/blocks via decoder_QueueVideo(), decoder_QueueAudio() + * or decoder_QueueSub(). + * + * If p_block is NULL, the decoder asks the module to drain itself. The + * module should return all available output frames/block via the queue + * functions. + * + * Return values can be: + * VLCDEC_SUCCESS: pf_decode will be called again + * VLCDEC_ECRITICAL: in case of critical error, pf_decode won't be called + * again. + * VLCDEC_RELOAD: Request that the decoder should be reloaded. The current + * module will be unloaded. Reloading a module may cause a loss of frames. + * When returning this status, the implementation shouldn't release or + * modify the p_block in argument (The same p_block will be feed to the + * next decoder module). + */ + int ( * pf_decode ) ( decoder_t *, block_t *p_block ); + + /* This function is called in a loop with the same pp_block argument until + * it returns NULL. This allows a module implementation to return more than + * one output blocks for one input block. + * + * pp_block or *pp_block can be NULL. + * + * If pp_block and *pp_block are not NULL, the module implementation will + * own the input block (*pp_block) and should process and release it. The + * module can also process a part of the block. In that case, it should + * modify (*pp_block)->p_buffer/i_buffer accordingly and return a valid + * output block. The module can also set *pp_block to NULL when the input + * block is consumed. + * + * If pp_block is not NULL but *pp_block is NULL, a previous call of the pf + * function has set the *pp_block to NULL. Here, the module can return new + * output block for the same, already processed, input block (the + * pf_packetize function will be called as long as the module return an + * output block). + * + * When the pf function returns NULL, the next call to this function will + * have a new a valid pp_block (if the packetizer is not drained). + * + * If pp_block is NULL, the packetizer asks the module to drain itself. In + * that case, the module has to return all output frames available (the + * pf_packetize function will be called as long as the module return an + * output block). + */ + block_t * ( * pf_packetize )( decoder_t *, block_t **pp_block ); + /* */ + void ( * pf_flush ) ( decoder_t * ); + + /* Closed Caption (CEA 608/708) extraction. + * If set, it *may* be called after pf_packetize returned data. It should + * return CC for the pictures returned by the last pf_packetize call only, + * channel bitmaps will be used to known which cc channel are present (but + * globaly, not necessary for the current packet. Video decoders should use + * the decoder_QueueCc() function to pass closed captions. */ + block_t * ( * pf_get_cc ) ( decoder_t *, decoder_cc_desc_t * ); + + /* Meta data at codec level + * The decoder owner set it back to NULL once it has retreived what it needs. + * The decoder owner is responsible of its release except when you overwrite it. + */ + vlc_meta_t *p_description; + + /* + * Owner fields + * XXX You MUST not use them directly. + */ + + /* Video output callbacks + * XXX use decoder_NewPicture */ + int (*pf_vout_format_update)( decoder_t * ); + picture_t *(*pf_vout_buffer_new)( decoder_t * ); + + /** + * Number of extra (ie in addition to the DPB) picture buffers + * needed for decoding. + */ + int i_extra_picture_buffers; + + /* Audio output callbacks */ + int (*pf_aout_format_update)( decoder_t * ); + + /* SPU output callbacks + * XXX use decoder_NewSubpicture */ + subpicture_t *(*pf_spu_buffer_new)( decoder_t *, const subpicture_updater_t * ); + + /* Input attachments + * XXX use decoder_GetInputAttachments */ + int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment ); + + /* Display date + * XXX use decoder_GetDisplayDate */ + mtime_t (*pf_get_display_date)( decoder_t *, mtime_t ); + + /* Display rate + * XXX use decoder_GetDisplayRate */ + int (*pf_get_display_rate)( decoder_t * ); + + /* XXX use decoder_QueueVideo or decoder_QueueVideoWithCc */ + int (*pf_queue_video)( decoder_t *, picture_t * ); + /* XXX use decoder_QueueAudio */ + int (*pf_queue_audio)( decoder_t *, block_t * ); + /* XXX use decoder_QueueCC */ + int (*pf_queue_cc)( decoder_t *, block_t *, const decoder_cc_desc_t * ); + /* XXX use decoder_QueueSub */ + int (*pf_queue_sub)( decoder_t *, subpicture_t *); + void *p_queue_ctx; + + /* Private structure for the owner of the decoder */ + decoder_owner_sys_t *p_owner; +}; + +/* struct for packetizer get_cc polling/decoder queue_cc + * until we have a proper metadata way */ +struct decoder_cc_desc_t +{ + uint8_t i_608_channels; /* 608 channels bitmap */ + uint64_t i_708_channels; /* 708 */ + int i_reorder_depth; /* reorder depth, -1 for no reorder, 0 for old P/B flag based */ +}; + +/** + * @} + */ + +/** + * \defgroup encoder Encoder + * Audio, video and text encoders + * @{ + */ + +struct encoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + encoder_sys_t * p_sys; + + /* Properties of the input data fed to the encoder */ + es_format_t fmt_in; + + /* Properties of the output of the encoder */ + es_format_t fmt_out; + + block_t * ( * pf_encode_video )( encoder_t *, picture_t * ); + block_t * ( * pf_encode_audio )( encoder_t *, block_t * ); + block_t * ( * pf_encode_sub )( encoder_t *, subpicture_t * ); + + /* Common encoder options */ + int i_threads; /* Number of threads to use during encoding */ + int i_iframes; /* One I frame per i_iframes */ + int i_bframes; /* One B frame per i_bframes */ + int i_tolerance; /* Bitrate tolerance */ + + /* Encoder config */ + config_chain_t *p_cfg; +}; + +/** + * @} + * + * \ingroup decoder + * @{ + */ + +/** + * Updates the video output format. + * + * This function notifies the video output pipeline of a new video output + * format (fmt_out.video). If there was no video output from the decoder so far + * or if the video output format has changed, a new video output will be set + * up. decoder_NewPicture() can then be used to allocate picture buffers. + * + * If the format is unchanged, this function has no effects and returns zero. + * + * \note + * This function is not reentrant. + * + * @return 0 if the video output was set up successfully, -1 otherwise. + */ +VLC_USED +static inline int decoder_UpdateVideoFormat( decoder_t *dec ) +{ + assert( dec->fmt_in.i_cat == VIDEO_ES ); + if( dec->fmt_in.i_cat == VIDEO_ES && dec->pf_vout_format_update != NULL ) + return dec->pf_vout_format_update( dec ); + else + return -1; +} + +/** + * Allocates an output picture buffer. + * + * This function pulls an output picture buffer for the decoder from the + * buffer pool of the video output. The picture must be released with + * picture_Release() when it is no longer referenced by the decoder. + * + * \note + * This function is reentrant. However, decoder_UpdateVideoFormat() cannot be + * used concurrently; the caller is responsible for serialization. + * + * \warning + * The behaviour is undefined if decoder_UpdateVideoFormat() was not called or + * if the last call returned an error. + * + * \return a picture buffer on success, NULL on error + */ +VLC_USED +static inline picture_t *decoder_NewPicture( decoder_t *dec ) +{ + return dec->pf_vout_buffer_new( dec ); +} + +/** + * Abort any calls of decoder_NewPicture + * + * If b_abort is true, all pending and futures calls of decoder_NewPicture + * will be aborted. This function can be used by asynchronous video decoders + * to unblock a thread that is waiting for a picture. + */ +VLC_API void decoder_AbortPictures( decoder_t *dec, bool b_abort ); + +/** + * This function queues a single picture to the video output. + * + * \note + * The caller doesn't own the picture anymore after this call (even in case of + * error). + * FIXME: input_DecoderFrameNext won't work if a module use this function. + * + * \return 0 if the picture is queued, -1 on error + */ +static inline int decoder_QueueVideo( decoder_t *dec, picture_t *p_pic ) +{ + assert( p_pic->p_next == NULL ); + assert( dec->pf_queue_video != NULL ); + return dec->pf_queue_video( dec, p_pic ); +} + +/** + * This function queues the Closed Captions + * + * \param dec the decoder object + * \param p_cc the closed-caption to queue + * \param p_desc decoder_cc_desc_t description structure + * \return 0 if queued, -1 on error + */ +static inline int decoder_QueueCc( decoder_t *dec, block_t *p_cc, + const decoder_cc_desc_t *p_desc ) +{ + if( dec->pf_queue_cc == NULL ) + { + block_Release( p_cc ); + return -1; + } + return dec->pf_queue_cc( dec, p_cc, p_desc ); +} + +/** + * This function queues a single audio block to the audio output. + * + * \note + * The caller doesn't own the audio block anymore after this call (even in case + * of error). + * + * \return 0 if the block is queued, -1 on error + */ +static inline int decoder_QueueAudio( decoder_t *dec, block_t *p_aout_buf ) +{ + assert( p_aout_buf->p_next == NULL ); + assert( dec->pf_queue_audio != NULL ); + return dec->pf_queue_audio( dec, p_aout_buf ); +} + +/** + * This function queues a single subtitle to the video output. + * + * \note + * The caller doesn't own the subtitle anymore after this call (even in case of + * error). + * + * \return 0 if the subtitle is queued, -1 on error + */ +static inline int decoder_QueueSub( decoder_t *dec, subpicture_t *p_spu ) +{ + assert( p_spu->p_next == NULL ); + assert( dec->pf_queue_sub != NULL ); + return dec->pf_queue_sub( dec, p_spu ); +} + +/** + * This function notifies the audio output pipeline of a new audio output + * format (fmt_out.audio). If there is currently no audio output or if the + * audio output format has changed, a new audio output will be set up. + * @return 0 if the audio output is working, -1 if not. */ +VLC_USED +static inline int decoder_UpdateAudioFormat( decoder_t *dec ) +{ + assert(dec->fmt_in.i_cat == AUDIO_ES); + if( dec->fmt_in.i_cat == AUDIO_ES && dec->pf_aout_format_update != NULL ) + return dec->pf_aout_format_update( dec ); + else + return -1; +} + +/** + * This function will return a new audio buffer usable by a decoder as an + * output buffer. It must be released with block_Release() or returned it to + * the caller as a decoder_QueueAudio parameter. + */ +VLC_API block_t * decoder_NewAudioBuffer( decoder_t *, int i_nb_samples ) VLC_USED; + +/** + * This function will return a new subpicture usable by a decoder as an output + * buffer. You have to release it using subpicture_Delete() or by returning + * it to the caller as a decoder_QueueSub parameter. + */ +VLC_API subpicture_t * decoder_NewSubpicture( decoder_t *, const subpicture_updater_t * ) VLC_USED; + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +VLC_API int decoder_GetInputAttachments( decoder_t *, input_attachment_t ***ppp_attachment, int *pi_attachment ); + +/** + * This function converts a decoder timestamp into a display date comparable + * to mdate(). + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API mtime_t decoder_GetDisplayDate( decoder_t *, mtime_t ) VLC_USED; + +/** + * This function returns the current input rate. + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API int decoder_GetDisplayRate( decoder_t * ) VLC_USED; + +/** @} */ +/** @} */ +#endif /* _VLC_CODEC_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_common.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_common.h new file mode 100644 index 0000000..12a36ec --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_common.h @@ -0,0 +1,1049 @@ +/***************************************************************************** + * vlc_common.h: common definitions + * Collection of useful common types and macros definitions + ***************************************************************************** + * Copyright (C) 1998-2011 VLC authors and VideoLAN + * + * Authors: Samuel Hocevar + * Vincent Seguin + * Gildas Bazin + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file is a collection of common definitions and types + */ + +#ifndef VLC_COMMON_H +# define VLC_COMMON_H 1 + +/***************************************************************************** + * Required vlc headers + *****************************************************************************/ +#include "vlc_config.h" + +/***************************************************************************** + * Required system headers + *****************************************************************************/ +#include +#include + +#include +#include +#include +#include + +#ifndef __cplusplus +# include +#endif + +/***************************************************************************** + * Compilers definitions + *****************************************************************************/ +/* Helper for GCC version checks */ +#ifdef __GNUC__ +# define VLC_GCC_VERSION(maj,min) \ + ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min))) +#else +# define VLC_GCC_VERSION(maj,min) (0) +#endif + +/* Try to fix format strings for all versions of mingw and mingw64 */ +#if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO ) + #undef PRId64 + #define PRId64 "lld" + #undef PRIi64 + #define PRIi64 "lli" + #undef PRIu64 + #define PRIu64 "llu" + #undef PRIo64 + #define PRIo64 "llo" + #undef PRIx64 + #define PRIx64 "llx" + #define snprintf __mingw_snprintf + #define vsnprintf __mingw_vsnprintf + #define swprintf _snwprintf +#endif + +/* Function attributes for compiler warnings */ +#ifdef __GNUC__ +# define VLC_DEPRECATED __attribute__((deprecated)) +# if VLC_GCC_VERSION(6,0) +# define VLC_DEPRECATED_ENUM __attribute__((deprecated)) +# else +# define VLC_DEPRECATED_ENUM +# endif + +# if defined( _WIN32 ) +# define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y))) +# else +# define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y))) +# endif +# define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x))) +# define VLC_MALLOC __attribute__ ((malloc)) +# define VLC_USED __attribute__ ((warn_unused_result)) + +#else +# define VLC_DEPRECATED +# define VLC_DEPRECATED_ENUM +# define VLC_FORMAT(x,y) +# define VLC_FORMAT_ARG(x) +# define VLC_MALLOC +# define VLC_USED +#endif + + +/* Branch prediction */ +#ifdef __GNUC__ +# define likely(p) __builtin_expect(!!(p), 1) +# define unlikely(p) __builtin_expect(!!(p), 0) +# define unreachable() __builtin_unreachable() +#else +# define likely(p) (!!(p)) +# define unlikely(p) (!!(p)) +# define unreachable() ((void)0) +#endif + +#define vlc_assert_unreachable() (assert(!"unreachable"), unreachable()) + +/* Linkage */ +#ifdef __cplusplus +# define VLC_EXTERN extern "C" +#else +# define VLC_EXTERN +#endif + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define VLC_EXPORT __declspec(dllexport) +#elif defined (__GNUC__) +# define VLC_EXPORT __attribute__((visibility("default"))) +#else +# define VLC_EXPORT +#endif + +#define VLC_API VLC_EXTERN VLC_EXPORT + + +/***************************************************************************** + * Basic types definitions + *****************************************************************************/ +/** + * High precision date or time interval + * + * Store a high precision date or time interval. The maximum precision is the + * microsecond, and a 64 bits integer is used to avoid overflows (maximum + * time interval is then 292271 years, which should be long enough for any + * video). Dates are stored as microseconds since a common date (usually the + * epoch). Note that date and time intervals can be manipulated using regular + * arithmetic operators, and that no special functions are required. + */ +typedef int64_t mtime_t; + +/** + * The vlc_fourcc_t type. + * + * See http://www.webartz.com/fourcc/ for a very detailed list. + */ +typedef uint32_t vlc_fourcc_t; + +#ifdef WORDS_BIGENDIAN +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \ + | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) ) + +#else +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \ + | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) ) + +#endif + +/** + * Translate a vlc_fourcc into its string representation. This function + * assumes there is enough room in psz_fourcc to store 4 characters in. + * + * \param fcc a vlc_fourcc_t + * \param psz_fourcc string to store string representation of vlc_fourcc in + */ +static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc ) +{ + memcpy( psz_fourcc, &fcc, 4 ); +} + +/***************************************************************************** + * Classes declaration + *****************************************************************************/ + +/* Internal types */ +typedef struct vlc_list_t vlc_list_t; +typedef struct vlc_object_t vlc_object_t; +typedef struct libvlc_int_t libvlc_int_t; +typedef struct date_t date_t; + +/* Playlist */ + +typedef struct playlist_t playlist_t; +typedef struct playlist_item_t playlist_item_t; +typedef struct services_discovery_t services_discovery_t; +typedef struct services_discovery_sys_t services_discovery_sys_t; +typedef struct vlc_renderer_discovery_t vlc_renderer_discovery_t; +typedef struct vlc_renderer_item_t vlc_renderer_item_t; + +/* Modules */ +typedef struct module_t module_t; +typedef struct module_config_t module_config_t; + +typedef struct config_category_t config_category_t; + +/* Input */ +typedef struct input_thread_t input_thread_t; +typedef struct input_item_t input_item_t; +typedef struct input_item_node_t input_item_node_t; +typedef struct access_sys_t access_sys_t; +typedef struct stream_t stream_t; +typedef struct stream_sys_t stream_sys_t; +typedef struct demux_t demux_t; +typedef struct demux_sys_t demux_sys_t; +typedef struct es_out_t es_out_t; +typedef struct es_out_id_t es_out_id_t; +typedef struct es_out_sys_t es_out_sys_t; +typedef struct seekpoint_t seekpoint_t; +typedef struct info_t info_t; +typedef struct info_category_t info_category_t; +typedef struct input_attachment_t input_attachment_t; + +/* Format */ +typedef struct audio_format_t audio_format_t; +typedef struct video_format_t video_format_t; +typedef struct subs_format_t subs_format_t; +typedef struct es_format_t es_format_t; +typedef struct video_palette_t video_palette_t; + +/* Audio */ +typedef struct audio_output audio_output_t; +typedef struct aout_sys_t aout_sys_t; +typedef audio_format_t audio_sample_format_t; + +/* Video */ +typedef struct vout_thread_t vout_thread_t; +typedef struct vlc_viewpoint_t vlc_viewpoint_t; + +typedef video_format_t video_frame_format_t; +typedef struct picture_t picture_t; +typedef struct picture_sys_t picture_sys_t; + +/* Subpictures */ +typedef struct spu_t spu_t; +typedef struct subpicture_t subpicture_t; +typedef struct subpicture_region_t subpicture_region_t; + +typedef struct image_handler_t image_handler_t; + +/* Stream output */ +typedef struct sout_instance_t sout_instance_t; + +typedef struct sout_input_t sout_input_t; +typedef struct sout_packetizer_input_t sout_packetizer_input_t; + +typedef struct sout_access_out_t sout_access_out_t; +typedef struct sout_access_out_sys_t sout_access_out_sys_t; + +typedef struct sout_mux_t sout_mux_t; +typedef struct sout_mux_sys_t sout_mux_sys_t; + +typedef struct sout_stream_t sout_stream_t; +typedef struct sout_stream_sys_t sout_stream_sys_t; + +typedef struct config_chain_t config_chain_t; +typedef struct session_descriptor_t session_descriptor_t; + +/* Decoders */ +typedef struct decoder_t decoder_t; +typedef struct decoder_sys_t decoder_sys_t; +typedef struct decoder_synchro_t decoder_synchro_t; + +/* Encoders */ +typedef struct encoder_t encoder_t; +typedef struct encoder_sys_t encoder_sys_t; + +/* Filters */ +typedef struct filter_t filter_t; +typedef struct filter_sys_t filter_sys_t; + +/* Network */ +typedef struct vlc_url_t vlc_url_t; + +/* Misc */ +typedef struct iso639_lang_t iso639_lang_t; + +/* block */ +typedef struct block_t block_t; +typedef struct block_fifo_t block_fifo_t; + +/* Hashing */ +typedef struct md5_s md5_t; + +/* XML */ +typedef struct xml_t xml_t; +typedef struct xml_sys_t xml_sys_t; +typedef struct xml_reader_t xml_reader_t; +typedef struct xml_reader_sys_t xml_reader_sys_t; + +/* vod server */ +typedef struct vod_t vod_t; +typedef struct vod_sys_t vod_sys_t; +typedef struct vod_media_t vod_media_t; + +/* VLM */ +typedef struct vlm_t vlm_t; +typedef struct vlm_message_t vlm_message_t; + +/* misc */ +typedef struct vlc_meta_t vlc_meta_t; +typedef struct input_stats_t input_stats_t; +typedef struct addon_entry_t addon_entry_t; + +/* Update */ +typedef struct update_t update_t; + +/** + * VLC value structure + */ +typedef union +{ + int64_t i_int; + bool b_bool; + float f_float; + char * psz_string; + void * p_address; + vlc_list_t * p_list; + struct { int32_t x; int32_t y; } coords; + +} vlc_value_t; + +/** + * VLC list structure + */ +struct vlc_list_t +{ + int i_type; + int i_count; + vlc_value_t *p_values; +}; + +/***************************************************************************** + * Error values (shouldn't be exposed) + *****************************************************************************/ +#define VLC_SUCCESS (-0) /**< No error */ +#define VLC_EGENERIC (-1) /**< Unspecified error */ +#define VLC_ENOMEM (-2) /**< Not enough memory */ +#define VLC_ETIMEOUT (-3) /**< Timeout */ +#define VLC_ENOMOD (-4) /**< Module not found */ +#define VLC_ENOOBJ (-5) /**< Object not found */ +#define VLC_ENOVAR (-6) /**< Variable not found */ +#define VLC_EBADVAR (-7) /**< Bad variable value */ +#define VLC_ENOITEM (-8) /**< Item not found */ + +/***************************************************************************** + * Variable callbacks: called when the value is modified + *****************************************************************************/ +typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ + char const *, /* variable name */ + vlc_value_t, /* old value */ + vlc_value_t, /* new value */ + void * ); /* callback data */ + +/***************************************************************************** + * List callbacks: called when elements are added/removed from the list + *****************************************************************************/ +typedef int ( * vlc_list_callback_t ) ( vlc_object_t *, /* variable's object */ + char const *, /* variable name */ + int, /* VLC_VAR_* action */ + vlc_value_t *, /* new/deleted value */ + void *); /* callback data */ + +/***************************************************************************** + * OS-specific headers and thread types + *****************************************************************************/ +#if defined( _WIN32 ) +# include +# ifndef PATH_MAX +# define PATH_MAX MAX_PATH +# endif +# include +#endif + +#ifdef __APPLE__ +#include +#include +#endif + +#ifdef __OS2__ +# define OS2EMX_PLAIN_CHAR +# define INCL_BASE +# define INCL_PM +# include +# include +#endif + +#include "vlc_mtime.h" +#include "vlc_threads.h" + +/** + * Common structure members + *****************************************************************************/ + +/** + * VLC object common members + * + * Common public properties for all VLC objects. + * Object also have private properties maintained by the core, see + * \ref vlc_object_internals_t + */ +struct vlc_common_members +{ + /** Object type name + * + * A constant string identifying the type of the object (for logging) + */ + const char *object_type; + + /** Log messages header + * + * Human-readable header for log messages. This is not thread-safe and + * only used by VLM and Lua interfaces. + */ + char *header; + + int flags; + + /** Module probe flag + * + * A boolean during module probing when the probe is "forced". + * See \ref module_need(). + */ + bool force; + + /** LibVLC instance + * + * Root VLC object of the objects tree that this object belongs in. + */ + libvlc_int_t *libvlc; + + /** Parent object + * + * The parent VLC object in the objects tree. For the root (the LibVLC + * instance) object, this is NULL. + */ + vlc_object_t *parent; +}; + +/** + * Backward compatibility macro + */ +#define VLC_COMMON_MEMBERS struct vlc_common_members obj; + +/** + * Type-safe vlc_object_t cast + * + * This macro attempts to cast a pointer to a compound type to a + * \ref vlc_object_t pointer in a type-safe manner. + * It checks if the compound type actually starts with an embedded + * \ref vlc_object_t structure. + */ +#if !defined(__cplusplus) +# define VLC_OBJECT(x) \ + _Generic((x)->obj, \ + struct vlc_common_members: (vlc_object_t *)(&(x)->obj), \ + const struct vlc_common_members: (const vlc_object_t *)(&(x)->obj) \ + ) +#else +# define VLC_OBJECT( x ) ((vlc_object_t *)&(x)->obj) +#endif + +/***************************************************************************** + * Macros and inline functions + *****************************************************************************/ + +/* __MAX and __MIN: self explanatory */ +#ifndef __MAX +# define __MAX(a, b) ( ((a) > (b)) ? (a) : (b) ) +#endif +#ifndef __MIN +# define __MIN(a, b) ( ((a) < (b)) ? (a) : (b) ) +#endif + +/* clip v in [min, max] */ +#define VLC_CLIP(v, min, max) __MIN(__MAX((v), (min)), (max)) + +VLC_USED +static inline int64_t GCD ( int64_t a, int64_t b ) +{ + while( b ) + { + int64_t c = a % b; + a = b; + b = c; + } + return a; +} + +/* function imported from libavutil/common.h */ +VLC_USED +static inline uint8_t clip_uint8_vlc( int32_t a ) +{ + if( a&(~255) ) return (-a)>>31; + else return a; +} + +/** Count leading zeroes */ +VLC_USED +static inline unsigned (clz)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_clz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x >>= 1; + i--; + } + return i; +#endif +} + +#define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8)) +#define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8)) +/* XXX: this assumes that int is 32-bits or more */ +#define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8)) + +/** Count trailing zeroes */ +VLC_USED +static inline unsigned (ctz)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_ctz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x <<= 1; + i--; + } + return i; +#endif +} + +#if !defined(__NetBSD__) +/** Bit weight */ +VLC_USED +static inline unsigned (popcount)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_popcount (x); +#else + unsigned count = 0; + while (x) + { + count += x & 1; + x = x >> 1; + } + return count; +#endif +} + +/** Bit weight of long long */ +VLC_USED +static inline int (popcountll)(unsigned long long x) +{ +#ifdef __GNUC__ + return __builtin_popcountll(x); +#else + int count = 0; + while (x) + { + count += x & 1; + x = x >> 1; + } + return count; +#endif +} +#endif + +VLC_USED +static inline unsigned (parity)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_parity (x); +#else + for (unsigned i = 4 * sizeof (x); i > 0; i /= 2) + x ^= x >> i; + return x & 1; +#endif +} + +#if !defined(__NetBSD__) +/** Byte swap (16 bits) */ +VLC_USED +static inline uint16_t (bswap16)(uint16_t x) +{ + return (x << 8) | (x >> 8); +} + +/** Byte swap (32 bits) */ +VLC_USED +static inline uint32_t (bswap32)(uint32_t x) +{ +#if defined (__GNUC__) || defined(__clang__) + return __builtin_bswap32 (x); +#else + return ((x & 0x000000FF) << 24) + | ((x & 0x0000FF00) << 8) + | ((x & 0x00FF0000) >> 8) + | ((x & 0xFF000000) >> 24); +#endif +} + +/** Byte swap (64 bits) */ +VLC_USED +static inline uint64_t (bswap64)(uint64_t x) +{ +#if defined (__GNUC__) || defined(__clang__) + return __builtin_bswap64 (x); +#elif !defined (__cplusplus) + return ((x & 0x00000000000000FF) << 56) + | ((x & 0x000000000000FF00) << 40) + | ((x & 0x0000000000FF0000) << 24) + | ((x & 0x00000000FF000000) << 8) + | ((x & 0x000000FF00000000) >> 8) + | ((x & 0x0000FF0000000000) >> 24) + | ((x & 0x00FF000000000000) >> 40) + | ((x & 0xFF00000000000000) >> 56); +#else + return ((x & 0x00000000000000FFULL) << 56) + | ((x & 0x000000000000FF00ULL) << 40) + | ((x & 0x0000000000FF0000ULL) << 24) + | ((x & 0x00000000FF000000ULL) << 8) + | ((x & 0x000000FF00000000ULL) >> 8) + | ((x & 0x0000FF0000000000ULL) >> 24) + | ((x & 0x00FF000000000000ULL) >> 40) + | ((x & 0xFF00000000000000ULL) >> 56); +#endif +} +#endif + +/* Integer overflow */ +static inline bool uadd_overflow(unsigned a, unsigned b, unsigned *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_uadd_overflow(a, b, res); +#else + *res = a + b; + return (a + b) < a; +#endif +} + +static inline bool uaddl_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_uaddl_overflow(a, b, res); +#else + *res = a + b; + return (a + b) < a; +#endif +} + +static inline bool uaddll_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_uaddll_overflow(a, b, res); +#else + *res = a + b; + return (a + b) < a; +#endif +} + +#ifndef __cplusplus +# define add_overflow(a,b,r) \ + _Generic(*(r), \ + unsigned: uadd_overflow(a, b, (unsigned *)(r)), \ + unsigned long: uaddl_overflow(a, b, (unsigned long *)(r)), \ + unsigned long long: uaddll_overflow(a, b, (unsigned long long *)(r))) +#else +static inline bool add_overflow(unsigned a, unsigned b, unsigned *res) +{ + return uadd_overflow(a, b, res); +} + +static inline bool add_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ + return uaddl_overflow(a, b, res); +} + +static inline bool add_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ + return uaddll_overflow(a, b, res); +} +#endif + +#if !(VLC_GCC_VERSION(5,0) || defined(__clang__)) +# include +#endif + +static inline bool umul_overflow(unsigned a, unsigned b, unsigned *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_umul_overflow(a, b, res); +#else + *res = a * b; + return b > 0 && a > (UINT_MAX / b); +#endif +} + +static inline bool umull_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_umull_overflow(a, b, res); +#else + *res = a * b; + return b > 0 && a > (ULONG_MAX / b); +#endif +} + +static inline bool umulll_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_umulll_overflow(a, b, res); +#else + *res = a * b; + return b > 0 && a > (ULLONG_MAX / b); +#endif +} + +#ifndef __cplusplus +#define mul_overflow(a,b,r) \ + _Generic(*(r), \ + unsigned: umul_overflow(a, b, (unsigned *)(r)), \ + unsigned long: umull_overflow(a, b, (unsigned long *)(r)), \ + unsigned long long: umulll_overflow(a, b, (unsigned long long *)(r))) +#else +static inline bool mul_overflow(unsigned a, unsigned b, unsigned *res) +{ + return umul_overflow(a, b, res); +} + +static inline bool mul_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ + return umull_overflow(a, b, res); +} + +static inline bool mul_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ + return umulll_overflow(a, b, res); +} +#endif + +/* Free and set set the variable to NULL */ +#define FREENULL(a) do { free( a ); a = NULL; } while(0) + +#define EMPTY_STR(str) (!str || !*str) + +VLC_API char const * vlc_error( int ) VLC_USED; + +#include + +/* MSB (big endian)/LSB (little endian) conversions - network order is always + * MSB, and should be used for both network communications and files. */ + +#ifdef WORDS_BIGENDIAN +# define hton16(i) ((uint16_t)(i)) +# define hton32(i) ((uint32_t)(i)) +# define hton64(i) ((uint64_t)(i)) +#else +# define hton16(i) bswap16(i) +# define hton32(i) bswap32(i) +# define hton64(i) bswap64(i) +#endif +#define ntoh16(i) hton16(i) +#define ntoh32(i) hton32(i) +#define ntoh64(i) hton64(i) + +/** Reads 16 bits in network byte order */ +VLC_USED +static inline uint16_t U16_AT (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh16 (x); +} + +/** Reads 32 bits in network byte order */ +VLC_USED +static inline uint32_t U32_AT (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh32 (x); +} + +/** Reads 64 bits in network byte order */ +VLC_USED +static inline uint64_t U64_AT (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh64 (x); +} + +#define GetWBE(p) U16_AT(p) +#define GetDWBE(p) U32_AT(p) +#define GetQWBE(p) U64_AT(p) + +/** Reads 16 bits in little-endian order */ +VLC_USED +static inline uint16_t GetWLE (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap16 (x); +#endif + return x; +} + +/** Reads 32 bits in little-endian order */ +VLC_USED +static inline uint32_t GetDWLE (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap32 (x); +#endif + return x; +} + +/** Reads 64 bits in little-endian order */ +VLC_USED +static inline uint64_t GetQWLE (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap64 (x); +#endif + return x; +} + +/** Writes 16 bits in network byte order */ +static inline void SetWBE (void *p, uint16_t w) +{ + w = hton16 (w); + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in network byte order */ +static inline void SetDWBE (void *p, uint32_t dw) +{ + dw = hton32 (dw); + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in network byte order */ +static inline void SetQWBE (void *p, uint64_t qw) +{ + qw = hton64 (qw); + memcpy (p, &qw, sizeof (qw)); +} + +/** Writes 16 bits in little endian order */ +static inline void SetWLE (void *p, uint16_t w) +{ +#ifdef WORDS_BIGENDIAN + w = bswap16 (w); +#endif + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in little endian order */ +static inline void SetDWLE (void *p, uint32_t dw) +{ +#ifdef WORDS_BIGENDIAN + dw = bswap32 (dw); +#endif + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in little endian order */ +static inline void SetQWLE (void *p, uint64_t qw) +{ +#ifdef WORDS_BIGENDIAN + qw = bswap64 (qw); +#endif + memcpy (p, &qw, sizeof (qw)); +} + +/* */ +#define VLC_UNUSED(x) (void)(x) + +/* Stuff defined in src/extras/libc.c */ + +#if defined(_WIN32) +/* several type definitions */ +# if defined( __MINGW32__ ) +# if !defined( _OFF_T_ ) + typedef long long _off_t; + typedef _off_t off_t; +# define _OFF_T_ +# else +# ifdef off_t +# undef off_t +# endif +# define off_t long long +# endif +# endif + +# ifndef O_NONBLOCK +# define O_NONBLOCK 0 +# endif + +# include +#endif /* _WIN32 */ + +typedef struct { + unsigned num, den; +} vlc_rational_t; + +VLC_API bool vlc_ureduce( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ); + +#define container_of(ptr, type, member) \ + ((type *)(((char *)(ptr)) - offsetof(type, member))) + +VLC_USED VLC_MALLOC +static inline void *vlc_alloc(size_t count, size_t size) +{ + return mul_overflow(count, size, &size) ? NULL : malloc(size); +} + +/***************************************************************************** + * I18n stuff + *****************************************************************************/ +VLC_API char *vlc_gettext( const char *msgid ) VLC_FORMAT_ARG(1); +VLC_API char *vlc_ngettext( const char *s, const char *p, unsigned long n ) VLC_FORMAT_ARG(1) VLC_FORMAT_ARG(2); + +#define vlc_pgettext( ctx, id ) \ + vlc_pgettext_aux( ctx "\004" id, id ) + +VLC_FORMAT_ARG(2) +static inline const char *vlc_pgettext_aux( const char *ctx, const char *id ) +{ + const char *tr = vlc_gettext( ctx ); + return (tr == ctx) ? id : tr; +} + +/***************************************************************************** + * Loosy memory allocation functions. Do not use in new code. + *****************************************************************************/ +static inline void *xmalloc(size_t len) +{ + void *ptr = malloc(len); + if (unlikely(ptr == NULL && len > 0)) + abort(); + return ptr; +} + +static inline void *xrealloc(void *ptr, size_t len) +{ + void *nptr = realloc(ptr, len); + if (unlikely(nptr == NULL && len > 0)) + abort(); + return nptr; +} + +static inline void *xcalloc(size_t n, size_t size) +{ + void *ptr = calloc(n, size); + if (unlikely(ptr == NULL && (n > 0 || size > 0))) + abort (); + return ptr; +} + +static inline char *xstrdup (const char *str) +{ + char *ptr = strdup (str); + if (unlikely(ptr == NULL)) + abort (); + return ptr; +} + +/***************************************************************************** + * libvlc features + *****************************************************************************/ +VLC_API const char * VLC_CompileBy( void ) VLC_USED; +VLC_API const char * VLC_CompileHost( void ) VLC_USED; +VLC_API const char * VLC_Compiler( void ) VLC_USED; + +/***************************************************************************** + * Additional vlc stuff + *****************************************************************************/ +#include "vlc_messages.h" +#include "vlc_objects.h" +#include "vlc_variables.h" +#include "vlc_main.h" +#include "vlc_configuration.h" + +#if defined( _WIN32 ) || defined( __OS2__ ) +# define DIR_SEP_CHAR '\\' +# define DIR_SEP "\\" +# define PATH_SEP_CHAR ';' +# define PATH_SEP ";" +#else +# define DIR_SEP_CHAR '/' +# define DIR_SEP "/" +# define PATH_SEP_CHAR ':' +# define PATH_SEP ":" +#endif + +#define LICENSE_MSG \ + _("This program comes with NO WARRANTY, to the extent permitted by " \ + "law.\nYou may redistribute it under the terms of the GNU General " \ + "Public License;\nsee the file named COPYING for details.\n" \ + "Written by the VideoLAN team; see the AUTHORS file.\n") + +#endif /* !VLC_COMMON_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_config.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_config.h new file mode 100644 index 0000000..50b4887 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_config.h @@ -0,0 +1,114 @@ +/***************************************************************************** + * vlc_config.h: limits and configuration + * Defines all compilation-time configuration constants and size limits + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines of values used in interface, vout, aout and vlc core functions. + */ + +/* Conventions regarding names of symbols and variables + * ---------------------------------------------------- + * + * - Symbols should begin with a prefix indicating in which module they are + * used, such as INTF_, VOUT_ or AOUT_. + */ + +/***************************************************************************** + * General configuration + *****************************************************************************/ + +/* All timestamp below or equal to this define are invalid/unset + * XXX the numerical value is 0 because of historical reason and will change.*/ +#define VLC_TS_INVALID INT64_C(0) +#define VLC_TS_0 INT64_C(1) + +#define CLOCK_FREQ INT64_C(1000000) + +/***************************************************************************** + * Interface configuration + *****************************************************************************/ + +/* Base delay in micro second for interface sleeps */ +#define INTF_IDLE_SLEEP (CLOCK_FREQ/20) + +/***************************************************************************** + * Input thread configuration + *****************************************************************************/ + +/* Used in ErrorThread */ +#define INPUT_IDLE_SLEEP (CLOCK_FREQ/10) + +/* + * General limitations + */ + +/* Duration between the time we receive the data packet, and the time we will + * mark it to be presented */ +#define DEFAULT_PTS_DELAY (3*CLOCK_FREQ/10) + +/***************************************************************************** + * SPU configuration + *****************************************************************************/ + +/* Buffer must avoid arriving more than SPU_MAX_PREPARE_TIME in advanced to + * the SPU */ +#define SPU_MAX_PREPARE_TIME (CLOCK_FREQ/2) + +/***************************************************************************** + * Video configuration + *****************************************************************************/ + +/* + * Default settings for video output threads + */ + +/* Multiplier value for aspect ratio calculation (2^7 * 3^3 * 5^3) */ +#define VOUT_ASPECT_FACTOR 432000 + +/* Maximum width of a scaled source picture - this should be relatively high, + * since higher stream values will result in no display at all. */ +#define VOUT_MAX_WIDTH 4096 + +/* Number of planes in a picture */ +#define VOUT_MAX_PLANES 5 + +/* + * Time settings + */ + +/* Time to sleep when waiting for a buffer (from vout or the video fifo). + * It should be approximately the time needed to perform a complete picture + * loop. Since it only happens when the video heap is full, it does not need + * to be too low, even if it blocks the decoder. */ +#define VOUT_OUTMEM_SLEEP (CLOCK_FREQ/50) + +/* The default video output window title */ +#define VOUT_TITLE "VLC" + +/***************************************************************************** + * Messages and console interfaces configuration + *****************************************************************************/ + +/* Maximal depth of the object tree output by vlc_dumpstructure */ +#define MAX_DUMPSTRUCTURE_DEPTH 100 diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_config_cat.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_config_cat.h new file mode 100644 index 0000000..e35345b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_config_cat.h @@ -0,0 +1,271 @@ +/***************************************************************************** + * vlc_config_cat.h : Definition of configuration categories + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 55d2e468d1ccc3fcd8d165dcecc10ec753021a5e $ + * + * Authors: Clément Stenac + * Anil Daoud + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HELP_H +#define VLC_HELP_H 1 +# include + +/* + * First, we need help strings for the General Settings and for the + * Plugins screen + */ +#define MAIN_TITLE N_( "VLC preferences" ) +#define MAIN_HELP N_( \ + "Select \"Advanced Options\" to see all options." ) + +/* Interface */ +#define INTF_TITLE N_("Interface") +#define INTF_HELP N_( "Settings for VLC's interfaces" ) + +#define INTF_GENERAL_HELP N_( "Main interfaces settings" ) + +#define INTF_MAIN_TITLE N_( "Main interfaces" ) +#define INTF_MAIN_HELP N_( "Settings for the main interface" ) + +#define INTF_CONTROL_TITLE N_( "Control interfaces" ) +#define INTF_CONTROL_HELP N_( "Settings for VLC's control interfaces" ) + +#define INTF_HOTKEYS_TITLE N_( "Hotkeys settings" ) +#define INTF_HOTKEYS_HELP N_( "Hotkeys settings" ) + +/* Audio */ +#define AUDIO_TITLE N_( "Audio" ) +#define AUDIO_HELP N_( "Audio settings" ) + +#define AUDIO_GENERAL_HELP N_("General audio settings") + +#define AFILTER_TITLE N_("Filters") +#define AFILTER_HELP N_( "Audio filters are used to process the audio stream." ) + +#define ARESAMPLER_TITLE N_("Audio resampler") + +#define AVISUAL_TITLE N_("Visualizations") +#define AVISUAL_HELP N_( "Audio visualizations" ) + +#define AOUT_TITLE N_( "Output modules" ) +#define AOUT_HELP N_("General settings for audio output modules.") + +#define AMISC_TITLE N_("Miscellaneous") +#define AMISC_HELP N_( "Miscellaneous audio settings and modules." ) + +/* Video */ +#define VIDEO_TITLE N_("Video") +#define VIDEO_HELP N_("Video settings") + +#define VIDEO_GENERAL_HELP N_( "General video settings" ) + +#define _VOUT_TITLE N_("Output modules" ) +#define VOUT_HELP N_("General settings for video output modules.") + +#define VFILTER_TITLE N_("Filters" ) +#define VFILTER_HELP N_("Video filters are used to process the video stream." ) + +#define SUBPIC_TITLE N_( "Subtitles / OSD") +#define SUBPIC_HELP N_( "Settings related to On-Screen-Display,"\ + " subtitles and \"overlay subpictures\"") + +#define SPLITTER_TITLE N_("Splitters") +#define SPLITTER_HELP N_("Video splitters separate the stream into multiple videos.") + +/* +#define TEXT_HELP N_( \ + "Use the settings of the \"freetype\" module to choose the font you " \ + "want VLC to use for text rendering (to display subtitles for example).") +*/ +/* Input */ +#define INPUT_TITLE N_( "Input / Codecs" ) +#define INPUT_HELP N_( "Settings for input, demultiplexing, " \ + "decoding and encoding") + +#define ACCESS_TITLE N_( "Access modules" ) +#define ACCESS_HELP N_( \ + "Settings related to the various access methods. " \ + "Common settings you may want to alter are HTTP proxy or " \ + "caching settings." ) + +#define STREAM_FILTER_TITLE N_( "Stream filters" ) +#define STREAM_FILTER_HELP N_( \ + "Stream filters are special modules that allow advanced operations on " \ + "the input side of VLC. Use with care..." ) + +#define DEMUX_TITLE N_("Demuxers") +#define DEMUX_HELP N_( "Demuxers are used to separate audio and video streams." ) + +#define VDEC_TITLE N_( "Video codecs" ) +#define VDEC_HELP N_( "Settings for the video, images or video+audio decoders and encoders." ) + +#define ADEC_TITLE N_( "Audio codecs" ) +#define ADEC_HELP N_( "Settings for the audio-only decoders and encoders." ) + +#define SDEC_TITLE N_( "Subtitle codecs") +#define SDEC_HELP N_( "Settings for subtitle, teletext and CC decoders and encoders." ) + +#define ADVANCED_HELP N_( "General input settings. Use with care..." ) + +/* Sout */ +#define SOUT_TITLE N_( "Stream output" ) +#define SOUT_HELP N_( \ + "Stream output settings are used when acting as a streaming server " \ + "or when saving incoming streams.\n" \ + "Streams are first muxed and then sent through an \"access output\" "\ + "module that can either save the stream to a file, or stream " \ + "it (UDP, HTTP, RTP/RTSP).\n" \ + "Sout streams modules allow advanced stream processing (transcoding, "\ + "duplicating...).") + +#define SOUT_GENERAL_HELP N_( "General stream output settings") + +#define SOUT_MUX_TITLE N_( "Muxers" ) +#define SOUT_MUX_HELP N_( \ + "Muxers create the encapsulation formats that are used to " \ + "put all the elementary streams (video, audio, ...) " \ + "together. This setting allows you to always force a specific muxer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each muxer." ) + +#define SOUT_ACO_TITLE N_( "Access output" ) +#define SOUT_ACO_HELP N_( \ + "Access output modules control the ways the muxed streams are sent. " \ + "This setting allows you to always force a specific access output method. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each access output.") + +#define SOUT_PACKET_TITLE N_( "Packetizers" ) +#define SOUT_PACKET_HELP N_( \ + "Packetizers are used to \"preprocess\" the elementary "\ + "streams before muxing. " \ + "This setting allows you to always force a packetizer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each packetizer." ) + +#define SOUT_STREAM_TITLE N_("Sout stream") +#define SOUT_STREAM_HELP N_( "Sout stream modules allow to build a sout " \ + "processing chain. Please refer to the Streaming Howto for " \ + "more information. You can configure default options for " \ + "each sout stream module here.") + +#define SOUT_VOD_TITLE N_( "VOD" ) +#define SOUT_VOD_HELP N_( "VLC's implementation of Video On Demand" ) + + +/* Playlist */ +#define PLAYLIST_TITLE N_( "Playlist" ) +#define PLAYLIST_HELP N_( "Settings related to playlist behaviour " \ + "(e.g. playback mode) and to modules that automatically add "\ + "items to the playlist (\"service discovery\" modules).") + +#define PGENERAL_HELP N_( "General playlist behaviour") +#define SD_TITLE N_("Services discovery") +#define SD_HELP N_("Services discovery modules are facilities "\ + "that automatically add items to playlist.") + +/* Advanced */ +#define AADVANCED_TITLE N_( "Advanced" ) +#define AADVANCED_HELP N_( "Advanced settings. Use with care...") + +#define MISC_TITLE N_( "Advanced settings" ) + +/* This function is deprecated and is kept only for compatibility */ +static const struct config_category_t categories_array[] = +{ + /* Interface */ + { CAT_INTERFACE, INTF_TITLE, INTF_HELP }, + { SUBCAT_INTERFACE_GENERAL, INTF_TITLE, INTF_GENERAL_HELP }, + { SUBCAT_INTERFACE_MAIN, INTF_MAIN_TITLE, INTF_MAIN_HELP }, + { SUBCAT_INTERFACE_CONTROL, INTF_CONTROL_TITLE, INTF_CONTROL_HELP }, + { SUBCAT_INTERFACE_HOTKEYS, INTF_HOTKEYS_TITLE, INTF_HOTKEYS_HELP }, + + { CAT_AUDIO, AUDIO_TITLE, AUDIO_HELP }, + { SUBCAT_AUDIO_GENERAL, AUDIO_TITLE, AUDIO_GENERAL_HELP }, + { SUBCAT_AUDIO_AOUT, AOUT_TITLE, AOUT_HELP }, + { SUBCAT_AUDIO_AFILTER, AFILTER_TITLE, AFILTER_HELP }, + { SUBCAT_AUDIO_RESAMPLER, ARESAMPLER_TITLE, AFILTER_HELP }, + { SUBCAT_AUDIO_VISUAL, AVISUAL_TITLE, AVISUAL_HELP }, + { SUBCAT_AUDIO_MISC, AMISC_TITLE, AMISC_HELP }, + + { CAT_VIDEO, VIDEO_TITLE, VIDEO_HELP }, + { SUBCAT_VIDEO_GENERAL, VIDEO_TITLE, VIDEO_GENERAL_HELP }, + { SUBCAT_VIDEO_VOUT, _VOUT_TITLE, VOUT_HELP }, + { SUBCAT_VIDEO_VFILTER, VFILTER_TITLE, VFILTER_HELP }, + { SUBCAT_VIDEO_SUBPIC, SUBPIC_TITLE, SUBPIC_HELP }, + { SUBCAT_VIDEO_SPLITTER, SPLITTER_TITLE, SPLITTER_HELP }, + + { CAT_INPUT, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_GENERAL, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_ACCESS, ACCESS_TITLE, ACCESS_HELP }, + { SUBCAT_INPUT_DEMUX, DEMUX_TITLE, DEMUX_HELP }, + { SUBCAT_INPUT_VCODEC, VDEC_TITLE, VDEC_HELP }, + { SUBCAT_INPUT_ACODEC, ADEC_TITLE, ADEC_HELP }, + { SUBCAT_INPUT_SCODEC, SDEC_TITLE, SDEC_HELP }, + { SUBCAT_INPUT_STREAM_FILTER, STREAM_FILTER_TITLE, STREAM_FILTER_HELP }, + + { CAT_SOUT, SOUT_TITLE, SOUT_HELP }, + { SUBCAT_SOUT_GENERAL, SOUT_TITLE, SOUT_GENERAL_HELP }, + { SUBCAT_SOUT_STREAM, SOUT_STREAM_TITLE, SOUT_STREAM_HELP }, + { SUBCAT_SOUT_MUX, SOUT_MUX_TITLE, SOUT_MUX_HELP }, + { SUBCAT_SOUT_ACO, SOUT_ACO_TITLE, SOUT_ACO_HELP }, + { SUBCAT_SOUT_PACKETIZER, SOUT_PACKET_TITLE, SOUT_PACKET_HELP }, + { SUBCAT_SOUT_VOD, SOUT_VOD_TITLE, SOUT_VOD_HELP }, + + { CAT_PLAYLIST, PLAYLIST_TITLE , PLAYLIST_HELP }, + { SUBCAT_PLAYLIST_GENERAL, PLAYLIST_TITLE, PGENERAL_HELP }, + { SUBCAT_PLAYLIST_SD, SD_TITLE, SD_HELP }, + + { CAT_ADVANCED, AADVANCED_TITLE, AADVANCED_HELP }, + { SUBCAT_ADVANCED_MISC, MISC_TITLE, AADVANCED_HELP }, + + { -1, NULL, NULL } +}; + +VLC_USED +static inline const char *config_CategoryNameGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_name != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_name); + } + i++; + } + return NULL; +} + +VLC_USED +static inline const char *config_CategoryHelpGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_help != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_help); + } + i++; + } + return NULL; +} + +#endif /* VLC_HELP_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_configuration.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_configuration.h new file mode 100644 index 0000000..067b8d1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_configuration.h @@ -0,0 +1,237 @@ +/***************************************************************************** + * vlc_configuration.h : configuration management module + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: 209168615be2a7bc5db889282b32389093ab262e $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CONFIGURATION_H +#define VLC_CONFIGURATION_H 1 + +/** + * \file + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + */ + +#include /* for ssize_t */ + +# ifdef __cplusplus +extern "C" { +# endif + +struct config_category_t +{ + int i_id; + const char *psz_name; + const char *psz_help; +}; + +typedef union +{ + char *psz; + int64_t i; + float f; +} module_value_t; + +typedef int (*vlc_string_list_cb)(vlc_object_t *, const char *, + char ***, char ***); +typedef int (*vlc_integer_list_cb)(vlc_object_t *, const char *, + int64_t **, char ***); + +struct module_config_t +{ + uint8_t i_type; /* Configuration type */ + char i_short; /* Optional short option name */ + unsigned b_advanced:1; /* Advanced option */ + unsigned b_internal:1; /* Hidden from prefs and help */ + unsigned b_unsaveable:1; /* Not stored in configuration */ + unsigned b_safe:1; /* Safe in web plugins and playlists */ + unsigned b_removed:1; /* Deprecated */ + + const char *psz_type; /* Configuration subtype */ + const char *psz_name; /* Option name */ + const char *psz_text; /* Short comment on the configuration option */ + const char *psz_longtext; /* Long comment on the configuration option */ + + module_value_t value; /* Option value */ + module_value_t orig; + module_value_t min; + module_value_t max; + + /* Values list */ + uint16_t list_count; /* Options list size */ + union + { + const char **psz; /* List of possible values for the option */ + const int *i; + vlc_string_list_cb psz_cb; + vlc_integer_list_cb i_cb; + } list; + const char **list_text; /* Friendly names for list values */ + const char *list_cb_name; + void *owner; +}; + +/***************************************************************************** + * Prototypes - these methods are used to get, set or manipulate configuration + * data. + *****************************************************************************/ +VLC_API int config_GetType(const char *) VLC_USED; +VLC_API int64_t config_GetInt(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutInt(vlc_object_t *, const char *, int64_t); +VLC_API float config_GetFloat(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutFloat(vlc_object_t *, const char *, float); +VLC_API char * config_GetPsz(vlc_object_t *, const char *) VLC_USED VLC_MALLOC; +VLC_API void config_PutPsz(vlc_object_t *, const char *, const char *); +VLC_API int config_GetIntChoices(vlc_object_t *, const char *, + int64_t **, char ***) VLC_USED; +VLC_API int config_GetPszChoices(vlc_object_t *, const char *, + char ***, char ***) VLC_USED; + +VLC_API int config_SaveConfigFile( vlc_object_t * ); +#define config_SaveConfigFile(a) config_SaveConfigFile(VLC_OBJECT(a)) + +VLC_API void config_ResetAll( vlc_object_t * ); +#define config_ResetAll(a) config_ResetAll(VLC_OBJECT(a)) + +VLC_API module_config_t * config_FindConfig(const char *) VLC_USED; +VLC_API char * config_GetDataDir(void) VLC_USED VLC_MALLOC; +VLC_API char *config_GetLibDir(void) VLC_USED; + +typedef enum vlc_userdir +{ + VLC_HOME_DIR, /* User's home */ + VLC_CONFIG_DIR, /* VLC-specific configuration directory */ + VLC_DATA_DIR, /* VLC-specific data directory */ + VLC_CACHE_DIR, /* VLC-specific user cached data directory */ + /* Generic directories (same as XDG) */ + VLC_DESKTOP_DIR=0x80, + VLC_DOWNLOAD_DIR, + VLC_TEMPLATES_DIR, + VLC_PUBLICSHARE_DIR, + VLC_DOCUMENTS_DIR, + VLC_MUSIC_DIR, + VLC_PICTURES_DIR, + VLC_VIDEOS_DIR, +} vlc_userdir_t; + +VLC_API char * config_GetUserDir( vlc_userdir_t ) VLC_USED VLC_MALLOC; + +VLC_API void config_AddIntf( vlc_object_t *, const char * ); +VLC_API void config_RemoveIntf( vlc_object_t *, const char * ); +VLC_API bool config_ExistIntf( vlc_object_t *, const char * ) VLC_USED; + +#define config_GetInt(a,b) config_GetInt(VLC_OBJECT(a),b) +#define config_PutInt(a,b,c) config_PutInt(VLC_OBJECT(a),b,c) +#define config_GetFloat(a,b) config_GetFloat(VLC_OBJECT(a),b) +#define config_PutFloat(a,b,c) config_PutFloat(VLC_OBJECT(a),b,c) +#define config_GetPsz(a,b) config_GetPsz(VLC_OBJECT(a),b) +#define config_PutPsz(a,b,c) config_PutPsz(VLC_OBJECT(a),b,c) + +#define config_AddIntf(a,b) config_AddIntf(VLC_OBJECT(a),b) +#define config_RemoveIntf(a,b) config_RemoveIntf(VLC_OBJECT(a),b) +#define config_ExistIntf(a,b) config_ExistIntf(VLC_OBJECT(a),b) + +/**************************************************************************** + * config_chain_t: + ****************************************************************************/ +struct config_chain_t +{ + config_chain_t *p_next; /**< Pointer on the next config_chain_t element */ + + char *psz_name; /**< Option name */ + char *psz_value; /**< Option value */ +}; + +/** + * This function will + * - create all options in the array ppsz_options (var_Create). + * - parse the given linked list of config_chain_t and set the value (var_Set). + * + * The option names will be created by adding the psz_prefix prefix. + */ +VLC_API void config_ChainParse( vlc_object_t *, const char *psz_prefix, const char *const *ppsz_options, config_chain_t * ); +#define config_ChainParse( a, b, c, d ) config_ChainParse( VLC_OBJECT(a), b, c, d ) + +/** + * This function will parse a configuration string (psz_opts) and + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*} + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API const char *config_ChainParseOptions( config_chain_t **pp_cfg, const char *ppsz_opts ); + +/** + * This function will parse a configuration string (psz_string) and + * - set the module name (*ppsz_name) + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*}[:modulenext{option=*,...}] + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API char *config_ChainCreate( char **ppsz_name, config_chain_t **pp_cfg, const char *psz_string ) VLC_USED VLC_MALLOC; + +/** + * This function will release a linked list of config_chain_t + * (Including the head) + */ +VLC_API void config_ChainDestroy( config_chain_t * ); + +/** + * This function will duplicate a linked list of config_chain_t + */ +VLC_API config_chain_t * config_ChainDuplicate( const config_chain_t * ) VLC_USED VLC_MALLOC; + +/** + * This function will unescape a string in place and will return a pointer on + * the given string. + * No memory is allocated by it (unlike config_StringEscape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The following sequences will be unescaped (only one time): + * \\ \' and \" + */ +VLC_API char * config_StringUnescape( char *psz_string ); + +/** + * This function will escape a string that can be unescaped by + * config_StringUnescape. + * The returned value is allocated by it. You have to free it once you + * do not need it anymore (unlike config_StringUnescape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The escaped characters are ' " and \ + */ +VLC_API char * config_StringEscape( const char *psz_string ) VLC_USED VLC_MALLOC; + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_CONFIGURATION_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_cpu.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_cpu.h new file mode 100644 index 0000000..b2f0f45 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_cpu.h @@ -0,0 +1,192 @@ +/***************************************************************************** + * vlc_cpu.h: CPU capabilities + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file provides CPU features detection. + */ + +#ifndef VLC_CPU_H +# define VLC_CPU_H 1 + +VLC_API unsigned vlc_CPU(void); + +# if defined (__i386__) || defined (__x86_64__) +# define HAVE_FPU 1 +# define VLC_CPU_MMX 0x00000008 +# define VLC_CPU_3dNOW 0x00000010 +# define VLC_CPU_MMXEXT 0x00000020 +# define VLC_CPU_SSE 0x00000040 +# define VLC_CPU_SSE2 0x00000080 +# define VLC_CPU_SSE3 0x00000100 +# define VLC_CPU_SSSE3 0x00000200 +# define VLC_CPU_SSE4_1 0x00000400 +# define VLC_CPU_SSE4_2 0x00000800 +# define VLC_CPU_SSE4A 0x00001000 +# define VLC_CPU_AVX 0x00002000 +# define VLC_CPU_AVX2 0x00004000 +# define VLC_CPU_XOP 0x00008000 +# define VLC_CPU_FMA4 0x00010000 + +# if defined (__MMX__) +# define vlc_CPU_MMX() (1) +# define VLC_MMX +# else +# define vlc_CPU_MMX() ((vlc_CPU() & VLC_CPU_MMX) != 0) +# define VLC_MMX __attribute__ ((__target__ ("mmx"))) +# endif + +# if defined (__SSE__) +# define vlc_CPU_MMXEXT() (1) +# define vlc_CPU_SSE() (1) +# define VLC_SSE +# else +# define vlc_CPU_MMXEXT() ((vlc_CPU() & VLC_CPU_MMXEXT) != 0) +# define vlc_CPU_SSE() ((vlc_CPU() & VLC_CPU_SSE) != 0) +# define VLC_SSE __attribute__ ((__target__ ("sse"))) +# endif + +# ifdef __SSE2__ +# define vlc_CPU_SSE2() (1) +# else +# define vlc_CPU_SSE2() ((vlc_CPU() & VLC_CPU_SSE2) != 0) +# endif + +# ifdef __SSE3__ +# define vlc_CPU_SSE3() (1) +# else +# define vlc_CPU_SSE3() ((vlc_CPU() & VLC_CPU_SSE3) != 0) +# endif + +# ifdef __SSSE3__ +# define vlc_CPU_SSSE3() (1) +# else +# define vlc_CPU_SSSE3() ((vlc_CPU() & VLC_CPU_SSSE3) != 0) +# endif + +# ifdef __SSE4_1__ +# define vlc_CPU_SSE4_1() (1) +# else +# define vlc_CPU_SSE4_1() ((vlc_CPU() & VLC_CPU_SSE4_1) != 0) +# endif + +# ifdef __SSE4_2__ +# define vlc_CPU_SSE4_2() (1) +# else +# define vlc_CPU_SSE4_2() ((vlc_CPU() & VLC_CPU_SSE4_2) != 0) +# endif + +# ifdef __SSE4A__ +# define vlc_CPU_SSE4A() (1) +# else +# define vlc_CPU_SSE4A() ((vlc_CPU() & VLC_CPU_SSE4A) != 0) +# endif + +# ifdef __AVX__ +# define vlc_CPU_AVX() (1) +# else +# define vlc_CPU_AVX() ((vlc_CPU() & VLC_CPU_AVX) != 0) +# endif + +# ifdef __AVX2__ +# define vlc_CPU_AVX2() (1) +# else +# define vlc_CPU_AVX2() ((vlc_CPU() & VLC_CPU_AVX2) != 0) +# endif + +# ifdef __3dNOW__ +# define vlc_CPU_3dNOW() (1) +# else +# define vlc_CPU_3dNOW() ((vlc_CPU() & VLC_CPU_3dNOW) != 0) +# endif + +# ifdef __XOP__ +# define vlc_CPU_XOP() (1) +# else +# define vlc_CPU_XOP() ((vlc_CPU() & VLC_CPU_XOP) != 0) +# endif + +# ifdef __FMA4__ +# define vlc_CPU_FMA4() (1) +# else +# define vlc_CPU_FMA4() ((vlc_CPU() & VLC_CPU_FMA4) != 0) +# endif + +# elif defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__) +# define HAVE_FPU 1 +# define VLC_CPU_ALTIVEC 2 + +# ifdef ALTIVEC +# define vlc_CPU_ALTIVEC() (1) +# else +# define vlc_CPU_ALTIVEC() ((vlc_CPU() & VLC_CPU_ALTIVEC) != 0) +# endif + +# elif defined (__arm__) +# if defined (__VFP_FP__) && !defined (__SOFTFP__) +# define HAVE_FPU 1 +# else +# define HAVE_FPU 0 +# endif +# define VLC_CPU_ARMv6 4 +# define VLC_CPU_ARM_NEON 2 + +# if defined (__ARM_ARCH_7A__) +# define VLC_CPU_ARM_ARCH 7 +# elif defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6T2__) +# define VLC_CPU_ARM_ARCH 6 +# else +# define VLC_CPU_ARM_ARCH 4 +# endif + +# if (VLC_CPU_ARM_ARCH >= 6) +# define vlc_CPU_ARMv6() (1) +# else +# define vlc_CPU_ARMv6() ((vlc_CPU() & VLC_CPU_ARMv6) != 0) +# endif + +# ifdef __ARM_NEON__ +# define vlc_CPU_ARM_NEON() (1) +# else +# define vlc_CPU_ARM_NEON() ((vlc_CPU() & VLC_CPU_ARM_NEON) != 0) +# endif + +# elif defined (__aarch64__) +# define HAVE_FPU 1 +// NEON is mandatory for general purpose ARMv8-a CPUs +# define vlc_CPU_ARM64_NEON() (1) + +# elif defined (__sparc__) +# define HAVE_FPU 1 + +# elif defined (__mips_hard_float) +# define HAVE_FPU 1 + +# else +/** + * Are single precision floating point operations "fast"? + * If this preprocessor constant is zero, floating point should be avoided + * (especially relevant for audio codecs). + */ +# define HAVE_FPU 0 + +# endif + +#endif /* !VLC_CPU_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_demux.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_demux.h new file mode 100644 index 0000000..74bd29a --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_demux.h @@ -0,0 +1,525 @@ +/***************************************************************************** + * vlc_demux.h: Demuxer descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2005 VLC authors and VideoLAN + * $Id: f359f547fa79d9818ed74420d906a6683be3d037 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DEMUX_H +#define VLC_DEMUX_H 1 + +#include +#include + +#include +#include +#include + +/** + * \defgroup demux Demultiplexer + * \ingroup input + * Demultiplexers (file format parsers) + * @{ + * \file + * Demultiplexer modules interface + */ + +struct demux_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* eg informative but needed (we can have access+demux) */ + char *psz_access; + char *psz_demux; + char *psz_location; + char *psz_file; + + union { + /** + * Input stream + * + * Depending on the module capability: + * - "demux": input byte stream (not NULL) + * - "access_demux": a NULL pointer + * - "demux_filter": undefined + */ + stream_t *s; + /** + * Input demuxer + * + * If the module capability is "demux_filter", this is the upstream + * demuxer or demux filter. Otherwise, this is undefined. + */ + demux_t *p_next; + }; + + /* es output */ + es_out_t *out; /* our p_es_out */ + + bool b_preparsing; /* True if the demux is used to preparse */ + + /* set by demuxer */ + int (*pf_demux) ( demux_t * ); /* demux one frame only */ + int (*pf_control)( demux_t *, int i_query, va_list args); + + /* Demux has to maintain them uptodate + * when it is responsible of seekpoint/title */ + struct + { + unsigned int i_update; /* Demux sets them on change, + Input removes them once take into account*/ + /* Seekpoint/Title at demux level */ + int i_title; /* idem, start from 0 (could be menu) */ + int i_seekpoint; /* idem, start from 0 */ + } info; + demux_sys_t *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/* pf_demux return values */ +#define VLC_DEMUXER_EOF 0 +#define VLC_DEMUXER_EGENERIC -1 +#define VLC_DEMUXER_SUCCESS 1 + +/* demux_t.info.i_update field */ +#define INPUT_UPDATE_TITLE 0x0010 +#define INPUT_UPDATE_SEEKPOINT 0x0020 +#define INPUT_UPDATE_META 0x0040 +#define INPUT_UPDATE_TITLE_LIST 0x0100 + +/* demux_meta_t is returned by "meta reader" module to the demuxer */ +typedef struct demux_meta_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; /***< the input item that is being read */ + + vlc_meta_t *p_meta; /**< meta data */ + + int i_attachments; /**< number of attachments */ + input_attachment_t **attachments; /**< array of attachments */ +} demux_meta_t; + +/** + * Control query identifiers for use with demux_t.pf_control + * + * In the individual identifier description, the input stream refers to + * demux_t.s if non-NULL, and the output refers to demux_t.out. + * + * A demuxer is synchronous if it only accesses its input stream and the + * output from within its demux_t callbacks, i.e. demux.pf_demux and + * demux_t.pf_control. + * + * A demuxer is threaded if it accesses either or both input and output + * asynchronously. + * + * An access-demuxer is a demuxer without input, i.e. demux_t.s == NULL). + */ +enum demux_query_e +{ + /** Checks whether the stream supports seeking. + * Can fail if seeking is not supported (same as returning false). + * \bug Failing should not be allowed. + * + * arg1 = bool * */ + DEMUX_CAN_SEEK, + + /** Checks whether (long) pause then stream resumption is supported. + * Can fail only if synchronous and not an access-demuxer. The + * underlying input stream then determines if pause is supported. + * \bug Failing should not be allowed. + * + * arg1= bool * */ + DEMUX_CAN_PAUSE = 0x002, + + /** Whether the stream can be read at an arbitrary pace. + * Cannot fail. + * + * arg1= bool * */ + DEMUX_CAN_CONTROL_PACE, + + /** Retrieves the PTS delay (roughly the default buffer duration). + * Can fail only if synchronous and not an access-demuxer. The + * underlying input stream then determines the PTS delay. + * + * arg1= int64_t * */ + DEMUX_GET_PTS_DELAY = 0x101, + + /** Retrieves stream meta-data. + * Should fail if no meta-data were retrieved. + * + * arg1= vlc_meta_t * */ + DEMUX_GET_META = 0x105, + + /** Retrieves an estimate of signal quality and strength. + * Can fail. + * + * arg1=double *quality, arg2=double *strength */ + DEMUX_GET_SIGNAL = 0x107, + + /** Sets the paused or playing/resumed state. + * + * Streams are initially in playing state. The control always specifies a + * change from paused to playing (false) or from playing to paused (true) + * and streams are initially playing; a no-op cannot be requested. + * + * The control is never used if DEMUX_CAN_PAUSE fails. + * Can fail. + * + * arg1= bool */ + DEMUX_SET_PAUSE_STATE = 0x200, + + /** Seeks to the beginning of a title. + * + * The control is never used if DEMUX_GET_TITLE_INFO fails. + * Can fail. + * + * arg1= int */ + DEMUX_SET_TITLE, + + /** Seeks to the beginning of a chapter of the current title. + * + * The control is never used if DEMUX_GET_TITLE_INFO fails. + * Can fail. + * + * arg1= int */ + DEMUX_SET_SEEKPOINT, /* arg1= int can fail */ + + /** Check which INPUT_UPDATE_XXX flag is set and reset the ones set. + * + * The unsigned* argument is set with the flags needed to be checked, + * on return it contains the values that were reset during the call + * + * This can can fail, in which case flags from demux_t.info.i_update + * are read/reset + * + * arg1= unsigned * */ + DEMUX_TEST_AND_CLEAR_FLAGS, /* arg1= unsigned* can fail */ + + /** Read the title number currently playing + * + * Can fail, in which case demux_t.info.i_title is used + * + * arg1= int * */ + DEMUX_GET_TITLE, /* arg1= int* can fail */ + + /* Read the seekpoint/chapter currently playing + * + * Can fail, in which case demux_t.info.i_seekpoint is used + * + * arg1= int * */ + DEMUX_GET_SEEKPOINT, /* arg1= int* can fail */ + + /* I. Common queries to access_demux and demux */ + /* POSITION double between 0.0 and 1.0 */ + DEMUX_GET_POSITION = 0x300, /* arg1= double * res= */ + DEMUX_SET_POSITION, /* arg1= double arg2= bool b_precise res=can fail */ + + /* LENGTH/TIME in microsecond, 0 if unknown */ + DEMUX_GET_LENGTH, /* arg1= int64_t * res= */ + DEMUX_GET_TIME, /* arg1= int64_t * res= */ + DEMUX_SET_TIME, /* arg1= int64_t arg2= bool b_precise res=can fail */ + + /** + * \todo Document + * + * \warning The prototype is different from STREAM_GET_TITLE_INFO + * + * Can fail, meaning there is only one title and one chapter. + * + * arg1= input_title_t ***, arg2=int *, arg3=int *pi_title_offset(0), + * arg4= int *pi_seekpoint_offset(0) */ + DEMUX_GET_TITLE_INFO, + + /* DEMUX_SET_GROUP/SET_ES only a hint for demuxer (mainly DVB) to allow not + * reading everything (you should not use this to call es_out_Control) + * if you don't know what to do with it, just IGNORE it, it is safe(r) + * -1 means all group, 0 default group (first es added) */ + DEMUX_SET_GROUP, /* arg1= int, arg2=const vlc_list_t * can fail */ + DEMUX_SET_ES, /* arg1= int can fail */ + + /* Ask the demux to demux until the given date at the next pf_demux call + * but not more (and not less, at the precision available of course). + * XXX: not mandatory (except for subtitle demux) but will help a lot + * for multi-input + */ + DEMUX_SET_NEXT_DEMUX_TIME, /* arg1= int64_t can fail */ + /* FPS for correct subtitles handling */ + DEMUX_GET_FPS, /* arg1= double * res=can fail */ + + /* Meta data */ + DEMUX_HAS_UNSUPPORTED_META, /* arg1= bool * res can fail */ + + /* Attachments */ + DEMUX_GET_ATTACHMENTS, /* arg1=input_attachment_t***, int* res=can fail */ + + /* RECORD you are ensured that it is never called twice with the same state + * you should accept it only if the stream can be recorded without + * any modification or header addition. */ + DEMUX_CAN_RECORD, /* arg1=bool* res=can fail(assume false) */ + /** + * \todo Document + * + * \warning The prototype is different from STREAM_SET_RECORD_STATE + * + * The control is never used if DEMUX_CAN_RECORD fails or returns false. + * Can fail. + * + * arg1= bool */ + DEMUX_SET_RECORD_STATE, + + /* II. Specific access_demux queries */ + + /* DEMUX_CAN_CONTROL_RATE is called only if DEMUX_CAN_CONTROL_PACE has + * returned false. *pb_rate should be true when the rate can be changed + * (using DEMUX_SET_RATE). */ + DEMUX_CAN_CONTROL_RATE, /* arg1= bool*pb_rate */ + /* DEMUX_SET_RATE is called only if DEMUX_CAN_CONTROL_RATE has returned true. + * It should return the value really used in *pi_rate */ + DEMUX_SET_RATE, /* arg1= int*pi_rate can fail */ + + /** Checks whether the stream is actually a playlist, rather than a real + * stream. + * + * \warning The prototype is different from STREAM_IS_DIRECTORY. + * + * Can fail if the stream is not a playlist (same as returning false). + * + * arg1= bool * */ + DEMUX_IS_PLAYLIST, + + /* Menu (VCD/DVD/BD) Navigation */ + /** Activate the navigation item selected. Can fail */ + DEMUX_NAV_ACTIVATE, + /** Use the up arrow to select a navigation item above. Can fail */ + DEMUX_NAV_UP, + /** Use the down arrow to select a navigation item under. Can fail */ + DEMUX_NAV_DOWN, + /** Use the left arrow to select a navigation item on the left. Can fail */ + DEMUX_NAV_LEFT, + /** Use the right arrow to select a navigation item on the right. Can fail */ + DEMUX_NAV_RIGHT, + /** Activate the popup Menu (for BD). Can fail */ + DEMUX_NAV_POPUP, + /** Activate disc Root Menu. Can fail */ + DEMUX_NAV_MENU, /* res=can fail */ + /** Enable/Disable a demux filter + * \warning This has limited support, and is likely to break if more than + * a single demux_filter is present in the chain. This is not guaranteed to + * work in future VLC versions, nor with all demux filters + */ + DEMUX_FILTER_ENABLE, + DEMUX_FILTER_DISABLE +}; + +/************************************************************************* + * Main Demux + *************************************************************************/ + +/* stream_t *s could be null and then it mean a access+demux in one */ +VLC_API demux_t *demux_New( vlc_object_t *p_obj, const char *psz_name, + const char *psz_path, stream_t *s, es_out_t *out ); + +VLC_API void demux_Delete( demux_t * ); + + +VLC_API int demux_vaControlHelper( stream_t *, int64_t i_start, int64_t i_end, + int64_t i_bitrate, int i_align, int i_query, va_list args ); + +VLC_USED static inline int demux_Demux( demux_t *p_demux ) +{ + if( !p_demux->pf_demux ) + return VLC_DEMUXER_SUCCESS; + + return p_demux->pf_demux( p_demux ); +} + +VLC_API int demux_vaControl( demux_t *p_demux, int i_query, va_list args ); + +static inline int demux_Control( demux_t *p_demux, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = demux_vaControl( p_demux, i_query, args ); + va_end( args ); + return i_result; +} + +/************************************************************************* + * Miscellaneous helpers for demuxers + *************************************************************************/ + +static inline void demux_UpdateTitleFromStream( demux_t *demux ) +{ + stream_t *s = demux->s; + unsigned title, seekpoint; + + if( vlc_stream_Control( s, STREAM_GET_TITLE, &title ) == VLC_SUCCESS + && title != (unsigned)demux->info.i_title ) + { + demux->info.i_title = title; + demux->info.i_update |= INPUT_UPDATE_TITLE; + } + + if( vlc_stream_Control( s, STREAM_GET_SEEKPOINT, + &seekpoint ) == VLC_SUCCESS + && seekpoint != (unsigned)demux->info.i_seekpoint ) + { + demux->info.i_seekpoint = seekpoint; + demux->info.i_update |= INPUT_UPDATE_SEEKPOINT; + } +} + +VLC_USED +static inline bool demux_IsPathExtension( demux_t *p_demux, const char *psz_extension ) +{ + const char *name = (p_demux->psz_file != NULL) ? p_demux->psz_file + : p_demux->psz_location; + const char *psz_ext = strrchr ( name, '.' ); + if( !psz_ext || strcasecmp( psz_ext, psz_extension ) ) + return false; + return true; +} + +VLC_USED +static inline bool demux_IsContentType(demux_t *demux, const char *type) +{ + return stream_IsMimeType(demux->s, type); +} + +VLC_USED +static inline bool demux_IsForced( demux_t *p_demux, const char *psz_name ) +{ + if( !p_demux->psz_demux || strcmp( p_demux->psz_demux, psz_name ) ) + return false; + return true; +} + +/** + * This function will create a packetizer suitable for a demuxer that parses + * elementary stream. + * + * The provided es_format_t will be cleaned on error or by + * demux_PacketizerDestroy. + */ +VLC_API decoder_t * demux_PacketizerNew( demux_t *p_demux, es_format_t *p_fmt, const char *psz_msg ) VLC_USED; + +/** + * This function will destroy a packetizer create by demux_PacketizerNew. + */ +VLC_API void demux_PacketizerDestroy( decoder_t *p_packetizer ); + +/* */ +#define DEMUX_INIT_COMMON() do { \ + p_demux->pf_control = Control; \ + p_demux->pf_demux = Demux; \ + p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) ); \ + if( !p_demux->p_sys ) return VLC_ENOMEM;\ + } while(0) + +/** + * \defgroup chained_demux Chained demultiplexer + * Demultiplexers wrapped by another demultiplexer + * @{ + */ + +typedef struct vlc_demux_chained_t vlc_demux_chained_t; + +/** + * Creates a chained demuxer. + * + * This creates a thread running a demuxer whose input stream is generated + * directly by the caller. This typically handles some sort of stream within a + * stream, e.g. MPEG-TS within something else. + * + * \note There are a number of limitations to this approach. The chained + * demuxer is run asynchronously in a separate thread. Most demuxer controls + * are synchronous and therefore unavailable in this case. Also the input + * stream is a simple FIFO, so the chained demuxer cannot perform seeks. + * Lastly, most errors cannot be detected. + * + * \param parent parent VLC object + * \param name chained demux module name (e.g. "ts") + * \param out elementary stream output for the chained demux + * \return a non-NULL pointer on success, NULL on failure. + */ +VLC_API vlc_demux_chained_t *vlc_demux_chained_New(vlc_object_t *parent, + const char *name, + es_out_t *out); + +/** + * Destroys a chained demuxer. + * + * Sends an end-of-stream to the chained demuxer, and releases all underlying + * allocated resources. + */ +VLC_API void vlc_demux_chained_Delete(vlc_demux_chained_t *); + +/** + * Sends data to a chained demuxer. + * + * This queues data for a chained demuxer to consume. + * + * \param block data block to queue + */ +VLC_API void vlc_demux_chained_Send(vlc_demux_chained_t *, block_t *block); + +/** + * Controls a chained demuxer. + * + * This performs a demux (i.e. DEMUX_...) control request on a chained + * demux. + * + * \note In most cases, vlc_demux_chained_Control() should be used instead. + * \warning As per vlc_demux_chained_New(), most demux controls are not, and + * cannot be, supported; VLC_EGENERIC is returned. + * + * \param query demux control (see \ref demux_query_e) + * \param args variable arguments (depending on the query) + */ +VLC_API int vlc_demux_chained_ControlVa(vlc_demux_chained_t *, int query, + va_list args); + +static inline int vlc_demux_chained_Control(vlc_demux_chained_t *dc, int query, + ...) +{ + va_list ap; + int ret; + + va_start(ap, query); + ret = vlc_demux_chained_ControlVa(dc, query, ap); + va_end(ap); + return ret; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_dialog.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_dialog.h new file mode 100644 index 0000000..23df3cb --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_dialog.h @@ -0,0 +1,483 @@ +/***************************************************************************** + * vlc_dialog.h: user interaction dialogs + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DIALOG_H_ +#define VLC_DIALOG_H_ +# include + +typedef struct vlc_dialog_provider vlc_dialog_provider; +typedef struct vlc_dialog_id vlc_dialog_id; +typedef struct extension_dialog_t extension_dialog_t; + +/* Called from src/libvlc.c */ +int +libvlc_InternalDialogInit(libvlc_int_t *p_libvlc); + +/* Called from src/libvlc.c */ +void +libvlc_InternalDialogClean(libvlc_int_t *p_libvlc); + +/** + * @defgroup vlc_dialog VLC dialog + * @ingroup interface + * @{ + * @file + * This file declares VLC dialog functions + * @defgroup vlc_dialog_api VLC dialog functions + * In order to interact with the user + * @{ + */ + +/** + * Dialog question type, see vlc_dialog_wait_question() + */ +typedef enum vlc_dialog_question_type +{ + VLC_DIALOG_QUESTION_NORMAL, + VLC_DIALOG_QUESTION_WARNING, + VLC_DIALOG_QUESTION_CRITICAL, +} vlc_dialog_question_type; + +/** + * Sends an error message + * + * This function returns immediately + * + * @param p_obj the VLC object emitting the error + * @param psz_title title of the error dialog + * @param psz_fmt format string for the error message + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_display_error(vlc_object_t *p_obj, const char *psz_title, + const char *psz_fmt, ...) VLC_FORMAT(3,4); +#define vlc_dialog_display_error(a, b, c, ...) \ + vlc_dialog_display_error(VLC_OBJECT(a), b, c, ##__VA_ARGS__) + +/** + * Sends an error message + * + * Equivalent to vlc_dialog_display_error() expect that it's called with a + * va_list. + */ +VLC_API int +vlc_dialog_display_error_va(vlc_object_t *p_obj, const char *psz_title, + const char *psz_fmt, va_list ap); + +/** + * Requests an user name and a password + * + * This function waits until the user dismisses the dialog or responds. It's + * interruptible via vlc_interrupt. In that case, vlc_dialog_cbs.pf_cancel() + * will be invoked. If p_store is not NULL, the user will be asked to store the + * password or not. + * + * @param p_obj the VLC object emitting the dialog + * @param ppsz_username a pointer to the user name provided by the user, it + * must be freed with free() on success + * @param ppsz_password a pointer to the password provided by the user, it must + * be freed with free() on success + * @param p_store a pointer to the store answer provided by the user (optional) + * @param psz_default_username default user name proposed + * @param psz_title title of the login dialog + * @param psz_fmt format string for the login message + * @return < 0 on error, 0 if the user cancelled it, and 1 if ppsz_username and + * ppsz_password are valid. + */ +VLC_API int +vlc_dialog_wait_login(vlc_object_t *p_obj, char **ppsz_username, + char **ppsz_password, bool *p_store, + const char *psz_default_username, + const char *psz_title, const char *psz_fmt, ...) + VLC_FORMAT(7,8); +#define vlc_dialog_wait_login(a, b, c, d, e, f, g, ...) \ + vlc_dialog_wait_login(VLC_OBJECT(a), b, c, d, e, f, g, ##__VA_ARGS__) + +/** + * Requests an user name and a password + * + * Equivalent to vlc_dialog_wait_login() expect that it's called with a + * va_list. + */ +VLC_API int +vlc_dialog_wait_login_va(vlc_object_t *p_obj, char **ppsz_username, + char **ppsz_password, bool *p_store, + const char *psz_default_username, + const char *psz_title, const char *psz_fmt, va_list ap); + +/** + * Asks a total (Yes/No/Cancel) question + * + * This function waits until the user dismisses the dialog or responds. It's + * interruptible via vlc_interrupt. In that case, vlc_dialog_cbs.pf_cancel() + * will be invoked. The psz_cancel is mandatory since this dialog is always + * cancellable by the user. + * + * @param p_obj the VLC object emitting the dialog + * @param i_type question type (severity of the question) + * @param psz_cancel text of the cancel button + * @param psz_action1 first choice/button text (optional) + * @param psz_action2 second choice/button text (optional) + * @param psz_title title of the question dialog + * @param psz_fmt format string for the question message + * @return < 0 on error, 0 if the user cancelled it, 1 on action1, 2 on action2 + */ +VLC_API int +vlc_dialog_wait_question(vlc_object_t *p_obj, + vlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2, const char *psz_title, + const char *psz_fmt, ...) VLC_FORMAT(7,8); +#define vlc_dialog_wait_question(a, b, c, d, e, f, g, ...) \ + vlc_dialog_wait_question(VLC_OBJECT(a), b, c, d, e, f, g, ##__VA_ARGS__) + +/** + * Asks a total (Yes/No/Cancel) question + * + * Equivalent to vlc_dialog_wait_question() expect that it's called with a + * va_list. + */ +VLC_API int +vlc_dialog_wait_question_va(vlc_object_t *p_obj, + vlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2, const char *psz_title, + const char *psz_fmt, va_list ap); + +/** + * Display a progress dialog + * + * This function returns immediately + * + * @param p_obj the VLC object emitting the dialog + * @param b_indeterminate true if the progress dialog is indeterminate + * @param f_position initial position of the progress bar (between 0.0 and 1.0) + * @param psz_cancel text of the cancel button, if NULL the dialog is not + * cancellable (optional) + * @param psz_title title of the progress dialog + * @param psz_fmt format string for the progress message + * @return a valid vlc_dialog_id on success, must be released with + * vlc_dialog_id_release() + */ +VLC_API vlc_dialog_id * +vlc_dialog_display_progress(vlc_object_t *p_obj, bool b_indeterminate, + float f_position, const char *psz_cancel, + const char *psz_title, const char *psz_fmt, ...) + VLC_FORMAT(6,7); +#define vlc_dialog_display_progress(a, b, c, d, e, f, ...) \ + vlc_dialog_display_progress(VLC_OBJECT(a), b, c, d, e, f, ##__VA_ARGS__) + +/** + * Display a progress dialog + * + * Equivalent to vlc_dialog_display_progress() expect that it's called with a + * va_list. + */ +VLC_API vlc_dialog_id * +vlc_dialog_display_progress_va(vlc_object_t *p_obj, bool b_indeterminate, + float f_position, const char *psz_cancel, + const char *psz_title, const char *psz_fmt, + va_list ap); + +/** + * Update the position of the progress dialog + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog to update + * @param f_position position of the progress bar (between 0.0 and 1.0) + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_update_progress(vlc_object_t *p_obj, vlc_dialog_id *p_id, + float f_position); +#define vlc_dialog_update_progress(a, b, c) \ + vlc_dialog_update_progress(VLC_OBJECT(a), b, c) + +/** + * Update the position and the message of the progress dialog + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog to update + * @param f_position position of the progress bar (between 0.0 and 1.0) + * @param psz_fmt format string for the progress message + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_update_progress_text(vlc_object_t *p_obj, vlc_dialog_id *p_id, + float f_position, const char *psz_fmt, ...) + VLC_FORMAT(4, 5); +#define vlc_dialog_update_progress_text(a, b, c, d, ...) \ + vlc_dialog_update_progress_text(VLC_OBJECT(a), b, c, d, ##__VA_ARGS__) + +/** + * Update the position and the message of the progress dialog + * + * Equivalent to vlc_dialog_update_progress_text() expect that it's called + * with a va_list. + */ +VLC_API int +vlc_dialog_update_progress_text_va(vlc_object_t *p_obj, vlc_dialog_id *p_id, + float f_position, const char *psz_fmt, + va_list ap); + +/** + * Release the dialog id returned by vlc_dialog_display_progress() + * + * It causes the vlc_dialog_cbs.pf_cancel() callback to be invoked. + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog to release + */ +VLC_API void +vlc_dialog_release(vlc_object_t *p_obj, vlc_dialog_id *p_id); +#define vlc_dialog_release(a, b) \ + vlc_dialog_release(VLC_OBJECT(a), b) + +/** + * Return true if the dialog id is cancelled + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog + */ +VLC_API bool +vlc_dialog_is_cancelled(vlc_object_t *p_obj, vlc_dialog_id *p_id); +#define vlc_dialog_is_cancelled(a, b) \ + vlc_dialog_is_cancelled(VLC_OBJECT(a), b) + +/** + * @} + * @defgroup vlc_dialog_impl VLC dialog callbacks + * Need to be implemented by GUI modules or libvlc + * @{ + */ + +/** + * Dialog callbacks to be implemented + */ +typedef struct vlc_dialog_cbs +{ + /** + * Called when an error message needs to be displayed + * + * @param p_data opaque pointer for the callback + * @param psz_title title of the dialog + * @param psz_text text of the dialog + */ + void (*pf_display_error)(void *p_data, const char *psz_title, + const char *psz_text); + + /** + * Called when a login dialog needs to be displayed + * + * You can interact with this dialog by calling vlc_dialog_id_post_login() + * to post an answer or vlc_dialog_id_dismiss() to cancel this dialog. + * + * @note to receive this callback, vlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param psz_default_username user name that should be set on the user form + * @param b_ask_store if true, ask the user if he wants to save the + * credentials + */ + void (*pf_display_login)(void *p_data, vlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + const char *psz_default_username, + bool b_ask_store); + + /** + * Called when a question dialog needs to be displayed + * + * You can interact with this dialog by calling vlc_dialog_id_post_action() + * to post an answer or vlc_dialog_id_dismiss() to cancel this dialog. + * + * @note to receive this callback, vlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param i_type question type (or severity) of the dialog + * @param psz_cancel text of the cancel button + * @param psz_action1 text of the first button, if NULL, don't display this + * button + * @param psz_action2 text of the second button, if NULL, don't display + * this button + */ + void (*pf_display_question)(void *p_data, vlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + vlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2); + + /** + * Called when a progress dialog needs to be displayed + * + * If cancellable (psz_cancel != NULL), you can cancel this dialog by + * calling vlc_dialog_id_dismiss() + * + * @note to receive this callback, vlc_dialog_cbs.pf_cancel and + * vlc_dialog_cbs.pf_update_progress should not be NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param b_indeterminate true if the progress dialog is indeterminate + * @param f_position initial position of the progress bar (between 0.0 and + * 1.0) + * @param psz_cancel text of the cancel button, if NULL the dialog is not + * cancellable + */ + void (*pf_display_progress)(void *p_data, vlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + bool b_indeterminate, float f_position, + const char *psz_cancel); + + /** + * Called when a displayed dialog needs to be cancelled + * + * The implementation must call vlc_dialog_id_dismiss() to really release + * the dialog. + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + */ + void (*pf_cancel)(void *p_data, vlc_dialog_id *p_id); + + /** + * Called when a progress dialog needs to be updated + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + * @param f_position osition of the progress bar (between 0.0 and 1.0) + * @param psz_text new text of the progress dialog + */ + void (*pf_update_progress)(void *p_data, vlc_dialog_id *p_id, + float f_position, const char *psz_text); +} vlc_dialog_cbs; + +/** + * Register callbacks to handle VLC dialogs + * + * @param p_cbs a pointer to callbacks, or NULL to unregister callbacks. + * @param p_data opaque pointer for the callback + */ +VLC_API void +vlc_dialog_provider_set_callbacks(vlc_object_t *p_obj, + const vlc_dialog_cbs *p_cbs, void *p_data); +#define vlc_dialog_provider_set_callbacks(a, b, c) \ + vlc_dialog_provider_set_callbacks(VLC_OBJECT(a), b, c) + +/** + * Associate an opaque pointer with the dialog id + */ +VLC_API void +vlc_dialog_id_set_context(vlc_dialog_id *p_id, void *p_context); + +/** + * Return the opaque pointer associated with the dialog id + */ +VLC_API void * +vlc_dialog_id_get_context(vlc_dialog_id *p_id); + +/** + * Post a login answer + * + * After this call, p_id won't be valid anymore + * + * @see vlc_dialog_cbs.pf_display_login + * + * @param p_id id of the dialog + * @param psz_username valid and non empty string + * @param psz_password valid string (can be empty) + * @param b_store if true, store the credentials + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_id_post_login(vlc_dialog_id *p_id, const char *psz_username, + const char *psz_password, bool b_store); + +/** + * Post a question answer + * + * After this call, p_id won't be valid anymore + * + * @see vlc_dialog_cbs.pf_display_question + * + * @param p_id id of the dialog + * @param i_action 1 for action1, 2 for action2 + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_id_post_action(vlc_dialog_id *p_id, int i_action); + +/** + * Dismiss a dialog + * + * After this call, p_id won't be valid anymore + * + * @see vlc_dialog_cbs.pf_cancel + * + * @param p_id id of the dialog + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_id_dismiss(vlc_dialog_id *p_id); + +/** + * @} + * @defgroup vlc_dialog_ext VLC extension dialog functions + * @{ + */ + +VLC_API int +vlc_ext_dialog_update(vlc_object_t *p_obj, extension_dialog_t *dialog); +#define vlc_ext_dialog_update(a, b) \ + vlc_ext_dialog_update(VLC_OBJECT(a), b) + +/** + * Dialog extension callback to be implemented + */ +typedef void (*vlc_dialog_ext_update_cb)(extension_dialog_t *p_ext_dialog, + void *p_data); + +/** + * Register a callback for VLC extension dialog + * + * @param pf_update a pointer to the update callback, or NULL to unregister + * callback + * @param p_data opaque pointer for the callback + */ +VLC_API void +vlc_dialog_provider_set_ext_callback(vlc_object_t *p_obj, + vlc_dialog_ext_update_cb pf_update, + void *p_data); +#define vlc_dialog_provider_set_ext_callback(a, b, c) \ + vlc_dialog_provider_set_ext_callback(VLC_OBJECT(a), b, c) + +/** @} @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_epg.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_epg.h new file mode 100644 index 0000000..7ccfedf --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_epg.h @@ -0,0 +1,120 @@ +/***************************************************************************** + * vlc_epg.h: Electronic Program Guide + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: f7b9044e7c0aa1af4a44066d73f2ead943fc6a46 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EPG_H +#define VLC_EPG_H 1 + +/** + * \file + * This file defines functions and structures for storing dvb epg information + */ + +typedef struct +{ + int64_t i_start; /* Interpreted as a value return by time() */ + uint32_t i_duration; /* Duration of the event in second */ + uint16_t i_id; /* Unique event id withing the event set */ + + char *psz_name; + char *psz_short_description; + char *psz_description; + struct /* Description items in tranmission order */ + { + char *psz_key; + char *psz_value; + } * description_items; + int i_description_items; + + uint8_t i_rating; /* Parental control, set to 0 when undefined */ +} vlc_epg_event_t; + +typedef struct +{ + char *psz_name; + uint32_t i_id; /* Unique identifier for this table / events (partial sets) */ + uint16_t i_source_id;/* Channel / Program reference id this epg relates to */ + size_t i_event; + vlc_epg_event_t **pp_event; + bool b_present; /* Contains present/following or similar, and sets below */ + const vlc_epg_event_t *p_current; /* NULL, or equal to one of the entries in pp_event */ +} vlc_epg_t; + +/** + * Creates a new vlc_epg_event_t* + * + * You must call vlc_epg_event_Delete to release the associated resources. + * + * \p i_id is the event unique id + * \p i_start start in epoch time + * \p i_duration event duration in seconds + */ +VLC_API vlc_epg_event_t * vlc_epg_event_New(uint16_t i_id, + int64_t i_start, uint32_t i_duration); + +/** + * Releases a vlc_epg_event_t*. + */ +VLC_API void vlc_epg_event_Delete(vlc_epg_event_t *p_event); + +/** + * Returns a vlc_epg_event_t * duplicated from \p p_src. + * + */ +VLC_API vlc_epg_event_t * vlc_epg_event_Duplicate(const vlc_epg_event_t *p_src); + +/** + * It creates a new vlc_epg_t* + * + * You must call vlc_epg_Delete to release the associated resource. + * + * \p i_id is computed unique id depending on standard (table id, eit number) + * \p i_source_id is the associated program number + */ +VLC_API vlc_epg_t * vlc_epg_New(uint32_t i_id, uint16_t i_source_id); + +/** + * It releases a vlc_epg_t*. + */ +VLC_API void vlc_epg_Delete(vlc_epg_t *p_epg); + +/** + * It appends a new vlc_epg_event_t to a vlc_epg_t. + * Takes ownership of \p p_evt or returns false + * + * \p p_evt a vlc_epg_event_t * created with vlc_epg_event_New. + */ +VLC_API bool vlc_epg_AddEvent(vlc_epg_t *p_epg, vlc_epg_event_t *p_evt); + +/** + * It set the current event of a vlc_epg_t given a start time + */ +VLC_API void vlc_epg_SetCurrent(vlc_epg_t *p_epg, int64_t i_start); + +/** + * Returns a duplicated \p p_src and its associated events. + * + */ +VLC_API vlc_epg_t * vlc_epg_Duplicate(const vlc_epg_t *p_src); + +#endif + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_es.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_es.h new file mode 100644 index 0000000..fa49a4f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_es.h @@ -0,0 +1,668 @@ +/***************************************************************************** + * vlc_es.h: Elementary stream formats descriptions + ***************************************************************************** + * Copyright (C) 1999-2012 VLC authors and VideoLAN + * $Id: c03fca394aeef77ad642defe241bd5a5ffe5d53d $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_H +#define VLC_ES_H 1 + +#include +#include +#include +#include + +/** + * \file + * This file defines the elementary streams format types + */ + +/** + * video palette data + * \see video_format_t + * \see subs_format_t + */ +#define VIDEO_PALETTE_COLORS_MAX 256 + +struct video_palette_t +{ + int i_entries; /**< to keep the compatibility with libavcodec's palette */ + uint8_t palette[VIDEO_PALETTE_COLORS_MAX][4]; /**< 4-byte RGBA/YUVA palette */ +}; + +/** + * audio replay gain description + */ +#define AUDIO_REPLAY_GAIN_MAX (2) +#define AUDIO_REPLAY_GAIN_TRACK (0) +#define AUDIO_REPLAY_GAIN_ALBUM (1) +typedef struct +{ + /* true if we have the peak value */ + bool pb_peak[AUDIO_REPLAY_GAIN_MAX]; + /* peak value where 1.0 means full sample value */ + float pf_peak[AUDIO_REPLAY_GAIN_MAX]; + + /* true if we have the gain value */ + bool pb_gain[AUDIO_REPLAY_GAIN_MAX]; + /* gain value in dB */ + float pf_gain[AUDIO_REPLAY_GAIN_MAX]; +} audio_replay_gain_t; + + +/** + * Audio channel type + */ +typedef enum audio_channel_type_t +{ + AUDIO_CHANNEL_TYPE_BITMAP, + AUDIO_CHANNEL_TYPE_AMBISONICS, +} audio_channel_type_t; + +/** + * audio format description + */ +struct audio_format_t +{ + vlc_fourcc_t i_format; /**< audio format fourcc */ + unsigned int i_rate; /**< audio sample-rate */ + + /* Describes the channels configuration of the samples (ie. number of + * channels which are available in the buffer, and positions). */ + uint16_t i_physical_channels; + + /* Describes the chan mode, either set from the input + * (demux/codec/packetizer) or overridden by the user, used by audio + * filters. */ + uint16_t i_chan_mode; + + /* Channel type */ + audio_channel_type_t channel_type; + + /* Optional - for A/52, SPDIF and DTS types : */ + /* Bytes used by one compressed frame, depends on bitrate. */ + unsigned int i_bytes_per_frame; + + /* Number of sampleframes contained in one compressed frame. */ + unsigned int i_frame_length; + /* Please note that it may be completely arbitrary - buffers are not + * obliged to contain a integral number of so-called "frames". It's + * just here for the division : + * buffer_size = i_nb_samples * i_bytes_per_frame / i_frame_length + */ + + /* FIXME ? (used by the codecs) */ + unsigned i_bitspersample; + unsigned i_blockalign; + uint8_t i_channels; /* must be <=32 */ +}; + +/* Values available for audio channels */ +#define AOUT_CHAN_CENTER 0x1 +#define AOUT_CHAN_LEFT 0x2 +#define AOUT_CHAN_RIGHT 0x4 +#define AOUT_CHAN_REARCENTER 0x10 +#define AOUT_CHAN_REARLEFT 0x20 +#define AOUT_CHAN_REARRIGHT 0x40 +#define AOUT_CHAN_MIDDLELEFT 0x100 +#define AOUT_CHAN_MIDDLERIGHT 0x200 +#define AOUT_CHAN_LFE 0x1000 + +#define AOUT_CHANS_FRONT (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT) +#define AOUT_CHANS_MIDDLE (AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT) +#define AOUT_CHANS_REAR (AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT) +#define AOUT_CHANS_CENTER (AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_STEREO AOUT_CHANS_2_0 +#define AOUT_CHANS_2_0 (AOUT_CHANS_FRONT) +#define AOUT_CHANS_2_1 (AOUT_CHANS_FRONT | AOUT_CHAN_LFE) +#define AOUT_CHANS_3_0 (AOUT_CHANS_FRONT | AOUT_CHAN_CENTER) +#define AOUT_CHANS_3_1 (AOUT_CHANS_3_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_4_0 (AOUT_CHANS_FRONT | AOUT_CHANS_REAR) +#define AOUT_CHANS_4_1 (AOUT_CHANS_4_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_5_0 (AOUT_CHANS_4_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_5_1 (AOUT_CHANS_5_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_6_0 (AOUT_CHANS_4_0 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_7_0 (AOUT_CHANS_6_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_7_1 (AOUT_CHANS_5_1 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_8_1 (AOUT_CHANS_7_1 | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_4_0_MIDDLE (AOUT_CHANS_FRONT | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_4_CENTER_REAR (AOUT_CHANS_FRONT | AOUT_CHANS_CENTER) +#define AOUT_CHANS_5_0_MIDDLE (AOUT_CHANS_4_0_MIDDLE | AOUT_CHAN_CENTER) +#define AOUT_CHANS_6_1_MIDDLE (AOUT_CHANS_5_0_MIDDLE | AOUT_CHAN_REARCENTER | AOUT_CHAN_LFE) + +/* Maximum number of mapped channels (or the maximum of bits set in + * i_physical_channels) */ +#define AOUT_CHAN_MAX 9 +/* Maximum number of unmapped channels */ +#define INPUT_CHAN_MAX 64 + +/* Values available for i_chan_mode only */ +#define AOUT_CHANMODE_DUALMONO 0x1 +#define AOUT_CHANMODE_DOLBYSTEREO 0x2 + +/** + * Picture orientation. + */ +typedef enum video_orientation_t +{ + ORIENT_TOP_LEFT = 0, /**< Top line represents top, left column left. */ + ORIENT_TOP_RIGHT, /**< Flipped horizontally */ + ORIENT_BOTTOM_LEFT, /**< Flipped vertically */ + ORIENT_BOTTOM_RIGHT, /**< Rotated 180 degrees */ + ORIENT_LEFT_TOP, /**< Transposed */ + ORIENT_LEFT_BOTTOM, /**< Rotated 90 degrees clockwise */ + ORIENT_RIGHT_TOP, /**< Rotated 90 degrees anti-clockwise */ + ORIENT_RIGHT_BOTTOM, /**< Anti-transposed */ + + ORIENT_NORMAL = ORIENT_TOP_LEFT, + ORIENT_TRANSPOSED = ORIENT_LEFT_TOP, + ORIENT_ANTI_TRANSPOSED = ORIENT_RIGHT_BOTTOM, + ORIENT_HFLIPPED = ORIENT_TOP_RIGHT, + ORIENT_VFLIPPED = ORIENT_BOTTOM_LEFT, + ORIENT_ROTATED_180 = ORIENT_BOTTOM_RIGHT, + ORIENT_ROTATED_270 = ORIENT_LEFT_BOTTOM, + ORIENT_ROTATED_90 = ORIENT_RIGHT_TOP, +} video_orientation_t; +/** Convert EXIF orientation to enum video_orientation_t */ +#define ORIENT_FROM_EXIF(exif) ((0x57642310U >> (4 * ((exif) - 1))) & 7) +/** Convert enum video_orientation_t to EXIF */ +#define ORIENT_TO_EXIF(orient) ((0x76853421U >> (4 * (orient))) & 15) +/** If the orientation is natural or mirrored */ +#define ORIENT_IS_MIRROR(orient) parity(orient) +/** If the orientation swaps dimensions */ +#define ORIENT_IS_SWAP(orient) (((orient) & 4) != 0) +/** Applies horizontal flip to an orientation */ +#define ORIENT_HFLIP(orient) ((orient) ^ 1) +/** Applies vertical flip to an orientation */ +#define ORIENT_VFLIP(orient) ((orient) ^ 2) +/** Applies horizontal flip to an orientation */ +#define ORIENT_ROTATE_180(orient) ((orient) ^ 3) + +typedef enum video_transform_t +{ + TRANSFORM_IDENTITY = ORIENT_NORMAL, + TRANSFORM_HFLIP = ORIENT_HFLIPPED, + TRANSFORM_VFLIP = ORIENT_VFLIPPED, + TRANSFORM_R180 = ORIENT_ROTATED_180, + TRANSFORM_R270 = ORIENT_ROTATED_270, + TRANSFORM_R90 = ORIENT_ROTATED_90, + TRANSFORM_TRANSPOSE = ORIENT_TRANSPOSED, + TRANSFORM_ANTI_TRANSPOSE = ORIENT_ANTI_TRANSPOSED +} video_transform_t; + +typedef enum video_multiview_mode_t +{ + /* No stereoscopy: 2D picture. */ + MULTIVIEW_2D = 0, + + /* Side-by-side with left eye first. */ + MULTIVIEW_STEREO_SBS, + + /* Top-bottom with left eye first. */ + MULTIVIEW_STEREO_TB, + + /* Row sequential with left eye first. */ + MULTIVIEW_STEREO_ROW, + + /* Column sequential with left eye first. */ + MULTIVIEW_STEREO_COL, + + /* Frame sequential with left eye first. */ + MULTIVIEW_STEREO_FRAME, + + /* Checkerboard pattern with left eye first. */ + MULTIVIEW_STEREO_CHECKERBOARD, +} video_multiview_mode_t; + +/** + * Video projection mode. + */ +typedef enum video_projection_mode_t +{ + PROJECTION_MODE_RECTANGULAR = 0, + PROJECTION_MODE_EQUIRECTANGULAR, + + PROJECTION_MODE_CUBEMAP_LAYOUT_STANDARD = 0x100, +} video_projection_mode_t; + +/** + * Video color primaries (a.k.a. chromacities) + */ +typedef enum video_color_primaries_t +{ + COLOR_PRIMARIES_UNDEF, + COLOR_PRIMARIES_BT601_525, + COLOR_PRIMARIES_BT601_625, + COLOR_PRIMARIES_BT709, + COLOR_PRIMARIES_BT2020, + COLOR_PRIMARIES_DCI_P3, + COLOR_PRIMARIES_FCC1953, +#define COLOR_PRIMARIES_SRGB COLOR_PRIMARIES_BT709 +#define COLOR_PRIMARIES_SMTPE_170 COLOR_PRIMARIES_BT601_525 +#define COLOR_PRIMARIES_SMTPE_240 COLOR_PRIMARIES_BT601_525 /* Only differs from 1e10-4 in white Y */ +#define COLOR_PRIMARIES_SMTPE_RP145 COLOR_PRIMARIES_BT601_525 +#define COLOR_PRIMARIES_EBU_3213 COLOR_PRIMARIES_BT601_625 +#define COLOR_PRIMARIES_BT470_BG COLOR_PRIMARIES_BT601_625 +#define COLOR_PRIMARIES_BT470_M COLOR_PRIMARIES_FCC1953 +#define COLOR_PRIMARIES_MAX COLOR_PRIMARIES_FCC1953 +} video_color_primaries_t; + +/** + * Video transfer functions + */ +typedef enum video_transfer_func_t +{ + TRANSFER_FUNC_UNDEF, + TRANSFER_FUNC_LINEAR, + TRANSFER_FUNC_SRGB /*< Gamma 2.2 */, + TRANSFER_FUNC_BT470_BG, + TRANSFER_FUNC_BT470_M, + TRANSFER_FUNC_BT709, + TRANSFER_FUNC_SMPTE_ST2084, + TRANSFER_FUNC_SMPTE_240, + TRANSFER_FUNC_HLG, +#define TRANSFER_FUNC_BT2020 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_170 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_274 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_293 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_296 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_ARIB_B67 TRANSFER_FUNC_HLG +#define TRANSFER_FUNC_MAX TRANSFER_FUNC_HLG +} video_transfer_func_t; + +/** + * Video color space (i.e. YCbCr matrices) + */ +typedef enum video_color_space_t +{ + COLOR_SPACE_UNDEF, + COLOR_SPACE_BT601, + COLOR_SPACE_BT709, + COLOR_SPACE_BT2020, +#define COLOR_SPACE_SRGB COLOR_SPACE_BT709 +#define COLOR_SPACE_SMPTE_170 COLOR_SPACE_BT601 +#define COLOR_SPACE_SMPTE_240 COLOR_SPACE_SMPTE_170 +#define COLOR_SPACE_MAX COLOR_SPACE_BT2020 +} video_color_space_t; + +/** + * Video chroma location + */ +typedef enum video_chroma_location_t +{ + CHROMA_LOCATION_UNDEF, + CHROMA_LOCATION_LEFT, /*< Most common in MPEG-2 Video, H.264/265 */ + CHROMA_LOCATION_CENTER, /*< Most common in MPEG-1 Video, JPEG */ + CHROMA_LOCATION_TOP_LEFT, + CHROMA_LOCATION_TOP_CENTER, + CHROMA_LOCATION_BOTTOM_LEFT, + CHROMA_LOCATION_BOTTOM_CENTER, +#define CHROMA_LOCATION_MAX CHROMA_LOCATION_BOTTOM_CENTER +} video_chroma_location_t; + +/** + * video format description + */ +struct video_format_t +{ + vlc_fourcc_t i_chroma; /**< picture chroma */ + + unsigned int i_width; /**< picture width */ + unsigned int i_height; /**< picture height */ + unsigned int i_x_offset; /**< start offset of visible area */ + unsigned int i_y_offset; /**< start offset of visible area */ + unsigned int i_visible_width; /**< width of visible area */ + unsigned int i_visible_height; /**< height of visible area */ + + unsigned int i_bits_per_pixel; /**< number of bits per pixel */ + + unsigned int i_sar_num; /**< sample/pixel aspect ratio */ + unsigned int i_sar_den; + + unsigned int i_frame_rate; /**< frame rate numerator */ + unsigned int i_frame_rate_base; /**< frame rate denominator */ + + uint32_t i_rmask, i_gmask, i_bmask; /**< color masks for RGB chroma */ + int i_rrshift, i_lrshift; + int i_rgshift, i_lgshift; + int i_rbshift, i_lbshift; + video_palette_t *p_palette; /**< video palette from demuxer */ + video_orientation_t orientation; /**< picture orientation */ + video_color_primaries_t primaries; /**< color primaries */ + video_transfer_func_t transfer; /**< transfer function */ + video_color_space_t space; /**< YCbCr color space */ + bool b_color_range_full; /**< 0-255 instead of 16-235 */ + video_chroma_location_t chroma_location; /**< YCbCr chroma location */ + + video_multiview_mode_t multiview_mode; /** Multiview mode, 2D, 3D */ + + video_projection_mode_t projection_mode; /**< projection mode */ + vlc_viewpoint_t pose; + struct { + /* similar to SMPTE ST 2086 mastering display color volume */ + uint16_t primaries[3*2]; /* G,B,R / x,y */ + uint16_t white_point[2]; /* x,y */ + uint32_t max_luminance; + uint32_t min_luminance; + } mastering; + struct { + /* similar to CTA-861.3 content light level */ + uint16_t MaxCLL; /* max content light level */ + uint16_t MaxFALL; /* max frame average light level */ + } lighting; + uint32_t i_cubemap_padding; /**< padding in pixels of the cube map faces */ +}; + +/** + * Initialize a video_format_t structure with chroma 'i_chroma' + * \param p_src pointer to video_format_t structure + * \param i_chroma chroma value to use + */ +static inline void video_format_Init( video_format_t *p_src, vlc_fourcc_t i_chroma ) +{ + memset( p_src, 0, sizeof( video_format_t ) ); + p_src->i_chroma = i_chroma; + vlc_viewpoint_init( &p_src->pose ); +} + +/** + * Copy video_format_t including the palette + * \param p_dst video_format_t to copy to + * \param p_src video_format_t to copy from + */ +static inline int video_format_Copy( video_format_t *p_dst, const video_format_t *p_src ) +{ + memcpy( p_dst, p_src, sizeof( *p_dst ) ); + if( p_src->p_palette ) + { + p_dst->p_palette = (video_palette_t *) malloc( sizeof( video_palette_t ) ); + if( !p_dst->p_palette ) + return VLC_ENOMEM; + memcpy( p_dst->p_palette, p_src->p_palette, sizeof( *p_dst->p_palette ) ); + } + return VLC_SUCCESS; +} + +static inline void video_format_AdjustColorSpace( video_format_t *p_fmt ) +{ + if ( p_fmt->primaries == COLOR_PRIMARIES_UNDEF ) + { + if ( p_fmt->i_visible_height > 576 ) // HD + p_fmt->primaries = COLOR_PRIMARIES_BT709; + else if ( p_fmt->i_visible_height > 525 ) // PAL + p_fmt->primaries = COLOR_PRIMARIES_BT601_625; + else + p_fmt->primaries = COLOR_PRIMARIES_BT601_525; + } + + if ( p_fmt->transfer == TRANSFER_FUNC_UNDEF ) + { + if ( p_fmt->i_visible_height > 576 ) // HD + p_fmt->transfer = TRANSFER_FUNC_BT709; + else + p_fmt->transfer = TRANSFER_FUNC_SRGB; + } + + if ( p_fmt->space == COLOR_SPACE_UNDEF ) + { + if ( p_fmt->i_visible_height > 576 ) // HD + p_fmt->space = COLOR_SPACE_BT709; + else + p_fmt->space = COLOR_SPACE_BT601; + } +} + +/** + * Cleanup and free palette of this video_format_t + * \param p_src video_format_t structure to clean + */ +static inline void video_format_Clean( video_format_t *p_src ) +{ + free( p_src->p_palette ); + memset( p_src, 0, sizeof( video_format_t ) ); +} + +/** + * It will fill up a video_format_t using the given arguments. + * Note that the video_format_t must already be initialized. + */ +VLC_API void video_format_Setup( video_format_t *, vlc_fourcc_t i_chroma, + int i_width, int i_height, int i_visible_width, int i_visible_height, + int i_sar_num, int i_sar_den ); + +/** + * It will copy the crop properties from a video_format_t to another. + */ +VLC_API void video_format_CopyCrop( video_format_t *, const video_format_t * ); + +/** + * It will compute the crop/ar properties when scaling. + */ +VLC_API void video_format_ScaleCropAr( video_format_t *, const video_format_t * ); + +/** + * This function "normalizes" the formats orientation, by switching the a/r according to the orientation, + * producing a format whose orientation is ORIENT_NORMAL. It makes a shallow copy (pallette is not alloc'ed). + */ +VLC_API void video_format_ApplyRotation(video_format_t * /*restrict*/ out, + const video_format_t *in); + +/** + * This function applies the transform operation to fmt. + */ +VLC_API void video_format_TransformBy(video_format_t *fmt, video_transform_t transform); + +/** + * This function applies the transforms necessary to fmt so that the resulting fmt + * has the dst_orientation. + */ +VLC_API void video_format_TransformTo(video_format_t *fmt, video_orientation_t dst_orientation); + +/** + * Returns the operation required to transform src into dst. + */ +VLC_API video_transform_t video_format_GetTransform(video_orientation_t src, video_orientation_t dst); + +/** + * This function will check if the first video format is similar + * to the second one. + */ +VLC_API bool video_format_IsSimilar( const video_format_t *, const video_format_t * ); + +/** + * It prints details about the given video_format_t + */ +VLC_API void video_format_Print( vlc_object_t *, const char *, const video_format_t * ); + + +static inline video_transform_t transform_Inverse( video_transform_t transform ) +{ + switch ( transform ) { + case TRANSFORM_R90: + return TRANSFORM_R270; + case TRANSFORM_R270: + return TRANSFORM_R90; + default: + return transform; + } +} +/** + * subtitles format description + */ +struct subs_format_t +{ + /* the character encoding of the text of the subtitle. + * all gettext recognized shorts can be used */ + char *psz_encoding; + + + int i_x_origin; /**< x coordinate of the subtitle. 0 = left */ + int i_y_origin; /**< y coordinate of the subtitle. 0 = top */ + + struct + { + /* */ + uint32_t palette[16+1]; + + /* the width of the original movie the spu was extracted from */ + int i_original_frame_width; + /* the height of the original movie the spu was extracted from */ + int i_original_frame_height; + } spu; + + struct + { + int i_id; + } dvb; + struct + { + int i_magazine; + int i_page; + } teletext; + struct + { + uint8_t i_channel; + /* Reorder depth of transport video, -1 for no reordering */ + int i_reorder_depth; + } cc; + + text_style_t *p_style; /* Default styles to use */ +}; + +#define SPU_PALETTE_DEFINED 0xbeefbeef + +/** + * ES language definition + */ +typedef struct extra_languages_t +{ + char *psz_language; + char *psz_description; +} extra_languages_t; + +/** ES Categories */ +enum es_format_category_e +{ + UNKNOWN_ES = 0x00, + VIDEO_ES, + AUDIO_ES, + SPU_ES, + DATA_ES, +}; +#define ES_CATEGORY_COUNT (DATA_ES + 1) + +/** + * ES format definition + */ +#define ES_PRIORITY_NOT_SELECTABLE -2 +#define ES_PRIORITY_NOT_DEFAULTABLE -1 +#define ES_PRIORITY_SELECTABLE_MIN 0 +#define ES_PRIORITY_MIN ES_PRIORITY_NOT_SELECTABLE +struct es_format_t +{ + enum es_format_category_e i_cat; /**< ES category */ + vlc_fourcc_t i_codec; /**< FOURCC value as used in vlc */ + vlc_fourcc_t i_original_fourcc; /**< original FOURCC from the container */ + + int i_id; /**< es identifier, where means + -1: let the core mark the right id + >=0: valid id */ + int i_group; /**< group identifier, where means: + -1 : standalone + >= 0 then a "group" (program) is created + for each value */ + int i_priority; /**< priority, where means: + -2 : mean not selectable by the users + -1 : mean not selected by default even + when no other stream + >=0: priority */ + + char *psz_language; /**< human-readable language name */ + char *psz_description; /**< human-readable description of language */ + unsigned i_extra_languages; /**< length in bytes of extra language data pointer */ + extra_languages_t *p_extra_languages; /**< extra language data needed by some decoders */ + + union { + struct { + audio_format_t audio; /**< description of audio format */ + audio_replay_gain_t audio_replay_gain; /*< audio replay gain information */ + }; + video_format_t video; /**< description of video format */ + subs_format_t subs; /**< description of subtitle format */ + }; + + unsigned int i_bitrate; /**< bitrate of this ES */ + int i_profile; /**< codec specific information (like real audio flavor, mpeg audio layer, h264 profile ...) */ + int i_level; /**< codec specific information: indicates maximum restrictions on the stream (resolution, bitrate, codec features ...) */ + + bool b_packetized; /**< whether the data is packetized (ie. not truncated) */ + int i_extra; /**< length in bytes of extra data pointer */ + void *p_extra; /**< extra data needed by some decoders or muxers */ + +}; + +/** + * This function will fill all RGB shift from RGB masks. + */ +VLC_API void video_format_FixRgb( video_format_t * ); + +/** + * This function will initialize a es_format_t structure. + */ +VLC_API void es_format_Init( es_format_t *, int i_cat, vlc_fourcc_t i_codec ); + +/** + * This function will initialize a es_format_t structure from a video_format_t. + */ +VLC_API void es_format_InitFromVideo( es_format_t *, const video_format_t * ); + +/** + * This functions will copy a es_format_t. + */ +VLC_API int es_format_Copy( es_format_t *p_dst, const es_format_t *p_src ); + +/** + * This function will clean up a es_format_t and release all associated + * resources. + * You can call it multiple times on the same structure. + */ +VLC_API void es_format_Clean( es_format_t *fmt ); + +/** + * This function will check if the first ES format is similar + * to the second one. + * + * All descriptive fields are ignored. + */ +VLC_API bool es_format_IsSimilar( const es_format_t *, const es_format_t * ); + +/** + * Changes ES format to another category + * Format must have been properly initialized + */ +static inline void es_format_Change( es_format_t *fmt, int i_cat, vlc_fourcc_t i_codec ) +{ + es_format_Clean( fmt ); + es_format_Init( fmt, i_cat, i_codec ); +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_es_out.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_es_out.h new file mode 100644 index 0000000..d79ab4f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_es_out.h @@ -0,0 +1,183 @@ +/***************************************************************************** + * vlc_es_out.h: es_out (demuxer output) descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: fe53c2a3d34f76eec76d83032cd0d3111be915aa $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_OUT_H +#define VLC_ES_OUT_H 1 + +/** + * \defgroup es_out ES output + * \ingroup input + * Elementary streams output + * @{ + * \file + * Elementary streams output interface + */ + +enum es_out_query_e +{ + /* set or change the selected ES in its category (audio/video/spu) */ + ES_OUT_SET_ES, /* arg1= es_out_id_t* */ + ES_OUT_RESTART_ES, /* arg1= es_out_id_t* */ + ES_OUT_RESTART_ALL_ES, /* Deprecated, no effect */ + + /* set 'default' tag on ES (copied across from container) */ + ES_OUT_SET_ES_DEFAULT, /* arg1= es_out_id_t* */ + + /* force (un)selection of the ES (bypass current mode) + XXX: this will not change the state of any other ES ! (see SET_ES) */ + ES_OUT_SET_ES_STATE,/* arg1= es_out_id_t* arg2=bool */ + ES_OUT_GET_ES_STATE,/* arg1= es_out_id_t* arg2=bool* */ + + /* sets es selection policy when in auto mode */ + ES_OUT_SET_ES_CAT_POLICY, /* arg1=es_format_category_e arg2=es_out_policy_e */ + + /* */ + ES_OUT_SET_GROUP, /* arg1= int */ + + /* PCR handling, DTS/PTS will be automatically computed using thoses PCR + * XXX: SET_PCR(_GROUP) are in charge of the pace control. They will wait + * to slow down the demuxer so that it reads at the right speed. + * XXX: if you want PREROLL just call ES_OUT_SET_NEXT_DISPLAY_TIME and send + * as you would normally do. + */ + ES_OUT_SET_PCR, /* arg1=int64_t i_pcr(microsecond!) (using default group 0)*/ + ES_OUT_SET_GROUP_PCR, /* arg1= int i_group, arg2=int64_t i_pcr(microsecond!)*/ + ES_OUT_RESET_PCR, /* no arg */ + + /* Try not to use this one as it is a bit hacky */ + ES_OUT_SET_ES_FMT, /* arg1= es_out_id_t* arg2=es_format_t* */ + + /* Allow preroll of data (data with dts/pts < i_pts for all ES will be decoded but not displayed */ + ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=int64_t i_pts(microsecond) */ + /* Set meta data for group (dynamic) (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_GROUP_META, /* arg1=int i_group arg2=const vlc_meta_t */ + /* Set epg for group (dynamic) (The vlc_epg_t is not modified nor released) */ + ES_OUT_SET_GROUP_EPG, /* arg1=int i_group arg2=const vlc_epg_t * */ + ES_OUT_SET_GROUP_EPG_EVENT, /* arg1=int i_group arg2=const vlc_epg_event_t * */ + ES_OUT_SET_EPG_TIME, /* arg1=int int64_t */ + + /* */ + ES_OUT_DEL_GROUP, /* arg1=int i_group */ + + /* Set scrambled state for one es */ + ES_OUT_SET_ES_SCRAMBLED_STATE, /* arg1=int i_group arg2=es_out_id_t* */ + + /* Stop any buffering being done, and ask if es_out has no more data to + * play. + * It will not block and so MUST be used carrefully. The only good reason + * is for interactive playback (like for DVD menu). + * XXX You SHALL call ES_OUT_RESET_PCR before any other es_out_Control/Send calls. */ + ES_OUT_GET_EMPTY, /* arg1=bool* res=cannot fail */ + + /* Set global meta data (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_META, /* arg1=const vlc_meta_t * */ + + /* PCR system clock manipulation for external clock synchronization */ + ES_OUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + ES_OUT_MODIFY_PCR_SYSTEM, /* arg1=int is_absolute, arg2=mtime_t, res=can fail */ + + ES_OUT_POST_SUBNODE, /* arg1=input_item_node_t *, res=can fail */ + + /* First value usable for private control */ + ES_OUT_PRIVATE_START = 0x10000, +}; + +enum es_out_policy_e +{ + ES_OUT_ES_POLICY_EXCLUSIVE = 0,/* Enforces single ES selection only */ + ES_OUT_ES_POLICY_SIMULTANEOUS, /* Allows multiple ES per cat */ +}; + +struct es_out_t +{ + es_out_id_t *(*pf_add) ( es_out_t *, const es_format_t * ); + int (*pf_send) ( es_out_t *, es_out_id_t *, block_t * ); + void (*pf_del) ( es_out_t *, es_out_id_t * ); + int (*pf_control)( es_out_t *, int i_query, va_list ); + void (*pf_destroy)( es_out_t * ); + + es_out_sys_t *p_sys; +}; + +VLC_USED +static inline es_out_id_t * es_out_Add( es_out_t *out, const es_format_t *fmt ) +{ + return out->pf_add( out, fmt ); +} + +static inline void es_out_Del( es_out_t *out, es_out_id_t *id ) +{ + out->pf_del( out, id ); +} + +static inline int es_out_Send( es_out_t *out, es_out_id_t *id, + block_t *p_block ) +{ + return out->pf_send( out, id, p_block ); +} + +static inline int es_out_vaControl( es_out_t *out, int i_query, va_list args ) +{ + return out->pf_control( out, i_query, args ); +} + +static inline int es_out_Control( es_out_t *out, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = es_out_vaControl( out, i_query, args ); + va_end( args ); + return i_result; +} + +static inline void es_out_Delete( es_out_t *p_out ) +{ + p_out->pf_destroy( p_out ); +} + +static inline int es_out_SetPCR( es_out_t *out, int64_t pcr ) +{ + return es_out_Control( out, ES_OUT_SET_PCR, pcr ); +} + +static inline int es_out_ControlSetMeta( es_out_t *out, const vlc_meta_t *p_meta ) +{ + return es_out_Control( out, ES_OUT_SET_META, p_meta ); +} + +static inline int es_out_ControlGetPcrSystem( es_out_t *out, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return es_out_Control( out, ES_OUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +static inline int es_out_ControlModifyPcrSystem( es_out_t *out, bool b_absolute, mtime_t i_system ) +{ + return es_out_Control( out, ES_OUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_events.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_events.h new file mode 100644 index 0000000..ac4a225 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_events.h @@ -0,0 +1,209 @@ +/***************************************************************************** + * vlc_events.h: events definitions + * Interface used to send events. + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: 229f4f677029763a837558932dad3e47b283e61c $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EVENTS_H +# define VLC_EVENTS_H + +#include +#include + +/** + * \file + * This file is the interface definition for events + * (implementation in src/misc/events.c) + */ + +/***************************************************************************** + * Documentation + *****************************************************************************/ +/* + **** Background + * + * This implements a way to send and receive event for an object (which can be + * a simple C struct or less). + * + * This is in direct concurrency with the Variable based Callback + * (see src/misc/variables.c). + * + * It has the following advantages over Variable based Callback: + * - No need to implement the whole VLC_COMMON_MEMBERS in the object, + * thus it reduce it size. This is especially true for input_item_t which + * doesn't have VLC_COMMON_MEMBERS. This is the first reason of existence of + * this implementation. + * - Libvlc can easily be based upon that. + * - Existing event are clearly declared (in include/vlc_events.h) + * + * + **** Example usage + * + * (vlc_cool_object_t doesn't need to have the VLC_COMMON_MEMBERS.) + * + * struct vlc_cool_object_t + * { + * ... + * vlc_event_manager_t p_event_manager; + * ... + * } + * + * vlc_my_cool_object_new() + * { + * ... + * vlc_event_manager_init( &p_self->p_event_manager, p_self, p_a_libvlc_object ); + * ... + * } + * + * vlc_my_cool_object_release() + * { + * ... + * vlc_event_manager_fini( &p_self->p_event_manager ); + * ... + * } + * + * vlc_my_cool_object_do_something() + * { + * ... + * vlc_event_t event; + * event.type = vlc_MyCoolObjectDidSomething; + * event.u.my_cool_object_did_something.what_it_did = kSomething; + * vlc_event_send( &p_self->p_event_manager, &event ); + * } + * */ + + /***************************************************************************** + * Event Type + *****************************************************************************/ + +/* List of event */ +typedef enum vlc_event_type_t { + /* Input item events */ + vlc_InputItemMetaChanged, + vlc_InputItemSubItemTreeAdded, + vlc_InputItemDurationChanged, + vlc_InputItemPreparsedChanged, + vlc_InputItemNameChanged, + vlc_InputItemInfoChanged, + vlc_InputItemErrorWhenReadingChanged, + vlc_InputItemPreparseEnded, +} vlc_event_type_t; + +typedef struct vlc_event_listeners_group_t +{ + DECL_ARRAY(struct vlc_event_listener_t *) listeners; +} vlc_event_listeners_group_t; + +/* Event manager type */ +typedef struct vlc_event_manager_t +{ + void * p_obj; + vlc_mutex_t lock; + vlc_event_listeners_group_t events[vlc_InputItemPreparseEnded + 1]; +} vlc_event_manager_t; + +/* Event definition */ +typedef struct vlc_event_t +{ + vlc_event_type_t type; + void * p_obj; /* Sender object, automatically filled by vlc_event_send() */ + union vlc_event_type_specific + { + /* Input item events */ + struct vlc_input_item_meta_changed + { + vlc_meta_type_t meta_type; + } input_item_meta_changed; + struct vlc_input_item_subitem_added + { + input_item_t * p_new_child; + } input_item_subitem_added; + struct vlc_input_item_subitem_tree_added + { + input_item_node_t * p_root; + } input_item_subitem_tree_added; + struct vlc_input_item_duration_changed + { + mtime_t new_duration; + } input_item_duration_changed; + struct vlc_input_item_preparsed_changed + { + int new_status; + } input_item_preparsed_changed; + struct vlc_input_item_name_changed + { + const char * new_name; + } input_item_name_changed; + struct vlc_input_item_info_changed + { + void * unused; + } input_item_info_changed; + struct input_item_error_when_reading_changed + { + bool new_value; + } input_item_error_when_reading_changed; + struct input_item_preparse_ended + { + int new_status; + } input_item_preparse_ended; + } u; +} vlc_event_t; + +/* Event callback type */ +typedef void ( *vlc_event_callback_t )( const vlc_event_t *, void * ); + + /***************************************************************************** + * Event manager + *****************************************************************************/ + +/* + * p_obj points to the object that owns the event manager, and from + * which events are sent + */ +void vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj ); + +/* + * Destroy + */ +void vlc_event_manager_fini( vlc_event_manager_t * p_em ); + +/* + * Send an event to the listener attached to this p_em. + */ +void vlc_event_send( vlc_event_manager_t * p_em, vlc_event_t * ); + +/* + * Add a callback for an event. + */ +VLC_API int vlc_event_attach( vlc_event_manager_t * p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +/* + * Remove a callback for an event. + */ +VLC_API void vlc_event_detach( vlc_event_manager_t *p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +#endif /* VLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_filter.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_filter.h new file mode 100644 index 0000000..3b30dbb --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_filter.h @@ -0,0 +1,470 @@ +/***************************************************************************** + * vlc_filter.h: filter related structures and functions + ***************************************************************************** + * Copyright (C) 1999-2014 VLC authors and VideoLAN + * + * Authors: Gildas Bazin + * Antoine Cellerier + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FILTER_H +#define VLC_FILTER_H 1 + +#include + +/** + * \defgroup filter Filters + * \ingroup output + * Audio, video, text filters + * @{ + * \file + * Filter modules interface + */ + +typedef struct filter_owner_sys_t filter_owner_sys_t; + +typedef struct filter_owner_t +{ + void *sys; + + union + { + struct + { + picture_t * (*buffer_new)( filter_t * ); + } video; + struct + { + subpicture_t * (*buffer_new)( filter_t * ); + } sub; + }; +} filter_owner_t; + +struct vlc_mouse_t; + +/** Structure describing a filter + * @warning BIG FAT WARNING : the code relies on the first 4 members of + * filter_t and decoder_t to be the same, so if you have anything to add, + * do it at the end of the structure. + */ +struct filter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + filter_sys_t * p_sys; + + /* Input format */ + es_format_t fmt_in; + + /* Output format of filter */ + es_format_t fmt_out; + bool b_allow_fmt_out_change; + + /* Name of the "video filter" shortcut that is requested, can be NULL */ + const char * psz_name; + /* Filter configuration */ + config_chain_t * p_cfg; + + union + { + /** Filter a picture (video filter) */ + picture_t * (*pf_video_filter)( filter_t *, picture_t * ); + + /** Filter an audio block (audio filter) */ + block_t * (*pf_audio_filter)( filter_t *, block_t * ); + + /** Blend a subpicture onto a picture (blend) */ + void (*pf_video_blend)( filter_t *, picture_t *, const picture_t *, + int, int, int ); + + /** Generate a subpicture (sub source) */ + subpicture_t *(*pf_sub_source)( filter_t *, mtime_t ); + + /** Filter a subpicture (sub filter) */ + subpicture_t *(*pf_sub_filter)( filter_t *, subpicture_t * ); + + /** Render text (text render) */ + int (*pf_render)( filter_t *, subpicture_region_t *, + subpicture_region_t *, const vlc_fourcc_t * ); + }; + + union + { + /* TODO: video filter drain */ + /** Drain (audio filter) */ + block_t *(*pf_audio_drain) ( filter_t * ); + }; + + /** Flush + * + * Flush (i.e. discard) any internal buffer in a video or audio filter. + */ + void (*pf_flush)( filter_t * ); + + /** Change viewpoint + * + * Pass a new viewpoint to audio filters. Filters like the spatialaudio one + * used for Ambisonics rendering will change its output according to this + * viewpoint. + */ + void (*pf_change_viewpoint)( filter_t *, const vlc_viewpoint_t * ); + + union + { + /** Filter mouse state (video filter). + * + * If non-NULL, you must convert from output to input formats: + * - If VLC_SUCCESS is returned, the mouse state is propagated. + * - Otherwise, the mouse change is not propagated. + * If NULL, the mouse state is considered unchanged and will be + * propagated. */ + int (*pf_video_mouse)( filter_t *, struct vlc_mouse_t *, + const struct vlc_mouse_t *p_old, + const struct vlc_mouse_t *p_new ); + int (*pf_sub_mouse)( filter_t *, const struct vlc_mouse_t *p_old, + const struct vlc_mouse_t *p_new, + const video_format_t * ); + }; + + /* Input attachments + * XXX use filter_GetInputAttachments */ + int (*pf_get_attachments)( filter_t *, input_attachment_t ***, int * ); + + /* Private structure for the owner of the decoder */ + filter_owner_t owner; +}; + +/** + * This function will return a new picture usable by p_filter as an output + * buffer. You have to release it using picture_Release or by returning + * it to the caller as a pf_video_filter return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new picture on success or NULL on failure + */ +static inline picture_t *filter_NewPicture( filter_t *p_filter ) +{ + picture_t *pic = p_filter->owner.video.buffer_new( p_filter ); + if( pic == NULL ) + msg_Warn( p_filter, "can't get output picture" ); + return pic; +} + +/** + * Flush a filter + * + * This function will flush the state of a filter (audio or video). + */ +static inline void filter_Flush( filter_t *p_filter ) +{ + if( p_filter->pf_flush != NULL ) + p_filter->pf_flush( p_filter ); +} + +static inline void filter_ChangeViewpoint( filter_t *p_filter, + const vlc_viewpoint_t *vp) +{ + if( p_filter->pf_change_viewpoint != NULL ) + p_filter->pf_change_viewpoint( p_filter, vp ); +} + +/** + * This function will drain, then flush an audio filter. + */ +static inline block_t *filter_DrainAudio( filter_t *p_filter ) +{ + if( p_filter->pf_audio_drain ) + return p_filter->pf_audio_drain( p_filter ); + else + return NULL; +} + +/** + * This function will return a new subpicture usable by p_filter as an output + * buffer. You have to release it using subpicture_Delete or by returning it to + * the caller as a pf_sub_source return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new subpicture + */ +static inline subpicture_t *filter_NewSubpicture( filter_t *p_filter ) +{ + subpicture_t *subpic = p_filter->owner.sub.buffer_new( p_filter ); + if( subpic == NULL ) + msg_Warn( p_filter, "can't get output subpicture" ); + return subpic; +} + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +static inline int filter_GetInputAttachments( filter_t *p_filter, + input_attachment_t ***ppp_attachment, + int *pi_attachment ) +{ + if( !p_filter->pf_get_attachments ) + return VLC_EGENERIC; + return p_filter->pf_get_attachments( p_filter, + ppp_attachment, pi_attachment ); +} + +/** + * This function duplicates every variables from the filter, and adds a proxy + * callback to trigger filter events from obj. + * + * \param restart_cb a vlc_callback_t to call if the event means restarting the + * filter (i.e. an event on a non-command variable) + */ +VLC_API void filter_AddProxyCallbacks( vlc_object_t *obj, filter_t *filter, + vlc_callback_t restart_cb ); +# define filter_AddProxyCallbacks(a, b, c) \ + filter_AddProxyCallbacks(VLC_OBJECT(a), b, c) + +/** + * This function removes the callbacks previously added to every duplicated + * variables, and removes them afterward. + * + * \param restart_cb the same vlc_callback_t passed to filter_AddProxyCallbacks + */ +VLC_API void filter_DelProxyCallbacks( vlc_object_t *obj, filter_t *filter, + vlc_callback_t restart_cb); +# define filter_DelProxyCallbacks(a, b, c) \ + filter_DelProxyCallbacks(VLC_OBJECT(a), b, c) + +/** + * It creates a blend filter. + * + * Only the chroma properties of the dest format is used (chroma + * type, rgb masks and shifts) + */ +VLC_API filter_t * filter_NewBlend( vlc_object_t *, const video_format_t *p_dst_chroma ) VLC_USED; + +/** + * It configures blend filter parameters that are allowed to changed + * after the creation. + */ +VLC_API int filter_ConfigureBlend( filter_t *, int i_dst_width, int i_dst_height, const video_format_t *p_src ); + +/** + * It blends a picture into another one. + * + * The input picture is not modified and not released. + */ +VLC_API int filter_Blend( filter_t *, picture_t *p_dst, int i_dst_x, int i_dst_y, const picture_t *p_src, int i_alpha ); + +/** + * It destroys a blend filter created by filter_NewBlend. + */ +VLC_API void filter_DeleteBlend( filter_t * ); + +/** + * Create a picture_t *(*)( filter_t *, picture_t * ) compatible wrapper + * using a void (*)( filter_t *, picture_t *, picture_t * ) function + * + * Currently used by the chroma video filters + */ +#define VIDEO_FILTER_WRAPPER( name ) \ + static picture_t *name ## _Filter ( filter_t *p_filter, \ + picture_t *p_pic ) \ + { \ + picture_t *p_outpic = filter_NewPicture( p_filter ); \ + if( p_outpic ) \ + { \ + name( p_filter, p_pic, p_outpic ); \ + picture_CopyProperties( p_outpic, p_pic ); \ + } \ + picture_Release( p_pic ); \ + return p_outpic; \ + } + +/** + * Filter chain management API + * The filter chain management API is used to dynamically construct filters + * and add them in a chain. + */ + +typedef struct filter_chain_t filter_chain_t; + +/** + * Create new filter chain + * + * \param p_object pointer to a vlc object + * \param psz_capability vlc capability of filters in filter chain + * \return pointer to a filter chain + */ +filter_chain_t * filter_chain_New( vlc_object_t *, const char *, enum es_format_category_e ) +VLC_USED; +#define filter_chain_New( a, b, c ) filter_chain_New( VLC_OBJECT( a ), b, c ) + +/** + * Creates a new video filter chain. + * + * \param obj pointer to parent VLC object + * \param change whether to allow changing the output format + * \param owner owner video buffer callbacks + * \return new filter chain, or NULL on error + */ +VLC_API filter_chain_t * filter_chain_NewVideo( vlc_object_t *obj, bool change, + const filter_owner_t *owner ) +VLC_USED; +#define filter_chain_NewVideo( a, b, c ) \ + filter_chain_NewVideo( VLC_OBJECT( a ), b, c ) + +/** + * Delete filter chain will delete all filters in the chain and free all + * allocated data. The pointer to the filter chain is then no longer valid. + * + * \param p_chain pointer to filter chain + */ +VLC_API void filter_chain_Delete( filter_chain_t * ); + +/** + * Reset filter chain will delete all filters in the chain and + * reset p_fmt_in and p_fmt_out to the new values. + * + * \param p_chain pointer to filter chain + * \param p_fmt_in new fmt_in params, may be NULL to leave input fmt unchanged + * \param p_fmt_out new fmt_out params, may be NULL to leave output fmt unchanged + */ +VLC_API void filter_chain_Reset( filter_chain_t *, const es_format_t *, const es_format_t * ); + +/** + * Append a filter to the chain. + * + * \param chain filter chain to append a filter to + * \param name filter name + * \param fmt_in filter input format + * \param fmt_out filter output format + * \return a pointer to the filter or NULL on error + */ +VLC_API filter_t *filter_chain_AppendFilter(filter_chain_t *chain, + const char *name, config_chain_t *cfg, const es_format_t *fmt_in, + const es_format_t *fmt_out); + +/** + * Append a conversion to the chain. + * + * \param chain filter chain to append a filter to + * \param fmt_in filter input format + * \param fmt_out filter output format + * \retval 0 on success + * \retval -1 on failure + */ +VLC_API int filter_chain_AppendConverter(filter_chain_t *chain, + const es_format_t *fmt_in, const es_format_t *fmt_out); + +/** + * Append new filter to filter chain from string. + * + * \param chain filter chain to append a filter to + * \param str filters chain nul-terminated string + */ +VLC_API int filter_chain_AppendFromString(filter_chain_t *chain, + const char *str); + +/** + * Delete filter from filter chain. This function also releases the filter + * object and unloads the filter modules. The pointer to p_filter is no + * longer valid after this function successfully returns. + * + * \param chain filter chain to remove the filter from + * \param filter filter to remove from the chain and delete + */ +VLC_API void filter_chain_DeleteFilter(filter_chain_t *chain, + filter_t *filter); + +/** + * Checks if the filter chain is empty. + * + * \param chain pointer to filter chain + * \return true if and only if there are no filters in this filter chain + */ +VLC_API bool filter_chain_IsEmpty(const filter_chain_t *chain); + +/** + * Get last output format of the last element in the filter chain. + * + * \param chain filter chain + */ +VLC_API const es_format_t *filter_chain_GetFmtOut(filter_chain_t *chain); + +/** + * Apply the filter chain to a video picture. + * + * \param chain pointer to filter chain + * \param pic picture to apply filters to + * \return modified picture after applying all video filters + */ +VLC_API picture_t *filter_chain_VideoFilter(filter_chain_t *chain, + picture_t *pic); + +/** + * Flush a video filter chain. + */ +VLC_API void filter_chain_VideoFlush( filter_chain_t * ); + +/** + * Generate subpictures from a chain of subpicture source "filters". + * + * \param chain filter chain + * \param display_date of subpictures + */ +void filter_chain_SubSource(filter_chain_t *chain, spu_t *, + mtime_t display_date); + +/** + * Apply filter chain to subpictures. + * + * \param chain filter chain + * \param subpic subpicture to apply filters on + * \return modified subpicture after applying all subpicture filters + */ +VLC_API subpicture_t *filter_chain_SubFilter(filter_chain_t *chain, + subpicture_t *subpic); + +/** + * Apply the filter chain to a mouse state. + * + * It will be applied from the output to the input. It makes sense only + * for a video filter chain. + * + * The vlc_mouse_t* pointers may be the same. + */ +VLC_API int filter_chain_MouseFilter( filter_chain_t *, struct vlc_mouse_t *, + const struct vlc_mouse_t * ); + +/** + * Inform the filter chain of mouse state. + * + * It makes sense only for a sub source chain. + */ +VLC_API int filter_chain_MouseEvent( filter_chain_t *, + const struct vlc_mouse_t *, + const video_format_t * ); + +int filter_chain_ForEach( filter_chain_t *chain, + int (*cb)( filter_t *, void * ), void *opaque ); + +/** @} */ +#endif /* _VLC_FILTER_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_fingerprinter.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_fingerprinter.h new file mode 100644 index 0000000..dc10644 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_fingerprinter.h @@ -0,0 +1,91 @@ +/***************************************************************************** + * vlc_fingerprinter.h: Fingerprinter abstraction layer + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FINGERPRINTER_H +# define VLC_FINGERPRINTER_H + +#include +#include +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct fingerprinter_sys_t fingerprinter_sys_t; + +struct fingerprint_request_t +{ + input_item_t *p_item; + unsigned int i_duration; /* track length hint in seconds, 0 if unknown */ + struct + { + char *psz_fingerprint; + vlc_array_t metas_array; + } results ; +}; +typedef struct fingerprint_request_t fingerprint_request_t; + +static inline fingerprint_request_t *fingerprint_request_New( input_item_t *p_item ) +{ + fingerprint_request_t *p_r = + ( fingerprint_request_t * ) calloc( 1, sizeof( fingerprint_request_t ) ); + if ( !p_r ) return NULL; + p_r->results.psz_fingerprint = NULL; + p_r->i_duration = 0; + input_item_Hold( p_item ); + p_r->p_item = p_item; + vlc_array_init( & p_r->results.metas_array ); /* shouldn't be needed */ + return p_r; +} + +static inline void fingerprint_request_Delete( fingerprint_request_t *p_f ) +{ + input_item_Release( p_f->p_item ); + free( p_f->results.psz_fingerprint ); + for( size_t i = 0; i < vlc_array_count( & p_f->results.metas_array ); i++ ) + vlc_meta_Delete( (vlc_meta_t *) vlc_array_item_at_index( & p_f->results.metas_array, i ) ); + free( p_f ); +} + +struct fingerprinter_thread_t +{ + VLC_COMMON_MEMBERS + + /* Specific interfaces */ + fingerprinter_sys_t * p_sys; + + module_t * p_module; + + int ( *pf_enqueue ) ( struct fingerprinter_thread_t *f, fingerprint_request_t *r ); + fingerprint_request_t * ( *pf_getresults ) ( struct fingerprinter_thread_t *f ); + void ( *pf_apply ) ( fingerprint_request_t *, size_t i_resultid ); +}; +typedef struct fingerprinter_thread_t fingerprinter_thread_t; + +VLC_API fingerprinter_thread_t *fingerprinter_Create( vlc_object_t *p_this ); +VLC_API void fingerprinter_Destroy( fingerprinter_thread_t *p_fingerprint ); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_fourcc.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_fourcc.h new file mode 100644 index 0000000..0dc9f52 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_fourcc.h @@ -0,0 +1,692 @@ +/***************************************************************************** + * vlc_fourcc.h: Definition of various FOURCC and helpers + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: 9042a48a9bd206c8fb6228bbb04dbde136c25499 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FOURCC_H +#define VLC_FOURCC_H 1 + +#define VLC_CODEC_UNKNOWN VLC_FOURCC('u','n','d','f') + +/* Video codec */ +#define VLC_CODEC_MPGV VLC_FOURCC('m','p','g','v') +#define VLC_CODEC_MP4V VLC_FOURCC('m','p','4','v') +#define VLC_CODEC_DIV1 VLC_FOURCC('D','I','V','1') +#define VLC_CODEC_DIV2 VLC_FOURCC('D','I','V','2') +#define VLC_CODEC_DIV3 VLC_FOURCC('D','I','V','3') +#define VLC_CODEC_SVQ1 VLC_FOURCC('S','V','Q','1') +#define VLC_CODEC_SVQ3 VLC_FOURCC('S','V','Q','3') +#define VLC_CODEC_H264 VLC_FOURCC('h','2','6','4') +#define VLC_CODEC_H263 VLC_FOURCC('h','2','6','3') +#define VLC_CODEC_H263I VLC_FOURCC('I','2','6','3') +#define VLC_CODEC_H263P VLC_FOURCC('I','L','V','R') +#define VLC_CODEC_FLV1 VLC_FOURCC('F','L','V','1') +#define VLC_CODEC_H261 VLC_FOURCC('h','2','6','1') +#define VLC_CODEC_MJPG VLC_FOURCC('M','J','P','G') +#define VLC_CODEC_MJPGB VLC_FOURCC('m','j','p','b') +#define VLC_CODEC_LJPG VLC_FOURCC('L','J','P','G') +#define VLC_CODEC_WMV1 VLC_FOURCC('W','M','V','1') +#define VLC_CODEC_WMV2 VLC_FOURCC('W','M','V','2') +#define VLC_CODEC_WMV3 VLC_FOURCC('W','M','V','3') +#define VLC_CODEC_WMVA VLC_FOURCC('W','M','V','A') +#define VLC_CODEC_WMVP VLC_FOURCC('W','M','V','P') +#define VLC_CODEC_WMVP2 VLC_FOURCC('W','V','P','2') +#define VLC_CODEC_VC1 VLC_FOURCC('V','C','-','1') +#define VLC_CODEC_DAALA VLC_FOURCC('d','a','a','l') +#define VLC_CODEC_THEORA VLC_FOURCC('t','h','e','o') +#define VLC_CODEC_TARKIN VLC_FOURCC('t','a','r','k') +#define VLC_CODEC_DIRAC VLC_FOURCC('d','r','a','c') +#define VLC_CODEC_OGGSPOTS VLC_FOURCC('S','P','O','T') +#define VLC_CODEC_CAVS VLC_FOURCC('C','A','V','S') +#define VLC_CODEC_NUV VLC_FOURCC('N','J','P','G') +#define VLC_CODEC_RV10 VLC_FOURCC('R','V','1','0') +#define VLC_CODEC_RV13 VLC_FOURCC('R','V','1','3') +#define VLC_CODEC_RV20 VLC_FOURCC('R','V','2','0') +#define VLC_CODEC_RV30 VLC_FOURCC('R','V','3','0') +#define VLC_CODEC_RV40 VLC_FOURCC('R','V','4','0') +#define VLC_CODEC_VP3 VLC_FOURCC('V','P','3',' ') +#define VLC_CODEC_VP5 VLC_FOURCC('V','P','5',' ') +#define VLC_CODEC_VP6 VLC_FOURCC('V','P','6','2') +#define VLC_CODEC_VP6F VLC_FOURCC('V','P','6','F') +#define VLC_CODEC_VP6A VLC_FOURCC('V','P','6','A') +#define VLC_CODEC_MSVIDEO1 VLC_FOURCC('M','S','V','C') +#define VLC_CODEC_FLIC VLC_FOURCC('F','L','I','C') +#define VLC_CODEC_SP5X VLC_FOURCC('S','P','5','X') +#define VLC_CODEC_DV VLC_FOURCC('d','v',' ',' ') +#define VLC_CODEC_MSRLE VLC_FOURCC('m','r','l','e') +#define VLC_CODEC_HUFFYUV VLC_FOURCC('H','F','Y','U') +#define VLC_CODEC_FFVHUFF VLC_FOURCC('F','F','V','H') +#define VLC_CODEC_ASV1 VLC_FOURCC('A','S','V','1') +#define VLC_CODEC_ASV2 VLC_FOURCC('A','S','V','2') +#define VLC_CODEC_FFV1 VLC_FOURCC('F','F','V','1') +#define VLC_CODEC_VCR1 VLC_FOURCC('V','C','R','1') +#define VLC_CODEC_CLJR VLC_FOURCC('C','L','J','R') +#define VLC_CODEC_RPZA VLC_FOURCC('r','p','z','a') +#define VLC_CODEC_SMC VLC_FOURCC('s','m','c',' ') +#define VLC_CODEC_CINEPAK VLC_FOURCC('C','V','I','D') +#define VLC_CODEC_TSCC VLC_FOURCC('T','S','C','C') +#define VLC_CODEC_CSCD VLC_FOURCC('C','S','C','D') +#define VLC_CODEC_ZMBV VLC_FOURCC('Z','M','B','V') +#define VLC_CODEC_VMNC VLC_FOURCC('V','M','n','c') +#define VLC_CODEC_FMVC VLC_FOURCC('F','M','V','C') +#define VLC_CODEC_FRAPS VLC_FOURCC('F','P','S','1') +#define VLC_CODEC_TRUEMOTION1 VLC_FOURCC('D','U','C','K') +#define VLC_CODEC_TRUEMOTION2 VLC_FOURCC('T','M','2','0') +#define VLC_CODEC_QTRLE VLC_FOURCC('r','l','e',' ') +#define VLC_CODEC_QDRAW VLC_FOURCC('q','d','r','w') +#define VLC_CODEC_QPEG VLC_FOURCC('Q','P','E','G') +#define VLC_CODEC_ULTI VLC_FOURCC('U','L','T','I') +#define VLC_CODEC_VIXL VLC_FOURCC('V','I','X','L') +#define VLC_CODEC_LOCO VLC_FOURCC('L','O','C','O') +#define VLC_CODEC_WNV1 VLC_FOURCC('W','N','V','1') +#define VLC_CODEC_AASC VLC_FOURCC('A','A','S','C') +#define VLC_CODEC_INDEO2 VLC_FOURCC('I','V','2','0') +#define VLC_CODEC_INDEO3 VLC_FOURCC('I','V','3','1') +#define VLC_CODEC_INDEO4 VLC_FOURCC('I','V','4','1') +#define VLC_CODEC_INDEO5 VLC_FOURCC('I','V','5','0') +#define VLC_CODEC_FLASHSV VLC_FOURCC('F','S','V','1') +#define VLC_CODEC_KMVC VLC_FOURCC('K','M','V','C') +#define VLC_CODEC_SMACKVIDEO VLC_FOURCC('S','M','K','2') +#define VLC_CODEC_DNXHD VLC_FOURCC('A','V','d','n') +#define VLC_CODEC_8BPS VLC_FOURCC('8','B','P','S') +#define VLC_CODEC_MIMIC VLC_FOURCC('M','L','2','O') +#define VLC_CODEC_INTERPLAY VLC_FOURCC('i','m','v','e') +#define VLC_CODEC_IDCIN VLC_FOURCC('I','D','C','I') +#define VLC_CODEC_4XM VLC_FOURCC('4','X','M','V') +#define VLC_CODEC_ROQ VLC_FOURCC('R','o','Q','v') +#define VLC_CODEC_MDEC VLC_FOURCC('M','D','E','C') +#define VLC_CODEC_VMDVIDEO VLC_FOURCC('V','M','D','V') +#define VLC_CODEC_CDG VLC_FOURCC('C','D','G',' ') +#define VLC_CODEC_FRWU VLC_FOURCC('F','R','W','U') +#define VLC_CODEC_AMV VLC_FOURCC('A','M','V',' ') +#define VLC_CODEC_VP7 VLC_FOURCC('V','P','7','0') +#define VLC_CODEC_VP8 VLC_FOURCC('V','P','8','0') +#define VLC_CODEC_VP9 VLC_FOURCC('V','P','9','0') +#define VLC_CODEC_VP10 VLC_FOURCC('V','P',':','0') +#define VLC_CODEC_AV1 VLC_FOURCC('a','v','0','1') +#define VLC_CODEC_JPEG2000 VLC_FOURCC('J','P','2','K') +#define VLC_CODEC_LAGARITH VLC_FOURCC('L','A','G','S') +#define VLC_CODEC_FLASHSV2 VLC_FOURCC('F','S','V','2') +#define VLC_CODEC_PRORES VLC_FOURCC('a','p','c','n') +#define VLC_CODEC_MXPEG VLC_FOURCC('M','X','P','G') +#define VLC_CODEC_CDXL VLC_FOURCC('C','D','X','L') +#define VLC_CODEC_BMVVIDEO VLC_FOURCC('B','M','V','V') +#define VLC_CODEC_UTVIDEO VLC_FOURCC('U','L','R','A') +#define VLC_CODEC_VBLE VLC_FOURCC('V','B','L','E') +#define VLC_CODEC_DXTORY VLC_FOURCC('x','t','o','r') +#define VLC_CODEC_MSS1 VLC_FOURCC('M','S','S','1') +#define VLC_CODEC_MSS2 VLC_FOURCC('M','S','S','2') +#define VLC_CODEC_MSA1 VLC_FOURCC('M','S','A','1') +#define VLC_CODEC_TSC2 VLC_FOURCC('T','S','C','2') +#define VLC_CODEC_MTS2 VLC_FOURCC('M','T','S','2') +#define VLC_CODEC_HEVC VLC_FOURCC('h','e','v','c') +#define VLC_CODEC_ICOD VLC_FOURCC('i','c','o','d') +#define VLC_CODEC_G2M2 VLC_FOURCC('G','2','M','2') +#define VLC_CODEC_G2M3 VLC_FOURCC('G','2','M','3') +#define VLC_CODEC_G2M4 VLC_FOURCC('G','2','M','4') +#define VLC_CODEC_BINKVIDEO VLC_FOURCC('B','I','K','f') +#define VLC_CODEC_BINKAUDIO_DCT VLC_FOURCC('B','A','U','1') +#define VLC_CODEC_BINKAUDIO_RDFT VLC_FOURCC('B','A','U','2') +#define VLC_CODEC_XAN_WC4 VLC_FOURCC('X','x','a','n') +#define VLC_CODEC_LCL_MSZH VLC_FOURCC('M','S','Z','H') +#define VLC_CODEC_LCL_ZLIB VLC_FOURCC('Z','L','I','B') +#define VLC_CODEC_THP VLC_FOURCC('T','H','P','0') +#define VLC_CODEC_ESCAPE124 VLC_FOURCC('E','1','2','4') +#define VLC_CODEC_KGV1 VLC_FOURCC('K','G','V','1') +#define VLC_CODEC_CLLC VLC_FOURCC('C','L','L','C') +#define VLC_CODEC_AURA VLC_FOURCC('A','U','R','A') +#define VLC_CODEC_FIC VLC_FOURCC('F','I','C','V') +#define VLC_CODEC_TMV VLC_FOURCC('T','M','A','V') +#define VLC_CODEC_XAN_WC3 VLC_FOURCC('X','A','N','3') +#define VLC_CODEC_WS_VQA VLC_FOURCC('W','V','Q','A') +#define VLC_CODEC_MMVIDEO VLC_FOURCC('M','M','V','I') +#define VLC_CODEC_AVS VLC_FOURCC('A','V','S','V') +#define VLC_CODEC_DSICINVIDEO VLC_FOURCC('D','C','I','V') +#define VLC_CODEC_TIERTEXSEQVIDEO VLC_FOURCC('T','S','E','Q') +#define VLC_CODEC_DXA VLC_FOURCC('D','E','X','A') +#define VLC_CODEC_C93 VLC_FOURCC('I','C','9','3') +#define VLC_CODEC_BETHSOFTVID VLC_FOURCC('B','V','I','D') +#define VLC_CODEC_VB VLC_FOURCC('V','B','V','1') +#define VLC_CODEC_RL2 VLC_FOURCC('R','L','V','2') +#define VLC_CODEC_BFI VLC_FOURCC('B','F','&','I') +#define VLC_CODEC_CMV VLC_FOURCC('E','C','M','V') +#define VLC_CODEC_MOTIONPIXELS VLC_FOURCC('M','P','I','X') +#define VLC_CODEC_TGV VLC_FOURCC('T','G','V','V') +#define VLC_CODEC_TGQ VLC_FOURCC('T','G','Q','V') +#define VLC_CODEC_TQI VLC_FOURCC('T','Q','I','V') +#define VLC_CODEC_MAD VLC_FOURCC('M','A','D','V') +#define VLC_CODEC_ANM VLC_FOURCC('A','N','I','M') +#define VLC_CODEC_YOP VLC_FOURCC('Y','O','P','V') +#define VLC_CODEC_JV VLC_FOURCC('J','V','0','0') +#define VLC_CODEC_DFA VLC_FOURCC('D','F','I','A') +#define VLC_CODEC_HNM4_VIDEO VLC_FOURCC('H','N','M','4') +#define VLC_CODEC_TDSC VLC_FOURCC('T','D','S','C') +#define VLC_CODEC_HQX VLC_FOURCC('C','H','Q','X') +#define VLC_CODEC_HQ_HQA VLC_FOURCC('C','U','V','C') +#define VLC_CODEC_HAP VLC_FOURCC('H','A','P','1') +#define VLC_CODEC_DXV VLC_FOURCC('D','X','D','3') +#define VLC_CODEC_CINEFORM VLC_FOURCC('C','F','H','D') +#define VLC_CODEC_SPEEDHQ VLC_FOURCC('S','H','Q','2') +#define VLC_CODEC_PIXLET VLC_FOURCC('p','x','l','t') + +/*********** + * Chromas + ***********/ + +/* Planar YUV */ + +/* Planar YUV 4:1:0 Y:V:U */ +#define VLC_CODEC_YV9 VLC_FOURCC('Y','V','U','9') +/* Planar YUV 4:1:0 Y:U:V */ +#define VLC_CODEC_I410 VLC_FOURCC('I','4','1','0') +/* Planar YUV 4:1:1 Y:U:V */ +#define VLC_CODEC_I411 VLC_FOURCC('I','4','1','1') + +/* Planar YUV 4:2:0 Y:V:U */ +#define VLC_CODEC_YV12 VLC_FOURCC('Y','V','1','2') +/* Planar YUV 4:2:0 Y:U:V 8-bit */ +#define VLC_CODEC_I420 VLC_FOURCC('I','4','2','0') +/* Planar YUV 4:2:0 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I420_9L VLC_FOURCC('I','0','9','L') +#define VLC_CODEC_I420_9B VLC_FOURCC('I','0','9','B') +/* Planar YUV 4:2:0 Y:U:V 10-bit stored on 16 bits LSB */ +#define VLC_CODEC_I420_10L VLC_FOURCC('I','0','A','L') +#define VLC_CODEC_I420_10B VLC_FOURCC('I','0','A','B') +/* Planar YUV 4:2:0 Y:U:V 12-bit stored on 16 bits */ +#define VLC_CODEC_I420_12L VLC_FOURCC('I','0','C','L') +#define VLC_CODEC_I420_12B VLC_FOURCC('I','0','C','B') + +/* Planar YUV 4:2:0 Y:U:V 16-bit stored on 16 bits */ +#define VLC_CODEC_I420_16L VLC_FOURCC('I','0','F','L') +#define VLC_CODEC_I420_16B VLC_FOURCC('I','0','F','B') + +/* Planar YUV 4:2:2 Y:U:V 8-bit */ +#define VLC_CODEC_I422 VLC_FOURCC('I','4','2','2') +/* Planar YUV 4:2:2 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I422_9L VLC_FOURCC('I','2','9','L') +#define VLC_CODEC_I422_9B VLC_FOURCC('I','2','9','B') +/* Planar YUV 4:2:2 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I422_10L VLC_FOURCC('I','2','A','L') +#define VLC_CODEC_I422_10B VLC_FOURCC('I','2','A','B') +/* Planar YUV 4:2:2 Y:U:V 12-bit stored on 16 bits */ +#define VLC_CODEC_I422_12L VLC_FOURCC('I','2','C','L') +#define VLC_CODEC_I422_12B VLC_FOURCC('I','2','C','B') + +/* Planar YUV 4:4:0 Y:U:V */ +#define VLC_CODEC_I440 VLC_FOURCC('I','4','4','0') +/* Planar YUV 4:4:4 Y:U:V 8-bit */ +#define VLC_CODEC_I444 VLC_FOURCC('I','4','4','4') +/* Planar YUV 4:4:4 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I444_9L VLC_FOURCC('I','4','9','L') +#define VLC_CODEC_I444_9B VLC_FOURCC('I','4','9','B') +/* Planar YUV 4:4:4 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I444_10L VLC_FOURCC('I','4','A','L') +#define VLC_CODEC_I444_10B VLC_FOURCC('I','4','A','B') +/* Planar YUV 4:4:4 Y:U:V 12-bit stored on 16 bits */ +#define VLC_CODEC_I444_12L VLC_FOURCC('I','4','C','L') +#define VLC_CODEC_I444_12B VLC_FOURCC('I','4','C','B') +/* Planar YUV 4:4:4 Y:U:V 16-bit */ +#define VLC_CODEC_I444_16L VLC_FOURCC('I','4','F','L') +#define VLC_CODEC_I444_16B VLC_FOURCC('I','4','F','B') + +/* Planar YUV 4:2:0 Y:U:V full scale */ +#define VLC_CODEC_J420 VLC_FOURCC('J','4','2','0') +/* Planar YUV 4:2:2 Y:U:V full scale */ +#define VLC_CODEC_J422 VLC_FOURCC('J','4','2','2') +/* Planar YUV 4:4:0 Y:U:V full scale */ +#define VLC_CODEC_J440 VLC_FOURCC('J','4','4','0') +/* Planar YUV 4:4:4 Y:U:V full scale */ +#define VLC_CODEC_J444 VLC_FOURCC('J','4','4','4') +/* Palettized YUV with palette element Y:U:V:A */ +#define VLC_CODEC_YUVP VLC_FOURCC('Y','U','V','P') + +/* Planar YUV 4:4:4 Y:U:V:A */ +#define VLC_CODEC_YUVA VLC_FOURCC('Y','U','V','A') +/* Planar YUV 4:2:2 Y:U:V:A */ +#define VLC_CODEC_YUV422A VLC_FOURCC('I','4','2','A') +/* Planar YUV 4:2:0 Y:U:V:A */ +#define VLC_CODEC_YUV420A VLC_FOURCC('I','4','0','A') + +/* Planar Y:U:V:A 4:4:4 10bits */ +#define VLC_CODEC_YUVA_444_10L VLC_FOURCC('Y','A','0','L') +#define VLC_CODEC_YUVA_444_10B VLC_FOURCC('Y','A','0','B') + +/* Semi-planar Y/UV */ + +/* 2 planes Y/UV 4:2:0 */ +#define VLC_CODEC_NV12 VLC_FOURCC('N','V','1','2') +/* 2 planes Y/VU 4:2:0 */ +#define VLC_CODEC_NV21 VLC_FOURCC('N','V','2','1') +/* 2 planes Y/UV 4:2:2 */ +#define VLC_CODEC_NV16 VLC_FOURCC('N','V','1','6') +/* 2 planes Y/VU 4:2:2 */ +#define VLC_CODEC_NV61 VLC_FOURCC('N','V','6','1') +/* 2 planes Y/UV 4:4:4 */ +#define VLC_CODEC_NV24 VLC_FOURCC('N','V','2','4') +/* 2 planes Y/VU 4:4:4 */ +#define VLC_CODEC_NV42 VLC_FOURCC('N','V','4','2') +/* 2 planes Y/UV 4:2:0 10-bit */ +#define VLC_CODEC_P010 VLC_FOURCC('P','0','1','0') + +/* Packed YUV */ + +/* Packed YUV 4:2:2, U:Y:V:Y */ +#define VLC_CODEC_UYVY VLC_FOURCC('U','Y','V','Y') +/* Packed YUV 4:2:2, V:Y:U:Y */ +#define VLC_CODEC_VYUY VLC_FOURCC('V','Y','U','Y') +/* Packed YUV 4:2:2, Y:U:Y:V */ +#define VLC_CODEC_YUYV VLC_FOURCC('Y','U','Y','2') +/* Packed YUV 4:2:2, Y:V:Y:U */ +#define VLC_CODEC_YVYU VLC_FOURCC('Y','V','Y','U') +/* Packed YUV 2:1:1, Y:U:Y:V */ +#define VLC_CODEC_Y211 VLC_FOURCC('Y','2','1','1') +/* Packed YUV 4:2:2, U:Y:V:Y, reverted */ +#define VLC_CODEC_CYUV VLC_FOURCC('c','y','u','v') +/* 10-bit 4:2:2 Component YCbCr */ +#define VLC_CODEC_V210 VLC_FOURCC('v','2','1','0') +/* I420 packed for RTP (RFC 4175) */ +#define VLC_CODEC_R420 VLC_FOURCC('r','4','2','0') +/* Packed YUV 4:4:4 V:U:Y:A */ +#define VLC_CODEC_VUYA VLC_FOURCC('V','U','Y','A') + + +/* RGB */ + +/* Palettized RGB with palette element R:G:B */ +#define VLC_CODEC_RGBP VLC_FOURCC('R','G','B','P') +/* 8 bits RGB */ +#define VLC_CODEC_RGB8 VLC_FOURCC('R','G','B','8') +/* 12 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB12 VLC_FOURCC('R','V','1','2') +/* 15 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB15 VLC_FOURCC('R','V','1','5') +/* 16 bits RGB */ +#define VLC_CODEC_RGB16 VLC_FOURCC('R','V','1','6') +/* 24 bits RGB */ +#define VLC_CODEC_RGB24 VLC_FOURCC('R','V','2','4') +/* 24 bits RGB padded to 32 bits */ +#define VLC_CODEC_RGB32 VLC_FOURCC('R','V','3','2') +/* 32 bits RGBA */ +#define VLC_CODEC_RGBA VLC_FOURCC('R','G','B','A') +/* 32 bits ARGB */ +#define VLC_CODEC_ARGB VLC_FOURCC('A','R','G','B') +/* 32 bits BGRA */ +#define VLC_CODEC_BGRA VLC_FOURCC('B','G','R','A') +/* 32 bits BGRA 10:10:10:2 */ +#define VLC_CODEC_RGBA10 VLC_FOURCC('R','G','A','0') +/* 64 bits RGBA */ +#define VLC_CODEC_RGBA64 VLC_FOURCC('R','G','A','4') + +/* Planar GBR 4:4:4 8 bits */ +#define VLC_CODEC_GBR_PLANAR VLC_FOURCC('G','B','R','8') +#define VLC_CODEC_GBR_PLANAR_9B VLC_FOURCC('G','B','9','B') +#define VLC_CODEC_GBR_PLANAR_9L VLC_FOURCC('G','B','9','L') +#define VLC_CODEC_GBR_PLANAR_10B VLC_FOURCC('G','B','A','B') +#define VLC_CODEC_GBR_PLANAR_10L VLC_FOURCC('G','B','A','L') +#define VLC_CODEC_GBR_PLANAR_16L VLC_FOURCC('G','B','F','L') +#define VLC_CODEC_GBR_PLANAR_16B VLC_FOURCC('G','B','F','B') + +/* 8 bits grey */ +#define VLC_CODEC_GREY VLC_FOURCC('G','R','E','Y') + +/* VDPAU video surface YCbCr 4:2:0 */ +#define VLC_CODEC_VDPAU_VIDEO_420 VLC_FOURCC('V','D','V','0') +/* VDPAU video surface YCbCr 4:2:2 */ +#define VLC_CODEC_VDPAU_VIDEO_422 VLC_FOURCC('V','D','V','2') +/* VDPAU video surface YCbCr 4:4:4 */ +#define VLC_CODEC_VDPAU_VIDEO_444 VLC_FOURCC('V','D','V','4') +/* VDPAU output surface RGBA */ +#define VLC_CODEC_VDPAU_OUTPUT VLC_FOURCC('V','D','O','R') + +/* VAAPI opaque surface */ +#define VLC_CODEC_VAAPI_420 VLC_FOURCC('V','A','O','P') /* 4:2:0 8 bpc */ +#define VLC_CODEC_VAAPI_420_10BPP VLC_FOURCC('V','A','O','0') /* 4:2:0 10 bpc */ + +/* MediaCodec/IOMX opaque buffer type */ +#define VLC_CODEC_ANDROID_OPAQUE VLC_FOURCC('A','N','O','P') + +/* Broadcom MMAL opaque buffer type */ +#define VLC_CODEC_MMAL_OPAQUE VLC_FOURCC('M','M','A','L') + +/* DXVA2 opaque video surface for use with D3D9 */ +#define VLC_CODEC_D3D9_OPAQUE VLC_FOURCC('D','X','A','9') /* 4:2:0 8 bpc */ +#define VLC_CODEC_D3D9_OPAQUE_10B VLC_FOURCC('D','X','A','0') /* 4:2:0 10 bpc */ + +/* D3D11VA opaque video surface for use with D3D11 */ +#define VLC_CODEC_D3D11_OPAQUE VLC_FOURCC('D','X','1','1') /* 4:2:0 8 bpc */ +#define VLC_CODEC_D3D11_OPAQUE_10B VLC_FOURCC('D','X','1','0') /* 4:2:0 10 bpc */ + +/* CVPixelBuffer opaque buffer type */ +#define VLC_CODEC_CVPX_NV12 VLC_FOURCC('C','V','P','N') +#define VLC_CODEC_CVPX_UYVY VLC_FOURCC('C','V','P','Y') +#define VLC_CODEC_CVPX_I420 VLC_FOURCC('C','V','P','I') +#define VLC_CODEC_CVPX_BGRA VLC_FOURCC('C','V','P','B') +#define VLC_CODEC_CVPX_P010 VLC_FOURCC('C','V','P','P') + +/* Image codec (video) */ +#define VLC_CODEC_PNG VLC_FOURCC('p','n','g',' ') +#define VLC_CODEC_PPM VLC_FOURCC('p','p','m',' ') +#define VLC_CODEC_PGM VLC_FOURCC('p','g','m',' ') +#define VLC_CODEC_PGMYUV VLC_FOURCC('p','g','m','y') +#define VLC_CODEC_PAM VLC_FOURCC('p','a','m',' ') +#define VLC_CODEC_JPEG VLC_FOURCC('j','p','e','g') +#define VLC_CODEC_BPG VLC_FOURCC('B','P','G',0xFB) +#define VLC_CODEC_JPEGLS VLC_FOURCC('M','J','L','S') +#define VLC_CODEC_BMP VLC_FOURCC('b','m','p',' ') +#define VLC_CODEC_TIFF VLC_FOURCC('t','i','f','f') +#define VLC_CODEC_GIF VLC_FOURCC('g','i','f',' ') +#define VLC_CODEC_TARGA VLC_FOURCC('t','g','a',' ') +#define VLC_CODEC_SVG VLC_FOURCC('s','v','g',' ') +#define VLC_CODEC_SGI VLC_FOURCC('s','g','i',' ') +#define VLC_CODEC_PNM VLC_FOURCC('p','n','m',' ') +#define VLC_CODEC_PCX VLC_FOURCC('p','c','x',' ') +#define VLC_CODEC_XWD VLC_FOURCC('X','W','D',' ') +#define VLC_CODEC_TXD VLC_FOURCC('T','X','D',' ') + + +/* Audio codec */ +#define VLC_CODEC_MPGA VLC_FOURCC('m','p','g','a') +#define VLC_CODEC_MP4A VLC_FOURCC('m','p','4','a') +#define VLC_CODEC_ALS VLC_FOURCC('a','l','s',' ') +#define VLC_CODEC_A52 VLC_FOURCC('a','5','2',' ') +#define VLC_CODEC_EAC3 VLC_FOURCC('e','a','c','3') +#define VLC_CODEC_DTS VLC_FOURCC('d','t','s',' ') +#define VLC_CODEC_WMA1 VLC_FOURCC('W','M','A','1') +#define VLC_CODEC_WMA2 VLC_FOURCC('W','M','A','2') +#define VLC_CODEC_WMAP VLC_FOURCC('W','M','A','P') +#define VLC_CODEC_WMAL VLC_FOURCC('W','M','A','L') +#define VLC_CODEC_WMAS VLC_FOURCC('W','M','A','S') +#define VLC_CODEC_FLAC VLC_FOURCC('f','l','a','c') +#define VLC_CODEC_MLP VLC_FOURCC('m','l','p',' ') +#define VLC_CODEC_TRUEHD VLC_FOURCC('t','r','h','d') +#define VLC_CODEC_DVAUDIO VLC_FOURCC('d','v','a','u') +#define VLC_CODEC_SPEEX VLC_FOURCC('s','p','x',' ') +#define VLC_CODEC_OPUS VLC_FOURCC('O','p','u','s') +#define VLC_CODEC_VORBIS VLC_FOURCC('v','o','r','b') +#define VLC_CODEC_MACE3 VLC_FOURCC('M','A','C','3') +#define VLC_CODEC_MACE6 VLC_FOURCC('M','A','C','6') +#define VLC_CODEC_MUSEPACK7 VLC_FOURCC('M','P','C',' ') +#define VLC_CODEC_MUSEPACK8 VLC_FOURCC('M','P','C','K') +#define VLC_CODEC_RA_144 VLC_FOURCC('1','4','_','4') +#define VLC_CODEC_RA_288 VLC_FOURCC('2','8','_','8') +#define VLC_CODEC_INTERPLAY_DPCM VLC_FOURCC('i','d','p','c') +#define VLC_CODEC_ROQ_DPCM VLC_FOURCC('R','o','Q','a') +#define VLC_CODEC_DSICINAUDIO VLC_FOURCC('D','C','I','A') +#define VLC_CODEC_ADPCM_4XM VLC_FOURCC('4','x','m','a') +#define VLC_CODEC_ADPCM_EA VLC_FOURCC('A','D','E','A') +#define VLC_CODEC_ADPCM_XA VLC_FOURCC('x','a',' ',' ') +#define VLC_CODEC_ADPCM_ADX VLC_FOURCC('a','d','x',' ') +#define VLC_CODEC_ADPCM_IMA_WS VLC_FOURCC('A','I','W','S') +#define VLC_CODEC_ADPCM_G722 VLC_FOURCC('g','7','2','2') +#define VLC_CODEC_ADPCM_G726 VLC_FOURCC('g','7','2','6') +#define VLC_CODEC_ADPCM_SWF VLC_FOURCC('S','W','F','a') +#define VLC_CODEC_ADPCM_MS VLC_FOURCC('m','s',0x00,0x02) +#define VLC_CODEC_ADPCM_IMA_WAV VLC_FOURCC('m','s',0x00,0x11) +#define VLC_CODEC_ADPCM_IMA_AMV VLC_FOURCC('i','m','a','v') +#define VLC_CODEC_ADPCM_IMA_QT VLC_FOURCC('i','m','a','4') +#define VLC_CODEC_ADPCM_YAMAHA VLC_FOURCC('m','s',0x00,0x20) +#define VLC_CODEC_ADPCM_DK3 VLC_FOURCC('m','s',0x00,0x62) +#define VLC_CODEC_ADPCM_DK4 VLC_FOURCC('m','s',0x00,0x61) +#define VLC_CODEC_ADPCM_CREATIVE VLC_FOURCC('m','s',0x00,0xC0) +#define VLC_CODEC_ADPCM_SBPRO_2 VLC_FOURCC('m','s',0x00,0xC2) +#define VLC_CODEC_ADPCM_SBPRO_3 VLC_FOURCC('m','s',0x00,0xC3) +#define VLC_CODEC_ADPCM_SBPRO_4 VLC_FOURCC('m','s',0x00,0xC4) +#define VLC_CODEC_ADPCM_THP VLC_FOURCC('T','H','P','A') +#define VLC_CODEC_ADPCM_XA_EA VLC_FOURCC('X','A','J', 0) +#define VLC_CODEC_G723_1 VLC_FOURCC('g','7','2', 0x31) +#define VLC_CODEC_G729 VLC_FOURCC('g','7','2','9') +#define VLC_CODEC_VMDAUDIO VLC_FOURCC('v','m','d','a') +#define VLC_CODEC_AMR_NB VLC_FOURCC('s','a','m','r') +#define VLC_CODEC_AMR_WB VLC_FOURCC('s','a','w','b') +#define VLC_CODEC_ALAC VLC_FOURCC('a','l','a','c') +#define VLC_CODEC_QDM2 VLC_FOURCC('Q','D','M','2') +#define VLC_CODEC_QDMC VLC_FOURCC('Q','D','M','C') +#define VLC_CODEC_COOK VLC_FOURCC('c','o','o','k') +#define VLC_CODEC_SIPR VLC_FOURCC('s','i','p','r') +#define VLC_CODEC_TTA VLC_FOURCC('T','T','A','1') +#define VLC_CODEC_SHORTEN VLC_FOURCC('s','h','n',' ') +#define VLC_CODEC_WAVPACK VLC_FOURCC('W','V','P','K') +#define VLC_CODEC_GSM VLC_FOURCC('g','s','m',' ') +#define VLC_CODEC_GSM_MS VLC_FOURCC('a','g','s','m') +#define VLC_CODEC_ATRAC1 VLC_FOURCC('a','t','r','1') +#define VLC_CODEC_ATRAC3 VLC_FOURCC('a','t','r','c') +#define VLC_CODEC_ATRAC3P VLC_FOURCC('a','t','r','p') +#define VLC_CODEC_IMC VLC_FOURCC(0x1,0x4,0x0,0x0) +#define VLC_CODEC_TRUESPEECH VLC_FOURCC(0x22,0x0,0x0,0x0) +#define VLC_CODEC_NELLYMOSER VLC_FOURCC('N','E','L','L') +#define VLC_CODEC_APE VLC_FOURCC('A','P','E',' ') +#define VLC_CODEC_QCELP VLC_FOURCC('Q','c','l','p') +#define VLC_CODEC_302M VLC_FOURCC('3','0','2','m') +#define VLC_CODEC_DVD_LPCM VLC_FOURCC('l','p','c','m') +#define VLC_CODEC_DVDA_LPCM VLC_FOURCC('a','p','c','m') +#define VLC_CODEC_BD_LPCM VLC_FOURCC('b','p','c','m') +#define VLC_CODEC_WIDI_LPCM VLC_FOURCC('w','p','c','m') +#define VLC_CODEC_SDDS VLC_FOURCC('s','d','d','s') +#define VLC_CODEC_MIDI VLC_FOURCC('M','I','D','I') +#define VLC_CODEC_RALF VLC_FOURCC('R','A','L','F') + +#define VLC_CODEC_S8 VLC_FOURCC('s','8',' ',' ') +#define VLC_CODEC_U8 VLC_FOURCC('u','8',' ',' ') +#define VLC_CODEC_S16L VLC_FOURCC('s','1','6','l') +#define VLC_CODEC_S16L_PLANAR VLC_FOURCC('s','1','l','p') +#define VLC_CODEC_S16B VLC_FOURCC('s','1','6','b') +#define VLC_CODEC_U16L VLC_FOURCC('u','1','6','l') +#define VLC_CODEC_U16B VLC_FOURCC('u','1','6','b') +#define VLC_CODEC_S20B VLC_FOURCC('s','2','0','b') +#define VLC_CODEC_S24L VLC_FOURCC('s','2','4','l') +#define VLC_CODEC_S24B VLC_FOURCC('s','2','4','b') +#define VLC_CODEC_U24L VLC_FOURCC('u','2','4','l') +#define VLC_CODEC_U24B VLC_FOURCC('u','2','4','b') +#define VLC_CODEC_S24L32 VLC_FOURCC('s','2','4','4') +#define VLC_CODEC_S24B32 VLC_FOURCC('S','2','4','4') +#define VLC_CODEC_S32L VLC_FOURCC('s','3','2','l') +#define VLC_CODEC_S32B VLC_FOURCC('s','3','2','b') +#define VLC_CODEC_U32L VLC_FOURCC('u','3','2','l') +#define VLC_CODEC_U32B VLC_FOURCC('u','3','2','b') +#define VLC_CODEC_F32L VLC_FOURCC('f','3','2','l') +#define VLC_CODEC_F32B VLC_FOURCC('f','3','2','b') +#define VLC_CODEC_F64L VLC_FOURCC('f','6','4','l') +#define VLC_CODEC_F64B VLC_FOURCC('f','6','4','b') + +#define VLC_CODEC_ALAW VLC_FOURCC('a','l','a','w') +#define VLC_CODEC_MULAW VLC_FOURCC('m','l','a','w') +#define VLC_CODEC_DAT12 VLC_FOURCC('L','P','1','2') +#define VLC_CODEC_S24DAUD VLC_FOURCC('d','a','u','d') +#define VLC_CODEC_TWINVQ VLC_FOURCC('T','W','I','N') +#define VLC_CODEC_BMVAUDIO VLC_FOURCC('B','M','V','A') +#define VLC_CODEC_ULEAD_DV_AUDIO_NTSC VLC_FOURCC('m','s',0x02,0x15) +#define VLC_CODEC_ULEAD_DV_AUDIO_PAL VLC_FOURCC('m','s',0x02,0x16) +#define VLC_CODEC_INDEO_AUDIO VLC_FOURCC('m','s',0x04,0x02) +#define VLC_CODEC_METASOUND VLC_FOURCC('m','s',0x00,0x75) +#define VLC_CODEC_ON2AVC VLC_FOURCC('m','s',0x05,0x00) +#define VLC_CODEC_TAK VLC_FOURCC('t','a','k',' ') +#define VLC_CODEC_SMACKAUDIO VLC_FOURCC('S','M','K','A') +#define VLC_CODEC_ADPCM_IMA_EA_SEAD VLC_FOURCC('S','E','A','D') +#define VLC_CODEC_ADPCM_EA_R1 VLC_FOURCC('E','A','R','1') +#define VLC_CODEC_ADPCM_IMA_APC VLC_FOURCC('A','I','P','C') + +/* Subtitle */ +#define VLC_CODEC_SPU VLC_FOURCC('s','p','u',' ') +#define VLC_CODEC_DVBS VLC_FOURCC('d','v','b','s') +#define VLC_CODEC_SUBT VLC_FOURCC('s','u','b','t') +#define VLC_CODEC_XSUB VLC_FOURCC('X','S','U','B') +#define VLC_CODEC_SSA VLC_FOURCC('s','s','a',' ') +#define VLC_CODEC_TEXT VLC_FOURCC('T','E','X','T') +#define VLC_CODEC_TELETEXT VLC_FOURCC('t','e','l','x') +#define VLC_CODEC_KATE VLC_FOURCC('k','a','t','e') +#define VLC_CODEC_CMML VLC_FOURCC('c','m','m','l') +#define VLC_CODEC_ITU_T140 VLC_FOURCC('t','1','4','0') +#define VLC_CODEC_USF VLC_FOURCC('u','s','f',' ') +#define VLC_CODEC_OGT VLC_FOURCC('o','g','t',' ') +#define VLC_CODEC_CVD VLC_FOURCC('c','v','d',' ') +#define VLC_CODEC_TX3G VLC_FOURCC('t','x','3','g') +#define VLC_CODEC_ARIB_A VLC_FOURCC('a','r','b','a') +#define VLC_CODEC_ARIB_C VLC_FOURCC('a','r','b','c') +/* Blu-ray Presentation Graphics */ +#define VLC_CODEC_BD_PG VLC_FOURCC('b','d','p','g') +#define VLC_CODEC_BD_TEXT VLC_FOURCC('b','d','t','x') +/* EBU STL (TECH. 3264-E) */ +#define VLC_CODEC_EBU_STL VLC_FOURCC('S','T','L',' ') +#define VLC_CODEC_SCTE_18 VLC_FOURCC('S','C','1','8') +#define VLC_CODEC_SCTE_27 VLC_FOURCC('S','C','2','7') +/* EIA/CEA-608/708 */ +#define VLC_CODEC_CEA608 VLC_FOURCC('c','6','0','8') +#define VLC_CODEC_CEA708 VLC_FOURCC('c','7','0','8') +#define VLC_CODEC_TTML VLC_FOURCC('T','T','M','L') +#define VLC_CODEC_WEBVTT VLC_FOURCC('w','v','t','t') + +/* XYZ colorspace 12 bits packed in 16 bits, organisation |XXX0|YYY0|ZZZ0| */ +#define VLC_CODEC_XYZ12 VLC_FOURCC('X','Y','1','2') + + +/* Special endian dependent values + * The suffic N means Native + * The suffix I means Inverted (ie non native) */ +#ifdef WORDS_BIGENDIAN +# define VLC_CODEC_S16N VLC_CODEC_S16B +# define VLC_CODEC_U16N VLC_CODEC_U16B +# define VLC_CODEC_S24N VLC_CODEC_S24B +# define VLC_CODEC_U24N VLC_CODEC_U24B +# define VLC_CODEC_S32N VLC_CODEC_S32B +# define VLC_CODEC_U32N VLC_CODEC_U32B +# define VLC_CODEC_FL32 VLC_CODEC_F32B +# define VLC_CODEC_FL64 VLC_CODEC_F64B + +# define VLC_CODEC_S16I VLC_CODEC_S16L +# define VLC_CODEC_U16I VLC_CODEC_U16L +# define VLC_CODEC_S24I VLC_CODEC_S24L +# define VLC_CODEC_U24I VLC_CODEC_U24L +# define VLC_CODEC_S32I VLC_CODEC_S32L +# define VLC_CODEC_U32I VLC_CODEC_U32L + +#else +# define VLC_CODEC_S16N VLC_CODEC_S16L +# define VLC_CODEC_U16N VLC_CODEC_U16L +# define VLC_CODEC_S24N VLC_CODEC_S24L +# define VLC_CODEC_U24N VLC_CODEC_U24L +# define VLC_CODEC_S32N VLC_CODEC_S32L +# define VLC_CODEC_U32N VLC_CODEC_U32L +# define VLC_CODEC_FL32 VLC_CODEC_F32L +# define VLC_CODEC_FL64 VLC_CODEC_F64L + +# define VLC_CODEC_S16I VLC_CODEC_S16B +# define VLC_CODEC_U16I VLC_CODEC_U16B +# define VLC_CODEC_S24I VLC_CODEC_S24B +# define VLC_CODEC_U24I VLC_CODEC_U24B +# define VLC_CODEC_S32I VLC_CODEC_S32B +# define VLC_CODEC_U32I VLC_CODEC_U32B +#endif + +/* Non official codecs, used to force a profile in an encoder */ +/* MPEG-1 video */ +#define VLC_CODEC_MP1V VLC_FOURCC('m','p','1','v') +/* MPEG-2 video */ +#define VLC_CODEC_MP2V VLC_FOURCC('m','p','2','v') +/* MPEG-I/II layer 2 audio */ +#define VLC_CODEC_MP2 VLC_FOURCC('m','p','2',' ') +/* MPEG-I/II layer 3 audio */ +#define VLC_CODEC_MP3 VLC_FOURCC('m','p','3',' ') + +/** + * It returns the codec associated to a fourcc within an ES category. + * + * If not found, it will return the given fourcc. + * If found, it will always be one of the VLC_CODEC_ defined above. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns the codec associated to a fourcc stored in a zero terminated + * string. + * + * If the string is NULL or does not have exactly 4 characters, it will + * return 0, otherwise it behaves like vlc_fourcc_GetCodec. + * + * Provided for convenience. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char * ); + +/** + * It converts the given fourcc to an audio codec when possible. + * + * The fourccs converted are aflt, araw/pcm , twos, sowt. When an incompatible i_bits + * is detected, 0 is returned. + * The other fourccs go through vlc_fourcc_GetCodec and i_bits is not checked. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits ); + +/** + * It returns the description of the given fourcc or NULL if not found. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API const char * vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns a list (terminated with the value 0) of YUV fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetYUVFallback( vlc_fourcc_t ); + +/** + * It returns a list (terminated with the value 0) of RGB fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetRGBFallback( vlc_fourcc_t ); + +/** + * It returns true if the given fourcc is YUV and false otherwise. + */ +VLC_API bool vlc_fourcc_IsYUV( vlc_fourcc_t ); + +/** + * It returns true if the two fourccs are equivalent if their U&V planes are + * swapped. + */ +VLC_API bool vlc_fourcc_AreUVPlanesSwapped(vlc_fourcc_t , vlc_fourcc_t ); + +/** + * Chroma related information. + */ +typedef struct { + unsigned plane_count; + struct { + vlc_rational_t w; + vlc_rational_t h; + } p[4]; + unsigned pixel_size; /* Number of bytes per pixel for a plane */ + unsigned pixel_bits; /* Number of bits actually used bits per pixel for a plane */ +} vlc_chroma_description_t; + +/** + * It returns a vlc_chroma_description_t describing the requested fourcc or NULL + * if not found. + */ +VLC_API const vlc_chroma_description_t * vlc_fourcc_GetChromaDescription( vlc_fourcc_t fourcc ) VLC_USED; + +#endif /* _VLC_FOURCC_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_fs.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_fs.h new file mode 100644 index 0000000..8fda513 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_fs.h @@ -0,0 +1,294 @@ +/***************************************************************************** + * vlc_fs.h: File system helpers + ***************************************************************************** + * Copyright © 2006-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FS_H +#define VLC_FS_H 1 + +#include +#include + +struct stat; +struct iovec; + +#ifdef _WIN32 +# include +# ifndef stat +# define stat _stati64 +# endif +# ifndef fstat +# define fstat _fstati64 +# endif +# ifndef _MSC_VER +# undef lseek +# define lseek _lseeki64 +# endif +#endif + +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + + +/** + * \defgroup os Operating system + * @{ + * \defgroup file File system + * @{ + * + * \file + * The functions in this file help with using low-level Unix-style file + * descriptors, BSD sockets and directories. In general, they retain the + * prototype and most semantics from their respective standard equivalents. + * However, there are a few differences: + * - On Windows, file path arguments are expected in UTF-8 format. + * They are converted to UTF-16 internally, thus enabling access to paths + * outside of the local Windows ANSI code page. + * - On POSIX systems, file descriptors are created with the close-on-exec + * flag set (atomically where possible), so that they do not leak to + * child process after fork-and-exec. + * - vlc_scandir(), inspired by GNU scandir(), passes file names rather than + * dirent structure pointers to its callbacks. + * - vlc_accept() takes an extra boolean for nonblocking mode (compare with + * the flags parameter in POSIX.next accept4()). + * - Writing functions do not emit a SIGPIPE signal in case of broken pipe. + * + * \defgroup fd File descriptors + * @{ + */ + +/** + * Opens a system file handle. + * + * @param filename file path to open (with UTF-8 encoding) + * @param flags open() flags, see the C library open() documentation + * @return a file handle on success, -1 on error (see errno). + * @note Contrary to standard open(), this function returns a file handle + * with the close-on-exec flag preset. + */ +VLC_API int vlc_open(const char *filename, int flags, ...) VLC_USED; + +/** + * Opens a system file handle relative to an existing directory handle. + * + * @param dir directory file descriptor + * @param filename file path to open (with UTF-8 encoding) + * @param flags open() flags, see the C library open() documentation + * @return a file handle on success, -1 on error (see errno). + * @note Contrary to standard open(), this function returns a file handle + * with the close-on-exec flag preset. + */ +VLC_API int vlc_openat(int fd, const char *filename, int flags, ...) VLC_USED; + +VLC_API int vlc_mkstemp( char * ); + +/** + * Duplicates a file descriptor. The new file descriptor has the close-on-exec + * descriptor flag preset. + * @return a new file descriptor, -1 (see errno) + */ +VLC_API int vlc_dup(int) VLC_USED; + +/** + * Creates a pipe (see "man pipe" for further reference). The new file + * descriptors have the close-on-exec flag preset. + * @return 0 on success, -1 on error (see errno) + */ +VLC_API int vlc_pipe(int [2]) VLC_USED; + +/** + * Creates an anonymous regular file descriptor, i.e. a descriptor for a + * temporary file. + * + * The file is initially empty. The storage space is automatically reclaimed + * when all file descriptors referencing it are closed. + * + * The new file descriptor has the close-on-exec flag preset. + * + * @return a file descriptor on success, -1 on error (see errno) + */ +VLC_API int vlc_memfd(void) VLC_USED; + +/** + * Writes data to a file descriptor. Unlike write(), if EPIPE error occurs, + * this function does not generate a SIGPIPE signal. + * @note If the file descriptor is known to be neither a pipe/FIFO nor a + * connection-oriented socket, the normal write() should be used. + */ +VLC_API ssize_t vlc_write(int, const void *, size_t); + +/** + * Writes data from an iovec structure to a file descriptor. Unlike writev(), + * if EPIPE error occurs, this function does not generate a SIGPIPE signal. + */ +VLC_API ssize_t vlc_writev(int, const struct iovec *, int); + +/** + * Closes a file descriptor. + * + * This closes a file descriptor. If this is a last file descriptor for the + * underlying open file, the file is closed too; the exact semantics depend + * on the type of file. + * + * @note The file descriptor is always closed when the function returns, even + * if the function returns an error. The sole exception is if the file + * descriptor was not currently valid, and thus cannot be closed (errno will + * then be set to EBADF). + * + * @param fd file descriptor + * @return Normally, zero is returned. + * If an I/O error is detected before or while closing, the function may return + * -1. Such an error is unrecoverable since the descriptor is closed. + * + * A nul return value does not necessarily imply that all pending I/O + * succeeded, since I/O might still occur asynchronously afterwards. + */ +VLC_API int vlc_close(int fd); + +/** + * @} + */ + +/** + * Finds file/inode information - like stat(). + * @note As far as possible, fstat() should be used instead. + * + * @param filename UTF-8 file path + */ +VLC_API int vlc_stat(const char *filename, struct stat *) VLC_USED; + +/** + * Finds file/inode information, as lstat(). + * Consider using fstat() instead, if possible. + * + * @param filename UTF-8 file path + */ +VLC_API int vlc_lstat(const char *filename, struct stat *) VLC_USED; + +/** + * Removes a file. + * + * @param filename a UTF-8 string with the name of the file you want to delete. + * @return A 0 return value indicates success. A -1 return value indicates an + * error, and an error code is stored in errno + */ +VLC_API int vlc_unlink(const char *filename); + +/** + * Moves a file atomically. This only works within a single file system. + * + * @param oldpath path to the file before the move + * @param newpath intended path to the file after the move + * @return A 0 return value indicates success. A -1 return value indicates an + * error, and an error code is stored in errno + */ +VLC_API int vlc_rename(const char *oldpath, const char *newpath); + +VLC_API FILE * vlc_fopen( const char *filename, const char *mode ) VLC_USED; + +/** + * \defgroup dir Directories + * @{ + */ + +/** + * Opens a DIR pointer. + * + * @param dirname UTF-8 representation of the directory name + * @return a pointer to the DIR struct, or NULL in case of error. + * Release with standard closedir(). + */ +VLC_API DIR *vlc_opendir(const char *dirname) VLC_USED; + +/** + * Reads the next file name from an open directory. + * + * @param dir directory handle as returned by vlc_opendir() + * (must not be used by another thread concurrently) + * + * @return a UTF-8 string of the directory entry. The string is valid until + * the next call to vlc_readdir() or closedir() on the handle. + * If there are no more entries in the directory, NULL is returned. + * If an error occurs, errno is set and NULL is returned. + */ +VLC_API const char *vlc_readdir(DIR *dir) VLC_USED; + +VLC_API int vlc_loaddir( DIR *dir, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); +VLC_API int vlc_scandir( const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); + +/** + * Creates a directory. + * + * @param dirname a UTF-8 string with the name of the directory that you + * want to create. + * @param mode directory permissions + * @return 0 on success, -1 on error (see errno). + */ +VLC_API int vlc_mkdir(const char *dirname, mode_t mode); + +/** + * Determines the current working directory. + * + * @return the current working directory (must be free()'d) + * or NULL on error + */ +VLC_API char *vlc_getcwd(void) VLC_USED; + +/** @} */ +/** @} */ + +#if defined( _WIN32 ) +typedef struct vlc_DIR +{ + _WDIR *wdir; /* MUST be first, see */ + char *entry; + union + { + DWORD drives; + bool insert_dot_dot; + } u; +} vlc_DIR; + +static inline int vlc_closedir( DIR *dir ) +{ + vlc_DIR *vdir = (vlc_DIR *)dir; + _WDIR *wdir = vdir->wdir; + + free( vdir->entry ); + free( vdir ); + return (wdir != NULL) ? _wclosedir( wdir ) : 0; +} +# undef closedir +# define closedir vlc_closedir + +static inline void vlc_rewinddir( DIR *dir ) +{ + _WDIR *wdir = *(_WDIR **)dir; + + _wrewinddir( wdir ); +} +# undef rewinddir +# define rewinddir vlc_rewinddir +#endif + +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_gcrypt.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_gcrypt.h new file mode 100644 index 0000000..a04e1b1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_gcrypt.h @@ -0,0 +1,47 @@ +/***************************************************************************** + * vlc_gcrypt.h: VLC thread support for gcrypt + ***************************************************************************** + * Copyright (C) 2004-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file implements gcrypt support functions in vlc + */ + +#include + +static inline void vlc_gcrypt_init (void) +{ + /* This would need a process-wide static mutex with all libraries linking + * to a given instance of libgcrypt. We cannot do this as we have different + * plugins linking with gcrypt, and some underlying libraries may use it + * behind our back. Only way is to always link gcrypt statically (ouch!) or + * have upstream gcrypt provide one shared object per threading system. */ + static bool done = false; + + vlc_global_lock (VLC_GCRYPT_MUTEX); + if (!done) + { + /* The suggested way for an application to make sure that global_init + * has been called is by using gcry_check_version. (see global_init + * comments in gcrypt sources) */ + gcry_check_version(NULL); + done = true; + } + vlc_global_unlock (VLC_GCRYPT_MUTEX); +} diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_http.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_http.h new file mode 100644 index 0000000..6811e5d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_http.h @@ -0,0 +1,97 @@ +/***************************************************************************** + * vlc_http.h: Shared code for HTTP clients + ***************************************************************************** + * Copyright (C) 2001-2008 VLC authors and VideoLAN + * $Id: ed7e1613da0bc45b680f3887846f80cf118f36a4 $ + * + * Authors: Laurent Aimar + * Christophe Massiot + * Rémi Denis-Courmont + * Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTP_H +#define VLC_HTTP_H 1 + +/** + * \file + * This file defines functions, structures, enums and macros shared between + * HTTP clients. + */ + +#include +#include + +/* RFC 2617: Basic and Digest Access Authentication */ +typedef struct vlc_http_auth_t +{ + char *psz_realm; + char *psz_domain; + char *psz_nonce; + char *psz_opaque; + char *psz_stale; + char *psz_algorithm; + char *psz_qop; + int i_nonce; + char *psz_cnonce; + char *psz_HA1; /* stored H(A1) value if algorithm = "MD5-sess" */ +} vlc_http_auth_t; + + +VLC_API void vlc_http_auth_Init( vlc_http_auth_t * ); +VLC_API void vlc_http_auth_Deinit( vlc_http_auth_t * ); +VLC_API void vlc_http_auth_ParseWwwAuthenticateHeader + ( vlc_object_t *, vlc_http_auth_t * , const char * ); +VLC_API int vlc_http_auth_ParseAuthenticationInfoHeader + ( vlc_object_t *, vlc_http_auth_t *, + const char *, const char *, + const char *, const char *, + const char * ); +VLC_API char *vlc_http_auth_FormatAuthorizationHeader + ( vlc_object_t *, vlc_http_auth_t *, + const char *, const char *, + const char *, const char * ) VLC_USED; + +/* RFC 6265: cookies */ + +typedef struct vlc_http_cookie_jar_t vlc_http_cookie_jar_t; + +VLC_API vlc_http_cookie_jar_t * vlc_http_cookies_new( void ) VLC_USED; +VLC_API void vlc_http_cookies_destroy( vlc_http_cookie_jar_t * p_jar ); + +/** + * Parse a value of an incoming Set-Cookie header and append the + * cookie to the cookie jar if appropriate. + * + * @param jar cookie jar object + * @param cookie header field value of Set-Cookie + * @return true, if the cookie was added, false otherwise + */ +VLC_API bool vlc_http_cookies_store( vlc_http_cookie_jar_t *jar, + const char *cookie, const char *host, const char *path ); + +/** + * Returns a cookie value that match the given URL. + * + * @param p_jar a cookie jar + * @param p_url the URL for which the cookies are returned + * @return A string consisting of semicolon-separated cookie NAME=VALUE pairs. + */ +VLC_API char *vlc_http_cookies_fetch( vlc_http_cookie_jar_t *jar, bool secure, + const char *host, const char *path ); + +#endif /* VLC_HTTP_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_httpd.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_httpd.h new file mode 100644 index 0000000..2cbf035 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_httpd.h @@ -0,0 +1,152 @@ +/***************************************************************************** + * vlc_httpd.h: builtin HTTP/RTSP server. + ***************************************************************************** + * Copyright (C) 2004-2006 VLC authors and VideoLAN + * $Id: 29b8229e7b6baa7a8eedf37f6fdb1e97bf6a9ca7 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTPD_H +#define VLC_HTTPD_H 1 + +/** + * \file + * HTTP/RTSP server API. + */ + +enum +{ + HTTPD_MSG_NONE, + + /* answer */ + HTTPD_MSG_ANSWER, + + /* http request */ + HTTPD_MSG_GET, + HTTPD_MSG_HEAD, + HTTPD_MSG_POST, + + /* rtsp request */ + HTTPD_MSG_OPTIONS, + HTTPD_MSG_DESCRIBE, + HTTPD_MSG_SETUP, + HTTPD_MSG_PLAY, + HTTPD_MSG_PAUSE, + HTTPD_MSG_GETPARAMETER, + HTTPD_MSG_TEARDOWN, + + /* just to track the count of MSG */ + HTTPD_MSG_MAX +}; + +enum +{ + HTTPD_PROTO_NONE, + HTTPD_PROTO_HTTP, /* HTTP/1.x */ + HTTPD_PROTO_RTSP, /* RTSP/1.x */ + HTTPD_PROTO_HTTP0, /* HTTP/0.x */ +}; + +typedef struct httpd_host_t httpd_host_t; +typedef struct httpd_client_t httpd_client_t; +/* create a new host */ +VLC_API httpd_host_t *vlc_http_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_https_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_rtsp_HostNew( vlc_object_t * ) VLC_USED; +/* delete a host */ +VLC_API void httpd_HostDelete( httpd_host_t * ); + +typedef struct +{ + char * name; + char * value; +} httpd_header; + +typedef struct httpd_message_t +{ + httpd_client_t *cl; /* NULL if not throught a connection e vlc internal */ + + uint8_t i_type; + uint8_t i_proto; + uint8_t i_version; + + /* for an answer */ + int i_status; + + /* for a query */ + char *psz_url; + /* FIXME find a clean way to handle GET(psz_args) + and POST(body) through the same code */ + uint8_t *psz_args; + + /* options */ + size_t i_headers; + httpd_header *p_headers; + + /* body */ + int64_t i_body_offset; + int i_body; + uint8_t *p_body; + +} httpd_message_t; + +typedef struct httpd_url_t httpd_url_t; +typedef struct httpd_callback_sys_t httpd_callback_sys_t; +typedef int (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query ); +/* register a new url */ +VLC_API httpd_url_t * httpd_UrlNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password ) VLC_USED; +/* register callback on a url */ +VLC_API int httpd_UrlCatch( httpd_url_t *, int i_msg, httpd_callback_t, httpd_callback_sys_t * ); +/* delete a url */ +VLC_API void httpd_UrlDelete( httpd_url_t * ); + +VLC_API char* httpd_ClientIP( const httpd_client_t *cl, char *, int * ); +VLC_API char* httpd_ServerIP( const httpd_client_t *cl, char *, int * ); + +/* High level */ + +typedef struct httpd_file_t httpd_file_t; +typedef struct httpd_file_sys_t httpd_file_sys_t; +typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_file_t * httpd_FileNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password, httpd_file_callback_t pf_fill, httpd_file_sys_t * ) VLC_USED; +VLC_API httpd_file_sys_t * httpd_FileDelete( httpd_file_t * ); + + +typedef struct httpd_handler_t httpd_handler_t; +typedef int (*httpd_handler_callback_t)( void *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_handler_t * httpd_HandlerNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password, httpd_handler_callback_t pf_fill, void * ) VLC_USED; +VLC_API void * httpd_HandlerDelete( httpd_handler_t * ); + +typedef struct httpd_redirect_t httpd_redirect_t; +VLC_API httpd_redirect_t * httpd_RedirectNew( httpd_host_t *, const char *psz_url_dst, const char *psz_url_src ) VLC_USED; +VLC_API void httpd_RedirectDelete( httpd_redirect_t * ); + + +typedef struct httpd_stream_t httpd_stream_t; +VLC_API httpd_stream_t * httpd_StreamNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password ) VLC_USED; +VLC_API void httpd_StreamDelete( httpd_stream_t * ); +VLC_API int httpd_StreamHeader( httpd_stream_t *, uint8_t *p_data, int i_data ); +VLC_API int httpd_StreamSend( httpd_stream_t *, const block_t *p_block ); +VLC_API int httpd_StreamSetHTTPHeaders(httpd_stream_t *, const httpd_header *, size_t); + +/* Msg functions facilities */ +VLC_API void httpd_MsgAdd( httpd_message_t *, const char *psz_name, const char *psz_value, ... ) VLC_FORMAT( 3, 4 ); +/* return "" if not found. The string is not allocated */ +VLC_API const char * httpd_MsgGet( const httpd_message_t *, const char *psz_name ); + +#endif /* _VLC_HTTPD_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_image.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_image.h new file mode 100644 index 0000000..2c5896f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_image.h @@ -0,0 +1,81 @@ +/***************************************************************************** + * vlc_image.h : wrapper for image reading/writing facilities + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: 2b308fd0e52f4d4d6e20f95d08e0d63c53822eef $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_IMAGE_H +#define VLC_IMAGE_H 1 + +# include +# include + +/** + * \file + * This file defines functions and structures for image conversions in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +struct image_handler_t +{ + picture_t * (*pf_read) ( image_handler_t *, block_t *, + const video_format_t *, video_format_t * ); + picture_t * (*pf_read_url) ( image_handler_t *, const char *, + video_format_t *, video_format_t * ); + block_t * (*pf_write) ( image_handler_t *, picture_t *, + const video_format_t *, const video_format_t * ); + int (*pf_write_url) ( image_handler_t *, picture_t *, + const video_format_t *, video_format_t *, + const char * ); + + picture_t * (*pf_convert) ( image_handler_t *, picture_t *, + const video_format_t *, video_format_t * ); + + /* Private properties */ + vlc_object_t *p_parent; + decoder_t *p_dec; + encoder_t *p_enc; + filter_t *p_filter; + + picture_fifo_t *outfifo; +}; + +VLC_API image_handler_t * image_HandlerCreate( vlc_object_t * ) VLC_USED; +#define image_HandlerCreate( a ) image_HandlerCreate( VLC_OBJECT(a) ) +VLC_API void image_HandlerDelete( image_handler_t * ); + +#define image_Read( a, b, c, d ) a->pf_read( a, b, c, d ) +#define image_ReadUrl( a, b, c, d ) a->pf_read_url( a, b, c, d ) +#define image_Write( a, b, c, d ) a->pf_write( a, b, c, d ) +#define image_WriteUrl( a, b, c, d, e ) a->pf_write_url( a, b, c, d, e ) +#define image_Convert( a, b, c, d ) a->pf_convert( a, b, c, d ) + +VLC_API vlc_fourcc_t image_Type2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Ext2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Mime2Fourcc( const char *psz_mime ); + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_IMAGE_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_inhibit.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_inhibit.h new file mode 100644 index 0000000..b1f7330 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_inhibit.h @@ -0,0 +1,54 @@ +/***************************************************************************** + * vlc_inhibit.h: VLC screen saver inhibition + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines the interface for screen-saver inhibition modules + */ + +#ifndef VLC_INHIBIT_H +# define VLC_INHIBIT_H 1 + +typedef struct vlc_inhibit vlc_inhibit_t; +typedef struct vlc_inhibit_sys vlc_inhibit_sys_t; + +enum vlc_inhibit_flags +{ + VLC_INHIBIT_NONE=0 /*< No inhibition */, + VLC_INHIBIT_SUSPEND=0x1 /*< Processor is in use - do not suspend */, + VLC_INHIBIT_DISPLAY=0x2 /*< Display is in use - do not blank/lock */, +#define VLC_INHIBIT_AUDIO (VLC_INHIBIT_SUSPEND) +#define VLC_INHIBIT_VIDEO (VLC_INHIBIT_SUSPEND|VLC_INHIBIT_DISPLAY) +}; + +struct vlc_inhibit +{ + VLC_COMMON_MEMBERS + + vlc_inhibit_sys_t *p_sys; + void (*inhibit) (vlc_inhibit_t *, unsigned flags); +}; + +static inline void vlc_inhibit_Set (vlc_inhibit_t *ih, unsigned flags) +{ + ih->inhibit (ih, flags); +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_input.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_input.h new file mode 100644 index 0000000..85b4d3d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_input.h @@ -0,0 +1,703 @@ +/***************************************************************************** + * vlc_input.h: Core input structures + ***************************************************************************** + * Copyright (C) 1999-2015 VLC authors and VideoLAN + * $Id: d20585ba33030980fa496cd042227b543f10827a $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INPUT_H +#define VLC_INPUT_H 1 + +/** + * \defgroup input Input + * Input thread + * @{ + * \file + * Input thread interface + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +/***************************************************************************** + * Seek point: (generalisation of chapters) + *****************************************************************************/ +struct seekpoint_t +{ + int64_t i_time_offset; + char *psz_name; +}; + +static inline seekpoint_t *vlc_seekpoint_New( void ) +{ + seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) ); + if( !point ) + return NULL; + point->i_time_offset = -1; + point->psz_name = NULL; + return point; +} + +static inline void vlc_seekpoint_Delete( seekpoint_t *point ) +{ + if( !point ) return; + free( point->psz_name ); + free( point ); +} + +static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src ) +{ + seekpoint_t *point = vlc_seekpoint_New(); + if( likely(point) ) + { + if( src->psz_name ) point->psz_name = strdup( src->psz_name ); + point->i_time_offset = src->i_time_offset; + } + return point; +} + +/***************************************************************************** + * Title: + *****************************************************************************/ + +/* input_title_t.i_flags field */ +#define INPUT_TITLE_MENU 0x01 /* Menu title */ +#define INPUT_TITLE_INTERACTIVE 0x02 /* Interactive title. Playback position has no meaning. */ + +typedef struct input_title_t +{ + char *psz_name; + + int64_t i_length; /* Length(microsecond) if known, else 0 */ + + unsigned i_flags; /* Is it a menu or a normal entry */ + + /* Title seekpoint */ + int i_seekpoint; + seekpoint_t **seekpoint; +} input_title_t; + +static inline input_title_t *vlc_input_title_New(void) +{ + input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) ); + if( !t ) + return NULL; + + t->psz_name = NULL; + t->i_flags = 0; + t->i_length = 0; + t->i_seekpoint = 0; + t->seekpoint = NULL; + + return t; +} + +static inline void vlc_input_title_Delete( input_title_t *t ) +{ + int i; + if( t == NULL ) + return; + + free( t->psz_name ); + for( i = 0; i < t->i_seekpoint; i++ ) + vlc_seekpoint_Delete( t->seekpoint[i] ); + free( t->seekpoint ); + free( t ); +} + +static inline input_title_t *vlc_input_title_Duplicate( const input_title_t *t ) +{ + input_title_t *dup = vlc_input_title_New( ); + if( dup == NULL) return NULL; + + if( t->psz_name ) dup->psz_name = strdup( t->psz_name ); + dup->i_flags = t->i_flags; + dup->i_length = t->i_length; + if( t->i_seekpoint > 0 ) + { + dup->seekpoint = (seekpoint_t**)vlc_alloc( t->i_seekpoint, sizeof(seekpoint_t*) ); + if( likely(dup->seekpoint) ) + { + for( int i = 0; i < t->i_seekpoint; i++ ) + dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] ); + dup->i_seekpoint = t->i_seekpoint; + } + } + + return dup; +} + +/***************************************************************************** + * Attachments + *****************************************************************************/ +struct input_attachment_t +{ + char *psz_name; + char *psz_mime; + char *psz_description; + + size_t i_data; + void *p_data; +}; + +static inline void vlc_input_attachment_Delete( input_attachment_t *a ) +{ + if( !a ) + return; + + free( a->p_data ); + free( a->psz_description ); + free( a->psz_mime ); + free( a->psz_name ); + free( a ); +} + +static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name, + const char *psz_mime, + const char *psz_description, + const void *p_data, + size_t i_data ) +{ + input_attachment_t *a = (input_attachment_t *)malloc( sizeof (*a) ); + if( unlikely(a == NULL) ) + return NULL; + + a->psz_name = strdup( psz_name ? psz_name : "" ); + a->psz_mime = strdup( psz_mime ? psz_mime : "" ); + a->psz_description = strdup( psz_description ? psz_description : "" ); + a->i_data = i_data; + a->p_data = malloc( i_data ); + if( i_data > 0 && likely(a->p_data != NULL) ) + memcpy( a->p_data, p_data, i_data ); + + if( unlikely(a->psz_name == NULL || a->psz_mime == NULL + || a->psz_description == NULL || (i_data > 0 && a->p_data == NULL)) ) + { + vlc_input_attachment_Delete( a ); + a = NULL; + } + return a; +} + +static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a ) +{ + return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description, + a->p_data, a->i_data ); +} + +/***************************************************************************** + * input defines/constants. + *****************************************************************************/ + +/** + * This defines an opaque input resource handler. + */ +typedef struct input_resource_t input_resource_t; + +/** + * Main structure representing an input thread. This structure is mostly + * private. The only public fields are read-only and constant. + */ +struct input_thread_t +{ + VLC_COMMON_MEMBERS +}; + +/** + * Record prefix string. + * TODO make it configurable. + */ +#define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%Hh%Mm%Ss-$ N-$ p" + +/***************************************************************************** + * Input events and variables + *****************************************************************************/ + +/** + * \defgroup inputvariable Input variables + * + * The input provides multiples variable you can write to and/or read from. + * + * TODO complete the documentation. + * The read only variables are: + * - "length" + * - "can-seek" (if you can seek, it doesn't say if 'bar display' has be shown + * or not, for that check position != 0.0) + * - "can-pause" + * - "can-rate" + * - "can-rewind" + * - "can-record" (if a stream can be recorded while playing) + * - "teletext-es" (list of id from the spu tracks (spu-es) that are teletext, the + * variable value being the one currently selected, -1 if no teletext) + * - "signal-quality" + * - "signal-strength" + * - "program-scrambled" (if the current program is scrambled) + * - "cache" (level of data cached [0 .. 1]) + * + * The read-write variables are: + * - state (\see input_state_e) + * - rate + * - position + * - time, time-offset + * - title, next-title, prev-title + * - chapter, next-chapter, next-chapter-prev + * - program, audio-es, video-es, spu-es + * - audio-delay, spu-delay + * - bookmark (bookmark list) + * - record + * - frame-next + * - navigation (list of "title %2i") + * - "title %2i" + * + * The variable used for event is + * - intf-event (\see input_event_type_e) + */ + +/** + * Input state + * + * This enum is used by the variable "state" + */ +typedef enum input_state_e +{ + INIT_S = 0, + OPENING_S, + PLAYING_S, + PAUSE_S, + END_S, + ERROR_S, +} input_state_e; + +/** + * Input rate. + * + * It is an float used by the variable "rate" in the + * range [INPUT_RATE_DEFAULT/INPUT_RATE_MAX, INPUT_RATE_DEFAULT/INPUT_RATE_MIN] + * the default value being 1. It represents the ratio of playback speed to + * nominal speed (bigger is faster). + * + * Internally, the rate is stored as a value in the range + * [INPUT_RATE_MIN, INPUT_RATE_MAX]. + * internal rate = INPUT_RATE_DEFAULT / rate variable + */ + +/** + * Default rate value + */ +#define INPUT_RATE_DEFAULT 1000 +/** + * Minimal rate value + */ +#define INPUT_RATE_MIN 32 /* Up to 32/1 */ +/** + * Maximal rate value + */ +#define INPUT_RATE_MAX 32000 /* Up to 1/32 */ + +/** + * Input events + * + * You can catch input event by adding a callback on the variable "intf-event". + * This variable is an integer that will hold a input_event_type_e value. + */ +typedef enum input_event_type_e +{ + /* "state" has changed */ + INPUT_EVENT_STATE, + /* b_dead is true */ + INPUT_EVENT_DEAD, + + /* "rate" has changed */ + INPUT_EVENT_RATE, + + /* At least one of "position" or "time" */ + INPUT_EVENT_POSITION, + + /* "length" has changed */ + INPUT_EVENT_LENGTH, + + /* A title has been added or removed or selected. + * It implies that the chapter has changed (no chapter event is sent) */ + INPUT_EVENT_TITLE, + /* A chapter has been added or removed or selected. */ + INPUT_EVENT_CHAPTER, + + /* A program ("program") has been added or removed or selected, + * or "program-scrambled" has changed.*/ + INPUT_EVENT_PROGRAM, + /* A ES has been added or removed or selected */ + INPUT_EVENT_ES, + /* "teletext-es" has changed */ + INPUT_EVENT_TELETEXT, + + /* "record" has changed */ + INPUT_EVENT_RECORD, + + /* input_item_t media has changed */ + INPUT_EVENT_ITEM_META, + /* input_item_t info has changed */ + INPUT_EVENT_ITEM_INFO, + /* input_item_t epg has changed */ + INPUT_EVENT_ITEM_EPG, + + /* Input statistics have been updated */ + INPUT_EVENT_STATISTICS, + /* At least one of "signal-quality" or "signal-strength" has changed */ + INPUT_EVENT_SIGNAL, + + /* "audio-delay" has changed */ + INPUT_EVENT_AUDIO_DELAY, + /* "spu-delay" has changed */ + INPUT_EVENT_SUBTITLE_DELAY, + + /* "bookmark" has changed */ + INPUT_EVENT_BOOKMARK, + + /* cache" has changed */ + INPUT_EVENT_CACHE, + + /* A audio_output_t object has been created/deleted by *the input* */ + INPUT_EVENT_AOUT, + /* A vout_thread_t object has been created/deleted by *the input* */ + INPUT_EVENT_VOUT, + +} input_event_type_e; + +/** + * Input queries + */ +enum input_query_e +{ + /* input variable "position" */ + INPUT_GET_POSITION, /* arg1= double * res= */ + INPUT_SET_POSITION, /* arg1= double res=can fail */ + + /* input variable "length" */ + INPUT_GET_LENGTH, /* arg1= int64_t * res=can fail */ + + /* input variable "time" */ + INPUT_GET_TIME, /* arg1= int64_t * res= */ + INPUT_SET_TIME, /* arg1= int64_t res=can fail */ + + /* input variable "rate" (nominal is INPUT_RATE_DEFAULT) */ + INPUT_GET_RATE, /* arg1= int * res= */ + INPUT_SET_RATE, /* arg1= int res=can fail */ + + /* input variable "state" */ + INPUT_GET_STATE, /* arg1= int * res= */ + INPUT_SET_STATE, /* arg1= int res=can fail */ + + /* input variable "audio-delay" and "sub-delay" */ + INPUT_GET_AUDIO_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_AUDIO_DELAY, /* arg1 = int res=can fail */ + INPUT_GET_SPU_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_SPU_DELAY, /* arg1 = int res=can fail */ + + /* Menu (VCD/DVD/BD) Navigation */ + /** Activate the navigation item selected. res=can fail */ + INPUT_NAV_ACTIVATE, + /** Use the up arrow to select a navigation item above. res=can fail */ + INPUT_NAV_UP, + /** Use the down arrow to select a navigation item under. res=can fail */ + INPUT_NAV_DOWN, + /** Use the left arrow to select a navigation item on the left. res=can fail */ + INPUT_NAV_LEFT, + /** Use the right arrow to select a navigation item on the right. res=can fail */ + INPUT_NAV_RIGHT, + /** Activate the popup Menu (for BD). res=can fail */ + INPUT_NAV_POPUP, + /** Activate disc Root Menu. res=can fail */ + INPUT_NAV_MENU, + + /* Meta datas */ + INPUT_ADD_INFO, /* arg1= char* arg2= char* arg3=... res=can fail */ + INPUT_REPLACE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_MERGE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_DEL_INFO, /* arg1= char* arg2= char* res=can fail */ + + /* bookmarks */ + INPUT_GET_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_GET_BOOKMARKS, /* arg1= seekpoint_t *** arg2= int * res=can fail */ + INPUT_CLEAR_BOOKMARKS, /* res=can fail */ + INPUT_ADD_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_CHANGE_BOOKMARK, /* arg1= seekpoint_t * arg2= int * res=can fail */ + INPUT_DEL_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_SET_BOOKMARK, /* arg1= int res=can fail */ + + /* titles */ + INPUT_GET_TITLE_INFO, /* arg1=input_title_t** arg2= int * res=can fail */ + INPUT_GET_FULL_TITLE_INFO, /* arg1=input_title_t*** arg2= int * res=can fail */ + + /* seekpoints */ + INPUT_GET_SEEKPOINTS, /* arg1=seekpoint_t*** arg2= int * res=can fail */ + + /* Attachments */ + INPUT_GET_ATTACHMENTS, /* arg1=input_attachment_t***, arg2=int* res=can fail */ + INPUT_GET_ATTACHMENT, /* arg1=input_attachment_t**, arg2=char* res=can fail */ + + /* On the fly input slave */ + INPUT_ADD_SLAVE, /* arg1= enum slave_type, arg2= const char *, + * arg3= bool forced, arg4= bool notify, + * arg5= bool check_extension */ + + /* On the fly record while playing */ + INPUT_SET_RECORD_STATE, /* arg1=bool res=can fail */ + INPUT_GET_RECORD_STATE, /* arg1=bool* res=can fail */ + + /* ES */ + INPUT_RESTART_ES, /* arg1=int (-AUDIO/VIDEO/SPU_ES for the whole category) */ + + /* Viewpoint */ + INPUT_UPDATE_VIEWPOINT, /* arg1=(const vlc_viewpoint_t*), arg2=bool b_absolute */ + INPUT_SET_INITIAL_VIEWPOINT, /* arg1=(const vlc_viewpoint_t*) */ + + /* Input ressources + * XXX You must call vlc_object_release as soon as possible */ + INPUT_GET_AOUT, /* arg1=audio_output_t ** res=can fail */ + INPUT_GET_VOUTS, /* arg1=vout_thread_t ***, size_t * res=can fail */ + INPUT_GET_ES_OBJECTS, /* arg1=int id, vlc_object_t **dec, vout_thread_t **, audio_output_t ** */ + + /* Renderers */ + INPUT_SET_RENDERER, /* arg1=vlc_renderer_item_t* */ + + /* External clock managments */ + INPUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + INPUT_MODIFY_PCR_SYSTEM,/* arg1=int absolute, arg2=mtime_t res=can fail */ +}; + +/** @}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +VLC_API input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *, + const char *psz_log, input_resource_t *, + vlc_renderer_item_t* p_renderer ) VLC_USED; +#define input_Create(a,b,c,d,e) input_Create(VLC_OBJECT(a),b,c,d,e) + +VLC_API int input_Start( input_thread_t * ); + +VLC_API void input_Stop( input_thread_t * ); + +VLC_API int input_Read( vlc_object_t *, input_item_t * ); +#define input_Read(a,b) input_Read(VLC_OBJECT(a),b) + +VLC_API int input_vaControl( input_thread_t *, int i_query, va_list ); + +VLC_API int input_Control( input_thread_t *, int i_query, ... ); + +VLC_API void input_Close( input_thread_t * ); + +/** + * Create a new input_thread_t and start it. + * + * Provided for convenience. + * + * \see input_Create + */ +static inline +input_thread_t *input_CreateAndStart( vlc_object_t *parent, + input_item_t *item, const char *log ) +{ + input_thread_t *input = input_Create( parent, item, log, NULL, NULL ); + if( input != NULL && input_Start( input ) ) + { + vlc_object_release( input ); + input = NULL; + } + return input; +} +#define input_CreateAndStart(a,b,c) input_CreateAndStart(VLC_OBJECT(a),b,c) + +/** + * Get the input item for an input thread + * + * You have to keep a reference to the input or to the input_item_t until + * you do not need it anymore. + */ +VLC_API input_item_t* input_GetItem( input_thread_t * ) VLC_USED; + +/** + * It will return the current state of the input. + * Provided for convenience. + */ +static inline input_state_e input_GetState( input_thread_t * p_input ) +{ + input_state_e state = INIT_S; + input_Control( p_input, INPUT_GET_STATE, &state ); + return state; +} + +/** + * Return one of the video output (if any). If possible, you should use + * INPUT_GET_VOUTS directly and process _all_ video outputs instead. + * @param p_input an input thread from which to get a video output + * @return NULL on error, or a video output thread pointer (which needs to be + * released with vlc_object_release()). + */ +static inline vout_thread_t *input_GetVout( input_thread_t *p_input ) +{ + vout_thread_t **pp_vout, *p_vout; + size_t i_vout; + + if( input_Control( p_input, INPUT_GET_VOUTS, &pp_vout, &i_vout ) ) + return NULL; + + for( size_t i = 1; i < i_vout; i++ ) + vlc_object_release( (vlc_object_t *)(pp_vout[i]) ); + + p_vout = (i_vout >= 1) ? pp_vout[0] : NULL; + free( pp_vout ); + return p_vout; +} + +static inline int input_AddSlave( input_thread_t *p_input, enum slave_type type, + const char *psz_uri, bool b_forced, + bool b_notify, bool b_check_ext ) +{ + return input_Control( p_input, INPUT_ADD_SLAVE, type, psz_uri, b_forced, + b_notify, b_check_ext ); +} + +/** + * Update the viewpoint of the input thread. The viewpoint will be applied to + * all vouts and aouts. + * + * @param p_input an input thread + * @param p_viewpoint the viewpoint value + * @param b_absolute if true replace the old viewpoint with the new one. If + * false, increase/decrease it. + * @return VLC_SUCCESS or a VLC error code + */ +static inline int input_UpdateViewpoint( input_thread_t *p_input, + const vlc_viewpoint_t *p_viewpoint, + bool b_absolute ) +{ + return input_Control( p_input, INPUT_UPDATE_VIEWPOINT, p_viewpoint, + b_absolute ); +} + +/** + * Return the audio output (if any) associated with an input. + * @param p_input an input thread + * @return NULL on error, or the audio output (which needs to be + * released with vlc_object_release()). + */ +static inline audio_output_t *input_GetAout( input_thread_t *p_input ) +{ + audio_output_t *p_aout; + return input_Control( p_input, INPUT_GET_AOUT, &p_aout ) ? NULL : p_aout; +} + +/** + * Returns the objects associated to an ES. + * + * You must release all non NULL object using vlc_object_release. + * You may set pointer of pointer to NULL to avoid retreiving it. + */ +static inline int input_GetEsObjects( input_thread_t *p_input, int i_id, + vlc_object_t **pp_decoder, + vout_thread_t **pp_vout, audio_output_t **pp_aout ) +{ + return input_Control( p_input, INPUT_GET_ES_OBJECTS, i_id, + pp_decoder, pp_vout, pp_aout ); +} + +/** + * \see input_clock_GetSystemOrigin + */ +static inline int input_GetPcrSystem( input_thread_t *p_input, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return input_Control( p_input, INPUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +/** + * \see input_clock_ChangeSystemOrigin + */ +static inline int input_ModifyPcrSystem( input_thread_t *p_input, bool b_absolute, mtime_t i_system ) +{ + return input_Control( p_input, INPUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/* */ +VLC_API decoder_t * input_DecoderCreate( vlc_object_t *, const es_format_t *, input_resource_t * ) VLC_USED; +VLC_API void input_DecoderDelete( decoder_t * ); +VLC_API void input_DecoderDecode( decoder_t *, block_t *, bool b_do_pace ); +VLC_API void input_DecoderDrain( decoder_t * ); +VLC_API void input_DecoderFlush( decoder_t * ); + +/** + * This function creates a sane filename path. + */ +VLC_API char * input_CreateFilename( input_thread_t *, const char *psz_path, const char *psz_prefix, const char *psz_extension ) VLC_USED; + +/** + * It creates an empty input resource handler. + * + * The given object MUST stay alive as long as the input_resource_t is + * not deleted. + */ +VLC_API input_resource_t * input_resource_New( vlc_object_t * ) VLC_USED; + +/** + * It releases an input resource. + */ +VLC_API void input_resource_Release( input_resource_t * ); + +/** + * Forcefully destroys the video output (e.g. when the playlist is stopped). + */ +VLC_API void input_resource_TerminateVout( input_resource_t * ); + +/** + * This function releases all resources (object). + */ +VLC_API void input_resource_Terminate( input_resource_t * ); + +/** + * \return the current audio output if any. + * Use vlc_object_release() to drop the reference. + */ +VLC_API audio_output_t *input_resource_HoldAout( input_resource_t * ); + +/** + * This function creates or recycles an audio output. + */ +VLC_API audio_output_t *input_resource_GetAout( input_resource_t * ); + +/** + * This function retains or destroys an audio output. + */ +VLC_API void input_resource_PutAout( input_resource_t *, audio_output_t * ); + +/** + * Prevents the existing audio output (if any) from being recycled. + */ +VLC_API void input_resource_ResetAout( input_resource_t * ); + +/** @} */ +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_input_item.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_input_item.h new file mode 100644 index 0000000..82f9b59 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_input_item.h @@ -0,0 +1,483 @@ +/***************************************************************************** + * vlc_input_item.h: Core input item + ***************************************************************************** + * Copyright (C) 1999-2009 VLC authors and VideoLAN + * $Id: f22c3d9330af98a15992ef08e362424313774d6f $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INPUT_ITEM_H +#define VLC_INPUT_ITEM_H 1 + +/** + * \file + * This file defines functions, structures and enums for input items in vlc + */ + +#include +#include +#include + +#include + +typedef struct input_item_opaque input_item_opaque_t; +typedef struct input_item_slave input_item_slave_t; + +struct info_t +{ + char *psz_name; /**< Name of this info */ + char *psz_value; /**< Value of the info */ +}; + +struct info_category_t +{ + char *psz_name; /**< Name of this category */ + int i_infos; /**< Number of infos in the category */ + struct info_t **pp_infos; /**< Pointer to an array of infos */ +}; + +/** + * Describes an input and is used to spawn input_thread_t objects. + */ +struct input_item_t +{ + char *psz_name; /**< text describing this item */ + char *psz_uri; /**< mrl of this item */ + + int i_options; /**< Number of input options */ + char **ppsz_options; /**< Array of input options */ + uint8_t *optflagv; /**< Some flags of input options */ + unsigned optflagc; + input_item_opaque_t *opaques; /**< List of opaque pointer values */ + + mtime_t i_duration; /**< Duration in microseconds */ + + + int i_categories; /**< Number of info categories */ + info_category_t **pp_categories; /**< Pointer to the first info category */ + + int i_es; /**< Number of es format descriptions */ + es_format_t **es; /**< Es formats */ + + input_stats_t *p_stats; /**< Statistics */ + + vlc_meta_t *p_meta; + + int i_epg; /**< Number of EPG entries */ + vlc_epg_t **pp_epg; /**< EPG entries */ + int64_t i_epg_time; /** EPG timedate as epoch time */ + const vlc_epg_t *p_epg_table; /** running/selected program cur/next EPG table */ + + int i_slaves; /**< Number of slaves */ + input_item_slave_t **pp_slaves; /**< Slave entries that will be loaded by + the input_thread */ + + vlc_event_manager_t event_manager; + + vlc_mutex_t lock; /**< Lock for the item */ + + uint8_t i_type; /**< Type (file, disc, ... see input_item_type_e) */ + bool b_net; /**< Net: always true for TYPE_STREAM, it + depends for others types */ + bool b_error_when_reading;/**< Error When Reading */ + + int i_preparse_depth; /**< How many level of sub items can be preparsed: + -1: recursive, 0: none, >0: n levels */ + + bool b_preparse_interact; /**< Force interaction with the user when + preparsing.*/ +}; + +enum input_item_type_e +{ + ITEM_TYPE_UNKNOWN, + ITEM_TYPE_FILE, + ITEM_TYPE_DIRECTORY, + ITEM_TYPE_DISC, + ITEM_TYPE_CARD, + ITEM_TYPE_STREAM, + ITEM_TYPE_PLAYLIST, + ITEM_TYPE_NODE, + + /* This one is not a real type but the number of input_item types. */ + ITEM_TYPE_NUMBER +}; + +enum input_item_net_type +{ + ITEM_NET_UNKNOWN, + ITEM_NET, + ITEM_LOCAL +}; + +enum slave_type +{ + SLAVE_TYPE_SPU, + SLAVE_TYPE_AUDIO, +}; + +enum slave_priority +{ + SLAVE_PRIORITY_MATCH_NONE = 1, + SLAVE_PRIORITY_MATCH_RIGHT, + SLAVE_PRIORITY_MATCH_LEFT, + SLAVE_PRIORITY_MATCH_ALL, + SLAVE_PRIORITY_USER +}; + +/* Extensions must be in alphabetical order */ +#define MASTER_EXTENSIONS \ + "asf", "avi", "divx", \ + "f4v", "flv", "m1v", \ + "m2v", "m4v", "mkv", \ + "mov", "mp2", "mp2v", \ + "mp4", "mp4v", "mpe", \ + "mpeg", "mpeg1", "mpeg2", \ + "mpeg4", "mpg", "mpv2", \ + "mxf", "ogv", "ogx", \ + "ps", "vro","webm", \ + "wmv", "wtv" + +#define SLAVE_SPU_EXTENSIONS \ + "aqt", "ass", "cdg", \ + "dks", "idx", "jss", \ + "mpl2", "mpsub", "pjs", \ + "psb", "rt", "sami", "sbv", \ + "scc", "smi", "srt", \ + "ssa", "stl", "sub", \ + "ttml", "tt", "usf", \ + "vtt", "webvtt" + +#define SLAVE_AUDIO_EXTENSIONS \ + "aac", "ac3", "dts", \ + "dtshd", "eac3", "flac", \ + "m4a", "mp3", "pcm" \ + +struct input_item_slave +{ + enum slave_type i_type; /**< Slave type (spu, audio) */ + enum slave_priority i_priority; /**< Slave priority */ + bool b_forced; /**< Slave should be selected */ + char psz_uri[]; /**< Slave mrl */ +}; + +struct input_item_node_t +{ + input_item_t * p_item; + int i_children; + input_item_node_t **pp_children; +}; + +VLC_API void input_item_CopyOptions( input_item_t *p_child, input_item_t *p_parent ); +VLC_API void input_item_SetName( input_item_t *p_item, const char *psz_name ); + +/** + * Start adding multiple subitems. + * + * Create a root node to hold a tree of subitems for given item + */ +VLC_API input_item_node_t * input_item_node_Create( input_item_t *p_input ) VLC_USED; + +/** + * Add a new child node to this parent node that will point to this subitem. + */ +VLC_API input_item_node_t * input_item_node_AppendItem( input_item_node_t *p_node, input_item_t *p_item ); + +/** + * Add an already created node to children of this parent node. + */ +VLC_API void input_item_node_AppendNode( input_item_node_t *p_parent, input_item_node_t *p_child ); + +/** + * Remove a node from its parent. + */ +void input_item_node_RemoveNode( input_item_node_t *parent, + input_item_node_t *child ); + +/** + * Delete a node created with input_item_node_Create() and all its children. + */ +VLC_API void input_item_node_Delete( input_item_node_t *p_node ); + +/** + * Option flags + */ +enum input_item_option_e +{ + /* Allow VLC to trust the given option. + * By default options are untrusted */ + VLC_INPUT_OPTION_TRUSTED = 0x2, + + /* Add the option, unless the same option + * is already present. */ + VLC_INPUT_OPTION_UNIQUE = 0x100, +}; + +/** + * This function allows to add an option to an existing input_item_t. + */ +VLC_API int input_item_AddOption(input_item_t *, const char *, unsigned i_flags ); +/** + * This function add several options to an existing input_item_t. + */ +VLC_API int input_item_AddOptions(input_item_t *, int i_options, + const char *const *ppsz_options, + unsigned i_flags ); +VLC_API int input_item_AddOpaque(input_item_t *, const char *, void *); + +void input_item_ApplyOptions(vlc_object_t *, input_item_t *); + +VLC_API bool input_item_slave_GetType(const char *, enum slave_type *); + +VLC_API input_item_slave_t *input_item_slave_New(const char *, enum slave_type, + enum slave_priority); +#define input_item_slave_Delete(p_slave) free(p_slave) + +/** + * This function allows adding a slave to an existing input item. + * The slave is owned by the input item after this call. + */ +VLC_API int input_item_AddSlave(input_item_t *, input_item_slave_t *); + +/* */ +VLC_API bool input_item_HasErrorWhenReading( input_item_t * ); +VLC_API void input_item_SetMeta( input_item_t *, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API bool input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz ); +VLC_API char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type ) VLC_USED; +VLC_API char * input_item_GetName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetTitleFbName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetURI( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetNowPlayingFb( input_item_t *p_item ) VLC_USED; +VLC_API void input_item_SetURI( input_item_t * p_i, const char *psz_uri ); +VLC_API mtime_t input_item_GetDuration( input_item_t * p_i ); +VLC_API void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration ); +VLC_API bool input_item_IsPreparsed( input_item_t *p_i ); +VLC_API bool input_item_IsArtFetched( input_item_t *p_i ); + +#define INPUT_META( name ) \ +static inline \ +void input_item_Set ## name (input_item_t *p_input, const char *val) \ +{ \ + input_item_SetMeta (p_input, vlc_meta_ ## name, val); \ +} \ +static inline \ +char *input_item_Get ## name (input_item_t *p_input) \ +{ \ + return input_item_GetMeta (p_input, vlc_meta_ ## name); \ +} + +INPUT_META(Title) +INPUT_META(Artist) +INPUT_META(AlbumArtist) +INPUT_META(Genre) +INPUT_META(Copyright) +INPUT_META(Album) +INPUT_META(TrackNumber) +INPUT_META(Description) +INPUT_META(Rating) +INPUT_META(Date) +INPUT_META(Setting) +INPUT_META(URL) +INPUT_META(Language) +INPUT_META(NowPlaying) +INPUT_META(ESNowPlaying) +INPUT_META(Publisher) +INPUT_META(EncodedBy) +INPUT_META(ArtworkURL) +INPUT_META(TrackID) +INPUT_META(TrackTotal) +INPUT_META(Director) +INPUT_META(Season) +INPUT_META(Episode) +INPUT_META(ShowName) +INPUT_META(Actors) +INPUT_META(DiscNumber) + +#define input_item_SetTrackNum input_item_SetTrackNumber +#define input_item_GetTrackNum input_item_GetTrackNumber +#define input_item_SetArtURL input_item_SetArtworkURL +#define input_item_GetArtURL input_item_GetArtworkURL + +VLC_API char * input_item_GetInfo( input_item_t *p_i, const char *psz_cat,const char *psz_name ) VLC_USED; +VLC_API int input_item_AddInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name, const char *psz_format, ... ) VLC_FORMAT( 4, 5 ); +VLC_API int input_item_DelInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name ); +VLC_API void input_item_ReplaceInfos( input_item_t *, info_category_t * ); +VLC_API void input_item_MergeInfos( input_item_t *, info_category_t * ); + +/** + * This function creates a new input_item_t with the provided information. + * + * XXX You may also use input_item_New, as they need less arguments. + */ +VLC_API input_item_t * input_item_NewExt( const char *psz_uri, + const char *psz_name, + mtime_t i_duration, int i_type, + enum input_item_net_type i_net ) VLC_USED; + +#define input_item_New( psz_uri, psz_name ) \ + input_item_NewExt( psz_uri, psz_name, -1, ITEM_TYPE_UNKNOWN, ITEM_NET_UNKNOWN ) + +#define input_item_NewCard( psz_uri, psz_name ) \ + input_item_NewExt( psz_uri, psz_name, -1, ITEM_TYPE_CARD, ITEM_LOCAL ) + +#define input_item_NewDisc( psz_uri, psz_name, i_duration ) \ + input_item_NewExt( psz_uri, psz_name, i_duration, ITEM_TYPE_DISC, ITEM_LOCAL ) + +#define input_item_NewStream( psz_uri, psz_name, i_duration ) \ + input_item_NewExt( psz_uri, psz_name, i_duration, ITEM_TYPE_STREAM, ITEM_NET ) + +#define input_item_NewDirectory( psz_uri, psz_name, i_net ) \ + input_item_NewExt( psz_uri, psz_name, -1, ITEM_TYPE_DIRECTORY, i_net ) + +#define input_item_NewFile( psz_uri, psz_name, i_duration, i_net ) \ + input_item_NewExt( psz_uri, psz_name, i_duration, ITEM_TYPE_FILE, i_net ) + +/** + * This function creates a new input_item_t as a copy of another. + */ +VLC_API input_item_t * input_item_Copy(input_item_t * ) VLC_USED; + +/** Holds an input item, i.e. creates a new reference. */ +VLC_API input_item_t *input_item_Hold(input_item_t *); + +/** Releases an input item, i.e. decrements its reference counter. */ +VLC_API void input_item_Release(input_item_t *); + +typedef enum input_item_meta_request_option_t +{ + META_REQUEST_OPTION_NONE = 0x00, + META_REQUEST_OPTION_SCOPE_LOCAL = 0x01, + META_REQUEST_OPTION_SCOPE_NETWORK = 0x02, + META_REQUEST_OPTION_SCOPE_ANY = 0x03, + META_REQUEST_OPTION_DO_INTERACT = 0x04 +} input_item_meta_request_option_t; + +/* status of the vlc_InputItemPreparseEnded event */ +enum input_item_preparse_status +{ + ITEM_PREPARSE_SKIPPED, + ITEM_PREPARSE_FAILED, + ITEM_PREPARSE_TIMEOUT, + ITEM_PREPARSE_DONE +}; + +VLC_API int libvlc_MetadataRequest( libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t, + int, void * ); +VLC_API int libvlc_ArtRequest(libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t ); +VLC_API void libvlc_MetadataCancel( libvlc_int_t *, void * ); + +/****************** + * Input stats + ******************/ +struct input_stats_t +{ + vlc_mutex_t lock; + + /* Input */ + int64_t i_read_packets; + int64_t i_read_bytes; + float f_input_bitrate; + float f_average_input_bitrate; + + /* Demux */ + int64_t i_demux_read_packets; + int64_t i_demux_read_bytes; + float f_demux_bitrate; + float f_average_demux_bitrate; + int64_t i_demux_corrupted; + int64_t i_demux_discontinuity; + + /* Decoders */ + int64_t i_decoded_audio; + int64_t i_decoded_video; + + /* Vout */ + int64_t i_displayed_pictures; + int64_t i_lost_pictures; + + /* Sout */ + int64_t i_sent_packets; + int64_t i_sent_bytes; + float f_send_bitrate; + + /* Aout */ + int64_t i_played_abuffers; + int64_t i_lost_abuffers; +}; + +/** + * Access pf_readdir helper struct + * \see vlc_readdir_helper_init() + * \see vlc_readdir_helper_additem() + * \see vlc_readdir_helper_finish() + */ +struct vlc_readdir_helper +{ + input_item_node_t *p_node; + void **pp_slaves; + size_t i_slaves; + void **pp_dirs; + size_t i_dirs; + int i_sub_autodetect_fuzzy; + bool b_show_hiddenfiles; + bool b_flatten; + char *psz_ignored_exts; +}; + +/** + * Init a vlc_readdir_helper struct + * + * \param p_rdh need to be cleaned with vlc_readdir_helper_finish() + * \param p_node node that will be used to add items + */ +VLC_API void vlc_readdir_helper_init(struct vlc_readdir_helper *p_rdh, + vlc_object_t *p_obj, input_item_node_t *p_node); +#define vlc_readdir_helper_init(p_rdh, p_obj, p_node) \ + vlc_readdir_helper_init(p_rdh, VLC_OBJECT(p_obj), p_node) + +/** + * Finish adding items to the node + * + * \param b_success if true, items of the node will be sorted. + */ +VLC_API void vlc_readdir_helper_finish(struct vlc_readdir_helper *p_rdh, bool b_success); + +/** + * Add a new input_item_t entry to the node of the vlc_readdir_helper struct. + * + * \param p_rdh previously inited vlc_readdir_helper struct + * \param psz_uri uri of the new item + * \param psz_flatpath flattened path of the new item. If not NULL, this + * function will create an input item for each sub folders (separated + * by '/') of psz_flatpath (so, this will un-flatten the folder + * hierarchy). Either psz_flatpath or psz_filename must be valid. + * \param psz_filename file name of the new item. If NULL, the file part of path + * will be used as a filename. Either psz_flatpath or psz_filename must + * be valid. + * \param i_type see \ref input_item_type_e + * \param i_net see \ref input_item_net_type + */ +VLC_API int vlc_readdir_helper_additem(struct vlc_readdir_helper *p_rdh, + const char *psz_uri, const char *psz_flatpath, + const char *psz_filename, + int i_type, int i_net); + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_interface.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_interface.h new file mode 100644 index 0000000..1bd325b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_interface.h @@ -0,0 +1,332 @@ +/***************************************************************************** + * vlc_interface.h: interface access for other threads + * This library provides basic functions for threads to interact with user + * interface, such as message output. + ***************************************************************************** + * Copyright (C) 1999, 2000 VLC authors and VideoLAN + * $Id: e271314c3120c270a0bef5189cfee21dd9e7b26b $ + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INTF_H_ +#define VLC_INTF_H_ + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct intf_dialog_args_t intf_dialog_args_t; + +/** + * \defgroup interface Interface + * VLC user interfaces + * @{ + * \file + * VLC user interface modules + */ + +typedef struct intf_sys_t intf_sys_t; + +/** Describe all interface-specific data of the interface thread */ +typedef struct intf_thread_t +{ + VLC_COMMON_MEMBERS + + struct intf_thread_t *p_next; /** LibVLC interfaces book keeping */ + + /* Specific interfaces */ + intf_sys_t * p_sys; /** system interface */ + + /** Interface module */ + module_t * p_module; + + /** Specific for dialogs providers */ + void ( *pf_show_dialog ) ( struct intf_thread_t *, int, int, + intf_dialog_args_t * ); + + config_chain_t *p_cfg; +} intf_thread_t; + +/** \brief Arguments passed to a dialogs provider + * This describes the arguments passed to the dialogs provider. They are + * mainly used with INTF_DIALOG_FILE_GENERIC. + */ +struct intf_dialog_args_t +{ + intf_thread_t *p_intf; + char *psz_title; + + char **psz_results; + int i_results; + + void (*pf_callback) ( intf_dialog_args_t * ); + void *p_arg; + + /* Specifically for INTF_DIALOG_FILE_GENERIC */ + char *psz_extensions; + bool b_save; + bool b_multiple; + + /* Specific to INTF_DIALOG_INTERACTION */ + struct interaction_dialog_t *p_dialog; +}; + +VLC_API int intf_Create( playlist_t *, const char * ); + +VLC_API void libvlc_Quit( libvlc_int_t * ); + +static inline playlist_t *pl_Get( struct intf_thread_t *intf ) +{ + return (playlist_t *)(intf->obj.parent); +} + +/** + * Retrieves the current input thread from the playlist. + * @note The returned object must be released with vlc_object_release(). + */ +#define pl_CurrentInput(intf) (playlist_CurrentInput(pl_Get(intf))) + +/** + * @ingroup messages + * @{ + */ + +VLC_API void vlc_LogSet(libvlc_int_t *, vlc_log_cb cb, void *data); + +/*@}*/ + +/* Interface dialog ids for dialog providers */ +typedef enum vlc_intf_dialog { + INTF_DIALOG_FILE_SIMPLE = 1, + INTF_DIALOG_FILE, + INTF_DIALOG_DISC, + INTF_DIALOG_NET, + INTF_DIALOG_CAPTURE, + INTF_DIALOG_SAT, + INTF_DIALOG_DIRECTORY, + + INTF_DIALOG_STREAMWIZARD, + INTF_DIALOG_WIZARD, + + INTF_DIALOG_PLAYLIST, + INTF_DIALOG_MESSAGES, + INTF_DIALOG_FILEINFO, + INTF_DIALOG_PREFS, + INTF_DIALOG_BOOKMARKS, + INTF_DIALOG_EXTENDED, + INTF_DIALOG_RENDERER, + + INTF_DIALOG_POPUPMENU = 20, + INTF_DIALOG_AUDIOPOPUPMENU, + INTF_DIALOG_VIDEOPOPUPMENU, + INTF_DIALOG_MISCPOPUPMENU, + + INTF_DIALOG_FILE_GENERIC = 30, + INTF_DIALOG_INTERACTION = 50, + INTF_DIALOG_SENDKEY = 51, + + INTF_DIALOG_UPDATEVLC = 90, + INTF_DIALOG_VLM, + + INTF_DIALOG_EXIT = 99 +} vlc_intf_dialog; + +/* Useful text messages shared by interfaces */ +#define INTF_ABOUT_MSG LICENSE_MSG + +#define EXTENSIONS_AUDIO_CSV "3ga", "669", "a52", "aac", "ac3", "adt", "adts", "aif", "aifc", "aiff", \ + "amb", "amr", "aob", "ape", "au", "awb", "caf", "dts", "flac", "it", "kar", \ + "m4a", "m4b", "m4p", "m5p", "mka", "mlp", "mod", "mpa", "mp1", "mp2", "mp3", "mpc", "mpga", "mus", \ + "oga", "ogg", "oma", "opus", "qcp", "ra", "rmi", "s3m", "sid", "spx", "tak", "thd", "tta", \ + "voc", "vqf", "w64", "wav", "wma", "wv", "xa", "xm" + +#define EXTENSIONS_VIDEO_CSV "3g2", "3gp", "3gp2", "3gpp", "amv", "asf", "avi", "bik", "crf", "divx", "drc", "dv", "dvr-ms" \ + "evo", "f4v", "flv", "gvi", "gxf", "iso", \ + "m1v", "m2v", "m2t", "m2ts", "m4v", "mkv", "mov",\ + "mp2", "mp2v", "mp4", "mp4v", "mpe", "mpeg", "mpeg1", \ + "mpeg2", "mpeg4", "mpg", "mpv2", "mts", "mtv", "mxf", "mxg", "nsv", "nuv", \ + "ogg", "ogm", "ogv", "ogx", "ps", \ + "rec", "rm", "rmvb", "rpl", "thp", "tod", "ts", "tts", "txd", "vob", "vro", \ + "webm", "wm", "wmv", "wtv", "xesc" + +#define EXTENSIONS_AUDIO \ + "*.3ga;" \ + "*.669;" \ + "*.a52;" \ + "*.aac;" \ + "*.ac3;" \ + "*.adt;" \ + "*.adts;" \ + "*.aif;"\ + "*.aifc;"\ + "*.aiff;"\ + "*.amb;" \ + "*.amr;" \ + "*.aob;" \ + "*.ape;" \ + "*.au;" \ + "*.awb;" \ + "*.caf;" \ + "*.dts;" \ + "*.flac;"\ + "*.it;" \ + "*.kar;" \ + "*.m4a;" \ + "*.m4b;" \ + "*.m4p;" \ + "*.m5p;" \ + "*.mid;" \ + "*.mka;" \ + "*.mlp;" \ + "*.mod;" \ + "*.mpa;" \ + "*.mp1;" \ + "*.mp2;" \ + "*.mp3;" \ + "*.mpc;" \ + "*.mpga;" \ + "*.mus;" \ + "*.oga;" \ + "*.ogg;" \ + "*.oma;" \ + "*.opus;" \ + "*.qcp;" \ + "*.ra;" \ + "*.rmi;" \ + "*.s3m;" \ + "*.sid;" \ + "*.spx;" \ + "*.tak;" \ + "*.thd;" \ + "*.tta;" \ + "*.voc;" \ + "*.vqf;" \ + "*.w64;" \ + "*.wav;" \ + "*.wma;" \ + "*.wv;" \ + "*.xa;" \ + "*.xm" + +#define EXTENSIONS_VIDEO "*.3g2;*.3gp;*.3gp2;*.3gpp;*.amv;*.asf;*.avi;*.bik;*.bin;*.crf;*.divx;*.drc;*.dv;*.dvr-ms;*.evo;*.f4v;*.flv;*.gvi;*.gxf;*.iso;*.m1v;*.m2v;" \ + "*.m2t;*.m2ts;*.m4v;*.mkv;*.mov;*.mp2;*.mp2v;*.mp4;*.mp4v;*.mpe;*.mpeg;*.mpeg1;" \ + "*.mpeg2;*.mpeg4;*.mpg;*.mpv2;*.mts;*.mtv;*.mxf;*.mxg;*.nsv;*.nuv;" \ + "*.ogg;*.ogm;*.ogv;*.ogx;*.ps;" \ + "*.rec;*.rm;*.rmvb;*.rpl;*.thp;*.tod;*.tp;*.ts;*.tts;*.txd;*.vob;*.vro;*.webm;*.wm;*.wmv;*.wtv;*.xesc" + +#define EXTENSIONS_PLAYLIST "*.asx;*.b4s;*.cue;*.ifo;*.m3u;*.m3u8;*.pls;*.ram;*.rar;*.sdp;*.vlc;*.xspf;*.wax;*.wvx;*.zip;*.conf" + +#define EXTENSIONS_MEDIA EXTENSIONS_VIDEO ";" EXTENSIONS_AUDIO ";" \ + EXTENSIONS_PLAYLIST + +#define EXTENSIONS_SUBTITLE "*.cdg;*.idx;*.srt;" \ + "*.sub;*.utf;*.ass;" \ + "*.ssa;*.aqt;" \ + "*.jss;*.psb;" \ + "*.rt;*.sami;*.smi;*.txt;" \ + "*.smil;*.stl;*.usf;" \ + "*.dks;*.pjs;*.mpl2;*.mks;" \ + "*.vtt;*.tt;*.ttml;*.dfxp;" \ + "*.scc" + +/** \defgroup interaction Interaction + * \ingroup interface + * Interaction between user and modules + * @{ + */ + +/** + * This structure describes a piece of interaction with the user + */ +typedef struct interaction_dialog_t +{ + int i_type; ///< Type identifier + char *psz_title; ///< Title + char *psz_description; ///< Descriptor string + char *psz_default_button; ///< default button title (~OK) + char *psz_alternate_button;///< alternate button title (~NO) + /// other button title (optional,~Cancel) + char *psz_other_button; + + char *psz_returned[1]; ///< returned responses from the user + + vlc_value_t val; ///< value coming from core for dialogue + int i_timeToGo; ///< time (in sec) until shown progress is finished + bool b_cancelled; ///< was the dialogue cancelled ? + + void * p_private; ///< Private interface data + + int i_status; ///< Dialog status; + int i_action; ///< Action to perform; + int i_flags; ///< Misc flags + int i_return; ///< Return status + + vlc_object_t *p_parent; ///< The vlc object that asked + //for interaction + intf_thread_t *p_interface; + vlc_mutex_t *p_lock; +} interaction_dialog_t; + +/** + * Possible flags . Dialog types + */ +#define DIALOG_GOT_ANSWER 0x01 +#define DIALOG_YES_NO_CANCEL 0x02 +#define DIALOG_LOGIN_PW_OK_CANCEL 0x04 +#define DIALOG_PSZ_INPUT_OK_CANCEL 0x08 +#define DIALOG_BLOCKING_ERROR 0x10 +#define DIALOG_NONBLOCKING_ERROR 0x20 +#define DIALOG_USER_PROGRESS 0x80 +#define DIALOG_INTF_PROGRESS 0x100 + +/** Possible return codes */ +enum +{ + DIALOG_OK_YES, + DIALOG_NO, + DIALOG_CANCELLED +}; + +/** Possible status */ +enum +{ + ANSWERED_DIALOG, ///< Got "answer" + DESTROYED_DIALOG, ///< Interface has destroyed it +}; + +/** Possible actions */ +enum +{ + INTERACT_NEW, + INTERACT_UPDATE, + INTERACT_HIDE, + INTERACT_DESTROY +}; + +#define intf_UserStringInput( a, b, c, d ) (VLC_OBJECT(a),b,c,d, VLC_EGENERIC) +#define interaction_Register( t ) (t, VLC_EGENERIC) +#define interaction_Unregister( t ) (t, VLC_EGENERIC) + + +/** @} */ +/** @} */ + +# ifdef __cplusplus +} +# endif +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_interrupt.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_interrupt.h new file mode 100644 index 0000000..b98bbe2 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_interrupt.h @@ -0,0 +1,238 @@ +/***************************************************************************** + * vlc_interrupt.h: + ***************************************************************************** + * Copyright (C) 2015 Remlab T:mi + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * @file + * This file declares interruptible sleep functions. + */ + +#ifndef VLC_INTERRUPT_H +# define VLC_INTERRUPT_H 1 +# include +# ifndef _WIN32 +# include /* socklen_t */ +# else +# include +# endif + +struct pollfd; +struct iovec; +struct sockaddr; +struct msghdr; + +/** + * @defgroup interrupt Interruptible sleep + * @{ + * @defgroup interrupt_sleep Interruptible sleep functions + * @{ + */ + +/** + * Interruptible variant of vlc_sem_wait(). + * + * Waits on a semaphore like vlc_sem_wait(). If the calling thread has an + * interruption context (as set by vlc_interrupt_set()), and another thread + * invokes vlc_interrupt_raise() on that context, the semaphore is incremented. + * + * @warning The calling thread should be the only thread ever to wait on the + * specified semaphore. Otherwise, interruptions may not be delivered + * accurately (the wrong thread may be woken up). + * + * @note This function is (always) a cancellation point. + * + * @return EINTR if the semaphore was incremented due to an interruption, + * otherwise zero. + */ +VLC_API int vlc_sem_wait_i11e(vlc_sem_t *); + +/** + * Interruptible variant of mwait(). + * + * Waits for a specified timestamp or, if the calling thread has an + * interruption context, an interruption. + * + * @return EINTR if an interruption occurred, otherwise 0 once the timestamp is + * reached. + */ +VLC_API int vlc_mwait_i11e(mtime_t); + +/** + * Interruptible variant of msleep(). + * + * Waits for a specified timeout duration or, if the calling thread has an + * interruption context, an interruption. + * + * @param delay timeout value (in microseconds) + * + * @return EINTR if an interruption occurred, otherwise 0 once the timeout + * expired. + */ +static inline int vlc_msleep_i11e(mtime_t delay) +{ + return vlc_mwait_i11e(mdate() + delay); +} + +/** + * Interruptible variant of poll(). + * + * Waits for file descriptors I/O events, a timeout, a signal or a VLC I/O + * interruption. Except for VLC I/O interruptions, this function behaves + * just like the standard poll(). + * + * @note This function is always a cancellation point (as poll()). + * @see poll() manual page + * + * @param fds table of events to wait for + * @param nfds number of entries in the table + * @param timeout time to wait in milliseconds or -1 for infinite + * + * @return A strictly positive result represent the number of pending events. + * 0 is returned if the time-out is reached without events. + * -1 is returned if a VLC I/O interrupt occurs (and errno is set to EINTR) + * or if an error occurs. + */ +VLC_API int vlc_poll_i11e(struct pollfd *, unsigned, int); + +VLC_API ssize_t vlc_readv_i11e(int fd, struct iovec *, int); +VLC_API ssize_t vlc_writev_i11e(int fd, const struct iovec *, int); +VLC_API ssize_t vlc_read_i11e(int fd, void *, size_t); +VLC_API ssize_t vlc_write_i11e(int fd, const void *, size_t); + +VLC_API ssize_t vlc_recvmsg_i11e(int fd, struct msghdr *, int flags); +VLC_API ssize_t vlc_sendmsg_i11e(int fd, const struct msghdr *, int flags); + +VLC_API ssize_t vlc_recvfrom_i11e(int fd, void *, size_t, int flags, + struct sockaddr *, socklen_t *); +VLC_API ssize_t vlc_sendto_i11e(int fd, const void *, size_t, int flags, + const struct sockaddr *, socklen_t); + +static inline ssize_t vlc_recv_i11e(int fd, void *buf, size_t len, int flags) +{ + return vlc_recvfrom_i11e(fd, buf, len, flags, NULL, NULL); +} + +static inline +ssize_t vlc_send_i11e(int fd, const void *buf, size_t len, int flags) +{ + return vlc_sendto_i11e(fd, buf, len, flags, NULL, 0); +} + +VLC_API int vlc_accept_i11e(int fd, struct sockaddr *, socklen_t *, bool); + +/** + * Registers a custom interrupt handler. + * + * Registers a custom callback as interrupt handler for the calling thread. + * The callback must be unregistered with vlc_interrupt_unregister() before + * thread termination and before any further callback registration. + * + * If the calling thread has no interruption context, this function has no + * effects. + */ +VLC_API void vlc_interrupt_register(void (*cb)(void *), void *opaque); + +VLC_API int vlc_interrupt_unregister(void); + +/** + * @} + * @defgroup interrupt_context Interrupt context signaling and manipulation + * @{ + */ +typedef struct vlc_interrupt vlc_interrupt_t; + +/** + * Creates an interruption context. + */ +VLC_API vlc_interrupt_t *vlc_interrupt_create(void) VLC_USED; + +/** + * Destroys an interrupt context. + */ +VLC_API void vlc_interrupt_destroy(vlc_interrupt_t *); + +/** + * Sets the interruption context for the calling thread. + * @param newctx the interruption context to attach or NULL for none + * @return the previous interruption context or NULL if none + * + * @note This function is not a cancellation point. + * @warning A context can be attached to no more than one thread at a time. + */ +VLC_API vlc_interrupt_t *vlc_interrupt_set(vlc_interrupt_t *); + +/** + * Raises an interruption through a specified context. + * + * This is used to asynchronously wake a thread up while it is waiting on some + * other events (typically I/O events). + * + * @note This function is thread-safe. + * @note This function is not a cancellation point. + */ +VLC_API void vlc_interrupt_raise(vlc_interrupt_t *); + +/** + * Marks the interruption context as "killed". + * + * This is not reversible. + */ +VLC_API void vlc_interrupt_kill(vlc_interrupt_t *); + +/** + * Checks if the interruption context was "killed". + * + * Indicates whether the interruption context of the calling thread (if any) + * was killed with vlc_interrupt_kill(). + */ +VLC_API bool vlc_killed(void) VLC_USED; + +/** + * Enables forwarding of interruption. + * + * If an interruption is raised through the context of the calling thread, + * it will be forwarded to the specified other context. This is used to cross + * thread boundaries. + * + * If the calling thread has no interrupt context, this function does nothing. + * + * @param to context to forward to + */ +VLC_API void vlc_interrupt_forward_start(vlc_interrupt_t *to, + void *data[2]); + +/** + * Undoes vlc_interrupt_forward_start(). + * + * This function must be called after each successful call to + * vlc_interrupt_forward_start() before any other interruptible call is made + * in the same thread. + * + * If an interruption was raised against the context of the calling thread + * (after the previous call to vlc_interrupt_forward_start()), it is dequeued. + * + * If the calling thread has no interrupt context, this function does nothing + * and returns zero. + * + * @return 0 if no interrupt was raised, EINTR if an interrupt was raised + */ +VLC_API int vlc_interrupt_forward_stop(void *const data[2]); + +/** @} @} */ +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_keystore.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_keystore.h new file mode 100644 index 0000000..5588711 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_keystore.h @@ -0,0 +1,317 @@ +/***************************************************************************** + * vlc_keystore.h: + ***************************************************************************** + * Copyright (C) 2015-2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_KEYSTORE_H +# define VLC_KEYSTORE_H + +#include + +typedef struct vlc_keystore vlc_keystore; +typedef struct vlc_keystore_entry vlc_keystore_entry; +typedef struct vlc_credential vlc_credential; + +/* Called from src/libvlc.c */ +int +libvlc_InternalKeystoreInit(libvlc_int_t *p_libvlc); + +/* Called from src/libvlc.c */ +void +libvlc_InternalKeystoreClean(libvlc_int_t *p_libvlc); + +/** + * @defgroup keystore Keystore and credential API + * @{ + * @file + * This file declares vlc keystore API + * @defgroup keystore_public Keystore public API + * @{ + */ + +/** + * List of keys that can be stored via the keystore API + */ +enum vlc_keystore_key { + KEY_PROTOCOL, + KEY_USER, + KEY_SERVER, + KEY_PATH, + KEY_PORT, + KEY_REALM, + KEY_AUTHTYPE, + KEY_MAX, +}; +#define VLC_KEYSTORE_VALUES_INIT(ppsz_values) memset(ppsz_values, 0, sizeof(const char *) * KEY_MAX) + +/** + * Keystore entry returned by vlc_keystore_find() + */ +struct vlc_keystore_entry +{ + /** Set of key/values. Values can be NULL */ + char * ppsz_values[KEY_MAX]; + /** Secret password */ + uint8_t * p_secret; + /** Length of the secret */ + size_t i_secret_len; +}; + +/** + * Create a keystore object + * + * A keystore object is persistent across runtime. It is saved on local + * filesystem via a vlc keystore module (KWallet, SecretService, Apple Keychain + * Service ...). + * + * @note to be released with vlc_keystore_release() + * + * @param p_parent the parent object used to create the keystore object + * + * @return a pointer to the keystore object, or NULL in case of error + */ +VLC_API vlc_keystore * +vlc_keystore_create(vlc_object_t *p_parent); +#define vlc_keystore_create(x) vlc_keystore_create(VLC_OBJECT(x)) + +/** + * Release a keystore object + */ +VLC_API void +vlc_keystore_release(vlc_keystore *p_keystore); + + +/** + * Store a secret associated with a set of key/values + * + * @param ppsz_values set of key/values, see vlc_keystore_key. + * ppsz_values[KEY_PROTOCOL] and ppsz_values[KEY_SERVER] must be valid + * strings + * @param p_secret binary secret or string password + * @param i_secret_len length of p_secret. If it's less than 0, then p_secret + * is assumed to be a '\0' terminated string + * @param psz_label user friendly label + * + * @return VLC_SUCCESS on success, or VLC_EGENERIC on error + */ +VLC_API int +vlc_keystore_store(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + const uint8_t* p_secret, ssize_t i_secret_len, + const char *psz_label); + +/** + * Find all entries that match a set of key/values + * + * @param ppsz_values set of key/values, see vlc_keystore_key, any values can + * be NULL + * @param pp_entries list of found entries. To be released with + * vlc_keystore_release_entries() + * + * @return the number of entries + */ +VLC_API unsigned int +vlc_keystore_find(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + vlc_keystore_entry **pp_entries) VLC_USED; + +/** + * Remove all entries that match a set of key/values + * + * @note only entries added by VLC can be removed + * + * @param ppsz_values set of key/values, see vlc_keystore_key, any values can + * be NULL + * + * @return the number of entries + */ +VLC_API unsigned int +vlc_keystore_remove(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX]); + +/** + * Release the list of entries returned by vlc_keystore_find() + */ +VLC_API void +vlc_keystore_release_entries(vlc_keystore_entry *p_entries, unsigned int i_count); + +/** + * @} + * @defgroup credential Credential API + * @{ + */ + +/** + * @note init with vlc_credential_init() + */ +struct vlc_credential +{ + /** url to store or to search */ + const vlc_url_t *p_url; + /** http realm or smb domain to search, can be overridden after a call to + * vlc_credential_get() */ + const char *psz_realm; + /** http authtype to search, can be overridden after a call to + * vlc_credential_get() */ + const char *psz_authtype; + /** valid only if vlc_credential_get() returned true */ + const char *psz_username; + /** valid only if vlc_credential_get() returned true */ + const char *psz_password; + + /* internal */ + enum { + GET_FROM_URL, + GET_FROM_OPTION, + GET_FROM_MEMORY_KEYSTORE, + GET_FROM_KEYSTORE, + GET_FROM_DIALOG, + } i_get_order; + + vlc_keystore *p_keystore; + vlc_keystore_entry *p_entries; + unsigned int i_entries_count; + + char *psz_split_domain; + char *psz_var_username; + char *psz_var_password; + + char *psz_dialog_username; + char *psz_dialog_password; + bool b_from_keystore; + bool b_store; +}; + +/** + * Init a credential struct + * + * @note to be cleaned with vlc_credential_clean() + * + * @param psz_url url to store or to search + */ +VLC_API void +vlc_credential_init(vlc_credential *p_credential, const vlc_url_t *p_url); + +/** + * Clean a credential struct + */ +VLC_API void +vlc_credential_clean(vlc_credential *p_credential); + +/** + * Get a username/password couple + * + * This will search for a credential using url, VLC options, the vlc_keystore + * or by asking the user via dialog_Login(). This function can be called + * indefinitely, it will first return the user/password from the url (if any), + * then from VLC options (if any), then from the keystore (if any), and finally + * from the dialog (if any). This function will return true as long as the user + * fill the dialog texts and will return false when the user cancel it. + * + * @param p_parent the parent object (for var, keystore and dialog) + * @param psz_option_username VLC option name for the username + * @param psz_option_password VLC option name for the password + * @param psz_dialog_title dialog title, if NULL, this function won't use the + * keystore or the dialog + * @param psz_dialog_fmt dialog text using format + * + * @return true if vlc_credential.psz_username and vlc_credential.psz_password + * are valid, otherwise this function should not be called again. + */ + +VLC_API bool +vlc_credential_get(vlc_credential *p_credential, vlc_object_t *p_parent, + const char *psz_option_username, + const char *psz_option_password, + const char *psz_dialog_title, + const char *psz_dialog_fmt, ...) VLC_FORMAT(6, 7); +#define vlc_credential_get(a, b, c, d, e, f, ...) \ + vlc_credential_get(a, VLC_OBJECT(b), c, d, e, f, ##__VA_ARGS__) + +/** + * Store the last dialog credential returned by vlc_credential_get() + * + * This function will store the credential in the memory keystore if it's + * valid, or will store in the permanent one if it comes from the dialog and if + * the user asked for it. + * + * @return true if the credential was stored or comes from the keystore, false + * otherwise + */ +VLC_API bool +vlc_credential_store(vlc_credential *p_credential, vlc_object_t *p_parent); +#define vlc_credential_store(a, b) \ + vlc_credential_store(a, VLC_OBJECT(b)) + +/** + * @} + * @defgroup keystore_implementation Implemented by keystore modules + * @{ + */ + +#define VLC_KEYSTORE_NAME "libVLC" + +static inline int +vlc_keystore_entry_set_secret(vlc_keystore_entry *p_entry, + const uint8_t *p_secret, size_t i_secret_len) +{ + p_entry->p_secret = (uint8_t*) malloc(i_secret_len); + if (!p_entry->p_secret) + return VLC_EGENERIC; + memcpy(p_entry->p_secret, p_secret, i_secret_len); + p_entry->i_secret_len = i_secret_len; + return VLC_SUCCESS; +} + +static inline void +vlc_keystore_release_entry(vlc_keystore_entry *p_entry) +{ + for (unsigned int j = 0; j < KEY_MAX; ++j) + { + free(p_entry->ppsz_values[j]); + p_entry->ppsz_values[j] = NULL; + } + free(p_entry->p_secret); + p_entry->p_secret = NULL; +} + +typedef struct vlc_keystore_sys vlc_keystore_sys; +struct vlc_keystore +{ + VLC_COMMON_MEMBERS + module_t *p_module; + vlc_keystore_sys *p_sys; + + /** See vlc_keystore_store() */ + int (*pf_store)(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + const uint8_t *p_secret, + size_t i_secret_len, const char *psz_label); + /** See vlc_keystore_find() */ + unsigned int (*pf_find)(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + vlc_keystore_entry **pp_entries); + + /** See vlc_keystore_remove() */ + unsigned int (*pf_remove)(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX]); +}; + +/** @} @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_main.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_main.h new file mode 100644 index 0000000..77866f2 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_main.h @@ -0,0 +1,38 @@ +/***************************************************************************** + * vlc_main.h: access to all program variables + * Declaration and extern access to LibVLC instance object. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002, 2008 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_int_t internal libvlc instance + */ + +/***************************************************************************** + * libvlc_internal_instance_t + ***************************************************************************** + * This structure is a LibVLC instance, for use by libvlc core and plugins + *****************************************************************************/ +struct libvlc_int_t +{ + VLC_COMMON_MEMBERS +}; + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_md5.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_md5.h new file mode 100644 index 0000000..e72ff2f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_md5.h @@ -0,0 +1,59 @@ +/***************************************************************************** + * vlc_md5.h: MD5 hash + ***************************************************************************** + * Copyright © 2004-2011 VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MD5_H +# define VLC_MD5_H + +/** + * \file + * This file defines functions and structures to compute MD5 digests + */ + +struct md5_s +{ + uint32_t A, B, C, D; /* chaining variables */ + uint32_t nblocks; + uint8_t buf[64]; + int count; +}; + +VLC_API void InitMD5( struct md5_s * ); +VLC_API void AddMD5( struct md5_s *, const void *, size_t ); +VLC_API void EndMD5( struct md5_s * ); + +/** + * Returns a char representation of the md5 hash, as shown by UNIX md5 or + * md5sum tools. + */ +static inline char * psz_md5_hash( struct md5_s *md5_s ) +{ + char *psz = (char*)malloc( 33 ); /* md5 string is 32 bytes + NULL character */ + if( likely(psz) ) + { + for( int i = 0; i < 16; i++ ) + sprintf( &psz[2*i], "%02" PRIx8, md5_s->buf[i] ); + } + return psz; +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_media_library.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_media_library.h new file mode 100644 index 0000000..e7e1f70 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_media_library.h @@ -0,0 +1,127 @@ +/***************************************************************************** + * vlc_media_library.h: SQL-based media library + ***************************************************************************** + * Copyright (C) 2008-2010 the VideoLAN Team and AUTHORS + * $Id: a35d9729ca3705ec792b7be9e1819919f6e601f6 $ + * + * Authors: Antoine Lejeune + * Jean-Philippe André + * Rémi Duraffort + * Adrien Maglo + * Srikanth Raju + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MEDIA_LIBRARY_H +# define VLC_MEDIA_LIBRARY_H + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * ML Enums + *****************************************************************************/ + +#define ML_PERSON_ARTIST "Artist" +#define ML_PERSON_ALBUM_ARTIST "Album Artist" +#define ML_PERSON_ENCODER "Encoder" +#define ML_PERSON_PUBLISHER "Publisher" + + +/** List of Query select types. + * In a query array or variable argument list, each select type is followed + * by an argument (X) of variable type (char* or int, @see ml_element_t). + * These types can be used either in the query list or in the result array. + * Some types are reserved for the result array: + */ +typedef enum +{ + ML_ALBUM = 1, /**< Album Title */ + ML_ALBUM_ID, /**< Album ID */ + ML_ALBUM_COVER, /**< Album Cover art url */ + /* FIXME: Remove ML_ARTIST */ + ML_ARTIST, /**< Artist, interpreted as ML_PEOPLE + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_ARTIST_ID, /**< Artist ID, interpreted as ML_PEOPLE_ID + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_COMMENT, /**< Comment about media */ + ML_COUNT_MEDIA, /**< Number of medias */ + ML_COUNT_ALBUM, /**< Number of albums */ + ML_COUNT_PEOPLE, /**< Number of people */ + ML_COVER, /**< Cover art url */ + ML_DURATION, /**< Duration in ms */ + ML_DISC_NUMBER, /**< Disc number of the track */ + ML_EXTRA, /**< Extra/comment (string) on the media */ + ML_FIRST_PLAYED, /**< First time media was played */ + ML_FILESIZE, /**< Size of the media file */ + ML_GENRE, /**< Genre of the media (if any) */ + ML_ID, /**< Media ID */ + ML_IMPORT_TIME, /**< Date when media was imported */ + ML_LANGUAGE, /**< Language */ + ML_LAST_PLAYED, /**< Last play UNIX timestamp */ + ML_LAST_SKIPPED, /**< Time when media was last skipped */ + ML_ORIGINAL_TITLE, /**< Media original title (if any) */ + ML_PEOPLE, /**< Any People associated with this media */ + ML_PEOPLE_ID, /**< Id of a person */ + ML_PEOPLE_ROLE, /**< Person role */ + ML_PLAYED_COUNT, /**< Media play count */ + ML_PREVIEW, /**< Url of the video preview */ + ML_SKIPPED_COUNT, /**< Number of times skipped */ + ML_SCORE, /**< Computed media score */ + ML_TITLE, /**< Media title */ + ML_TRACK_NUMBER, /**< Media track number (if any) */ + ML_TYPE, /**< Media type. @see ml_type_e */ + ML_URI, /**< Media full URI. */ + ML_VOTE, /**< Media user vote value */ + ML_YEAR, /**< Media publishing year */ + ML_DIRECTORY, /**< Monitored directory */ + ML_MEDIA, /**< Full media descriptor. @see ml_media_t */ + ML_MEDIA_SPARSE, /**< Sparse media. @see ml_media_t */ + ML_MEDIA_EXTRA, /**< Sparse + Extra = Full media */ + + /* Some special elements */ + ML_LIMIT = -1, /**< Limit a query to X results */ + ML_SORT_DESC = -2, /**< Sort a query descending on argument X */ + ML_SORT_ASC = -3, /**< Sort a query ascending on argument X */ + ML_DISTINCT = -4, /**< Add DISTINCT to SELECT statements. */ + ML_END = -42 /**< End of argument list */ +} ml_select_e; + +/** Media types (audio, video, etc...) */ +typedef enum +{ + ML_UNKNOWN = 0, /**< Unknown media type */ + ML_AUDIO = 1 << 0, /**< Audio only media */ + ML_VIDEO = 1 << 1, /**< Video media. May contain audio channels */ + ML_STREAM = 1 << 2, /**< Streamed media = not a local file */ + ML_NODE = 1 << 3, /**< Nodes like simple nodes, directories, playlists, etc */ + ML_REMOVABLE = 1 << 4, /**< Removable media: CD/DVD/Card/... */ +} ml_type_e; + +/** Query result item/list type: integers, strings, medias, timestamps */ +typedef enum { + ML_TYPE_INT, /**< Object is an int */ + ML_TYPE_PSZ, /**< A string char* */ + ML_TYPE_TIME, /**< A timestamp mtime_t */ + ML_TYPE_MEDIA, /**< A pointer to a media ml_media_t* */ +} ml_result_type_e; + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* VLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_memstream.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_memstream.h new file mode 100644 index 0000000..0ed78a7 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_memstream.h @@ -0,0 +1,76 @@ +/***************************************************************************** + * vlc_memstream.h: + ***************************************************************************** + * Copyright (C) 2016 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MEMSTREAM_H +# define VLC_MEMSTREAM_H 1 + +# include +# include + +struct vlc_memstream +{ + union + { + FILE *stream; + int error; + }; + char *ptr; + size_t length; +}; + +VLC_API +int vlc_memstream_open(struct vlc_memstream *ms); + +VLC_API +int vlc_memstream_flush(struct vlc_memstream *ms) VLC_USED; + +VLC_API +int vlc_memstream_close(struct vlc_memstream *ms) VLC_USED; + +VLC_API +size_t vlc_memstream_write(struct vlc_memstream *ms, + const void *ptr, size_t len); + +VLC_API +int vlc_memstream_putc(struct vlc_memstream *ms, int c); + +VLC_API +int vlc_memstream_puts(struct vlc_memstream *ms, const char *str); + +VLC_API +int vlc_memstream_vprintf(struct vlc_memstream *ms, const char *fmt, + va_list args); + +VLC_API +int vlc_memstream_printf(struct vlc_memstream *s, const char *fmt, + ...) VLC_FORMAT(2,3); + +# ifdef __GNUC__ +static inline int vlc_memstream_puts_len(struct vlc_memstream *ms, + const char *str, size_t len) +{ + return (vlc_memstream_write(ms, str, len) == len) ? (int)len : EOF; +} +# define vlc_memstream_puts(ms,s) \ + (__builtin_constant_p(__builtin_strlen(s)) ? \ + vlc_memstream_puts_len(ms,s,__builtin_strlen(s)) : \ + vlc_memstream_puts(ms,s)) +# endif +#endif /* VLC_MEMSTREAM_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_messages.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_messages.h new file mode 100644 index 0000000..bcf1bca --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_messages.h @@ -0,0 +1,108 @@ +/***************************************************************************** + * vlc_messages.h: messages interface + * This library provides basic functions for threads to interact with user + * interface, such as message output. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002 VLC authors and VideoLAN + * $Id: 63f9476cd5e6d6d4e274b4d4a7b947ec59d2843e $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MESSAGES_H_ +#define VLC_MESSAGES_H_ + +#include + +/** + * \defgroup messages Logging + * \brief Message logs + * + * Functions for modules to emit log messages. + * + * @{ + * \file + * Logging functions + */ + +/** Message types */ +enum vlc_log_type +{ + VLC_MSG_INFO=0, /**< Important information */ + VLC_MSG_ERR, /**< Error */ + VLC_MSG_WARN, /**< Warning */ + VLC_MSG_DBG, /**< Debug */ +}; + +/** + * Log message + */ +typedef struct vlc_log_t +{ + uintptr_t i_object_id; /**< Emitter (temporarily) unique object ID or 0 */ + const char *psz_object_type; /**< Emitter object type name */ + const char *psz_module; /**< Emitter module (source code) */ + const char *psz_header; /**< Additional header (used by VLM media) */ + const char *file; /**< Source code file name or NULL */ + int line; /**< Source code file line number or -1 */ + const char *func; /**< Source code calling function name or NULL */ + unsigned long tid; /**< Emitter thread ID */ +} vlc_log_t; + +VLC_API void vlc_Log(vlc_object_t *obj, int prio, const char *module, + const char *file, unsigned line, const char *func, + const char *format, ...) VLC_FORMAT(7, 8); +VLC_API void vlc_vaLog(vlc_object_t *obj, int prio, const char *module, + const char *file, unsigned line, const char *func, + const char *format, va_list ap); +#define msg_GenericVa(o, p, fmt, ap) \ + vlc_vaLog(VLC_OBJECT(o), p, vlc_module_name, __FILE__, __LINE__, \ + __func__, fmt, ap) + +#define msg_Generic(o, p, ...) \ + vlc_Log(VLC_OBJECT(o), p, vlc_module_name, __FILE__, __LINE__, \ + __func__, __VA_ARGS__) +#define msg_Info(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_INFO, __VA_ARGS__) +#define msg_Err(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_ERR, __VA_ARGS__) +#define msg_Warn(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_WARN, __VA_ARGS__) +#define msg_Dbg(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_DBG, __VA_ARGS__) + +extern const char vlc_module_name[]; + +VLC_API const char *vlc_strerror(int); +VLC_API const char *vlc_strerror_c(int); + +/** + * Message logging callback signature. + * \param data data pointer as provided to vlc_msg_SetCallback(). + * \param type message type (VLC_MSG_* values from enum vlc_log_type) + * \param item meta information + * \param fmt format string + * \param args format string arguments + */ +typedef void (*vlc_log_cb) (void *data, int type, const vlc_log_t *item, + const char *fmt, va_list args); + +/** + * @} + */ +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_meta.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_meta.h new file mode 100644 index 0000000..9791bb6 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_meta.h @@ -0,0 +1,165 @@ +/***************************************************************************** + * vlc_meta.h: Stream meta-data + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: d390d0bc4df47994d296c5720d1869c458b16cb5 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_H +#define VLC_META_H 1 + +/** + * \file + * This file defines functions and structures for stream meta-data in vlc + * + */ + +typedef enum vlc_meta_type_t +{ + vlc_meta_Title, + vlc_meta_Artist, + vlc_meta_Genre, + vlc_meta_Copyright, + vlc_meta_Album, + vlc_meta_TrackNumber, + vlc_meta_Description, + vlc_meta_Rating, + vlc_meta_Date, + vlc_meta_Setting, + vlc_meta_URL, + vlc_meta_Language, + vlc_meta_NowPlaying, + vlc_meta_ESNowPlaying, + vlc_meta_Publisher, + vlc_meta_EncodedBy, + vlc_meta_ArtworkURL, + vlc_meta_TrackID, + vlc_meta_TrackTotal, + vlc_meta_Director, + vlc_meta_Season, + vlc_meta_Episode, + vlc_meta_ShowName, + vlc_meta_Actors, + vlc_meta_AlbumArtist, + vlc_meta_DiscNumber, + vlc_meta_DiscTotal +} vlc_meta_type_t; + +#define VLC_META_TYPE_COUNT 27 + +#define ITEM_PREPARSED 1 +#define ITEM_ART_FETCHED 2 +#define ITEM_ART_NOTFOUND 4 + +/** + * Basic function to deal with meta + */ +struct vlc_meta_t; + +VLC_API vlc_meta_t * vlc_meta_New( void ) VLC_USED; +VLC_API void vlc_meta_Delete( vlc_meta_t *m ); +VLC_API void vlc_meta_Set( vlc_meta_t *p_meta, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API const char * vlc_meta_Get( const vlc_meta_t *p_meta, vlc_meta_type_t meta_type ); + +VLC_API void vlc_meta_AddExtra( vlc_meta_t *m, const char *psz_name, const char *psz_value ); +VLC_API const char * vlc_meta_GetExtra( const vlc_meta_t *m, const char *psz_name ); +VLC_API unsigned vlc_meta_GetExtraCount( const vlc_meta_t *m ); + +/** + * Allocate a copy of all extra meta names and a table with it. + * Be sure to free both the returned pointers and its name. + */ +VLC_API char ** vlc_meta_CopyExtraNames( const vlc_meta_t *m ) VLC_USED; + +VLC_API void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src ); + +VLC_API int vlc_meta_GetStatus( vlc_meta_t *m ); +VLC_API void vlc_meta_SetStatus( vlc_meta_t *m, int status ); + +/** + * Returns a localizes string describing the meta + */ +VLC_API const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type ); + +typedef struct meta_export_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + const char *psz_file; +} meta_export_t; + +VLC_API int input_item_WriteMeta(vlc_object_t *, input_item_t *); + +/* Setters for meta. + * Warning: Make sure to use the input_item meta setters (defined in vlc_input_item.h) + * instead of those one. */ +#define vlc_meta_SetTitle( meta, b ) vlc_meta_Set( meta, vlc_meta_Title, b ) +#define vlc_meta_SetArtist( meta, b ) vlc_meta_Set( meta, vlc_meta_Artist, b ) +#define vlc_meta_SetGenre( meta, b ) vlc_meta_Set( meta, vlc_meta_Genre, b ) +#define vlc_meta_SetCopyright( meta, b ) vlc_meta_Set( meta, vlc_meta_Copyright, b ) +#define vlc_meta_SetAlbum( meta, b ) vlc_meta_Set( meta, vlc_meta_Album, b ) +#define vlc_meta_SetTrackNum( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackNumber, b ) +#define vlc_meta_SetDescription( meta, b ) vlc_meta_Set( meta, vlc_meta_Description, b ) +#define vlc_meta_SetRating( meta, b ) vlc_meta_Set( meta, vlc_meta_Rating, b ) +#define vlc_meta_SetDate( meta, b ) vlc_meta_Set( meta, vlc_meta_Date, b ) +#define vlc_meta_SetSetting( meta, b ) vlc_meta_Set( meta, vlc_meta_Setting, b ) +#define vlc_meta_SetURL( meta, b ) vlc_meta_Set( meta, vlc_meta_URL, b ) +#define vlc_meta_SetLanguage( meta, b ) vlc_meta_Set( meta, vlc_meta_Language, b ) +#define vlc_meta_SetNowPlaying( meta, b ) vlc_meta_Set( meta, vlc_meta_NowPlaying, b ) +#define vlc_meta_SetPublisher( meta, b ) vlc_meta_Set( meta, vlc_meta_Publisher, b ) +#define vlc_meta_SetEncodedBy( meta, b ) vlc_meta_Set( meta, vlc_meta_EncodedBy, b ) +#define vlc_meta_SetArtURL( meta, b ) vlc_meta_Set( meta, vlc_meta_ArtworkURL, b ) +#define vlc_meta_SetTrackID( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackID, b ) +#define vlc_meta_SetTrackTotal( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackTotal, b ) +#define vlc_meta_SetDirector( meta, b ) vlc_meta_Set( meta, vlc_meta_Director, b ) +#define vlc_meta_SetSeason( meta, b ) vlc_meta_Set( meta, vlc_meta_Season, b ) +#define vlc_meta_SetEpisode( meta, b ) vlc_meta_Set( meta, vlc_meta_Episode, b ) +#define vlc_meta_SetShowName( meta, b ) vlc_meta_Set( meta, vlc_meta_ShowName, b ) +#define vlc_meta_SetActors( meta, b ) vlc_meta_Set( meta, vlc_meta_Actors, b ) +#define vlc_meta_SetAlbumArtist( meta, b ) vlc_meta_Set( meta, vlc_meta_AlbumArtist, b ) +#define vlc_meta_SetDiscNumber( meta, b ) vlc_meta_Set( meta, vlc_meta_DiscNumber, b ) + +#define VLC_META_TITLE vlc_meta_TypeToLocalizedString( vlc_meta_Title ) +#define VLC_META_ARTIST vlc_meta_TypeToLocalizedString( vlc_meta_Artist ) +#define VLC_META_GENRE vlc_meta_TypeToLocalizedString( vlc_meta_Genre ) +#define VLC_META_COPYRIGHT vlc_meta_TypeToLocalizedString( vlc_meta_Copyright ) +#define VLC_META_ALBUM vlc_meta_TypeToLocalizedString( vlc_meta_Album ) +#define VLC_META_TRACK_NUMBER vlc_meta_TypeToLocalizedString( vlc_meta_TrackNumber ) +#define VLC_META_DESCRIPTION vlc_meta_TypeToLocalizedString( vlc_meta_Description ) +#define VLC_META_RATING vlc_meta_TypeToLocalizedString( vlc_meta_Rating ) +#define VLC_META_DATE vlc_meta_TypeToLocalizedString( vlc_meta_Date ) +#define VLC_META_SETTING vlc_meta_TypeToLocalizedString( vlc_meta_Setting ) +#define VLC_META_URL vlc_meta_TypeToLocalizedString( vlc_meta_URL ) +#define VLC_META_LANGUAGE vlc_meta_TypeToLocalizedString( vlc_meta_Language ) +#define VLC_META_NOW_PLAYING vlc_meta_TypeToLocalizedString( vlc_meta_NowPlaying ) +#define VLC_META_PUBLISHER vlc_meta_TypeToLocalizedString( vlc_meta_Publisher ) +#define VLC_META_ENCODED_BY vlc_meta_TypeToLocalizedString( vlc_meta_EncodedBy ) +#define VLC_META_ART_URL vlc_meta_TypeToLocalizedString( vlc_meta_ArtworkURL ) +#define VLC_META_TRACKID vlc_meta_TypeToLocalizedString( vlc_meta_TrackID ) +#define VLC_META_DIRECTOR vlc_meta_TypeToLocalizedString( vlc_meta_Director ) +#define VLC_META_SEASON vlc_meta_TypeToLocalizedString( vlc_meta_Season ) +#define VLC_META_EPISODE vlc_meta_TypeToLocalizedString( vlc_meta_Episode ) +#define VLC_META_SHOW_NAME vlc_meta_TypeToLocalizedString( vlc_meta_ShowName ) +#define VLC_META_ACTORS vlc_meta_TypeToLocalizedString( vlc_meta_Actors ) +#define VLC_META_ALBUMARTIST vlc_meta_TypeToLocalizedString( vlc_meta_AlbumArtist ) +#define VLC_META_DISCNUMBER vlc_meta_TypeToLocalizedString( vlc_meta_DiscNumber ) + +#define VLC_META_EXTRA_MB_ALBUMID "MB_ALBUMID" + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_meta_fetcher.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_meta_fetcher.h new file mode 100644 index 0000000..e806145 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_meta_fetcher.h @@ -0,0 +1,38 @@ +/***************************************************************************** + * vlc_meta_fetcher.h + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_FETCHER_H +#define VLC_META_FETCHER_H 1 + +typedef enum meta_fetcher_scope_t +{ + FETCHER_SCOPE_LOCAL = 0x01, + FETCHER_SCOPE_NETWORK = 0x02, + FETCHER_SCOPE_ANY = 0x03 +} meta_fetcher_scope_t; + +typedef struct meta_fetcher_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + meta_fetcher_scope_t e_scope; +} meta_fetcher_t; + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_mime.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_mime.h new file mode 100644 index 0000000..f04fc95 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_mime.h @@ -0,0 +1,31 @@ +/***************************************************************************** + * vlc_mime.h: Mime type recognition + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MIME_H +#define VLC_MIME_H 1 + +/** + * \file + * Mime type recognition helpers. + */ + +VLC_API const char * vlc_mime_Ext2Mime( const char *psz_url ); + +#endif /* _VLC_MIME_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_modules.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_modules.h new file mode 100644 index 0000000..a425fe8 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_modules.h @@ -0,0 +1,85 @@ +/***************************************************************************** + * vlc_modules.h : Module descriptor and load functions + ***************************************************************************** + * Copyright (C) 2001-2011 VLC authors and VideoLAN + * $Id: c2d3c26d20c3c45529bc01afb40377560cdf7306 $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MODULES_H +#define VLC_MODULES_H 1 + +/** + * \file + * This file defines functions for modules in vlc + */ + +typedef int (*vlc_activate_t)(void *func, va_list args); +typedef void (*vlc_deactivate_t)(void *func, va_list args); + +/***************************************************************************** + * Exported functions. + *****************************************************************************/ + +VLC_API module_t * vlc_module_load( vlc_object_t *obj, const char *cap, const char *name, bool strict, vlc_activate_t probe, ... ) VLC_USED; +#define vlc_module_load(o,c,n,s,...) \ + vlc_module_load(VLC_OBJECT(o),c,n,s,__VA_ARGS__) +VLC_API void vlc_module_unload( vlc_object_t *obj, module_t *, + vlc_deactivate_t deinit, ... ); +#define vlc_module_unload(o,m,d,...) \ + vlc_module_unload(VLC_OBJECT(o),m,d,__VA_ARGS__) + +VLC_API module_t * module_need( vlc_object_t *, const char *, const char *, bool ) VLC_USED; +#define module_need(a,b,c,d) module_need(VLC_OBJECT(a),b,c,d) +VLC_API void module_unneed( vlc_object_t *, module_t * ); +#define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b) +VLC_API bool module_exists(const char *) VLC_USED; +VLC_API module_t * module_find(const char *) VLC_USED; + +int module_start(vlc_object_t *, const module_t *); +#define module_start(o, m) module_start(VLC_OBJECT(o),m) +void module_stop(vlc_object_t *, const module_t *); +#define module_stop(o, m) module_stop(VLC_OBJECT(o),m) + +VLC_API module_config_t * module_config_get( const module_t *, unsigned * ) VLC_USED; +VLC_API void module_config_free( module_config_t * ); + +VLC_API void module_list_free(module_t **); +VLC_API module_t ** module_list_get(size_t *n) VLC_USED; + +VLC_API bool module_provides( const module_t *m, const char *cap ); +VLC_API const char * module_get_object( const module_t *m ) VLC_USED; +VLC_API const char * module_get_name( const module_t *m, bool long_name ) VLC_USED; +#define module_GetLongName( m ) module_get_name( m, true ) +VLC_API const char * module_get_help( const module_t *m ) VLC_USED; +VLC_API const char * module_get_capability( const module_t *m ) VLC_USED; +VLC_API int module_get_score( const module_t *m ) VLC_USED; +VLC_API const char * module_gettext( const module_t *, const char * ) VLC_USED; + +VLC_USED static inline module_t *module_get_main (void) +{ + return module_find ("core"); +} +#define module_get_main(a) module_get_main() + +VLC_USED static inline bool module_is_main( const module_t * p_module ) +{ + return !strcmp( module_get_object( p_module ), "core" ); +} + +#endif /* VLC_MODULES_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_mouse.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_mouse.h new file mode 100644 index 0000000..fa07ef1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_mouse.h @@ -0,0 +1,148 @@ +/***************************************************************************** + * vlc_mouse.h: mouse related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: 481c3598e905db66805cf9a8ca58f6702921e4f0 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef _VLC_MOUSE_H +#define _VLC_MOUSE_H 1 + +/** + * Mouse buttons + */ +enum +{ + MOUSE_BUTTON_LEFT=0, + MOUSE_BUTTON_CENTER, + MOUSE_BUTTON_RIGHT, + MOUSE_BUTTON_WHEEL_UP, + MOUSE_BUTTON_WHEEL_DOWN, + MOUSE_BUTTON_WHEEL_LEFT, + MOUSE_BUTTON_WHEEL_RIGHT, + MOUSE_BUTTON_MAX +}; + +/** + * Mouse state + */ +typedef struct vlc_mouse_t +{ + /* Coordinate */ + int i_x; + int i_y; + /* Mask of pressed button */ + int i_pressed; + /* Is double clicked */ + bool b_double_click; +} vlc_mouse_t; + +static inline void vlc_mouse_Init( vlc_mouse_t *p_mouse ) +{ + p_mouse->i_x = 0; + p_mouse->i_y = 0; + p_mouse->i_pressed = 0; + p_mouse->b_double_click = false; +} + +/* */ +static inline void vlc_mouse_SetPressed( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed |= 1 << i_button; +} +static inline void vlc_mouse_SetReleased( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed &= ~(1 << i_button); +} +static inline void vlc_mouse_SetPosition( vlc_mouse_t *p_mouse, + int i_x, int i_y ) +{ + p_mouse->i_x = i_x; + p_mouse->i_y = i_y; +} + +/* */ +static inline bool vlc_mouse_IsPressed( const vlc_mouse_t *p_mouse, + int i_button ) +{ + return ( p_mouse->i_pressed & (1 << i_button) ) != 0; +} +static inline bool vlc_mouse_IsLeftPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_LEFT ); +} +static inline bool vlc_mouse_IsCenterPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_CENTER ); +} +static inline bool vlc_mouse_IsRightPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_RIGHT ); +} +static inline bool vlc_mouse_IsWheelUpPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_UP ); +} +static inline bool vlc_mouse_IsWheelDownPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_DOWN ); +} +static inline void vlc_mouse_GetMotion( int *pi_x, int *pi_y, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + *pi_x = p_new->i_x - p_old->i_x; + *pi_y = p_new->i_y - p_old->i_y; +} + +/* */ +static inline bool vlc_mouse_HasChanged( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y || + p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasMoved( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y; +} +static inline bool vlc_mouse_HasButton( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasPressed( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) == 0 && (p_new->i_pressed & i_mask); +} +static inline bool vlc_mouse_HasReleased( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) && (p_new->i_pressed & i_mask) == 0; +} +#endif /* _VLC_MOUSE_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_mtime.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_mtime.h new file mode 100644 index 0000000..4ba1a57 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_mtime.h @@ -0,0 +1,78 @@ +/***************************************************************************** + * vlc_mtime.h: high resolution time management functions + ***************************************************************************** + * This header provides portable high precision time management functions, + * which should be the only ones used in other segments of the program, since + * functions like gettimeofday() and ftime() are not always supported. + * Most functions are declared as inline or as macros since they are only + * interfaces to system calls and have to be called frequently. + * 'm' stands for 'micro', since maximum resolution is the microsecond. + * Functions prototyped are implemented in interface/mtime.c. + ***************************************************************************** + * Copyright (C) 1996, 1997, 1998, 1999, 2000 VLC authors and VideoLAN + * $Id: 311eb670eb7b9f35668196b78c9fa3c5cf1779db $ + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef __VLC_MTIME_H +# define __VLC_MTIME_H 1 + +/***************************************************************************** + * LAST_MDATE: date which will never happen + ***************************************************************************** + * This date can be used as a 'never' date, to mark missing events in a function + * supposed to return a date, such as nothing to display in a function + * returning the date of the first image to be displayed. It can be used in + * comparaison with other values: all existing dates will be earlier. + *****************************************************************************/ +#define LAST_MDATE ((mtime_t)((uint64_t)(-1)/2)) + +/***************************************************************************** + * MSTRTIME_MAX_SIZE: maximum possible size of mstrtime + ***************************************************************************** + * This values is the maximal possible size of the string returned by the + * mstrtime() function, including '-' and the final '\0'. It should be used to + * allocate the buffer. + *****************************************************************************/ +#define MSTRTIME_MAX_SIZE 22 + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API char * secstotimestr( char *psz_buffer, int32_t secs ); + +/***************************************************************************** + * date_t: date incrementation without long-term rounding errors + *****************************************************************************/ +struct date_t +{ + mtime_t date; + uint32_t i_divider_num; + uint32_t i_divider_den; + uint32_t i_remainder; +}; + +VLC_API void date_Init( date_t *, uint32_t, uint32_t ); +VLC_API void date_Change( date_t *, uint32_t, uint32_t ); +VLC_API void date_Set( date_t *, mtime_t ); +VLC_API mtime_t date_Get( const date_t * ); +VLC_API void date_Move( date_t *, mtime_t ); +VLC_API mtime_t date_Increment( date_t *, uint32_t ); +VLC_API mtime_t date_Decrement( date_t *, uint32_t ); +VLC_API uint64_t NTPtime64( void ); +#endif /* !__VLC_MTIME_ */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_network.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_network.h new file mode 100644 index 0000000..caa4dcc --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_network.h @@ -0,0 +1,299 @@ +/***************************************************************************** + * vlc_network.h: interface to communicate with network plug-ins + ***************************************************************************** + * Copyright (C) 2002-2005 VLC authors and VideoLAN + * Copyright © 2006-2007 Rémi Denis-Courmont + * $Id: 184c23acae9ddf2413b3df600523280a8f43975b $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_NETWORK_H +# define VLC_NETWORK_H + +/** + * \ingroup os + * \defgroup net Networking + * @{ + * \file + * Definitions for sockets and low-level networking + * \defgroup sockets Internet sockets + * @{ + */ + +#include +#include + +#if defined( _WIN32 ) +# define _NO_OLDNAMES 1 +# include +# include +# define net_errno (WSAGetLastError()) +# define net_Close(fd) ((void)closesocket((SOCKET)fd)) +# ifndef IPV6_V6ONLY +# define IPV6_V6ONLY 27 +# endif +#else +# include +# include +# include +# define net_errno errno +# define net_Close(fd) ((void)vlc_close(fd)) +#endif + +#ifndef MSG_NOSIGNAL +# define MSG_NOSIGNAL 0 +#endif + +/** + * Creates a socket file descriptor. + * + * This function creates a socket, similar to the standard socket() function. + * However, the new file descriptor has the close-on-exec flag set atomically, + * so as to avoid leaking the descriptor to child processes. + * + * The non-blocking flag can also optionally be set. + * + * @param pf protocol family + * @param type socket type + * @param proto network protocol + * @param nonblock true to create a non-blocking socket + * @return a new file descriptor or -1 on error + */ +VLC_API int vlc_socket(int pf, int type, int proto, bool nonblock) VLC_USED; + +/** + * Creates a pair of socket file descriptors. + * + * This function creates a pair of sockets that are mutually connected, + * much like the standard socketpair() function. However, the new file + * descriptors have the close-on-exec flag set atomically. + * See also vlc_socket(). + * + * @param pf protocol family + * @param type socket type + * @param proto network protocol + * @param nonblock true to create non-blocking sockets + * @retval 0 on success + * @retval -1 on failure + */ +VLC_API int vlc_socketpair(int pf, int type, int proto, int fds[2], + bool nonblock); + +struct sockaddr; + +/** + * Accepts an inbound connection request on a listening socket. + * + * This function creates a connected socket from a listening socket, much like + * the standard accept() function. However, the new file descriptor has the + * close-on-exec flag set atomically. See also vlc_socket(). + * + * @param lfd listening socket file descriptor + * @param addr pointer to the peer address or NULL [OUT] + * @param alen pointer to the length of the peer address or NULL [OUT] + * @param nonblock whether to put the new socket in non-blocking mode + * @return a new file descriptor or -1 on error + */ +VLC_API int vlc_accept(int lfd, struct sockaddr *addr, socklen_t *alen, + bool nonblock) VLC_USED; + +# ifdef __cplusplus +extern "C" { +# endif + +/* Portable networking layer communication */ +int net_Socket (vlc_object_t *obj, int family, int socktype, int proto); + +VLC_API int net_Connect(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); +#define net_Connect(a, b, c, d, e) net_Connect(VLC_OBJECT(a), b, c, d, e) + +VLC_API int * net_Listen(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); + +#define net_ListenTCP(a, b, c) net_Listen(VLC_OBJECT(a), b, c, \ + SOCK_STREAM, IPPROTO_TCP) + +static inline int net_ConnectTCP (vlc_object_t *obj, const char *host, int port) +{ + return net_Connect (obj, host, port, SOCK_STREAM, IPPROTO_TCP); +} +#define net_ConnectTCP(a, b, c) net_ConnectTCP(VLC_OBJECT(a), b, c) + +VLC_API int net_AcceptSingle(vlc_object_t *obj, int lfd); + +VLC_API int net_Accept( vlc_object_t *, int * ); +#define net_Accept(a, b) \ + net_Accept(VLC_OBJECT(a), b) + +VLC_API int net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim, int proto ); +#define net_ConnectDgram(a, b, c, d, e ) \ + net_ConnectDgram(VLC_OBJECT(a), b, c, d, e) + +static inline int net_ConnectUDP (vlc_object_t *obj, const char *host, int port, int hlim) +{ + return net_ConnectDgram (obj, host, port, hlim, IPPROTO_UDP); +} + +VLC_API int net_OpenDgram( vlc_object_t *p_this, const char *psz_bind, int i_bind, const char *psz_server, int i_server, int proto ); +#define net_OpenDgram( a, b, c, d, e, g ) \ + net_OpenDgram(VLC_OBJECT(a), b, c, d, e, g) + +static inline int net_ListenUDP1 (vlc_object_t *obj, const char *host, int port) +{ + return net_OpenDgram (obj, host, port, NULL, 0, IPPROTO_UDP); +} + +VLC_API void net_ListenClose( int *fd ); + +int net_Subscribe (vlc_object_t *obj, int fd, const struct sockaddr *addr, + socklen_t addrlen); + +VLC_API int net_SetCSCov( int fd, int sendcov, int recvcov ); + +VLC_API ssize_t net_Read( vlc_object_t *p_this, int fd, void *p_data, size_t i_data ); +#define net_Read(a,b,c,d) net_Read(VLC_OBJECT(a),b,c,d) +VLC_API ssize_t net_Write( vlc_object_t *p_this, int fd, const void *p_data, size_t i_data ); +#define net_Write(a,b,c,d) net_Write(VLC_OBJECT(a),b,c,d) +VLC_API char * net_Gets( vlc_object_t *p_this, int fd ); +#define net_Gets(a,b) net_Gets(VLC_OBJECT(a),b) + + +VLC_API ssize_t net_Printf( vlc_object_t *p_this, int fd, const char *psz_fmt, ... ) VLC_FORMAT( 3, 4 ); +#define net_Printf(o,fd,...) net_Printf(VLC_OBJECT(o),fd, __VA_ARGS__) +VLC_API ssize_t net_vaPrintf( vlc_object_t *p_this, int fd, const char *psz_fmt, va_list args ); +#define net_vaPrintf(a,b,c,d) net_vaPrintf(VLC_OBJECT(a),b,c,d) + +VLC_API int vlc_close(int); + +/** @} */ + +/* Portable network names/addresses resolution layer */ + +#define NI_MAXNUMERICHOST 64 + +#ifndef AI_NUMERICSERV +# define AI_NUMERICSERV 0 +#endif +#ifndef AI_IDN +# define AI_IDN 0 /* GNU/libc extension */ +#endif + +#ifdef _WIN32 +# if !defined(WINAPI_FAMILY) || WINAPI_FAMILY != WINAPI_FAMILY_APP +# undef gai_strerror +# define gai_strerror gai_strerrorA +# endif +#endif + +VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int ); +VLC_API int vlc_getaddrinfo (const char *, unsigned, + const struct addrinfo *, struct addrinfo **); +VLC_API int vlc_getaddrinfo_i11e(const char *, unsigned, + const struct addrinfo *, struct addrinfo **); + +static inline bool +net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len) +{ + switch (addr->sa_family) + { +#ifdef IN_MULTICAST + case AF_INET: + { + const struct sockaddr_in *v4 = (const struct sockaddr_in *)addr; + if ((size_t)len < sizeof (*v4)) + return false; + return IN_MULTICAST (ntohl (v4->sin_addr.s_addr)) != 0; + } +#endif + +#ifdef IN6_IS_ADDR_MULTICAST + case AF_INET6: + { + const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr; + if ((size_t)len < sizeof (*v6)) + return false; + return IN6_IS_ADDR_MULTICAST (&v6->sin6_addr) != 0; + } +#endif + } + + return false; +} + + +static inline int net_GetSockAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getsockname( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline int net_GetPeerAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getpeername( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline uint16_t net_GetPort (const struct sockaddr *addr) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + return ((const struct sockaddr_in6 *)addr)->sin6_port; +#endif + case AF_INET: + return ((const struct sockaddr_in *)addr)->sin_port; + } + return 0; +} + +static inline void net_SetPort (struct sockaddr *addr, uint16_t port) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + ((struct sockaddr_in6 *)addr)->sin6_port = port; + break; +#endif + case AF_INET: + ((struct sockaddr_in *)addr)->sin_port = port; + break; + } +} + +VLC_API char *vlc_getProxyUrl(const char *); + +# ifdef __cplusplus +} +# endif + +/** @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_objects.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_objects.h new file mode 100644 index 0000000..53a65dc --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_objects.h @@ -0,0 +1,75 @@ +/***************************************************************************** + * vlc_objects.h: vlc_object_t definition and manipulation methods + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: 4a2814187a5cc68b0e65d6dce3dd4a0d9e8fbe59 $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \defgroup vlc_object VLC objects + * @{ + * \file + * Common VLC object defintions + */ + +/* Object flags */ +#define OBJECT_FLAGS_QUIET 0x0002 +#define OBJECT_FLAGS_NOINTERACT 0x0004 +#define OBJECT_FLAGS_INSECURE 0x1000 /* VLC 3.0 only, will be removed */ + +/***************************************************************************** + * The vlc_object_t type. Yes, it's that simple :-) + *****************************************************************************/ +/** The main vlc_object_t structure */ +struct vlc_object_t +{ + VLC_COMMON_MEMBERS +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API void *vlc_object_create( vlc_object_t *, size_t ) VLC_MALLOC VLC_USED; +VLC_API vlc_object_t *vlc_object_find_name( vlc_object_t *, const char * ) VLC_USED VLC_DEPRECATED; +VLC_API void * vlc_object_hold( vlc_object_t * ); +VLC_API void vlc_object_release( vlc_object_t * ); +VLC_API vlc_list_t *vlc_list_children( vlc_object_t * ) VLC_USED; +VLC_API void vlc_list_release( vlc_list_t * ); +VLC_API char *vlc_object_get_name( const vlc_object_t * ) VLC_USED; +#define vlc_object_get_name(o) vlc_object_get_name(VLC_OBJECT(o)) + +#define vlc_object_create(a,b) vlc_object_create( VLC_OBJECT(a), b ) + +#define vlc_object_find_name(a,b) \ + vlc_object_find_name( VLC_OBJECT(a),b) + +#define vlc_object_hold(a) \ + vlc_object_hold( VLC_OBJECT(a) ) + +#define vlc_object_release(a) \ + vlc_object_release( VLC_OBJECT(a) ) + +#define vlc_list_children(a) \ + vlc_list_children( VLC_OBJECT(a) ) + +VLC_API VLC_MALLOC void *vlc_obj_malloc(vlc_object_t *, size_t); +VLC_API VLC_MALLOC void *vlc_obj_calloc(vlc_object_t *, size_t, size_t); +VLC_API void vlc_obj_free(vlc_object_t *, void *); + +/** @} */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_opengl.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_opengl.h new file mode 100644 index 0000000..fdebfeb --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_opengl.h @@ -0,0 +1,121 @@ +/***************************************************************************** + * vlc_opengl.h: VLC GL API + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * Copyright (C) 2011 Rémi Denis-Courmont + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_GL_H +#define VLC_GL_H 1 + +/** + * \file + * This file defines GL structures and functions. + */ + +struct vout_window_t; +struct vout_window_cfg_t; + +/** + * A VLC GL context (and its underlying surface) + */ +typedef struct vlc_gl_t vlc_gl_t; + +struct vlc_gl_t +{ + VLC_COMMON_MEMBERS + + struct vout_window_t *surface; + module_t *module; + void *sys; + + int (*makeCurrent)(vlc_gl_t *); + void (*releaseCurrent)(vlc_gl_t *); + void (*resize)(vlc_gl_t *, unsigned, unsigned); + void (*swap)(vlc_gl_t *); + void*(*getProcAddress)(vlc_gl_t *, const char *); + + enum { + VLC_GL_EXT_DEFAULT, + VLC_GL_EXT_EGL, + VLC_GL_EXT_WGL, + } ext; + + union { + /* if ext == VLC_GL_EXT_EGL */ + struct { + /* call eglQueryString() with current display */ + const char *(*queryString)(vlc_gl_t *, int32_t name); + /* call eglCreateImageKHR() with current display and context, can + * be NULL */ + void *(*createImageKHR)(vlc_gl_t *, unsigned target, void *buffer, + const int32_t *attrib_list); + /* call eglDestroyImageKHR() with current display, can be NULL */ + bool (*destroyImageKHR)(vlc_gl_t *, void *image); + } egl; + /* if ext == VLC_GL_EXT_WGL */ + struct + { + const char *(*getExtensionsString)(vlc_gl_t *); + } wgl; + }; +}; + +enum { + VLC_OPENGL, + VLC_OPENGL_ES2, +}; + +VLC_API vlc_gl_t *vlc_gl_Create(struct vout_window_t *, unsigned, const char *) VLC_USED; +VLC_API void vlc_gl_Release(vlc_gl_t *); +VLC_API void vlc_gl_Hold(vlc_gl_t *); + +static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl) +{ + return gl->makeCurrent(gl); +} + +static inline void vlc_gl_ReleaseCurrent(vlc_gl_t *gl) +{ + gl->releaseCurrent(gl); +} + +static inline void vlc_gl_Resize(vlc_gl_t *gl, unsigned w, unsigned h) +{ + if (gl->resize != NULL) + gl->resize(gl, w, h); +} + +static inline void vlc_gl_Swap(vlc_gl_t *gl) +{ + gl->swap(gl); +} + +static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name) +{ + return (gl->getProcAddress != NULL) ? gl->getProcAddress(gl, name) : NULL; +} + +VLC_API vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *, + const struct vout_window_cfg_t *, + struct vout_window_t **) VLC_USED; +VLC_API bool vlc_gl_surface_CheckSize(vlc_gl_t *, unsigned *w, unsigned *h); +VLC_API void vlc_gl_surface_Destroy(vlc_gl_t *); + +#endif /* VLC_GL_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_picture.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_picture.h new file mode 100644 index 0000000..fb35adc --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_picture.h @@ -0,0 +1,259 @@ +/***************************************************************************** + * vlc_picture.h: picture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: 74f156fbbd6e6a4479754c0e79fbd5374a4a1e2e $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_H +#define VLC_PICTURE_H 1 + +/** + * \file + * This file defines picture structures and functions in vlc + */ + +#include + +/** Description of a planar graphic field */ +typedef struct plane_t +{ + uint8_t *p_pixels; /**< Start of the plane's data */ + + /* Variables used for fast memcpy operations */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + + /** Size of a macropixel, defaults to 1 */ + int i_pixel_pitch; + + /* Variables used for pictures with margins */ + int i_visible_lines; /**< How many visible lines are there ? */ + int i_visible_pitch; /**< How many visible pixels are there ? */ + +} plane_t; + +/** + * Maximum number of plane for a picture + */ +#define PICTURE_PLANE_MAX (VOUT_MAX_PLANES) + +typedef struct picture_context_t +{ + void (*destroy)(struct picture_context_t *); + struct picture_context_t *(*copy)(struct picture_context_t *); +} picture_context_t; + +/** + * Video picture + */ +struct picture_t +{ + /** + * The properties of the picture + */ + video_frame_format_t format; + + plane_t p[PICTURE_PLANE_MAX]; /**< description of the planes */ + int i_planes; /**< number of allocated planes */ + + /** \name Picture management properties + * These properties can be modified using the video output thread API, + * but should never be written directly */ + /**@{*/ + mtime_t date; /**< display date */ + bool b_force; + /**@}*/ + + /** \name Picture dynamic properties + * Those properties can be changed by the decoder + * @{ + */ + bool b_progressive; /**< is it a progressive frame ? */ + bool b_top_field_first; /**< which field is first */ + unsigned int i_nb_fields; /**< # of displayed fields */ + picture_context_t *context; /**< video format-specific data pointer */ + /**@}*/ + + /** Private data - the video output plugin might want to put stuff here to + * keep track of the picture */ + picture_sys_t * p_sys; + + /** Next picture in a FIFO a pictures */ + struct picture_t *p_next; +}; + +/** + * This function will create a new picture. + * The picture created will implement a default release management compatible + * with picture_Hold and picture_Release. This default management will release + * p_sys, gc.p_sys fields if non NULL. + */ +VLC_API picture_t * picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den ) VLC_USED; + +/** + * This function will create a new picture using the given format. + * + * When possible, it is preferred to use this function over picture_New + * as more information about the format is kept. + */ +VLC_API picture_t * picture_NewFromFormat( const video_format_t *p_fmt ) VLC_USED; + +/** + * Resource for a picture. + */ +typedef struct +{ + picture_sys_t *p_sys; + void (*pf_destroy)(picture_t *); + + /* Plane resources + * XXX all fields MUST be set to the right value. + */ + struct + { + uint8_t *p_pixels; /**< Start of the plane's data */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + } p[PICTURE_PLANE_MAX]; + +} picture_resource_t; + +/** + * This function will create a new picture using the provided resource. + * + * If the resource is NULL then a plain picture_NewFromFormat is returned. + */ +VLC_API picture_t * picture_NewFromResource( const video_format_t *, const picture_resource_t * ) VLC_USED; + +/** + * This function will increase the picture reference count. + * It will not have any effect on picture obtained from vout + * + * It returns the given picture for convenience. + */ +VLC_API picture_t *picture_Hold( picture_t *p_picture ); + +/** + * This function will release a picture. + * It will not have any effect on picture obtained from vout + */ +VLC_API void picture_Release( picture_t *p_picture ); + +/** + * This function will copy all picture dynamic properties. + */ +VLC_API void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src ); + +/** + * This function will reset a picture information (properties and quantizers). + * It is sometimes useful for reusing pictures (like from a pool). + */ +VLC_API void picture_Reset( picture_t * ); + +/** + * This function will copy the picture pixels. + * You can safely copy between pictures that do not have the same size, + * only the compatible(smaller) part will be copied. + */ +VLC_API void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ); +VLC_API void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ); + +/** + * This function will copy both picture dynamic properties and pixels. + * You have to notice that sometime a simple picture_Hold may do what + * you want without the copy overhead. + * Provided for convenience. + * + * \param p_dst pointer to the destination picture. + * \param p_src pointer to the source picture. + */ +VLC_API void picture_Copy( picture_t *p_dst, const picture_t *p_src ); + +/** + * Perform a shallow picture copy + * + * This function makes a shallow copy of an existing picture. The same planes + * and resources will be used, and the cloned picture reference count will be + * incremented. + * + * \return A clone picture on success, NULL on error. + */ +VLC_API picture_t *picture_Clone(picture_t *pic); + +/** + * This function will export a picture to an encoded bitstream. + * + * pp_image will contain the encoded bitstream in psz_format format. + * + * p_fmt can be NULL otherwise it will be set with the format used for the + * picture before encoding. + * + * i_override_width/height allow to override the width and/or the height of the + * picture to be encoded: + * - if strictly lower than 0, the original dimension will be used. + * - if equal to 0, it will be deduced from the other dimension which must be + * different to 0. + * - if strictly higher than 0, it will override the dimension. + * If at most one of them is > 0 then the picture aspect ratio will be kept. + */ +VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ); + +/** + * This function will setup all fields of a picture_t without allocating any + * memory. + * XXX The memory must already be initialized. + * It does not need to be released. + * + * It will return VLC_EGENERIC if the core does not understand the requested + * format. + * + * It can be useful to get the properties of planes. + */ +VLC_API int picture_Setup( picture_t *, const video_format_t * ); + + +/***************************************************************************** + * Shortcuts to access image components + *****************************************************************************/ + +/* Plane indices */ +enum +{ + Y_PLANE = 0, + U_PLANE = 1, + V_PLANE = 2, + A_PLANE = 3, +}; + +/* Shortcuts */ +#define Y_PIXELS p[Y_PLANE].p_pixels +#define Y_PITCH p[Y_PLANE].i_pitch +#define U_PIXELS p[U_PLANE].p_pixels +#define U_PITCH p[U_PLANE].i_pitch +#define V_PIXELS p[V_PLANE].p_pixels +#define V_PITCH p[V_PLANE].i_pitch +#define A_PIXELS p[A_PLANE].p_pixels +#define A_PITCH p[A_PLANE].i_pitch + +/**@}*/ + +#endif /* VLC_PICTURE_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_picture_fifo.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_picture_fifo.h new file mode 100644 index 0000000..d337a3b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_picture_fifo.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * vlc_picture_fifo.h: picture fifo definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: 73d1b20c279f628cf94bc7cfc83b2548878bcc07 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_FIFO_H +#define VLC_PICTURE_FIFO_H 1 + +/** + * \file + * This file defines picture fifo structures and functions in vlc + */ + +#include + +/** + * Picture fifo handle + * + * It is thread safe (push/pop). + */ +typedef struct picture_fifo_t picture_fifo_t; + +/** + * It creates an empty picture_fifo_t. + */ +VLC_API picture_fifo_t * picture_fifo_New( void ) VLC_USED; + +/** + * It destroys a fifo created by picture_fifo_New. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Delete( picture_fifo_t * ); + +/** + * It retreives a picture_t from the fifo. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Pop( picture_fifo_t * ) VLC_USED; + +/** + * It returns the first picture_t pointer from the fifo but does not + * remove it. The picture returned has been hold for you so you + * must call picture_Release on it. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Peek( picture_fifo_t * ) VLC_USED; + +/** + * It saves a picture_t into the fifo. + */ +VLC_API void picture_fifo_Push( picture_fifo_t *, picture_t * ); + +/** + * It release all picture inside the fifo that have a lower or equal date + * if flush_before or higher or equal to if not flush_before than the given one. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Flush( picture_fifo_t *, mtime_t date, bool flush_before ); + +/** + * It applies a delta on all the picture timestamp. + */ +VLC_API void picture_fifo_OffsetDate( picture_fifo_t *, mtime_t delta ); + + +#endif /* VLC_PICTURE_FIFO_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_picture_pool.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_picture_pool.h new file mode 100644 index 0000000..73f3f6c --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_picture_pool.h @@ -0,0 +1,189 @@ +/***************************************************************************** + * vlc_picture_pool.h: picture pool definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: 8b04370bfb320749eec6bcf09aaf0ba76b78058f $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_POOL_H +#define VLC_PICTURE_POOL_H 1 + +/** + * \file + * This file defines picture pool structures and functions in vlc + */ + +#include + +/** + * Picture pool handle + */ +typedef struct picture_pool_t picture_pool_t; + +/** + * Picture pool configuration + */ +typedef struct { + unsigned picture_count; + picture_t *const *picture; + + int (*lock)(picture_t *); + void (*unlock)(picture_t *); +} picture_pool_configuration_t; + +/** + * Creates a pool of preallocated pictures. Free pictures can be allocated from + * the pool, and are returned to the pool when they are no longer referenced. + * + * This avoids allocating and deallocationg pictures repeatedly, and ensures + * that memory consumption remains within limits. + * + * To obtain a picture from the pool, use picture_pool_Get(). To increase and + * decrease the reference count, use picture_Hold() and picture_Release() + * respectively. + * + * If defined, picture_pool_configuration_t::lock will be called before + * a picture is used, and picture_pool_configuration_t::unlock will be called + * as soon as a picture is returned to the pool. + * Those callbacks can modify picture_t::p and access picture_t::p_sys. + * + * @return A pointer to the new pool on success, or NULL on error + * (pictures are not released on error). + */ +VLC_API picture_pool_t * picture_pool_NewExtended( const picture_pool_configuration_t * ) VLC_USED; + +/** + * Creates a picture pool with pictures in a given array. + * This is a convenience wrapper for picture_pool_NewExtended() without the + * lock and unlock callbacks. + * + * @param count number of pictures in the array + * @param tab array of pictures + * + * @return a pointer to the new pool on success, or NULL on error + * (pictures are not released on error) + */ +VLC_API picture_pool_t * picture_pool_New(unsigned count, + picture_t *const *tab) VLC_USED; + +/** + * Allocates pictures from the heap and creates a picture pool with them. + * This is a convenience wrapper for picture_NewFromFormat() and + * picture_pool_New(). + * + * @param fmt video format of pictures to allocate from the heap + * @param count number of pictures to allocate + * + * @return a pointer to the new pool on success, NULL on error + */ +VLC_API picture_pool_t * picture_pool_NewFromFormat(const video_format_t *fmt, + unsigned count) VLC_USED; + +/** + * Releases a pool created by picture_pool_NewExtended(), picture_pool_New() + * or picture_pool_NewFromFormat(). + * + * @note If there are no pending references to the pooled pictures, and the + * picture_resource_t.pf_destroy callback was not NULL, it will be invoked. + * Otherwise the default callback will be used. + * + * @warning If there are pending references (a.k.a. late pictures), the + * pictures will remain valid until the all pending references are dropped by + * picture_Release(). + */ +VLC_API void picture_pool_Release( picture_pool_t * ); + +/** + * Obtains a picture from a pool if any is immediately available. + * + * The picture must be released with picture_Release(). + * + * @return a picture, or NULL if all pictures in the pool are allocated + * + * @note This function is thread-safe. + */ +VLC_API picture_t * picture_pool_Get( picture_pool_t * ) VLC_USED; + +/** + * Obtains a picture from a pool. + * + * The picture must be released with picture_Release(). + * + * @return a picture or NULL on memory error + * + * @note This function is thread-safe. + */ +VLC_API picture_t *picture_pool_Wait(picture_pool_t *) VLC_USED; + +/** + * Enumerates all pictures in a pool, both free and allocated. + * + * @param cb callback to invoke once for each picture + * @param data opaque data parameter for the callback (first argument) + * + * @note Allocated pictures may be accessed asynchronously by other threads. + * Therefore, only read-only picture parameters can be read by the callback, + * typically picture_t.p_sys. + * Provided those rules are respected, the function is thread-safe. + */ +VLC_API void picture_pool_Enum( picture_pool_t *, + void (*cb)(void *, picture_t *), void *data ); + +/** + * Cancel the picture pool. + * + * It won't return any pictures via picture_pool_Get or picture_pool_Wait if + * canceled is true. This function will also unblock picture_pool_Wait. + * picture_pool_Reset will also reset the cancel state to false. + */ +void picture_pool_Cancel( picture_pool_t *, bool canceled ); + +/** + * Test if a picture belongs to the picture pool + * + * FIXME: remove this function when the vout_PutPicture() hack is fixed. + */ +bool picture_pool_OwnsPic( picture_pool_t *, picture_t *); + +/** + * Reserves pictures from a pool and creates a new pool with those. + * + * When the new pool is released, pictures are returned to the master pool. + * If the master pool was already released, pictures will be destroyed. + * + * @param count number of picture to reserve + * + * @return the new pool, or NULL if there were not enough pictures available + * or on error + * + * @note This function is thread-safe (but it might return NULL if other + * threads have already allocated too many pictures). + */ +VLC_API picture_pool_t * picture_pool_Reserve(picture_pool_t *, unsigned count) +VLC_USED; + +/** + * @return the total number of pictures in the given pool + * @note This function is thread-safe. + */ +VLC_API unsigned picture_pool_GetSize(const picture_pool_t *); + + +#endif /* VLC_PICTURE_POOL_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_playlist.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_playlist.h new file mode 100644 index 0000000..e19d4b9 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_playlist.h @@ -0,0 +1,443 @@ +/***************************************************************************** + * vlc_playlist.h : Playlist functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 9498e622cac22fc9c70cb4b298cca02722092d2e $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PLAYLIST_H_ +#define VLC_PLAYLIST_H_ + +# ifdef __cplusplus +extern "C" { +# endif + +#include +#include + +TYPEDEF_ARRAY(playlist_item_t*, playlist_item_array_t) + +struct intf_thread_t; + +/** + * \defgroup playlist VLC playlist + * VLC playlist controls + * @{ + * \file + * VLC playlist control interface + * + * The VLC playlist system has a tree structure. This allows advanced + * categorization, like for SAP streams (which are grouped by "sap groups"). + * + * The base structure for all playlist operations is the playlist_item_t. + * This is essentially a node within the playlist tree. Each playlist item + * references an input_item_t which contains the input stream info, such as + * location, name and meta-data. + * + * A playlist item is uniquely identified by its input item: + * \ref playlist_ItemGetByInput(). A single input item cannot be used by more + * than one playlist item at a time; if necessary, a copy of the input item can + * be made instead. + * + * The same playlist tree is visible to all user interfaces. To arbitrate + * access, a lock is used, see \ref playlist_Lock() and \ref playlist_Unlock(). + * + * Under the playlist root item node, the top-level items are the main + * media sources and include: + * - the actual playlist, + * - the media library, + * - the service discovery root node, whose children are services discovery + * module instances. + * + * So, here is an example: + * \verbatim + * Inputs array + * - input 1 -> name = foo 1 uri = ... + * - input 2 -> name = foo 2 uri = ... + * + * Playlist items tree + * - playlist (id 1) + * - category 1 (id 2) + * - foo 2 (id 6 - input 2) + * - media library (id 2) + * - foo 1 (id 5 - input 1) + * \endverbatim + * + * Sometimes, an item creates subitems. This happens for the directory access + * for example. In that case, if the item is under the "playlist" top-level + * item and playlist is configured to be flat then the item will be deleted and + * replaced with new subitems. If the item is under another top-level item, it + * will be transformed to a node and removed from the list of all items without + * nodes. + * + * For "standard" item addition, you can use playlist_Add(), playlist_AddExt() + * (more options) or playlist_AddInput() if you already created your input + * item. This will add the item at the root of "Playlist" or of "Media library" + * in each of the two trees. + * + * You can create nodes with playlist_NodeCreate() and can create items from + * existing input items to be placed under any node with + * playlist_NodeAddInput(). + * + * To delete an item, use playlist_NodeDelete( p_item ). + * + * The playlist defines the following event variables: + * + * - "item-change": It will contain a pointer to the input_item_t of a + * changed input item monitored by the playlist. + * + * - "playlist-item-append": It will contain a pointer to a playlist_item_t. + * - "playlist-item-deleted": It will contain a pointer to the playlist_item_t + * about to be deleted. + * + * - "leaf-to-parent": It will contain the playlist_item_t->i_id of an item that is transformed + * into a node. + * + * The playlist contains rate-variable which is propagated to current input if + * available also rate-slower/rate-faster is in use. + */ + +/** Helper structure to export to file part of the playlist */ +typedef struct playlist_export_t +{ + VLC_COMMON_MEMBERS + char *base_url; + FILE *p_file; + playlist_item_t *p_root; +} playlist_export_t; + +/** playlist item / node */ +struct playlist_item_t +{ + input_item_t *p_input; /**< Linked input item */ + + playlist_item_t **pp_children; /**< Children nodes/items */ + playlist_item_t *p_parent; /**< Item parent */ + int i_children; /**< Number of children, -1 if not a node */ + unsigned i_nb_played; /**< Times played */ + + int i_id; /**< Playlist item specific id */ + uint8_t i_flags; /**< Flags \see playlist_item_flags_e */ +}; + +typedef enum { + PLAYLIST_DBL_FLAG = 0x04, /**< Is it disabled ? */ + PLAYLIST_RO_FLAG = 0x08, /**< Write-enabled ? */ + PLAYLIST_SUBITEM_STOP_FLAG = 0x40, /**< Must playlist stop if the item gets subitems ?*/ + PLAYLIST_NO_INHERIT_FLAG = 0x80, /**< Will children inherit flags the R/O flag ? */ +} playlist_item_flags_e; + +/** Playlist status */ +typedef enum +{ PLAYLIST_STOPPED,PLAYLIST_RUNNING,PLAYLIST_PAUSED } playlist_status_t; + +/** Structure containing information about the playlist */ +struct playlist_t +{ + VLC_COMMON_MEMBERS + + playlist_item_array_t items; /**< Arrays of items */ + + playlist_item_array_t current; /**< Items currently being played */ + int i_current_index; /**< Index in current array */ + + /* Predefined items */ + playlist_item_t root; + playlist_item_t *p_playing; + playlist_item_t *p_media_library; +}; + +/* A bit of macro magic to generate an enum out of the following list, + * and later, to generate a list of static functions out of the same list. + * There is also SORT_RANDOM, which is always last and handled specially. + */ +#define VLC_DEFINE_SORT_FUNCTIONS \ + DEF( SORT_ID )\ + DEF( SORT_TITLE )\ + DEF( SORT_TITLE_NODES_FIRST )\ + DEF( SORT_ARTIST )\ + DEF( SORT_GENRE )\ + DEF( SORT_DURATION )\ + DEF( SORT_TITLE_NUMERIC )\ + DEF( SORT_ALBUM )\ + DEF( SORT_TRACK_NUMBER )\ + DEF( SORT_DESCRIPTION )\ + DEF( SORT_RATING )\ + DEF( SORT_URI )\ + DEF( SORT_DISC_NUMBER )\ + DEF( SORT_DATE ) + +#define DEF( s ) s, +enum +{ + VLC_DEFINE_SORT_FUNCTIONS + SORT_RANDOM, + NUM_SORT_FNS=SORT_RANDOM +}; +#undef DEF +#ifndef VLC_INTERNAL_PLAYLIST_SORT_FUNCTIONS +#undef VLC_DEFINE_SORT_FUNCTIONS +#endif + +enum +{ + ORDER_NORMAL = 0, + ORDER_REVERSE = 1, +}; + +#define PLAYLIST_END -1 + +enum pl_locked_state +{ + pl_Locked = true, + pl_Unlocked = false +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/* Helpers */ +#define PL_LOCK playlist_Lock( p_playlist ) +#define PL_UNLOCK playlist_Unlock( p_playlist ) +#define PL_ASSERT_LOCKED playlist_AssertLocked( p_playlist ) + +/** Playlist commands */ +enum { + PLAYLIST_PLAY, /**< No arg. res=can fail*/ + PLAYLIST_VIEWPLAY, /**< arg1= playlist_item_t*,*/ + /** arg2 = playlist_item_t* , res=can fail */ + PLAYLIST_TOGGLE_PAUSE, /**< No arg res=can fail */ + PLAYLIST_STOP, /**< No arg res=can fail*/ + PLAYLIST_SKIP, /**< arg1=int, res=can fail*/ + PLAYLIST_PAUSE, /**< No arg */ + PLAYLIST_RESUME, /**< No arg */ +}; + +#define playlist_Play(p) playlist_Control(p,PLAYLIST_PLAY, pl_Unlocked ) +#define playlist_TogglePause(p) \ + playlist_Control(p, PLAYLIST_TOGGLE_PAUSE, pl_Unlocked) +#define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP, pl_Unlocked ) +#define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, 1) +#define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, -1) +#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, (i) ) +#define playlist_Pause(p) \ + playlist_Control(p, PLAYLIST_PAUSE, pl_Unlocked) +#define playlist_Resume(p) \ + playlist_Control(p, PLAYLIST_RESUME, pl_Unlocked) + +/** + * Locks the playlist. + * + * This function locks the playlist. While the playlist is locked, no other + * thread can modify the playlist tree layout or current playing item and node. + * + * Locking the playlist is necessary before accessing, either for reading or + * writing, any playlist item. + * + * \note Because of the potential for lock inversion / deadlocks, locking the + * playlist shall not be attemped while holding an input item lock. An input + * item lock can be acquired while holding the playlist lock. + * + * While holding the playlist lock, a thread shall not attempt to: + * - probe, initialize or deinitialize a module or a plugin, + * - install or deinstall a variable or event callback, + * - set a variable or trigger a variable callback, with the sole exception + * of the playlist core triggering add/remove/leaf item callbacks, + * - invoke a module/plugin callback other than: + * - playlist export, + * - logger message callback. + */ +VLC_API void playlist_Lock( playlist_t * ); + +/** + * Unlocks the playlist. + * + * This function unlocks the playlist, allowing other threads to lock it. The + * calling thread must have called playlist_Lock() before. + * + * This function invalidates all or any playlist item pointers. + * There are no ways to ensure that playlist items are not modified or deleted + * by another thread past this function call. + * + * To retain a reference to a playlist item while not holding the playlist + * lock, a thread should take a reference to the input item within the + * playlist item before unlocking. If this is not practical, then the thread + * can store the playlist item ID (i_id) before unlocking. + * Either way, this will not ensure that the playlist item is not deleted, so + * the thread must be ready to handle that case later when calling + * playlist_ItemGetByInput() or playlist_ItemGetById(). + * + * Furthermore, if ID is used, then the playlist item might be deleted, and + * another item could be assigned the same ID. To avoid that problem, use + * the input item instead of the ID. + */ +VLC_API void playlist_Unlock( playlist_t * ); + +VLC_API void playlist_AssertLocked( playlist_t * ); +VLC_API void playlist_Deactivate( playlist_t * ); + +/** + * Do a playlist action. + * If there is something in the playlist then you can do playlist actions. + * Possible queries are listed in vlc_common.h + * \param p_playlist the playlist to do the command on + * \param i_query the command to do + * \param b_locked TRUE if playlist is locked when entering this function + * \param variable number of arguments + */ +VLC_API void playlist_Control( playlist_t *p_playlist, int i_query, int b_locked, ... ); + +static inline void playlist_ViewPlay(playlist_t *pl, playlist_item_t *node, + playlist_item_t *item) +{ + playlist_Control(pl, PLAYLIST_VIEWPLAY, pl_Locked, node, item); +} + +/** Get current playing input. The object is retained. + */ +VLC_API input_thread_t * playlist_CurrentInput( playlist_t *p_playlist ) VLC_USED; +VLC_API input_thread_t *playlist_CurrentInputLocked( playlist_t *p_playlist ) VLC_USED; + +/** Get the duration of all items in a node. + */ +VLC_API mtime_t playlist_GetNodeDuration( playlist_item_t * ); + +/** Clear the playlist + * \param b_locked TRUE if playlist is locked when entering this function + */ +VLC_API void playlist_Clear( playlist_t *, bool ); + +/* Playlist sorting */ +VLC_API int playlist_TreeMove( playlist_t *, playlist_item_t *, playlist_item_t *, int ); +VLC_API int playlist_TreeMoveMany( playlist_t *, int, playlist_item_t **, playlist_item_t *, int ); +VLC_API int playlist_RecursiveNodeSort( playlist_t *, playlist_item_t *,int, int ); + +VLC_API playlist_item_t * playlist_CurrentPlayingItem( playlist_t * ) VLC_USED; +VLC_API int playlist_Status( playlist_t * ); + +/** + * Export a node of the playlist to a certain type of playlistfile + * \param b_playlist true for the playlist, false for the media library + * \param psz_filename the location where the exported file will be saved + * \param psz_type the type of playlist file to create (m3u, pls, ..) + * \return VLC_SUCCESS on success + */ +VLC_API int playlist_Export( playlist_t *p_playlist, const char *psz_name, + bool b_playlist, const char *psz_type ); + +/** + * Open a playlist file, add its content to the current playlist + */ +VLC_API int playlist_Import( playlist_t *p_playlist, const char *psz_file ); + +/********************** Services discovery ***********************/ + +/** Add a service discovery module */ +VLC_API int playlist_ServicesDiscoveryAdd(playlist_t *, const char *); +/** Remove a services discovery module by name */ +VLC_API int playlist_ServicesDiscoveryRemove(playlist_t *, const char *); +/** Check whether a given SD is loaded */ +VLC_API bool playlist_IsServicesDiscoveryLoaded( playlist_t *,const char *) VLC_DEPRECATED; +/** Query a services discovery */ +VLC_API int playlist_ServicesDiscoveryControl( playlist_t *, const char *, int, ... ); + +/********************** Renderer ***********************/ +/** + * Sets a renderer or remove the current one + * @param p_item The renderer item to be used, or NULL to disable the current + * one. If a renderer is provided, its reference count will be + * incremented. + */ +VLC_API int playlist_SetRenderer( playlist_t* p_pl, vlc_renderer_item_t* p_item ); + + +/******************************************************** + * Item management + ********************************************************/ + +/******************** Item addition ********************/ +VLC_API int playlist_Add( playlist_t *, const char *, bool ); +VLC_API int playlist_AddExt( playlist_t *, const char *, const char *, bool, int, const char *const *, unsigned, bool ); +VLC_API int playlist_AddInput( playlist_t *, input_item_t *, bool, bool ); +VLC_API playlist_item_t * playlist_NodeAddInput( playlist_t *, input_item_t *, playlist_item_t *, int ); +VLC_API int playlist_NodeAddCopy( playlist_t *, playlist_item_t *, playlist_item_t *, int ); + +/********************************** Item search *************************/ +VLC_API playlist_item_t * playlist_ItemGetById(playlist_t *, int ) VLC_USED; +VLC_API playlist_item_t *playlist_ItemGetByInput(playlist_t *, + const input_item_t * ) +VLC_USED; + +VLC_API int playlist_LiveSearchUpdate(playlist_t *, playlist_item_t *, const char *, bool ); + +/******************************************************** + * Tree management + ********************************************************/ +/* Node management */ +VLC_API playlist_item_t * playlist_NodeCreate( playlist_t *, const char *, playlist_item_t * p_parent, int i_pos, int i_flags ); +VLC_API playlist_item_t * playlist_ChildSearchName(playlist_item_t*, const char* ) VLC_USED; +VLC_API void playlist_NodeDelete( playlist_t *, playlist_item_t * ); + +/************************** + * Audio output management + **************************/ + +VLC_API audio_output_t *playlist_GetAout( playlist_t * ); + +VLC_API float playlist_VolumeGet( playlist_t * ); +VLC_API int playlist_VolumeSet( playlist_t *, float ); +VLC_API int playlist_VolumeUp( playlist_t *, int, float * ); +#define playlist_VolumeDown(a, b, c) playlist_VolumeUp(a, -(b), c) +VLC_API int playlist_MuteSet( playlist_t *, bool ); +VLC_API int playlist_MuteGet( playlist_t * ); + +static inline int playlist_MuteToggle( playlist_t *pl ) +{ + int val = playlist_MuteGet( pl ); + if (val >= 0) + val = playlist_MuteSet( pl, !val ); + return val; +} + +VLC_API void playlist_EnableAudioFilter( playlist_t *, const char *, bool ); + +/*********************************************************************** + * Inline functions + ***********************************************************************/ +/** Tell if the playlist is empty */ +static inline bool playlist_IsEmpty( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->items.i_size == 0; +} + +/** Tell the number of items in the current playing context */ +static inline int playlist_CurrentSize( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->current.i_size; +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_plugin.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_plugin.h new file mode 100644 index 0000000..ce28562 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_plugin.h @@ -0,0 +1,557 @@ +/***************************************************************************** + * vlc_plugin.h : Macros used from within a module. + ***************************************************************************** + * Copyright (C) 2001-2006 VLC authors and VideoLAN + * Copyright © 2007-2009 Rémi Denis-Courmont + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MODULES_MACROS_H +# define LIBVLC_MODULES_MACROS_H 1 + +/** + * \file + * This file implements plugin (module) macros used to define a vlc module. + */ + +enum vlc_module_properties +{ + VLC_MODULE_CREATE, + VLC_CONFIG_CREATE, + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_MODULE_CPU_REQUIREMENT=0x100, + VLC_MODULE_SHORTCUT, + VLC_MODULE_CAPABILITY, + VLC_MODULE_SCORE, + VLC_MODULE_CB_OPEN, + VLC_MODULE_CB_CLOSE, + VLC_MODULE_NO_UNLOAD, + VLC_MODULE_NAME, + VLC_MODULE_SHORTNAME, + VLC_MODULE_DESCRIPTION, + VLC_MODULE_HELP, + VLC_MODULE_TEXTDOMAIN, + /* Insert new VLC_MODULE_* here */ + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_CONFIG_NAME=0x1000, + /* command line name (args=const char *) */ + + VLC_CONFIG_VALUE, + /* actual value (args=int64_t/double/const char *) */ + + VLC_CONFIG_RANGE, + /* minimum value (args=int64_t/double/const char * twice) */ + + VLC_CONFIG_ADVANCED, + /* enable advanced flag (args=none) */ + + VLC_CONFIG_VOLATILE, + /* don't write variable to storage (args=none) */ + + VLC_CONFIG_PERSISTENT_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_PRIVATE, + /* hide from user (args=none) */ + + VLC_CONFIG_REMOVED, + /* tag as no longer supported (args=none) */ + + VLC_CONFIG_CAPABILITY, + /* capability for a module or list thereof (args=const char*) */ + + VLC_CONFIG_SHORTCUT, + /* one-character (short) command line option name (args=char) */ + + VLC_CONFIG_OLDNAME_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_SAFE, + /* tag as modifiable by untrusted input item "sources" (args=none) */ + + VLC_CONFIG_DESC, + /* description (args=const char *, const char *, const char *) */ + + VLC_CONFIG_LIST_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_ADD_ACTION_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_LIST, + /* list of suggested values + * (args=size_t, const *, const char *const *) */ + + VLC_CONFIG_LIST_CB, + /* callback for suggested values + * (args=const char *, size_t (*)(vlc_object_t *, **, char ***)) */ + + /* Insert new VLC_CONFIG_* here */ +}; + +/* Configuration hint types */ +#define CONFIG_HINT_CATEGORY 0x02 /* Start of new category */ +#define CONFIG_HINT_USAGE 0x05 /* Usage information */ + +#define CONFIG_CATEGORY 0x06 /* Set category */ +#define CONFIG_SUBCATEGORY 0x07 /* Set subcategory */ +#define CONFIG_SECTION 0x08 /* Start of new section */ + +/* Configuration item types */ +#define CONFIG_ITEM_FLOAT 0x20 /* Float option */ +#define CONFIG_ITEM_INTEGER 0x40 /* Integer option */ +#define CONFIG_ITEM_RGB 0x41 /* RGB color option */ +#define CONFIG_ITEM_BOOL 0x60 /* Bool option */ +#define CONFIG_ITEM_STRING 0x80 /* String option */ +#define CONFIG_ITEM_PASSWORD 0x81 /* Password option (*) */ +#define CONFIG_ITEM_KEY 0x82 /* Hot key option */ +#define CONFIG_ITEM_MODULE 0x84 /* Module option */ +#define CONFIG_ITEM_MODULE_CAT 0x85 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST 0x86 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST_CAT 0x87 /* Module option */ +#define CONFIG_ITEM_LOADFILE 0x8C /* Read file option */ +#define CONFIG_ITEM_SAVEFILE 0x8D /* Written file option */ +#define CONFIG_ITEM_DIRECTORY 0x8E /* Directory option */ +#define CONFIG_ITEM_FONT 0x8F /* Font option */ + +#define CONFIG_ITEM(x) (((x) & ~0xF) != 0) + +/* Categories and subcategories */ +#define CAT_INTERFACE 1 +#define SUBCAT_INTERFACE_GENERAL 101 +#define SUBCAT_INTERFACE_MAIN 102 +#define SUBCAT_INTERFACE_CONTROL 103 +#define SUBCAT_INTERFACE_HOTKEYS 104 + +#define CAT_AUDIO 2 +#define SUBCAT_AUDIO_GENERAL 201 +#define SUBCAT_AUDIO_AOUT 202 +#define SUBCAT_AUDIO_AFILTER 203 +#define SUBCAT_AUDIO_VISUAL 204 +#define SUBCAT_AUDIO_MISC 205 +#define SUBCAT_AUDIO_RESAMPLER 206 + +#define CAT_VIDEO 3 +#define SUBCAT_VIDEO_GENERAL 301 +#define SUBCAT_VIDEO_VOUT 302 +#define SUBCAT_VIDEO_VFILTER 303 +#define SUBCAT_VIDEO_SUBPIC 305 +#define SUBCAT_VIDEO_SPLITTER 306 + +#define CAT_INPUT 4 +#define SUBCAT_INPUT_GENERAL 401 +#define SUBCAT_INPUT_ACCESS 402 +#define SUBCAT_INPUT_DEMUX 403 +#define SUBCAT_INPUT_VCODEC 404 +#define SUBCAT_INPUT_ACODEC 405 +#define SUBCAT_INPUT_SCODEC 406 +#define SUBCAT_INPUT_STREAM_FILTER 407 + +#define CAT_SOUT 5 +#define SUBCAT_SOUT_GENERAL 501 +#define SUBCAT_SOUT_STREAM 502 +#define SUBCAT_SOUT_MUX 503 +#define SUBCAT_SOUT_ACO 504 +#define SUBCAT_SOUT_PACKETIZER 505 +#define SUBCAT_SOUT_VOD 507 +#define SUBCAT_SOUT_RENDERER 508 + +#define CAT_ADVANCED 6 +#define SUBCAT_ADVANCED_MISC 602 +#define SUBCAT_ADVANCED_NETWORK 603 + +#define CAT_PLAYLIST 7 +#define SUBCAT_PLAYLIST_GENERAL 701 +#define SUBCAT_PLAYLIST_SD 702 +#define SUBCAT_PLAYLIST_EXPORT 703 + + +/** + * Current plugin ABI version + */ +# define MODULE_SYMBOL 3_0_0f +# define MODULE_SUFFIX "__3_0_0f" + +/***************************************************************************** + * Add a few defines. You do not want to read this section. Really. + *****************************************************************************/ + +/* Explanation: + * + * if linking a module statically, we will need: + * #define MODULE_FUNC( zog ) module_foo_zog + * + * this can't easily be done with the C preprocessor, thus a few ugly hacks. + */ + +/* I need to do _this_ to change « foo bar » to « module_foo_bar » ! */ +#define CONCATENATE( y, z ) CRUDE_HACK( y, z ) +#define CRUDE_HACK( y, z ) y##__##z + +/* If the module is built-in, then we need to define foo_InitModule instead + * of InitModule. Same for Activate- and DeactivateModule. */ +#ifdef __PLUGIN__ +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_SYMBOL ) +# define VLC_MODULE_NAME_HIDDEN_SYMBOL \ + const char vlc_module_name[] = MODULE_STRING; +#else +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_NAME ) +# define VLC_MODULE_NAME_HIDDEN_SYMBOL +#endif + +#define CDECL_SYMBOL +#if defined (__PLUGIN__) +# if defined (_WIN32) +# define DLL_SYMBOL __declspec(dllexport) +# undef CDECL_SYMBOL +# define CDECL_SYMBOL __cdecl +# elif defined (__GNUC__) +# define DLL_SYMBOL __attribute__((visibility("default"))) +# else +# define DLL_SYMBOL +# endif +#else +# define DLL_SYMBOL +#endif + +#if defined( __cplusplus ) +# define EXTERN_SYMBOL extern "C" +#else +# define EXTERN_SYMBOL +#endif + +EXTERN_SYMBOL typedef int (*vlc_set_cb) (void *, void *, int, ...); + +#define vlc_plugin_set(...) vlc_set (opaque, NULL, __VA_ARGS__) +#define vlc_module_set(...) vlc_set (opaque, module, __VA_ARGS__) +#define vlc_config_set(...) vlc_set (opaque, config, __VA_ARGS__) + +/* + * InitModule: this function is called once and only once, when the module + * is looked at for the first time. We get the useful data from it, for + * instance the module name, its shortcuts, its capabilities... we also create + * a copy of its config because the module can be unloaded at any time. + */ +#define vlc_module_begin() \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \ +{ \ + module_t *module; \ + module_config_t *config = NULL; \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; \ + if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \ + goto error; + +#define vlc_module_end() \ + (void) config; \ + return 0; \ +error: \ + return -1; \ +} \ +VLC_MODULE_NAME_HIDDEN_SYMBOL \ +VLC_METADATA_EXPORTS + +#define add_submodule( ) \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; + +#define add_shortcut( ... ) \ +{ \ + const char *shortcuts[] = { __VA_ARGS__ }; \ + if (vlc_module_set (VLC_MODULE_SHORTCUT, \ + sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts)) \ + goto error; \ +} + +#define set_shortname( shortname ) \ + if (vlc_module_set (VLC_MODULE_SHORTNAME, (const char *)(shortname))) \ + goto error; + +#define set_description( desc ) \ + if (vlc_module_set (VLC_MODULE_DESCRIPTION, (const char *)(desc))) \ + goto error; + +#define set_help( help ) \ + if (vlc_module_set (VLC_MODULE_HELP, (const char *)(help))) \ + goto error; + +#define set_capability( cap, score ) \ + if (vlc_module_set (VLC_MODULE_CAPABILITY, (const char *)(cap)) \ + || vlc_module_set (VLC_MODULE_SCORE, (int)(score))) \ + goto error; + +#define set_callbacks( activate, deactivate ) \ + if (vlc_module_set(VLC_MODULE_CB_OPEN, #activate, (void *)(activate)) \ + || vlc_module_set(VLC_MODULE_CB_CLOSE, #deactivate, \ + (void *)(deactivate))) \ + goto error; + +#define cannot_unload_broken_library( ) \ + if (vlc_module_set (VLC_MODULE_NO_UNLOAD)) \ + goto error; + +#define set_text_domain( dom ) \ + if (vlc_plugin_set (VLC_MODULE_TEXTDOMAIN, (dom))) \ + goto error; + +/***************************************************************************** + * Macros used to build the configuration structure. + * + * Note that internally we support only 3 types of config data: int, float + * and string. + * The other types declared here just map to one of these 3 basic types but + * have the advantage of also providing very good hints to a configuration + * interface so as to make it more user friendly. + * The configuration structure also includes category hints. These hints can + * provide a configuration interface with some very useful data and again + * allow for a more user friendly interface. + *****************************************************************************/ + +#define add_type_inner( type ) \ + vlc_plugin_set (VLC_CONFIG_CREATE, (type), &config); + +#define add_typedesc_inner( type, text, longtext ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_DESC, \ + (const char *)(text), (const char *)(longtext)); + +#define add_typeadv_inner( type, text, longtext, advc ) \ + add_typedesc_inner( type, text, longtext ) \ + if (advc) vlc_config_set (VLC_CONFIG_ADVANCED); + +#define add_typename_inner( type, name, text, longtext, advc ) \ + add_typeadv_inner( type, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); + +#define add_string_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (const char *)(v)); + +#define add_int_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(v)); + + +#define set_category( i_id ) \ + add_type_inner( CONFIG_CATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_subcategory( i_id ) \ + add_type_inner( CONFIG_SUBCATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_section( text, longtext ) \ + add_typedesc_inner( CONFIG_SECTION, text, longtext ) + +#define add_category_hint( text, longtext, advc ) \ + add_typeadv_inner( CONFIG_HINT_CATEGORY, text, longtext, advc ) + +#define add_usage_hint( text ) \ + add_typedesc_inner( CONFIG_HINT_USAGE, text, NULL ) + +#define add_string( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_STRING, name, text, longtext, advc, \ + value ) + +#define add_password( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_PASSWORD, name, text, longtext, advc, \ + value ) + +#define add_loadfile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_LOADFILE, name, text, longtext, advc, \ + value ) + +#define add_savefile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_SAVEFILE, name, text, longtext, advc, \ + value ) + +#define add_directory( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_DIRECTORY, name, text, longtext, advc, \ + value ) + +#define add_font( name, value, text, longtext, advc )\ + add_string_inner( CONFIG_ITEM_FONT, name, text, longtext, advc, \ + value ) + +#define add_module( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#define add_module_list( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#ifndef __PLUGIN__ +#define add_module_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_CAT, name, text, longtext, advc, \ + value ) \ + change_integer_range (i_subcategory /* gruik */, 0); + +#define add_module_list_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST_CAT, name, text, longtext, \ + advc, value ) \ + change_integer_range (i_subcategory /* gruik */, 0); +#endif + +#define add_integer( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_INTEGER, name, text, longtext, advc, value ) + +#define add_rgb( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_RGB, name, text, longtext, advc, value ) \ + change_integer_range( 0, 0xFFFFFF ) + +#define add_key( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_KEY, "global-" name, text, longtext, advc, \ + KEY_UNSET ) \ + add_string_inner( CONFIG_ITEM_KEY, name, text, longtext, advc, value ) + +#define add_integer_with_range( name, value, i_min, i_max, text, longtext, advc ) \ + add_integer( name, value, text, longtext, advc ) \ + change_integer_range( i_min, i_max ) + +#define add_float( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_FLOAT, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (double)(v)); + +#define add_float_with_range( name, value, f_min, f_max, text, longtext, advc ) \ + add_float( name, value, text, longtext, advc ) \ + change_float_range( f_min, f_max ) + +#define add_bool( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_BOOL, name, text, longtext, advc ) \ + if (v) vlc_config_set (VLC_CONFIG_VALUE, (int64_t)true); + +/* For removed option */ +#define add_obsolete_inner( name, type ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); \ + vlc_config_set (VLC_CONFIG_REMOVED); + +#define add_obsolete_bool( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_BOOL ) + +#define add_obsolete_integer( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_INTEGER ) + +#define add_obsolete_float( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_FLOAT ) + +#define add_obsolete_string( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_STRING ) + +/* Modifier macros for the config options (used for fine tuning) */ + +#define change_short( ch ) \ + vlc_config_set (VLC_CONFIG_SHORTCUT, (int)(ch)); + +#define change_string_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (char *)), \ + (const char *const *)(list), \ + (const char *const *)(list_text)); + +#define change_string_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, #cb, (void *)(cb)); + +#define change_integer_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (int)), \ + (const int *)(list), \ + (const char *const *)(list_text)); + +#define change_integer_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, #cb, (cb)); + +#define change_integer_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (int64_t)(minv), (int64_t)(maxv)); + +#define change_float_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (double)(minv), (double)(maxv)); + +/* For options that are saved but hidden from the preferences panel */ +#define change_private() \ + vlc_config_set (VLC_CONFIG_PRIVATE); + +/* For options that cannot be saved in the configuration */ +#define change_volatile() \ + change_private() \ + vlc_config_set (VLC_CONFIG_VOLATILE); + +#define change_safe() \ + vlc_config_set (VLC_CONFIG_SAFE); + +/* Meta data plugin exports */ +#define VLC_META_EXPORT( name, value ) \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void); \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void) \ + { \ + return value; \ + } + +#define VLC_COPYRIGHT_VIDEOLAN \ + "\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x74\x68" \ + "\x65\x20\x56\x69\x64\x65\x6f\x4c\x41\x4e\x20\x56\x4c\x43\x20\x6d" \ + "\x65\x64\x69\x61\x20\x70\x6c\x61\x79\x65\x72\x20\x64\x65\x76\x65" \ + "\x6c\x6f\x70\x65\x72\x73" +#define VLC_LICENSE_LGPL_2_1_PLUS \ + "\x4c\x69\x63\x65\x6e\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74" \ + "\x68\x65\x20\x74\x65\x72\x6d\x73\x20\x6f\x66\x20\x74\x68\x65\x20" \ + "\x47\x4e\x55\x20\x4c\x65\x73\x73\x65\x72\x20\x47\x65\x6e\x65\x72" \ + "\x61\x6c\x20\x50\x75\x62\x6c\x69\x63\x20\x4c\x69\x63\x65\x6e\x73" \ + "\x65\x2c\x20\x76\x65\x72\x73\x69\x6f\x6e\x20\x32\x2e\x31\x20\x6f" \ + "\x72\x20\x6c\x61\x74\x65\x72\x2e" +#define VLC_LICENSE_GPL_2_PLUS \ + "\x4c\x69\x63\x65\x6e\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74" \ + "\x68\x65\x20\x74\x65\x72\x6d\x73\x20\x6f\x66\x20\x74\x68\x65\x20" \ + "\x47\x4e\x55\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x50\x75\x62\x6c" \ + "\x69\x63\x20\x4c\x69\x63\x65\x6e\x73\x65\x2c\x20\x76\x65\x72\x73" \ + "\x69\x6f\x6e\x20\x32\x20\x6f\x72\x20\x6c\x61\x74\x65\x72\x2e" +#if defined (__LIBVLC__) +# define VLC_MODULE_COPYRIGHT VLC_COPYRIGHT_VIDEOLAN +# ifndef VLC_MODULE_LICENSE +# define VLC_MODULE_LICENSE VLC_LICENSE_LGPL_2_1_PLUS +# endif +#endif + +#ifdef VLC_MODULE_COPYRIGHT +# define VLC_COPYRIGHT_EXPORT VLC_META_EXPORT(copyright, VLC_MODULE_COPYRIGHT) +#else +# define VLC_COPYRIGHT_EXPORT +#endif +#ifdef VLC_MODULE_LICENSE +# define VLC_LICENSE_EXPORT VLC_META_EXPORT(license, VLC_MODULE_LICENSE) +#else +# define VLC_LICENSE_EXPORT +#endif + +#define VLC_METADATA_EXPORTS \ + VLC_COPYRIGHT_EXPORT \ + VLC_LICENSE_EXPORT + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_probe.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_probe.h new file mode 100644 index 0000000..efa4d97 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_probe.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * vlc_probe.h: service probing interface + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PROBE_H +# define VLC_PROBE_H 1 + +# include + +/** + * \file + * This file defines functions and structures to run-time probe VLC extensions + */ + +# ifdef __cplusplus +extern "C" { +# endif + +void *vlc_probe (vlc_object_t *, const char *, size_t *); +#define vlc_probe(obj, cap, pcount) \ + vlc_probe(VLC_OBJECT(obj), cap, pcount) + +struct vlc_probe_t +{ + VLC_COMMON_MEMBERS + + void *list; + size_t count; +}; + +typedef struct vlc_probe_t vlc_probe_t; + +static inline int vlc_probe_add(vlc_probe_t *obj, const void *data, + size_t len) +{ + char *tab = (char *)realloc (obj->list, (obj->count + 1) * len); + + if (unlikely(tab == NULL)) + return VLC_ENOMEM; + memcpy(tab + (obj->count * len), data, len); + obj->list = tab; + obj->count++; + return VLC_SUCCESS; +} + +# define VLC_PROBE_CONTINUE VLC_EGENERIC +# define VLC_PROBE_STOP VLC_SUCCESS + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_rand.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_rand.h new file mode 100644 index 0000000..761cee5 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_rand.h @@ -0,0 +1,37 @@ +/***************************************************************************** + * vlc_rand.h: RNG + ***************************************************************************** + * Copyright © 2007 Rémi Denis-Courmont + * $Id: 3ae95ac04c55f46d116481eb89255b013f6d1c32 $ + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_RAND_H +# define VLC_RAND_H + +/** + * \file + * This file defined random number generator function in vlc + */ + +VLC_API void vlc_rand_bytes(void *buf, size_t len); + +/* Interlocked (but not reproducible) functions for the POSIX PRNG */ +VLC_API double vlc_drand48(void) VLC_USED; +VLC_API long vlc_lrand48(void) VLC_USED; +VLC_API long vlc_mrand48(void) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_renderer_discovery.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_renderer_discovery.h new file mode 100644 index 0000000..6193e48 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_renderer_discovery.h @@ -0,0 +1,219 @@ +/***************************************************************************** + * vlc_renderer_discovery.h : Renderer Discovery functions + ***************************************************************************** + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_RENDERER_DISCOVERY_H +#define VLC_RENDERER_DISCOVERY_H 1 + +#include +#include +#include + +/** + * @defgroup vlc_renderer VLC renderer discovery + * @{ + * + * @file + * This file declares VLC renderer discvoery structures and functions + * + * @defgroup vlc_renderer_item VLC renderer items returned by the discovery + * @{ + */ + +#define VLC_RENDERER_CAN_AUDIO 0x0001 +#define VLC_RENDERER_CAN_VIDEO 0x0002 + +/** + * Create a new renderer item + * + * @param psz_type type of the item + * @param psz_name name of the item + * @param psz_uri uri of the renderer item, must contains a valid protocol and + * a valid host + * @param psz_extra_sout extra sout options + * @param psz_demux_filter demux filter to use with the renderer + * @param psz_icon_uri icon uri of the renderer item + * @param i_flags flags for the item + * @return a renderer item or NULL in case of error + */ +VLC_API vlc_renderer_item_t * +vlc_renderer_item_new(const char *psz_type, const char *psz_name, + const char *psz_uri, const char *psz_extra_sout, + const char *psz_demux_filter, const char *psz_icon_uri, + int i_flags) VLC_USED; + +/** + * Hold a renderer item, i.e. creates a new reference + */ +VLC_API vlc_renderer_item_t * +vlc_renderer_item_hold(vlc_renderer_item_t *p_item); + +/** + * Releases a renderer item, i.e. decrements its reference counter + */ +VLC_API void +vlc_renderer_item_release(vlc_renderer_item_t *p_item); + +/** + * Get the human readable name of a renderer item + */ +VLC_API const char * +vlc_renderer_item_name(const vlc_renderer_item_t *p_item); + +/** + * Get the type (not translated) of a renderer item. For now, the type can only + * be "chromecast" ("upnp", "airplay" may come later). + */ +VLC_API const char * +vlc_renderer_item_type(const vlc_renderer_item_t *p_item); + +/** + * Get the demux filter to use with a renderer item + */ +VLC_API const char * +vlc_renderer_item_demux_filter(const vlc_renderer_item_t *p_item); + +/** + * Get the sout command of a renderer item + */ +VLC_API const char * +vlc_renderer_item_sout(const vlc_renderer_item_t *p_item); + +/** + * Get the icon uri of a renderer item + */ +VLC_API const char * +vlc_renderer_item_icon_uri(const vlc_renderer_item_t *p_item); + +/** + * Get the flags of a renderer item + */ +VLC_API int +vlc_renderer_item_flags(const vlc_renderer_item_t *p_item); + +/** + * @} + * @defgroup vlc_renderer_discovery VLC renderer discovery interface + * @{ + */ + +typedef struct vlc_renderer_discovery_sys vlc_renderer_discovery_sys; +struct vlc_renderer_discovery_owner; + +/** + * Return a list of renderer discovery modules + * + * @param pppsz_names a pointer to a list of module name, NULL terminated + * @param pppsz_longnames a pointer to a list of module longname, NULL + * terminated + * + * @return VLC_SUCCESS on success, or VLC_EGENERIC on error + */ +VLC_API int +vlc_rd_get_names(vlc_object_t *p_obj, char ***pppsz_names, + char ***pppsz_longnames) VLC_USED; +#define vlc_rd_get_names(a, b, c) \ + vlc_rd_get_names(VLC_OBJECT(a), b, c) + +/** + * Create a new renderer discovery module + * + * @param psz_name name of the module to load, see vlc_rd_get_names() to get + * the list of names + * + * @return a valid vlc_renderer_discovery, need to be released with + * vlc_rd_release() + */ +VLC_API vlc_renderer_discovery_t * +vlc_rd_new(vlc_object_t *p_obj, const char *psz_name, + const struct vlc_renderer_discovery_owner *owner) VLC_USED; + +VLC_API void vlc_rd_release(vlc_renderer_discovery_t *p_rd); + +/** + * @} + * @defgroup vlc_renderer_discovery_module VLC renderer module + * @{ + */ + +struct vlc_renderer_discovery_owner +{ + void *sys; + void (*item_added)(struct vlc_renderer_discovery_t *, + struct vlc_renderer_item_t *); + void (*item_removed)(struct vlc_renderer_discovery_t *, + struct vlc_renderer_item_t *); +}; + +struct vlc_renderer_discovery_t +{ + VLC_COMMON_MEMBERS + module_t * p_module; + + struct vlc_renderer_discovery_owner owner; + + char * psz_name; + config_chain_t * p_cfg; + + vlc_renderer_discovery_sys *p_sys; +}; + +/** + * Add a new renderer item + * + * This will send the vlc_RendererDiscoveryItemAdded event + */ +static inline void vlc_rd_add_item(vlc_renderer_discovery_t * p_rd, + vlc_renderer_item_t * p_item) +{ + p_rd->owner.item_added(p_rd, p_item); +} + +/** + * Add a new renderer item + * + * This will send the vlc_RendererDiscoveryItemRemoved event + */ +static inline void vlc_rd_remove_item(vlc_renderer_discovery_t * p_rd, + vlc_renderer_item_t * p_item) +{ + p_rd->owner.item_removed(p_rd, p_item); +} + +/** + * Renderer Discovery proble helpers + */ +VLC_API int +vlc_rd_probe_add(vlc_probe_t *p_probe, const char *psz_name, + const char *psz_longname); + +#define VLC_RD_PROBE_HELPER(name, longname) \ +static int vlc_rd_probe_open(vlc_object_t *obj) \ +{ \ + return vlc_rd_probe_add((struct vlc_probe_t *)obj, name, longname); \ +} + +#define VLC_RD_PROBE_SUBMODULE \ + add_submodule() \ + set_capability("renderer probe", 100) \ + set_callbacks(vlc_rd_probe_open, NULL) + +/** @} @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_services_discovery.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_services_discovery.h new file mode 100644 index 0000000..673410c --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_services_discovery.h @@ -0,0 +1,234 @@ +/***************************************************************************** + * vlc_services_discovery.h : Services Discover functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: e4dfcd3985a6eea1d4b5c540e72219b67d733901 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SERVICES_DISCOVERY_H_ +#define VLC_SERVICES_DISCOVERY_H_ + +#include +#include + +/** + * \file + * This file lists functions and structures for service discovery (SD) in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * @{ + */ + +struct services_discovery_owner_t +{ + void *sys; /**< Private data for the owner callbacks */ + void (*item_added)(struct services_discovery_t *sd, input_item_t *parent, + input_item_t *item, const char *category); + void (*item_removed)(struct services_discovery_t *sd, input_item_t *item); +}; + +/** + * Main service discovery structure to build a SD module + */ +struct services_discovery_t +{ + VLC_COMMON_MEMBERS + module_t * p_module; /**< Loaded module */ + + char *psz_name; /**< Main name of the SD */ + config_chain_t *p_cfg; /**< Configuration for the SD */ + + const char *description; /**< Human-readable name */ + + /** Control function + * \see services_discovery_command_e + */ + int ( *pf_control ) ( services_discovery_t *, int, va_list ); + + services_discovery_sys_t *p_sys; /**< Custom private data */ + + struct services_discovery_owner_t owner; /**< Owner callbacks */ +}; + +/** + * Service discovery categories + * \see vlc_sd_probe_Add + */ +enum services_discovery_category_e +{ + SD_CAT_DEVICES = 1, /**< Devices, like portable music players */ + SD_CAT_LAN, /**< LAN/WAN services, like Upnp or SAP */ + SD_CAT_INTERNET, /**< Internet or Website channels services */ + SD_CAT_MYCOMPUTER /**< Computer services, like Discs or Apps */ +}; + +/** + * Service discovery control commands + */ +enum services_discovery_command_e +{ + SD_CMD_SEARCH = 1, /**< arg1 = query */ + SD_CMD_DESCRIPTOR /**< arg1 = services_discovery_descriptor_t* */ +}; + +/** + * Service discovery capabilities + */ +enum services_discovery_capability_e +{ + SD_CAP_SEARCH = 1 /**< One can search in the SD */ +}; + +/** + * Service discovery descriptor + * \see services_discovery_command_e + */ +typedef struct +{ + char *psz_short_desc; /**< The short description, human-readable */ + char *psz_icon_url; /**< URL to the icon that represents it */ + char *psz_url; /**< URL for the service */ + int i_capabilities; /**< \see services_discovery_capability_e */ +} services_discovery_descriptor_t; + + +/*********************************************************************** + * Service Discovery + ***********************************************************************/ + +/** + * Ask for a research in the SD + * @param p_sd: the Service Discovery + * @param i_control: the command to issue + * @param args: the argument list + * @return VLC_SUCCESS in case of success, the error code overwise + */ +static inline int vlc_sd_control( services_discovery_t *p_sd, int i_control, va_list args ) +{ + if( p_sd->pf_control ) + return p_sd->pf_control( p_sd, i_control, args ); + else + return VLC_EGENERIC; +} + +/* Get the services discovery modules names to use in Create(), in a null + * terminated string array. Array and string must be freed after use. */ +VLC_API char ** vlc_sd_GetNames( vlc_object_t *, char ***, int ** ) VLC_USED; +#define vlc_sd_GetNames(obj, pln, pcat ) \ + vlc_sd_GetNames(VLC_OBJECT(obj), pln, pcat) + +/** + * Creates a services discoverer. + */ +VLC_API services_discovery_t *vlc_sd_Create(vlc_object_t *parent, + const char *chain, const struct services_discovery_owner_t *owner) +VLC_USED; + +VLC_API void vlc_sd_Destroy( services_discovery_t * ); + +/** + * Added top-level service callback. + * + * This is a convenience wrapper for services_discovery_AddSubItem(). + * It covers the most comomn case wherby the added item is a top-level service, + * i.e. it has no parent node. + */ +static inline void services_discovery_AddItem(services_discovery_t *sd, + input_item_t *item) +{ + sd->owner.item_added(sd, NULL, item, NULL); +} + +/** + * Added service callback. + * + * A services discovery module invokes this function when it "discovers" a new + * service, i.e. a new input item. + * + * @note This callback does not take ownership of the input item; it might + * however (and most probably will) add one of more references to the item. + * + * The caller is responsible for releasing its own reference(s) eventually. + * Keeping a reference is necessary to call services_discovery_RemoveItem() or + * to alter the item later. However, if the caller will never remove nor alter + * the item, it can drop its reference(s) immediately. + * + * @param sd services discoverer / services discovery module instance + * @param item input item to add + */ +static inline void services_discovery_AddSubItem(services_discovery_t *sd, + input_item_t *parent, + input_item_t *item) +{ + sd->owner.item_added(sd, parent, item, NULL); +} + +/** + * Added service backward compatibility callback. + * + * @param category Optional name of a group that the item belongs in + * (for backward compatibility with legacy modules) + */ +VLC_DEPRECATED +static inline void services_discovery_AddItemCat(services_discovery_t *sd, + input_item_t *item, + const char *category) +{ + sd->owner.item_added(sd, NULL, item, category); +} + +/** + * Removed service callback. + * + * A services discovery module invokes this function when it senses that a + * service is no longer available. + */ +static inline void services_discovery_RemoveItem(services_discovery_t *sd, + input_item_t *item) +{ + sd->owner.item_removed(sd, item); +} + +/* SD probing */ + +VLC_API int vlc_sd_probe_Add(vlc_probe_t *, const char *, const char *, int category); + +#define VLC_SD_PROBE_SUBMODULE \ + add_submodule() \ + set_capability( "services probe", 100 ) \ + set_callbacks( vlc_sd_probe_Open, NULL ) + +#define VLC_SD_PROBE_HELPER(name, longname, cat) \ +static int vlc_sd_probe_Open (vlc_object_t *obj) \ +{ \ + return vlc_sd_probe_Add ((struct vlc_probe_t *)obj, name, \ + longname, cat); \ +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_sout.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_sout.h new file mode 100644 index 0000000..8e6367e --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_sout.h @@ -0,0 +1,311 @@ +/***************************************************************************** + * vlc_sout.h : stream output module + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: c710780e2e15ccd3de5ef3e12a47dcfacfbc744a $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Eric Petit + * Jean-Paul Saman + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SOUT_H_ +#define VLC_SOUT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** + * \defgroup sout Stream output + * \ingroup output + * @{ + * \file + * Stream output modules interface + */ + +/** Stream output instance (FIXME: should be private to src/ to avoid + * invalid unsynchronized access) */ +struct sout_instance_t +{ + VLC_COMMON_MEMBERS + + char *psz_sout; + + /** count of output that can't control the space */ + int i_out_pace_nocontrol; + + vlc_mutex_t lock; + sout_stream_t *p_stream; +}; + +/**************************************************************************** + * sout_stream_id_sys_t: opaque (private for all sout_stream_t) + ****************************************************************************/ +typedef struct sout_stream_id_sys_t sout_stream_id_sys_t; + +/** + * \defgroup sout_access Access output + * Raw output byte streams + * @{ + */ + +/** Stream output access_output */ +struct sout_access_out_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + char *psz_access; + + char *psz_path; + sout_access_out_sys_t *p_sys; + int (*pf_seek)( sout_access_out_t *, off_t ); + ssize_t (*pf_read)( sout_access_out_t *, block_t * ); + ssize_t (*pf_write)( sout_access_out_t *, block_t * ); + int (*pf_control)( sout_access_out_t *, int, va_list ); + + config_chain_t *p_cfg; +}; + +enum access_out_query_e +{ + ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */ + ACCESS_OUT_CAN_SEEK, /* arg1=bool *, can fail (assume false) */ +}; + +VLC_API sout_access_out_t * sout_AccessOutNew( vlc_object_t *, const char *psz_access, const char *psz_name ) VLC_USED; +#define sout_AccessOutNew( obj, access, name ) \ + sout_AccessOutNew( VLC_OBJECT(obj), access, name ) +VLC_API void sout_AccessOutDelete( sout_access_out_t * ); +VLC_API int sout_AccessOutSeek( sout_access_out_t *, off_t ); +VLC_API ssize_t sout_AccessOutRead( sout_access_out_t *, block_t * ); +VLC_API ssize_t sout_AccessOutWrite( sout_access_out_t *, block_t * ); +VLC_API int sout_AccessOutControl( sout_access_out_t *, int, ... ); + +static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao ) +{ + bool b; + if( sout_AccessOutControl( p_ao, ACCESS_OUT_CONTROLS_PACE, &b ) ) + return true; + return b; +} + +/** + * @} + * \defgroup sout_mux Multiplexer + * Multiplexers (file formatters) + * @{ + */ + +/** Muxer structure */ +struct sout_mux_t +{ + VLC_COMMON_MEMBERS + module_t *p_module; + + sout_instance_t *p_sout; + + char *psz_mux; + config_chain_t *p_cfg; + + sout_access_out_t *p_access; + + int (*pf_addstream)( sout_mux_t *, sout_input_t * ); + void (*pf_delstream)( sout_mux_t *, sout_input_t * ); + int (*pf_mux) ( sout_mux_t * ); + int (*pf_control) ( sout_mux_t *, int, va_list ); + + /* here are all inputs accepted by muxer */ + int i_nb_inputs; + sout_input_t **pp_inputs; + + /* mux private */ + sout_mux_sys_t *p_sys; + + /* XXX private to stream_output.c */ + /* if muxer doesn't support adding stream at any time then we first wait + * for stream then we refuse all stream and start muxing */ + bool b_add_stream_any_time; + bool b_waiting_stream; + /* we wait 1.5 second after first stream added */ + mtime_t i_add_stream_start; +}; + +enum sout_mux_query_e +{ + /* capabilities */ + MUX_CAN_ADD_STREAM_WHILE_MUXING, /* arg1= bool *, res=cannot fail */ + /* properties */ + MUX_GET_ADD_STREAM_WAIT, /* arg1= bool *, res=cannot fail */ + MUX_GET_MIME, /* arg1= char ** res=can fail */ +}; + +struct sout_input_t +{ + const es_format_t *p_fmt; + block_fifo_t *p_fifo; + void *p_sys; + es_format_t fmt; +}; + + +VLC_API sout_mux_t * sout_MuxNew( sout_instance_t*, const char *, sout_access_out_t * ) VLC_USED; +VLC_API sout_input_t *sout_MuxAddStream( sout_mux_t *, const es_format_t * ) VLC_USED; +VLC_API void sout_MuxDeleteStream( sout_mux_t *, sout_input_t * ); +VLC_API void sout_MuxDelete( sout_mux_t * ); +VLC_API int sout_MuxSendBuffer( sout_mux_t *, sout_input_t *, block_t * ); +VLC_API int sout_MuxGetStream(sout_mux_t *, unsigned, mtime_t *); +VLC_API void sout_MuxFlush( sout_mux_t *, sout_input_t * ); + +static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = p_mux->pf_control( p_mux, i_query, args ); + va_end( args ); + return i_result; +} + +/** @} */ + +enum sout_stream_query_e { + SOUT_STREAM_EMPTY, /* arg1=bool *, res=can fail (assume true) */ +}; + +struct sout_stream_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + sout_instance_t *p_sout; + + char *psz_name; + config_chain_t *p_cfg; + sout_stream_t *p_next; + + /* add, remove a stream */ + sout_stream_id_sys_t *(*pf_add)( sout_stream_t *, const es_format_t * ); + void (*pf_del)( sout_stream_t *, sout_stream_id_sys_t * ); + /* manage a packet */ + int (*pf_send)( sout_stream_t *, sout_stream_id_sys_t *, block_t* ); + int (*pf_control)( sout_stream_t *, int, va_list ); + void (*pf_flush)( sout_stream_t *, sout_stream_id_sys_t * ); + + sout_stream_sys_t *p_sys; + bool pace_nocontrol; +}; + +VLC_API void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last ); +VLC_API sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout, + const char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED; + +static inline sout_stream_id_sys_t *sout_StreamIdAdd( sout_stream_t *s, + const es_format_t *fmt ) +{ + return s->pf_add( s, fmt ); +} + +static inline void sout_StreamIdDel( sout_stream_t *s, + sout_stream_id_sys_t *id ) +{ + s->pf_del( s, id ); +} + +static inline int sout_StreamIdSend( sout_stream_t *s, + sout_stream_id_sys_t *id, block_t *b ) +{ + return s->pf_send( s, id, b ); +} + +static inline void sout_StreamFlush( sout_stream_t *s, + sout_stream_id_sys_t *id ) +{ + if (s->pf_flush) + s->pf_flush( s, id ); +} + +static inline int sout_StreamControl( sout_stream_t *s, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + if ( !s->pf_control ) + i_result = VLC_EGENERIC; + else + i_result = s->pf_control( s, i_query, args ); + va_end( args ); + return i_result; +} + +/**************************************************************************** + * Encoder + ****************************************************************************/ + +VLC_API encoder_t * sout_EncoderCreate( vlc_object_t *obj ); +#define sout_EncoderCreate(o) sout_EncoderCreate(VLC_OBJECT(o)) + +/**************************************************************************** + * Announce handler + ****************************************************************************/ +VLC_API session_descriptor_t* sout_AnnounceRegisterSDP( vlc_object_t *, const char *, const char * ) VLC_USED; +VLC_API void sout_AnnounceUnRegister(vlc_object_t *,session_descriptor_t* ); +#define sout_AnnounceRegisterSDP(o, sdp, addr) \ + sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr) +#define sout_AnnounceUnRegister(o, a) \ + sout_AnnounceUnRegister(VLC_OBJECT (o), a) + +/** SDP */ + +struct sockaddr; +struct vlc_memstream; + +VLC_API int vlc_sdp_Start(struct vlc_memstream *, vlc_object_t *obj, + const char *cfgpref, + const struct sockaddr *src, size_t slen, + const struct sockaddr *addr, size_t alen) VLC_USED; +VLC_API void sdp_AddMedia(struct vlc_memstream *, const char *type, + const char *protocol, int dport, unsigned pt, + bool bw_indep, unsigned bw, const char *ptname, + unsigned clockrate, unsigned channels, + const char *fmtp); +VLC_API void sdp_AddAttribute(struct vlc_memstream *, const char *name, + const char *fmt, ...) VLC_FORMAT(3, 4); + +/** Description module */ +typedef struct sout_description_data_t +{ + int i_es; + es_format_t **es; + vlc_sem_t *sem; +} sout_description_data_t; + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_spu.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_spu.h new file mode 100644 index 0000000..ebc4205 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_spu.h @@ -0,0 +1,105 @@ +/***************************************************************************** + * vlc_spu.h: spu_t definition and functions. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2010 Laurent Aimar + * $Id: 510ee151ec907da9fb6ac88b38cf7ef68a5c4af8 $ + * + * Authors: Gildas Bazin + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SPU_H +#define VLC_SPU_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup spu Sub-picture channels + * \ingroup video_output + * @{ + * \file + */ + +typedef struct spu_private_t spu_private_t; + +/** + * Subpicture unit descriptor + */ +struct spu_t +{ + VLC_COMMON_MEMBERS + + spu_private_t *p; +}; + + VLC_API spu_t * spu_Create( vlc_object_t *, vout_thread_t * ); +#define spu_Create(a,b) spu_Create(VLC_OBJECT(a),b) +VLC_API void spu_Destroy( spu_t * ); + +/** + * This function sends a subpicture to the spu_t core. + * + * You cannot use the provided subpicture anymore. The spu_t core + * will destroy it at its convenience. + */ +VLC_API void spu_PutSubpicture( spu_t *, subpicture_t * ); + +/** + * This function will return an unique subpicture containing the OSD and + * subtitles visibles at the requested date. + * + * \param p_chroma_list is a list of supported chroma for the output (can be NULL) + * \param p_fmt_dst is the format of the picture on which the return subpicture will be rendered. + * \param p_fmt_src is the format of the original(source) video. + * + * The returned value if non NULL must be released by subpicture_Delete(). + */ +VLC_API subpicture_t * spu_Render( spu_t *, const vlc_fourcc_t *p_chroma_list, const video_format_t *p_fmt_dst, const video_format_t *p_fmt_src, mtime_t render_subtitle_date, mtime_t render_osd_date, bool ignore_osd ); + +/** + * It registers a new SPU channel. + */ +VLC_API int spu_RegisterChannel( spu_t * ); + +/** + * It clears all subpictures associated to a SPU channel. + */ +VLC_API void spu_ClearChannel( spu_t *, int ); + +/** + * It changes the sub sources list + */ +VLC_API void spu_ChangeSources( spu_t *, const char * ); + +/** + * It changes the sub filters list + */ +VLC_API void spu_ChangeFilters( spu_t *, const char * ); + +/** @}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_SPU_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_stream.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_stream.h new file mode 100644 index 0000000..0d6d0e9 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_stream.h @@ -0,0 +1,498 @@ +/***************************************************************************** + * vlc_stream.h: Stream (between access and demux) descriptor and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 789545e16e59dd99f215d7b2bafb655f49dfbc88 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STREAM_H +#define VLC_STREAM_H 1 + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \defgroup stream Stream + * \ingroup input + * Buffered input byte streams + * @{ + * \file + * Byte streams and byte stream filter modules interface + */ + +/** + * stream_t definition + */ + +struct stream_t +{ + VLC_COMMON_MEMBERS + + /* Module properties for stream filter */ + module_t *p_module; + + char *psz_name; + char *psz_url; /**< Full URL or MRL (can be NULL) */ + const char *psz_location; /**< Location (URL with the scheme stripped) */ + char *psz_filepath; /**< Local file path (if applicable) */ + bool b_preparsing; /**< True if this access is used to preparse */ + + /* Stream source for stream filter */ + stream_t *p_source; + + /** + * Read data. + * + * Callback to read data from the stream into a caller-supplied buffer. + * + * This may be NULL if the stream is actually a directory rather than a + * byte stream, or if \ref stream_t.pf_block is non-NULL. + * + * \param buf buffer to read data into + * \param len buffer length (in bytes) + * + * \retval -1 no data available yet + * \retval 0 end of stream (incl. fatal error) + * \retval positive number of bytes read (no more than len) + */ + ssize_t (*pf_read)(stream_t *, void *buf, size_t len); + + /** + * Read data block. + * + * Callback to read a block of data. The data is read into a block of + * memory allocated by the stream. For some streams, data can be read more + * efficiently in block of a certain size, and/or using a custom allocator + * for buffers. In such case, this callback should be provided instead of + * \ref stream_t.pf_read; otherwise, this should be NULL. + * + * \param eof storage space for end-of-stream flag [OUT] + * (*eof is always false when invoking pf_block(); pf_block() should set + * *eof to true if it detects the end of the stream) + * + * \return a data block, + * NULL if no data available yet, on error and at end-of-stream + */ + block_t *(*pf_block)(stream_t *, bool *eof); + + /** + * Read directory. + * + * Callback to fill an item node from a directory + * (see doc/browsing.txt for details). + * + * NULL if the stream is not a directory. + */ + int (*pf_readdir)(stream_t *, input_item_node_t *); + + /** + * Seek. + * + * Callback to set the stream pointer (in bytes from start). + * + * May be NULL if seeking is not supported. + */ + int (*pf_seek)(stream_t *, uint64_t); + + /** + * Stream control. + * + * Cannot be NULL. + * + * \see stream_query_e + */ + int (*pf_control)(stream_t *, int i_query, va_list); + + /** + * Private data pointer + */ + void *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/** + * Possible commands to send to vlc_stream_Control() and vlc_stream_vaControl() + */ +enum stream_query_e +{ + /* capabilities */ + STREAM_CAN_SEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_FASTSEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_PAUSE, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_CONTROL_PACE, /**< arg1= bool * res=cannot fail*/ + /* */ + STREAM_GET_SIZE=6, /**< arg1= uint64_t * res=can fail */ + STREAM_IS_DIRECTORY, /**< res=can fail */ + + /* */ + STREAM_GET_PTS_DELAY = 0x101,/**< arg1= int64_t* res=cannot fail */ + STREAM_GET_TITLE_INFO, /**< arg1=input_title_t*** arg2=int* res=can fail */ + STREAM_GET_TITLE, /**< arg1=unsigned * res=can fail */ + STREAM_GET_SEEKPOINT, /**< arg1=unsigned * res=can fail */ + STREAM_GET_META, /**< arg1= vlc_meta_t * res=can fail */ + STREAM_GET_CONTENT_TYPE, /**< arg1= char ** res=can fail */ + STREAM_GET_SIGNAL, /**< arg1=double *pf_quality, arg2=double *pf_strength res=can fail */ + STREAM_GET_TAGS, /**< arg1=const block_t ** res=can fail */ + + STREAM_SET_PAUSE_STATE = 0x200, /**< arg1= bool res=can fail */ + STREAM_SET_TITLE, /**< arg1= int res=can fail */ + STREAM_SET_SEEKPOINT, /**< arg1= int res=can fail */ + + /* XXX only data read through vlc_stream_Read/Block will be recorded */ + STREAM_SET_RECORD_STATE, /**< arg1=bool, arg2=const char *psz_ext (if arg1 is true) res=can fail */ + + STREAM_SET_PRIVATE_ID_STATE = 0x1000, /* arg1= int i_private_data, bool b_selected res=can fail */ + STREAM_SET_PRIVATE_ID_CA, /* arg1= int i_program_number, uint16_t i_vpid, uint16_t i_apid1, uint16_t i_apid2, uint16_t i_apid3, uint8_t i_length, uint8_t *p_data */ + STREAM_GET_PRIVATE_ID_STATE, /* arg1=int i_private_data arg2=bool * res=can fail */ +}; + +/** + * Reads data from a byte stream. + * + * This function always waits for the requested number of bytes, unless a fatal + * error is encountered or the end-of-stream is reached first. + * + * If the buffer is NULL, data is skipped instead of read. This is effectively + * a relative forward seek, but it works even on non-seekable streams. + * + * \param buf start of buffer to read data into [OUT] + * \param len number of bytes to read + * \return the number of bytes read or a negative value on error. + */ +VLC_API ssize_t vlc_stream_Read(stream_t *, void *buf, size_t len) VLC_USED; + +/** + * Reads partial data from a byte stream. + * + * This function waits until some data is available for reading from the + * stream, a fatal error is encountered or the end-of-stream is reached. + * + * Unlike vlc_stream_Read(), this function does not wait for the full requested + * bytes count. It can return a short count even before the end of the stream + * and in the absence of any error. + * + * \param buf start of buffer to read data into [OUT] + * \param len buffer size (maximum number of bytes to read) + * \return the number of bytes read or a negative value on error. + */ +VLC_API ssize_t vlc_stream_ReadPartial(stream_t *, void *buf, size_t len) +VLC_USED; + +/** + * Peeks at data from a byte stream. + * + * This function buffers for the requested number of bytes, waiting if + * necessary. Then it stores a pointer to the buffer. Unlike vlc_stream_Read() + * or vlc_stream_Block(), this function does not modify the stream read offset. + * + * \note + * The buffer remains valid until the next read/peek or seek operation on the + * same stream. In case of error, the buffer address is undefined. + * + * \param bufp storage space for the buffer address [OUT] + * \param len number of bytes to peek + * \return the number of bytes actually available (shorter than requested if + * the end-of-stream is reached), or a negative value on error. + */ +VLC_API ssize_t vlc_stream_Peek(stream_t *, const uint8_t **, size_t) VLC_USED; + +/** + * Reads a data block from a byte stream. + * + * This function dequeues the next block of data from the byte stream. The + * byte stream back-end decides on the size of the block; the caller cannot + * make any assumption about it. + * + * The function might also return NULL spuriously - this does not necessarily + * imply that the stream is ended nor that it has encountered a nonrecoverable + * error. + * + * This function should be used instead of vlc_stream_Read() or + * vlc_stream_Peek() when the caller can handle reads of any size. + * + * \return either a data block or NULL + */ +VLC_API block_t *vlc_stream_ReadBlock(stream_t *) VLC_USED; + +/** + * Tells the current stream position. + * + * This function tells the current read offset (in bytes) from the start of + * the start of the stream. + * @note The read offset may be larger than the stream size, either because of + * a seek past the end, or because the stream shrank asynchronously. + * + * @return the byte offset from the beginning of the stream (cannot fail) + */ +VLC_API uint64_t vlc_stream_Tell(const stream_t *) VLC_USED; + +/** + * Checks for end of stream. + * + * Checks if the last attempt to reads data from the stream encountered the + * end of stream before the attempt could be fully satisfied. + * The value is initially false, and is reset to false by vlc_stream_Seek(). + * + * \note The function can return false even though the current stream position + * is equal to the stream size. It will return true after the following attempt + * to read more than zero bytes. + * + * \note It might be possible to read after the end of the stream. + * It implies the size of the stream increased asynchronously in the mean time. + * Streams of most types cannot trigger such a case, + * but regular local files notably can. + * + * \note In principles, the stream size should match the stream offset when + * the end-of-stream is reached. But that rule is not enforced; it is entirely + * dependent on the underlying implementation of the stream. + */ +VLC_API bool vlc_stream_Eof(const stream_t *) VLC_USED; + +/** + * Sets the current stream position. + * + * This function changes the read offset within a stream, if the stream + * supports seeking. In case of error, the read offset is not changed. + * + * @note It is possible (but not useful) to seek past the end of a stream. + * + * @param offset byte offset from the beginning of the stream + * @return zero on success, a negative value on error + */ +VLC_API int vlc_stream_Seek(stream_t *, uint64_t offset) VLC_USED; + +VLC_API int vlc_stream_vaControl(stream_t *s, int query, va_list args); + +static inline int vlc_stream_Control(stream_t *s, int query, ...) +{ + va_list ap; + int ret; + + va_start(ap, query); + ret = vlc_stream_vaControl(s, query, ap); + va_end(ap); + return ret; +} + +VLC_API block_t *vlc_stream_Block(stream_t *s, size_t); +VLC_API char *vlc_stream_ReadLine(stream_t *); +VLC_API int vlc_stream_ReadDir(stream_t *, input_item_node_t *); + +/** + * Closes a byte stream. + * \param s byte stream to close + */ +VLC_API void vlc_stream_Delete(stream_t *s); + +VLC_API stream_t *vlc_stream_CommonNew(vlc_object_t *, void (*)(stream_t *)); + +/** + * Get the size of the stream. + */ +VLC_USED static inline int vlc_stream_GetSize( stream_t *s, uint64_t *size ) +{ + return vlc_stream_Control( s, STREAM_GET_SIZE, size ); +} + +static inline int64_t stream_Size( stream_t *s ) +{ + uint64_t i_pos; + + if( vlc_stream_GetSize( s, &i_pos ) ) + return 0; + if( i_pos >> 62 ) + return (int64_t)1 << 62; + return i_pos; +} + +VLC_USED +static inline bool stream_HasExtension( stream_t *s, const char *extension ) +{ + const char *name = (s->psz_filepath != NULL) ? s->psz_filepath + : s->psz_url; + const char *ext = strrchr( name, '.' ); + return ext != NULL && !strcasecmp( ext, extension ); +} + +/** + * Get the Content-Type of a stream, or NULL if unknown. + * Result must be free()'d. + */ +static inline char *stream_ContentType( stream_t *s ) +{ + char *res; + if( vlc_stream_Control( s, STREAM_GET_CONTENT_TYPE, &res ) ) + return NULL; + return res; +} + +/** + * Get the mime-type of a stream + * + * \warning the returned resource is to be freed by the caller + * \return the mime-type, or `NULL` if unknown + **/ +VLC_USED +static inline char *stream_MimeType( stream_t *s ) +{ + char* mime_type = stream_ContentType( s ); + + if( mime_type ) /* strip parameters */ + mime_type[strcspn( mime_type, " ;" )] = '\0'; + + return mime_type; +} + +/** + * Checks for a MIME type. + * + * Checks if the stream has a specific MIME type. + */ +VLC_USED +static inline bool stream_IsMimeType(stream_t *s, const char *type) +{ + char *mime = stream_MimeType(s); + if (mime == NULL) + return false; + + bool ok = !strcasecmp(mime, type); + free(mime); + return ok; +} + +/** + * Create a stream from a memory buffer. + * + * \param obj parent VLC object + * \param base start address of the memory buffer to read from + * \param size size in bytes of the memory buffer + * \param preserve if false, free(base) will be called when the stream is + * destroyed; if true, the memory buffer is preserved + */ +VLC_API stream_t *vlc_stream_MemoryNew(vlc_object_t *obj, uint8_t *base, + size_t size, bool preserve) VLC_USED; +#define vlc_stream_MemoryNew(a, b, c, d) \ + vlc_stream_MemoryNew(VLC_OBJECT(a), b, c, d) + +/** + * Create a stream_t reading from a URL. + * You must delete it using vlc_stream_Delete. + */ +VLC_API stream_t * vlc_stream_NewURL(vlc_object_t *obj, const char *url) +VLC_USED; +#define vlc_stream_NewURL(a, b) vlc_stream_NewURL(VLC_OBJECT(a), b) + +/** + * \defgroup stream_fifo FIFO stream + * In-memory anonymous pipe + @{ + */ + +/** + * Creates a FIFO stream. + * + * Creates a non-seekable byte stream object whose byte stream is generated + * by another thread in the process. This is the LibVLC equivalent of an + * anonymous pipe/FIFO. + * + * On the reader side, the normal stream functions are used, + * e.g. vlc_stream_Read() and vlc_stream_Delete(). + * + * The created stream object is automatically destroyed when both the reader + * and the writer sides have been closed, with vlc_stream_Delete() and + * vlc_stream_fifo_Close() respectively. + * + * \param parent parent VLC object for the stream + * \return a stream object or NULL on memory error. + */ +VLC_API stream_t *vlc_stream_fifo_New(vlc_object_t *parent); + +/** + * Writes a block to a FIFO stream. + * + * \param s FIFO stream created by vlc_stream_fifo_New() + * \param block data block to write to the stream + * \return 0 on success. -1 if the reader end has already been closed + * (errno is then set to EPIPE, and the block is deleted). + * + * \bug No congestion control is performed. If the reader end is not keeping + * up with the writer end, buffers will accumulate in memory. + */ +VLC_API int vlc_stream_fifo_Queue(stream_t *s, block_t *block); + +/** + * Writes data to a FIFO stream. + * + * This is a convenience helper for vlc_stream_fifo_Queue(). + * \param s FIFO stream created by vlc_stream_fifo_New() + * \param buf start address of data to write + * \param len length of data to write in bytes + * \return len on success, or -1 on error (errno is set accordingly) + */ +VLC_API ssize_t vlc_stream_fifo_Write(stream_t *s, const void *buf, + size_t len); + +/** + * Terminates a FIFO stream. + * + * Marks the end of the FIFO stream and releases any underlying resources. + * \param s FIFO stream created by vlc_stream_fifo_New() + */ +VLC_API void vlc_stream_fifo_Close(stream_t *s); + +/** + * @} + */ + +/** + * Try to add a stream filter to an open stream. + * @return New stream to use, or NULL if the filter could not be added. + **/ +VLC_API stream_t* vlc_stream_FilterNew( stream_t *p_source, const char *psz_stream_filter ); + +/** + * Default ReadDir implementation for stream Filter. This implementation just + * forward the pf_readdir call to the p_source stream. + */ +VLC_API int vlc_stream_FilterDefaultReadDir(stream_t *s, + input_item_node_t *p_node); + +/** + * Sets vlc_stream_FilterDefaultReadDir as the pf_readdir callback for this + * stream filter. + */ +#define stream_FilterSetDefaultReadDir(stream) \ +do { \ + (stream)->pf_readdir = vlc_stream_FilterDefaultReadDir; \ +} while (0) + +/** + * @} + */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_stream_extractor.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_stream_extractor.h new file mode 100644 index 0000000..78c51c0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_stream_extractor.h @@ -0,0 +1,170 @@ +/***************************************************************************** + * vlc_stream_extractor.h + ***************************************************************************** + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STREAM_EXTRACTOR_H +#define VLC_STREAM_EXTRACTOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup stream_extractor Stream Extractor + * \ingroup input + * + * If a stream can be viewed as a directory, such as when opening a + * compressed archive, a \em stream-extractor is used to get access to + * the entities inside said stream. + * + * A \em stream-extractor can do one of two things; + * + * - lists the logical entries within a stream: + * - type = \ref stream_directory_t + * - capability = "stream_directory" + * + * - extract data associated with one specific entry within a stream: + * - type = \ref stream_extractor_t + * - capability = "stream_extractor" + * + * @{ + * + **/ + +typedef struct stream_extractor_t { + VLC_COMMON_MEMBERS + + /** + * \name Callbacks for entity extraction + * + * The following members shall be populated as specified by the + * documentation associated with \ref stream_t for the equivalent name. + * + * @{ + **/ + ssize_t (*pf_read)(struct stream_extractor_t*, void* buf, size_t len); + block_t* (*pf_block)(struct stream_extractor_t*, bool* eof); + int (*pf_seek)(struct stream_extractor_t*, uint64_t); + int (*pf_control)(struct stream_extractor_t*, int request, va_list args); + /** @} */ + + char const* identifier; /**< the name of the entity to be extracted */ + stream_t* source; /**< the source stream to be consumed */ + void* p_sys; /**< private opaque handle to be used by the module */ + +} stream_extractor_t; + +typedef struct stream_directory_t { + VLC_COMMON_MEMBERS + + /** + * \name Callbacks for stream directories + * + * The following members shall be populated as specified by the + * documentation associated with \ref stream_t for the equivalent name. + * + * @{ + **/ + int (*pf_readdir)(struct stream_directory_t*, input_item_node_t* ); + /** @} */ + + stream_t* source; /**< the source stream to be consumed */ + void* p_sys; /**< private opaque handle to be used by the module */ + +} stream_directory_t; + +/** + * Create a stream for the data referred to by a \ref mrl + * + * This function will create a \ref stream that reads from the specified \ref + * mrl, potentially making use of \ref stream_extractor%s to access named + * entities within the data read from the original source. + * + * - See the \ref mrl specification for further information. + * - The returned resource shall be deleted through \ref vlc_stream_Delete. + * + * \warning This function is only to be used when \ref mrl functionality is + * explicitly needed. \ref vlc_stream_NewURL shall be used where + * applicable. + * + * \param obj the owner of the requested stream + * \param mrl the mrl for which the stream_t should be created + * \return `NULL` on error, a pointer to \ref stream_t on success. + **/ +VLC_API stream_t * vlc_stream_NewMRL(vlc_object_t *obj, const char *mrl) +VLC_USED; +#define vlc_stream_NewMRL(a, b) vlc_stream_NewMRL(VLC_OBJECT(a), b) + +/** + * Create a relative MRL for the associated entity + * + * This function shall be used by stream_directory_t's in order to + * generate an MRL that refers to an entity within the stream. Normally + * this function will only be invoked within `pf_readdir` in order to + * get the virtual path of the listed items. + * + * \warning the returned value is to be freed by the caller + * + * \param extractor the stream_directory_t for which the entity belongs + * \param subentry the name of the entity in question + * + * \return a pointer to the resulting MRL on success, NULL on failure + **/ +VLC_API char* vlc_stream_extractor_CreateMRL( stream_directory_t*, + char const* subentry ); + +/** + * \name Attach a stream-extractor to the passed stream + * + * These functions are used to attach a stream extractor to an already existing + * stream. As hinted by their names, \ref vlc_stream_extractor_Attach will + * attach an \em entity-extractor, whereas \ref vlc_stream_directory_Attach + * will attach a \em stream-directory. + * + * \param[out] stream a pointer-to-pointer to stream, `*stream` will + * refer to the attached stream on success, and left + * untouched on failure. + * \param identifier (if present) NULL or a c-style string referring to the + * desired entity + * \param module_name NULL or an explicit stream-extractor module name + * + * \return VLC_SUCCESS if a stream-extractor was successfully + * attached, an error-code on failure. + * + * @{ + **/ + +VLC_API int vlc_stream_extractor_Attach( stream_t** source, + char const* identifier, + char const* module_name ); + +VLC_API int vlc_stream_directory_Attach( stream_t** source, + char const* module_name ); +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif /* include-guard */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_strings.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_strings.h new file mode 100644 index 0000000..c222e24 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_strings.h @@ -0,0 +1,159 @@ +/***************************************************************************** + * vlc_strings.h: String functions + ***************************************************************************** + * Copyright (C) 2006 VLC authors and VideoLAN + * $Id: 9828fbd728ee791d409568405f280634132b91a6 $ + * + * Authors: Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STRINGS_H +#define VLC_STRINGS_H 1 + +/** + * \defgroup strings String helpers + * @{ + * \file + * Helper functions for nul-terminated strings + */ + +static inline int vlc_ascii_toupper( int c ) +{ + if ( c >= 'a' && c <= 'z' ) + return c + ( 'A' - 'a' ); + else + return c; +} + +static inline int vlc_ascii_tolower( int c ) +{ + if ( c >= 'A' && c <= 'Z' ) + return c + ( 'a' - 'A' ); + else + return c; +} + +/** + * Compare two ASCII strings ignoring case. + * + * The result is independent of the locale. If there are non-ASCII + * characters in the strings, their cases are NOT ignored in the + * comparison. + */ +static inline int vlc_ascii_strcasecmp( const char *psz1, const char *psz2 ) +{ + const char *s1 = psz1; + const char *s2 = psz2; + int d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + while ( *s1 && d == 0) + { + s1++; + s2++; + d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + } + + return d; +} + +static inline int vlc_ascii_strncasecmp( const char *psz1, const char *psz2, size_t n ) +{ + const char *s1 = psz1; + const char *s2 = psz2; + const char *s1end = psz1 + n; + int d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + while ( *s1 && s1 < s1end && d == 0) + { + s1++; + s2++; + d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + } + + if (s1 == s1end) + return 0; + else + return d; +} + +/** + * Decodes XML entities. + * + * Decodes a null-terminated UTF-8 string of XML character data into a regular + * nul-terminated UTF-8 string. In other words, replaces XML entities and + * numerical character references with the corresponding characters. + * + * This function operates in place (the output is always of smaller or equal + * length than the input) and always succeeds. + * + * \param str null-terminated string [IN/OUT] + */ +VLC_API void vlc_xml_decode(char *st); + +/** + * Encodes XML entites. + * + * Substitutes unsafe characters in a null-terminated UTF-8 strings with an + * XML entity or numerical character reference. + * + * \param str null terminated UTF-8 string + * \return On success, a heap-allocated null-terminated string is returned. + * If the input string was not a valid UTF-8 sequence, NULL is returned and + * errno is set to EILSEQ. + * If there was not enough memory, NULL is returned and errno is to ENOMEM. + */ +VLC_API char *vlc_xml_encode(const char *str) VLC_MALLOC; + +VLC_API char * vlc_b64_encode_binary( const uint8_t *, size_t ); +VLC_API char * vlc_b64_encode( const char * ); + +VLC_API size_t vlc_b64_decode_binary_to_buffer( uint8_t *p_dst, size_t i_dst_max, const char *psz_src ); +VLC_API size_t vlc_b64_decode_binary( uint8_t **pp_dst, const char *psz_src ); +VLC_API char * vlc_b64_decode( const char *psz_src ); + +/** + * Convenience wrapper for strftime(). + * + * Formats the current time into a heap-allocated string. + * + * @param tformat time format (as with C strftime()) + * @return an allocated string (must be free()'d), or NULL on memory error. + */ +VLC_API char *vlc_strftime( const char * ); + +/** + * Formats input meta-data. + * + * Formats input and input item meta-informations into a heap-allocated string. + */ +VLC_API char *vlc_strfinput( input_thread_t *, const char * ); + +static inline char *str_format( input_thread_t *input, const char *fmt ) +{ + char *s1 = vlc_strftime( fmt ); + char *s2 = vlc_strfinput( input, s1 ); + free( s1 ); + return s2; +} + +VLC_API int vlc_filenamecmp(const char *, const char *); + +void filename_sanitize(char *); + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_subpicture.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_subpicture.h new file mode 100644 index 0000000..67157c0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_subpicture.h @@ -0,0 +1,237 @@ +/***************************************************************************** + * vlc_subpicture.h: subpicture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: b9de52c0493687f2f9920753562e2f1eebfd1b7b $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SUBPICTURE_H +#define VLC_SUBPICTURE_H 1 + +/** + */ + +#include +#include + +/** + * \defgroup subpicture Video sub-pictures + * \ingroup video_output + * Subpictures are pictures that should be displayed on top of the video, like + * subtitles and OSD + * @{ + * \file + * Subpictures functions + */ + +/** + * Video subtitle region spu core private + */ +typedef struct subpicture_region_private_t subpicture_region_private_t; + +/** + * Video subtitle region + * + * A subtitle region is defined by a picture (graphic) and its rendering + * coordinates. + * Subtitles contain a list of regions. + */ +struct subpicture_region_t +{ + video_format_t fmt; /**< format of the picture */ + picture_t *p_picture; /**< picture comprising this region */ + + int i_x; /**< position of region, relative to alignment */ + int i_y; /**< position of region, relative to alignment */ + int i_align; /**< alignment flags of region */ + int i_alpha; /**< transparency */ + + /* Parameters for text regions (p_picture to be rendered) */ + text_segment_t *p_text; /**< subtitle text, made of a list of segments */ + int i_text_align; /**< alignment flags of region content */ + bool b_noregionbg; /**< render background under text only */ + bool b_gridmode; /** if the decoder sends row/cols based output */ + bool b_balanced_text; /** try to balance wrapped text lines */ + int i_max_width; /** horizontal rendering/cropping target/limit */ + int i_max_height; /** vertical rendering/cropping target/limit */ + + subpicture_region_t *p_next; /**< next region in the list */ + subpicture_region_private_t *p_private; /**< Private data for spu_t *only* */ +}; + +/* Subpicture region position flags */ +#define SUBPICTURE_ALIGN_LEFT 0x1 +#define SUBPICTURE_ALIGN_RIGHT 0x2 +#define SUBPICTURE_ALIGN_TOP 0x4 +#define SUBPICTURE_ALIGN_BOTTOM 0x8 +#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \ + SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM ) +/** + * This function will create a new subpicture region. + * + * You must use subpicture_region_Delete to destroy it. + */ +VLC_API subpicture_region_t * subpicture_region_New( const video_format_t *p_fmt ); + +/** + * This function will destroy a subpicture region allocated by + * subpicture_region_New. + * + * You may give it NULL. + */ +VLC_API void subpicture_region_Delete( subpicture_region_t *p_region ); + +/** + * This function will destroy a list of subpicture regions allocated by + * subpicture_region_New. + * + * Provided for convenience. + */ +VLC_API void subpicture_region_ChainDelete( subpicture_region_t *p_head ); + +/** + * This function will copy a subpicture region to a new allocated one + * and transfer all the properties + * + * Provided for convenience. + */ +VLC_API subpicture_region_t *subpicture_region_Copy( subpicture_region_t *p_region ); + +/** + * + */ +typedef struct subpicture_updater_sys_t subpicture_updater_sys_t; +typedef struct +{ + /** Optional pre update callback, usually useful on video format change. + * Will skip pf_update on VLC_SUCCESS, or will delete every region before + * the call to pf_update */ + int (*pf_validate)( subpicture_t *, + bool has_src_changed, const video_format_t *p_fmt_src, + bool has_dst_changed, const video_format_t *p_fmt_dst, + mtime_t); + /** Mandatory callback called after pf_validate and doing + * the main job of creating the subpicture regions for the + * current video_format */ + void (*pf_update) ( subpicture_t *, + const video_format_t *p_fmt_src, + const video_format_t *p_fmt_dst, + mtime_t ); + /** Optional callback for subpicture private data cleanup */ + void (*pf_destroy) ( subpicture_t * ); + subpicture_updater_sys_t *p_sys; +} subpicture_updater_t; + +typedef struct subpicture_private_t subpicture_private_t; + +/** + * Video subtitle + * + * Any subtitle destined to be displayed by a video output thread should + * be stored in this structure from it's creation to it's effective display. + * Subtitle type and flags should only be modified by the output thread. Note + * that an empty subtitle MUST have its flags set to 0. + */ +struct subpicture_t +{ + /** \name Channel ID */ + /**@{*/ + int i_channel; /**< subpicture channel ID */ + /**@}*/ + + /** \name Type and flags + Should NOT be modified except by the vout thread */ + /**@{*/ + int64_t i_order; /** an increasing unique number */ + subpicture_t * p_next; /**< next subtitle to be displayed */ + /**@}*/ + + subpicture_region_t *p_region; /**< region list composing this subtitle */ + + /** \name Date properties */ + /**@{*/ + mtime_t i_start; /**< beginning of display date */ + mtime_t i_stop; /**< end of display date */ + bool b_ephemer; /**< If this flag is set to true the subtitle + will be displayed until the next one appear */ + bool b_fade; /**< enable fading */ + /**@}*/ + + /** \name Display properties + * These properties are only indicative and may be + * changed by the video output thread, or simply ignored depending of the + * subtitle type. */ + /**@{*/ + bool b_subtitle; /**< the picture is a movie subtitle */ + bool b_absolute; /**< position is absolute */ + int i_original_picture_width; /**< original width of the movie */ + int i_original_picture_height;/**< original height of the movie */ + int i_alpha; /**< transparency */ + /**@}*/ + + subpicture_updater_t updater; + + subpicture_private_t *p_private; /* Reserved to the core */ +}; + +/** + * This function create a new empty subpicture. + * + * You must use subpicture_Delete to destroy it. + */ +VLC_API subpicture_t * subpicture_New( const subpicture_updater_t * ); + +/** + * This function delete a subpicture created by subpicture_New. + * You may give it NULL. + */ +VLC_API void subpicture_Delete( subpicture_t *p_subpic ); + +/** + * This function will create a subpicture having one region in the requested + * chroma showing the given picture. + * + * The picture_t given is not released nor used inside the + * returned subpicture_t. + */ +VLC_API subpicture_t * subpicture_NewFromPicture( vlc_object_t *, picture_t *, vlc_fourcc_t i_chroma ); + +/** + * This function will update the content of a subpicture created with + * a non NULL subpicture_updater_t. + */ +VLC_API void subpicture_Update( subpicture_t *, const video_format_t *src, const video_format_t *, mtime_t ); + +/** + * This function will blend a given subpicture onto a picture. + * + * The subpicture and all its region must: + * - be absolute. + * - not be ephemere. + * - not have the fade flag. + * - contains only picture (no text rendering). + * \return the number of region(s) successfully blent + */ +VLC_API unsigned picture_BlendSubpicture( picture_t *, filter_t *p_blend, subpicture_t * ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_text_style.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_text_style.h new file mode 100644 index 0000000..13850d0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_text_style.h @@ -0,0 +1,404 @@ +/***************************************************************************** + * vlc_text_style.h: text_style_t definition and helpers. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * $Id: c24d76adcfedf63514255bb31483acb9325df1b1 $ + * + * Authors: Derk-Jan Hartman + * basOS G + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TEXT_STYLE_H +#define VLC_TEXT_STYLE_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Text style + * + * A text style is used to specify the formatting of text. + * A font renderer can use the supplied information to render the + * text specified. + */ +typedef struct +{ + /* Family font names */ + char * psz_fontname; /**< The name of the font */ + char * psz_monofontname; /**< The name of the mono font */ + + uint16_t i_features; /**< Feature flags (means non default) */ + uint16_t i_style_flags; /**< Formatting style flags */ + + /* Font style */ + float f_font_relsize; /**< The font size in video height % */ + int i_font_size; /**< The font size in pixels */ + int i_font_color; /**< The color of the text 0xRRGGBB + (native endianness) */ + uint8_t i_font_alpha; /**< The transparency of the text.*/ + int i_spacing; /**< The spaceing between glyphs in pixels */ + + /* Outline */ + int i_outline_color; /**< The color of the outline 0xRRGGBB */ + uint8_t i_outline_alpha; /**< The transparency of the outline */ + int i_outline_width; /**< The width of the outline in pixels */ + + /* Shadow */ + int i_shadow_color; /**< The color of the shadow 0xRRGGBB */ + uint8_t i_shadow_alpha; /**< The transparency of the shadow. */ + int i_shadow_width; /**< The width of the shadow in pixels */ + + /* Background (and karaoke) */ + int i_background_color;/**< The color of the background 0xRRGGBB */ + uint8_t i_background_alpha;/**< The transparency of the background */ + int i_karaoke_background_color;/**< Background color for karaoke 0xRRGGBB */ + uint8_t i_karaoke_background_alpha;/**< The transparency of the karaoke bg */ + + /* Line breaking */ + enum + { + STYLE_WRAP_DEFAULT = 0, /**< Breaks on whitespace or fallback on char */ + STYLE_WRAP_CHAR, /**< Breaks at character level only */ + STYLE_WRAP_NONE, /**< No line breaks (except explicit ones) */ + } e_wrapinfo; +} text_style_t; + +#define STYLE_ALPHA_OPAQUE 0xFF +#define STYLE_ALPHA_TRANSPARENT 0x00 + +/* Features flags for \ref i_features */ +#define STYLE_NO_DEFAULTS 0x0 +#define STYLE_FULLY_SET 0xFFFF +#define STYLE_HAS_FONT_COLOR (1 << 0) +#define STYLE_HAS_FONT_ALPHA (1 << 1) +#define STYLE_HAS_FLAGS (1 << 2) +#define STYLE_HAS_OUTLINE_COLOR (1 << 3) +#define STYLE_HAS_OUTLINE_ALPHA (1 << 4) +#define STYLE_HAS_SHADOW_COLOR (1 << 5) +#define STYLE_HAS_SHADOW_ALPHA (1 << 6) +#define STYLE_HAS_BACKGROUND_COLOR (1 << 7) +#define STYLE_HAS_BACKGROUND_ALPHA (1 << 8) +#define STYLE_HAS_K_BACKGROUND_COLOR (1 << 9) +#define STYLE_HAS_K_BACKGROUND_ALPHA (1 << 10) +#define STYLE_HAS_WRAP_INFO (1 << 11) + +/* Style flags for \ref text_style_t */ +#define STYLE_BOLD (1 << 0) +#define STYLE_ITALIC (1 << 1) +#define STYLE_OUTLINE (1 << 2) +#define STYLE_SHADOW (1 << 3) +#define STYLE_BACKGROUND (1 << 4) +#define STYLE_UNDERLINE (1 << 5) +#define STYLE_STRIKEOUT (1 << 6) +#define STYLE_HALFWIDTH (1 << 7) +#define STYLE_MONOSPACED (1 << 8) +#define STYLE_DOUBLEWIDTH (1 << 9) +#define STYLE_BLINK_FOREGROUND (1 << 10) +#define STYLE_BLINK_BACKGROUND (1 << 11) + +#define STYLE_DEFAULT_FONT_SIZE 20 +#define STYLE_DEFAULT_REL_FONT_SIZE 6.25 + + +typedef struct text_segment_t text_segment_t; +/** + * Text segment for subtitles + * + * This structure is used to store a formatted text, with mixed styles + * Every segment is comprised of one text and a unique style + * + * On style change, a new segment is created with the next part of text + * and the new style, and chained to the list + * + * Create with text_segment_New and clean the chain with + * text_segment_ChainDelete + */ +struct text_segment_t { + char *psz_text; /**< text string of the segment */ + text_style_t *style; /**< style applied to this segment */ + text_segment_t *p_next; /**< next segment */ +}; + +/** + * Create a default text style + */ +VLC_API text_style_t * text_style_New( void ); + +/** + * Create a text style + * + * Set feature flags as argument if you want to set style defaults + */ +VLC_API text_style_t * text_style_Create( int ); + +/** + * Copy a text style into another + */ +VLC_API text_style_t * text_style_Copy( text_style_t *, const text_style_t * ); + +/** + * Duplicate a text style + */ +VLC_API text_style_t * text_style_Duplicate( const text_style_t * ); + +/** + * Merge two styles using non default values + * + * Set b_override to true if you also want to overwrite non-defaults + */ +VLC_API void text_style_Merge( text_style_t *, const text_style_t *, bool b_override ); + +/** + * Delete a text style created by text_style_New or text_style_Duplicate + */ +VLC_API void text_style_Delete( text_style_t * ); + +/** + * This function will create a new text segment. + * + * You should use text_segment_ChainDelete to destroy it, to clean all + * the linked segments, or text_segment_Delete to free a specic one + * + * This duplicates the string passed as argument + */ +VLC_API text_segment_t *text_segment_New( const char * ); + +/** + * This function will create a new text segment and duplicates the style passed as argument + * + * You should use text_segment_ChainDelete to destroy it, to clean all + * the linked segments, or text_segment_Delete to free a specic one + * + * This doesn't initialize the text. + */ +VLC_API text_segment_t *text_segment_NewInheritStyle( const text_style_t* p_style ); + +/** + * Delete a text segment and its content. + * + * This assumes the segment is not part of a chain + */ +VLC_API void text_segment_Delete( text_segment_t * ); + +/** + * This function will destroy a list of text segments allocated + * by text_segment_New. + * + * You may pass it NULL. + */ +VLC_API void text_segment_ChainDelete( text_segment_t * ); + +/** + * This function will copy a text_segment and its chain into a new one + * + * You may give it NULL, but it will return NULL. + */ +VLC_API text_segment_t * text_segment_Copy( text_segment_t * ); + +static const struct { + const char *psz_name; + uint32_t i_value; +} p_html_colors[] = { + /* Official html colors */ + { "Aqua", 0x00FFFF }, + { "Black", 0x000000 }, + { "Blue", 0x0000FF }, + { "Fuchsia", 0xFF00FF }, + { "Gray", 0x808080 }, + { "Green", 0x008000 }, + { "Lime", 0x00FF00 }, + { "Maroon", 0x800000 }, + { "Navy", 0x000080 }, + { "Olive", 0x808000 }, + { "Purple", 0x800080 }, + { "Red", 0xFF0000 }, + { "Silver", 0xC0C0C0 }, + { "Teal", 0x008080 }, + { "White", 0xFFFFFF }, + { "Yellow", 0xFFFF00 }, + + /* Common ones */ + { "AliceBlue", 0xF0F8FF }, + { "AntiqueWhite", 0xFAEBD7 }, + { "Aqua", 0x00FFFF }, + { "Aquamarine", 0x7FFFD4 }, + { "Azure", 0xF0FFFF }, + { "Beige", 0xF5F5DC }, + { "Bisque", 0xFFE4C4 }, + { "Black", 0x000000 }, + { "BlanchedAlmond", 0xFFEBCD }, + { "Blue", 0x0000FF }, + { "BlueViolet", 0x8A2BE2 }, + { "Brown", 0xA52A2A }, + { "BurlyWood", 0xDEB887 }, + { "CadetBlue", 0x5F9EA0 }, + { "Chartreuse", 0x7FFF00 }, + { "Chocolate", 0xD2691E }, + { "Coral", 0xFF7F50 }, + { "CornflowerBlue", 0x6495ED }, + { "Cornsilk", 0xFFF8DC }, + { "Crimson", 0xDC143C }, + { "Cyan", 0x00FFFF }, + { "DarkBlue", 0x00008B }, + { "DarkCyan", 0x008B8B }, + { "DarkGoldenRod", 0xB8860B }, + { "DarkGray", 0xA9A9A9 }, + { "DarkGrey", 0xA9A9A9 }, + { "DarkGreen", 0x006400 }, + { "DarkKhaki", 0xBDB76B }, + { "DarkMagenta", 0x8B008B }, + { "DarkOliveGreen", 0x556B2F }, + { "Darkorange", 0xFF8C00 }, + { "DarkOrchid", 0x9932CC }, + { "DarkRed", 0x8B0000 }, + { "DarkSalmon", 0xE9967A }, + { "DarkSeaGreen", 0x8FBC8F }, + { "DarkSlateBlue", 0x483D8B }, + { "DarkSlateGray", 0x2F4F4F }, + { "DarkSlateGrey", 0x2F4F4F }, + { "DarkTurquoise", 0x00CED1 }, + { "DarkViolet", 0x9400D3 }, + { "DeepPink", 0xFF1493 }, + { "DeepSkyBlue", 0x00BFFF }, + { "DimGray", 0x696969 }, + { "DimGrey", 0x696969 }, + { "DodgerBlue", 0x1E90FF }, + { "FireBrick", 0xB22222 }, + { "FloralWhite", 0xFFFAF0 }, + { "ForestGreen", 0x228B22 }, + { "Fuchsia", 0xFF00FF }, + { "Gainsboro", 0xDCDCDC }, + { "GhostWhite", 0xF8F8FF }, + { "Gold", 0xFFD700 }, + { "GoldenRod", 0xDAA520 }, + { "Gray", 0x808080 }, + { "Grey", 0x808080 }, + { "Green", 0x008000 }, + { "GreenYellow", 0xADFF2F }, + { "HoneyDew", 0xF0FFF0 }, + { "HotPink", 0xFF69B4 }, + { "IndianRed", 0xCD5C5C }, + { "Indigo", 0x4B0082 }, + { "Ivory", 0xFFFFF0 }, + { "Khaki", 0xF0E68C }, + { "Lavender", 0xE6E6FA }, + { "LavenderBlush", 0xFFF0F5 }, + { "LawnGreen", 0x7CFC00 }, + { "LemonChiffon", 0xFFFACD }, + { "LightBlue", 0xADD8E6 }, + { "LightCoral", 0xF08080 }, + { "LightCyan", 0xE0FFFF }, + { "LightGoldenRodYellow", 0xFAFAD2 }, + { "LightGray", 0xD3D3D3 }, + { "LightGrey", 0xD3D3D3 }, + { "LightGreen", 0x90EE90 }, + { "LightPink", 0xFFB6C1 }, + { "LightSalmon", 0xFFA07A }, + { "LightSeaGreen", 0x20B2AA }, + { "LightSkyBlue", 0x87CEFA }, + { "LightSlateGray", 0x778899 }, + { "LightSlateGrey", 0x778899 }, + { "LightSteelBlue", 0xB0C4DE }, + { "LightYellow", 0xFFFFE0 }, + { "Lime", 0x00FF00 }, + { "LimeGreen", 0x32CD32 }, + { "Linen", 0xFAF0E6 }, + { "Magenta", 0xFF00FF }, + { "Maroon", 0x800000 }, + { "MediumAquaMarine", 0x66CDAA }, + { "MediumBlue", 0x0000CD }, + { "MediumOrchid", 0xBA55D3 }, + { "MediumPurple", 0x9370D8 }, + { "MediumSeaGreen", 0x3CB371 }, + { "MediumSlateBlue", 0x7B68EE }, + { "MediumSpringGreen", 0x00FA9A }, + { "MediumTurquoise", 0x48D1CC }, + { "MediumVioletRed", 0xC71585 }, + { "MidnightBlue", 0x191970 }, + { "MintCream", 0xF5FFFA }, + { "MistyRose", 0xFFE4E1 }, + { "Moccasin", 0xFFE4B5 }, + { "NavajoWhite", 0xFFDEAD }, + { "Navy", 0x000080 }, + { "OldLace", 0xFDF5E6 }, + { "Olive", 0x808000 }, + { "OliveDrab", 0x6B8E23 }, + { "Orange", 0xFFA500 }, + { "OrangeRed", 0xFF4500 }, + { "Orchid", 0xDA70D6 }, + { "PaleGoldenRod", 0xEEE8AA }, + { "PaleGreen", 0x98FB98 }, + { "PaleTurquoise", 0xAFEEEE }, + { "PaleVioletRed", 0xD87093 }, + { "PapayaWhip", 0xFFEFD5 }, + { "PeachPuff", 0xFFDAB9 }, + { "Peru", 0xCD853F }, + { "Pink", 0xFFC0CB }, + { "Plum", 0xDDA0DD }, + { "PowderBlue", 0xB0E0E6 }, + { "Purple", 0x800080 }, + { "RebeccaPurple", 0x663399 }, + { "Red", 0xFF0000 }, + { "RosyBrown", 0xBC8F8F }, + { "RoyalBlue", 0x4169E1 }, + { "SaddleBrown", 0x8B4513 }, + { "Salmon", 0xFA8072 }, + { "SandyBrown", 0xF4A460 }, + { "SeaGreen", 0x2E8B57 }, + { "SeaShell", 0xFFF5EE }, + { "Sienna", 0xA0522D }, + { "Silver", 0xC0C0C0 }, + { "SkyBlue", 0x87CEEB }, + { "SlateBlue", 0x6A5ACD }, + { "SlateGray", 0x708090 }, + { "SlateGrey", 0x708090 }, + { "Snow", 0xFFFAFA }, + { "SpringGreen", 0x00FF7F }, + { "SteelBlue", 0x4682B4 }, + { "Tan", 0xD2B48C }, + { "Teal", 0x008080 }, + { "Thistle", 0xD8BFD8 }, + { "Tomato", 0xFF6347 }, + { "Turquoise", 0x40E0D0 }, + { "Violet", 0xEE82EE }, + { "Wheat", 0xF5DEB3 }, + { "White", 0xFFFFFF }, + { "WhiteSmoke", 0xF5F5F5 }, + { "Yellow", 0xFFFF00 }, + { "YellowGreen", 0x9ACD32 }, + + { NULL, 0 } +}; + +/** + * Returns an integer representation of an HTML color. + * + * @param psz_value An HTML color, which can be either: + * - A standard HTML color (red, cyan, ...) as defined in p_html_colors + * - An hexadecimal color, of the form [#][AA]RRGGBB + * @param ok If non-null, true will be stored in this pointer to signal + * a successful conversion + */ +VLC_API unsigned int vlc_html_color( const char *psz_value, bool* ok ); + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_TEXT_STYLE_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_threads.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_threads.h new file mode 100644 index 0000000..224bf2f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_threads.h @@ -0,0 +1,1068 @@ +/***************************************************************************** + * vlc_threads.h : threads implementation for the VideoLAN client + * This header provides portable declarations for mutexes & conditions + ***************************************************************************** + * Copyright (C) 1999, 2002 VLC authors and VideoLAN + * Copyright © 2007-2016 Rémi Denis-Courmont + * + * Authors: Jean-Marc Dressler + * Samuel Hocevar + * Gildas Bazin + * Christophe Massiot + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_THREADS_H_ +#define VLC_THREADS_H_ + +/** + * \ingroup os + * \defgroup thread Threads and synchronization primitives + * @{ + * \file + * Thread primitive declarations + */ + +/** + * Issues an explicit deferred cancellation point. + * + * This has no effects if thread cancellation is disabled. + * This can be called when there is a rather slow non-sleeping operation. + * This is also used to force a cancellation point in a function that would + * otherwise not always be one (block_FifoGet() is an example). + */ +VLC_API void vlc_testcancel(void); + +#if defined (_WIN32) +# include +# ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +# endif + +typedef struct vlc_thread *vlc_thread_t; +# define VLC_THREAD_CANCELED NULL +# define LIBVLC_NEED_SLEEP +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + CRITICAL_SECTION mutex; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +#define LIBVLC_NEED_CONDVAR +#define LIBVLC_NEED_SEMAPHORE +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_AUDIO THREAD_PRIORITY_HIGHEST +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL + +#elif defined (__OS2__) +# include + +typedef struct vlc_thread *vlc_thread_t; +#define VLC_THREAD_CANCELED NULL +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + HMTX hmtx; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +typedef struct +{ + HEV hev; + unsigned waiters; + HEV hevAck; + unsigned signaled; +} vlc_cond_t; +#define VLC_STATIC_COND { NULLHANDLE, 0, NULLHANDLE, 0 } +#define LIBVLC_NEED_SEMAPHORE +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_AUDIO MAKESHORT(PRTYD_MAXIMUM, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_HIGHEST MAKESHORT(0, PRTYC_TIMECRITICAL) + +# define pthread_sigmask sigprocmask + +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + static int (*vlc_poll_os2)(struct pollfd *, unsigned, int) = NULL; + + if (!vlc_poll_os2) + { + HMODULE hmod; + CHAR szFailed[CCHMAXPATH]; + + if (DosLoadModule(szFailed, sizeof(szFailed), "vlccore", &hmod)) + return -1; + + if (DosQueryProcAddr(hmod, 0, "_vlc_poll_os2", (PFN *)&vlc_poll_os2)) + return -1; + } + + return (*vlc_poll_os2)(fds, nfds, timeout); +} +# define poll(u,n,t) vlc_poll(u, n, t) + +#elif defined (__ANDROID__) /* pthreads subset without pthread_cancel() */ +# include +# include +# include +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_NEED_SLEEP +# define LIBVLC_NEED_CONDVAR +# define LIBVLC_NEED_SEMAPHORE +# define LIBVLC_NEED_RWLOCK + +typedef struct vlc_thread *vlc_thread_t; +#define VLC_THREAD_CANCELED NULL +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER + +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 0 +# define VLC_THREAD_PRIORITY_AUDIO 0 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 0 +# define VLC_THREAD_PRIORITY_HIGHEST 0 + +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + int val; + + do + { + int ugly_timeout = ((unsigned)timeout >= 50) ? 50 : timeout; + if (timeout >= 0) + timeout -= ugly_timeout; + + vlc_testcancel (); + val = poll (fds, nfds, ugly_timeout); + } + while (val == 0 && timeout != 0); + + return val; +} + +# define poll(u,n,t) vlc_poll(u, n, t) + +#elif defined (__APPLE__) +# define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */ +# include +# include +/* Unnamed POSIX semaphores not supported on Mac OS X */ +# include +# include +# define LIBVLC_USE_PTHREAD 1 +# define LIBVLC_USE_PTHREAD_CLEANUP 1 + +typedef pthread_t vlc_thread_t; +#define VLC_THREAD_CANCELED PTHREAD_CANCELED +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef pthread_cond_t vlc_cond_t; +#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER +typedef semaphore_t vlc_sem_t; +typedef pthread_rwlock_t vlc_rwlock_t; +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 22 +# define VLC_THREAD_PRIORITY_AUDIO 22 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 22 +# define VLC_THREAD_PRIORITY_HIGHEST 22 + +#else /* POSIX threads */ +# include /* _POSIX_SPIN_LOCKS */ +# include +# include + +/** + * Whether LibVLC threads are based on POSIX threads. + */ +# define LIBVLC_USE_PTHREAD 1 + +/** + * Whether LibVLC thread cancellation is based on POSIX threads. + */ +# define LIBVLC_USE_PTHREAD_CLEANUP 1 + +/** + * Thread handle. + */ +typedef struct +{ + pthread_t handle; +} vlc_thread_t; + +/** + * Return value of a canceled thread. + */ +#define VLC_THREAD_CANCELED PTHREAD_CANCELED + +/** + * Mutex. + * + * Storage space for a mutual exclusion lock. + */ +typedef pthread_mutex_t vlc_mutex_t; + +/** + * Static initializer for (static) mutex. + */ +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER + +/** + * Condition variable. + * + * Storage space for a thread condition variable. + */ +typedef pthread_cond_t vlc_cond_t; + +/** + * Static initializer for (static) condition variable. + * + * \note + * The condition variable will use the default clock, which is OS-dependent. + * Therefore, where timed waits are necessary the condition variable should + * always be initialized dynamically explicit instead of using this + * initializer. + */ +#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER + +/** + * Semaphore. + * + * Storage space for a thread-safe semaphore. + */ +typedef sem_t vlc_sem_t; + +/** + * Read/write lock. + * + * Storage space for a slim reader/writer lock. + */ +typedef pthread_rwlock_t vlc_rwlock_t; + +/** + * Static initializer for (static) read/write lock. + */ +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER + +/** + * Thread-local key handle. + */ +typedef pthread_key_t vlc_threadvar_t; + +/** + * Threaded timer handle. + */ +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 10 +# define VLC_THREAD_PRIORITY_AUDIO 5 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 15 +# define VLC_THREAD_PRIORITY_HIGHEST 20 + +#endif + +#ifdef LIBVLC_NEED_CONDVAR +typedef struct +{ + unsigned value; +} vlc_cond_t; +# define VLC_STATIC_COND { 0 } +#endif + +#ifdef LIBVLC_NEED_SEMAPHORE +typedef struct vlc_sem +{ + vlc_mutex_t lock; + vlc_cond_t wait; + unsigned value; +} vlc_sem_t; +#endif + +#ifdef LIBVLC_NEED_RWLOCK +typedef struct vlc_rwlock +{ + vlc_mutex_t mutex; + vlc_cond_t wait; + long state; +} vlc_rwlock_t; +# define VLC_STATIC_RWLOCK { VLC_STATIC_MUTEX, VLC_STATIC_COND, 0 } +#endif + +/** + * Initializes a fast mutex. + * + * Recursive locking of a fast mutex is undefined behaviour. (In debug builds, + * recursive locking will cause an assertion failure.) + */ +VLC_API void vlc_mutex_init(vlc_mutex_t *); + +/** + * Initializes a recursive mutex. + * \warning This is strongly discouraged. Please use normal mutexes. + */ +VLC_API void vlc_mutex_init_recursive(vlc_mutex_t *); + +/** + * Deinitializes a mutex. + * + * The mutex must not be locked, otherwise behaviour is undefined. + */ +VLC_API void vlc_mutex_destroy(vlc_mutex_t *); + +/** + * Acquires a mutex. + * + * If needed, this waits for any other thread to release it. + * + * \warning Beware of deadlocks when locking multiple mutexes at the same time, + * or when using mutexes from callbacks. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_mutex_lock(vlc_mutex_t *); + +/** + * Tries to acquire a mutex. + * + * This function acquires the mutex if and only if it is not currently held by + * another thread. This function never sleeps and can be used in delay-critical + * code paths. + * + * \note This function is not a cancellation point. + * + * \warning If this function fails, then the mutex is held... by another + * thread. The calling thread must deal with the error appropriately. That + * typically implies postponing the operations that would have required the + * mutex. If the thread cannot defer those operations, then it must use + * vlc_mutex_lock(). If in doubt, use vlc_mutex_lock() instead. + * + * @return 0 if the mutex could be acquired, an error code otherwise. + */ +VLC_API int vlc_mutex_trylock( vlc_mutex_t * ) VLC_USED; + +/** + * Releases a mutex. + * + * If the mutex is not held by the calling thread, the behaviour is undefined. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_mutex_unlock(vlc_mutex_t *); + +/** + * Initializes a condition variable. + */ +VLC_API void vlc_cond_init(vlc_cond_t *); + +/** + * Initializes a condition variable (wall clock). + * + * This function initializes a condition variable for timed waiting using the + * UTC wall clock time. The time reference is the same as with time() and with + * timespec_get() and TIME_UTC. + * vlc_cond_timedwait_daytime() must be instead of + * vlc_cond_timedwait() for actual waiting. + */ +void vlc_cond_init_daytime(vlc_cond_t *); + +/** + * Deinitializes a condition variable. + * + * No threads shall be waiting or signaling the condition, otherwise the + * behavior is undefined. + */ +VLC_API void vlc_cond_destroy(vlc_cond_t *); + +/** + * Wakes up one thread waiting on a condition variable. + * + * If any thread is currently waiting on the condition variable, at least one + * of those threads will be woken up. Otherwise, this function has no effects. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_cond_signal(vlc_cond_t *); + +/** + * Wakes up all threads waiting on a condition variable. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_cond_broadcast(vlc_cond_t *); + +/** + * Waits on a condition variable. + * + * The calling thread will be suspended until another thread calls + * vlc_cond_signal() or vlc_cond_broadcast() on the same condition variable, + * the thread is cancelled with vlc_cancel(), or the system causes a + * spurious unsolicited wake-up. + * + * A mutex is needed to wait on a condition variable. It must not be + * a recursive mutex. Although it is possible to use the same mutex for + * multiple condition, it is not valid to use different mutexes for the same + * condition variable at the same time from different threads. + * + * The canonical way to use a condition variable to wait for event foobar is: + @code + vlc_mutex_lock(&lock); + mutex_cleanup_push(&lock); // release the mutex in case of cancellation + + while (!foobar) + vlc_cond_wait(&wait, &lock); + + // -- foobar is now true, do something about it here -- + + vlc_cleanup_pop(); + vlc_mutex_unlock(&lock); + @endcode + * + * \note This function is a cancellation point. In case of thread cancellation, + * the mutex is always locked before cancellation proceeds. + * + * \param cond condition variable to wait on + * \param mutex mutex which is unlocked while waiting, + * then locked again when waking up. + */ +VLC_API void vlc_cond_wait(vlc_cond_t *cond, vlc_mutex_t *mutex); + +/** + * Waits on a condition variable up to a certain date. + * + * This works like vlc_cond_wait() but with an additional time-out. + * The time-out is expressed as an absolute timestamp using the same arbitrary + * time reference as the mdate() and mwait() functions. + * + * \note This function is a cancellation point. In case of thread cancellation, + * the mutex is always locked before cancellation proceeds. + * + * \param cond condition variable to wait on + * \param mutex mutex which is unlocked while waiting, + * then locked again when waking up + * \param deadline absolute timeout + * + * \warning If the variable was initialized with vlc_cond_init_daytime(), or + * was statically initialized with \ref VLC_STATIC_COND, the time reference + * used by this function is unspecified (depending on the implementation, it + * might be the Unix epoch or the mdate() clock). + * + * \return 0 if the condition was signaled, an error code in case of timeout. + */ +VLC_API int vlc_cond_timedwait(vlc_cond_t *cond, vlc_mutex_t *mutex, + mtime_t deadline); + +int vlc_cond_timedwait_daytime(vlc_cond_t *, vlc_mutex_t *, time_t); + +/** + * Initializes a semaphore. + * + * @param count initial semaphore value (typically 0) + */ +VLC_API void vlc_sem_init(vlc_sem_t *, unsigned count); + +/** + * Deinitializes a semaphore. + */ +VLC_API void vlc_sem_destroy(vlc_sem_t *); + +/** + * Increments the value of a semaphore. + * + * \note This function is not a cancellation point. + * + * \return 0 on success, EOVERFLOW in case of integer overflow. + */ +VLC_API int vlc_sem_post(vlc_sem_t *); + +/** + * Waits on a semaphore. + * + * This function atomically waits for the semaphore to become non-zero then + * decrements it, and returns. If the semaphore is non-zero on entry, it is + * immediately decremented. + * + * \note This function may be a point of cancellation. + */ +VLC_API void vlc_sem_wait(vlc_sem_t *); + +/** + * Initializes a read/write lock. + */ +VLC_API void vlc_rwlock_init(vlc_rwlock_t *); + +/** + * Destroys an initialized unused read/write lock. + */ +VLC_API void vlc_rwlock_destroy(vlc_rwlock_t *); + +/** + * Acquires a read/write lock for reading. + * + * \note Recursion is allowed. + * \note This function may be a point of cancellation. + */ +VLC_API void vlc_rwlock_rdlock(vlc_rwlock_t *); + +/** + * Acquires a read/write lock for writing. Recursion is not allowed. + * \note This function may be a point of cancellation. + */ +VLC_API void vlc_rwlock_wrlock(vlc_rwlock_t *); + +/** + * Releases a read/write lock. + * + * The calling thread must hold the lock. Otherwise behaviour is undefined. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_rwlock_unlock(vlc_rwlock_t *); + +/** + * Allocates a thread-specific variable. + * + * @param key where to store the thread-specific variable handle + * @param destr a destruction callback. It is called whenever a thread exits + * and the thread-specific variable has a non-NULL value. + * + * @return 0 on success, a system error code otherwise. + * This function can actually fail: on most systems, there is a fixed limit to + * the number of thread-specific variables in a given process. + */ +VLC_API int vlc_threadvar_create(vlc_threadvar_t *key, void (*destr) (void *)); + +/** + * Deallocates a thread-specific variable. + */ +VLC_API void vlc_threadvar_delete(vlc_threadvar_t *); + +/** + * Sets a thread-specific variable. + + * \param key thread-local variable key (created with vlc_threadvar_create()) + * \param value new value for the variable for the calling thread + * \return 0 on success, a system error code otherwise. + */ +VLC_API int vlc_threadvar_set(vlc_threadvar_t key, void *value); + +/** + * Gets the value of a thread-local variable for the calling thread. + * This function cannot fail. + * + * \return the value associated with the given variable for the calling + * or NULL if no value was set. + */ +VLC_API void *vlc_threadvar_get(vlc_threadvar_t); + +/** + * Waits on an address. + * + * Puts the calling thread to sleep if a specific value is stored at a + * specified address. The thread will sleep until it is woken up by a call to + * vlc_addr_signal() or vlc_addr_broadcast() in another thread, or spuriously. + * + * If the value does not match, do nothing and return immediately. + * + * \param addr address to check for + * \param val value to match at the address + */ +void vlc_addr_wait(void *addr, unsigned val); + +/** + * Waits on an address with a time-out. + * + * This function operates as vlc_addr_wait() but provides an additional + * time-out. If the time-out elapses, the thread resumes and the function + * returns. + * + * \param addr address to check for + * \param val value to match at the address + * \param delay time-out duration + * + * \return true if the function was woken up before the time-out, + * false if the time-out elapsed. + */ +bool vlc_addr_timedwait(void *addr, unsigned val, mtime_t delay); + +/** + * Wakes up one thread on an address. + * + * Wakes up (at least) one of the thread sleeping on the specified address. + * The address must be equal to the first parameter given by at least one + * thread sleeping within the vlc_addr_wait() or vlc_addr_timedwait() + * functions. If no threads are found, this function does nothing. + * + * \param addr address identifying which threads may be woken up + */ +void vlc_addr_signal(void *addr); + +/** + * Wakes up all thread on an address. + * + * Wakes up all threads sleeping on the specified address (if any). + * Any thread sleeping within a call to vlc_addr_wait() or vlc_addr_timedwait() + * with the specified address as first call parameter will be woken up. + * + * \param addr address identifying which threads to wake up + */ +void vlc_addr_broadcast(void *addr); + +/** + * Creates and starts a new thread. + * + * The thread must be joined with vlc_join() to reclaim resources + * when it is not needed anymore. + * + * @param th storage space for the handle of the new thread (cannot be NULL) + * [OUT] + * @param entry entry point for the thread + * @param data data parameter given to the entry point + * @param priority thread priority value + * @return 0 on success, a standard error code on error. + * @note In case of error, the value of *th is undefined. + */ +VLC_API int vlc_clone(vlc_thread_t *th, void *(*entry)(void *), void *data, + int priority) VLC_USED; + +/** + * Marks a thread as cancelled. + * + * Next time the target thread reaches a cancellation point (while not having + * disabled cancellation), it will run its cancellation cleanup handler, the + * thread variable destructors, and terminate. + * + * vlc_join() must be used regardless of a thread being cancelled or not, to + * avoid leaking resources. + */ +VLC_API void vlc_cancel(vlc_thread_t); + +/** + * Waits for a thread to complete (if needed), then destroys it. + * + * \note This is a cancellation point. In case of cancellation, the thread is + * not joined. + + * \warning A thread cannot join itself (normally VLC will abort if this is + * attempted). Also a detached thread cannot be joined. + * + * @param th thread handle + * @param result [OUT] pointer to write the thread return value or NULL + */ +VLC_API void vlc_join(vlc_thread_t th, void **result); + +/** + * Disables thread cancellation. + * + * This functions saves the current cancellation state (enabled or disabled), + * then disables cancellation for the calling thread. It must be called before + * entering a piece of code that is not cancellation-safe, unless it can be + * proven that the calling thread will not be cancelled. + * + * \note This function is not a cancellation point. + * + * \return Previous cancellation state (opaque value for vlc_restorecancel()). + */ +VLC_API int vlc_savecancel(void); + +/** + * Restores the cancellation state. + * + * This function restores the cancellation state of the calling thread to + * a state previously saved by vlc_savecancel(). + * + * \note This function is not a cancellation point. + * + * \param state previous state as returned by vlc_savecancel(). + */ +VLC_API void vlc_restorecancel(int state); + +/** + * Internal handler for thread cancellation. + * + * Do not call this function directly. Use wrapper macros instead: + * vlc_cleanup_push(), vlc_cleanup_pop(). + */ +VLC_API void vlc_control_cancel(int cmd, ...); + +/** + * Thread handle. + * + * This function returns the thread handle of the calling thread. + * + * \note The exact type of the thread handle depends on the platform, + * including an integer type, a pointer type or a compound type of any size. + * If you need an integer identifier, use vlc_thread_id() instead. + * + * \note vlc_join(vlc_thread_self(), NULL) is undefined, + * as it obviously does not make any sense (it might result in a deadlock, but + * there are no warranties that it will). + * + * \return the thread handle + */ +VLC_API vlc_thread_t vlc_thread_self(void) VLC_USED; + +/** + * Thread identifier. + * + * This function returns the identifier of the calling thread. The identifier + * cannot change for the entire duration of the thread, and no other thread can + * have the same identifier at the same time in the same process. Typically, + * the identifier is also unique across all running threads of all existing + * processes, but that depends on the operating system. + * + * There are no particular semantics to the thread ID with LibVLC. + * It is provided mainly for tracing and debugging. + * + * \warning This function is not currently implemented on all supported + * platforms. Where not implemented, it returns (unsigned long)-1. + * + * \return the thread identifier (or -1 if unimplemented) + */ +VLC_API unsigned long vlc_thread_id(void) VLC_USED; + +/** + * Precision monotonic clock. + * + * In principles, the clock has a precision of 1 MHz. But the actual resolution + * may be much lower, especially when it comes to sleeping with mwait() or + * msleep(). Most general-purpose operating systems provide a resolution of + * only 100 to 1000 Hz. + * + * \warning The origin date (time value "zero") is not specified. It is + * typically the time the kernel started, but this is platform-dependent. + * If you need wall clock time, use gettimeofday() instead. + * + * \return a timestamp in microseconds. + */ +VLC_API mtime_t mdate(void); + +/** + * Waits until a deadline. + * + * \param deadline timestamp to wait for (\ref mdate()) + * + * \note The deadline may be exceeded due to OS scheduling. + * \note This function is a cancellation point. + */ +VLC_API void mwait(mtime_t deadline); + +/** + * Waits for an interval of time. + * + * \param delay how long to wait (in microseconds) + * + * \note The delay may be exceeded due to OS scheduling. + * \note This function is a cancellation point. + */ +VLC_API void msleep(mtime_t delay); + +#define VLC_HARD_MIN_SLEEP 10000 /* 10 milliseconds = 1 tick at 100Hz */ +#define VLC_SOFT_MIN_SLEEP 9000000 /* 9 seconds */ + +#if defined (__GNUC__) && !defined (__clang__) +/* Linux has 100, 250, 300 or 1000Hz + * + * HZ=100 by default on FreeBSD, but some architectures use a 1000Hz timer + */ + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("sorry, cannot sleep for such short a time"))) +mtime_t impossible_delay( mtime_t delay ) +{ + (void) delay; + return VLC_HARD_MIN_SLEEP; +} + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((warning("use proper event handling instead of short delay"))) +mtime_t harmful_delay( mtime_t delay ) +{ + return delay; +} + +# define check_delay( d ) \ + ((__builtin_constant_p(d < VLC_HARD_MIN_SLEEP) \ + && (d < VLC_HARD_MIN_SLEEP)) \ + ? impossible_delay(d) \ + : ((__builtin_constant_p(d < VLC_SOFT_MIN_SLEEP) \ + && (d < VLC_SOFT_MIN_SLEEP)) \ + ? harmful_delay(d) \ + : d)) + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("deadlines can not be constant"))) +mtime_t impossible_deadline( mtime_t deadline ) +{ + return deadline; +} + +# define check_deadline( d ) \ + (__builtin_constant_p(d) ? impossible_deadline(d) : d) +#else +# define check_delay(d) (d) +# define check_deadline(d) (d) +#endif + +/** + * Initializes an asynchronous timer. + * + * \param id pointer to timer to be initialized + * \param func function that the timer will call + * \param data parameter for the timer function + * \return 0 on success, a system error code otherwise. + * + * \warning Asynchronous timers are processed from an unspecified thread. + * \note Multiple occurrences of a single interval timer are serialized: + * they cannot run concurrently. + */ +VLC_API int vlc_timer_create(vlc_timer_t *id, void (*func)(void *), void *data) +VLC_USED; + +/** + * Destroys an initialized timer. + * + * If needed, the timer is first disarmed. Behaviour is undefined if the + * specified timer is not initialized. + * + * \warning This function must be called before the timer data can be + * freed and before the timer callback function can be unmapped/unloaded. + * + * \param timer timer to destroy + */ +VLC_API void vlc_timer_destroy(vlc_timer_t timer); + +/** + * Arms or disarms an initialized timer. + * + * This functions overrides any previous call to itself. + * + * \note A timer can fire later than requested due to system scheduling + * limitations. An interval timer can fail to trigger sometimes, either because + * the system is busy or suspended, or because a previous iteration of the + * timer is still running. See also vlc_timer_getoverrun(). + * + * \param timer initialized timer + * \param absolute the timer value origin is the same as mdate() if true, + * the timer value is relative to now if false. + * \param value zero to disarm the timer, otherwise the initial time to wait + * before firing the timer. + * \param interval zero to fire the timer just once, otherwise the timer + * repetition interval. + */ +VLC_API void vlc_timer_schedule(vlc_timer_t timer, bool absolute, + mtime_t value, mtime_t interval); + +/** + * Fetches and resets the overrun counter for a timer. + * + * This functions returns the number of times that the interval timer should + * have fired, but the callback was not invoked due to scheduling problems. + * The call resets the counter to zero. + * + * \param timer initialized timer + * \return the timer overrun counter (typically zero) + */ +VLC_API unsigned vlc_timer_getoverrun(vlc_timer_t) VLC_USED; + +/** + * Count CPUs. + * + * \return number of available (logical) CPUs. + */ +VLC_API unsigned vlc_GetCPUCount(void); + +enum +{ + VLC_CLEANUP_PUSH, + VLC_CLEANUP_POP, + VLC_CANCEL_ADDR_SET, + VLC_CANCEL_ADDR_CLEAR, +}; + +#if defined (LIBVLC_USE_PTHREAD_CLEANUP) +/** + * Registers a thread cancellation handler. + * + * This pushes a function to run if the thread is cancelled (or otherwise + * exits prematurely). + * + * If multiple procedures are registered, + * they are handled in last-in first-out order. + * + * \note Any call to vlc_cleanup_push() must paired with a call to + * vlc_cleanup_pop(). + * \warning Branching into or out of the block between these two function calls + * is not allowed (read: it will likely crash the whole process). + * + * \param routine procedure to call if the thread ends + * \param arg argument for the procedure + */ +# define vlc_cleanup_push( routine, arg ) pthread_cleanup_push (routine, arg) + +/** + * Unregisters the last cancellation handler. + * + * This pops the cancellation handler that was last pushed with + * vlc_cleanup_push() in the calling thread. + */ +# define vlc_cleanup_pop( ) pthread_cleanup_pop (0) + +#else +typedef struct vlc_cleanup_t vlc_cleanup_t; + +struct vlc_cleanup_t +{ + vlc_cleanup_t *next; + void (*proc) (void *); + void *data; +}; + +/* This macros opens a code block on purpose. This is needed for multiple + * calls within a single function. This also prevent Win32 developers from + * writing code that would break on POSIX (POSIX opens a block as well). */ +# define vlc_cleanup_push( routine, arg ) \ + do { \ + vlc_cleanup_t vlc_cleanup_data = { NULL, routine, arg, }; \ + vlc_control_cancel (VLC_CLEANUP_PUSH, &vlc_cleanup_data) + +# define vlc_cleanup_pop( ) \ + vlc_control_cancel (VLC_CLEANUP_POP); \ + } while (0) + +#endif /* !LIBVLC_USE_PTHREAD_CLEANUP */ + +static inline void vlc_cleanup_lock (void *lock) +{ + vlc_mutex_unlock ((vlc_mutex_t *)lock); +} +#define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock, lock) + +static inline void vlc_cancel_addr_set(void *addr) +{ + vlc_control_cancel(VLC_CANCEL_ADDR_SET, addr); +} + +static inline void vlc_cancel_addr_clear(void *addr) +{ + vlc_control_cancel(VLC_CANCEL_ADDR_CLEAR, addr); +} + +#ifdef __cplusplus +/** + * Helper C++ class to lock a mutex. + * + * The mutex is locked when the object is created, and unlocked when the object + * is destroyed. + */ +class vlc_mutex_locker +{ + private: + vlc_mutex_t *lock; + public: + vlc_mutex_locker (vlc_mutex_t *m) : lock (m) + { + vlc_mutex_lock (lock); + } + + ~vlc_mutex_locker (void) + { + vlc_mutex_unlock (lock); + } +}; +#endif + +enum +{ + VLC_AVCODEC_MUTEX = 0, + VLC_GCRYPT_MUTEX, + VLC_XLIB_MUTEX, + VLC_MOSAIC_MUTEX, + VLC_HIGHLIGHT_MUTEX, +#ifdef _WIN32 + VLC_MTA_MUTEX, +#endif + /* Insert new entry HERE */ + VLC_MAX_MUTEX +}; + +/** + * Internal handler for global mutexes. + * + * Do not use this function directly. Use helper macros instead: + * vlc_global_lock(), vlc_global_unlock(). + */ +VLC_API void vlc_global_mutex(unsigned, bool); + +/** + * Acquires a global mutex. + */ +#define vlc_global_lock( n ) vlc_global_mutex(n, true) + +/** + * Releases a global mutex. + */ +#define vlc_global_unlock( n ) vlc_global_mutex(n, false) + +/** @} */ + +#endif /* !_VLC_THREADS_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_timestamp_helper.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_timestamp_helper.h new file mode 100644 index 0000000..7068d9f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_timestamp_helper.h @@ -0,0 +1,101 @@ +/***************************************************************************** + * vlc_timestamp_helper.h : timestamp handling helpers + ***************************************************************************** + * Copyright (C) 2014 VLC authors and VideoLAN + * $Id: 90840fbcf7a5197f235ab6160a2cc2708a87c54d $ + * + * Authors: Felix Abecassis + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TIMESTAMP_H +#define VLC_TIMESTAMP_H 1 + +/* Implementation of a circular buffer of timestamps with overwriting + * of older values. MediaCodec has only one type of timestamp, if a + * block has no PTS, we send the DTS instead. Some hardware decoders + * cannot cope with this situation and output the frames in the wrong + * order. As a workaround in this case, we use a FIFO of timestamps in + * order to remember which input packets had no PTS. Since an + * hardware decoder can silently drop frames, this might cause a + * growing desynchronization with the actual timestamp. Thus the + * circular buffer has a limited size and will overwrite older values. + */ +typedef struct +{ + uint32_t begin; + uint32_t size; + uint32_t capacity; + int64_t *buffer; +} timestamp_fifo_t; + +static inline timestamp_fifo_t *timestamp_FifoNew(uint32_t capacity) +{ + timestamp_fifo_t *fifo = calloc(1, sizeof(*fifo)); + if (!fifo) + return NULL; + fifo->buffer = vlc_alloc(capacity, sizeof(*fifo->buffer)); + if (!fifo->buffer) { + free(fifo); + return NULL; + } + fifo->capacity = capacity; + return fifo; +} + +static inline void timestamp_FifoRelease(timestamp_fifo_t *fifo) +{ + free(fifo->buffer); + free(fifo); +} + +static inline bool timestamp_FifoIsEmpty(timestamp_fifo_t *fifo) +{ + return fifo->size == 0; +} + +static inline bool timestamp_FifoIsFull(timestamp_fifo_t *fifo) +{ + return fifo->size == fifo->capacity; +} + +static inline void timestamp_FifoEmpty(timestamp_fifo_t *fifo) +{ + fifo->size = 0; +} + +static inline void timestamp_FifoPut(timestamp_fifo_t *fifo, int64_t ts) +{ + uint32_t end = (fifo->begin + fifo->size) % fifo->capacity; + fifo->buffer[end] = ts; + if (!timestamp_FifoIsFull(fifo)) + fifo->size += 1; + else + fifo->begin = (fifo->begin + 1) % fifo->capacity; +} + +static inline int64_t timestamp_FifoGet(timestamp_fifo_t *fifo) +{ + if (timestamp_FifoIsEmpty(fifo)) + return VLC_TS_INVALID; + + int64_t result = fifo->buffer[fifo->begin]; + fifo->begin = (fifo->begin + 1) % fifo->capacity; + fifo->size -= 1; + return result; +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_tls.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_tls.h new file mode 100644 index 0000000..84e44a5 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_tls.h @@ -0,0 +1,352 @@ +/***************************************************************************** + * vlc_tls.h: + ***************************************************************************** + * Copyright (C) 2004-2016 Rémi Denis-Courmont + * Copyright (C) 2005-2006 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TLS_H +# define VLC_TLS_H + +/** + * \ingroup net + * \defgroup transport Transport layer sockets + * Network stream abstraction + * + * Originally intended for the TLS protocol (Transport Layer Security), + * the Transport Layer Sockets now provides a generic abstraction + * for connection-oriented full-duplex I/O byte streams, such as TCP/IP sockets + * and TLS protocol sessions. + * + * @{ + * \file + * Transport layer functions + */ + +# include + +/** Transport layer socket */ +typedef struct vlc_tls +{ + int (*get_fd)(struct vlc_tls *); + ssize_t (*readv)(struct vlc_tls *, struct iovec *, unsigned); + ssize_t (*writev)(struct vlc_tls *, const struct iovec *, unsigned); + int (*shutdown)(struct vlc_tls *, bool duplex); + void (*close)(struct vlc_tls *); + + struct vlc_tls *p; +} vlc_tls_t; + +/** + * \defgroup tls Transport Layer Security + * @{ + */ + +/** + * TLS credentials + * + * This structure contains the credentials for establishing TLS sessions. + * This includes root Certificate Authorities (on client side), + * trust and cryptographic parameters, + * public certificates and private keys. + */ +typedef struct vlc_tls_creds +{ + VLC_COMMON_MEMBERS + + module_t *module; + void *sys; + + vlc_tls_t *(*open)(struct vlc_tls_creds *, vlc_tls_t *sock, + const char *host, const char *const *alpn); + int (*handshake)(struct vlc_tls_creds *, vlc_tls_t *session, + const char *hostname, const char *service, + char ** /*restrict*/ alp); +} vlc_tls_creds_t; + +/** + * Allocates TLS credentials for a client. + * Credentials can be cached and reused across multiple TLS sessions. + * + * @return TLS credentials object, or NULL on error. + **/ +VLC_API vlc_tls_creds_t *vlc_tls_ClientCreate(vlc_object_t *); + +/** + * Allocates server TLS credentials. + * + * @param cert path to an x509 certificate (required) + * @param key path to the PKCS private key for the certificate, + * or NULL to use cert path + * + * @return TLS credentials object, or NULL on error. + */ +VLC_API vlc_tls_creds_t *vlc_tls_ServerCreate(vlc_object_t *, const char *cert, + const char *key); + +static inline int vlc_tls_SessionHandshake (vlc_tls_creds_t *crd, + vlc_tls_t *tls) +{ + return crd->handshake(crd, tls, NULL, NULL, NULL); +} + +/** + * Releases TLS credentials. + * + * Releases data allocated with vlc_tls_ClientCreate() or + * vlc_tls_ServerCreate(). + * + * @param srv object to be destroyed (or NULL) + */ +VLC_API void vlc_tls_Delete(vlc_tls_creds_t *); + +/** + * Initiates a client TLS session. + * + * Initiates a Transport Layer Security (TLS) session as the client side, using + * trusted root CAs previously loaded with vlc_tls_ClientCreate(). + * + * This is a blocking network operation and may be a thread cancellation point. + * + * @param creds X.509 credentials, i.e. set of root certificates of trusted + * certificate authorities + * @param sock socket through which to establish the secure channel + * @param hostname expected server name, used both as Server Name Indication + * and as expected Common Name of the peer certificate [IN] + * @param service unique identifier for the service to connect to + * (only used locally for certificates database) [IN] + * @param alpn NULL-terminated list of Application Layer Protocols + * to negotiate, or NULL to not negotiate protocols [IN] + * @param alp storage space for the negotiated Application Layer + * Protocol or NULL if negotiation was not performed [OUT] + * + * @note The credentials must remain valid until the session is finished. + * + * @return TLS session, or NULL on error. + **/ +VLC_API vlc_tls_t *vlc_tls_ClientSessionCreate(vlc_tls_creds_t *creds, + vlc_tls_t *sock, + const char *host, + const char *service, + const char *const *alpn, + char **alp); + +/** + * Creates a TLS server session. + * + * Allocates a Transport Layer Security (TLS) session as the server side, using + * cryptographic keys pair and X.509 certificates chain already loaded with + * vlc_tls_ServerCreate(). + * + * Unlike vlc_tls_ClientSessionCreate(), this function does not perform any + * actual network I/O. vlc_tls_SessionHandshake() must be used to perform the + * TLS handshake before sending and receiving data through the TLS session. + * + * This function is non-blocking and is not a cancellation point. + * + * @param creds server credentials, i.e. keys pair and X.509 certificates chain + * @param alpn NULL-terminated list of Application Layer Protocols + * to negotiate, or NULL to not negotiate protocols + * + * @return TLS session, or NULL on error. + */ +VLC_API vlc_tls_t *vlc_tls_ServerSessionCreate(vlc_tls_creds_t *creds, + vlc_tls_t *sock, + const char *const *alpn); + +/** @} */ + +/** + * Destroys a TLS session down. + * + * All resources associated with the TLS session are released. + * + * If the session was established successfully, then shutdown cleanly, the + * underlying socket can be reused. Otherwise, it must be closed. Either way, + * this function does not close the underlying socket: Use vlc_tls_Close() + * instead to close it at the same. + * + * This function is non-blocking and is not a cancellation point. + */ +VLC_API void vlc_tls_SessionDelete (vlc_tls_t *); + +static inline int vlc_tls_GetFD(vlc_tls_t *tls) +{ + return tls->get_fd(tls); +} + +/** + * Receives data through a socket. + * + * This dequeues incoming data from a transport layer socket. + * + * @param buf received buffer start address [OUT] + * @param len buffer length (in bytes) + * @param waitall whether to wait for the exact buffer length (true), + * or for any amount of data (false) + * + * @note At end of stream, the number of bytes returned may be shorter than + * requested regardless of the "waitall" flag. + * + * @return the number of bytes actually dequeued, or -1 on error. + */ +VLC_API ssize_t vlc_tls_Read(vlc_tls_t *, void *buf, size_t len, bool waitall); + +/** + * Receives a text line through a socket. + * + * This dequeues one line of text from a transport layer socket. + * @return a heap-allocated nul-terminated string, or NULL on error + */ +VLC_API char *vlc_tls_GetLine(vlc_tls_t *); + +/** + * Sends data through a socket. + */ +VLC_API ssize_t vlc_tls_Write(vlc_tls_t *, const void *buf, size_t len); + +/** + * Shuts a connection down. + * + * This sends the connection close notification. + * + * If the TLS protocol is used, this provides a secure indication to the other + * end that no further data will be sent. If using plain TCP/IP, this sets the + * FIN flag. + * + * Data can still be received until a close notification is received from the + * other end. + * + * @param duplex whether to stop receiving data as well + * @retval 0 the session was terminated securely and cleanly + * (the underlying socket can be reused for other purposes) + * @return -1 the session was terminated locally, but either a notification + * could not be sent or received (the underlying socket cannot be + * reused and must be closed) + */ +static inline int vlc_tls_Shutdown(vlc_tls_t *tls, bool duplex) +{ + return tls->shutdown(tls, duplex); +} + +/** + * Closes a connection and its underlying resources. + * + * This function closes the transport layer socket, and terminates any + * underlying connection. For instance, if the TLS protocol is used over a TCP + * stream, this function terminates both the TLS session, and then underlying + * TCP/IP connection. + * + * To close a connection but retain any underlying resources, use + * vlc_tls_SessionDelete() instead. + */ +static inline void vlc_tls_Close(vlc_tls_t *session) +{ + do + { + vlc_tls_t *p = session->p; + + vlc_tls_SessionDelete(session); + session = p; + } + while (session != NULL); +} + +/** + * Creates a transport-layer stream from a socket. + * + * Creates a transport-layer I/O stream from a socket file descriptor. + * Data will be sent and received directly through the socket. This can be used + * either to share common code between non-TLS and TLS cases, or for testing + * purposes. + * + * This function is not a cancellation point. + * + * @deprecated This function is transitional. Do not use it directly. + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpen(int fd); + +/** + * Creates a connected pair of transport-layer sockets. + */ +VLC_API int vlc_tls_SocketPair(int family, int protocol, vlc_tls_t *[2]); + +struct addrinfo; + +/** + * Creates a transport-layer stream from a struct addrinfo. + * + * This function tries to allocate a socket using the specified addrinfo + * structure. Normally, the vlc_tls_SocketOpenTCP() function takes care of + * this. But in some cases, it cannot be used, notably: + * - if the remote destination is not resolved (directly) from getaddrinfo(), + * - if the socket type is not SOCK_STREAM, + * - if the transport protocol is not TCP (IPPROTO_TCP), or + * - if TCP Fast Open should be attempted. + * + * @param ai a filled addrinfo structure (the ai_next member is ignored) + * @param defer_connect whether to attempt a TCP Fast Open connection or not + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpenAddrInfo(const struct addrinfo *ai, + bool defer_connect); + +/** + * Creates a transport-layer TCP stream from a name and port. + * + * This function resolves a hostname, and attempts to establish a TCP/IP + * connection to the specified host and port number. + * + * @note The function currently iterates through the addrinfo linked list. + * Future versions may implement different behaviour (e.g. RFC6555). + * + * @return a transport layer socket on success or NULL on error + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpenTCP(vlc_object_t *obj, + const char *hostname, unsigned port); + +/** + * Initiates a TLS session over TCP. + * + * This function resolves a hostname, attempts to establish a TCP/IP + * connection to the specified host and port number, and finally attempts to + * establish a TLS session over the TCP/IP stream. + * + * See also vlc_tls_SocketOpenTCP() and vlc_tls_SessionCreate(). + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpenTLS(vlc_tls_creds_t *crd, + const char *hostname, unsigned port, + const char *service, + const char *const *alpn, char **alp); + +VLC_DEPRECATED +static inline vlc_tls_t * +vlc_tls_ClientSessionCreateFD(vlc_tls_creds_t *crd, int fd, const char *host, + const char *srv, const char *const *lp, char **p) +{ + vlc_tls_t *sock = vlc_tls_SocketOpen(fd); + if (unlikely(sock == NULL)) + return NULL; + + vlc_tls_t *tls = vlc_tls_ClientSessionCreate(crd, sock, host, srv, lp, p); + if (unlikely(tls == NULL)) + free(sock); + return tls; +} + +/** @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_url.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_url.h new file mode 100644 index 0000000..ceae349 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_url.h @@ -0,0 +1,210 @@ +/***************************************************************************** + * vlc_url.h: URL related macros + ***************************************************************************** + * Copyright (C) 2002-2006 VLC authors and VideoLAN + * $Id: e13b7a5abb57e777e5252c5287bed9f52c7e2de0 $ + * + * Authors: Christophe Massiot + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_URL_H +# define VLC_URL_H + +/** + * \file + * This file defines functions for manipulating URL in vlc + * + * \ingroup strings + * @{ + */ + +/** + * Converts local path to URL. + * + * Builds a URL representation from a local UTF-8 null-terminated file path. + * + * @param path file path + * @param scheme URI scheme to use (default is auto: "file", "fd" or "smb") + * @return a heap-allocated URI string on success + * or NULL in case of error (errno will be set accordingly) + */ +VLC_API char *vlc_path2uri(const char *path, const char *scheme) VLC_MALLOC; + +/** + * Converts a URI to a local path. + * + * Builds a local path (UTF-8-encoded null-terminated string) from a URI if + * the URI scheme allows. + * + * @param url URI + * @return a heap-allocated string or success + * or NULL on error + */ +VLC_API char *vlc_uri2path(const char *url) VLC_MALLOC; + +/** + * Decodes an URI component in place. + * + * Decodes one null-terminated UTF-8 URI component to aa null-terminated UTF-8 + * string in place. + * + * See also vlc_uri_decode_duplicate() for the not-in-place variant. + * + * \warning This function does NOT decode entire URIs. + * URI can only be decoded (and encoded) one component at a time + * (e.g. the host name, one directory, the file name). + * Complete URIs are always "encoded" (or they are syntaxically invalid). + * See IETF RFC3986, especially §2.4 for details. + * + * \note URI encoding is different from Javascript escaping. Especially, + * white spaces and Unicode non-ASCII code points are encoded differently. + * + * \param str null-terminated component + * \return str is returned on success. NULL if str was not properly encoded. + */ +VLC_API char *vlc_uri_decode(char *str); + +/** + * Decodes an URI component. + * + * See also vlc_uri_decode() for the in-place variant. + * + * \return a heap-allocated string on success or NULL on error. + */ +VLC_API char *vlc_uri_decode_duplicate(const char *str) VLC_MALLOC; + +/** + * Encodes a URI component. + * + * Substitutes URI-unsafe, URI delimiters and non-ASCII characters into their + * URI-encoded URI-safe representation. See also IETF RFC3986 §2. + * + * @param str nul-terminated UTF-8 representation of the component. + * @note Obviously, a URI containing nul bytes cannot be passed. + * @return heap-allocated string, or NULL if out of memory. + */ +VLC_API char *vlc_uri_encode(const char *str) VLC_MALLOC; + +/** + * Composes an URI. + * + * Converts a decomposed/parsed URI structure (\ref vlc_url_t) into a + * nul-terminated URI literal string. + * + * See also IETF RFC3986 section 5.3 for details. + * + * \bug URI fragments (i.e. HTML anchors) are not handled + * + * \return a heap-allocated nul-terminated string or NULL if out of memory + */ +VLC_API char *vlc_uri_compose(const vlc_url_t *) VLC_MALLOC; + +/** + * Resolves an URI reference. + * + * Resolves an URI reference relative to a base URI. + * If the reference is an absolute URI, then this function simply returns a + * copy of the URI reference. + * + * \param base base URI (as a nul-terminated string) + * \param ref URI reference (also as a nul-terminated string) + * + * \return a heap-allocated nul-terminated string representing the resolved + * absolute URI, or NULL if out of memory. + */ +VLC_API char *vlc_uri_resolve(const char *base, const char *ref) VLC_MALLOC; + +/** + * Fixes up a URI string. + * + * Attempts to convert a nul-terminated string into a syntactically valid URI. + * If the string is, or may be, a syntactically valid URI, an exact copy is + * returned. In any case, the result will only contain URI-safe and URI + * delimiter characters (generic delimiters or sub-delimiters) and all percent + * signs will be followed by two hexadecimal characters. + * + * @return a heap-allocated string, or NULL if on out of memory. + */ +VLC_API char *vlc_uri_fixup(const char *) VLC_MALLOC; + +struct vlc_url_t +{ + char *psz_protocol; + char *psz_username; + char *psz_password; + char *psz_host; + unsigned i_port; + char *psz_path; + char *psz_option; + + char *psz_buffer; /* to be freed */ + char *psz_pathbuffer; /* to be freed */ +}; + +/** + * Parses an URI or IRI. + * + * Extracts the following parts from an URI string: + * - scheme (i.e. protocol), + * - user (deprecated), + * - password (also deprecated), + * - host name or IP address literal, + * - port number, + * - path (including the filename preceded by any and all directories) + * - request parameters (excluding the leading question mark '?'). + * + * The function accepts URIs, as well as UTF-8-encoded IRIs. For IRIs, the hier + * part (specifically, the host name) is assumed to be an IDN and is decoded to + * ASCII according, so it can be used for DNS resolution. If the host is an + * IPv6 address literal, brackets are stripped. + * + * Any missing part is set to nul. For historical reasons, the target structure + * is always initialized, even if parsing the URI string fails. + * + * On error, errno is set to one of the following value: + * - ENOMEM in case of memory allocation failure, + * - EINVAL in case of syntax error in the input string. + * + * \bug The URI fragment is discarded if present. + * + * \note This function allocates memory. vlc_UrlClean() must be used free + * associated the allocations, even if the function fails. + * + * \param url structure of URL parts [OUT] + * \param str nul-terminated URL string to split + * \retval 0 success + * \retval -1 failure + */ +VLC_API int vlc_UrlParse(vlc_url_t *url, const char *str); + +/** + * Parses an URI or IRI and fix up the path part. + * + * \see vlc_UrlParse + * \see vlc_uri_fixup + */ +VLC_API int vlc_UrlParseFixup(vlc_url_t *url, const char *str); + +/** + * Releases resources allocated by vlc_UrlParse(). + */ +VLC_API void vlc_UrlClean(vlc_url_t *); + +/** @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_variables.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_variables.h new file mode 100644 index 0000000..a397580 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_variables.h @@ -0,0 +1,671 @@ +/***************************************************************************** + * vlc_variables.h: variables handling + ***************************************************************************** + * Copyright (C) 2002-2004 VLC authors and VideoLAN + * $Id: 83752b171f82c86164142a6254f513fc9cb7a324 $ + * + * Authors: Samuel Hocevar + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VARIABLES_H +#define VLC_VARIABLES_H 1 + +/** + * \defgroup variables Variables + * \ingroup vlc_object + * + * VLC object variables and callbacks + * + * @{ + * \file + * VLC object variables and callbacks interface + */ + +#define VLC_VAR_TYPE 0x00ff +#define VLC_VAR_CLASS 0x00f0 +#define VLC_VAR_FLAGS 0xff00 + +/** + * \defgroup var_type Variable types + * These are the different types a vlc variable can have. + * @{ + */ +#define VLC_VAR_VOID 0x0010 +#define VLC_VAR_BOOL 0x0020 +#define VLC_VAR_INTEGER 0x0030 +#define VLC_VAR_STRING 0x0040 +#define VLC_VAR_FLOAT 0x0050 +#define VLC_VAR_ADDRESS 0x0070 +#define VLC_VAR_COORDS 0x00A0 +/**@}*/ + +/** \defgroup var_flags Additive flags + * These flags are added to the type field of the variable. Most as a result of + * a var_Change() call, but some may be added at creation time + * @{ + */ +#define VLC_VAR_HASCHOICE 0x0100 + +#define VLC_VAR_ISCOMMAND 0x2000 + +/** Creation flag */ +/* If the variable is not found on the current module + search all parents and finally module config until found */ +#define VLC_VAR_DOINHERIT 0x8000 +/**@}*/ + +/** + * \defgroup var_action Variable actions + * These are the different actions that can be used with var_Change(). + * The parameters given are the meaning of the two last parameters of + * var_Change() when this action is being used. + * @{ + */ + +#define VLC_VAR_SETSTEP 0x0012 + +/** + * Set the value of this variable without triggering any callbacks + * \param p_val The new value + * \param p_val2 Unused + */ +#define VLC_VAR_SETVALUE 0x0013 + +#define VLC_VAR_SETTEXT 0x0014 +#define VLC_VAR_GETTEXT 0x0015 + +#define VLC_VAR_GETMIN 0x0016 +#define VLC_VAR_GETMAX 0x0017 +#define VLC_VAR_GETSTEP 0x0018 + +#define VLC_VAR_ADDCHOICE 0x0020 +#define VLC_VAR_DELCHOICE 0x0021 +#define VLC_VAR_CLEARCHOICES 0x0022 +#define VLC_VAR_GETCHOICES 0x0024 + +#define VLC_VAR_CHOICESCOUNT 0x0026 +#define VLC_VAR_SETMINMAX 0x0027 + +/**@}*/ + +/** \defgroup var_GetAndSet Variable actions + * These are the different actions that can be used with var_GetAndSet() + * @{ + */ +enum { + VLC_VAR_BOOL_TOGGLE, /**< Invert a boolean value (param ignored) */ + VLC_VAR_INTEGER_ADD, /**< Add parameter to an integer value */ + VLC_VAR_INTEGER_OR, /**< Binary OR over an integer bits field */ + VLC_VAR_INTEGER_NAND,/**< Binary NAND over an integer bits field */ +}; +/**@}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API int var_Create( vlc_object_t *, const char *, int ); +#define var_Create(a,b,c) var_Create( VLC_OBJECT(a), b, c ) + +VLC_API void var_Destroy( vlc_object_t *, const char * ); +#define var_Destroy(a,b) var_Destroy( VLC_OBJECT(a), b ) + +VLC_API int var_Change( vlc_object_t *, const char *, int, vlc_value_t *, vlc_value_t * ); +#define var_Change(a,b,c,d,e) var_Change( VLC_OBJECT(a), b, c, d, e ) + +VLC_API int var_Type( vlc_object_t *, const char * ) VLC_USED; +#define var_Type(a,b) var_Type( VLC_OBJECT(a), b ) + +VLC_API int var_Set( vlc_object_t *, const char *, vlc_value_t ); +#define var_Set(a,b,c) var_Set( VLC_OBJECT(a), b, c ) + +VLC_API int var_Get( vlc_object_t *, const char *, vlc_value_t * ); +#define var_Get(a,b,c) var_Get( VLC_OBJECT(a), b, c ) + +VLC_API int var_SetChecked( vlc_object_t *, const char *, int, vlc_value_t ); +#define var_SetChecked(o,n,t,v) var_SetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetChecked( vlc_object_t *, const char *, int, vlc_value_t * ); +#define var_GetChecked(o,n,t,v) var_GetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetAndSet( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API int var_Inherit( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API void var_FreeList( vlc_value_t *, vlc_value_t * ); + + +/***************************************************************************** + * Variable callbacks + ***************************************************************************** + * int MyCallback( vlc_object_t *p_this, + * char const *psz_variable, + * vlc_value_t oldvalue, + * vlc_value_t newvalue, + * void *p_data); + *****************************************************************************/ +VLC_API void var_AddCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API void var_DelCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API void var_TriggerCallback( vlc_object_t *, const char * ); + +VLC_API void var_AddListCallback( vlc_object_t *, const char *, vlc_list_callback_t, void * ); +VLC_API void var_DelListCallback( vlc_object_t *, const char *, vlc_list_callback_t, void * ); + +#define var_AddCallback(a,b,c,d) var_AddCallback( VLC_OBJECT(a), b, c, d ) +#define var_DelCallback(a,b,c,d) var_DelCallback( VLC_OBJECT(a), b, c, d ) +#define var_TriggerCallback(a,b) var_TriggerCallback( VLC_OBJECT(a), b ) + +#define var_AddListCallback(a,b,c,d) var_AddListCallback( VLC_OBJECT(a), b, c, d ) +#define var_DelListCallback(a,b,c,d) var_DelListCallback( VLC_OBJECT(a), b, c, d ) + +/***************************************************************************** + * helpers functions + *****************************************************************************/ + +/** + * Set the value of an integer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param i The new integer value of this variable + */ +static inline int var_SetInteger( vlc_object_t *p_obj, const char *psz_name, + int64_t i ) +{ + vlc_value_t val; + val.i_int = i; + return var_SetChecked( p_obj, psz_name, VLC_VAR_INTEGER, val ); +} + +/** + * Set the value of an boolean variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param b The new boolean value of this variable + */ +static inline int var_SetBool( vlc_object_t *p_obj, const char *psz_name, bool b ) +{ + vlc_value_t val; + val.b_bool = b; + return var_SetChecked( p_obj, psz_name, VLC_VAR_BOOL, val ); +} + +static inline int var_SetCoords( vlc_object_t *obj, const char *name, + int32_t x, int32_t y ) +{ + vlc_value_t val; + val.coords.x = x; + val.coords.y = y; + return var_SetChecked (obj, name, VLC_VAR_COORDS, val); +} +#define var_SetCoords(o,n,x,y) var_SetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Set the value of a float variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param f The new float value of this variable + */ +static inline int var_SetFloat( vlc_object_t *p_obj, const char *psz_name, float f ) +{ + vlc_value_t val; + val.f_float = f; + return var_SetChecked( p_obj, psz_name, VLC_VAR_FLOAT, val ); +} + +/** + * Set the value of a string variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param psz_string The new string value of this variable + */ +static inline int var_SetString( vlc_object_t *p_obj, const char *psz_name, const char *psz_string ) +{ + vlc_value_t val; + val.psz_string = (char *)psz_string; + return var_SetChecked( p_obj, psz_name, VLC_VAR_STRING, val ); +} + +/** + * Set the value of a pointer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param ptr The new pointer value of this variable + */ +static inline +int var_SetAddress( vlc_object_t *p_obj, const char *psz_name, void *ptr ) +{ + vlc_value_t val; + val.p_address = ptr; + return var_SetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, val ); +} + +#define var_SetInteger(a,b,c) var_SetInteger( VLC_OBJECT(a),b,c) +#define var_SetBool(a,b,c) var_SetBool( VLC_OBJECT(a),b,c) +#define var_SetFloat(a,b,c) var_SetFloat( VLC_OBJECT(a),b,c) +#define var_SetString(a,b,c) var_SetString( VLC_OBJECT(a),b,c) +#define var_SetAddress(o, n, p) var_SetAddress(VLC_OBJECT(o), n, p) + + +/** + * Get an integer value +* + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_GetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_INTEGER, &val ) ) + return val.i_int; + else + return 0; +} + +/** + * Get a boolean value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_GetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.b_bool = false; + + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_BOOL, &val ) ) + return val.b_bool; + else + return false; +} + +static inline void var_GetCoords( vlc_object_t *obj, const char *name, + int32_t *px, int32_t *py ) +{ + vlc_value_t val; + + if (likely(!var_GetChecked (obj, name, VLC_VAR_COORDS, &val))) + { + *px = val.coords.x; + *py = val.coords.y; + } + else + *px = *py = 0; +} +#define var_GetCoords(o,n,x,y) var_GetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Get a float value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_GetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.f_float = 0.0; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_FLOAT, &val ) ) + return val.f_float; + else + return 0.0; +} + +/** + * Get a string value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_GetString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.psz_string = NULL; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + else + return val.psz_string; +} + +VLC_USED VLC_MALLOC +static inline char *var_GetNonEmptyString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + if( val.psz_string && *val.psz_string ) + return val.psz_string; + free( val.psz_string ); + return NULL; +} + +VLC_USED +static inline void *var_GetAddress( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, &val ) ) + return NULL; + else + return val.p_address; +} + +/** + * Increment an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_IncInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = 1; + if( var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ) ) + return 0; + return val.i_int; +} +#define var_IncInteger(a,b) var_IncInteger( VLC_OBJECT(a), b ) + +/** + * Decrement an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_DecInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = -1; + if( var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ) ) + return 0; + return val.i_int; +} +#define var_DecInteger(a,b) var_DecInteger( VLC_OBJECT(a), b ) + +static inline uint64_t var_OrInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + if( var_GetAndSet( obj, name, VLC_VAR_INTEGER_OR, &val ) ) + return 0; + return val.i_int; +} +#define var_OrInteger(a,b,c) var_OrInteger(VLC_OBJECT(a),b,c) + +static inline uint64_t var_NAndInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + if( var_GetAndSet( obj, name, VLC_VAR_INTEGER_NAND, &val ) ) + return 0; + return val.i_int; +} +#define var_NAndInteger(a,b,c) var_NAndInteger(VLC_OBJECT(a),b,c) + +/** + * Create a integer variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a float variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +/** + * Create an address variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline void *var_CreateGetAddress( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT ); + return var_GetAddress( p_obj, psz_name ); +} + +#define var_CreateGetInteger(a,b) var_CreateGetInteger( VLC_OBJECT(a),b) +#define var_CreateGetBool(a,b) var_CreateGetBool( VLC_OBJECT(a),b) +#define var_CreateGetFloat(a,b) var_CreateGetFloat( VLC_OBJECT(a),b) +#define var_CreateGetString(a,b) var_CreateGetString( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyString(a,b) var_CreateGetNonEmptyString( VLC_OBJECT(a),b) +#define var_CreateGetAddress(a,b) var_CreateGetAddress( VLC_OBJECT(a),b) + +/** + * Create a integer command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetIntegerCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBoolCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a float command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloatCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +#define var_CreateGetIntegerCommand(a,b) var_CreateGetIntegerCommand( VLC_OBJECT(a),b) +#define var_CreateGetBoolCommand(a,b) var_CreateGetBoolCommand( VLC_OBJECT(a),b) +#define var_CreateGetFloatCommand(a,b) var_CreateGetFloatCommand( VLC_OBJECT(a),b) +#define var_CreateGetStringCommand(a,b) var_CreateGetStringCommand( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyStringCommand(a,b) var_CreateGetNonEmptyStringCommand( VLC_OBJECT(a),b) + +VLC_USED +static inline int var_CountChoices( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t count; + if( var_Change( p_obj, psz_name, VLC_VAR_CHOICESCOUNT, &count, NULL ) ) + return 0; + return count.i_int; +} +#define var_CountChoices(a,b) var_CountChoices( VLC_OBJECT(a),b) + + +static inline bool var_ToggleBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetAndSet( p_obj, psz_name, VLC_VAR_BOOL_TOGGLE, &val ) ) + return false; + return val.b_bool; +} +#define var_ToggleBool(a,b) var_ToggleBool( VLC_OBJECT(a),b ) + + +VLC_USED +static inline bool var_InheritBool( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_BOOL, &val ) ) + val.b_bool = false; + return val.b_bool; +} +#define var_InheritBool(o, n) var_InheritBool(VLC_OBJECT(o), n) + +VLC_USED +static inline int64_t var_InheritInteger( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_INTEGER, &val ) ) + val.i_int = 0; + return val.i_int; +} +#define var_InheritInteger(o, n) var_InheritInteger(VLC_OBJECT(o), n) + +VLC_USED +static inline float var_InheritFloat( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_FLOAT, &val ) ) + val.f_float = 0.; + return val.f_float; +} +#define var_InheritFloat(o, n) var_InheritFloat(VLC_OBJECT(o), n) + +VLC_USED VLC_MALLOC +static inline char *var_InheritString( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_STRING, &val ) ) + val.psz_string = NULL; + else if( val.psz_string && !*val.psz_string ) + { + free( val.psz_string ); + val.psz_string = NULL; + } + return val.psz_string; +} +#define var_InheritString(o, n) var_InheritString(VLC_OBJECT(o), n) + +VLC_USED +static inline void *var_InheritAddress( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_ADDRESS, &val ) ) + val.p_address = NULL; + return val.p_address; +} +#define var_InheritAddress(o, n) var_InheritAddress(VLC_OBJECT(o), n) + +VLC_API int var_InheritURational( vlc_object_t *, unsigned *num, unsigned *den, const char *var ); +#define var_InheritURational(a,b,c,d) var_InheritURational(VLC_OBJECT(a), b, c, d) + +#define var_GetInteger(a,b) var_GetInteger( VLC_OBJECT(a),b) +#define var_GetBool(a,b) var_GetBool( VLC_OBJECT(a),b) +#define var_GetFloat(a,b) var_GetFloat( VLC_OBJECT(a),b) +#define var_GetString(a,b) var_GetString( VLC_OBJECT(a),b) +#define var_GetNonEmptyString(a,b) var_GetNonEmptyString( VLC_OBJECT(a),b) +#define var_GetAddress(a,b) var_GetAddress( VLC_OBJECT(a),b) + +VLC_API int var_LocationParse(vlc_object_t *, const char *mrl, const char *prefix); +#define var_LocationParse(o, m, p) var_LocationParse(VLC_OBJECT(o), m, p) + +/** + * @} + */ +#endif /* _VLC_VARIABLES_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_video_splitter.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_video_splitter.h new file mode 100644 index 0000000..c7ac885 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_video_splitter.h @@ -0,0 +1,158 @@ +/***************************************************************************** + * vlc_video_splitter.h: "video splitter" related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: a5afba5230b0fb5b42c5cff3daab70a1e527f9eb $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VIDEO_SPLITTER_H +#define VLC_VIDEO_SPLITTER_H 1 + +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by video splitter filters. + */ + +typedef struct video_splitter_t video_splitter_t; +typedef struct video_splitter_sys_t video_splitter_sys_t; +typedef struct video_splitter_owner_t video_splitter_owner_t; + +/** Structure describing a video splitter output properties + */ +typedef struct +{ + /* Video format of the output */ + video_format_t fmt; + + /* Window hints */ + struct + { + /* Relative position. + * (0,0) is equal to the default position. + */ + int i_x; + int i_y; + + /* Alignment inside the window + */ + int i_align; + } window; + + /* Video output module + * Use NULL for default + */ + char *psz_module; + +} video_splitter_output_t; + +/** Structure describing a video splitter + */ +struct video_splitter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* configuration */ + config_chain_t *p_cfg; + + /* Input format + * It is filled by the creator and cannot be modified. + */ + video_format_t fmt; + + /* Output formats + * + * It can only be set in the open() function and must remain + * constant. + * The module is responsible for the allocation and deallocation. + */ + int i_output; + video_splitter_output_t *p_output; + + int (*pf_filter)( video_splitter_t *, picture_t *pp_dst[], + picture_t *p_src ); + int (*pf_mouse) ( video_splitter_t *, vlc_mouse_t *, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ); + + video_splitter_sys_t *p_sys; + + /* Buffer allocation */ + int (*pf_picture_new) ( video_splitter_t *, picture_t *pp_picture[] ); + void (*pf_picture_del) ( video_splitter_t *, picture_t *pp_picture[] ); + video_splitter_owner_t *p_owner; +}; + +/** + * It will create an array of pictures suitable as output. + * + * You must either returned them through pf_filter or by calling + * video_splitter_DeletePicture. + * + * If VLC_SUCCESS is not returned, pp_picture values are undefined. + */ +static inline int video_splitter_NewPicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + int i_ret = p_splitter->pf_picture_new( p_splitter, pp_picture ); + if( i_ret ) + msg_Warn( p_splitter, "can't get output pictures" ); + return i_ret; +} + +/** + * It will release an array of pictures created by video_splitter_NewPicture. + * Provided for convenience. + */ +static inline void video_splitter_DeletePicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + p_splitter->pf_picture_del( p_splitter, pp_picture ); +} + +/* */ +video_splitter_t * video_splitter_New( vlc_object_t *, const char *psz_name, const video_format_t * ); +void video_splitter_Delete( video_splitter_t * ); + +static inline int video_splitter_Filter( video_splitter_t *p_splitter, + picture_t *pp_dst[], picture_t *p_src ) +{ + return p_splitter->pf_filter( p_splitter, pp_dst, p_src ); +} +static inline int video_splitter_Mouse( video_splitter_t *p_splitter, + vlc_mouse_t *p_mouse, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ) +{ + if( !p_splitter->pf_mouse ) + { + *p_mouse = *p_new; + return VLC_SUCCESS; + } + return p_splitter->pf_mouse( p_splitter, p_mouse, i_index, p_old, p_new ); +} + +#endif /* VLC_VIDEO_SPLITTER_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_viewpoint.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_viewpoint.h new file mode 100644 index 0000000..cf01913 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_viewpoint.h @@ -0,0 +1,68 @@ +/***************************************************************************** + * vlc_viewpoint.h: viewpoint struct and helpers + ***************************************************************************** + * Copyright (C) 2017 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VIEWPOINT_H_ +#define VLC_VIEWPOINT_H_ 1 + +#include + +#include + +/** + * \defgroup output Output + * \ingroup output + * + * @{ + * \file + * Video and audio viewpoint struct and helpers + */ + +#define FIELD_OF_VIEW_DEGREES_DEFAULT 80.f +#define FIELD_OF_VIEW_DEGREES_MAX 150.f +#define FIELD_OF_VIEW_DEGREES_MIN 20.f + +/** + * Viewpoints + */ +struct vlc_viewpoint_t { + float yaw; /* yaw in degrees */ + float pitch; /* pitch in degrees */ + float roll; /* roll in degrees */ + float fov; /* field of view in degrees */ +}; + +static inline void vlc_viewpoint_init( vlc_viewpoint_t *p_vp ) +{ + p_vp->yaw = p_vp->pitch = p_vp->roll = 0.0f; + p_vp->fov = FIELD_OF_VIEW_DEGREES_DEFAULT; +} + +static inline void vlc_viewpoint_clip( vlc_viewpoint_t *p_vp ) +{ + p_vp->yaw = fmodf( p_vp->yaw, 360.f ); + p_vp->pitch = fmodf( p_vp->pitch, 360.f ); + p_vp->roll = fmodf( p_vp->roll, 360.f ); + p_vp->fov = VLC_CLIP( p_vp->fov, FIELD_OF_VIEW_DEGREES_MIN, + FIELD_OF_VIEW_DEGREES_MAX ); +} + +/**@}*/ + +#endif /* VLC_VIEWPOINT_H_ */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_vlm.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_vlm.h new file mode 100644 index 0000000..7e3c61d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_vlm.h @@ -0,0 +1,368 @@ +/***************************************************************************** + * vlc_vlm.h: VLM core structures + ***************************************************************************** + * Copyright (C) 2000, 2001 VLC authors and VideoLAN + * $Id: 88d4437cc1028468c0cadeaea32fa645769e2ee6 $ + * + * Authors: Simon Latapie + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VLM_H +#define VLC_VLM_H 1 + +#include + +/** + * \defgroup server VLM + * VLC stream manager + * + * VLM is the server core in vlc that allows streaming of multiple media streams + * at the same time. It provides broadcast, schedule and video on demand features + * for streaming using several streaming and network protocols. + * @{ + * \file + * VLC stream manager interface + */ + +/** VLM media */ +typedef struct +{ + int64_t id; /*< numeric id for vlm_media_t item */ + bool b_enabled; /*< vlm_media_t is enabled */ + + char *psz_name; /*< descriptive name of vlm_media_t item */ + + int i_input; /*< number of input options */ + char **ppsz_input; /*< array of input options */ + + int i_option; /*< number of output options */ + char **ppsz_option; /*< array of output options */ + + char *psz_output; /*< */ + + bool b_vod; /*< vlm_media_t is of type VOD */ + struct + { + bool b_loop; /*< this vlc_media_t broadcast item should loop */ + } broadcast; /*< Broadcast specific information */ + struct + { + char *psz_mux; /*< name of muxer to use */ + } vod; /*< VOD specific information */ + +} vlm_media_t; + +/** VLM media instance */ +typedef struct +{ + char *psz_name; /*< vlm media instance descriptive name */ + + int64_t i_time; /*< vlm media instance vlm media current time */ + int64_t i_length; /*< vlm media instance vlm media item length */ + double d_position; /*< vlm media instance position in stream */ + bool b_paused; /*< vlm media instance is paused */ + int i_rate; // normal is INPUT_RATE_DEFAULT +} vlm_media_instance_t; + +#if 0 +typedef struct +{ + +} vlm_schedule_t +#endif + +/** VLM events + * You can catch vlm event by adding a callback on the variable "intf-event" + * of the VLM object. + * This variable is an address that will hold a vlm_event_t* value. + */ +enum vlm_event_type_e +{ + /* */ + VLM_EVENT_MEDIA_ADDED = 0x100, + VLM_EVENT_MEDIA_REMOVED, + VLM_EVENT_MEDIA_CHANGED, + + /* */ + VLM_EVENT_MEDIA_INSTANCE_STARTED = 0x200, + VLM_EVENT_MEDIA_INSTANCE_STOPPED, + VLM_EVENT_MEDIA_INSTANCE_STATE, +}; + +typedef struct +{ + int i_type; /* a vlm_event_type_e value */ + int64_t id; /* Media ID */ + const char *psz_name; /* Media name */ + const char *psz_instance_name; /* Instance name or NULL */ + input_state_e input_state; /* Input instance event type */ +} vlm_event_t; + +/** VLM control query */ +enum vlm_query_e +{ + /* --- Media control */ + /* Get all medias */ + VLM_GET_MEDIAS, /* arg1=vlm_media_t ***, int *pi_media */ + /* Delete all medias */ + VLM_CLEAR_MEDIAS, /* no arg */ + + /* Add a new media */ + VLM_ADD_MEDIA, /* arg1=vlm_media_t* arg2=int64_t *p_id res=can fail */ + /* Delete an existing media */ + VLM_DEL_MEDIA, /* arg1=int64_t id */ + /* Change properties of an existing media (all fields but id and b_vod) */ + VLM_CHANGE_MEDIA, /* arg1=vlm_media_t* res=can fail */ + /* Get 1 media by it's ID */ + VLM_GET_MEDIA, /* arg1=int64_t id arg2=vlm_media_t ** */ + /* Get media ID from its name */ + VLM_GET_MEDIA_ID, /* arg1=const char *psz_name arg2=int64_t* */ + + /* Media instance control XXX VOD control are for internal use only */ + /* Get all media instances */ + VLM_GET_MEDIA_INSTANCES, /* arg1=int64_t id arg2=vlm_media_instance_t *** arg3=int *pi_instance */ + /* Delete all media instances */ + VLM_CLEAR_MEDIA_INSTANCES, /* arg1=int64_t id */ + /* Control broadcast instance */ + VLM_START_MEDIA_BROADCAST_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index res=can fail */ + /* Control VOD instance */ + VLM_START_MEDIA_VOD_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index char *psz_vod_output res=can fail */ + /* Stop an instance */ + VLM_STOP_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Pause an instance */ + VLM_PAUSE_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Get instance position time (in microsecond) */ + VLM_GET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t * */ + /* Set instance position time (in microsecond) */ + VLM_SET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t */ + /* Get instance position ([0.0 .. 1.0]) */ + VLM_GET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double * */ + /* Set instance position ([0.0 .. 1.0]) */ + VLM_SET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double */ + + /* Schedule control */ + VLM_CLEAR_SCHEDULES, /* no arg */ + /* TODO: missing schedule control */ + + /* */ +}; + + +/* VLM specific - structures and functions */ + +/* ok, here is the structure of a vlm_message: + The parent node is ( name_of_the_command , NULL ), or + ( name_of_the_command , message_error ) on error. + If a node has children, it should not have a value (=NULL).*/ +struct vlm_message_t +{ + char *psz_name; /*< message name */ + char *psz_value; /*< message value */ + + int i_child; /*< number of child messages */ + vlm_message_t **child; /*< array of vlm_message_t */ +}; + + +#ifdef __cplusplus +extern "C" { +#endif + +VLC_API vlm_t * vlm_New( vlc_object_t * ); +#define vlm_New( a ) vlm_New( VLC_OBJECT(a) ) +VLC_API void vlm_Delete( vlm_t * ); +VLC_API int vlm_ExecuteCommand( vlm_t *, const char *, vlm_message_t ** ); +VLC_API int vlm_Control( vlm_t *p_vlm, int i_query, ... ); + +VLC_API vlm_message_t * vlm_MessageSimpleNew( const char * ); +VLC_API vlm_message_t * vlm_MessageNew( const char *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API vlm_message_t * vlm_MessageAdd( vlm_message_t *, vlm_message_t * ); +VLC_API void vlm_MessageDelete( vlm_message_t * ); + +/* media helpers */ + +/** + * Initialize a vlm_media_t instance + * \param p_media vlm_media_t instance to initialize + */ +static inline void vlm_media_Init( vlm_media_t *p_media ) +{ + memset( p_media, 0, sizeof(vlm_media_t) ); + p_media->id = 0; // invalid id + p_media->psz_name = NULL; + TAB_INIT( p_media->i_input, p_media->ppsz_input ); + TAB_INIT( p_media->i_option, p_media->ppsz_option ); + p_media->psz_output = NULL; + p_media->b_vod = false; + + p_media->vod.psz_mux = NULL; + p_media->broadcast.b_loop = false; +} + +/** + * Copy a vlm_media_t instance into another vlm_media_t instance + * \param p_dst vlm_media_t instance to copy to + * \param p_src vlm_media_t instance to copy from + */ +static inline void +#ifndef __cplusplus +vlm_media_Copy( vlm_media_t *restrict p_dst, const vlm_media_t *restrict p_src ) +#else +vlm_media_Copy( vlm_media_t *p_dst, const vlm_media_t *p_src ) +#endif +{ + int i; + + memset( p_dst, 0, sizeof(vlm_media_t) ); + p_dst->id = p_src->id; + p_dst->b_enabled = p_src->b_enabled; + if( p_src->psz_name ) + p_dst->psz_name = strdup( p_src->psz_name ); + + for( i = 0; i < p_src->i_input; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_input, p_dst->ppsz_input, strdup(p_src->ppsz_input[i]) ); + for( i = 0; i < p_src->i_option; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_option, p_dst->ppsz_option, strdup(p_src->ppsz_option[i]) ); + + if( p_src->psz_output ) + p_dst->psz_output = strdup( p_src->psz_output ); + + p_dst->b_vod = p_src->b_vod; + if( p_src->b_vod ) + { + if( p_src->vod.psz_mux ) + p_dst->vod.psz_mux = strdup( p_src->vod.psz_mux ); + } + else + { + p_dst->broadcast.b_loop = p_src->broadcast.b_loop; + } +} + +/** + * Cleanup and release memory associated with this vlm_media_t instance. + * You still need to release p_media itself with vlm_media_Delete(). + * \param p_media vlm_media_t to cleanup + */ +static inline void vlm_media_Clean( vlm_media_t *p_media ) +{ + int i; + free( p_media->psz_name ); + + for( i = 0; i < p_media->i_input; i++ ) + free( p_media->ppsz_input[i]); + TAB_CLEAN(p_media->i_input, p_media->ppsz_input ); + + for( i = 0; i < p_media->i_option; i++ ) + free( p_media->ppsz_option[i]); + TAB_CLEAN(p_media->i_option, p_media->ppsz_option ); + + free( p_media->psz_output ); + if( p_media->b_vod ) + free( p_media->vod.psz_mux ); +} + +/** + * Allocate a new vlm_media_t instance + * \return vlm_media_t instance + */ +static inline vlm_media_t *vlm_media_New(void) +{ + vlm_media_t *p_media = (vlm_media_t *)malloc( sizeof(vlm_media_t) ); + if( p_media ) + vlm_media_Init( p_media ); + return p_media; +} + +/** + * Delete a vlm_media_t instance + * \param p_media vlm_media_t instance to delete + */ +static inline void vlm_media_Delete( vlm_media_t *p_media ) +{ + vlm_media_Clean( p_media ); + free( p_media ); +} + +/** + * Copy a vlm_media_t instance + * \param p_src vlm_media_t instance to copy + * \return vlm_media_t duplicate of p_src + */ +static inline vlm_media_t *vlm_media_Duplicate( vlm_media_t *p_src ) +{ + vlm_media_t *p_dst = vlm_media_New(); + if( p_dst ) + vlm_media_Copy( p_dst, p_src ); + return p_dst; +} + +/* media instance helpers */ +/** + * Initialize vlm_media_instance_t + * \param p_instance vlm_media_instance_t to initialize + */ +static inline void vlm_media_instance_Init( vlm_media_instance_t *p_instance ) +{ + memset( p_instance, 0, sizeof(vlm_media_instance_t) ); + p_instance->psz_name = NULL; + p_instance->i_time = 0; + p_instance->i_length = 0; + p_instance->d_position = 0.0; + p_instance->b_paused = false; + p_instance->i_rate = INPUT_RATE_DEFAULT; +} + +/** + * Cleanup vlm_media_instance_t + * \param p_instance vlm_media_instance_t to cleanup + */ +static inline void vlm_media_instance_Clean( vlm_media_instance_t *p_instance ) +{ + free( p_instance->psz_name ); +} + +/** + * Allocate a new vlm_media_instance_t + * \return a new vlm_media_instance_t + */ +static inline vlm_media_instance_t *vlm_media_instance_New(void) +{ + vlm_media_instance_t *p_instance = (vlm_media_instance_t *) malloc( sizeof(vlm_media_instance_t) ); + if( p_instance ) + vlm_media_instance_Init( p_instance ); + return p_instance; +} + +/** + * Delete a vlm_media_instance_t + * \param p_instance vlm_media_instance_t to delete + */ +static inline void vlm_media_instance_Delete( vlm_media_instance_t *p_instance ) +{ + vlm_media_instance_Clean( p_instance ); + free( p_instance ); +} + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_vout.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout.h new file mode 100644 index 0000000..d7306d8 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_vout.h: common video definitions + ***************************************************************************** + * Copyright (C) 1999 - 2008 VLC authors and VideoLAN + * $Id: 627f6cec2e3b96eea04f9566ef799ed5b3a93b2a $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_H_ +#define VLC_VOUT_H_ 1 + +#include +#include +#include + +/** + * \defgroup output Output + * \defgroup video_output Video output + * \ingroup output + * Video rendering, output and window management + * + * This module describes the programming interface for video output threads. + * It includes functions allowing to open a new thread, send pictures to a + * thread, and destroy a previously opened video output thread. + * @{ + * \file + * Video output thread interface + */ + +/** + * Vout configuration + */ +typedef struct { + vout_thread_t *vout; + vlc_object_t *input; + bool change_fmt; + const video_format_t *fmt; + unsigned dpb_size; +} vout_configuration_t; + +/** + * Video output thread private structure + */ +typedef struct vout_thread_sys_t vout_thread_sys_t; + +/** + * Video output thread descriptor + * + * Any independent video output device, such as an X11 window or a GGI device, + * is represented by a video output thread, and described using the following + * structure. + */ +struct vout_thread_t { + VLC_COMMON_MEMBERS + + /* Private vout_thread data */ + vout_thread_sys_t *p; +}; + +/* Alignment flags */ +#define VOUT_ALIGN_LEFT 0x0001 +#define VOUT_ALIGN_RIGHT 0x0002 +#define VOUT_ALIGN_HMASK 0x0003 +#define VOUT_ALIGN_TOP 0x0004 +#define VOUT_ALIGN_BOTTOM 0x0008 +#define VOUT_ALIGN_VMASK 0x000C + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * Returns a suitable vout or release the given one. + * + * If cfg->fmt is non NULL and valid, a vout will be returned, reusing cfg->vout + * is possible, otherwise it returns NULL. + * If cfg->vout is not used, it will be closed and released. + * + * You can release the returned value either by vout_Request or vout_Close() + * followed by a vlc_object_release() or shorter vout_CloseAndRelease() + * + * \param object a vlc object + * \param cfg the video configuration requested. + * \return a vout + */ +VLC_API vout_thread_t * vout_Request( vlc_object_t *object, const vout_configuration_t *cfg ); +#define vout_Request(a,b) vout_Request(VLC_OBJECT(a),b) + +/** + * This function will close a vout created by vout_Request. + * The associated vout module is closed. + * Note: It is not released yet, you'll have to call vlc_object_release() + * or use the convenient vout_CloseAndRelease(). + * + * \param p_vout the vout to close + */ +VLC_API void vout_Close( vout_thread_t *p_vout ); + +/** + * This function will close a vout created by vout_Create + * and then release it. + * + * \param p_vout the vout to close and release + */ +static inline void vout_CloseAndRelease( vout_thread_t *p_vout ) +{ + vout_Close( p_vout ); + vlc_object_release( p_vout ); +} + +/** + * This function will handle a snapshot request. + * + * pp_image, pp_picture and p_fmt can be NULL otherwise they will be + * set with returned value in case of success. + * + * pp_image will hold an encoded picture in psz_format format. + * + * p_fmt can be NULL otherwise it will be set with the format used for the + * picture before encoding. + * + * i_timeout specifies the time the function will wait for a snapshot to be + * available. + * + */ +VLC_API int vout_GetSnapshot( vout_thread_t *p_vout, + block_t **pp_image, picture_t **pp_picture, + video_format_t *p_fmt, + const char *psz_format, mtime_t i_timeout ); + +VLC_API void vout_ChangeAspectRatio( vout_thread_t *p_vout, + unsigned int i_num, unsigned int i_den ); + +/* */ +VLC_API picture_t * vout_GetPicture( vout_thread_t * ); +VLC_API void vout_PutPicture( vout_thread_t *, picture_t * ); + +/* Subpictures channels ID */ +#define VOUT_SPU_CHANNEL_INVALID (-1) /* Always fails in comparison */ +#define VOUT_SPU_CHANNEL_OSD 1 /* OSD channel is automatically cleared */ +#define VOUT_SPU_CHANNEL_AVAIL_FIRST 8 /* Registerable channels from this offset */ + +/* */ +VLC_API void vout_PutSubpicture( vout_thread_t *, subpicture_t * ); +VLC_API int vout_RegisterSubpictureChannel( vout_thread_t * ); +VLC_API void vout_FlushSubpictureChannel( vout_thread_t *, int ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_display.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_display.h new file mode 100644 index 0000000..36f1227 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_display.h @@ -0,0 +1,481 @@ +/***************************************************************************** + * vlc_vout_display.h: vout_display_t definitions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: 80761c8762d6b2acd48091507637fdcefb3317bd $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_DISPLAY_H +#define VLC_VOUT_DISPLAY_H 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * \defgroup video_display Video output display + * Video output display: output buffers and rendering + * + * \ingroup video_output + * @{ + * \file + * Video output display modules interface + */ + +/* XXX + * Do NOT use video_format_t::i_aspect but i_sar_num/den everywhere. i_aspect + * will be removed as soon as possible. + * + */ +typedef struct vout_display_t vout_display_t; +typedef struct vout_display_sys_t vout_display_sys_t; +typedef struct vout_display_owner_t vout_display_owner_t; + +/** + * Possible alignments for vout_display. + */ +typedef enum +{ + VOUT_DISPLAY_ALIGN_CENTER, + /* */ + VOUT_DISPLAY_ALIGN_LEFT, + VOUT_DISPLAY_ALIGN_RIGHT, + /* */ + VOUT_DISPLAY_ALIGN_TOP, + VOUT_DISPLAY_ALIGN_BOTTOM, +} vout_display_align_t; + +/** + * Window management state. + */ +enum { + VOUT_WINDOW_STATE_NORMAL=0, + VOUT_WINDOW_STATE_ABOVE=1, + VOUT_WINDOW_STATE_BELOW=2, + VOUT_WINDOW_STACK_MASK=3, +}; + +/** + * Initial/Current configuration for a vout_display_t + */ +typedef struct { +#if defined(_WIN32) || defined(__OS2__) + bool is_fullscreen VLC_DEPRECATED; /* Is the display fullscreen */ +#endif + + /* Display properties */ + struct { + /* Window title (may be NULL) */ + const char *title; + + /* Display size */ + unsigned width; + unsigned height; + + /* Display SAR */ + vlc_rational_t sar; + } display; + + /* Alignment of the picture inside the display */ + struct { + int horizontal; + int vertical; + } align; + + /* Do we fill up the display with the video */ + bool is_display_filled; + + /* Zoom to use + * It will be applied to the whole display if b_display_filled is set, otherwise + * only on the video source */ + struct { + int num; + int den; + } zoom; + + vlc_viewpoint_t viewpoint; +} vout_display_cfg_t; + +/** + * Information from a vout_display_t to configure + * the core behaviour. + * + * By default they are all false or NULL. + * + */ +typedef struct { + bool is_slow; /* The picture memory has slow read/write */ + bool has_double_click; /* Is double-click generated */ + bool needs_hide_mouse; /* Needs VOUT_DISPLAY_HIDE_MOUSE, + * needs to call vout_display_SendEventMouseMoved() + * or vout_display_SendEventMouseState() */ + bool has_pictures_invalid; /* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */ + const vlc_fourcc_t *subpicture_chromas; /* List of supported chromas for subpicture rendering. */ +} vout_display_info_t; + +/** + * Control query for vout_display_t + */ +enum { + /* Hide the mouse. It will be sent when + * vout_display_t::info.needs_hide_mouse is true */ + VOUT_DISPLAY_HIDE_MOUSE VLC_DEPRECATED_ENUM, + + /* Ask to reset the internal buffers after a VOUT_DISPLAY_EVENT_PICTURES_INVALID + * request. + */ + VOUT_DISPLAY_RESET_PICTURES, + +#if defined(_WIN32) || defined(__OS2__) + /* Ask the module to acknowledge/refuse the fullscreen state change after + * being requested (externally or by VOUT_DISPLAY_EVENT_FULLSCREEN */ + VOUT_DISPLAY_CHANGE_FULLSCREEN VLC_DEPRECATED_ENUM, /* bool fs */ + /* Ask the module to acknowledge/refuse the window management state change + * after being requested externally or by VOUT_DISPLAY_WINDOW_STATE */ + VOUT_DISPLAY_CHANGE_WINDOW_STATE VLC_DEPRECATED_ENUM, /* unsigned state */ +#endif + /* Ask the module to acknowledge/refuse the display size change requested + * (externally or by VOUT_DISPLAY_EVENT_DISPLAY_SIZE) */ + VOUT_DISPLAY_CHANGE_DISPLAY_SIZE, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse fill display state change after + * being requested externally */ + VOUT_DISPLAY_CHANGE_DISPLAY_FILLED, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse zoom change after being requested + * externally */ + VOUT_DISPLAY_CHANGE_ZOOM, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse source aspect ratio after being + * requested externally */ + VOUT_DISPLAY_CHANGE_SOURCE_ASPECT, + + /* Ask the module to acknowledge/refuse source crop change after being + * requested externally. + * The cropping requested is stored by video_format_t::i_x/y_offset and + * video_format_t::i_visible_width/height */ + VOUT_DISPLAY_CHANGE_SOURCE_CROP, + + /* Ask the module to acknowledge/refuse VR/360° viewing direction after + * being requested externally */ + VOUT_DISPLAY_CHANGE_VIEWPOINT, /* const vout_display_cfg_t *p_cfg */ +}; + +/** + * Event from vout_display_t + * + * Events modifiying the state may be sent multiple times. + * Only the transition will be retained and acted upon. + */ +enum { + /* TODO: + * ZOOM ? DISPLAY_FILLED ? ON_TOP ? + */ + /* */ + VOUT_DISPLAY_EVENT_PICTURES_INVALID, /* The buffer are now invalid and need to be changed */ + +#if defined(_WIN32) || defined(__OS2__) + VOUT_DISPLAY_EVENT_FULLSCREEN, + VOUT_DISPLAY_EVENT_WINDOW_STATE, +#endif + + VOUT_DISPLAY_EVENT_DISPLAY_SIZE, /* The display size need to change : int i_width, int i_height */ + + /* */ + VOUT_DISPLAY_EVENT_CLOSE, + VOUT_DISPLAY_EVENT_KEY, + + /* Full mouse state. + * You can use it OR use the other mouse events. The core will do + * the conversion. + */ + VOUT_DISPLAY_EVENT_MOUSE_STATE, + + /* Mouse event */ + VOUT_DISPLAY_EVENT_MOUSE_MOVED, + VOUT_DISPLAY_EVENT_MOUSE_PRESSED, + VOUT_DISPLAY_EVENT_MOUSE_RELEASED, + VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK, + + /* VR navigation */ + VOUT_DISPLAY_EVENT_VIEWPOINT_MOVED, +}; + +/** + * Vout owner structures + */ +struct vout_display_owner_t { + /* Private place holder for the vout_display_t creator + */ + void *sys; + + /* Event coming from the module + * + * This function is set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_SendEvent* + * wrapper. + * + * You can send it at any time i.e. from any vout_display_t functions or + * from another thread. + * Be careful, it does not ensure correct serialization if it is used + * from multiple threads. + */ + void (*event)(vout_display_t *, int, va_list); + + /* Window management + * + * These functions are set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_*Window + * wrapper */ + vout_window_t *(*window_new)(vout_display_t *, unsigned type); + void (*window_del)(vout_display_t *, vout_window_t *); +}; + +struct vout_display_t { + VLC_COMMON_MEMBERS + + /* Module */ + module_t *module; + + /* Initial and current configuration. + * You cannot modify it directly, you must use the appropriate events. + * + * It reflects the current values, i.e. after the event has been accepted + * and applied/configured if needed. + */ + const vout_display_cfg_t *cfg; + + /* video source format. + * + * Cropping is not requested while in the open function. + * You cannot change it. + */ + video_format_t source; + + /* picture_t format. + * + * You can only change it inside the module open function to + * match what you want, and when a VOUT_DISPLAY_RESET_PICTURES control + * request is made and succeeds. + * + * By default, it is equal to ::source except for the aspect ratio + * which is undefined(0) and is ignored. + */ + video_format_t fmt; + + /* Information + * + * You can only set them in the open function. + */ + vout_display_info_t info; + + /* Return a pointer over the current picture_pool_t* (mandatory). + * + * For performance reasons, it is best to provide at least count + * pictures but it is not mandatory. + * You can return NULL when you cannot/do not want to allocate + * pictures. + * The vout display module keeps the ownership of the pool and can + * destroy it only when closing or on invalid pictures control. + */ + picture_pool_t *(*pool)(vout_display_t *, unsigned count); + + /* Prepare a picture and an optional subpicture for display (optional). + * + * It is called before the next pf_display call to provide as much + * time as possible to prepare the given picture and the subpicture + * for display. + * You are guaranted that pf_display will always be called and using + * the exact same picture_t and subpicture_t. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + */ + void (*prepare)(vout_display_t *, picture_t *, subpicture_t *); + + /* Display a picture and an optional subpicture (mandatory). + * + * The picture and the optional subpicture must be displayed as soon as + * possible. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + * + * This function gives away the ownership of the picture and of the + * subpicture, so you must release them as soon as possible. + */ + void (*display)(vout_display_t *, picture_t *, subpicture_t *); + + /* Control on the module (mandatory) */ + int (*control)(vout_display_t *, int, va_list); + + /* Manage pending event (optional) */ + void (*manage)(vout_display_t *) VLC_DEPRECATED; + + /* Private place holder for the vout_display_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_display_sys_t *sys; + + /* Reserved for the vout_display_t owner. + * + * It must not be overwritten nor used directly by a module. + */ + vout_display_owner_t owner; +}; + +static inline void vout_display_SendEvent(vout_display_t *vd, int query, ...) +{ + va_list args; + va_start(args, query); + vd->owner.event(vd, query, args); + va_end(args); +} + +static inline void vout_display_SendEventDisplaySize(vout_display_t *vd, int width, int height) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_DISPLAY_SIZE, width, height); +} +static inline void vout_display_SendEventPicturesInvalid(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_PICTURES_INVALID); +} +static inline void vout_display_SendEventClose(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_CLOSE); +} +static inline void vout_display_SendEventKey(vout_display_t *vd, int key) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_KEY, key); +} +#if defined(_WIN32) || defined(__OS2__) +static inline void vout_display_SendEventFullscreen(vout_display_t *vd, bool is_fullscreen, + bool is_window_fullscreen) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_FULLSCREEN, is_fullscreen, is_window_fullscreen); +} +static inline void vout_display_SendWindowState(vout_display_t *vd, unsigned state) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_WINDOW_STATE, state); +} +#endif +/* The mouse position (State and Moved event) must be expressed against vout_display_t::source unit */ +static inline void vout_display_SendEventMouseState(vout_display_t *vd, int x, int y, int button_mask) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_STATE, x, y, button_mask); +} +static inline void vout_display_SendEventMouseMoved(vout_display_t *vd, int x, int y) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_MOVED, x, y); +} +static inline void vout_display_SendEventMousePressed(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_PRESSED, button); +} +static inline void vout_display_SendEventMouseReleased(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_RELEASED, button); +} +static inline void vout_display_SendEventMouseDoubleClick(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK); +} +static inline void vout_display_SendEventViewpointMoved(vout_display_t *vd, + const vlc_viewpoint_t *vp) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_VIEWPOINT_MOVED, vp); +} + +/** + * Asks for a new window of a given type. + */ +static inline vout_window_t *vout_display_NewWindow(vout_display_t *vd, unsigned type) +{ + return vd->owner.window_new(vd, type); +} +/** + * Deletes a window created by vout_display_NewWindow if window is non NULL + * or any unused windows otherwise. + */ +static inline void vout_display_DeleteWindow(vout_display_t *vd, + vout_window_t *window) +{ + vd->owner.window_del(vd, window); +} + +static inline bool vout_display_IsWindowed(vout_display_t *vd) +{ + vout_window_t *window = vout_display_NewWindow(vd, VOUT_WINDOW_TYPE_INVALID); + if (window != NULL) + vout_display_DeleteWindow(vd, window); + return window != NULL; +} + +/** + * Computes the default display size given the source and + * the display configuration. + * + * This asssumes that the picture is already cropped. + */ +VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height, const video_format_t *source, const vout_display_cfg_t *); + + +/** + * Structure used to store the result of a vout_display_PlacePicture. + */ +typedef struct { + int x; + int y; + unsigned width; + unsigned height; +} vout_display_place_t; + +/** + * Computes how to place a picture inside the display to respect + * the given parameters. + * This assumes that cropping is done by an external mean. + * + * \param p_place Place inside the window (window pixel unit) + * \param p_source Video source format + * \param p_cfg Display configuration + * \param b_clip If true, prevent the video to go outside the display (break zoom). + */ +VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping); + + +/** + * Helper function that applies the necessary transforms to the mouse position + * and then calls vout_display_SendEventMouseMoved. + * + * \param vd vout_display_t. + * \param orient_display The orientation of the picture as seen on screen (probably ORIENT_NORMAL). + * \param m_x Mouse x position (relative to place, origin is top left). + * \param m_y Mouse y position (relative to place, origin is top left). + * \param place Place of the picture. + */ +VLC_API void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y, + vout_display_place_t *place); + +/** @} */ +#endif /* VLC_VOUT_DISPLAY_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_osd.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_osd.h new file mode 100644 index 0000000..0cb6853 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_osd.h @@ -0,0 +1,102 @@ +/***************************************************************************** + * vlc_vout_osd.h: vout OSD + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2004-2005 M2X + * $Id: a07cd9073156d9ce0d5363543bcc3fd98a6de8f8 $ + * + * Authors: Jean-Paul Saman + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_OSD_H +#define VLC_VOUT_OSD_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup osd On-screen display + * \ingroup spu + * @{ + * \file + * Overlay text and widgets + */ + +/** + * OSD menu position and picture type defines + */ +enum +{ + /* Icons */ + OSD_PLAY_ICON = 1, + OSD_PAUSE_ICON, + OSD_SPEAKER_ICON, + OSD_MUTE_ICON, + /* Sliders */ + OSD_HOR_SLIDER, + OSD_VERT_SLIDER, +}; + +VLC_API int vout_OSDEpg( vout_thread_t *, input_item_t * ); + +/** + * \brief Write an informative message if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param position Position of the text + * \param duration Duration of the text being displayed + * \param text Text to be displayed + */ +VLC_API void vout_OSDText( vout_thread_t *vout, int channel, int position, mtime_t duration, const char *text ); + +/** + * \brief Write an informative message at the default location, + * for the default duration and only if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param format printf style formatting + * + * Provided for convenience. + */ +VLC_API void vout_OSDMessage( vout_thread_t *, int, const char *, ... ) VLC_FORMAT( 3, 4 ); + +/** + * Display a slider on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_postion Current position in the slider + * \param i_type Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER. + */ +VLC_API void vout_OSDSlider( vout_thread_t *, int, int , short ); + +/** + * Display an Icon on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_type Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON + */ +VLC_API void vout_OSDIcon( vout_thread_t *, int, short ); + +/** @} */ +#ifdef __cplusplus +} +#endif + +#endif /* VLC_VOUT_OSD_H */ + diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_window.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_window.h new file mode 100644 index 0000000..edc94fe --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_vout_window.h @@ -0,0 +1,373 @@ +/***************************************************************************** + * vlc_vout_window.h: vout_window_t definitions + ***************************************************************************** + * Copyright (C) 2008 Rémi Denis-Courmont + * Copyright (C) 2009 Laurent Aimar + * $Id: 3a613d4e4701783a43cefd299e171f95164e30e9 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_WINDOW_H +#define VLC_VOUT_WINDOW_H 1 + +#include +#include + +/** + * \defgroup video_window Video window + * \ingroup video_output + * Video output window management + * @{ + * \file + * Video output window modules interface + */ + +typedef struct vout_window_t vout_window_t; +typedef struct vout_window_sys_t vout_window_sys_t; + +struct wl_display; +struct wl_surface; + +/** + * Window handle type + */ +enum vout_window_type { + VOUT_WINDOW_TYPE_INVALID=0 /**< Invalid or unspecified window type */, + VOUT_WINDOW_TYPE_XID /**< X11 window */, + VOUT_WINDOW_TYPE_HWND /**< Win32 or OS/2 window */, + VOUT_WINDOW_TYPE_NSOBJECT /**< MacOS X view */, + VOUT_WINDOW_TYPE_ANDROID_NATIVE /**< Android native window */, + VOUT_WINDOW_TYPE_WAYLAND /**< Wayland surface */, +}; + +/** + * Control query for vout_window_t + */ +enum vout_window_control { + VOUT_WINDOW_SET_STATE, /* unsigned state */ + VOUT_WINDOW_SET_SIZE, /* unsigned i_width, unsigned i_height */ + VOUT_WINDOW_SET_FULLSCREEN, /* int b_fullscreen */ + VOUT_WINDOW_HIDE_MOUSE, /* int b_hide */ +}; + +/** + * Window mouse event type for vout_window_mouse_event_t + */ +enum vout_window_mouse_event_type { + VOUT_WINDOW_MOUSE_STATE, + VOUT_WINDOW_MOUSE_MOVED, + VOUT_WINDOW_MOUSE_PRESSED, + VOUT_WINDOW_MOUSE_RELEASED, + VOUT_WINDOW_MOUSE_DOUBLE_CLICK, +}; + +/** + * Window mouse event + */ +typedef struct vout_window_mouse_event_t +{ + enum vout_window_mouse_event_type type; + int x; + int y; + int button_mask; +} vout_window_mouse_event_t; + +typedef struct vout_window_cfg_t { + /* Window handle type */ + unsigned type; + + /* If true, a standalone window is requested */ + bool is_standalone; + bool is_fullscreen; + +#ifdef __APPLE__ + /* Window position hint */ + int x; + int y; +#endif + + /* Windows size hint */ + unsigned width; + unsigned height; + +} vout_window_cfg_t; + +typedef struct vout_window_owner { + void *sys; + void (*resized)(vout_window_t *, unsigned width, unsigned height); + void (*closed)(vout_window_t *); + void (*mouse_event)(vout_window_t *, const vout_window_mouse_event_t *mouse); +} vout_window_owner_t; + +/** + * Graphical window + * + * This structure is an abstract interface to the windowing system. + * The window is normally used to draw video (and subpictures) into, but it + * can also be used for other purpose (e.g. OpenGL visualization). + * + * The window is responsible for providing a window handle, whose exact + * meaning depends on the windowing system. It also must report some events + * such as user input (keyboard, mouse) and window resize. + * + * Finally, it must support some control requests such as for fullscreen mode. + */ +struct vout_window_t { + VLC_COMMON_MEMBERS + + /** + * Window handle type + * + * This identified the windowing system and protocol that the window + * needs to use. This also selects which member of the \ref handle union + * and the \ref display union are to be set. + * + * The possible values are defined in \ref vout_window_type. + * + * VOUT_WINDOW_TYPE_INVALID is a special placeholder type. It means that + * any windowing system is acceptable. In that case, the plugin must set + * its actual type during activation. + */ + unsigned type; + + /** + * Window handle (mandatory) + * + * This must be filled by the plugin upon activation. + * + * Depending on the \ref type above, a different member of this union is + * used. + */ + union { + void *hwnd; /**< Win32 window handle */ + uint32_t xid; /**< X11 windows ID */ + void *nsobject; /**< Mac OSX view object */ + void *anativewindow; /**< Android native window */ + struct wl_surface *wl; /**< Wayland surface (client pointer) */ + } handle; + + /** Display server (mandatory) + * + * This must be filled by the plugin upon activation. + * + * The window handle is relative to the display server. The exact meaning + * of the display server depends on the window handle type. Not all window + * handle type provide a display server field. + */ + union { + char *x11; /**< X11 display string (NULL = use default) */ + struct wl_display *wl; /**< Wayland display (client pointer) */ + } display; + + /** + * Control callback (mandatory) + * + * This callback handles some control request regarding the window. + * See \ref vout_window_control. + * + * This field should not be used directly when manipulating a window. + * vout_window_Control() should be used instead. + */ + int (*control)(vout_window_t *, int query, va_list); + + struct { + bool has_double_click; /**< Whether double click events are sent, + or need to be emulated */ + } info; + + /* Private place holder for the vout_window_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_window_sys_t *sys; + + vout_window_owner_t owner; +}; + +/** + * Creates a new window. + * + * @param module plugin name (usually "$window") + * @note If you are inside a "vout display", you must use + / vout_display_NewWindow() and vout_display_DeleteWindow() instead. + * This enables recycling windows. + */ +VLC_API vout_window_t * vout_window_New(vlc_object_t *, const char *module, const vout_window_cfg_t *, const vout_window_owner_t *); + +/** + * Deletes a window created by vout_window_New(). + * + * @note See vout_window_New() about window recycling. + */ +VLC_API void vout_window_Delete(vout_window_t *); + +void vout_window_SetInhibition(vout_window_t *window, bool enabled); + +static inline int vout_window_vaControl(vout_window_t *window, int query, + va_list ap) +{ + return window->control(window, query, ap); +} + +/** + * Reconfigures a window. + * + * @note The vout_window_* wrappers should be used instead of this function. + * + * @warning The caller must own the window, as vout_window_t is not thread safe. + */ +static inline int vout_window_Control(vout_window_t *window, int query, ...) +{ + va_list ap; + int ret; + + va_start(ap, query); + ret = vout_window_vaControl(window, query, ap); + va_end(ap); + return ret; +} + +/** + * Configures the window manager state for this window. + */ +static inline int vout_window_SetState(vout_window_t *window, unsigned state) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_STATE, state); +} + +/** + * Configures the window display (i.e. inner/useful) size. + */ +static inline int vout_window_SetSize(vout_window_t *window, + unsigned width, unsigned height) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_SIZE, width, height); +} + +/** + * Sets fullscreen mode. + */ +static inline int vout_window_SetFullScreen(vout_window_t *window, bool full) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_FULLSCREEN, full); +} + +/** + * Hide the mouse cursor + */ +static inline int vout_window_HideMouse(vout_window_t *window, bool hide) +{ + return vout_window_Control(window, VOUT_WINDOW_HIDE_MOUSE, hide); +} + +/** + * Report current window size + * + * This notifies the user of the window what the pixel dimensions of the + * window are (or should be, depending on the windowing system). + * + * \note This function is thread-safe. In case of concurrent call, it is + * undefined which one is taken into account (but at least one is). + */ +static inline void vout_window_ReportSize(vout_window_t *window, + unsigned width, unsigned height) +{ + if (window->owner.resized != NULL) + window->owner.resized(window, width, height); +} + +static inline void vout_window_ReportClose(vout_window_t *window) +{ + if (window->owner.closed != NULL) + window->owner.closed(window); +} + +static inline void vout_window_SendMouseEvent(vout_window_t *window, + const vout_window_mouse_event_t *mouse) +{ + if (window->owner.mouse_event != NULL) + window->owner.mouse_event(window, mouse); +} + +/** + * Send a full mouse state + * + * The mouse position must be expressed against window unit. You can use this + * function of others vout_window_ReportMouse*() functions. + */ +static inline void vout_window_ReportMouseState(vout_window_t *window, + int x, int y, int button_mask) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_STATE, x, y, button_mask + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse movement + * + * The mouse position must be expressed against window unit. + */ +static inline void vout_window_ReportMouseMoved(vout_window_t *window, + int x, int y) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_MOVED, x, y, 0 + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse pressed event + */ +static inline void vout_window_ReportMousePressed(vout_window_t *window, + int button) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_PRESSED, 0, 0, button, + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse released event + */ +static inline void vout_window_ReportMouseReleased(vout_window_t *window, + int button) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_RELEASED, 0, 0, button, + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse double click event + */ +static inline void vout_window_ReportMouseDoubleClick(vout_window_t *window, + int button) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_DOUBLE_CLICK, 0, 0, button, + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** @} */ +#endif /* VLC_VOUT_WINDOW_H */ diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_xlib.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_xlib.h new file mode 100644 index 0000000..b6818c1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_xlib.h @@ -0,0 +1,57 @@ +/***************************************************************************** + * vlc_xlib.h: initialization of Xlib + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XLIB_H +# define VLC_XLIB_H 1 + +# include +# include +# include +# include + +static inline bool vlc_xlib_init (vlc_object_t *obj) +{ + if (!var_InheritBool (obj, "xlib")) + return false; + + bool ok = false; + + /* XInitThreads() can be called multiple times, + * but it is not reentrant, so we need this global lock. */ + vlc_global_lock (VLC_XLIB_MUTEX); + + if (_Xglobal_lock == NULL && unlikely(_XErrorFunction != NULL)) + /* (_Xglobal_lock == NULL) => Xlib threads not initialized */ + /* (_XErrorFunction != NULL) => Xlib already in use */ + fprintf (stderr, "%s:%u:%s: Xlib not initialized for threads.\n" + "This process is probably using LibVLC incorrectly.\n" + "Pass \"--no-xlib\" to libvlc_new() to fix this.\n", + __FILE__, __LINE__, __func__); + else if (XInitThreads ()) + ok = true; + + vlc_global_unlock (VLC_XLIB_MUTEX); + + if (!ok) + msg_Err (obj, "Xlib not initialized for threads"); + return ok; +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include/plugins/vlc_xml.h b/vlcdemo/vlc/vlc3/include/plugins/vlc_xml.h new file mode 100644 index 0000000..661e76d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include/plugins/vlc_xml.h @@ -0,0 +1,121 @@ +/***************************************************************************** + * vlc_xml.h: XML abstraction layer + ***************************************************************************** + * Copyright (C) 2004-2010 VLC authors and VideoLAN + * + * Author: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XML_H +#define VLC_XML_H + +/** +* \file +* This file defines functions and structures to handle xml tags in vlc +* +*/ + +# ifdef __cplusplus +extern "C" { +# endif + +struct xml_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + xml_sys_t *p_sys; + + void (*pf_catalog_load) ( xml_t *, const char * ); + void (*pf_catalog_add) ( xml_t *, const char *, const char *, + const char * ); +}; + +VLC_API xml_t * xml_Create( vlc_object_t * ) VLC_USED; +#define xml_Create( a ) xml_Create( VLC_OBJECT(a) ) +VLC_API void xml_Delete( xml_t * ); + +static inline void xml_CatalogLoad( xml_t *xml, const char *catalog ) +{ + xml->pf_catalog_load( xml, catalog ); +} + +static inline void xml_CatalogAdd( xml_t *xml, const char *type, + const char *orig, const char *value ) +{ + xml->pf_catalog_add( xml, type, orig, value ); +} + + +struct xml_reader_t +{ + VLC_COMMON_MEMBERS + + xml_reader_sys_t *p_sys; + stream_t *p_stream; + module_t *p_module; + + int (*pf_next_node) ( xml_reader_t *, const char ** ); + const char *(*pf_next_attr) ( xml_reader_t *, const char ** ); + + int (*pf_use_dtd) ( xml_reader_t * ); + int (*pf_is_empty) ( xml_reader_t * ); +}; + +VLC_API xml_reader_t * xml_ReaderCreate(vlc_object_t *, stream_t *) VLC_USED; +#define xml_ReaderCreate( a, s ) xml_ReaderCreate(VLC_OBJECT(a), s) +VLC_API void xml_ReaderDelete(xml_reader_t *); +VLC_API xml_reader_t * xml_ReaderReset(xml_reader_t *, stream_t *) VLC_USED; + +static inline int xml_ReaderNextNode( xml_reader_t *reader, const char **pval ) +{ + return reader->pf_next_node( reader, pval ); +} + +static inline const char *xml_ReaderNextAttr( xml_reader_t *reader, + const char **pval ) +{ + return reader->pf_next_attr( reader, pval ); +} + +static inline int xml_ReaderUseDTD( xml_reader_t *reader ) +{ + return reader->pf_use_dtd( reader ); +} + +static inline int xml_ReaderIsEmptyElement( xml_reader_t *reader ) +{ + if(reader->pf_is_empty == NULL) + return -2; + + return reader->pf_is_empty( reader ); +} + +enum { + XML_READER_ERROR=-1, + XML_READER_NONE=0, + XML_READER_STARTELEM, + XML_READER_ENDELEM, + XML_READER_TEXT, +}; + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/deprecated.h b/vlcdemo/vlc/vlc3/include64/deprecated.h new file mode 100644 index 0000000..f47cea7 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/deprecated.h @@ -0,0 +1,489 @@ +/***************************************************************************** + * deprecated.h: libvlc deprecated API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 27323a434498604ca281900c3e4087a42d22a5d8 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_DEPRECATED_H +#define LIBVLC_DEPRECATED_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \ingroup libvlc libvlc_media_player + * @{ + */ + +/** + * Get movie fps rate + * + * This function is provided for backward compatibility. It cannot deal with + * multiple video tracks. In LibVLC versions prior to 3.0, it would also fail + * if the file format did not convey the frame rate explicitly. + * + * \deprecated Consider using libvlc_media_tracks_get() instead. + * + * \param p_mi the Media Player + * \return frames per second (fps) for this playing movie, or 0 if unspecified + */ +LIBVLC_DEPRECATED +LIBVLC_API float libvlc_media_player_get_fps( libvlc_media_player_t *p_mi ); + +/** end bug */ + +/** + * \deprecated Use libvlc_media_player_set_nsobject() instead + */ +LIBVLC_DEPRECATED +LIBVLC_API void libvlc_media_player_set_agl ( libvlc_media_player_t *p_mi, uint32_t drawable ); + +/** + * \deprecated Use libvlc_media_player_get_nsobject() instead + */ +LIBVLC_DEPRECATED +LIBVLC_API uint32_t libvlc_media_player_get_agl ( libvlc_media_player_t *p_mi ); + +/** + * \deprecated Use libvlc_track_description_list_release() instead + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_track_description_release( libvlc_track_description_t *p_track_description ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_video + * @{ + */ + +/** + * Get current video height. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel height or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_height( libvlc_media_player_t *p_mi ); + +/** + * Get current video width. + * \deprecated Use libvlc_video_get_size() instead. + * + * \param p_mi the media player + * \return the video pixel width or 0 if not applicable + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_video_get_width( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available titles. + * + * \param p_mi the media player + * \return list containing description of available titles. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_track_description_t * + libvlc_video_get_title_description( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available chapters for specific title. + * + * \param p_mi the media player + * \param i_title selected title + * \return list containing description of available chapter for title i_title. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_track_description_t * + libvlc_video_get_chapter_description( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Set new video subtitle file. + * \deprecated Use libvlc_media_player_add_slave() instead. + * + * \param p_mi the media player + * \param psz_subtitle new video subtitle file + * \return the success status (boolean) + */ +LIBVLC_DEPRECATED LIBVLC_API int +libvlc_video_set_subtitle_file( libvlc_media_player_t *p_mi, const char *psz_subtitle ); + +/** + * Toggle teletext transparent status on video output. + * \deprecated use libvlc_video_set_teletext() instead. + * + * \param p_mi the media player + */ +LIBVLC_DEPRECATED LIBVLC_API void +libvlc_toggle_teletext( libvlc_media_player_t *p_mi ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_audio + * @{ + */ + +/** + * Backward compatibility stub. Do not use in new code. + * \deprecated Use libvlc_audio_output_device_list_get() instead. + * \return always 0. + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_audio_output_device_count( libvlc_instance_t *p_instance, const char *psz_audio_output ); + +/** + * Backward compatibility stub. Do not use in new code. + * \deprecated Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_longname( libvlc_instance_t *p_instance, const char *psz_output, + int i_device ); + +/** + * Backward compatibility stub. Do not use in new code. + * \deprecated Use libvlc_audio_output_device_list_get() instead. + * \return always NULL. + */ +LIBVLC_DEPRECATED LIBVLC_API +char *libvlc_audio_output_device_id( libvlc_instance_t *p_instance, const char *psz_audio_output, int i_device ); + +/** + * Stub for backward compatibility. + * \return always -1. + */ +LIBVLC_DEPRECATED +LIBVLC_API int libvlc_audio_output_get_device_type( libvlc_media_player_t *p_mi ); + +/** + * Stub for backward compatibility. + */ +LIBVLC_DEPRECATED +LIBVLC_API void libvlc_audio_output_set_device_type( libvlc_media_player_t *p_mp, + int device_type ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_media + * @{ + */ + +/** + * Parse a media. + * + * This fetches (local) art, meta data and tracks information. + * The method is synchronous. + * + * \deprecated This function could block indefinitely. + * Use libvlc_media_parse_with_options() instead + * + * \see libvlc_media_parse_with_options + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_DEPRECATED LIBVLC_API void +libvlc_media_parse( libvlc_media_t *p_md ); + +/** + * Parse a media. + * + * This fetches (local) art, meta data and tracks information. + * The method is the asynchronous of libvlc_media_parse(). + * + * To track when this is over you can listen to libvlc_MediaParsedChanged + * event. However if the media was already parsed you will not receive this + * event. + * + * \deprecated You can't be sure to receive the libvlc_MediaParsedChanged + * event (you can wait indefinitely for this event). + * Use libvlc_media_parse_with_options() instead + * + * \see libvlc_media_parse + * \see libvlc_MediaParsedChanged + * \see libvlc_media_get_meta + * \see libvlc_media_get_tracks_info + * + * \param p_md media descriptor object + */ +LIBVLC_DEPRECATED LIBVLC_API void +libvlc_media_parse_async( libvlc_media_t *p_md ); + +/** + * Return true is the media descriptor object is parsed + * + * \deprecated This can return true in case of failure. + * Use libvlc_media_get_parsed_status() instead + * + * \see libvlc_MediaParsedChanged + * + * \param p_md media descriptor object + * \return true if media object has been parsed otherwise it returns false + * + * \libvlc_return_bool + */ +LIBVLC_DEPRECATED LIBVLC_API int + libvlc_media_is_parsed( libvlc_media_t *p_md ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \deprecated Use libvlc_media_tracks_get() instead + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed by the caller) [OUT] + * + * \return the number of Elementary Streams + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_media_get_tracks_info( libvlc_media_t *p_md, + libvlc_media_track_info_t **tracks ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_media_list + * @{ + */ + +LIBVLC_DEPRECATED int + libvlc_media_list_add_file_content( libvlc_media_list_t * p_ml, + const char * psz_uri ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_media_discoverer + * @{ + */ + +/** + * \deprecated Use libvlc_media_discoverer_new() and libvlc_media_discoverer_start(). + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_media_discoverer_t * +libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, + const char * psz_name ); + +/** + * Get media service discover object its localized name. + * + * \deprecated Useless, use libvlc_media_discoverer_list_get() to get the + * longname of the service discovery. + * + * \param p_mdis media discover object + * \return localized name or NULL if the media_discoverer is not started + */ +LIBVLC_DEPRECATED LIBVLC_API char * +libvlc_media_discoverer_localized_name( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get event manager from media service discover object. + * + * \deprecated Useless, media_discoverer events are only triggered when calling + * libvlc_media_discoverer_start() and libvlc_media_discoverer_stop(). + * + * \param p_mdis media service discover object + * \return event manager object. + */ +LIBVLC_DEPRECATED LIBVLC_API libvlc_event_manager_t * +libvlc_media_discoverer_event_manager( libvlc_media_discoverer_t * p_mdis ); + +/** @}*/ + +/** + * \ingroup libvlc libvlc_core + * @{ + */ + +/** + * Waits until an interface causes the instance to exit. + * You should start at least one interface first, using libvlc_add_intf(). + * + * \param p_instance the instance + * \warning This function wastes one thread doing basically nothing. + * libvlc_set_exit_handler() should be used instead. + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_wait( libvlc_instance_t *p_instance ); + + +/** @}*/ + +/** + * \ingroup libvlc_core + * \defgroup libvlc_log_deprecated LibVLC logging (legacy) + * @{ + */ + +/** This structure is opaque. It represents a libvlc log iterator */ +typedef struct libvlc_log_iterator_t libvlc_log_iterator_t; + +typedef struct libvlc_log_message_t +{ + int i_severity; /* 0=INFO, 1=ERR, 2=WARN, 3=DBG */ + const char *psz_type; /* module type */ + const char *psz_name; /* module name */ + const char *psz_header; /* optional header */ + const char *psz_message; /* message */ +} libvlc_log_message_t; + +/** + * Always returns minus one. + * This function is only provided for backward compatibility. + * + * \param p_instance ignored + * \return always -1 + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_get_log_verbosity( const libvlc_instance_t *p_instance ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_instance ignored + * \param level ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_set_log_verbosity( libvlc_instance_t *p_instance, unsigned level ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_instance libvlc instance + * \return an unique pointer or NULL on error + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_t *libvlc_log_open( libvlc_instance_t *p_instance ); + +/** + * Frees memory allocated by libvlc_log_open(). + * + * \param p_log libvlc log instance or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_close( libvlc_log_t *p_log ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_log ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +unsigned libvlc_log_count( const libvlc_log_t *p_log ); + +/** + * This function does nothing. + * It is only provided for backward compatibility. + * + * \param p_log ignored + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_clear( libvlc_log_t *p_log ); + +/** + * This function does nothing useful. + * It is only provided for backward compatibility. + * + * \param p_log ignored + * \return an unique pointer or NULL on error or if the parameter was NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_iterator_t *libvlc_log_get_iterator( const libvlc_log_t *p_log ); + +/** + * Frees memory allocated by libvlc_log_get_iterator(). + * + * \param p_iter libvlc log iterator or NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_log_iterator_free( libvlc_log_iterator_t *p_iter ); + +/** + * Always returns zero. + * This function is only provided for backward compatibility. + * + * \param p_iter ignored + * \return always zero + */ +LIBVLC_DEPRECATED LIBVLC_API +int libvlc_log_iterator_has_next( const libvlc_log_iterator_t *p_iter ); + +/** + * Always returns NULL. + * This function is only provided for backward compatibility. + * + * \param p_iter libvlc log iterator or NULL + * \param p_buf ignored + * \return always NULL + */ +LIBVLC_DEPRECATED LIBVLC_API +libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterator_t *p_iter, + libvlc_log_message_t *p_buf ); + +/** @}*/ + +/** + * \ingroup libvlc + * \defgroup libvlc_playlist LibVLC playlist (legacy) + * @deprecated Use @ref libvlc_media_list instead. + * @{ + * \file + * LibVLC deprecated playlist API + */ + +/** + * Start playing (if there is any item in the playlist). + * + * Additionnal playlist item options can be specified for addition to the + * item before it is played. + * + * \param p_instance the playlist instance + * \param i_id the item to play. If this is a negative number, the next + * item will be selected. Otherwise, the item with the given ID will be + * played + * \param i_options the number of options to add to the item + * \param ppsz_options the options to add to the item + */ +LIBVLC_DEPRECATED LIBVLC_API +void libvlc_playlist_play( libvlc_instance_t *p_instance, int i_id, + int i_options, char **ppsz_options ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_DEPRECATED_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc.h b/vlcdemo/vlc/vlc3/include64/libvlc.h new file mode 100644 index 0000000..41e20dd --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc.h @@ -0,0 +1,580 @@ +/***************************************************************************** + * libvlc.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: b12d900469fa6438c41421f2ac7697b93ffc8a35 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \defgroup libvlc LibVLC + * LibVLC is the external programming interface of the VLC media player. + * It is used to embed VLC into other applications or frameworks. + * @{ + * \file + * LibVLC core external API + */ + +#ifndef VLC_LIBVLC_H +#define VLC_LIBVLC_H 1 + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define LIBVLC_API __declspec(dllexport) +#elif defined (__GNUC__) && (__GNUC__ >= 4) +# define LIBVLC_API __attribute__((visibility("default"))) +#else +# define LIBVLC_API +#endif + +#ifdef __LIBVLC__ +/* Avoid unhelpful warnings from libvlc with our deprecated APIs */ +# define LIBVLC_DEPRECATED +#elif defined(__GNUC__) && \ + (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) +# define LIBVLC_DEPRECATED __attribute__((deprecated)) +#else +# define LIBVLC_DEPRECATED +#endif + +#include +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_core LibVLC core + * \ingroup libvlc + * Before it can do anything useful, LibVLC must be initialized. + * You can create one (or more) instance(s) of LibVLC in a given process, + * with libvlc_new() and destroy them with libvlc_release(). + * + * \version Unless otherwise stated, these functions are available + * from LibVLC versions numbered 1.1.0 or more. + * Earlier versions (0.9.x and 1.0.x) are not compatible. + * @{ + */ + +/** This structure is opaque. It represents a libvlc instance */ +typedef struct libvlc_instance_t libvlc_instance_t; + +typedef int64_t libvlc_time_t; + +/** \defgroup libvlc_error LibVLC error handling + * @{ + */ + +/** + * A human-readable error message for the last LibVLC error in the calling + * thread. The resulting string is valid until another error occurs (at least + * until the next LibVLC call). + * + * @warning + * This will be NULL if there was no error. + */ +LIBVLC_API const char *libvlc_errmsg (void); + +/** + * Clears the LibVLC error status for the current thread. This is optional. + * By default, the error status is automatically overridden when a new error + * occurs, and destroyed when the thread exits. + */ +LIBVLC_API void libvlc_clearerr (void); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param ap the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_vprinterr (const char *fmt, va_list ap); + +/** + * Sets the LibVLC error status and message for the current thread. + * Any previous error is overridden. + * \param fmt the format string + * \param args the arguments + * \return a nul terminated string in any case + */ +LIBVLC_API const char *libvlc_printerr (const char *fmt, ...); + +/**@} */ + +/** + * Create and initialize a libvlc instance. + * This functions accept a list of "command line" arguments similar to the + * main(). These arguments affect the LibVLC instance default configuration. + * + * \note + * LibVLC may create threads. Therefore, any thread-unsafe process + * initialization must be performed before calling libvlc_new(). In particular + * and where applicable: + * - setlocale() and textdomain(), + * - setenv(), unsetenv() and putenv(), + * - with the X11 display system, XInitThreads() + * (see also libvlc_media_player_set_xwindow()) and + * - on Microsoft Windows, SetErrorMode(). + * - sigprocmask() shall never be invoked; pthread_sigmask() can be used. + * + * On POSIX systems, the SIGCHLD signal must not be ignored, i.e. the + * signal handler must set to SIG_DFL or a function pointer, not SIG_IGN. + * Also while LibVLC is active, the wait() function shall not be called, and + * any call to waitpid() shall use a strictly positive value for the first + * parameter (i.e. the PID). Failure to follow those rules may lead to a + * deadlock or a busy loop. + * Also on POSIX systems, it is recommended that the SIGPIPE signal be blocked, + * even if it is not, in principles, necessary, e.g.: + * @code + sigset_t set; + + signal(SIGCHLD, SIG_DFL); + sigemptyset(&set); + sigaddset(&set, SIGPIPE); + pthread_sigmask(SIG_BLOCK, &set, NULL); + * @endcode + * + * On Microsoft Windows Vista/2008, the process error mode + * SEM_FAILCRITICALERRORS flag must be set before using LibVLC. + * On later versions, that is optional and unnecessary. + * Also on Microsoft Windows (Vista and any later version), setting the default + * DLL directories to SYSTEM32 exclusively is strongly recommended for + * security reasons: + * @code + SetErrorMode(SEM_FAILCRITICALERRORS); + SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); + * @endcode + * + * \version + * Arguments are meant to be passed from the command line to LibVLC, just like + * VLC media player does. The list of valid arguments depends on the LibVLC + * version, the operating system and platform, and set of available LibVLC + * plugins. Invalid or unsupported arguments will cause the function to fail + * (i.e. return NULL). Also, some arguments may alter the behaviour or + * otherwise interfere with other LibVLC functions. + * + * \warning + * There is absolutely no warranty or promise of forward, backward and + * cross-platform compatibility with regards to libvlc_new() arguments. + * We recommend that you do not use them, other than when debugging. + * + * \param argc the number of arguments (should be 0) + * \param argv list of arguments (should be NULL) + * \return the libvlc instance or NULL in case of error + */ +LIBVLC_API libvlc_instance_t * +libvlc_new( int argc , const char *const *argv ); + +/** + * Decrement the reference count of a libvlc instance, and destroy it + * if it reaches zero. + * + * \param p_instance the instance to destroy + */ +LIBVLC_API void libvlc_release( libvlc_instance_t *p_instance ); + +/** + * Increments the reference count of a libvlc instance. + * The initial reference count is 1 after libvlc_new() returns. + * + * \param p_instance the instance to reference + */ +LIBVLC_API void libvlc_retain( libvlc_instance_t *p_instance ); + +/** + * Try to start a user interface for the libvlc instance. + * + * \param p_instance the instance + * \param name interface name, or NULL for default + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_add_intf( libvlc_instance_t *p_instance, const char *name ); + +/** + * Registers a callback for the LibVLC exit event. This is mostly useful if + * the VLC playlist and/or at least one interface are started with + * libvlc_playlist_play() or libvlc_add_intf() respectively. + * Typically, this function will wake up your application main loop (from + * another thread). + * + * \note This function should be called before the playlist or interface are + * started. Otherwise, there is a small race condition: the exit event could + * be raised before the handler is registered. + * + * \param p_instance LibVLC instance + * \param cb callback to invoke when LibVLC wants to exit, + * or NULL to disable the exit handler (as by default) + * \param opaque data pointer for the callback + * \warning This function and libvlc_wait() cannot be used at the same time. + */ +LIBVLC_API +void libvlc_set_exit_handler( libvlc_instance_t *p_instance, + void (*cb) (void *), void *opaque ); + +/** + * Sets the application name. LibVLC passes this as the user agent string + * when a protocol requires it. + * + * \param p_instance LibVLC instance + * \param name human-readable application name, e.g. "FooBar player 1.2.3" + * \param http HTTP User Agent, e.g. "FooBar/1.2.3 Python/2.6.0" + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_set_user_agent( libvlc_instance_t *p_instance, + const char *name, const char *http ); + +/** + * Sets some meta-information about the application. + * See also libvlc_set_user_agent(). + * + * \param p_instance LibVLC instance + * \param id Java-style application identifier, e.g. "com.acme.foobar" + * \param version application version numbers, e.g. "1.2.3" + * \param icon application icon name, e.g. "foobar" + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API +void libvlc_set_app_id( libvlc_instance_t *p_instance, const char *id, + const char *version, const char *icon ); + +/** + * Retrieve libvlc version. + * + * Example: "1.1.0-git The Luggage" + * + * \return a string containing the libvlc version + */ +LIBVLC_API const char * libvlc_get_version(void); + +/** + * Retrieve libvlc compiler version. + * + * Example: "gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu6)" + * + * \return a string containing the libvlc compiler version + */ +LIBVLC_API const char * libvlc_get_compiler(void); + +/** + * Retrieve libvlc changeset. + * + * Example: "aa9bce0bc4" + * + * \return a string containing the libvlc changeset + */ +LIBVLC_API const char * libvlc_get_changeset(void); + +/** + * Frees an heap allocation returned by a LibVLC function. + * If you know you're using the same underlying C run-time as the LibVLC + * implementation, then you can call ANSI C free() directly instead. + * + * \param ptr the pointer + */ +LIBVLC_API void libvlc_free( void *ptr ); + +/** \defgroup libvlc_event LibVLC asynchronous events + * LibVLC emits asynchronous events. + * + * Several LibVLC objects (such @ref libvlc_instance_t as + * @ref libvlc_media_player_t) generate events asynchronously. Each of them + * provides @ref libvlc_event_manager_t event manager. You can subscribe to + * events with libvlc_event_attach() and unsubscribe with + * libvlc_event_detach(). + * @{ + */ + +/** + * Event manager that belongs to a libvlc object, and from whom events can + * be received. + */ +typedef struct libvlc_event_manager_t libvlc_event_manager_t; + +struct libvlc_event_t; + +/** + * Type of a LibVLC event. + */ +typedef int libvlc_event_type_t; + +/** + * Callback function notification + * \param p_event the event triggering the callback + */ +typedef void ( *libvlc_callback_t )( const struct libvlc_event_t *p_event, void *p_data ); + +/** + * Register for an event notification. + * + * \param p_event_manager the event manager to which you want to attach to. + * Generally it is obtained by vlc_my_object_event_manager() where + * my_object is the object you want to listen to. + * \param i_event_type the desired event to which we want to listen + * \param f_callback the function to call when i_event_type occurs + * \param user_data user provided data to carry with the event + * \return 0 on success, ENOMEM on error + */ +LIBVLC_API int libvlc_event_attach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *user_data ); + +/** + * Unregister an event notification. + * + * \param p_event_manager the event manager + * \param i_event_type the desired event to which we want to unregister + * \param f_callback the function to call when i_event_type occurs + * \param p_user_data user provided data to carry with the event + */ +LIBVLC_API void libvlc_event_detach( libvlc_event_manager_t *p_event_manager, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *p_user_data ); + +/** + * Get an event's type name. + * + * \param event_type the desired event + */ +LIBVLC_API const char * libvlc_event_type_name( libvlc_event_type_t event_type ); + +/** @} */ + +/** \defgroup libvlc_log LibVLC logging + * libvlc_log_* functions provide access to the LibVLC messages log. + * This is used for logging and debugging. + * @{ + */ + +/** + * Logging messages level. + * \note Future LibVLC versions may define new levels. + */ +enum libvlc_log_level +{ + LIBVLC_DEBUG=0, /**< Debug message */ + LIBVLC_NOTICE=2, /**< Important informational message */ + LIBVLC_WARNING=3, /**< Warning (potential error) message */ + LIBVLC_ERROR=4 /**< Error message */ +}; + +typedef struct vlc_log_t libvlc_log_t; + +/** + * Gets log message debug infos. + * + * This function retrieves self-debug information about a log message: + * - the name of the VLC module emitting the message, + * - the name of the source code module (i.e. file) and + * - the line number within the source code module. + * + * The returned module name and file name will be NULL if unknown. + * The returned line number will similarly be zero if unknown. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param module module name storage (or NULL) [OUT] + * \param file source code file name storage (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_context(const libvlc_log_t *ctx, + const char **module, const char **file, unsigned *line); + +/** + * Gets log message info. + * + * This function retrieves meta-information about a log message: + * - the type name of the VLC object emitting the message, + * - the object header if any, and + * - a temporaly-unique object identifier. + * + * This information is mainly meant for manual troubleshooting. + * + * The returned type name may be "generic" if unknown, but it cannot be NULL. + * The returned header will be NULL if unset; in current versions, the header + * is used to distinguish for VLM inputs. + * The returned object ID will be zero if the message is not associated with + * any VLC object. + * + * \param ctx message context (as passed to the @ref libvlc_log_cb callback) + * \param name object name storage (or NULL) [OUT] + * \param header object header (or NULL) [OUT] + * \param line source code file line number storage (or NULL) [OUT] + * \warning The returned module name and source code file name, if non-NULL, + * are only valid until the logging callback returns. + * + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_get_object(const libvlc_log_t *ctx, + const char **name, const char **header, uintptr_t *id); + +/** + * Callback prototype for LibVLC log message handler. + * + * \param data data pointer as given to libvlc_log_set() + * \param level message level (@ref libvlc_log_level) + * \param ctx message context (meta-information about the message) + * \param fmt printf() format string (as defined by ISO C11) + * \param args variable argument list for the format + * \note Log message handlers must be thread-safe. + * \warning The message context pointer, the format string parameters and the + * variable arguments are only valid until the callback returns. + */ +typedef void (*libvlc_log_cb)(void *data, int level, const libvlc_log_t *ctx, + const char *fmt, va_list args); + +/** + * Unsets the logging callback. + * + * This function deregisters the logging callback for a LibVLC instance. + * This is rarely needed as the callback is implicitly unset when the instance + * is destroyed. + * + * \note This function will wait for any pending callbacks invocation to + * complete (causing a deadlock if called from within the callback). + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_unset( libvlc_instance_t *p_instance ); + +/** + * Sets the logging callback for a LibVLC instance. + * + * This function is thread-safe: it will wait for any pending callbacks + * invocation to complete. + * + * \param cb callback function pointer + * \param data opaque data pointer for the callback function + * + * \note Some log messages (especially debug) are emitted by LibVLC while + * is being initialized. These messages cannot be captured with this interface. + * + * \warning A deadlock may occur if this function is called from the callback. + * + * \param p_instance libvlc instance + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set( libvlc_instance_t *p_instance, + libvlc_log_cb cb, void *data ); + + +/** + * Sets up logging to a file. + * \param p_instance libvlc instance + * \param stream FILE pointer opened for writing + * (the FILE pointer must remain valid until libvlc_log_unset()) + * \version LibVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_log_set_file( libvlc_instance_t *p_instance, FILE *stream ); + +/** @} */ + +/** + * Description of a module. + */ +typedef struct libvlc_module_description_t +{ + char *psz_name; + char *psz_shortname; + char *psz_longname; + char *psz_help; + struct libvlc_module_description_t *p_next; +} libvlc_module_description_t; + +/** + * Release a list of module descriptions. + * + * \param p_list the list to be released + */ +LIBVLC_API +void libvlc_module_description_list_release( libvlc_module_description_t *p_list ); + +/** + * Returns a list of audio filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_audio_filter_list_get( libvlc_instance_t *p_instance ); + +/** + * Returns a list of video filters that are available. + * + * \param p_instance libvlc instance + * + * \return a list of module descriptions. It should be freed with libvlc_module_description_list_release(). + * In case of an error, NULL is returned. + * + * \see libvlc_module_description_t + * \see libvlc_module_description_list_release + */ +LIBVLC_API +libvlc_module_description_t *libvlc_video_filter_list_get( libvlc_instance_t *p_instance ); + +/** @} */ + +/** \defgroup libvlc_clock LibVLC time + * These functions provide access to the LibVLC time/clock. + * @{ + */ + +/** + * Return the current time as defined by LibVLC. The unit is the microsecond. + * Time increases monotonically (regardless of time zone changes and RTC + * adjustements). + * The origin is arbitrary but consistent across the whole system + * (e.g. the system uptim, the time since the system was booted). + * \note On systems that support it, the POSIX monotonic clock is used. + */ +LIBVLC_API +int64_t libvlc_clock(void); + +/** + * Return the delay (in microseconds) until a certain timestamp. + * \param pts timestamp + * \return negative if timestamp is in the past, + * positive if it is in the future + */ +static inline int64_t libvlc_delay(int64_t pts) +{ + return pts - libvlc_clock(); +} + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /** @} */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_dialog.h b/vlcdemo/vlc/vlc3/include64/libvlc_dialog.h new file mode 100644 index 0000000..b176b93 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_dialog.h @@ -0,0 +1,241 @@ +/***************************************************************************** + * libvlc_dialog.h: libvlc dialog API + ***************************************************************************** + * Copyright © 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_DIALOG_H +#define LIBVLC_DIALOG_H 1 + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct libvlc_dialog_id libvlc_dialog_id; + +/** + * @defgroup libvlc_dialog LibVLC dialog + * @ingroup libvlc + * @{ + * @file + * LibVLC dialog external API + */ + +typedef enum libvlc_dialog_question_type +{ + LIBVLC_DIALOG_QUESTION_NORMAL, + LIBVLC_DIALOG_QUESTION_WARNING, + LIBVLC_DIALOG_QUESTION_CRITICAL, +} libvlc_dialog_question_type; + +/** + * Dialog callbacks to be implemented + */ +typedef struct libvlc_dialog_cbs +{ + /** + * Called when an error message needs to be displayed + * + * @param p_data opaque pointer for the callback + * @param psz_title title of the dialog + * @param psz_text text of the dialog + */ + void (*pf_display_error)(void *p_data, const char *psz_title, + const char *psz_text); + + /** + * Called when a login dialog needs to be displayed + * + * You can interact with this dialog by calling libvlc_dialog_post_login() + * to post an answer or libvlc_dialog_dismiss() to cancel this dialog. + * + * @note to receive this callback, libvlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param psz_default_username user name that should be set on the user form + * @param b_ask_store if true, ask the user if he wants to save the + * credentials + */ + void (*pf_display_login)(void *p_data, libvlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + const char *psz_default_username, + bool b_ask_store); + + /** + * Called when a question dialog needs to be displayed + * + * You can interact with this dialog by calling libvlc_dialog_post_action() + * to post an answer or libvlc_dialog_dismiss() to cancel this dialog. + * + * @note to receive this callback, libvlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param i_type question type (or severity) of the dialog + * @param psz_cancel text of the cancel button + * @param psz_action1 text of the first button, if NULL, don't display this + * button + * @param psz_action2 text of the second button, if NULL, don't display + * this button + */ + void (*pf_display_question)(void *p_data, libvlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + libvlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2); + + /** + * Called when a progress dialog needs to be displayed + * + * If cancellable (psz_cancel != NULL), you can cancel this dialog by + * calling libvlc_dialog_dismiss() + * + * @note to receive this callback, libvlc_dialog_cbs.pf_cancel and + * libvlc_dialog_cbs.pf_update_progress should not be NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param b_indeterminate true if the progress dialog is indeterminate + * @param f_position initial position of the progress bar (between 0.0 and + * 1.0) + * @param psz_cancel text of the cancel button, if NULL the dialog is not + * cancellable + */ + void (*pf_display_progress)(void *p_data, libvlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + bool b_indeterminate, float f_position, + const char *psz_cancel); + + /** + * Called when a displayed dialog needs to be cancelled + * + * The implementation must call libvlc_dialog_dismiss() to really release + * the dialog. + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + */ + void (*pf_cancel)(void *p_data, libvlc_dialog_id *p_id); + + /** + * Called when a progress dialog needs to be updated + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + * @param f_position osition of the progress bar (between 0.0 and 1.0) + * @param psz_text new text of the progress dialog + */ + void (*pf_update_progress)(void *p_data, libvlc_dialog_id *p_id, + float f_position, const char *psz_text); +} libvlc_dialog_cbs; + +/** + * Register callbacks in order to handle VLC dialogs + * + * @version LibVLC 3.0.0 and later. + * + * @param p_cbs a pointer to callbacks, or NULL to unregister callbacks. + * @param p_data opaque pointer for the callback + */ +LIBVLC_API void +libvlc_dialog_set_callbacks(libvlc_instance_t *p_instance, + const libvlc_dialog_cbs *p_cbs, void *p_data); + +/** + * Associate an opaque pointer with the dialog id + * + * @version LibVLC 3.0.0 and later. + */ +LIBVLC_API void +libvlc_dialog_set_context(libvlc_dialog_id *p_id, void *p_context); + +/** + * Return the opaque pointer associated with the dialog id + * + * @version LibVLC 3.0.0 and later. + */ +LIBVLC_API void * +libvlc_dialog_get_context(libvlc_dialog_id *p_id); + +/** + * Post a login answer + * + * After this call, p_id won't be valid anymore + * + * @see libvlc_dialog_cbs.pf_display_login + * + * @version LibVLC 3.0.0 and later. + * + * @param p_id id of the dialog + * @param psz_username valid and non empty string + * @param psz_password valid string (can be empty) + * @param b_store if true, store the credentials + * @return 0 on success, or -1 on error + */ +LIBVLC_API int +libvlc_dialog_post_login(libvlc_dialog_id *p_id, const char *psz_username, + const char *psz_password, bool b_store); + +/** + * Post a question answer + * + * After this call, p_id won't be valid anymore + * + * @see libvlc_dialog_cbs.pf_display_question + * + * @version LibVLC 3.0.0 and later. + * + * @param p_id id of the dialog + * @param i_action 1 for action1, 2 for action2 + * @return 0 on success, or -1 on error + */ +LIBVLC_API int +libvlc_dialog_post_action(libvlc_dialog_id *p_id, int i_action); + +/** + * Dismiss a dialog + * + * After this call, p_id won't be valid anymore + * + * @see libvlc_dialog_cbs.pf_cancel + * + * @version LibVLC 3.0.0 and later. + * + * @param p_id id of the dialog + * @return 0 on success, or -1 on error + */ +LIBVLC_API int +libvlc_dialog_dismiss(libvlc_dialog_id *p_id); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* LIBVLC_DIALOG_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_events.h b/vlcdemo/vlc/vlc3/include64/libvlc_events.h new file mode 100644 index 0000000..f8b0e9b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_events.h @@ -0,0 +1,296 @@ +/***************************************************************************** + * libvlc_events.h: libvlc_events external API structure + ***************************************************************************** + * Copyright (C) 1998-2010 VLC authors and VideoLAN + * $Id $ + * + * Authors: Filippo Carone + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_EVENTS_H +#define LIBVLC_EVENTS_H 1 + +/** + * \file + * This file defines libvlc_event external API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct libvlc_renderer_item_t libvlc_renderer_item_t; + +/** + * \ingroup libvlc_event + * @{ + */ + +/** + * Event types + */ +enum libvlc_event_e { + /* Append new event types at the end of a category. + * Do not remove, insert or re-order any entry. + * Keep this in sync with lib/event.c:libvlc_event_type_name(). */ + libvlc_MediaMetaChanged=0, + libvlc_MediaSubItemAdded, + libvlc_MediaDurationChanged, + libvlc_MediaParsedChanged, + libvlc_MediaFreed, + libvlc_MediaStateChanged, + libvlc_MediaSubItemTreeAdded, + + libvlc_MediaPlayerMediaChanged=0x100, + libvlc_MediaPlayerNothingSpecial, + libvlc_MediaPlayerOpening, + libvlc_MediaPlayerBuffering, + libvlc_MediaPlayerPlaying, + libvlc_MediaPlayerPaused, + libvlc_MediaPlayerStopped, + libvlc_MediaPlayerForward, + libvlc_MediaPlayerBackward, + libvlc_MediaPlayerEndReached, + libvlc_MediaPlayerEncounteredError, + libvlc_MediaPlayerTimeChanged, + libvlc_MediaPlayerPositionChanged, + libvlc_MediaPlayerSeekableChanged, + libvlc_MediaPlayerPausableChanged, + libvlc_MediaPlayerTitleChanged, + libvlc_MediaPlayerSnapshotTaken, + libvlc_MediaPlayerLengthChanged, + libvlc_MediaPlayerVout, + libvlc_MediaPlayerScrambledChanged, + libvlc_MediaPlayerESAdded, + libvlc_MediaPlayerESDeleted, + libvlc_MediaPlayerESSelected, + libvlc_MediaPlayerCorked, + libvlc_MediaPlayerUncorked, + libvlc_MediaPlayerMuted, + libvlc_MediaPlayerUnmuted, + libvlc_MediaPlayerAudioVolume, + libvlc_MediaPlayerAudioDevice, + libvlc_MediaPlayerChapterChanged, + + libvlc_MediaListItemAdded=0x200, + libvlc_MediaListWillAddItem, + libvlc_MediaListItemDeleted, + libvlc_MediaListWillDeleteItem, + libvlc_MediaListEndReached, + + libvlc_MediaListViewItemAdded=0x300, + libvlc_MediaListViewWillAddItem, + libvlc_MediaListViewItemDeleted, + libvlc_MediaListViewWillDeleteItem, + + libvlc_MediaListPlayerPlayed=0x400, + libvlc_MediaListPlayerNextItemSet, + libvlc_MediaListPlayerStopped, + + /** + * \deprecated Useless event, it will be triggered only when calling + * libvlc_media_discoverer_start() + */ + libvlc_MediaDiscovererStarted=0x500, + /** + * \deprecated Useless event, it will be triggered only when calling + * libvlc_media_discoverer_stop() + */ + libvlc_MediaDiscovererEnded, + + libvlc_RendererDiscovererItemAdded, + libvlc_RendererDiscovererItemDeleted, + + libvlc_VlmMediaAdded=0x600, + libvlc_VlmMediaRemoved, + libvlc_VlmMediaChanged, + libvlc_VlmMediaInstanceStarted, + libvlc_VlmMediaInstanceStopped, + libvlc_VlmMediaInstanceStatusInit, + libvlc_VlmMediaInstanceStatusOpening, + libvlc_VlmMediaInstanceStatusPlaying, + libvlc_VlmMediaInstanceStatusPause, + libvlc_VlmMediaInstanceStatusEnd, + libvlc_VlmMediaInstanceStatusError +}; + +/** + * A LibVLC event + */ +typedef struct libvlc_event_t +{ + int type; /**< Event type (see @ref libvlc_event_e) */ + void *p_obj; /**< Object emitting the event */ + union + { + /* media descriptor */ + struct + { + libvlc_meta_t meta_type; + } media_meta_changed; + struct + { + libvlc_media_t * new_child; + } media_subitem_added; + struct + { + int64_t new_duration; + } media_duration_changed; + struct + { + int new_status; /**< see @ref libvlc_media_parsed_status_t */ + } media_parsed_changed; + struct + { + libvlc_media_t * md; + } media_freed; + struct + { + int new_state; /**< see @ref libvlc_state_t */ + } media_state_changed; + struct + { + libvlc_media_t * item; + } media_subitemtree_added; + + /* media instance */ + struct + { + float new_cache; + } media_player_buffering; + struct + { + int new_chapter; + } media_player_chapter_changed; + struct + { + float new_position; + } media_player_position_changed; + struct + { + libvlc_time_t new_time; + } media_player_time_changed; + struct + { + int new_title; + } media_player_title_changed; + struct + { + int new_seekable; + } media_player_seekable_changed; + struct + { + int new_pausable; + } media_player_pausable_changed; + struct + { + int new_scrambled; + } media_player_scrambled_changed; + struct + { + int new_count; + } media_player_vout; + + /* media list */ + struct + { + libvlc_media_t * item; + int index; + } media_list_item_added; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_add_item; + struct + { + libvlc_media_t * item; + int index; + } media_list_item_deleted; + struct + { + libvlc_media_t * item; + int index; + } media_list_will_delete_item; + + /* media list player */ + struct + { + libvlc_media_t * item; + } media_list_player_next_item_set; + + /* snapshot taken */ + struct + { + char* psz_filename ; + } media_player_snapshot_taken ; + + /* Length changed */ + struct + { + libvlc_time_t new_length; + } media_player_length_changed; + + /* VLM media */ + struct + { + const char * psz_media_name; + const char * psz_instance_name; + } vlm_media_event; + + /* Extra MediaPlayer */ + struct + { + libvlc_media_t * new_media; + } media_player_media_changed; + + struct + { + libvlc_track_type_t i_type; + int i_id; + } media_player_es_changed; + + struct + { + float volume; + } media_player_audio_volume; + + struct + { + const char *device; + } media_player_audio_device; + + struct + { + libvlc_renderer_item_t *item; + } renderer_discoverer_item_added; + struct + { + libvlc_renderer_item_t *item; + } renderer_discoverer_item_deleted; + } u; /**< Type-dependent event description */ +} libvlc_event_t; + + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_media.h b/vlcdemo/vlc/vlc3/include64/libvlc_media.h new file mode 100644 index 0000000..0a668ef --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_media.h @@ -0,0 +1,893 @@ +/***************************************************************************** + * libvlc_media.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 383f366b6940f7b3d89f5945e015793833ea541f $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_H +#define VLC_LIBVLC_MEDIA_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media LibVLC media + * \ingroup libvlc + * @ref libvlc_media_t is an abstract representation of a playable media. + * It consists of a media location and various optional meta data. + * @{ + * \file + * LibVLC media item/descriptor external API + */ + +typedef struct libvlc_media_t libvlc_media_t; + +/** Meta data types */ +typedef enum libvlc_meta_t { + libvlc_meta_Title, + libvlc_meta_Artist, + libvlc_meta_Genre, + libvlc_meta_Copyright, + libvlc_meta_Album, + libvlc_meta_TrackNumber, + libvlc_meta_Description, + libvlc_meta_Rating, + libvlc_meta_Date, + libvlc_meta_Setting, + libvlc_meta_URL, + libvlc_meta_Language, + libvlc_meta_NowPlaying, + libvlc_meta_Publisher, + libvlc_meta_EncodedBy, + libvlc_meta_ArtworkURL, + libvlc_meta_TrackID, + libvlc_meta_TrackTotal, + libvlc_meta_Director, + libvlc_meta_Season, + libvlc_meta_Episode, + libvlc_meta_ShowName, + libvlc_meta_Actors, + libvlc_meta_AlbumArtist, + libvlc_meta_DiscNumber, + libvlc_meta_DiscTotal + /* Add new meta types HERE */ +} libvlc_meta_t; + +/** + * Note the order of libvlc_state_t enum must match exactly the order of + * \see mediacontrol_PlayerStatus, \see input_state_e enums, + * and VideoLAN.LibVLC.State (at bindings/cil/src/media.cs). + * + * Expected states by web plugins are: + * IDLE/CLOSE=0, OPENING=1, PLAYING=3, PAUSED=4, + * STOPPING=5, ENDED=6, ERROR=7 + */ +typedef enum libvlc_state_t +{ + libvlc_NothingSpecial=0, + libvlc_Opening, + libvlc_Buffering, /* XXX: Deprecated value. Check the + * libvlc_MediaPlayerBuffering event to know the + * buffering state of a libvlc_media_player */ + libvlc_Playing, + libvlc_Paused, + libvlc_Stopped, + libvlc_Ended, + libvlc_Error +} libvlc_state_t; + +enum +{ + libvlc_media_option_trusted = 0x2, + libvlc_media_option_unique = 0x100 +}; + +typedef enum libvlc_track_type_t +{ + libvlc_track_unknown = -1, + libvlc_track_audio = 0, + libvlc_track_video = 1, + libvlc_track_text = 2 +} libvlc_track_type_t; + +typedef struct libvlc_media_stats_t +{ + /* Input */ + int i_read_bytes; + float f_input_bitrate; + + /* Demux */ + int i_demux_read_bytes; + float f_demux_bitrate; + int i_demux_corrupted; + int i_demux_discontinuity; + + /* Decoders */ + int i_decoded_video; + int i_decoded_audio; + + /* Video Output */ + int i_displayed_pictures; + int i_lost_pictures; + + /* Audio output */ + int i_played_abuffers; + int i_lost_abuffers; + + /* Stream output */ + int i_sent_packets; + int i_sent_bytes; + float f_send_bitrate; +} libvlc_media_stats_t; + +typedef struct libvlc_media_track_info_t +{ + /* Codec fourcc */ + uint32_t i_codec; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + struct { + /* Audio specific */ + unsigned i_channels; + unsigned i_rate; + } audio; + struct { + /* Video specific */ + unsigned i_height; + unsigned i_width; + } video; + } u; + +} libvlc_media_track_info_t; + + +typedef struct libvlc_audio_track_t +{ + unsigned i_channels; + unsigned i_rate; +} libvlc_audio_track_t; + +typedef enum libvlc_video_orient_t +{ + libvlc_video_orient_top_left, /**< Normal. Top line represents top, left column left. */ + libvlc_video_orient_top_right, /**< Flipped horizontally */ + libvlc_video_orient_bottom_left, /**< Flipped vertically */ + libvlc_video_orient_bottom_right, /**< Rotated 180 degrees */ + libvlc_video_orient_left_top, /**< Transposed */ + libvlc_video_orient_left_bottom, /**< Rotated 90 degrees clockwise (or 270 anti-clockwise) */ + libvlc_video_orient_right_top, /**< Rotated 90 degrees anti-clockwise */ + libvlc_video_orient_right_bottom /**< Anti-transposed */ +} libvlc_video_orient_t; + +typedef enum libvlc_video_projection_t +{ + libvlc_video_projection_rectangular, + libvlc_video_projection_equirectangular, /**< 360 spherical */ + + libvlc_video_projection_cubemap_layout_standard = 0x100, +} libvlc_video_projection_t; + +/** + * Viewpoint + * + * \warning allocate using libvlc_video_new_viewpoint() + */ +typedef struct libvlc_video_viewpoint_t +{ + float f_yaw; /**< view point yaw in degrees ]-180;180] */ + float f_pitch; /**< view point pitch in degrees ]-90;90] */ + float f_roll; /**< view point roll in degrees ]-180;180] */ + float f_field_of_view; /**< field of view in degrees ]0;180[ (default 80.)*/ +} libvlc_video_viewpoint_t; + +typedef struct libvlc_video_track_t +{ + unsigned i_height; + unsigned i_width; + unsigned i_sar_num; + unsigned i_sar_den; + unsigned i_frame_rate_num; + unsigned i_frame_rate_den; + + libvlc_video_orient_t i_orientation; + libvlc_video_projection_t i_projection; + libvlc_video_viewpoint_t pose; /**< Initial view point */ +} libvlc_video_track_t; + +typedef struct libvlc_subtitle_track_t +{ + char *psz_encoding; +} libvlc_subtitle_track_t; + +typedef struct libvlc_media_track_t +{ + /* Codec fourcc */ + uint32_t i_codec; + uint32_t i_original_fourcc; + int i_id; + libvlc_track_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + union { + libvlc_audio_track_t *audio; + libvlc_video_track_t *video; + libvlc_subtitle_track_t *subtitle; + }; + + unsigned int i_bitrate; + char *psz_language; + char *psz_description; + +} libvlc_media_track_t; + +/** + * Media type + * + * \see libvlc_media_get_type + */ +typedef enum libvlc_media_type_t { + libvlc_media_type_unknown, + libvlc_media_type_file, + libvlc_media_type_directory, + libvlc_media_type_disc, + libvlc_media_type_stream, + libvlc_media_type_playlist, +} libvlc_media_type_t; + +/** + * Parse flags used by libvlc_media_parse_with_options() + * + * \see libvlc_media_parse_with_options + */ +typedef enum libvlc_media_parse_flag_t +{ + /** + * Parse media if it's a local file + */ + libvlc_media_parse_local = 0x00, + /** + * Parse media even if it's a network file + */ + libvlc_media_parse_network = 0x01, + /** + * Fetch meta and covert art using local resources + */ + libvlc_media_fetch_local = 0x02, + /** + * Fetch meta and covert art using network resources + */ + libvlc_media_fetch_network = 0x04, + /** + * Interact with the user (via libvlc_dialog_cbs) when preparsing this item + * (and not its sub items). Set this flag in order to receive a callback + * when the input is asking for credentials. + */ + libvlc_media_do_interact = 0x08, +} libvlc_media_parse_flag_t; + +/** + * Parse status used sent by libvlc_media_parse_with_options() or returned by + * libvlc_media_get_parsed_status() + * + * \see libvlc_media_parse_with_options + * \see libvlc_media_get_parsed_status + */ +typedef enum libvlc_media_parsed_status_t +{ + libvlc_media_parsed_status_skipped = 1, + libvlc_media_parsed_status_failed, + libvlc_media_parsed_status_timeout, + libvlc_media_parsed_status_done, +} libvlc_media_parsed_status_t; + +/** + * Type of a media slave: subtitle or audio. + */ +typedef enum libvlc_media_slave_type_t +{ + libvlc_media_slave_type_subtitle, + libvlc_media_slave_type_audio, +} libvlc_media_slave_type_t; + +/** + * A slave of a libvlc_media_t + * \see libvlc_media_slaves_get + */ +typedef struct libvlc_media_slave_t +{ + char * psz_uri; + libvlc_media_slave_type_t i_type; + unsigned int i_priority; +} libvlc_media_slave_t; + +/** + * Callback prototype to open a custom bitstream input media. + * + * The same media item can be opened multiple times. Each time, this callback + * is invoked. It should allocate and initialize any instance-specific + * resources, then store them in *datap. The instance resources can be freed + * in the @ref libvlc_media_close_cb callback. + * + * \param opaque private pointer as passed to libvlc_media_new_callbacks() + * \param datap storage space for a private data pointer [OUT] + * \param sizep byte length of the bitstream or UINT64_MAX if unknown [OUT] + * + * \note For convenience, *datap is initially NULL and *sizep is initially 0. + * + * \return 0 on success, non-zero on error. In case of failure, the other + * callbacks will not be invoked and any value stored in *datap and *sizep is + * discarded. + */ +typedef int (*libvlc_media_open_cb)(void *opaque, void **datap, + uint64_t *sizep); + +/** + * Callback prototype to read data from a custom bitstream input media. + * + * \param opaque private pointer as set by the @ref libvlc_media_open_cb + * callback + * \param buf start address of the buffer to read data into + * \param len bytes length of the buffer + * + * \return strictly positive number of bytes read, 0 on end-of-stream, + * or -1 on non-recoverable error + * + * \note If no data is immediately available, then the callback should sleep. + * \warning The application is responsible for avoiding deadlock situations. + * In particular, the callback should return an error if playback is stopped; + * if it does not return, then libvlc_media_player_stop() will never return. + */ +typedef int (*libvlc_media_read_cb)(void *opaque, unsigned char *buf, + size_t len); + +/** + * Callback prototype to seek a custom bitstream input media. + * + * \param opaque private pointer as set by the @ref libvlc_media_open_cb + * callback + * \param offset absolute byte offset to seek to + * \return 0 on success, -1 on error. + */ +typedef int (*libvlc_media_seek_cb)(void *opaque, uint64_t offset); + +/** + * Callback prototype to close a custom bitstream input media. + * + * \param opaque private pointer as set by the @ref libvlc_media_open_cb + * callback + */ +typedef void (*libvlc_media_close_cb)(void *opaque); + +/** + * Create a media with a certain given media resource location, + * for instance a valid URL. + * + * \note To refer to a local file with this function, + * the file://... URI syntax must be used (see IETF RFC3986). + * We recommend using libvlc_media_new_path() instead when dealing with + * local files. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_mrl the media location + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_location( + libvlc_instance_t *p_instance, + const char * psz_mrl ); + +/** + * Create a media for a certain file path. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param path local filesystem path + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_path( + libvlc_instance_t *p_instance, + const char *path ); + +/** + * Create a media for an already open file descriptor. + * The file descriptor shall be open for reading (or reading and writing). + * + * Regular file descriptors, pipe read descriptors and character device + * descriptors (including TTYs) are supported on all platforms. + * Block device descriptors are supported where available. + * Directory descriptors are supported on systems that provide fdopendir(). + * Sockets are supported on all platforms where they are file descriptors, + * i.e. all except Windows. + * + * \note This library will not automatically close the file descriptor + * under any circumstance. Nevertheless, a file descriptor can usually only be + * rendered once in a media player. To render it a second time, the file + * descriptor should probably be rewound to the beginning with lseek(). + * + * \see libvlc_media_release + * + * \version LibVLC 1.1.5 and later. + * + * \param p_instance the instance + * \param fd open file descriptor + * \return the newly created media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_fd( + libvlc_instance_t *p_instance, + int fd ); + +/** + * Create a media with custom callbacks to read the data from. + * + * \param instance LibVLC instance + * \param open_cb callback to open the custom bitstream input media + * \param read_cb callback to read data (must not be NULL) + * \param seek_cb callback to seek, or NULL if seeking is not supported + * \param close_cb callback to close the media, or NULL if unnecessary + * \param opaque data pointer for the open callback + * + * \return the newly created media or NULL on error + * + * \note If open_cb is NULL, the opaque pointer will be passed to read_cb, + * seek_cb and close_cb, and the stream size will be treated as unknown. + * + * \note The callbacks may be called asynchronously (from another thread). + * A single stream instance need not be reentrant. However the open_cb needs to + * be reentrant if the media is used by multiple player instances. + * + * \warning The callbacks may be used until all or any player instances + * that were supplied the media item are stopped. + * + * \see libvlc_media_release + * + * \version LibVLC 3.0.0 and later. + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_callbacks( + libvlc_instance_t *instance, + libvlc_media_open_cb open_cb, + libvlc_media_read_cb read_cb, + libvlc_media_seek_cb seek_cb, + libvlc_media_close_cb close_cb, + void *opaque ); + +/** + * Create a media as an empty node with a given name. + * + * \see libvlc_media_release + * + * \param p_instance the instance + * \param psz_name the name of the node + * \return the new empty media or NULL on error + */ +LIBVLC_API libvlc_media_t *libvlc_media_new_as_node( + libvlc_instance_t *p_instance, + const char * psz_name ); + +/** + * Add an option to the media. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * \note The options are listed in 'vlc --long-help' from the command line, + * e.g. "-sout-all". Keep in mind that available options and their semantics + * vary across LibVLC versions and builds. + * \warning Not all options affects libvlc_media_t objects: + * Specifically, due to architectural issues most audio and video options, + * such as text renderer options, have no effects on an individual media. + * These options must be set through libvlc_new() instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + */ +LIBVLC_API void libvlc_media_add_option( + libvlc_media_t *p_md, + const char * psz_options ); + +/** + * Add an option to the media with configurable flags. + * + * This option will be used to determine how the media_player will + * read the media. This allows to use VLC's advanced + * reading/streaming options on a per-media basis. + * + * The options are detailed in vlc --long-help, for instance + * "--sout-all". Note that all options are not usable on medias: + * specifically, due to architectural issues, video-related options + * such as text renderer options cannot be set on a single media. They + * must be set on the whole libvlc instance instead. + * + * \param p_md the media descriptor + * \param psz_options the options (as a string) + * \param i_flags the flags for this option + */ +LIBVLC_API void libvlc_media_add_option_flag( + libvlc_media_t *p_md, + const char * psz_options, + unsigned i_flags ); + + +/** + * Retain a reference to a media descriptor object (libvlc_media_t). Use + * libvlc_media_release() to decrement the reference count of a + * media descriptor object. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_retain( libvlc_media_t *p_md ); + +/** + * Decrement the reference count of a media descriptor object. If the + * reference count is 0, then libvlc_media_release() will release the + * media descriptor object. It will send out an libvlc_MediaFreed event + * to all listeners. If the media descriptor object has been released it + * should not be used again. + * + * \param p_md the media descriptor + */ +LIBVLC_API void libvlc_media_release( libvlc_media_t *p_md ); + + +/** + * Get the media resource locator (mrl) from a media descriptor object + * + * \param p_md a media descriptor object + * \return string with mrl of media descriptor object + */ +LIBVLC_API char *libvlc_media_get_mrl( libvlc_media_t *p_md ); + +/** + * Duplicate a media descriptor object. + * + * \param p_md a media descriptor object. + */ +LIBVLC_API libvlc_media_t *libvlc_media_duplicate( libvlc_media_t *p_md ); + +/** + * Read the meta of the media. + * + * If the media has not yet been parsed this will return NULL. + * + * \see libvlc_media_parse + * \see libvlc_media_parse_with_options + * \see libvlc_MediaMetaChanged + * + * \param p_md the media descriptor + * \param e_meta the meta to read + * \return the media's meta + */ +LIBVLC_API char *libvlc_media_get_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta ); + +/** + * Set the meta of the media (this function will not save the meta, call + * libvlc_media_save_meta in order to save the meta) + * + * \param p_md the media descriptor + * \param e_meta the meta to write + * \param psz_value the media's meta + */ +LIBVLC_API void libvlc_media_set_meta( libvlc_media_t *p_md, + libvlc_meta_t e_meta, + const char *psz_value ); + + +/** + * Save the meta previously set + * + * \param p_md the media desriptor + * \return true if the write operation was successful + */ +LIBVLC_API int libvlc_media_save_meta( libvlc_media_t *p_md ); + + +/** + * Get current state of media descriptor object. Possible media states are + * libvlc_NothingSpecial=0, libvlc_Opening, libvlc_Playing, libvlc_Paused, + * libvlc_Stopped, libvlc_Ended, libvlc_Error. + * + * \see libvlc_state_t + * \param p_md a media descriptor object + * \return state of media descriptor object + */ +LIBVLC_API libvlc_state_t libvlc_media_get_state( + libvlc_media_t *p_md ); + + +/** + * Get the current statistics about the media + * \param p_md: media descriptor object + * \param p_stats: structure that contain the statistics about the media + * (this structure must be allocated by the caller) + * \return true if the statistics are available, false otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_get_stats( libvlc_media_t *p_md, + libvlc_media_stats_t *p_stats ); + +/* The following method uses libvlc_media_list_t, however, media_list usage is optionnal + * and this is here for convenience */ +#define VLC_FORWARD_DECLARE_OBJECT(a) struct a + +/** + * Get subitems of media descriptor object. This will increment + * the reference count of supplied media descriptor object. Use + * libvlc_media_list_release() to decrement the reference counting. + * + * \param p_md media descriptor object + * \return list of media descriptor subitems or NULL + */ +LIBVLC_API VLC_FORWARD_DECLARE_OBJECT(libvlc_media_list_t *) +libvlc_media_subitems( libvlc_media_t *p_md ); + +/** + * Get event manager from media descriptor object. + * NOTE: this function doesn't increment reference counting. + * + * \param p_md a media descriptor object + * \return event manager object + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_event_manager( libvlc_media_t *p_md ); + +/** + * Get duration (in ms) of media descriptor object item. + * + * \param p_md media descriptor object + * \return duration of media item or -1 on error + */ +LIBVLC_API libvlc_time_t + libvlc_media_get_duration( libvlc_media_t *p_md ); + +/** + * Parse the media asynchronously with options. + * + * This fetches (local or network) art, meta data and/or tracks information. + * This method is the extended version of libvlc_media_parse_with_options(). + * + * To track when this is over you can listen to libvlc_MediaParsedChanged + * event. However if this functions returns an error, you will not receive any + * events. + * + * It uses a flag to specify parse options (see libvlc_media_parse_flag_t). All + * these flags can be combined. By default, media is parsed if it's a local + * file. + * + * \note Parsing can be aborted with libvlc_media_parse_stop(). + * + * \see libvlc_MediaParsedChanged + * \see libvlc_media_get_meta + * \see libvlc_media_tracks_get + * \see libvlc_media_get_parsed_status + * \see libvlc_media_parse_flag_t + * + * \param p_md media descriptor object + * \param parse_flag parse options: + * \param timeout maximum time allowed to preparse the media. If -1, the + * default "preparse-timeout" option will be used as a timeout. If 0, it will + * wait indefinitely. If > 0, the timeout will be used (in milliseconds). + * \return -1 in case of error, 0 otherwise + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API int +libvlc_media_parse_with_options( libvlc_media_t *p_md, + libvlc_media_parse_flag_t parse_flag, + int timeout ); + +/** + * Stop the parsing of the media + * + * When the media parsing is stopped, the libvlc_MediaParsedChanged event will + * be sent with the libvlc_media_parsed_status_timeout status. + * + * \see libvlc_media_parse_with_options + * + * \param p_md media descriptor object + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API void +libvlc_media_parse_stop( libvlc_media_t *p_md ); + +/** + * Get Parsed status for media descriptor object. + * + * \see libvlc_MediaParsedChanged + * \see libvlc_media_parsed_status_t + * + * \param p_md media descriptor object + * \return a value of the libvlc_media_parsed_status_t enum + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API libvlc_media_parsed_status_t + libvlc_media_get_parsed_status( libvlc_media_t *p_md ); + +/** + * Sets media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + * \param p_new_user_data pointer to user data + */ +LIBVLC_API void + libvlc_media_set_user_data( libvlc_media_t *p_md, void *p_new_user_data ); + +/** + * Get media descriptor's user_data. user_data is specialized data + * accessed by the host application, VLC.framework uses it as a pointer to + * an native object that references a libvlc_media_t pointer + * + * \param p_md media descriptor object + */ +LIBVLC_API void *libvlc_media_get_user_data( libvlc_media_t *p_md ); + +/** + * Get media descriptor's elementary streams description + * + * Note, you need to call libvlc_media_parse() or play the media at least once + * before calling this function. + * Not doing this will result in an empty array. + * + * \version LibVLC 2.1.0 and later. + * + * \param p_md media descriptor object + * \param tracks address to store an allocated array of Elementary Streams + * descriptions (must be freed with libvlc_media_tracks_release + by the caller) [OUT] + * + * \return the number of Elementary Streams (zero on error) + */ +LIBVLC_API +unsigned libvlc_media_tracks_get( libvlc_media_t *p_md, + libvlc_media_track_t ***tracks ); + +/** + * Get codec description from media elementary stream + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_track_t + * + * \param i_type i_type from libvlc_media_track_t + * \param i_codec i_codec or i_original_fourcc from libvlc_media_track_t + * + * \return codec description + */ +LIBVLC_API +const char *libvlc_media_get_codec_description( libvlc_track_type_t i_type, + uint32_t i_codec ); + +/** + * Release media descriptor's elementary streams description array + * + * \version LibVLC 2.1.0 and later. + * + * \param p_tracks tracks info array to release + * \param i_count number of elements in the array + */ +LIBVLC_API +void libvlc_media_tracks_release( libvlc_media_track_t **p_tracks, + unsigned i_count ); + +/** + * Get the media type of the media descriptor object + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_type_t + * + * \param p_md media descriptor object + * + * \return media type + */ +LIBVLC_API +libvlc_media_type_t libvlc_media_get_type( libvlc_media_t *p_md ); + +/** + * Add a slave to the current media. + * + * A slave is an external input source that may contains an additional subtitle + * track (like a .srt) or an additional audio track (like a .ac3). + * + * \note This function must be called before the media is parsed (via + * libvlc_media_parse_with_options()) or before the media is played (via + * libvlc_media_player_play()) + * + * \version LibVLC 3.0.0 and later. + * + * \param p_md media descriptor object + * \param i_type subtitle or audio + * \param i_priority from 0 (low priority) to 4 (high priority) + * \param psz_uri Uri of the slave (should contain a valid scheme). + * + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_media_slaves_add( libvlc_media_t *p_md, + libvlc_media_slave_type_t i_type, + unsigned int i_priority, + const char *psz_uri ); + +/** + * Clear all slaves previously added by libvlc_media_slaves_add() or + * internally. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_md media descriptor object + */ +LIBVLC_API +void libvlc_media_slaves_clear( libvlc_media_t *p_md ); + +/** + * Get a media descriptor's slave list + * + * The list will contain slaves parsed by VLC or previously added by + * libvlc_media_slaves_add(). The typical use case of this function is to save + * a list of slave in a database for a later use. + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_slaves_add + * + * \param p_md media descriptor object + * \param ppp_slaves address to store an allocated array of slaves (must be + * freed with libvlc_media_slaves_release()) [OUT] + * + * \return the number of slaves (zero on error) + */ +LIBVLC_API +unsigned int libvlc_media_slaves_get( libvlc_media_t *p_md, + libvlc_media_slave_t ***ppp_slaves ); + +/** + * Release a media descriptor's slave list + * + * \version LibVLC 3.0.0 and later. + * + * \param pp_slaves slave array to release + * \param i_count number of elements in the array + */ +LIBVLC_API +void libvlc_media_slaves_release( libvlc_media_slave_t **pp_slaves, + unsigned int i_count ); + +/** @}*/ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_media_discoverer.h b/vlcdemo/vlc/vlc3/include64/libvlc_media_discoverer.h new file mode 100644 index 0000000..c82b5f7 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_media_discoverer.h @@ -0,0 +1,188 @@ +/***************************************************************************** + * libvlc_media_discoverer.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: 96c0515ffec98f439867814d68525288b2702b0f $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_DISCOVERER_H +#define VLC_LIBVLC_MEDIA_DISCOVERER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * Category of a media discoverer + * \see libvlc_media_discoverer_list_get() + */ +typedef enum libvlc_media_discoverer_category_t { + /** devices, like portable music player */ + libvlc_media_discoverer_devices, + /** LAN/WAN services, like Upnp, SMB, or SAP */ + libvlc_media_discoverer_lan, + /** Podcasts */ + libvlc_media_discoverer_podcasts, + /** Local directories, like Video, Music or Pictures directories */ + libvlc_media_discoverer_localdirs, +} libvlc_media_discoverer_category_t; + +/** + * Media discoverer description + * \see libvlc_media_discoverer_list_get() + */ +typedef struct libvlc_media_discoverer_description_t { + char *psz_name; + char *psz_longname; + libvlc_media_discoverer_category_t i_cat; +} libvlc_media_discoverer_description_t; + +/** \defgroup libvlc_media_discoverer LibVLC media discovery + * \ingroup libvlc + * LibVLC media discovery finds available media via various means. + * This corresponds to the service discovery functionality in VLC media player. + * Different plugins find potential medias locally (e.g. user media directory), + * from peripherals (e.g. video capture device), on the local network + * (e.g. SAP) or on the Internet (e.g. Internet radios). + * @{ + * \file + * LibVLC media discovery external API + */ + +typedef struct libvlc_media_discoverer_t libvlc_media_discoverer_t; + +/** + * Create a media discoverer object by name. + * + * After this object is created, you should attach to media_list events in + * order to be notified of new items discovered. + * + * You need to call libvlc_media_discoverer_start() in order to start the + * discovery. + * + * \see libvlc_media_discoverer_media_list + * \see libvlc_media_discoverer_event_manager + * \see libvlc_media_discoverer_start + * + * \param p_inst libvlc instance + * \param psz_name service name; use libvlc_media_discoverer_list_get() to get + * a list of the discoverer names available in this libVLC instance + * \return media discover object or NULL in case of error + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API libvlc_media_discoverer_t * +libvlc_media_discoverer_new( libvlc_instance_t * p_inst, + const char * psz_name ); + +/** + * Start media discovery. + * + * To stop it, call libvlc_media_discoverer_stop() or + * libvlc_media_discoverer_list_release() directly. + * + * \see libvlc_media_discoverer_stop + * + * \param p_mdis media discover object + * \return -1 in case of error, 0 otherwise + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API int +libvlc_media_discoverer_start( libvlc_media_discoverer_t * p_mdis ); + +/** + * Stop media discovery. + * + * \see libvlc_media_discoverer_start + * + * \param p_mdis media discover object + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API void +libvlc_media_discoverer_stop( libvlc_media_discoverer_t * p_mdis ); + +/** + * Release media discover object. If the reference count reaches 0, then + * the object will be released. + * + * \param p_mdis media service discover object + */ +LIBVLC_API void +libvlc_media_discoverer_release( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media service discover media list. + * + * \param p_mdis media service discover object + * \return list of media items + */ +LIBVLC_API libvlc_media_list_t * +libvlc_media_discoverer_media_list( libvlc_media_discoverer_t * p_mdis ); + +/** + * Query if media service discover object is running. + * + * \param p_mdis media service discover object + * \return true if running, false if not + * + * \libvlc_return_bool + */ +LIBVLC_API int +libvlc_media_discoverer_is_running( libvlc_media_discoverer_t * p_mdis ); + +/** + * Get media discoverer services by category + * + * \version LibVLC 3.0.0 and later. + * + * \param p_inst libvlc instance + * \param i_cat category of services to fetch + * \param ppp_services address to store an allocated array of media discoverer + * services (must be freed with libvlc_media_discoverer_list_release() by + * the caller) [OUT] + * + * \return the number of media discoverer services (0 on error) + */ +LIBVLC_API size_t +libvlc_media_discoverer_list_get( libvlc_instance_t *p_inst, + libvlc_media_discoverer_category_t i_cat, + libvlc_media_discoverer_description_t ***ppp_services ); + +/** + * Release an array of media discoverer services + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_discoverer_list_get() + * + * \param pp_services array to release + * \param i_count number of elements in the array + */ +LIBVLC_API void +libvlc_media_discoverer_list_release( libvlc_media_discoverer_description_t **pp_services, + size_t i_count ); + +/**@} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_media_library.h b/vlcdemo/vlc/vlc3/include64/libvlc_media_library.h new file mode 100644 index 0000000..a5c32d1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_media_library.h @@ -0,0 +1,96 @@ +/***************************************************************************** + * libvlc_media_library.h: libvlc external API + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * $Id: facbf813aa16140461c6e72f166d2985c52b1d6f $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_LIBRARY_H +#define VLC_LIBVLC_MEDIA_LIBRARY_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_library LibVLC media library + * \ingroup libvlc + * @{ + * \file + * LibVLC media library external API + */ + +typedef struct libvlc_media_library_t libvlc_media_library_t; + +/** + * Create an new Media Library object + * + * \param p_instance the libvlc instance + * \return a new object or NULL on error + */ +LIBVLC_API libvlc_media_library_t * + libvlc_media_library_new( libvlc_instance_t * p_instance ); + +/** + * Release media library object. This functions decrements the + * reference count of the media library object. If it reaches 0, + * then the object will be released. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_release( libvlc_media_library_t * p_mlib ); + +/** + * Retain a reference to a media library object. This function will + * increment the reference counting for this object. Use + * libvlc_media_library_release() to decrement the reference count. + * + * \param p_mlib media library object + */ +LIBVLC_API void + libvlc_media_library_retain( libvlc_media_library_t * p_mlib ); + +/** + * Load media library. + * + * \param p_mlib media library object + * \return 0 on success, -1 on error + */ +LIBVLC_API int + libvlc_media_library_load( libvlc_media_library_t * p_mlib ); + +/** + * Get media library subitems. + * + * \param p_mlib media library object + * \return media list subitems + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_library_media_list( libvlc_media_library_t * p_mlib ); + + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_media_list.h b/vlcdemo/vlc/vlc3/include64/libvlc_media_list.h new file mode 100644 index 0000000..2e25d87 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_media_list.h @@ -0,0 +1,202 @@ +/***************************************************************************** + * libvlc_media_list.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: fa3b90932be8c3a9cce27925d4867aeddde748d7 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_H +#define LIBVLC_MEDIA_LIST_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_list LibVLC media list + * \ingroup libvlc + * A LibVLC media list holds multiple @ref libvlc_media_t media descriptors. + * @{ + * \file + * LibVLC media list (playlist) external API + */ + +typedef struct libvlc_media_list_t libvlc_media_list_t; + +/** + * Create an empty media list. + * + * \param p_instance libvlc instance + * \return empty media list, or NULL on error + */ +LIBVLC_API libvlc_media_list_t * + libvlc_media_list_new( libvlc_instance_t *p_instance ); + +/** + * Release media list created with libvlc_media_list_new(). + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_release( libvlc_media_list_t *p_ml ); + +/** + * Retain reference to a media list + * + * \param p_ml a media list created with libvlc_media_list_new() + */ +LIBVLC_API void + libvlc_media_list_retain( libvlc_media_list_t *p_ml ); + +/** + * Associate media instance with this media list instance. + * If another media instance was present it will be released. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance to add + */ +LIBVLC_API void +libvlc_media_list_set_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Get media instance from this media list instance. This action will increase + * the refcount on the media instance. + * The libvlc_media_list_lock should NOT be held upon entering this function. + * + * \param p_ml a media list instance + * \return media instance + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_media( libvlc_media_list_t *p_ml ); + +/** + * Add media instance to media list + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_add_media( libvlc_media_list_t *p_ml, libvlc_media_t *p_md ); + +/** + * Insert media instance in media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md a media instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the media list is read-only + */ +LIBVLC_API int +libvlc_media_list_insert_media( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md, int i_pos ); + +/** + * Remove media instance from media list on a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return 0 on success, -1 if the list is read-only or the item was not found + */ +LIBVLC_API int +libvlc_media_list_remove_index( libvlc_media_list_t *p_ml, int i_pos ); + +/** + * Get count on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \return number of items in media list + */ +LIBVLC_API int + libvlc_media_list_count( libvlc_media_list_t *p_ml ); + +/** + * List media instance in media list at a position + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param i_pos position in array where to insert + * \return media instance at position i_pos, or NULL if not found. + * In case of success, libvlc_media_retain() is called to increase the refcount + * on the media. + */ +LIBVLC_API libvlc_media_t * + libvlc_media_list_item_at_index( libvlc_media_list_t *p_ml, int i_pos ); +/** + * Find index position of List media instance in media list. + * Warning: the function will return the first matched position. + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + * \param p_md media instance + * \return position of media instance or -1 if media not found + */ +LIBVLC_API int + libvlc_media_list_index_of_item( libvlc_media_list_t *p_ml, + libvlc_media_t *p_md ); + +/** + * This indicates if this media list is read-only from a user point of view + * + * \param p_ml media list instance + * \return 1 on readonly, 0 on readwrite + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_is_readonly( libvlc_media_list_t * p_ml ); + +/** + * Get lock on media list items + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_lock( libvlc_media_list_t *p_ml ); + +/** + * Release lock on media list items + * The libvlc_media_list_lock should be held upon entering this function. + * + * \param p_ml a media list instance + */ +LIBVLC_API void + libvlc_media_list_unlock( libvlc_media_list_t *p_ml ); + +/** + * Get libvlc_event_manager from this media list instance. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_ml a media list instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_event_manager( libvlc_media_list_t *p_ml ); + +/** @} media_list */ + +# ifdef __cplusplus +} +# endif + +#endif /* _LIBVLC_MEDIA_LIST_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_media_list_player.h b/vlcdemo/vlc/vlc3/include64/libvlc_media_list_player.h new file mode 100644 index 0000000..4597182 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_media_list_player.h @@ -0,0 +1,239 @@ +/***************************************************************************** + * libvlc_media_list_player.h: libvlc_media_list API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 04f7d9b9f0d47e1b8304b51ca20fd2b1045a0ff2 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MEDIA_LIST_PLAYER_H +#define LIBVLC_MEDIA_LIST_PLAYER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_media_list_player LibVLC media list player + * \ingroup libvlc + * The LibVLC media list player plays a @ref libvlc_media_list_t list of media, + * in a certain order. + * This is required to especially support playlist files. + * The normal @ref libvlc_media_player_t LibVLC media player can only play a + * single media, and does not handle playlist files properly. + * @{ + * \file + * LibVLC media list player external API + */ + +typedef struct libvlc_media_list_player_t libvlc_media_list_player_t; + +/** + * Defines playback modes for playlist. + */ +typedef enum libvlc_playback_mode_t +{ + libvlc_playback_mode_default, + libvlc_playback_mode_loop, + libvlc_playback_mode_repeat +} libvlc_playback_mode_t; + +/** + * Create new media_list_player. + * + * \param p_instance libvlc instance + * \return media list player instance or NULL on error + */ +LIBVLC_API libvlc_media_list_player_t * + libvlc_media_list_player_new( libvlc_instance_t * p_instance ); + +/** + * Release a media_list_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_list_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_release( libvlc_media_list_player_t * p_mlp ); + +/** + * Retain a reference to a media player list object. Use + * libvlc_media_list_player_release() to decrement reference count. + * + * \param p_mlp media player list object + */ +LIBVLC_API void + libvlc_media_list_player_retain( libvlc_media_list_player_t *p_mlp ); + +/** + * Return the event manager of this media_list_player. + * + * \param p_mlp media list player instance + * \return the event manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_media_list_player_event_manager(libvlc_media_list_player_t * p_mlp); + +/** + * Replace media player in media_list_player with this instance. + * + * \param p_mlp media list player instance + * \param p_mi media player instance + */ +LIBVLC_API void + libvlc_media_list_player_set_media_player( + libvlc_media_list_player_t * p_mlp, + libvlc_media_player_t * p_mi ); + +/** + * Get media player of the media_list_player instance. + * + * \param p_mlp media list player instance + * \return media player instance + * \note the caller is responsible for releasing the returned instance + */ +LIBVLC_API libvlc_media_player_t * + libvlc_media_list_player_get_media_player(libvlc_media_list_player_t * p_mlp); + +/** + * Set the media list associated with the player + * + * \param p_mlp media list player instance + * \param p_mlist list of media + */ +LIBVLC_API void + libvlc_media_list_player_set_media_list( + libvlc_media_list_player_t * p_mlp, + libvlc_media_list_t * p_mlist ); + +/** + * Play media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_play(libvlc_media_list_player_t * p_mlp); + +/** + * Toggle pause (or resume) media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API +void libvlc_media_list_player_pause(libvlc_media_list_player_t * p_mlp); + +/** + * Pause or resume media list + * + * \param p_mlp media list player instance + * \param do_pause play/resume if zero, pause if non-zero + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API +void libvlc_media_list_player_set_pause(libvlc_media_list_player_t * p_mlp, + int do_pause); + +/** + * Is media list playing? + * + * \param p_mlp media list player instance + * \return true for playing and false for not playing + * + * \libvlc_return_bool + */ +LIBVLC_API int + libvlc_media_list_player_is_playing( libvlc_media_list_player_t * p_mlp ); + +/** + * Get current libvlc_state of media list player + * + * \param p_mlp media list player instance + * \return libvlc_state_t for media list player + */ +LIBVLC_API libvlc_state_t + libvlc_media_list_player_get_state( libvlc_media_list_player_t * p_mlp ); + +/** + * Play media list item at position index + * + * \param p_mlp media list player instance + * \param i_index index in media list to play + * \return 0 upon success -1 if the item wasn't found + */ +LIBVLC_API +int libvlc_media_list_player_play_item_at_index(libvlc_media_list_player_t * p_mlp, + int i_index); + +/** + * Play the given media item + * + * \param p_mlp media list player instance + * \param p_md the media instance + * \return 0 upon success, -1 if the media is not part of the media list + */ +LIBVLC_API +int libvlc_media_list_player_play_item(libvlc_media_list_player_t * p_mlp, + libvlc_media_t * p_md); + +/** + * Stop playing media list + * + * \param p_mlp media list player instance + */ +LIBVLC_API void + libvlc_media_list_player_stop( libvlc_media_list_player_t * p_mlp); + +/** + * Play next item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no next item + */ +LIBVLC_API +int libvlc_media_list_player_next(libvlc_media_list_player_t * p_mlp); + +/** + * Play previous item from media list + * + * \param p_mlp media list player instance + * \return 0 upon success -1 if there is no previous item + */ +LIBVLC_API +int libvlc_media_list_player_previous(libvlc_media_list_player_t * p_mlp); + + + +/** + * Sets the playback mode for the playlist + * + * \param p_mlp media list player instance + * \param e_mode playback mode specification + */ +LIBVLC_API +void libvlc_media_list_player_set_playback_mode(libvlc_media_list_player_t * p_mlp, + libvlc_playback_mode_t e_mode ); + +/** @} media_list_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* LIBVLC_MEDIA_LIST_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_media_player.h b/vlcdemo/vlc/vlc3/include64/libvlc_media_player.h new file mode 100644 index 0000000..f260e95 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_media_player.h @@ -0,0 +1,2091 @@ +/***************************************************************************** + * libvlc_media_player.h: libvlc_media_player external API + ***************************************************************************** + * Copyright (C) 1998-2015 VLC authors and VideoLAN + * $Id: 4336df9442b5bae28ec93d540f2ee5907f34e077 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_MEDIA_PLAYER_H +#define VLC_LIBVLC_MEDIA_PLAYER_H 1 + +# ifdef __cplusplus +extern "C" { +# else +# include +# endif + +/** \defgroup libvlc_media_player LibVLC media player + * \ingroup libvlc + * A LibVLC media player plays one media (usually in a custom drawable). + * @{ + * \file + * LibVLC simple media player external API + */ + +typedef struct libvlc_media_player_t libvlc_media_player_t; + +/** + * Description for video, audio tracks and subtitles. It contains + * id, name (description string) and pointer to next record. + */ +typedef struct libvlc_track_description_t +{ + int i_id; + char *psz_name; + struct libvlc_track_description_t *p_next; + +} libvlc_track_description_t; + +/** + * Description for titles + */ +enum +{ + libvlc_title_menu = 0x01, + libvlc_title_interactive = 0x02 +}; + +typedef struct libvlc_title_description_t +{ + int64_t i_duration; /**< duration in milliseconds */ + char *psz_name; /**< title name */ + unsigned i_flags; /**< info if item was recognized as a menu, interactive or plain content by the demuxer */ +} libvlc_title_description_t; + +/** + * Description for chapters + */ +typedef struct libvlc_chapter_description_t +{ + int64_t i_time_offset; /**< time-offset of the chapter in milliseconds */ + int64_t i_duration; /**< duration of the chapter in milliseconds */ + char *psz_name; /**< chapter name */ +} libvlc_chapter_description_t; + +/** + * Description for audio output. It contains + * name, description and pointer to next record. + */ +typedef struct libvlc_audio_output_t +{ + char *psz_name; + char *psz_description; + struct libvlc_audio_output_t *p_next; + +} libvlc_audio_output_t; + +/** + * Description for audio output device. + */ +typedef struct libvlc_audio_output_device_t +{ + struct libvlc_audio_output_device_t *p_next; /**< Next entry in list */ + char *psz_device; /**< Device identifier string */ + char *psz_description; /**< User-friendly device description */ + /* More fields may be added here in later versions */ +} libvlc_audio_output_device_t; + +/** + * Marq options definition + */ +typedef enum libvlc_video_marquee_option_t { + libvlc_marquee_Enable = 0, + libvlc_marquee_Text, /** string argument */ + libvlc_marquee_Color, + libvlc_marquee_Opacity, + libvlc_marquee_Position, + libvlc_marquee_Refresh, + libvlc_marquee_Size, + libvlc_marquee_Timeout, + libvlc_marquee_X, + libvlc_marquee_Y +} libvlc_video_marquee_option_t; + +/** + * Navigation mode + */ +typedef enum libvlc_navigate_mode_t +{ + libvlc_navigate_activate = 0, + libvlc_navigate_up, + libvlc_navigate_down, + libvlc_navigate_left, + libvlc_navigate_right, + libvlc_navigate_popup +} libvlc_navigate_mode_t; + +/** + * Enumeration of values used to set position (e.g. of video title). + */ +typedef enum libvlc_position_t { + libvlc_position_disable=-1, + libvlc_position_center, + libvlc_position_left, + libvlc_position_right, + libvlc_position_top, + libvlc_position_top_left, + libvlc_position_top_right, + libvlc_position_bottom, + libvlc_position_bottom_left, + libvlc_position_bottom_right +} libvlc_position_t; + +/** + * Enumeration of teletext keys than can be passed via + * libvlc_video_set_teletext() + */ +typedef enum libvlc_teletext_key_t { + libvlc_teletext_key_red = 'r' << 16, + libvlc_teletext_key_green = 'g' << 16, + libvlc_teletext_key_yellow = 'y' << 16, + libvlc_teletext_key_blue = 'b' << 16, + libvlc_teletext_key_index = 'i' << 16, +} libvlc_teletext_key_t; + +/** + * Opaque equalizer handle. + * + * Equalizer settings can be applied to a media player. + */ +typedef struct libvlc_equalizer_t libvlc_equalizer_t; + +/** + * Create an empty Media Player object + * + * \param p_libvlc_instance the libvlc instance in which the Media Player + * should be created. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new( libvlc_instance_t *p_libvlc_instance ); + +/** + * Create a Media Player object from a Media + * + * \param p_md the media. Afterwards the p_md can be safely + * destroyed. + * \return a new media player object, or NULL on error. + */ +LIBVLC_API libvlc_media_player_t * libvlc_media_player_new_from_media( libvlc_media_t *p_md ); + +/** + * Release a media_player after use + * Decrement the reference count of a media player object. If the + * reference count is 0, then libvlc_media_player_release() will + * release the media player object. If the media player object + * has been released, then it should not be used again. + * + * \param p_mi the Media Player to free + */ +LIBVLC_API void libvlc_media_player_release( libvlc_media_player_t *p_mi ); + +/** + * Retain a reference to a media player object. Use + * libvlc_media_player_release() to decrement reference count. + * + * \param p_mi media player object + */ +LIBVLC_API void libvlc_media_player_retain( libvlc_media_player_t *p_mi ); + +/** + * Set the media that will be used by the media_player. If any, + * previous md will be released. + * + * \param p_mi the Media Player + * \param p_md the Media. Afterwards the p_md can be safely + * destroyed. + */ +LIBVLC_API void libvlc_media_player_set_media( libvlc_media_player_t *p_mi, + libvlc_media_t *p_md ); + +/** + * Get the media used by the media_player. + * + * \param p_mi the Media Player + * \return the media associated with p_mi, or NULL if no + * media is associated + */ +LIBVLC_API libvlc_media_t * libvlc_media_player_get_media( libvlc_media_player_t *p_mi ); + +/** + * Get the Event Manager from which the media player send event. + * + * \param p_mi the Media Player + * \return the event manager associated with p_mi + */ +LIBVLC_API libvlc_event_manager_t * libvlc_media_player_event_manager ( libvlc_media_player_t *p_mi ); + +/** + * is_playing + * + * \param p_mi the Media Player + * \return 1 if the media player is playing, 0 otherwise + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_playing ( libvlc_media_player_t *p_mi ); + +/** + * Play + * + * \param p_mi the Media Player + * \return 0 if playback started (and was already started), or -1 on error. + */ +LIBVLC_API int libvlc_media_player_play ( libvlc_media_player_t *p_mi ); + +/** + * Pause or resume (no effect if there is no media) + * + * \param mp the Media Player + * \param do_pause play/resume if zero, pause if non-zero + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API void libvlc_media_player_set_pause ( libvlc_media_player_t *mp, + int do_pause ); + +/** + * Toggle pause (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_pause ( libvlc_media_player_t *p_mi ); + +/** + * Stop (no effect if there is no media) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_stop ( libvlc_media_player_t *p_mi ); + +/** + * Set a renderer to the media player + * + * \note must be called before the first call of libvlc_media_player_play() to + * take effect. + * + * \see libvlc_renderer_discoverer_new + * + * \param p_mi the Media Player + * \param p_item an item discovered by libvlc_renderer_discoverer_start() + * \return 0 on success, -1 on error. + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API int libvlc_media_player_set_renderer( libvlc_media_player_t *p_mi, + libvlc_renderer_item_t *p_item ); + +/** + * Callback prototype to allocate and lock a picture buffer. + * + * Whenever a new video frame needs to be decoded, the lock callback is + * invoked. Depending on the video chroma, one or three pixel planes of + * adequate dimensions must be returned via the second parameter. Those + * planes must be aligned on 32-bytes boundaries. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param planes start address of the pixel planes (LibVLC allocates the array + * of void pointers, this callback must initialize the array) [OUT] + * \return a private pointer for the display and unlock callbacks to identify + * the picture buffers + */ +typedef void *(*libvlc_video_lock_cb)(void *opaque, void **planes); + +/** + * Callback prototype to unlock a picture buffer. + * + * When the video frame decoding is complete, the unlock callback is invoked. + * This callback might not be needed at all. It is only an indication that the + * application can now read the pixel values if it needs to. + * + * \note A picture buffer is unlocked after the picture is decoded, + * but before the picture is displayed. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + * \param planes pixel planes as defined by the @ref libvlc_video_lock_cb + * callback (this parameter is only for convenience) [IN] + */ +typedef void (*libvlc_video_unlock_cb)(void *opaque, void *picture, + void *const *planes); + +/** + * Callback prototype to display a picture. + * + * When the video frame needs to be shown, as determined by the media playback + * clock, the display callback is invoked. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] + * \param picture private pointer returned from the @ref libvlc_video_lock_cb + * callback [IN] + */ +typedef void (*libvlc_video_display_cb)(void *opaque, void *picture); + +/** + * Callback prototype to configure picture buffers format. + * This callback gets the format of the video as output by the video decoder + * and the chain of video filters (if any). It can opt to change any parameter + * as it needs. In that case, LibVLC will attempt to convert the video format + * (rescaling and chroma conversion) but these operations can be CPU intensive. + * + * \param opaque pointer to the private pointer passed to + * libvlc_video_set_callbacks() [IN/OUT] + * \param chroma pointer to the 4 bytes video format identifier [IN/OUT] + * \param width pointer to the pixel width [IN/OUT] + * \param height pointer to the pixel height [IN/OUT] + * \param pitches table of scanline pitches in bytes for each pixel plane + * (the table is allocated by LibVLC) [OUT] + * \param lines table of scanlines count for each plane [OUT] + * \return the number of picture buffers allocated, 0 indicates failure + * + * \note + * For each pixels plane, the scanline pitch must be bigger than or equal to + * the number of bytes per pixel multiplied by the pixel width. + * Similarly, the number of scanlines must be bigger than of equal to + * the pixel height. + * Furthermore, we recommend that pitches and lines be multiple of 32 + * to not break assumptions that might be held by optimized code + * in the video decoders, video filters and/or video converters. + */ +typedef unsigned (*libvlc_video_format_cb)(void **opaque, char *chroma, + unsigned *width, unsigned *height, + unsigned *pitches, + unsigned *lines); + +/** + * Callback prototype to configure picture buffers format. + * + * \param opaque private pointer as passed to libvlc_video_set_callbacks() + * (and possibly modified by @ref libvlc_video_format_cb) [IN] + */ +typedef void (*libvlc_video_cleanup_cb)(void *opaque); + + +/** + * Set callbacks and private data to render decoded video to a custom area + * in memory. + * Use libvlc_video_set_format() or libvlc_video_set_format_callbacks() + * to configure the decoded format. + * + * \warning Rendering video into custom memory buffers is considerably less + * efficient than rendering in a custom window as normal. + * + * For optimal perfomances, VLC media player renders into a custom window, and + * does not use this function and associated callbacks. It is highly + * recommended that other LibVLC-based application do likewise. + * To embed video in a window, use libvlc_media_player_set_xid() or equivalent + * depending on the operating system. + * + * If window embedding does not fit the application use case, then a custom + * LibVLC video output display plugin is required to maintain optimal video + * rendering performances. + * + * The following limitations affect performance: + * - Hardware video decoding acceleration will either be disabled completely, + * or require (relatively slow) copy from video/DSP memory to main memory. + * - Sub-pictures (subtitles, on-screen display, etc.) must be blent into the + * main picture by the CPU instead of the GPU. + * - Depending on the video format, pixel format conversion, picture scaling, + * cropping and/or picture re-orientation, must be performed by the CPU + * instead of the GPU. + * - Memory copying is required between LibVLC reference picture buffers and + * application buffers (between lock and unlock callbacks). + * + * \param mp the media player + * \param lock callback to lock video memory (must not be NULL) + * \param unlock callback to unlock video memory (or NULL if not needed) + * \param display callback to display video (or NULL if not needed) + * \param opaque private pointer for the three callbacks (as first parameter) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API +void libvlc_video_set_callbacks( libvlc_media_player_t *mp, + libvlc_video_lock_cb lock, + libvlc_video_unlock_cb unlock, + libvlc_video_display_cb display, + void *opaque ); + +/** + * Set decoded video chroma and dimensions. + * This only works in combination with libvlc_video_set_callbacks(), + * and is mutually exclusive with libvlc_video_set_format_callbacks(). + * + * \param mp the media player + * \param chroma a four-characters string identifying the chroma + * (e.g. "RV32" or "YUYV") + * \param width pixel width + * \param height pixel height + * \param pitch line pitch (in bytes) + * \version LibVLC 1.1.1 or later + * \bug All pixel planes are expected to have the same pitch. + * To use the YCbCr color space with chrominance subsampling, + * consider using libvlc_video_set_format_callbacks() instead. + */ +LIBVLC_API +void libvlc_video_set_format( libvlc_media_player_t *mp, const char *chroma, + unsigned width, unsigned height, + unsigned pitch ); + +/** + * Set decoded video chroma and dimensions. This only works in combination with + * libvlc_video_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the video format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_video_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_video_format_cb setup, + libvlc_video_cleanup_cb cleanup ); + +/** + * Set the NSView handler where the media player should render its video output. + * + * Use the vout called "macosx". + * + * The drawable is an NSObject that follow the VLCOpenGLVideoViewEmbedding + * protocol: + * + * @code{.m} + * \@protocol VLCOpenGLVideoViewEmbedding + * - (void)addVoutSubview:(NSView *)view; + * - (void)removeVoutSubview:(NSView *)view; + * \@end + * @endcode + * + * Or it can be an NSView object. + * + * If you want to use it along with Qt see the QMacCocoaViewContainer. Then + * the following code should work: + * @code{.mm} + * { + * NSView *video = [[NSView alloc] init]; + * QMacCocoaViewContainer *container = new QMacCocoaViewContainer(video, parent); + * libvlc_media_player_set_nsobject(mp, video); + * [video release]; + * } + * @endcode + * + * You can find a live example in VLCVideoView in VLCKit.framework. + * + * \param p_mi the Media Player + * \param drawable the drawable that is either an NSView or an object following + * the VLCOpenGLVideoViewEmbedding protocol. + */ +LIBVLC_API void libvlc_media_player_set_nsobject ( libvlc_media_player_t *p_mi, void * drawable ); + +/** + * Get the NSView handler previously set with libvlc_media_player_set_nsobject(). + * + * \param p_mi the Media Player + * \return the NSView handler or 0 if none where set + */ +LIBVLC_API void * libvlc_media_player_get_nsobject ( libvlc_media_player_t *p_mi ); + +/** + * Set an X Window System drawable where the media player should render its + * video output. The call takes effect when the playback starts. If it is + * already started, it might need to be stopped before changes apply. + * If LibVLC was built without X11 output support, then this function has no + * effects. + * + * By default, LibVLC will capture input events on the video rendering area. + * Use libvlc_video_set_mouse_input() and libvlc_video_set_key_input() to + * disable that and deliver events to the parent window / to the application + * instead. By design, the X11 protocol delivers input events to only one + * recipient. + * + * \warning + * The application must call the XInitThreads() function from Xlib before + * libvlc_new(), and before any call to XOpenDisplay() directly or via any + * other library. Failure to call XInitThreads() will seriously impede LibVLC + * performance. Calling XOpenDisplay() before XInitThreads() will eventually + * crash the process. That is a limitation of Xlib. + * + * \param p_mi media player + * \param drawable X11 window ID + * + * \note + * The specified identifier must correspond to an existing Input/Output class + * X11 window. Pixmaps are not currently supported. The default X11 + * server is assumed, i.e. that specified in the DISPLAY environment variable. + * + * \warning + * LibVLC can deal with invalid X11 handle errors, however some display drivers + * (EGL, GLX, VA and/or VDPAU) can unfortunately not. Thus the window handle + * must remain valid until playback is stopped, otherwise the process may + * abort or crash. + * + * \bug + * No more than one window handle per media player instance can be specified. + * If the media has multiple simultaneously active video tracks, extra tracks + * will be rendered into external windows beyond the control of the + * application. + */ +LIBVLC_API void libvlc_media_player_set_xwindow(libvlc_media_player_t *p_mi, + uint32_t drawable); + +/** + * Get the X Window System window identifier previously set with + * libvlc_media_player_set_xwindow(). Note that this will return the identifier + * even if VLC is not currently using it (for instance if it is playing an + * audio-only input). + * + * \param p_mi the Media Player + * \return an X window ID, or 0 if none where set. + */ +LIBVLC_API uint32_t libvlc_media_player_get_xwindow ( libvlc_media_player_t *p_mi ); + +/** + * Set a Win32/Win64 API window handle (HWND) where the media player should + * render its video output. If LibVLC was built without Win32/Win64 API output + * support, then this has no effects. + * + * \param p_mi the Media Player + * \param drawable windows handle of the drawable + */ +LIBVLC_API void libvlc_media_player_set_hwnd ( libvlc_media_player_t *p_mi, void *drawable ); + +/** + * Get the Windows API window handle (HWND) previously set with + * libvlc_media_player_set_hwnd(). The handle will be returned even if LibVLC + * is not currently outputting any video to it. + * + * \param p_mi the Media Player + * \return a window handle or NULL if there are none. + */ +LIBVLC_API void *libvlc_media_player_get_hwnd ( libvlc_media_player_t *p_mi ); + +/** + * Set the android context. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param p_awindow_handler org.videolan.libvlc.AWindow jobject owned by the + * org.videolan.libvlc.MediaPlayer class from the libvlc-android project. + */ +LIBVLC_API void libvlc_media_player_set_android_context( libvlc_media_player_t *p_mi, + void *p_awindow_handler ); + +/** + * Set the EFL Evas Object. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param p_evas_object a valid EFL Evas Object (Evas_Object) + * \return -1 if an error was detected, 0 otherwise. + */ +LIBVLC_API int libvlc_media_player_set_evas_object( libvlc_media_player_t *p_mi, + void *p_evas_object ); + + +/** + * Callback prototype for audio playback. + * + * The LibVLC media player decodes and post-processes the audio signal + * asynchronously (in an internal thread). Whenever audio samples are ready + * to be queued to the output, this callback is invoked. + * + * The number of samples provided per invocation may depend on the file format, + * the audio coding algorithm, the decoder plug-in, the post-processing + * filters and timing. Application must not assume a certain number of samples. + * + * The exact format of audio samples is determined by libvlc_audio_set_format() + * or libvlc_audio_set_format_callbacks() as is the channels layout. + * + * Note that the number of samples is per channel. For instance, if the audio + * track sampling rate is 48000 Hz, then 1200 samples represent 25 milliseconds + * of audio signal - regardless of the number of audio channels. + * + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param samples pointer to a table of audio samples to play back [IN] + * \param count number of audio samples to play back + * \param pts expected play time stamp (see libvlc_delay()) + */ +typedef void (*libvlc_audio_play_cb)(void *data, const void *samples, + unsigned count, int64_t pts); + +/** + * Callback prototype for audio pause. + * + * LibVLC invokes this callback to pause audio playback. + * + * \note The pause callback is never called if the audio is already paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the pause request (should be elapsed already) + */ +typedef void (*libvlc_audio_pause_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio resumption. + * + * LibVLC invokes this callback to resume audio playback after it was + * previously paused. + * + * \note The resume callback is never called if the audio is not paused. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param pts time stamp of the resumption request (should be elapsed already) + */ +typedef void (*libvlc_audio_resume_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer flush. + * + * LibVLC invokes this callback if it needs to discard all pending buffers and + * stop playback as soon as possible. This typically occurs when the media is + * stopped. + * + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_flush_cb)(void *data, int64_t pts); + +/** + * Callback prototype for audio buffer drain. + * + * LibVLC may invoke this callback when the decoded audio track is ending. + * There will be no further decoded samples for the track, but playback should + * nevertheless continue until all already pending buffers are rendered. + * + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_drain_cb)(void *data); + +/** + * Callback prototype for audio volume change. + * \param data data pointer as passed to libvlc_audio_set_callbacks() [IN] + * \param volume software volume (1. = nominal, 0. = mute) + * \param mute muted flag + */ +typedef void (*libvlc_audio_set_volume_cb)(void *data, + float volume, bool mute); + +/** + * Sets callbacks and private data for decoded audio. + * + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \note The audio callbacks override any other audio output mechanism. + * If the callbacks are set, LibVLC will not output audio in any way. + * + * \param mp the media player + * \param play callback to play audio samples (must not be NULL) + * \param pause callback to pause playback (or NULL to ignore) + * \param resume callback to resume playback (or NULL to ignore) + * \param flush callback to flush audio buffers (or NULL to ignore) + * \param drain callback to drain audio buffers (or NULL to ignore) + * \param opaque private pointer for the audio callbacks (as first parameter) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_callbacks( libvlc_media_player_t *mp, + libvlc_audio_play_cb play, + libvlc_audio_pause_cb pause, + libvlc_audio_resume_cb resume, + libvlc_audio_flush_cb flush, + libvlc_audio_drain_cb drain, + void *opaque ); + +/** + * Set callbacks and private data for decoded audio. This only works in + * combination with libvlc_audio_set_callbacks(). + * Use libvlc_audio_set_format() or libvlc_audio_set_format_callbacks() + * to configure the decoded audio format. + * + * \param mp the media player + * \param set_volume callback to apply audio volume, + * or NULL to apply volume in software + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_volume_callback( libvlc_media_player_t *mp, + libvlc_audio_set_volume_cb set_volume ); + +/** + * Callback prototype to setup the audio playback. + * + * This is called when the media player needs to create a new audio output. + * \param opaque pointer to the data pointer passed to + * libvlc_audio_set_callbacks() [IN/OUT] + * \param format 4 bytes sample format [IN/OUT] + * \param rate sample rate [IN/OUT] + * \param channels channels count [IN/OUT] + * \return 0 on success, anything else to skip audio playback + */ +typedef int (*libvlc_audio_setup_cb)(void **data, char *format, unsigned *rate, + unsigned *channels); + +/** + * Callback prototype for audio playback cleanup. + * + * This is called when the media player no longer needs an audio output. + * \param opaque data pointer as passed to libvlc_audio_set_callbacks() [IN] + */ +typedef void (*libvlc_audio_cleanup_cb)(void *data); + +/** + * Sets decoded audio format via callbacks. + * + * This only works in combination with libvlc_audio_set_callbacks(). + * + * \param mp the media player + * \param setup callback to select the audio format (cannot be NULL) + * \param cleanup callback to release any allocated resources (or NULL) + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format_callbacks( libvlc_media_player_t *mp, + libvlc_audio_setup_cb setup, + libvlc_audio_cleanup_cb cleanup ); + +/** + * Sets a fixed decoded audio format. + * + * This only works in combination with libvlc_audio_set_callbacks(), + * and is mutually exclusive with libvlc_audio_set_format_callbacks(). + * + * \param mp the media player + * \param format a four-characters string identifying the sample format + * (e.g. "S16N" or "FL32") + * \param rate sample rate (expressed in Hz) + * \param channels channels count + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API +void libvlc_audio_set_format( libvlc_media_player_t *mp, const char *format, + unsigned rate, unsigned channels ); + +/** \bug This might go away ... to be replaced by a broader system */ + +/** + * Get the current movie length (in ms). + * + * \param p_mi the Media Player + * \return the movie length (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_length( libvlc_media_player_t *p_mi ); + +/** + * Get the current movie time (in ms). + * + * \param p_mi the Media Player + * \return the movie time (in ms), or -1 if there is no media. + */ +LIBVLC_API libvlc_time_t libvlc_media_player_get_time( libvlc_media_player_t *p_mi ); + +/** + * Set the movie time (in ms). This has no effect if no media is being played. + * Not all formats and protocols support this. + * + * \param p_mi the Media Player + * \param i_time the movie time (in ms). + */ +LIBVLC_API void libvlc_media_player_set_time( libvlc_media_player_t *p_mi, libvlc_time_t i_time ); + +/** + * Get movie position as percentage between 0.0 and 1.0. + * + * \param p_mi the Media Player + * \return movie position, or -1. in case of error + */ +LIBVLC_API float libvlc_media_player_get_position( libvlc_media_player_t *p_mi ); + +/** + * Set movie position as percentage between 0.0 and 1.0. + * This has no effect if playback is not enabled. + * This might not work depending on the underlying input format and protocol. + * + * \param p_mi the Media Player + * \param f_pos the position + */ +LIBVLC_API void libvlc_media_player_set_position( libvlc_media_player_t *p_mi, float f_pos ); + +/** + * Set movie chapter (if applicable). + * + * \param p_mi the Media Player + * \param i_chapter chapter number to play + */ +LIBVLC_API void libvlc_media_player_set_chapter( libvlc_media_player_t *p_mi, int i_chapter ); + +/** + * Get movie chapter. + * + * \param p_mi the Media Player + * \return chapter number currently playing, or -1 if there is no media. + */ +LIBVLC_API int libvlc_media_player_get_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get movie chapter count + * + * \param p_mi the Media Player + * \return number of chapters in movie, or -1. + */ +LIBVLC_API int libvlc_media_player_get_chapter_count( libvlc_media_player_t *p_mi ); + +/** + * Is the player able to play + * + * \param p_mi the Media Player + * \return boolean + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_will_play( libvlc_media_player_t *p_mi ); + +/** + * Get title chapter count + * + * \param p_mi the Media Player + * \param i_title title + * \return number of chapters in title, or -1 + */ +LIBVLC_API int libvlc_media_player_get_chapter_count_for_title( + libvlc_media_player_t *p_mi, int i_title ); + +/** + * Set movie title + * + * \param p_mi the Media Player + * \param i_title title number to play + */ +LIBVLC_API void libvlc_media_player_set_title( libvlc_media_player_t *p_mi, int i_title ); + +/** + * Get movie title + * + * \param p_mi the Media Player + * \return title number currently playing, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title( libvlc_media_player_t *p_mi ); + +/** + * Get movie title count + * + * \param p_mi the Media Player + * \return title number count, or -1 + */ +LIBVLC_API int libvlc_media_player_get_title_count( libvlc_media_player_t *p_mi ); + +/** + * Set previous chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_previous_chapter( libvlc_media_player_t *p_mi ); + +/** + * Set next chapter (if applicable) + * + * \param p_mi the Media Player + */ +LIBVLC_API void libvlc_media_player_next_chapter( libvlc_media_player_t *p_mi ); + +/** + * Get the requested movie play rate. + * @warning Depending on the underlying media, the requested rate may be + * different from the real playback rate. + * + * \param p_mi the Media Player + * \return movie play rate + */ +LIBVLC_API float libvlc_media_player_get_rate( libvlc_media_player_t *p_mi ); + +/** + * Set movie play rate + * + * \param p_mi the Media Player + * \param rate movie play rate to set + * \return -1 if an error was detected, 0 otherwise (but even then, it might + * not actually work depending on the underlying media protocol) + */ +LIBVLC_API int libvlc_media_player_set_rate( libvlc_media_player_t *p_mi, float rate ); + +/** + * Get current movie state + * + * \param p_mi the Media Player + * \return the current state of the media player (playing, paused, ...) \see libvlc_state_t + */ +LIBVLC_API libvlc_state_t libvlc_media_player_get_state( libvlc_media_player_t *p_mi ); + +/** + * How many video outputs does this media player have? + * + * \param p_mi the media player + * \return the number of video outputs + */ +LIBVLC_API unsigned libvlc_media_player_has_vout( libvlc_media_player_t *p_mi ); + +/** + * Is this media player seekable? + * + * \param p_mi the media player + * \return true if the media player can seek + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_is_seekable( libvlc_media_player_t *p_mi ); + +/** + * Can this media player be paused? + * + * \param p_mi the media player + * \return true if the media player can pause + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi ); + +/** + * Check if the current program is scrambled + * + * \param p_mi the media player + * \return true if the current program is scrambled + * + * \libvlc_return_bool + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_program_scrambled( libvlc_media_player_t *p_mi ); + +/** + * Display the next frame (if supported) + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_media_player_next_frame( libvlc_media_player_t *p_mi ); + +/** + * Navigate through DVD Menu + * + * \param p_mi the Media Player + * \param navigate the Navigation mode + * \version libVLC 2.0.0 or later + */ +LIBVLC_API void libvlc_media_player_navigate( libvlc_media_player_t* p_mi, + unsigned navigate ); + +/** + * Set if, and how, the video title will be shown when media is played. + * + * \param p_mi the media player + * \param position position at which to display the title, or libvlc_position_disable to prevent the title from being displayed + * \param timeout title display timeout in milliseconds (ignored if libvlc_position_disable) + * \version libVLC 2.1.0 or later + */ +LIBVLC_API void libvlc_media_player_set_video_title_display( libvlc_media_player_t *p_mi, libvlc_position_t position, unsigned int timeout ); + +/** + * Add a slave to the current media player. + * + * \note If the player is playing, the slave will be added directly. This call + * will also update the slave list of the attached libvlc_media_t. + * + * \version LibVLC 3.0.0 and later. + * + * \see libvlc_media_slaves_add + * + * \param p_mi the media player + * \param i_type subtitle or audio + * \param psz_uri Uri of the slave (should contain a valid scheme). + * \param b_select True if this slave should be selected when it's loaded + * + * \return 0 on success, -1 on error. + */ +LIBVLC_API +int libvlc_media_player_add_slave( libvlc_media_player_t *p_mi, + libvlc_media_slave_type_t i_type, + const char *psz_uri, bool b_select ); + +/** + * Release (free) libvlc_track_description_t + * + * \param p_track_description the structure to release + */ +LIBVLC_API void libvlc_track_description_list_release( libvlc_track_description_t *p_track_description ); + +/** \defgroup libvlc_video LibVLC video controls + * @{ + */ + +/** + * Toggle fullscreen status on non-embedded video outputs. + * + * @warning The same limitations applies to this function + * as to libvlc_set_fullscreen(). + * + * \param p_mi the media player + */ +LIBVLC_API void libvlc_toggle_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable fullscreen. + * + * @warning With most window managers, only a top-level windows can be in + * full-screen mode. Hence, this function will not operate properly if + * libvlc_media_player_set_xwindow() was used to embed the video in a + * non-top-level window. In that case, the embedding window must be reparented + * to the root window before fullscreen mode is enabled. You will want + * to reparent it back to its normal parent when disabling fullscreen. + * + * \param p_mi the media player + * \param b_fullscreen boolean for fullscreen status + */ +LIBVLC_API void libvlc_set_fullscreen( libvlc_media_player_t *p_mi, int b_fullscreen ); + +/** + * Get current fullscreen status. + * + * \param p_mi the media player + * \return the fullscreen status (boolean) + * + * \libvlc_return_bool + */ +LIBVLC_API int libvlc_get_fullscreen( libvlc_media_player_t *p_mi ); + +/** + * Enable or disable key press events handling, according to the LibVLC hotkeys + * configuration. By default and for historical reasons, keyboard events are + * handled by the LibVLC video widget. + * + * \note On X11, there can be only one subscriber for key press and mouse + * click events per window. If your application has subscribed to those events + * for the X window ID of the video widget, then LibVLC will not be able to + * handle key presses and mouse clicks in any case. + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle key press events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_key_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Enable or disable mouse click events handling. By default, those events are + * handled. This is needed for DVD menus to work, as well as a few video + * filters such as "puzzle". + * + * \see libvlc_video_set_key_input(). + * + * \warning This function is only implemented for X11 and Win32 at the moment. + * + * \param p_mi the media player + * \param on true to handle mouse click events, false to ignore them. + */ +LIBVLC_API +void libvlc_video_set_mouse_input( libvlc_media_player_t *p_mi, unsigned on ); + +/** + * Get the pixel dimensions of a video. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the pixel width [OUT] + * \param py pointer to get the pixel height [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_size( libvlc_media_player_t *p_mi, unsigned num, + unsigned *px, unsigned *py ); + +/** + * Get the mouse pointer coordinates over a video. + * Coordinates are expressed in terms of the decoded video resolution, + * not in terms of pixels on the screen/viewport (to get the latter, + * you can query your windowing system directly). + * + * Either of the coordinates may be negative or larger than the corresponding + * dimension of the video, if the cursor is outside the rendering area. + * + * @warning The coordinates may be out-of-date if the pointer is not located + * on the video rendering area. LibVLC does not track the pointer if it is + * outside of the video widget. + * + * @note LibVLC does not support multiple pointers (it does of course support + * multiple input devices sharing the same pointer) at the moment. + * + * \param p_mi media player + * \param num number of the video (starting from, and most commonly 0) + * \param px pointer to get the abscissa [OUT] + * \param py pointer to get the ordinate [OUT] + * \return 0 on success, -1 if the specified video does not exist + */ +LIBVLC_API +int libvlc_video_get_cursor( libvlc_media_player_t *p_mi, unsigned num, + int *px, int *py ); + +/** + * Get the current video scaling factor. + * See also libvlc_video_set_scale(). + * + * \param p_mi the media player + * \return the currently configured zoom factor, or 0. if the video is set + * to fit to the output window/drawable automatically. + */ +LIBVLC_API float libvlc_video_get_scale( libvlc_media_player_t *p_mi ); + +/** + * Set the video scaling factor. That is the ratio of the number of pixels on + * screen to the number of pixels in the original decoded video in each + * dimension. Zero is a special value; it will adjust the video to the output + * window/drawable (in windowed mode) or the entire screen. + * + * Note that not all video outputs support scaling. + * + * \param p_mi the media player + * \param f_factor the scaling factor, or zero + */ +LIBVLC_API void libvlc_video_set_scale( libvlc_media_player_t *p_mi, float f_factor ); + +/** + * Get current video aspect ratio. + * + * \param p_mi the media player + * \return the video aspect ratio or NULL if unspecified + * (the result must be released with free() or libvlc_free()). + */ +LIBVLC_API char *libvlc_video_get_aspect_ratio( libvlc_media_player_t *p_mi ); + +/** + * Set new video aspect ratio. + * + * \param p_mi the media player + * \param psz_aspect new video aspect-ratio or NULL to reset to default + * \note Invalid aspect ratios are ignored. + */ +LIBVLC_API void libvlc_video_set_aspect_ratio( libvlc_media_player_t *p_mi, const char *psz_aspect ); + +/** + * Create a video viewpoint structure. + * + * \version LibVLC 3.0.0 and later + * + * \return video viewpoint or NULL + * (the result must be released with free() or libvlc_free()). + */ +LIBVLC_API libvlc_video_viewpoint_t *libvlc_video_new_viewpoint(void); + +/** + * Update the video viewpoint information. + * + * \note It is safe to call this function before the media player is started. + * + * \version LibVLC 3.0.0 and later + * + * \param p_mi the media player + * \param p_viewpoint video viewpoint allocated via libvlc_video_new_viewpoint() + * \param b_absolute if true replace the old viewpoint with the new one. If + * false, increase/decrease it. + * \return -1 in case of error, 0 otherwise + * + * \note the values are set asynchronously, it will be used by the next frame displayed. + */ +LIBVLC_API int libvlc_video_update_viewpoint( libvlc_media_player_t *p_mi, + const libvlc_video_viewpoint_t *p_viewpoint, + bool b_absolute); + +/** + * Get current video subtitle. + * + * \param p_mi the media player + * \return the video subtitle selected, or -1 if none + */ +LIBVLC_API int libvlc_video_get_spu( libvlc_media_player_t *p_mi ); + +/** + * Get the number of available video subtitles. + * + * \param p_mi the media player + * \return the number of available video subtitles + */ +LIBVLC_API int libvlc_video_get_spu_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video subtitles. + * + * \param p_mi the media player + * \return list containing description of available video subtitles. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_spu_description( libvlc_media_player_t *p_mi ); + +/** + * Set new video subtitle. + * + * \param p_mi the media player + * \param i_spu video subtitle track to select (i_id from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API int libvlc_video_set_spu( libvlc_media_player_t *p_mi, int i_spu ); + +/** + * Get the current subtitle delay. Positive values means subtitles are being + * displayed later, negative values earlier. + * + * \param p_mi media player + * \return time (in microseconds) the display of subtitles is being delayed + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int64_t libvlc_video_get_spu_delay( libvlc_media_player_t *p_mi ); + +/** + * Set the subtitle delay. This affects the timing of when the subtitle will + * be displayed. Positive values result in subtitles being displayed later, + * while negative values will result in subtitles being displayed earlier. + * + * The subtitle delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay time (in microseconds) the display of subtitles should be delayed + * \return 0 on success, -1 on error + * \version LibVLC 2.0.0 or later + */ +LIBVLC_API int libvlc_video_set_spu_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the full description of available titles + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param titles address to store an allocated array of title descriptions + * descriptions (must be freed with libvlc_title_descriptions_release() + * by the caller) [OUT] + * + * \return the number of titles (-1 on error) + */ +LIBVLC_API int libvlc_media_player_get_full_title_descriptions( libvlc_media_player_t *p_mi, + libvlc_title_description_t ***titles ); + +/** + * Release a title description + * + * \version LibVLC 3.0.0 and later + * + * \param p_titles title description array to release + * \param i_count number of title descriptions to release + */ +LIBVLC_API + void libvlc_title_descriptions_release( libvlc_title_description_t **p_titles, + unsigned i_count ); + +/** + * Get the full description of available chapters + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi the media player + * \param i_chapters_of_title index of the title to query for chapters (uses current title if set to -1) + * \param pp_chapters address to store an allocated array of chapter descriptions + * descriptions (must be freed with libvlc_chapter_descriptions_release() + * by the caller) [OUT] + * + * \return the number of chapters (-1 on error) + */ +LIBVLC_API int libvlc_media_player_get_full_chapter_descriptions( libvlc_media_player_t *p_mi, + int i_chapters_of_title, + libvlc_chapter_description_t *** pp_chapters ); + +/** + * Release a chapter description + * + * \version LibVLC 3.0.0 and later + * + * \param p_chapters chapter description array to release + * \param i_count number of chapter descriptions to release + */ +LIBVLC_API +void libvlc_chapter_descriptions_release( libvlc_chapter_description_t **p_chapters, + unsigned i_count ); + +/** + * Get current crop filter geometry. + * + * \param p_mi the media player + * \return the crop filter geometry or NULL if unset + */ +LIBVLC_API char *libvlc_video_get_crop_geometry( libvlc_media_player_t *p_mi ); + +/** + * Set new crop filter geometry. + * + * \param p_mi the media player + * \param psz_geometry new crop filter geometry (NULL to unset) + */ +LIBVLC_API +void libvlc_video_set_crop_geometry( libvlc_media_player_t *p_mi, const char *psz_geometry ); + +/** + * Get current teletext page requested or 0 if it's disabled. + * + * Teletext is disabled by default, call libvlc_video_set_teletext() to enable + * it. + * + * \param p_mi the media player + * \return the current teletext page requested. + */ +LIBVLC_API int libvlc_video_get_teletext( libvlc_media_player_t *p_mi ); + +/** + * Set new teletext page to retrieve. + * + * This function can also be used to send a teletext key. + * + * \param p_mi the media player + * \param i_page teletex page number requested. This value can be 0 to disable + * teletext, a number in the range ]0;1000[ to show the requested page, or a + * \ref libvlc_teletext_key_t. 100 is the default teletext page. + */ +LIBVLC_API void libvlc_video_set_teletext( libvlc_media_player_t *p_mi, int i_page ); + +/** + * Get number of available video tracks. + * + * \param p_mi media player + * \return the number of available video tracks (int) + */ +LIBVLC_API int libvlc_video_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available video tracks. + * + * \param p_mi media player + * \return list with description of available video tracks, or NULL on error. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_API libvlc_track_description_t * + libvlc_video_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current video track. + * + * \param p_mi media player + * \return the video track ID (int) or -1 if no active input + */ +LIBVLC_API int libvlc_video_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set video track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 if out of range + */ +LIBVLC_API +int libvlc_video_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Take a snapshot of the current video window. + * + * If i_width AND i_height is 0, original size is used. + * If i_width XOR i_height is 0, original aspect-ratio is preserved. + * + * \param p_mi media player instance + * \param num number of video output (typically 0 for the first/only one) + * \param psz_filepath the path of a file or a folder to save the screenshot into + * \param i_width the snapshot's width + * \param i_height the snapshot's height + * \return 0 on success, -1 if the video was not found + */ +LIBVLC_API +int libvlc_video_take_snapshot( libvlc_media_player_t *p_mi, unsigned num, + const char *psz_filepath, unsigned int i_width, + unsigned int i_height ); + +/** + * Enable or disable deinterlace filter + * + * \param p_mi libvlc media player + * \param psz_mode type of deinterlace filter, NULL to disable + */ +LIBVLC_API void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi, + const char *psz_mode ); + +/** + * Get an integer marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_int_option_t + */ +LIBVLC_API int libvlc_video_get_marquee_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Get a string marquee option value + * + * \param p_mi libvlc media player + * \param option marq option to get \see libvlc_video_marquee_string_option_t + */ +LIBVLC_API char *libvlc_video_get_marquee_string( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Enable, disable or set an integer marquee option + * + * Setting libvlc_marquee_Enable has the side effect of enabling (arg !0) + * or disabling (arg 0) the marq filter. + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_int_option_t + * \param i_val marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_int( libvlc_media_player_t *p_mi, + unsigned option, int i_val ); + +/** + * Set a marquee string option + * + * \param p_mi libvlc media player + * \param option marq option to set \see libvlc_video_marquee_string_option_t + * \param psz_text marq option value + */ +LIBVLC_API void libvlc_video_set_marquee_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_text ); + +/** option values for libvlc_video_{get,set}_logo_{int,string} */ +enum libvlc_video_logo_option_t { + libvlc_logo_enable, + libvlc_logo_file, /**< string argument, "file,d,t;file,d,t;..." */ + libvlc_logo_x, + libvlc_logo_y, + libvlc_logo_delay, + libvlc_logo_repeat, + libvlc_logo_opacity, + libvlc_logo_position +}; + +/** + * Get integer logo option. + * + * \param p_mi libvlc media player instance + * \param option logo option to get, values of libvlc_video_logo_option_t + */ +LIBVLC_API int libvlc_video_get_logo_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set logo option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_logo_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the logo filter. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Set logo option as string. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option logo option to set, values of libvlc_video_logo_option_t + * \param psz_value logo option value + */ +LIBVLC_API void libvlc_video_set_logo_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_value ); + + +/** option values for libvlc_video_{get,set}_adjust_{int,float,bool} */ +enum libvlc_video_adjust_option_t { + libvlc_adjust_Enable = 0, + libvlc_adjust_Contrast, + libvlc_adjust_Brightness, + libvlc_adjust_Hue, + libvlc_adjust_Saturation, + libvlc_adjust_Gamma +}; + +/** + * Get integer adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API int libvlc_video_get_adjust_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_adjust_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the adjust filter. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Get float adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as float. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + * \version LibVLC 1.1.1 and later. + */ +LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, + unsigned option, float value ); + +/** @} video */ + +/** \defgroup libvlc_audio LibVLC audio controls + * @{ + */ + +/** + * Audio device types + */ +typedef enum libvlc_audio_output_device_types_t { + libvlc_AudioOutputDevice_Error = -1, + libvlc_AudioOutputDevice_Mono = 1, + libvlc_AudioOutputDevice_Stereo = 2, + libvlc_AudioOutputDevice_2F2R = 4, + libvlc_AudioOutputDevice_3F2R = 5, + libvlc_AudioOutputDevice_5_1 = 6, + libvlc_AudioOutputDevice_6_1 = 7, + libvlc_AudioOutputDevice_7_1 = 8, + libvlc_AudioOutputDevice_SPDIF = 10 +} libvlc_audio_output_device_types_t; + +/** + * Audio channels + */ +typedef enum libvlc_audio_output_channel_t { + libvlc_AudioChannel_Error = -1, + libvlc_AudioChannel_Stereo = 1, + libvlc_AudioChannel_RStereo = 2, + libvlc_AudioChannel_Left = 3, + libvlc_AudioChannel_Right = 4, + libvlc_AudioChannel_Dolbys = 5 +} libvlc_audio_output_channel_t; + + +/** + * Gets the list of available audio output modules. + * + * \param p_instance libvlc instance + * \return list of available audio outputs. It must be freed with +* \see libvlc_audio_output_list_release \see libvlc_audio_output_t . + * In case of error, NULL is returned. + */ +LIBVLC_API libvlc_audio_output_t * +libvlc_audio_output_list_get( libvlc_instance_t *p_instance ); + +/** + * Frees the list of available audio output modules. + * + * \param p_list list with audio outputs for release + */ +LIBVLC_API +void libvlc_audio_output_list_release( libvlc_audio_output_t *p_list ); + +/** + * Selects an audio output module. + * \note Any change will take be effect only after playback is stopped and + * restarted. Audio output cannot be changed while playing. + * + * \param p_mi media player + * \param psz_name name of audio output, + * use psz_name of \see libvlc_audio_output_t + * \return 0 if function succeeded, -1 on error + */ +LIBVLC_API int libvlc_audio_output_set( libvlc_media_player_t *p_mi, + const char *psz_name ); + +/** + * Gets a list of potential audio output devices, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support enumerating devices. + * The audio output may be functional even if the list is empty (NULL). + * + * \note The list may not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param mp media player + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed with libvlc_audio_output_device_list_release() + * \version LibVLC 2.2.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_enum( libvlc_media_player_t *mp ); + +/** + * Gets a list of audio output devices for a given audio output module, + * \see libvlc_audio_output_device_set(). + * + * \note Not all audio outputs support this. In particular, an empty (NULL) + * list of devices does not imply that the specified audio output does + * not work. + * + * \note The list might not be exhaustive. + * + * \warning Some audio output devices in the list might not actually work in + * some circumstances. By default, it is recommended to not specify any + * explicit audio device. + * + * \param p_instance libvlc instance + * \param aout audio output name + * (as returned by libvlc_audio_output_list_get()) + * \return A NULL-terminated linked list of potential audio output devices. + * It must be freed with libvlc_audio_output_device_list_release() + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API libvlc_audio_output_device_t * +libvlc_audio_output_device_list_get( libvlc_instance_t *p_instance, + const char *aout ); + +/** + * Frees a list of available audio output devices. + * + * \param p_list list with audio outputs for release + * \version LibVLC 2.1.0 or later. + */ +LIBVLC_API void libvlc_audio_output_device_list_release( + libvlc_audio_output_device_t *p_list ); + +/** + * Configures an explicit audio output device. + * + * If the module paramater is NULL, audio output will be moved to the device + * specified by the device identifier string immediately. This is the + * recommended usage. + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_enum(). + * + * However passing NULL is supported in LibVLC version 2.2.0 and later only; + * in earlier versions, this function would have no effects when the module + * parameter was NULL. + * + * If the module parameter is not NULL, the device parameter of the + * corresponding audio output, if it exists, will be set to the specified + * string. Note that some audio output modules do not have such a parameter + * (notably MMDevice and PulseAudio). + * + * A list of adequate potential device strings can be obtained with + * libvlc_audio_output_device_list_get(). + * + * \note This function does not select the specified audio output plugin. + * libvlc_audio_output_set() is used for that purpose. + * + * \warning The syntax for the device parameter depends on the audio output. + * + * Some audio output modules require further parameters (e.g. a channels map + * in the case of ALSA). + * + * \param mp media player + * \param module If NULL, current audio output module. + * if non-NULL, name of audio output module + (\see libvlc_audio_output_t) + * \param device_id device identifier string + * \return Nothing. Errors are ignored (this is a design bug). + */ +LIBVLC_API void libvlc_audio_output_device_set( libvlc_media_player_t *mp, + const char *module, + const char *device_id ); + +/** + * Get the current audio output device identifier. + * + * This complements libvlc_audio_output_device_set(). + * + * \warning The initial value for the current audio output device identifier + * may not be set or may be some unknown value. A LibVLC application should + * compare this value against the known device identifiers (e.g. those that + * were previously retrieved by a call to libvlc_audio_output_device_enum or + * libvlc_audio_output_device_list_get) to find the current audio output device. + * + * It is possible that the selected audio output device changes (an external + * change) without a call to libvlc_audio_output_device_set. That may make this + * method unsuitable to use if a LibVLC application is attempting to track + * dynamic audio device changes as they happen. + * + * \param mp media player + * \return the current audio output device identifier + * NULL if no device is selected or in case of error + * (the result must be released with free() or libvlc_free()). + * \version LibVLC 3.0.0 or later. + */ +LIBVLC_API char *libvlc_audio_output_device_get( libvlc_media_player_t *mp ); + +/** + * Toggle mute status. + * + * \param p_mi media player + * \warning Toggling mute atomically is not always possible: On some platforms, + * other processes can mute the VLC audio playback stream asynchronously. Thus, + * there is a small race condition where toggling will not work. + * See also the limitations of libvlc_audio_set_mute(). + */ +LIBVLC_API void libvlc_audio_toggle_mute( libvlc_media_player_t *p_mi ); + +/** + * Get current mute status. + * + * \param p_mi media player + * \return the mute status (boolean) if defined, -1 if undefined/unapplicable + */ +LIBVLC_API int libvlc_audio_get_mute( libvlc_media_player_t *p_mi ); + +/** + * Set mute status. + * + * \param p_mi media player + * \param status If status is true then mute, otherwise unmute + * \warning This function does not always work. If there are no active audio + * playback stream, the mute status might not be available. If digital + * pass-through (S/PDIF, HDMI...) is in use, muting may be unapplicable. Also + * some audio output plugins do not support muting at all. + * \note To force silent playback, disable all audio tracks. This is more + * efficient and reliable than mute. + */ +LIBVLC_API void libvlc_audio_set_mute( libvlc_media_player_t *p_mi, int status ); + +/** + * Get current software audio volume. + * + * \param p_mi media player + * \return the software volume in percents + * (0 = mute, 100 = nominal / 0dB) + */ +LIBVLC_API int libvlc_audio_get_volume( libvlc_media_player_t *p_mi ); + +/** + * Set current software audio volume. + * + * \param p_mi media player + * \param i_volume the volume in percents (0 = mute, 100 = 0dB) + * \return 0 if the volume was set, -1 if it was out of range + */ +LIBVLC_API int libvlc_audio_set_volume( libvlc_media_player_t *p_mi, int i_volume ); + +/** + * Get number of available audio tracks. + * + * \param p_mi media player + * \return the number of available audio tracks (int), or -1 if unavailable + */ +LIBVLC_API int libvlc_audio_get_track_count( libvlc_media_player_t *p_mi ); + +/** + * Get the description of available audio tracks. + * + * \param p_mi media player + * \return list with description of available audio tracks, or NULL. + * It must be freed with libvlc_track_description_list_release() + */ +LIBVLC_API libvlc_track_description_t * + libvlc_audio_get_track_description( libvlc_media_player_t *p_mi ); + +/** + * Get current audio track. + * + * \param p_mi media player + * \return the audio track ID or -1 if no active input. + */ +LIBVLC_API int libvlc_audio_get_track( libvlc_media_player_t *p_mi ); + +/** + * Set current audio track. + * + * \param p_mi media player + * \param i_track the track ID (i_id field from track description) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_track( libvlc_media_player_t *p_mi, int i_track ); + +/** + * Get current audio channel. + * + * \param p_mi media player + * \return the audio channel \see libvlc_audio_output_channel_t + */ +LIBVLC_API int libvlc_audio_get_channel( libvlc_media_player_t *p_mi ); + +/** + * Set current audio channel. + * + * \param p_mi media player + * \param channel the audio channel, \see libvlc_audio_output_channel_t + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_audio_set_channel( libvlc_media_player_t *p_mi, int channel ); + +/** + * Get current audio delay. + * + * \param p_mi media player + * \return the audio delay (microseconds) + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int64_t libvlc_audio_get_delay( libvlc_media_player_t *p_mi ); + +/** + * Set current audio delay. The audio delay will be reset to zero each time the media changes. + * + * \param p_mi media player + * \param i_delay the audio delay (microseconds) + * \return 0 on success, -1 on error + * \version LibVLC 1.1.1 or later + */ +LIBVLC_API int libvlc_audio_set_delay( libvlc_media_player_t *p_mi, int64_t i_delay ); + +/** + * Get the number of equalizer presets. + * + * \return number of presets + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_preset_count( void ); + +/** + * Get the name of a particular equalizer preset. + * + * This name can be used, for example, to prepare a preset label or menu in a user + * interface. + * + * \param u_index index of the preset, counting from zero + * \return preset name, or NULL if there is no such preset + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API const char *libvlc_audio_equalizer_get_preset_name( unsigned u_index ); + +/** + * Get the number of distinct frequency bands for an equalizer. + * + * \return number of frequency bands + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API unsigned libvlc_audio_equalizer_get_band_count( void ); + +/** + * Get a particular equalizer band frequency. + * + * This value can be used, for example, to create a label for an equalizer band control + * in a user interface. + * + * \param u_index index of the band, counting from zero + * \return equalizer band frequency (Hz), or -1 if there is no such band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_band_frequency( unsigned u_index ); + +/** + * Create a new default equalizer, with all frequency values zeroed. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new( void ); + +/** + * Create a new equalizer, with initial frequency values copied from an existing + * preset. + * + * The new equalizer can subsequently be applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The returned handle should be freed via libvlc_audio_equalizer_release() when + * it is no longer needed. + * + * \param u_index index of the preset, counting from zero + * \return opaque equalizer handle, or NULL on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API libvlc_equalizer_t *libvlc_audio_equalizer_new_from_preset( unsigned u_index ); + +/** + * Release a previously created equalizer instance. + * + * The equalizer was previously created by using libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is safe to invoke this method with a NULL p_equalizer parameter for no effect. + * + * \param p_equalizer opaque equalizer handle, or NULL + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API void libvlc_audio_equalizer_release( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new pre-amplification value for an equalizer. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_preamp preamp value (-20.0 to 20.0 Hz) + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_preamp( libvlc_equalizer_t *p_equalizer, float f_preamp ); + +/** + * Get the current pre-amplification value from an equalizer. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \return preamp value (Hz) + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_preamp( libvlc_equalizer_t *p_equalizer ); + +/** + * Set a new amplification value for a particular equalizer frequency band. + * + * The new equalizer settings are subsequently applied to a media player by invoking + * libvlc_media_player_set_equalizer(). + * + * The supplied amplification value will be clamped to the -20.0 to +20.0 range. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param f_amp amplification value (-20.0 to 20.0 Hz) + * \param u_band index, counting from zero, of the frequency band to set + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_audio_equalizer_set_amp_at_index( libvlc_equalizer_t *p_equalizer, float f_amp, unsigned u_band ); + +/** + * Get the amplification value for a particular equalizer frequency band. + * + * \param p_equalizer valid equalizer handle, must not be NULL + * \param u_band index, counting from zero, of the frequency band to get + * \return amplification value (Hz); NaN if there is no such frequency band + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API float libvlc_audio_equalizer_get_amp_at_index( libvlc_equalizer_t *p_equalizer, unsigned u_band ); + +/** + * Apply new equalizer settings to a media player. + * + * The equalizer is first created by invoking libvlc_audio_equalizer_new() or + * libvlc_audio_equalizer_new_from_preset(). + * + * It is possible to apply new equalizer settings to a media player whether the media + * player is currently playing media or not. + * + * Invoking this method will immediately apply the new equalizer settings to the audio + * output of the currently playing media if there is any. + * + * If there is no currently playing media, the new equalizer settings will be applied + * later if and when new media is played. + * + * Equalizer settings will automatically be applied to subsequently played media. + * + * To disable the equalizer for a media player invoke this method passing NULL for the + * p_equalizer parameter. + * + * The media player does not keep a reference to the supplied equalizer so it is safe + * for an application to release the equalizer reference any time after this method + * returns. + * + * \param p_mi opaque media player handle + * \param p_equalizer opaque equalizer handle, or NULL to disable the equalizer for this media player + * \return zero on success, -1 on error + * \version LibVLC 2.2.0 or later + */ +LIBVLC_API int libvlc_media_player_set_equalizer( libvlc_media_player_t *p_mi, libvlc_equalizer_t *p_equalizer ); + +/** + * Media player roles. + * + * \version LibVLC 3.0.0 and later. + * + * See \ref libvlc_media_player_set_role() + */ +typedef enum libvlc_media_player_role { + libvlc_role_None = 0, /**< Don't use a media player role */ + libvlc_role_Music, /**< Music (or radio) playback */ + libvlc_role_Video, /**< Video playback */ + libvlc_role_Communication, /**< Speech, real-time communication */ + libvlc_role_Game, /**< Video game */ + libvlc_role_Notification, /**< User interaction feedback */ + libvlc_role_Animation, /**< Embedded animation (e.g. in web page) */ + libvlc_role_Production, /**< Audio editting/production */ + libvlc_role_Accessibility, /**< Accessibility */ + libvlc_role_Test /** Testing */ +#define libvlc_role_Last libvlc_role_Test +} libvlc_media_player_role_t; + +/** + * Gets the media role. + * + * \version LibVLC 3.0.0 and later. + * + * \param p_mi media player + * \return the media player role (\ref libvlc_media_player_role_t) + */ +LIBVLC_API int libvlc_media_player_get_role(libvlc_media_player_t *p_mi); + +/** + * Sets the media role. + * + * \param p_mi media player + * \param role the media player role (\ref libvlc_media_player_role_t) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_media_player_set_role(libvlc_media_player_t *p_mi, + unsigned role); + +/** @} audio */ + +/** @} media_player */ + +# ifdef __cplusplus +} +# endif + +#endif /* VLC_LIBVLC_MEDIA_PLAYER_H */ diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_renderer_discoverer.h b/vlcdemo/vlc/vlc3/include64/libvlc_renderer_discoverer.h new file mode 100644 index 0000000..e63a8c9 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_renderer_discoverer.h @@ -0,0 +1,255 @@ +/***************************************************************************** + * libvlc_renderer_discoverer.h: libvlc external API + ***************************************************************************** + * Copyright © 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_LIBVLC_RENDERER_DISCOVERER_H +#define VLC_LIBVLC_RENDERER_DISCOVERER_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * @defgroup libvlc_renderer_discoverer LibVLC renderer discoverer + * @ingroup libvlc + * LibVLC renderer discoverer finds available renderers available on the local + * network + * @{ + * @file + * LibVLC renderer discoverer external API + */ + +typedef struct libvlc_renderer_discoverer_t libvlc_renderer_discoverer_t; + +/** + * Renderer discoverer description + * + * \see libvlc_renderer_discoverer_list_get() + */ +typedef struct libvlc_rd_description_t +{ + char *psz_name; + char *psz_longname; +} libvlc_rd_description_t; + +/** The renderer can render audio */ +#define LIBVLC_RENDERER_CAN_AUDIO 0x0001 +/** The renderer can render video */ +#define LIBVLC_RENDERER_CAN_VIDEO 0x0002 + +/** + * Renderer item + * + * This struct is passed by a @ref libvlc_event_t when a new renderer is added + * or deleted. + * + * An item is valid until the @ref libvlc_RendererDiscovererItemDeleted event + * is called with the same pointer. + * + * \see libvlc_renderer_discoverer_event_manager() + */ +typedef struct libvlc_renderer_item_t libvlc_renderer_item_t; + + +/** + * Hold a renderer item, i.e. creates a new reference + * + * This functions need to called from the libvlc_RendererDiscovererItemAdded + * callback if the libvlc user wants to use this item after. (for display or + * for passing it to the mediaplayer for example). + * + * \version LibVLC 3.0.0 or later + * + * \return the current item + */ +LIBVLC_API libvlc_renderer_item_t * +libvlc_renderer_item_hold(libvlc_renderer_item_t *p_item); + +/** + * Releases a renderer item, i.e. decrements its reference counter + * + * \version LibVLC 3.0.0 or later + */ +LIBVLC_API void +libvlc_renderer_item_release(libvlc_renderer_item_t *p_item); + +/** + * Get the human readable name of a renderer item + * + * \version LibVLC 3.0.0 or later + * + * \return the name of the item (can't be NULL, must *not* be freed) + */ +LIBVLC_API const char * +libvlc_renderer_item_name(const libvlc_renderer_item_t *p_item); + +/** + * Get the type (not translated) of a renderer item. For now, the type can only + * be "chromecast" ("upnp", "airplay" may come later). + * + * \version LibVLC 3.0.0 or later + * + * \return the type of the item (can't be NULL, must *not* be freed) + */ +LIBVLC_API const char * +libvlc_renderer_item_type(const libvlc_renderer_item_t *p_item); + +/** + * Get the icon uri of a renderer item + * + * \version LibVLC 3.0.0 or later + * + * \return the uri of the item's icon (can be NULL, must *not* be freed) + */ +LIBVLC_API const char * +libvlc_renderer_item_icon_uri(const libvlc_renderer_item_t *p_item); + +/** + * Get the flags of a renderer item + * + * \see LIBVLC_RENDERER_CAN_AUDIO + * \see LIBVLC_RENDERER_CAN_VIDEO + * + * \version LibVLC 3.0.0 or later + * + * \return bitwise flag: capabilities of the renderer, see + */ +LIBVLC_API int +libvlc_renderer_item_flags(const libvlc_renderer_item_t *p_item); + +/** + * Create a renderer discoverer object by name + * + * After this object is created, you should attach to events in order to be + * notified of the discoverer events. + * + * You need to call libvlc_renderer_discoverer_start() in order to start the + * discovery. + * + * \see libvlc_renderer_discoverer_event_manager() + * \see libvlc_renderer_discoverer_start() + * + * \version LibVLC 3.0.0 or later + * + * \param p_inst libvlc instance + * \param psz_name service name; use libvlc_renderer_discoverer_list_get() to + * get a list of the discoverer names available in this libVLC instance + * \return media discover object or NULL in case of error + */ +LIBVLC_API libvlc_renderer_discoverer_t * +libvlc_renderer_discoverer_new( libvlc_instance_t *p_inst, + const char *psz_name ); + +/** + * Release a renderer discoverer object + * + * \version LibVLC 3.0.0 or later + * + * \param p_rd renderer discoverer object + */ +LIBVLC_API void +libvlc_renderer_discoverer_release( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Start renderer discovery + * + * To stop it, call libvlc_renderer_discoverer_stop() or + * libvlc_renderer_discoverer_release() directly. + * + * \see libvlc_renderer_discoverer_stop() + * + * \version LibVLC 3.0.0 or later + * + * \param p_rd renderer discoverer object + * \return -1 in case of error, 0 otherwise + */ +LIBVLC_API int +libvlc_renderer_discoverer_start( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Stop renderer discovery. + * + * \see libvlc_renderer_discoverer_start() + * + * \version LibVLC 3.0.0 or later + * + * \param p_rd renderer discoverer object + */ +LIBVLC_API void +libvlc_renderer_discoverer_stop( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Get the event manager of the renderer discoverer + * + * The possible events to attach are @ref libvlc_RendererDiscovererItemAdded + * and @ref libvlc_RendererDiscovererItemDeleted. + * + * The @ref libvlc_renderer_item_t struct passed to event callbacks is owned by + * VLC, users should take care of holding/releasing this struct for their + * internal usage. + * + * \see libvlc_event_t.u.renderer_discoverer_item_added.item + * \see libvlc_event_t.u.renderer_discoverer_item_removed.item + * + * \version LibVLC 3.0.0 or later + * + * \return a valid event manager (can't fail) + */ +LIBVLC_API libvlc_event_manager_t * +libvlc_renderer_discoverer_event_manager( libvlc_renderer_discoverer_t *p_rd ); + +/** + * Get media discoverer services + * + * \see libvlc_renderer_list_release() + * + * \version LibVLC 3.0.0 and later + * + * \param p_inst libvlc instance + * \param ppp_services address to store an allocated array of renderer + * discoverer services (must be freed with libvlc_renderer_list_release() by + * the caller) [OUT] + * + * \return the number of media discoverer services (0 on error) + */ +LIBVLC_API size_t +libvlc_renderer_discoverer_list_get( libvlc_instance_t *p_inst, + libvlc_rd_description_t ***ppp_services ); + +/** + * Release an array of media discoverer services + * + * \see libvlc_renderer_discoverer_list_get() + * + * \version LibVLC 3.0.0 and later + * + * \param pp_services array to release + * \param i_count number of elements in the array + */ +LIBVLC_API void +libvlc_renderer_discoverer_list_release( libvlc_rd_description_t **pp_services, + size_t i_count ); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_version.h b/vlcdemo/vlc/vlc3/include64/libvlc_version.h new file mode 100644 index 0000000..c1f4365 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_version.h @@ -0,0 +1,55 @@ +/***************************************************************************** + * libvlc_version.h + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines version macros for LibVLC. + * Those macros are primilarly intended for conditional (pre)compilation. + * To get the run-time LibVLC version, use libvlc_get_version() instead + * (the run-time version may be more recent than build-time one, thanks to + * backward binary compatibility). + * + * \version This header file is available in LibVLC 1.1.4 and higher. + */ + +#ifndef LIBVLC_VERSION_H +# define LIBVLC_VERSION_H 1 + +/** LibVLC major version number */ +# define LIBVLC_VERSION_MAJOR (3) + +/** LibVLC minor version number */ +# define LIBVLC_VERSION_MINOR (0) + +/** LibVLC revision */ +# define LIBVLC_VERSION_REVISION (6) + +# define LIBVLC_VERSION_EXTRA (0) + +/** Makes a single integer from a LibVLC version numbers */ +# define LIBVLC_VERSION(maj,min,rev,extra) \ + ((maj << 24) | (min << 16) | (rev << 8) | (extra)) + +/** LibVLC full version as a single integer (for comparison) */ +# define LIBVLC_VERSION_INT \ + LIBVLC_VERSION(LIBVLC_VERSION_MAJOR, LIBVLC_VERSION_MINOR, \ + LIBVLC_VERSION_REVISION, LIBVLC_VERSION_EXTRA) + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/libvlc_vlm.h b/vlcdemo/vlc/vlc3/include64/libvlc_vlm.h new file mode 100644 index 0000000..ed6f0b0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/libvlc_vlm.h @@ -0,0 +1,342 @@ +/***************************************************************************** + * libvlc_vlm.h: libvlc_* new external API + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: cfa2d956463056b287cdb0a4faeb46442040a010 $ + * + * Authors: Clément Stenac + * Jean-Paul Saman + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_VLM_H +#define LIBVLC_VLM_H 1 + +# ifdef __cplusplus +extern "C" { +# endif + +/** \defgroup libvlc_vlm LibVLC VLM + * \ingroup libvlc + * @{ + * \file + * LibVLC stream output manager external API + */ + +/** + * Release the vlm instance related to the given libvlc_instance_t + * + * \param p_instance the instance + */ +LIBVLC_API void libvlc_vlm_release( libvlc_instance_t *p_instance ); + +/** + * Add a broadcast, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const* ppsz_options, + int b_enabled, int b_loop ); + +/** + * Add a vod, with one input. + * + * \param p_instance the instance + * \param psz_name the name of the new vod media + * \param psz_input the input MRL + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new vod + * \param psz_mux the muxer of the vod media + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_vod( libvlc_instance_t * p_instance, + const char *psz_name, const char *psz_input, + int i_options, const char * const* ppsz_options, + int b_enabled, const char *psz_mux ); + +/** + * Delete a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to delete + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_del_media( libvlc_instance_t * p_instance, + const char *psz_name ); + +/** + * Enable or disable a media (VOD or broadcast). + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_enabled the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_enabled( libvlc_instance_t *p_instance, + const char *psz_name, int b_enabled ); + +/** + * Set the output for a media. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_output( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_output ); + +/** + * Set a media's input MRL. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Add a media's input MRL. This will add the specified one. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_input the input MRL + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_add_input( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input ); + +/** + * Set a media's loop status. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param b_loop the new status + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_loop( libvlc_instance_t *p_instance, + const char *psz_name, + int b_loop ); + +/** + * Set a media's vod muxer. + * + * \param p_instance the instance + * \param psz_name the media to work on + * \param psz_mux the new muxer + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_set_mux( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_mux ); + +/** + * Edit the parameters of a media. This will delete all existing inputs and + * add the specified one. + * + * \param p_instance the instance + * \param psz_name the name of the new broadcast + * \param psz_input the input MRL + * \param psz_output the output MRL (the parameter to the "sout" variable) + * \param i_options number of additional options + * \param ppsz_options additional options + * \param b_enabled boolean for enabling the new broadcast + * \param b_loop Should this broadcast be played in loop ? + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_change_media( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const *ppsz_options, + int b_enabled, int b_loop ); + +/** + * Play the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_play_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Stop the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_stop_media ( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Pause the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_pause_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Seek in the named broadcast. + * + * \param p_instance the instance + * \param psz_name the name of the broadcast + * \param f_percentage the percentage to seek to + * \return 0 on success, -1 on error + */ +LIBVLC_API int libvlc_vlm_seek_media( libvlc_instance_t *p_instance, + const char *psz_name, + float f_percentage ); + +/** + * Return information about the named media as a JSON + * string representation. + * + * This function is mainly intended for debugging use, + * if you want programmatic access to the state of + * a vlm_media_instance_t, please use the corresponding + * libvlc_vlm_get_media_instance_xxx -functions. + * Currently there are no such functions available for + * vlm_media_t though. + * + * \param p_instance the instance + * \param psz_name the name of the media, + * if the name is an empty string, all media is described + * \return string with information about named media, or NULL on error + */ +LIBVLC_API const char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, + const char *psz_name ); + +/** + * Get vlm_media instance position by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return position as float or -1. on error + */ +LIBVLC_API float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance time by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return time as integer or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_time( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance length by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return length of media item or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_length( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); + +/** + * Get vlm_media instance playback rate by name or instance id + * + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return playback rate or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_rate( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance ); +#if 0 +/** + * Get vlm_media instance title number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return title as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_title( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance ); + +/** + * Get vlm_media instance chapter number by name or instance id + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return chapter as number or -1 on error + */ +LIBVLC_API int libvlc_vlm_get_media_instance_chapter( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance ); + +/** + * Is libvlc instance seekable ? + * \bug will always return 0 + * \param p_instance a libvlc instance + * \param psz_name name of vlm media instance + * \param i_instance instance id + * \return 1 if seekable, 0 if not, -1 if media does not exist + */ +LIBVLC_API int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance ); +#endif +/** + * Get libvlc_event_manager from a vlm media. + * The p_event_manager is immutable, so you don't have to hold the lock + * + * \param p_instance a libvlc instance + * \return libvlc_event_manager + */ +LIBVLC_API libvlc_event_manager_t * + libvlc_vlm_get_event_manager( libvlc_instance_t *p_instance ); + +/** @} */ + +# ifdef __cplusplus +} +# endif + +#endif /* */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_about.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_about.h new file mode 100644 index 0000000..a878a41 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_about.h @@ -0,0 +1,1525 @@ +/* Automatically generated file - DO NOT EDIT */ +static const char psz_license[] = +" GNU GENERAL PUBLIC LICENSE\n" +" Version 2, June 1991\n" +"\n" +" Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" +" Everyone is permitted to copy and distribute verbatim copies\n" +" of this license document, but changing it is not allowed.\n" +"\n" +" Preamble\n" +"\n" +" The licenses for most software are designed to take away your\n" +"freedom to share and change it. By contrast, the GNU General Public\n" +"License is intended to guarantee your freedom to share and change free\n" +"software--to make sure the software is free for all its users. This\n" +"General Public License applies to most of the Free Software\n" +"Foundation's software and to any other program whose authors commit to\n" +"using it. (Some other Free Software Foundation software is covered by\n" +"the GNU Lesser General Public License instead.) You can apply it to\n" +"your programs, too.\n" +"\n" +" When we speak of free software, we are referring to freedom, not\n" +"price. Our General Public Licenses are designed to make sure that you\n" +"have the freedom to distribute copies of free software (and charge for\n" +"this service if you wish), that you receive source code or can get it\n" +"if you want it, that you can change the software or use pieces of it\n" +"in new free programs; and that you know you can do these things.\n" +"\n" +" To protect your rights, we need to make restrictions that forbid\n" +"anyone to deny you these rights or to ask you to surrender the rights.\n" +"These restrictions translate to certain responsibilities for you if you\n" +"distribute copies of the software, or if you modify it.\n" +"\n" +" For example, if you distribute copies of such a program, whether\n" +"gratis or for a fee, you must give the recipients all the rights that\n" +"you have. You must make sure that they, too, receive or can get the\n" +"source code. And you must show them these terms so they know their\n" +"rights.\n" +"\n" +" We protect your rights with two steps: (1) copyright the software, and\n" +"(2) offer you this license which gives you legal permission to copy,\n" +"distribute and/or modify the software.\n" +"\n" +" Also, for each author's protection and ours, we want to make certain\n" +"that everyone understands that there is no warranty for this free\n" +"software. If the software is modified by someone else and passed on, we\n" +"want its recipients to know that what they have is not the original, so\n" +"that any problems introduced by others will not reflect on the original\n" +"authors' reputations.\n" +"\n" +" Finally, any free program is threatened constantly by software\n" +"patents. We wish to avoid the danger that redistributors of a free\n" +"program will individually obtain patent licenses, in effect making the\n" +"program proprietary. To prevent this, we have made it clear that any\n" +"patent must be licensed for everyone's free use or not licensed at all.\n" +"\n" +" The precise terms and conditions for copying, distribution and\n" +"modification follow.\n" +"\n" +" GNU GENERAL PUBLIC LICENSE\n" +" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" +"\n" +" 0. This License applies to any program or other work which contains\n" +"a notice placed by the copyright holder saying it may be distributed\n" +"under the terms of this General Public License. The \"Program\", below,\n" +"refers to any such program or work, and a \"work based on the Program\"\n" +"means either the Program or any derivative work under copyright law:\n" +"that is to say, a work containing the Program or a portion of it,\n" +"either verbatim or with modifications and/or translated into another\n" +"language. (Hereinafter, translation is included without limitation in\n" +"the term \"modification\".) Each licensee is addressed as \"you\".\n" +"\n" +"Activities other than copying, distribution and modification are not\n" +"covered by this License; they are outside its scope. The act of\n" +"running the Program is not restricted, and the output from the Program\n" +"is covered only if its contents constitute a work based on the\n" +"Program (independent of having been made by running the Program).\n" +"Whether that is true depends on what the Program does.\n" +"\n" +" 1. You may copy and distribute verbatim copies of the Program's\n" +"source code as you receive it, in any medium, provided that you\n" +"conspicuously and appropriately publish on each copy an appropriate\n" +"copyright notice and disclaimer of warranty; keep intact all the\n" +"notices that refer to this License and to the absence of any warranty;\n" +"and give any other recipients of the Program a copy of this License\n" +"along with the Program.\n" +"\n" +"You may charge a fee for the physical act of transferring a copy, and\n" +"you may at your option offer warranty protection in exchange for a fee.\n" +"\n" +" 2. You may modify your copy or copies of the Program or any portion\n" +"of it, thus forming a work based on the Program, and copy and\n" +"distribute such modifications or work under the terms of Section 1\n" +"above, provided that you also meet all of these conditions:\n" +"\n" +" a) You must cause the modified files to carry prominent notices\n" +" stating that you changed the files and the date of any change.\n" +"\n" +" b) You must cause any work that you distribute or publish, that in\n" +" whole or in part contains or is derived from the Program or any\n" +" part thereof, to be licensed as a whole at no charge to all third\n" +" parties under the terms of this License.\n" +"\n" +" c) If the modified program normally reads commands interactively\n" +" when run, you must cause it, when started running for such\n" +" interactive use in the most ordinary way, to print or display an\n" +" announcement including an appropriate copyright notice and a\n" +" notice that there is no warranty (or else, saying that you provide\n" +" a warranty) and that users may redistribute the program under\n" +" these conditions, and telling the user how to view a copy of this\n" +" License. (Exception: if the Program itself is interactive but\n" +" does not normally print such an announcement, your work based on\n" +" the Program is not required to print an announcement.)\n" +"\n" +"These requirements apply to the modified work as a whole. If\n" +"identifiable sections of that work are not derived from the Program,\n" +"and can be reasonably considered independent and separate works in\n" +"themselves, then this License, and its terms, do not apply to those\n" +"sections when you distribute them as separate works. But when you\n" +"distribute the same sections as part of a whole which is a work based\n" +"on the Program, the distribution of the whole must be on the terms of\n" +"this License, whose permissions for other licensees extend to the\n" +"entire whole, and thus to each and every part regardless of who wrote it.\n" +"\n" +"Thus, it is not the intent of this section to claim rights or contest\n" +"your rights to work written entirely by you; rather, the intent is to\n" +"exercise the right to control the distribution of derivative or\n" +"collective works based on the Program.\n" +"\n" +"In addition, mere aggregation of another work not based on the Program\n" +"with the Program (or with a work based on the Program) on a volume of\n" +"a storage or distribution medium does not bring the other work under\n" +"the scope of this License.\n" +"\n" +" 3. You may copy and distribute the Program (or a work based on it,\n" +"under Section 2) in object code or executable form under the terms of\n" +"Sections 1 and 2 above provided that you also do one of the following:\n" +"\n" +" a) Accompany it with the complete corresponding machine-readable\n" +" source code, which must be distributed under the terms of Sections\n" +" 1 and 2 above on a medium customarily used for software interchange; or,\n" +"\n" +" b) Accompany it with a written offer, valid for at least three\n" +" years, to give any third party, for a charge no more than your\n" +" cost of physically performing source distribution, a complete\n" +" machine-readable copy of the corresponding source code, to be\n" +" distributed under the terms of Sections 1 and 2 above on a medium\n" +" customarily used for software interchange; or,\n" +"\n" +" c) Accompany it with the information you received as to the offer\n" +" to distribute corresponding source code. (This alternative is\n" +" allowed only for noncommercial distribution and only if you\n" +" received the program in object code or executable form with such\n" +" an offer, in accord with Subsection b above.)\n" +"\n" +"The source code for a work means the preferred form of the work for\n" +"making modifications to it. For an executable work, complete source\n" +"code means all the source code for all modules it contains, plus any\n" +"associated interface definition files, plus the scripts used to\n" +"control compilation and installation of the executable. However, as a\n" +"special exception, the source code distributed need not include\n" +"anything that is normally distributed (in either source or binary\n" +"form) with the major components (compiler, kernel, and so on) of the\n" +"operating system on which the executable runs, unless that component\n" +"itself accompanies the executable.\n" +"\n" +"If distribution of executable or object code is made by offering\n" +"access to copy from a designated place, then offering equivalent\n" +"access to copy the source code from the same place counts as\n" +"distribution of the source code, even though third parties are not\n" +"compelled to copy the source along with the object code.\n" +"\n" +" 4. You may not copy, modify, sublicense, or distribute the Program\n" +"except as expressly provided under this License. Any attempt\n" +"otherwise to copy, modify, sublicense or distribute the Program is\n" +"void, and will automatically terminate your rights under this License.\n" +"However, parties who have received copies, or rights, from you under\n" +"this License will not have their licenses terminated so long as such\n" +"parties remain in full compliance.\n" +"\n" +" 5. You are not required to accept this License, since you have not\n" +"signed it. However, nothing else grants you permission to modify or\n" +"distribute the Program or its derivative works. These actions are\n" +"prohibited by law if you do not accept this License. Therefore, by\n" +"modifying or distributing the Program (or any work based on the\n" +"Program), you indicate your acceptance of this License to do so, and\n" +"all its terms and conditions for copying, distributing or modifying\n" +"the Program or works based on it.\n" +"\n" +" 6. Each time you redistribute the Program (or any work based on the\n" +"Program), the recipient automatically receives a license from the\n" +"original licensor to copy, distribute or modify the Program subject to\n" +"these terms and conditions. You may not impose any further\n" +"restrictions on the recipients' exercise of the rights granted herein.\n" +"You are not responsible for enforcing compliance by third parties to\n" +"this License.\n" +"\n" +" 7. If, as a consequence of a court judgment or allegation of patent\n" +"infringement or for any other reason (not limited to patent issues),\n" +"conditions are imposed on you (whether by court order, agreement or\n" +"otherwise) that contradict the conditions of this License, they do not\n" +"excuse you from the conditions of this License. If you cannot\n" +"distribute so as to satisfy simultaneously your obligations under this\n" +"License and any other pertinent obligations, then as a consequence you\n" +"may not distribute the Program at all. For example, if a patent\n" +"license would not permit royalty-free redistribution of the Program by\n" +"all those who receive copies directly or indirectly through you, then\n" +"the only way you could satisfy both it and this License would be to\n" +"refrain entirely from distribution of the Program.\n" +"\n" +"If any portion of this section is held invalid or unenforceable under\n" +"any particular circumstance, the balance of the section is intended to\n" +"apply and the section as a whole is intended to apply in other\n" +"circumstances.\n" +"\n" +"It is not the purpose of this section to induce you to infringe any\n" +"patents or other property right claims or to contest validity of any\n" +"such claims; this section has the sole purpose of protecting the\n" +"integrity of the free software distribution system, which is\n" +"implemented by public license practices. Many people have made\n" +"generous contributions to the wide range of software distributed\n" +"through that system in reliance on consistent application of that\n" +"system; it is up to the author/donor to decide if he or she is willing\n" +"to distribute software through any other system and a licensee cannot\n" +"impose that choice.\n" +"\n" +"This section is intended to make thoroughly clear what is believed to\n" +"be a consequence of the rest of this License.\n" +"\n" +" 8. If the distribution and/or use of the Program is restricted in\n" +"certain countries either by patents or by copyrighted interfaces, the\n" +"original copyright holder who places the Program under this License\n" +"may add an explicit geographical distribution limitation excluding\n" +"those countries, so that distribution is permitted only in or among\n" +"countries not thus excluded. In such case, this License incorporates\n" +"the limitation as if written in the body of this License.\n" +"\n" +" 9. The Free Software Foundation may publish revised and/or new versions\n" +"of the General Public License from time to time. Such new versions will\n" +"be similar in spirit to the present version, but may differ in detail to\n" +"address new problems or concerns.\n" +"\n" +"Each version is given a distinguishing version number. If the Program\n" +"specifies a version number of this License which applies to it and \"any\n" +"later version\", you have the option of following the terms and conditions\n" +"either of that version or of any later version published by the Free\n" +"Software Foundation. If the Program does not specify a version number of\n" +"this License, you may choose any version ever published by the Free Software\n" +"Foundation.\n" +"\n" +" 10. If you wish to incorporate parts of the Program into other free\n" +"programs whose distribution conditions are different, write to the author\n" +"to ask for permission. For software which is copyrighted by the Free\n" +"Software Foundation, write to the Free Software Foundation; we sometimes\n" +"make exceptions for this. Our decision will be guided by the two goals\n" +"of preserving the free status of all derivatives of our free software and\n" +"of promoting the sharing and reuse of software generally.\n" +"\n" +" NO WARRANTY\n" +"\n" +" 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" +"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" +"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" +"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" +"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" +"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" +"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" +"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" +"REPAIR OR CORRECTION.\n" +"\n" +" 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" +"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" +"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" +"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" +"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" +"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" +"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" +"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" +"POSSIBILITY OF SUCH DAMAGES.\n" +"\n" +" END OF TERMS AND CONDITIONS\n" +"\n" +" How to Apply These Terms to Your New Programs\n" +"\n" +" If you develop a new program, and you want it to be of the greatest\n" +"possible use to the public, the best way to achieve this is to make it\n" +"free software which everyone can redistribute and change under these terms.\n" +"\n" +" To do so, attach the following notices to the program. It is safest\n" +"to attach them to the start of each source file to most effectively\n" +"convey the exclusion of warranty; and each file should have at least\n" +"the \"copyright\" line and a pointer to where the full notice is found.\n" +"\n" +" \n" +" Copyright (C) \n" +"\n" +" This program is free software; you can redistribute it and/or modify\n" +" it under the terms of the GNU General Public License as published by\n" +" the Free Software Foundation; either version 2 of the License, or\n" +" (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be useful,\n" +" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +" GNU General Public License for more details.\n" +"\n" +" You should have received a copy of the GNU General Public License along\n" +" with this program; if not, write to the Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n" +"\n" +"Also add information on how to contact you by electronic and paper mail.\n" +"\n" +"If the program is interactive, make it output a short notice like this\n" +"when it starts in an interactive mode:\n" +"\n" +" Gnomovision version 69, Copyright (C) year name of author\n" +" Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" +" This is free software, and you are welcome to redistribute it\n" +" under certain conditions; type `show c' for details.\n" +"\n" +"The hypothetical commands `show w' and `show c' should show the appropriate\n" +"parts of the General Public License. Of course, the commands you use may\n" +"be called something other than `show w' and `show c'; they could even be\n" +"mouse-clicks or menu items--whatever suits your program.\n" +"\n" +"You should also get your employer (if you work as a programmer) or your\n" +"school, if any, to sign a \"copyright disclaimer\" for the program, if\n" +"necessary. Here is a sample; alter the names:\n" +"\n" +" Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" +" `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" +"\n" +" , 1 April 1989\n" +" Ty Coon, President of Vice\n" +"\n" +"This General Public License does not permit incorporating your program into\n" +"proprietary programs. If your program is a subroutine library, you may\n" +"consider it more useful to permit linking proprietary applications with the\n" +"library. If this is what you want to do, use the GNU Lesser General\n" +"Public License instead of this License.\n" +; +static const char psz_thanks[] = +"Some VLC plugins use external libraries and make extensive use of the\n" +"following persons' or companies' code:\n" +"\n" +"FAAD2 - Copyright (c) Nero AG, www.nero.com\" - GPLv2 or later\n" +"FFmpeg - Copyright (c) 2000-2017 the FFmpeg developers - LGPLv2.1 or later\n" +"FluidLite - Copyright (c) 2016 Robin Lobel - LGPLv2.1 or later\n" +"FluidSynth - Copyright (c) 2003-2010 Peter Hanappe, Conrad Berhörster, Antoine\n" +" Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson - LGPLv2.1 or\n" +" later\n" +"Fontconfig - Copyright (c) 2000,2001,2002,2003,2004,2006,2007 Keith Packard,\n" +" (c) 2005 Patrick Lam, (c) 2009 Roozbeh Pournader, (c) 2008,2009 Red Hat,\n" +" Inc., (c) 2008 Danilo Šegan, (c) 2012 Google, Inc. - MIT License\n" +"freetype - David Turner, Robert Wilhelm, and Werner Lemberg - FreeType License\n" +"GSM - Copyright (c) 1992 - 1994, 2009 Jutta Degener & Carsten Bormann - GSM\n" +" permissive license\n" +"GNU FriBidi - Copyright (c) 2004-2012 Behdad Esfahbod, Dov Grobgeld, Roozbeh\n" +" Pournader - LGPLv2.1 or later\n" +"GnuTLS - Copyright (C) 2000-2012 Free Software Foundation, Inc. - LGPLv2.1 or\n" +" later\n" +"harfbuzz - Copyright (c) 2010, 2011, 2012 Google, Inc., (c) 2012 Mozilla\n" +" Foundation, (c) 2011 Codethink Limited, (c) 2008, 2010 Nokia Corporation\n" +" and/or its subsidiary(-ies), (c) 2009 Keith Stribley, (c) 2009 Martin Hosken\n" +" and SIL International, (c) 2007 Chris Wilson, (c) 2006 Behdad Esfahbod,\n" +" (c) 2005 David Turner, (c) 2004, 2007, 2008, 2009, 2010 Red Hat, Inc.,\n" +" (c) 1998-2004 David Turner and Werner Lemberg - Old MIT License\n" +"liba52 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libav - Copyright (c) 2000 - 2015 the libav developers - LGPLv2.1 or later\n" +"libass - Copyright (c) 2006-2015 Grigori Goronzy et al. - ISC License\n" +"libbluray - Copyright (c) 2009-2015 VideoLAN and authors - LGPLv2.1 or later\n" +"libcaca - Copyright (c) 2004 Sam Hocevar - WTFPL / LGPLv2.1 or later /\n" +" GPLv2 or later / ISC\n" +"libdca - Copyright (c) 2004-2007 VideoLAN and authors - GPLv2 or later\n" +"libdvbpsi - Copyright (c) 2001-2017 VideoLAN and authors - LGPLv2.1 or later\n" +"libdvdcss - Copyright (c) 2001-2017 VideoLAN and authors - GPLv2 or later\n" +"libdvdread - GPLv2 or later\n" +"libdvdnav - GPLv2 or later\n" +"libebml - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libFLAC - Copyright (c) 2001 - 2014 Josh Coalson et al. - Xiph.org BSD license\n" +"libgme - LGPLv2.1 or later\n" +"libgpg-error - Copyright 2003, 2004, 2005, 2006, 2007, 2013 g10 Code GmbH\n" +" - LGPLv2.1 or later\n" +"libkate - Copyright (c) 2008-2011 Vincent Penquerc'h - 3-clause BSD License\n" +"liblive555 - Copyright (c) 1996-2015 Live Networks, Inc. - LGPLv2.1 or later\n" +"libmad - Copyright (c) 2000-2004 Robert Leslie, et al. - GPLv2 or later\n" +"libmatroska - Copyright (c) 2002-2015 Steve Lhomme - LGPLv2.1 or later\n" +"libmpeg2 - Aaron Holtzman & Michel Lespinasse, et al. - GPLv2 or later\n" +"libmodplug - Oliver Lapicque, Konstanty - Public domain\n" +"libogg, libvorbis - Copyright (c) 2002-2015 Xiph.org Foundation - Xiph.org BSD\n" +" license\n" +"libpostproc - Copyright (C) 2001-2015 Michael Niedermayer, et al. - GPLv2 or\n" +" later\n" +"libpng - Copyright (c) 2004, 2006-2014 Glenn Randers-Perhson, et al. - libpng\n" +" license\n" +"libsamplerate - Copyright (c) 2002-2011 Erik de Castro Lopo - GPLv2 or later\n" +"libschroedinger - Copyright (c) 2006 BBC and Fluendo - MIT License\n" +"libsdl - Copyright (c) 1997-2014 Sam Lantinga et al. - LGPLv2.1 or later\n" +"libshout - Copyright (c) 2012 - LGPLv2.1 or later\n" +"libtheora - Copyright (c) Xiph.org Foundation - Xiph.org BSD license\n" +"libtiff - Copyright (c) 1988-1997 Sam Leffler, (c) 1991-1997 Silicon Graphics,\n" +" Inc. - BSD-like\n" +"libtwolame - Copyright (c) 2001-2004 Michael Cheng, (c) 2004-2006 The TwoLAME\n" +" Project - LGPLv2.1 or later\n" +"libupnp - Copyright (c) 2000-2003 Intel Corporation - 3-clause BSD License\n" +"libvpx - Copyright (c) 2010-2015, Google Inc. - 3-clause BSD License\n" +"libxml2 - Copyright (c) 1998-2014 Daniel Veillard - MIT License\n" +"lua - Copyright (c) 1994-2008 Lua.org, PUC-Rio. - MIT License\n" +"Musepack decoder library - Copyright (c) 2005-2011, The Musepack Development\n" +" Team - 3-clause BSD License\n" +"OpenJPEG - Copyright (c) 2002-2014, Communcations and Remote Sensing\n" +" Laboratory, UCL, Belgium - ISC License\n" +"Opus - Copyright 2001-2013 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin,\n" +" Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding,\n" +" Erik de Castro Lopo - Xiph.org BSD License\n" +"Sparkle — Andy Matuschak et al. - MIT License\n" +"Speex, Speexdsp - Copyright (c) 1992-2015 Xiph.org Foundation, Jean-Marc Valin,\n" +" Analog Devices Inc. Commonwealth Scientific and Industrial Research\n" +" Organisation, David Row, Jutta Degener, Carsten Bormann - 3-clause BSD\n" +" License\n" +"taglib - Copyright (c) 2004-2016 Scott Wheeler, et al. - LGPLv2.1 or later\n" +"x264 - Copyright (c) 2004-2017 VideoLAN and authors - GPLv2 or later\n" +"x265 - Copyright (c) 2004-2015 x265 project - GPLv2 or later\n" +"Zapping VBI library - Copyright (c) 2000-2003 Michael H. Schimek, Iñaki García\n" +" Etxebarria - LGPLv2.1 or later\n" +"zlib - Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler - zlib license\n" +"\n" +"The VideoLAN team would like to thank the following donators:\n" +"\n" +"Julian Cain, who made a $1000 donation\n" +"The French website MacBidouille gave €500 to help us buy a PowerMac G5\n" +"The French magazine à vos MAC gave €500 to help us buy a PowerMac G5\n" +"Laurent Dupuy, who made a €540 donation\n" +"The French company Cybervia (Actech) gave €2000 to pay for webserver hosting\n" +"Dennis Perov - Hardware donation\n" +"\n" +"...the following active members of our user community:\n" +"\n" +"Alan Wright\n" +"David J LaBarre \"DJ\"\n" +"Eric Adler\n" +"Julien Bouquillon\n" +"\n" +"...and code auditors and testers:\n" +"\n" +"David Thiel\n" +"Philippe A. aka \"Lotesdelère\"\n" +"Sebastien Chaumat\n" +; +static const char psz_authors[] = +"VideoLAN and the VLC team would like to acknowledge the following contributors:\n" +"\n" +"Programming\n" +"-----------\n" +"Rémi Denis-Courmont\n" +"Jean-Baptiste Kempf\n" +"Laurent Aimar\n" +"François Cartegnie\n" +"Gildas Bazin\n" +"Felix Paul Kühne\n" +"Rafaël Carré\n" +"Pierre d'Herbemont\n" +"Thomas Guillem\n" +"Rémi Duraffort\n" +"Derk-Jan Hartman\n" +"Antoine Cellerier\n" +"Samuel Hocevar\n" +"Jean-Paul Saman\n" +"Steve Lhomme\n" +"Christophe Mutricy\n" +"Clément Stenac\n" +"Christophe Massiot\n" +"Ilkka Ollakka\n" +"Pierre Ynard\n" +"Filip Roséen\n" +"Damien Fouilleul\n" +"Sigmund Augdal Helberg\n" +"Erwan Tulou\n" +"David Fuhrmann\n" +"Marvin Scholz\n" +"Olivier Teulière\n" +"Cyril Deguet\n" +"Eric Petit\n" +"Filippo Carone\n" +"Rocky Bernstein\n" +"Hugo Beauzée-Luyssen\n" +"Olivier Aubert\n" +"Pavlov Konstantin\n" +"Jakob Leben\n" +"Benjamin Pracht\n" +"Jean-Philippe André\n" +"Stéphane Borel\n" +"JP Dinger\n" +"Geoffroy Couprie\n" +"Martin Storsjö\n" +"Marian Ďurkovič\n" +"Ludovic Fauvet\n" +"Petri Hintukainen\n" +"Yoann Peronneau\n" +"Denis Charmet\n" +"Sébastien Escudier\n" +"Jon Lech Johansen\n" +"KO Myung-Hun\n" +"Edward Wang\n" +"Dennis van Amerongen\n" +"Faustino Osuna\n" +"Mirsal Ennaime\n" +"Sean McGovern\n" +"Jérôme Decoodt\n" +"Loïc Minier\n" +"David Flynn\n" +"Frédéric Yhuel\n" +"Kaarlo Raiha\n" +"Mark Moriarty\n" +"Christopher Mueller\n" +"Fabio Ritrovato\n" +"Tony Castley\n" +"Srikanth Raju\n" +"Michel Kaempf\n" +"Jean-Marc Dressler\n" +"Johan Bilien\n" +"Vincent Seguin\n" +"Simon Latapie\n" +"Bernie Purcell\n" +"Henri Fallon\n" +"Sebastien Zwickert\n" +"Christoph Miebach\n" +"Adrien Maglo\n" +"Emmanuel Puig\n" +"Renaud Dartus\n" +"Alexis de Lattre\n" +"Vincent Penquerc'h\n" +"Arnaud de Bossoreille de Ribou\n" +"Mohammed Adnène Trojette\n" +"Salah-Eddin Shaban\n" +"Vittorio Giovara\n" +"Boris Dorès\n" +"Jai Menon\n" +"Anil Daoud\n" +"Daniel Mierswa\n" +"Naohiro Koriyama\n" +"Rob Jonson\n" +"Pierre Baillet\n" +"Dominique Leuenberger\n" +"Andre Pang\n" +"Zoran Turalija\n" +"Akash Mehrotra\n" +"André Weber\n" +"Anthony Loiseau\n" +"Lukas Durfina\n" +"Xavier Marchesini\n" +"Cyril Mathé\n" +"Devin Heitmueller\n" +"Juho Vähä-Herttua\n" +"Ken Self\n" +"Alexis Ballier\n" +"Juha Jeronen\n" +"Nicolas Chauvet\n" +"Richard Hosking\n" +"Éric Lassauge\n" +"Marc Ariberti\n" +"Sébastien Toque\n" +"Tobias Güntner\n" +"Benoit Steiner\n" +"Michel Lespinasse\n" +"Carlo Calabrò\n" +"Cheng Sun\n" +"Michał Trzebiatowski\n" +"Brad Smith\n" +"Brendon Justin\n" +"Alexey Sokolov\n" +"Basos G\n" +"Philippe Morin\n" +"Steinar H. Gunderson\n" +"Vicente Jimenez Aguilar\n" +"Yuval Tze\n" +"Yves Duret\n" +"Benjamin Drung\n" +"Michael Hanselmann\n" +"Alex Merry\n" +"Damien Lucas\n" +"Grigori Goronzy\n" +"Richard Shepherd\n" +"Gaël Hendryckx\n" +"Michael Feurstein\n" +"Stephan Assmus\n" +"Adrien Grand\n" +"Colin Guthrie\n" +"David Menestrina\n" +"Dominique Martinet\n" +"Gleb Pinigin\n" +"Jason Luka\n" +"Luc Saillard\n" +"Luca Barbato\n" +"Mario Speiß\n" +"Pankaj Yadav\n" +"Ramiro Polla\n" +"Ronald Wright\n" +"Rui Zhang\n" +"Can Wu\n" +"Christophe Courtaut\n" +"FUJISAWA Tooru\n" +"Hannes Domani\n" +"Manol Manolov\n" +"Timothy B. Terriberry\n" +"Antoine Lejeune\n" +"Arnaud Schauly\n" +"Branko Kokanovic\n" +"Dylan Yudaken\n" +"Florian G. Pflug\n" +"François Revol\n" +"G Finch\n" +"Keary Griffin\n" +"Konstanty Bialkowski\n" +"Ming Hu\n" +"Philippe Coent\n" +"Przemyslaw Fiala\n" +"Tanguy Krotoff\n" +"Vianney BOYER\n" +"Casian Andrei\n" +"Chris Smowton\n" +"David Kaplan\n" +"Eugenio Jarosiewicz\n" +"Fabian Keil\n" +"Guillaume Poussel\n" +"John Peterson\n" +"Justus Piater\n" +"Mark Lee\n" +"Martin T. H. Sandsmark\n" +"Rune Botten\n" +"Søren Bøg\n" +"Toralf Niebuhr\n" +"Tristan Matthews\n" +"Angelo Haller\n" +"Aurélien Nephtali\n" +"Austin Burrow\n" +"Bill C. Riemers\n" +"Colin Delacroix\n" +"Cristian Maglie\n" +"Elminster2031\n" +"Jakub Wieczorek\n" +"John Freed\n" +"Mark Hassman\n" +"Martin Briza\n" +"Mike Houben\n" +"Romain Goyet\n" +"Adrian Yanes\n" +"Alexander Lakhin\n" +"Anatoliy Anischovich\n" +"Barry Wardell\n" +"Ben Hutchings\n" +"Besnard Jean-Baptiste\n" +"Brian Weaver\n" +"Clement Chesnin\n" +"David Geldreich\n" +"Diego Elio Pettenò\n" +"Diego Fernando Nieto\n" +"Georgi Chorbadzhiyski\n" +"Jon Stacey\n" +"Jonathan Rosser\n" +"Joris van Rooij\n" +"Kaloyan Kovachev\n" +"Katsushi Kobayashi\n" +"Kelly Anderson\n" +"Loren Merritt\n" +"Maciej Blizinski\n" +"Mark Bidewell\n" +"Miguel Angel Cabrera Moya\n" +"Niles Bindel\n" +"Samuel Pitoiset\n" +"Scott Caudle\n" +"Sean Robinson\n" +"Sergey Radionov\n" +"Simon Hailes\n" +"Stephen Parry\n" +"Sukrit Sangwan\n" +"Thierry Reding\n" +"Xavier Martin\n" +"Alex Converse\n" +"Alexander Bethke\n" +"Alexandre Ratchov\n" +"Andres Krapf\n" +"Andrey Utkin\n" +"Andri Pálsson\n" +"Andy Chenee\n" +"Anuradha Suraparaju\n" +"Benjamin Poulain\n" +"Brieuc Jeunhomme\n" +"Chris Clayton\n" +"Clément Lecigne\n" +"Cédric Cocquebert\n" +"Daniel Peng\n" +"Danny Wood\n" +"David K\n" +"Edouard Gomez\n" +"Emmanuel de Roux\n" +"Frode Tennebø\n" +"GBX\n" +"Gaurav Narula\n" +"Geraud CONTINSOUZAS\n" +"Hugues Fruchet\n" +"Jan Winter\n" +"Jean-François Massol\n" +"Jean-Philippe Grimaldi\n" +"Josh Watzman\n" +"Kai Lauterbach\n" +"Konstantin Bogdanov\n" +"Kuan-Chung Chiu\n" +"Kuang Rufan\n" +"Matthias Dahl\n" +"Michael McEll\n" +"Michael Ploujnikov\n" +"Mike Schrag\n" +"Nickolai Zeldovich\n" +"Nicolas Bertrand\n" +"Niklas Hayer\n" +"Olafs Vandāns\n" +"Olivier Gambier\n" +"Paul Corke\n" +"Ron Frederick\n" +"Rov Juvano\n" +"Sabourin Gilles\n" +"Sam Lade\n" +"Sandeep Kumar\n" +"Sasha Koruga\n" +"Sreng Jean\n" +"Sven Petai\n" +"Tomas Krotil\n" +"Tomer Barletz\n" +"Tristan Leteurtre\n" +"Wang Bo\n" +"maxime Ripard\n" +"xxcv\n" +"Adam Hoka\n" +"Adrian Knoth\n" +"Adrien Cunin\n" +"Alan Fischer\n" +"Alan McCosh\n" +"Alex Helfet\n" +"Alexander Terentyev\n" +"Alexandre Ferreira\n" +"Alina Friedrichsen\n" +"An L. Ber\n" +"Andreas Schlick\n" +"Andrew Schubert\n" +"Andrey Makhnutin\n" +"Arnaud Vallat\n" +"Asad Mehmood\n" +"Ashok Bhat\n" +"Austin English\n" +"Baptiste Coudurier\n" +"Benoit Calvez\n" +"Björn Stenberg\n" +"Blake Livingston\n" +"Brandon Brooks\n" +"Brian Johnson\n" +"Brian Kurle\n" +"Cezar Elnazli\n" +"Chris White\n" +"Christian Masus\n" +"Christoph Pfister\n" +"Christoph Seibert\n" +"Christopher Key\n" +"Christopher Rath\n" +"Claudio Ortelli\n" +"Cody Russell\n" +"Cristian Morales Vega\n" +"Dan Rosenberg\n" +"Daniel Marth\n" +"Daniel Tisza\n" +"Detlef Schroeder\n" +"Diego Biurrun\n" +"Dominik 'Rathann' Mierzejewski\n" +"Duncan Salerno\n" +"Edward Sheldrake\n" +"Elliot Murphy\n" +"Eren Inan Canpolat\n" +"Ernest E. Teem III\n" +"Etienne Membrives\n" +"Fargier Sylvain\n" +"Fathi Boudra\n" +"Felix Geyer\n" +"Filipe Azevedo\n" +"Finn Hughes\n" +"Florian Hubold\n" +"Florian Roeske\n" +"Frank Enderle\n" +"Frédéric Crozat\n" +"Georg Seifert\n" +"Gertjan Van Droogenbroeck\n" +"Gilles Chanteperdrix\n" +"Greg Farrell\n" +"Gregory Maxwell\n" +"Gwenole Beauchesne\n" +"Götz Waschk\n" +"Hans-Kristian Arntzen\n" +"Harry Sintonen\n" +"Iain Wade\n" +"Ibraheem Paredath\n" +"Isamu Arimoto\n" +"Ismael Luceno\n" +"James Bates\n" +"James Bond\n" +"James Turner\n" +"Janne Grunau\n" +"Janne Kujanpää\n" +"Jarmo Torvinen\n" +"Jason Scheunemann\n" +"Jeff Lu\n" +"Jeroen Ost\n" +"Joe Taber\n" +"Johann Ransay\n" +"Johannes Weißl\n" +"John Hendrikx\n" +"John Stebbins\n" +"Jonas Gehring\n" +"Joseph S. Atkinson\n" +"Juergen Lock\n" +"Julien 'Lta' BALLET\n" +"Julien / Gellule\n" +"Julien Humbert\n" +"Kamil Baldyga\n" +"Kamil Klimek\n" +"Karlheinz Wohlmuth\n" +"Kevin Anthony\n" +"Kevin DuBois\n" +"Lari Natri\n" +"Lorenzo Pistone\n" +"Lucas C. Villa Real\n" +"Lukáš Lalinský\n" +"Mal Graty\n" +"Malte Tancred\n" +"Martin Pöhlmann\n" +"Martin Zeman\n" +"Marton Balint\n" +"Mathew King\n" +"Mathieu Sonet\n" +"Matthew A. Townsend\n" +"Matthias Bauer\n" +"Mika Tiainen\n" +"Mike Cardillo\n" +"Mounir Lamouri (volkmar)\n" +"Natanael Copa\n" +"Nathan Phillip Brink\n" +"Nick Briggs\n" +"Nick Pope\n" +"Nil Geiswiller\n" +"Pascal Thomet\n" +"Pere Orga\n" +"Peter Bak Nielsen\n" +"Phil Roffe and David Grellscheid\n" +"Philip Sequeira\n" +"Pierre Souchay\n" +"Piotr Fusik\n" +"Pádraig Brady\n" +"R.M\n" +"Ralph Giles\n" +"Ramon Gabarró\n" +"Robert Forsman\n" +"Robert Jedrzejczyk\n" +"Robert Paciorek\n" +"Rolf Ahrenberg\n" +"Roman Pen\n" +"Ruud Althuizen\n" +"Samuli Suominen\n" +"Scott Lyons\n" +"Sebastian Birk\n" +"Sergey Puzanov\n" +"Sergio Ammirata\n" +"Sharad Dixit\n" +"Song Ye Wen\n" +"Stephan Krempel\n" +"Steven Kramer\n" +"Steven Sheehy\n" +"Sveinung Kvilhaugsvik\n" +"Sylvain Cadhillac\n" +"Sylver Bruneau\n" +"Takahito HIRANO\n" +"Theron Lewis\n" +"Thijs Alkemade\n" +"Tillmann Karras\n" +"Timo Paulssen\n" +"Timo Rothenpieler\n" +"Tobias Rapp\n" +"Tomasen\n" +"Tony Vankrunkelsven\n" +"Tristan Heaven\n" +"Varphone Wong\n" +"Vasily Fomin\n" +"Vikram Narayanan\n" +"Yannick Bréhon\n" +"Yavor Doganov\n" +"Yohann Martineau\n" +"dharani.prabhu.s\n" +"suheaven\n" +"wucan\n" +"김정은\n" +"Adam Sampson\n" +"Alexander Gall\n" +"Alex Antropoff\n" +"Alexis Guillard\n" +"Alex Izvorski\n" +"Amir Gouini\n" +"Andrea Guzzo\n" +"Andrew Flintham\n" +"Andrew Zaikin\n" +"Andy Lindsay\n" +"Arai/Fujisawa Tooru\n" +"Arkadiusz Miskiewicz\n" +"Arnaud Gomes-do-Vale\n" +"Arwed v. Merkatz\n" +"Barak Ori\n" +"Basil Achermann\n" +"Benjamin Mironer\n" +"Bill\n" +"Bob Maguire\n" +"Brian C. Wiles\n" +"Brian Raymond\n" +"Brian Robb\n" +"Carsten Gottbehüt\n" +"Carsten Haitzler\n" +"Charles Hordis\n" +"Chris Clepper\n" +"Christian Henz\n" +"Christof Baumgaertner\n" +"Christophe Burgalat\n" +"Christopher Johnson\n" +"Cian Duffy\n" +"Colin Simmonds\n" +"Damian Ivereigh\n" +"Daniel Fischer\n" +"Daniel Stränger\n" +"Danko Dolch\n" +"Dennis Lou\n" +"Dermot McGahon\n" +"Douglas West\n" +"Dugal Harris\n" +"Emmanuel Blindauer\n" +"Enrico Gueli\n" +"Enrique Osuna\n" +"Eren Türkay\n" +"Eric Dudiak\n" +"Espen Skoglund\n" +"Ethan C. Baldridge\n" +"François Seingier\n" +"Frans van Veen\n" +"Frédéric Ruget\n" +"Gerald Hansink\n" +"Gisle Vanem\n" +"Glen Gray\n" +"Goetz Waschk\n" +"Gregory Hazel\n" +"Gustaf Neumann\n" +"Hang Su\n" +"Hans Lambermont\n" +"Hans-Peter Jansen\n" +"Harris Dugal\n" +"Heiko Panther\n" +"Igor Helman\n" +"Isaac Osunkunle\n" +"Jan David Mol\n" +"Jan Gerber\n" +"Jan Van Boghout\n" +"Jasper Alias\n" +"Jean-Alexis Montignies\n" +"Jean-Baptiste Le Stang\n" +"Jeffrey Baker\n" +"Jeroen Massar\n" +"Jérôme Guilbaud\n" +"Johannes Buchner\n" +"Johen Michael Zorko\n" +"Johnathan Rosser\n" +"John Dalgliesh\n" +"John Paul Lorenti\n" +"Jörg\n" +"Joseph Tulou\n" +"Julien Blache\n" +"Julien Plissonneau Duquène\n" +"Julien Robert\n" +"Kenneth Ostby\n" +"Kenneth Self\n" +"Kevin H. Patterson\n" +"Koehler, Vitally\n" +"K. Staring\n" +"Lahiru Lakmal Priyadarshana\n" +"Laurent Mutricy\n" +"Leo Spalteholz\n" +"Loox Thefuture\n" +"Marc Nolette\n" +"Marco Munderloh\n" +"Mark Gritter\n" +"Markus Kern\n" +"Markus Kuespert\n" +"Martin Hamrle\n" +"Martin Kahr\n" +"Mateus Krepsky Ludwich\n" +"Mathias Kretschmer\n" +"Mats Rojestal\n" +"Matthias P. Nowak\n" +"Matthieu Lochegnies\n" +"Michael Mondragon\n" +"Michael S. Feurstein\n" +"Michel Lanners\n" +"Mickael Hoerdt\n" +"Miguel Angel Cabrera\n" +"Mikko Hirvonen\n" +"Moritz Bunkus\n" +"Nilmoni Deb\n" +"Olivier Houchard\n" +"Olivier Pomel\n" +"Ondrej Kuda aka Albert\n" +"Øyvind Kolbu\n" +"Pascal Levesque\n" +"Patrick Horn\n" +"Patrick McLean\n" +"Pauline Castets\n" +"Paul Mackerras\n" +"Peter Surda\n" +"Petr Vacek\n" +"Philippe Van Hecke\n" +"Pierre-Luc Beaudoin\n" +"Pierre Marc Dumuid\n" +"Régis Duchesne\n" +"Remco Poortinga\n" +"Rene Gollent\n" +"Rob Casey\n" +"Robson Braga Araujo\n" +"Roine Gustafsson\n" +"Roman Bednarek\n" +"Rudolf Cornelissen\n" +"Sašo Kiselkov\n" +"Sebastian Jenny\n" +"Shane Harper\n" +"Stefán Freyr Stefánsson\n" +"Steve Brown\n" +"Steven M. Schultz\n" +"Tapio Hiltunen\n" +"Thomas L. Wood\n" +"Thomas Mühlgrabner\n" +"Thomas Parmelan\n" +"Tim 'O Callagha\n" +"Tim Schuerewegen\n" +"Tong Ka Man\n" +"Torsten Spindler\n" +"Udo Richter\n" +"Vincent Dimar\n" +"Vincent Penne\n" +"Vitalijus Slavinskas\n" +"Vitaly V. Bursov\n" +"Vladimir Chernyshov\n" +"Wade Majors\n" +"Wallace Wadge\n" +"Watanabe Go\n" +"William Hawkins\n" +"Xavier Maillard\n" +"Ye zhang\n" +"Yuehua Zhao\n" +"Abylay Ospan\n" +"Adam Leggett\n" +"Adrian Haensler\n" +"Ago Allikmaa\n" +"Ajith Manjula Senarathne\n" +"Alain Degreffe\n" +"Alan Pope\n" +"Aleksandr Pasechnik\n" +"Alexandre Fernandez\n" +"Alexandre Pereira Nunes\n" +"Alexandre Perraud\n" +"Alex Peak\n" +"Alex Warhawk\n" +"Alex Woods\n" +"Allan Odgaard\n" +"Ancelot Mark Pinto\n" +"Andrea Giudiceandrea\n" +"Andreas Hartmetz\n" +"Andreas Mieke\n" +"André Silva\n" +"Andrew Clayton\n" +"Andrey Gursky\n" +"Andrii Zui\n" +"Andy Tather\n" +"Antti Ajanki\n" +"Ara Qadir\n" +"Arjun Sreedharan\n" +"Arne de Bruijn\n" +"Arun Pandian G\n" +"A S Alam\n" +"Avani Sharma\n" +"Avishay Spitzer\n" +"Bastien Penavayre\n" +"Benjamin Adolphi\n" +"Ben Littler\n" +"Benoit du Payrat\n" +"Benoît Noël du Payrat\n" +"Bernd Kuhls\n" +"Boris Egorov\n" +"Boy van Amstel\n" +"Brian Schmidt\n" +"Brion Vibber\n" +"Cameron Mozie\n" +"Carlos Fenollosa\n" +"Carola Nitz\n" +"Christian Suloway\n" +"Clemens Werther\n" +"C.W. Betts\n" +"Daniel Amm\n" +"Daniel Verkamp\n" +"Darko Jankovic\n" +"Darrell Walisser\n" +"David Robison\n" +"David R Robison\n" +"Dennis Hamester\n" +"Derek Buitenhuis\n" +"Diogo Silva\n" +"Dominko Azdajic\n" +"Donald Campbell\n" +"Doney den Ouden\n" +"Duncan McNamara\n" +"Duncan McNAMARA\n" +"Elodie Thomann\n" +"Emeric Grange\n" +"Eric Engestrom\n" +"Etienne BRATEAU\n" +"Eugen Geist\n" +"Fabian Yamaguchi\n" +"Fabrizio Ge\n" +"Fabrizio Gennari\n" +"Fahad Al-Saidi\n" +"Felix Abecassis\n" +"Florent Pillet\n" +"Forteve Zepushisti\n" +"Frank Praznik\n" +"Gabriel de Perthuis\n" +"Gal Vinograd\n" +"Gaurav Pruthi\n" +"Geoffrey Métais\n" +"Gian Marco Sibilla\n" +"Gilles Sabourin\n" +"Gina Dobrescu\n" +"Gonzalo Higuera Díaz\n" +"Goran Dokic\n" +"Guillaume Gomez\n" +"Harald Sitter\n" +"Heorhi Valakhanovich\n" +"Ian Chamberlain\n" +"Ibrahima SARR\n" +"Igor Prokopenkov\n" +"Ion Agorria\n" +"Jarrad Whitaker\n" +"Jean-Yves Avenard\n" +"Jed Smith\n" +"Jérémy Carrier\n" +"Jeremy Huddleston Sequoia\n" +"Jerome Forissier\n" +"Jim Bankoski\n" +"Jonas Lundqvist\n" +"Jonatan \"jaw\" Wallmander\n" +"Jonathan Calmels\n" +"Jonathan Heard\n" +"Jonathan McGowan\n" +"Jonathan Thambidurai\n" +"Joni Räsänen\n" +"Josef Andersson\n" +"Joseph DeVore\n" +"Julian Scheel\n" +"Justin Kim\n" +"Kaarlo Räihä\n" +"Kamil Rytarowski\n" +"Kazuki Yamaguchi\n" +"Konstantin K. Beliak\n" +"Konstantinos Tsanaktsidis\n" +"Konstantin Pavlov\n" +"Kornel Lesiński\n" +"Olivier Langlois\n" +"Lochlin Duperron\n" +"Lukas Juhrich\n" +"Lyndon Brown\n" +"Marc Aldorasi\n" +"Marcel Schnirring\n" +"Marc Etcheverry\n" +"Mariusz Wasak\n" +"Mark Becwar\n" +"Martell Malone\n" +"Mathieu Malaterre\n" +"Mathieu Parent\n" +"Mathieu Velten\n" +"Matthias Keiser\n" +"Matthias Treydte\n" +"Max Dilipovich\n" +"Maxim Bublis\n" +"Maxime CHAPELET\n" +"Maxime Mouchet\n" +"Michael Tänzer\n" +"Miha Sokolov\n" +"Mohammed (Shaan) Huzaifa Danish\n" +"Moti Zilberman\n" +"Nathan Egge\n" +"Niklas Haas\n" +"Odd-Arild Kristensen\n" +"O. Hartmann\n" +"Olaf Hering\n" +"Oliver Collyer\n" +"Paul B Mahol\n" +"Paul Clark\n" +"Paulo Vitor Magacho da Silva\n" +"Pavol Babincak\n" +"Paweł Stankowski\n" +"Petter Reinholdtsen\n" +"Philip Höhlein\n" +"Pierre-Hugues Husson\n" +"Pierre Lamot\n" +"Pyry Kontio\n" +"Radek Vybiral\n" +"Rafael Waldo Delgado Doblas\n" +"Rajeesh K V\n" +"Ray Tiley\n" +"Reka Inovan\n" +"Remita Amine\n" +"Ricardo Ribalda Delgado\n" +"Richard Diamond\n" +"Rinat Ibragimov\n" +"Robert Mourning\n" +"Romain Bentz\n" +"Romain Fliedel\n" +"Romain Vimont\n" +"Ronald S. Bultje\n" +"Ross Finlayson\n" +"Sam Malone\n" +"Samuel Martin\n" +"Samuel Thibault\n" +"Sanchit Arora\n" +"Santiago Gimeno\n" +"Sebastian Ramacher\n" +"Sebastian Roth\n" +"Sergey Bolshakov\n" +"Shaleen Jain\n" +"Shlomi Fish\n" +"Simona-Marinela Prodea\n" +"Stanislas Plessia\n" +"Stefan Pöschel\n" +"Steven Toth\n" +"Sushma Reddy\n" +"Takahito Hirano\n" +"T. Chomphuming\n" +"Thierry Foucu\n" +"Thomas Nigro\n" +"Tim Allen\n" +"Tim Walker\n" +"Tobias Conradi\n" +"Tony Gaillard\n" +"Benoît Tuduri\n" +"Tzu-Jung Lee\n" +"Uwe L. Korn\n" +"Valentin Deniaud\n" +"Valentin Vetter\n" +"Valter Correia\n" +"Vianney Boyer\n" +"Victorien Le Couviour--Tuffet\n" +"Vikram Fugro\n" +"Vinson Lee\n" +"Wayne McDougall\n" +"Wieland Hoffmann\n" +"Wills Wang\n" +"Xabier Aramendi\n" +"Yaşar Tay\n" +"Yidong Ren\n" +"Yuudai Yamashigi\n" +"Zhao Zhili\n" +"أحمد المحم ودي (Ahmed El-Mahmoudy)\n" +"Баярсайхан Энхтайван\n" +"Сергей Дарьичев\n" +"\n" +"Artwork\n" +"-------\n" +"Damien Erambert\n" +"Daniel Dreibrodt, aka aLtgLasS\n" +"David Weber\n" +"Davor Orel\n" +"Dominic Spitaler\n" +"Doney den Ouden\n" +"Eurodata Computer Club\n" +"Geoffrey Roussel\n" +"Joeri van Dooren\n" +"kty0ne\n" +"Max Rudberg\n" +"Richard Øiestad\n" +"Simon Damkjær Andersen\n" +"Tom Bigelajzen\n" +"Vincent van den Heuvel\n" +"\n" +"Documentation\n" +"-------------\n" +"Bill Eldridge\n" +"\n" +"Localization\n" +"------------\n" +"Abdul Fousan - Tamil\n" +"A. Decorte - Friulian\n" +"A. Regnander - Swedish\n" +"Adem Gunes - Turkish\n" +"Adi Nugroho - Tagalog\n" +"Adnan Memija - Bosnian\n" +"airplanez - Korean\n" +"Ajith Manjula - Sinhala\n" +"Aled Powell - Welsh\n" +"Alexander Didebulidze - Georgian\n" +"Alexander Henket - Dutch\n" +"Alexander Jansen - Norwegian Bokmål\n" +"Alexander Lakhin - Russian\n" +"Alexey Lugin - Ukrainian\n" +"Alexey Salmin - Russian\n" +"Alfred John - Acoli\n" +"Amanpreet Singh Alam - Punjabi\n" +"André de Barros Martins Ribeiro - Brazilian portuguese\n" +"Andrey Brilevskiy - Russian\n" +"Andrey Wolk - Russian\n" +"Andri Pálsson - Icelandic\n" +"Andriy Bandura - Ukrainian\n" +"Anh Phan - Vietnamese\n" +"Aniket Eknath Kudale - Marathi\n" +"Animesh Swar - Nepalese\n" +"Aputsiaĸ Niels Janussen - Danish\n" +"Ara Bextiyar - Sorani (Kurdish)\n" +"Ari Constâncio - Portuguese\n" +"Arkadiusz Lipiec - Polish\n" +"Ask Hjorth Larsen - Danish\n" +"Audrey Prevost - French\n" +"Auk Piseth - Khmer\n" +"Bayarsaikhan Enkhtaivan Баярсайхан Энхтайван - Mongolian\n" +"Biraj Karmakar - Bengali (India)\n" +"Bruno Queirós - Portuguese\n" +"Bruno Vella - Italian\n" +"Caner Başaran - Turkish\n" +"Carlo Calabrò - Italian\n" +"Chandan Kumar - Hindi\n" +"Chesús Daniel Trigo - Aragonese\n" +"Christoph Miebach - German\n" +"Chynggyz Jumaliev - Kirgyz\n" +"Circo Radu - Romanian\n" +"Cristian Secară - Romanian\n" +"Daniel Nylander - Swedish\n" +"Daniel Winzen - German\n" +"David González - Spanish\n" +"David Planella - Catalan\n" +"Dean Lee - Simplified Chinese\n" +"Denis Arnaud - Breton\n" +"Derk-Jan Hartman - Dutch\n" +"DirektX - Hungarian\n" +"Dominko Aždajić - Croatian\n" +"Dylan Aïssi - French\n" +"Đorđe Vasiljević - Serbian\n" +"Eduard Babayan - Armenian\n" +"Eero - Estonian\n" +"Eirik U. Birkeland - Norwegian Nynorsk\n" +"Elizabeth Da Conceicao Baptista - Tetum\n" +"Emilio Sepúlveda - Interlingua\n" +"Emin Mastizada - Azerbaijani\n" +"Éric Lassauge - French\n" +"Farzaneh Sarafraz - Persian\n" +"Florence Tushabe - Chiga\n" +"Fouzia Bourai - Arabic\n" +"Frank Chao - Traditional Chinese\n" +"Freyr Gunnar Ólafsson - Icelandic\n" +"Friedel Wolff - Afrikaans\n" +"Fumio Nakayama - Japanese\n" +"Gabor Kelemen - Hungarian\n" +"Gaurav Kumar - Hindi\n" +"Gaëtan Rousseaux - Walloon\n" +"Ghjuvan Pasquinu - Corsican\n" +"Goce Manevski - Macedonian\n" +"Golam Maruf Oovee - Bengali\n" +"Gonçalo Cordeiro - Galician\n" +"Gorana Milicevic - Serbian\n" +"Goswami Hardikpuri Kishorpuri - Gujarati\n" +"Haakon Meland Eriksen - Norwegian\n" +"Han HoJoong - Korean\n" +"Hardik Kishorpuri Goswami - Gujarati\n" +"Hemanta Nandi - Bengali (India)\n" +"Huw Waters - Welsh\n" +"H.Shalitha Vikum - Sinhala\n" +"Ibrahima Sarr - Fulah\n" +"Ingmārs Dīriņš - Latvian\n" +"Israt Jahan - Bengali\n" +"Ivar Smolin - Estonian\n" +"Iván Seoane Pardo - Galician\n" +"Ivo Ivanov - Bulgarian\n" +"Iñaki Larrañaga Murgoitio - Basque\n" +"Iñigo Varela - Asturian; Bable\n" +"Jakub Žáček - Czech\n" +"James Olweny - Ganda\n" +"Jamil Ahmed - Bengali\n" +"Javier Varela - Spanish\n" +"Jean-Pierre Kuypers - French\n" +"Jens Seidel - German\n" +"Joao Almeida - Portuguese\n" +"Joel Arvidsson - Swedish\n" +"jogijs - Latvian\n" +"Jonas Larsen - Danish\n" +"Jon Stødle - Norwegian Nynorsk\n" +"Jouni Kähkönen - Finnish\n" +"Juha Jeronen - Finnish\n" +"Julen Ruiz Aizpuru - Basque\n" +"Kai Hermann - German\n" +"Kamil Páral - Czech\n" +"Kang Jeong-Hee - Korean\n" +"Kasper Tvede - Danish\n" +"Kaya Zeren - Turkish\n" +"Kenneth Nielsen - Danish\n" +"Khin Mi Mi Aung - Burmese\n" +"Khoem Sokhem - Khmer\n" +"Kola - Albanian\n" +"Kypchak Kypchak - Kazakh\n" +"Laurent Jonqueres - Occitan\n" +"Loba Yeasmeen - Bengali\n" +"Lorena Gomes - Catalan\n" +"Lorenzo Porta - Italian\n" +"Luqman Hakim - Indonesian\n" +"L. Balasubramaniam - Hindi\n" +"Mahrazi Mohd Kamal - Malay\n" +"Manolis Stefanis - Modern Greek\n" +"Manuela Silva/Alfredo Silva - Portuguese\n" +"Marián Hikaník - Slovak\n" +"Mario Siegmann - German\n" +"Marko Uskokovic - Serbian\n" +"Martin Srebotnjak - Slovenian\n" +"Martin Zicha - Czech\n" +"Matej Urbančič - Slovenian\n" +"Mathias C. Berens, welcome-soft - German\n" +"Mattias Põldaru - Estonian\n" +"Md. Rezwan Shahid - Bengali\n" +"Meelad Zakaria - Persian\n" +"Michael Bauer - Scottish Gaelic\n" +"Michal Halenka - Czech\n" +"Michał Trzebiatowski - Polish\n" +"Miguel Sousa - Portuguese\n" +"Mihkel Kirjutas - Estonian\n" +"Mindaugas Baranauskas - Lithuanian\n" +"Miroslav Oujeský - Czech\n" +"Morten Brix Pedersen - Danish\n" +"Mustafa Sandal - Czech\n" +"Myckel Habets - Dutch\n" +"Namhyung Kim - Korean\n" +"Niels Fanøe - Danish\n" +"Niklas 'Nille' Åkerström - Swedish\n" +"Olav Dahlum - Norwegian Bokmål\n" +"Oleksandr Natalenko - Ukrainian\n" +"Omer Ensari - Kurmanji (Kurdish)\n" +"Osama Khalid - Arabic\n" +"Otto Kekäläinen - Finnish\n" +"Paras Nath Chaudhary - Nepali\n" +"Pasindu Kavinda - Sinhala\n" +"Pau Iranzo - Catalan\n" +"Paula Iglesias - Galician\n" +"Pedro Valadares - Portuguese\n" +"Peter Jespersen - Danish\n" +"Petr Šimáček - Czech\n" +"Phan Anh - Vietnamese\n" +"Philipp Weissenbacher - German\n" +"Pittayakom Saingtong - Thai\n" +"Prasannajit Acharya - Oriya\n" +"Praveen Illa - Telugu\n" +"Predrag Ljubenović - Serbian\n" +"Pyae Sone - Burmese\n" +"Rajnikant Kumbhar - Marathi\n" +"Ricardo Perdigão - Portuguese\n" +"Ricardo Pérez López - Spanish\n" +"Roustam Ghizdatov - Russian\n" +"Ruei-Yuan Lu - Traditional Chinese\n" +"Saad Liaquat Kiani - Urdu\n" +"Sadia Afroz - Bengali\n" +"Said Marjan Zazai - Pashto\n" +"Salar Khalilzadeh - Persian\n" +"Sam Askari - Spanish\n" +"Sam Hocevar - British\n" +"Samuel Hocevar - French\n" +"Saúl Ortega - Spanish\n" +"Savvas Nesseris - Modern Greek\n" +"Sayan Chowdhury - Hindi\n" +"Seanán Ó Coistín - Irish\n" +"Semsudin Abdic - Bosnian\n" +"Shambhu Kumar - Hindi\n" +"Shantanu Sarkar - Hindi\n" +"Shashi Ranjan - Hindi\n" +"Siarhei Daryichau Дар'ічаў Сяргей - Belarusian\n" +"Sidney Doria - Brazilian Portuguese\n" +"Sigmund Augdal - Norwegian Bokmål\n" +"Simos Xenitellis - Modern Greek\n" +"Sipho Sibiya - Zulu\n" +"Sok Sophea - Khmer\n" +"Solomon Gizaw - Amharic\n" +"Sreejith P - Malayalam\n" +"Suraj Kawade - Marathi\n" +"Stian Jørgensrud - Norwegian Bokmål\n" +"Sveinn í Felli - Icelandic\n" +"Tadashi Jokagi - Japanese\n" +"Tarsem Singh - Hindi\n" +"Thanakrit Chomphuming - Thai\n" +"Tero Pelander - Finnish\n" +"Thomas De Rocker - Dutch\n" +"Thomas Graf - gettext support, German\n" +"Tomáš Chvátal - Czech\n" +"Tòni Galhard - Occitan\n" +"Umesh Agarwal - Bengali (India)\n" +"Umidjon Almasov - Uzbek\n" +"Václav Pavlíček - Czech\n" +"Valek Filippov - Russian\n" +"Vicente Jimenez Aguilar - Spanish\n" +"Vincenzo Reale - Italian\n" +"Vít Pelčák - Czech\n" +"viyyer - Hindi\n" +"Vladimir Yermolayev - Russian\n" +"Vojtěch Smejkal - Czech\n" +"Wei Mingzhi - Simplified Chinese\n" +"Xènia Albà Cantero - Catalan\n" +"Xuacu Saturio - Asturian\n" +"Yaron Shahrabani - Hebrew\n" +"Yaşar Tay - Turkish\n" +"Yhal Htet Aung - Burmese\n" +"Yogesh K S - Kannada\n" +"Yoyo - Simplified Chinese\n" +"Yuksel Yildirim - Turkish\n" +"Zabeeh Khan - Pashto\n" +"Zhang Tong - Chinese\n" +; diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_access.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_access.h new file mode 100644 index 0000000..4356be6 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_access.h @@ -0,0 +1,81 @@ +/***************************************************************************** + * vlc_access.h: Access descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: da06554814885d03823aefbf58e858f6941b3400 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ACCESS_H +#define VLC_ACCESS_H 1 + +#include + +/** + * \defgroup access Access + * \ingroup stream + * Raw input byte streams + * @{ + * \file + * Input byte stream modules interface + */ + +/** + * Special redirection error code. + * + * In case of redirection, the access open function should clean up (as in + * normal failure case), store the heap-allocated redirection URL in + * stream_t.psz_url, and return this value. + */ +#define VLC_ACCESS_REDIRECT VLC_ETIMEOUT + +/** + * Opens a new read-only byte stream. + * + * This function might block. + * The initial offset is of course always zero. + * + * \param obj parent VLC object + * \param mrl media resource location to read + * \return a new access object on success, NULL on failure + */ +VLC_API stream_t *vlc_access_NewMRL(vlc_object_t *obj, const char *mrl); + +/** + * \defgroup access_helper Access Helpers + * @{ + */ + +/** + * Default pf_control callback for directory accesses. + */ +VLC_API int access_vaDirectoryControlHelper( stream_t *p_access, int i_query, va_list args ); + +#define ACCESS_SET_CALLBACKS( read, block, control, seek ) \ + do { \ + p_access->pf_read = (read); \ + p_access->pf_block = (block); \ + p_access->pf_control = (control); \ + p_access->pf_seek = (seek); \ + } while(0) + +/** + * @} @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_actions.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_actions.h new file mode 100644 index 0000000..5d78f5e --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_actions.h @@ -0,0 +1,275 @@ +/***************************************************************************** + * vlc_actions.h: handle vlc actions + ***************************************************************************** + * Copyright (C) 2003-2016 VLC authors and VideoLAN + * $Id: 404c1662a82ef3f3ffc983a81fa73b90f5773eef $ + * + * Authors: Sigmund Augdal Helberg + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ACTIONS_H +#define VLC_ACTIONS_H 1 + +/* Called from src/libvlc.c */ +int +libvlc_InternalActionsInit(libvlc_int_t *p_libvlc); + +/* Called from src/libvlc.c */ +void +libvlc_InternalActionsClean(libvlc_int_t *p_libvlc); + +/** + * \file + * This file defines keys and functions + */ + +#define KEY_MODIFIER 0xFF000000 +#define KEY_MODIFIER_ALT 0x01000000 +#define KEY_MODIFIER_SHIFT 0x02000000 +#define KEY_MODIFIER_CTRL 0x04000000 +#define KEY_MODIFIER_META 0x08000000 +#define KEY_MODIFIER_COMMAND 0x10000000 + +#define KEY_UNSET 0x00000000 +#define KEY_BACKSPACE 0x08 +#define KEY_TAB 0x09 +#define KEY_ENTER 0x0D +#define KEY_ESC 0x1B +/* End of Unicode range: 0x0010FFFF */ +#define KEY_LEFT 0x00210000 +#define KEY_RIGHT 0x00220000 +#define KEY_UP 0x00230000 +#define KEY_DOWN 0x00240000 +#define KEY_F1 0x00270000 +#define KEY_F2 0x00280000 +#define KEY_F3 0x00290000 +#define KEY_F4 0x002A0000 +#define KEY_F5 0x002B0000 +#define KEY_F6 0x002C0000 +#define KEY_F7 0x002D0000 +#define KEY_F8 0x002E0000 +#define KEY_F9 0x002F0000 +#define KEY_F10 0x00300000 +#define KEY_F11 0x00310000 +#define KEY_F12 0x00320000 +#define KEY_HOME 0x00330000 +#define KEY_END 0x00340000 +#define KEY_INSERT 0x00350000 +#define KEY_DELETE 0x00360000 +#define KEY_MENU 0x00370000 +#define KEY_PAGEUP 0x00390000 +#define KEY_PAGEDOWN 0x003A0000 +#define KEY_PRINT 0x003B0000 +#define KEY_PAUSE 0x003D0000 + +#define KEY_BROWSER_BACK 0x003F0000 +#define KEY_BROWSER_FORWARD 0x00400000 +#define KEY_BROWSER_REFRESH 0x00410000 +#define KEY_BROWSER_STOP 0x00420000 +#define KEY_BROWSER_SEARCH 0x00430000 +#define KEY_BROWSER_FAVORITES 0x00440000 +#define KEY_BROWSER_HOME 0x00450000 +#define KEY_VOLUME_MUTE 0x00460000 +#define KEY_VOLUME_DOWN 0x00470000 +#define KEY_VOLUME_UP 0x00480000 +#define KEY_MEDIA_NEXT_TRACK 0x00490000 +#define KEY_MEDIA_PREV_TRACK 0x004A0000 +#define KEY_MEDIA_STOP 0x004B0000 +#define KEY_MEDIA_PLAY_PAUSE 0x004C0000 +#define KEY_MEDIA_RECORD 0x004D0000 +#define KEY_MEDIA_REWIND 0x004E0000 +#define KEY_MEDIA_FORWARD 0x004F0000 +#define KEY_MEDIA_REPEAT 0x00500000 +#define KEY_MEDIA_SHUFFLE 0x00510000 +#define KEY_MEDIA_SUBTITLE 0x00520000 +#define KEY_MEDIA_AUDIO 0x00530000 +#define KEY_MEDIA_ANGLE 0x00540000 +#define KEY_MEDIA_TIME 0x00550000 +#define KEY_MEDIA_FRAME_PREV 0x00560000 +#define KEY_MEDIA_FRAME_NEXT 0x00570000 +#define KEY_MEDIA_SELECT 0x00580000 +#define KEY_MEDIA_VIEW 0x00590000 +#define KEY_MEDIA_MENU 0x005A0000 +#define KEY_ZOOM_IN 0x00600000 +#define KEY_ZOOM_OUT 0x00610000 +#define KEY_BRIGHTNESS_UP 0x00620000 +#define KEY_BRIGHTNESS_DOWN 0x00630000 + +#define KEY_MOUSEWHEELUP 0x00F00000 +#define KEY_MOUSEWHEELDOWN 0x00F10000 +#define KEY_MOUSEWHEELLEFT 0x00F20000 +#define KEY_MOUSEWHEELRIGHT 0x00F30000 + +VLC_API char *vlc_keycode2str(uint_fast32_t i_key, bool locale) VLC_USED; +VLC_API uint_fast32_t vlc_str2keycode(const char *str) VLC_USED; + +typedef enum vlc_action_id { + ACTIONID_NONE = 0, + ACTIONID_QUIT, + ACTIONID_PLAY_PAUSE, + ACTIONID_PLAY, + ACTIONID_PAUSE, + ACTIONID_STOP, + ACTIONID_PREV, + ACTIONID_NEXT, + ACTIONID_SLOWER, + ACTIONID_FASTER, + ACTIONID_TOGGLE_FULLSCREEN, + ACTIONID_VOL_UP, + ACTIONID_VOL_DOWN, + ACTIONID_NAV_ACTIVATE, + ACTIONID_NAV_UP, + ACTIONID_NAV_DOWN, + ACTIONID_NAV_LEFT, + ACTIONID_NAV_RIGHT, + ACTIONID_JUMP_BACKWARD_EXTRASHORT, + ACTIONID_JUMP_FORWARD_EXTRASHORT, + ACTIONID_JUMP_BACKWARD_SHORT, + ACTIONID_JUMP_FORWARD_SHORT, + ACTIONID_JUMP_BACKWARD_MEDIUM, + ACTIONID_JUMP_FORWARD_MEDIUM, + ACTIONID_JUMP_BACKWARD_LONG, + ACTIONID_JUMP_FORWARD_LONG, + ACTIONID_FRAME_NEXT, + ACTIONID_POSITION, + ACTIONID_VOL_MUTE, +/* let ACTIONID_SET_BOOMARK* and ACTIONID_PLAY_BOOKMARK* be contiguous */ + ACTIONID_SET_BOOKMARK1, + ACTIONID_SET_BOOKMARK2, + ACTIONID_SET_BOOKMARK3, + ACTIONID_SET_BOOKMARK4, + ACTIONID_SET_BOOKMARK5, + ACTIONID_SET_BOOKMARK6, + ACTIONID_SET_BOOKMARK7, + ACTIONID_SET_BOOKMARK8, + ACTIONID_SET_BOOKMARK9, + ACTIONID_SET_BOOKMARK10, + ACTIONID_PLAY_BOOKMARK1, + ACTIONID_PLAY_BOOKMARK2, + ACTIONID_PLAY_BOOKMARK3, + ACTIONID_PLAY_BOOKMARK4, + ACTIONID_PLAY_BOOKMARK5, + ACTIONID_PLAY_BOOKMARK6, + ACTIONID_PLAY_BOOKMARK7, + ACTIONID_PLAY_BOOKMARK8, + ACTIONID_PLAY_BOOKMARK9, + ACTIONID_PLAY_BOOKMARK10, + /* end of contiguous zone */ + ACTIONID_PLAY_CLEAR, + ACTIONID_SUBDELAY_UP, + ACTIONID_SUBDELAY_DOWN, + ACTIONID_SUBSYNC_MARKAUDIO, + ACTIONID_SUBSYNC_MARKSUB, + ACTIONID_SUBSYNC_APPLY, + ACTIONID_SUBSYNC_RESET, + ACTIONID_SUBPOS_UP, + ACTIONID_SUBPOS_DOWN, + ACTIONID_AUDIO_TRACK, + ACTIONID_SUBTITLE_REVERSE_TRACK, + ACTIONID_SUBTITLE_TRACK, + ACTIONID_SUBTITLE_TOGGLE, + ACTIONID_SUBTITLE_TEXT_SCALE_NORMAL, + ACTIONID_SUBTITLE_TEXT_SCALE_UP, + ACTIONID_SUBTITLE_TEXT_SCALE_DOWN, + ACTIONID_INTF_TOGGLE_FSC, + ACTIONID_INTF_HIDE, + ACTIONID_INTF_BOSS, + /* chapter and title navigation */ + ACTIONID_TITLE_PREV, + ACTIONID_TITLE_NEXT, + ACTIONID_CHAPTER_PREV, + ACTIONID_CHAPTER_NEXT, + /* end of chapter and title navigation */ + ACTIONID_AUDIODELAY_UP, + ACTIONID_AUDIODELAY_DOWN, + ACTIONID_SNAPSHOT, + ACTIONID_RECORD, + ACTIONID_DISC_MENU, + ACTIONID_ASPECT_RATIO, + ACTIONID_CROP, + ACTIONID_DEINTERLACE, + ACTIONID_DEINTERLACE_MODE, + ACTIONID_ZOOM, + ACTIONID_UNZOOM, + ACTIONID_CROP_TOP, + ACTIONID_UNCROP_TOP, + ACTIONID_CROP_LEFT, + ACTIONID_UNCROP_LEFT, + ACTIONID_CROP_BOTTOM, + ACTIONID_UNCROP_BOTTOM, + ACTIONID_CROP_RIGHT, + ACTIONID_UNCROP_RIGHT, + ACTIONID_RANDOM, + ACTIONID_LOOP, + ACTIONID_WALLPAPER, + ACTIONID_LEAVE_FULLSCREEN, + /* Zoom */ + ACTIONID_ZOOM_QUARTER, + ACTIONID_ZOOM_HALF, + ACTIONID_ZOOM_ORIGINAL, + ACTIONID_ZOOM_DOUBLE, + /* Cycle Through Audio Devices */ + ACTIONID_AUDIODEVICE_CYCLE, + /* scaling */ + ACTIONID_TOGGLE_AUTOSCALE, + ACTIONID_SCALE_UP, + ACTIONID_SCALE_DOWN, + /* */ + ACTIONID_RATE_NORMAL, + ACTIONID_RATE_SLOWER_FINE, + ACTIONID_RATE_FASTER_FINE, + /* Cycle Through Program Service IDs */ + ACTIONID_PROGRAM_SID_NEXT, + ACTIONID_PROGRAM_SID_PREV, + ACTIONID_INTF_POPUP_MENU, + /* Viewpoint */ + ACTIONID_VIEWPOINT_FOV_IN, + ACTIONID_VIEWPOINT_FOV_OUT, + ACTIONID_VIEWPOINT_ROLL_CLOCK, + ACTIONID_VIEWPOINT_ROLL_ANTICLOCK, + /* Combo Actions */ + ACTIONID_COMBO_VOL_FOV_UP, + ACTIONID_COMBO_VOL_FOV_DOWN, + +} vlc_action_id_t; + +/** + * Get the action ID from an action key name + * \return the action ID or ACTIONID_NONE on error. + */ +VLC_API vlc_action_id_t +vlc_actions_get_id(const char *psz_key_name); + +/** + * Get keycodes from a action key name and vlc configuration + * \return The number of keycodes for this action, or 0 in case of an error. + * The list needs to be released with free() + */ +VLC_API size_t +vlc_actions_get_keycodes(vlc_object_t *p_obj, const char *psz_key_name, + bool b_global, uint_fast32_t **pp_keycodes ); +#define vlc_actions_get_keycodes(a, b, c, d) vlc_actions_get_keycodes(VLC_OBJECT(a), b, c, d) + +/** + * Get a list a key names + * \return A NULL terminated list of const char * + */ +VLC_API const char* const* +vlc_actions_get_key_names(vlc_object_t *p_obj); +#define vlc_actions_get_key_names(x) vlc_actions_get_key_names(VLC_OBJECT(x)) + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_addons.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_addons.h new file mode 100644 index 0000000..23cb134 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_addons.h @@ -0,0 +1,227 @@ +/***************************************************************************** + * vlc_addons.h : addons handling and describing + ***************************************************************************** + * Copyright (C) 2013 VideoLAN and authors + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ADDONS_H +#define VLC_ADDONS_H 1 + +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef enum addon_type_t +{ + ADDON_UNKNOWN = 0, + ADDON_EXTENSION, + ADDON_PLAYLIST_PARSER, + ADDON_SERVICE_DISCOVERY, + ADDON_SKIN2, + ADDON_PLUGIN, + ADDON_INTERFACE, + ADDON_META, + ADDON_OTHER +} addon_type_t; + +typedef enum addon_state_t +{ + ADDON_NOTINSTALLED = 0, + ADDON_INSTALLING, + ADDON_INSTALLED, + ADDON_UNINSTALLING +} addon_state_t; + +typedef enum addon_flags_t +{ + ADDON_BROKEN = 1, /* Have install inconsistency */ + ADDON_MANAGEABLE = 1 << 1, /* Have manifest, can install or uninstall files */ + ADDON_UPDATABLE = 1 << 2, +} addon_flags_t; + +#define ADDON_MAX_SCORE (5 * 100) +#define ADDON_UUID_SIZE 16 +#define ADDON_UUID_PSZ_SIZE (ADDON_UUID_SIZE * 2 + 4) +typedef uint8_t addon_uuid_t[ADDON_UUID_SIZE]; + +typedef struct addon_file_t +{ + addon_type_t e_filetype; + char *psz_download_uri; + char *psz_filename; +} addon_file_t; + +struct addon_entry_t +{ + vlc_mutex_t lock; + + addon_type_t e_type; + addon_state_t e_state; + addon_flags_t e_flags; + + /* data describing addon */ + addon_uuid_t uuid; + char *psz_name; + char *psz_summary; + char *psz_description; + char *psz_author; + char *psz_source_uri; /* webpage, ... */ + char *psz_image_uri; + char *psz_image_data; /* base64, png */ + char *psz_version; + + /* stats */ + long int i_downloads; + int i_score; /* score 0..5 in hundredth */ + + /* Lister */ + char *psz_source_module; + + /* files list */ + char *psz_archive_uri; /* Archive */ + DECL_ARRAY(addon_file_t *) files; + + /* custom data storage (if needed by module/source) */ + void * p_custom; +}; + +typedef struct addons_finder_t addons_finder_t; +typedef struct addons_finder_sys_t addons_finder_sys_t; +struct addons_finder_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_find )( addons_finder_t * ); + int ( * pf_retrieve )( addons_finder_t *, addon_entry_t * ); + DECL_ARRAY( addon_entry_t * ) entries; + char *psz_uri; + + addons_finder_sys_t *p_sys; +}; + +typedef struct addons_storage_t addons_storage_t; +typedef struct addons_storage_sys_t addons_storage_sys_t; +struct addons_storage_t +{ + VLC_COMMON_MEMBERS + + int ( * pf_install )( addons_storage_t *, addon_entry_t * ); + int ( * pf_remove )( addons_storage_t *, addon_entry_t * ); + int ( * pf_catalog ) ( addons_storage_t *, addon_entry_t **, int ); + + addons_storage_sys_t *p_sys; +}; + +typedef struct addons_manager_t addons_manager_t; + +struct addons_manager_owner +{ + void *sys; + void (*addon_found)(struct addons_manager_t *, struct addon_entry_t *); + void (*discovery_ended)(struct addons_manager_t *); + void (*addon_changed)(struct addons_manager_t *, struct addon_entry_t *); +}; + +typedef struct addons_manager_private_t addons_manager_private_t; +struct addons_manager_t +{ + struct addons_manager_owner owner; + addons_manager_private_t *p_priv; +}; + +/** + * addon entry lifecycle + */ +VLC_API addon_entry_t *addon_entry_New( void ); +VLC_API addon_entry_t *addon_entry_Hold(addon_entry_t *); +VLC_API void addon_entry_Release(addon_entry_t *); + +/** + * addons manager lifecycle + */ +VLC_API addons_manager_t *addons_manager_New( vlc_object_t *, + const struct addons_manager_owner * ); +VLC_API void addons_manager_Delete( addons_manager_t * ); + +/** + * Charge currently installed, usable and manageable addons + * (default "addons storage" module) + */ +VLC_API int addons_manager_LoadCatalog( addons_manager_t * ); + +/** + * Gather addons info from repository (default "addons finder" module) + * If psz_uri is not NULL, only gather info from the pointed package. + */ +VLC_API void addons_manager_Gather( addons_manager_t *, const char *psz_uri ); + +/** + * Install or Remove the addon identified by its uuid + */ +VLC_API int addons_manager_Install( addons_manager_t *p_manager, const addon_uuid_t uuid ); +VLC_API int addons_manager_Remove( addons_manager_t *p_manager, const addon_uuid_t uuid ); + +/** + * String uuid to binary uuid helpers + */ +static inline bool addons_uuid_read( const char *psz_uuid, addon_uuid_t *p_uuid ) +{ + if ( !psz_uuid ) return false; + if ( strlen( psz_uuid ) < ADDON_UUID_PSZ_SIZE ) return false; + + int i = 0, j = 0; + while ( i + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_H +#define VLC_AOUT_H 1 + +#include + +/** + * \defgroup audio_output Audio output + * \ingroup output + * @{ + * \file + * Audio output modules interface + */ + +/* Buffers which arrive in advance of more than AOUT_MAX_ADVANCE_TIME + * will be considered as bogus and be trashed */ +#define AOUT_MAX_ADVANCE_TIME (AOUT_MAX_PREPARE_TIME + CLOCK_FREQ) + +/* Buffers which arrive in advance of more than AOUT_MAX_PREPARE_TIME + * will cause the calling thread to sleep */ +#define AOUT_MAX_PREPARE_TIME (2 * CLOCK_FREQ) + +/* Buffers which arrive after pts - AOUT_MIN_PREPARE_TIME will be trashed + * to avoid too heavy resampling */ +#define AOUT_MIN_PREPARE_TIME AOUT_MAX_PTS_ADVANCE + +/* Tolerance values from EBU Recommendation 37 */ +/** Maximum advance of actual audio playback time to coded PTS, + * above which downsampling will be performed */ +#define AOUT_MAX_PTS_ADVANCE (CLOCK_FREQ / 25) + +/** Maximum delay of actual audio playback time from coded PTS, + * above which upsampling will be performed */ +#define AOUT_MAX_PTS_DELAY (3 * CLOCK_FREQ / 50) + +/* Max acceptable resampling (in %) */ +#define AOUT_MAX_RESAMPLING 10 + +#include "vlc_es.h" + +#define AOUT_FMTS_IDENTICAL( p_first, p_second ) ( \ + ((p_first)->i_format == (p_second)->i_format) \ + && AOUT_FMTS_SIMILAR(p_first, p_second) ) + +/* Check if i_rate == i_rate and i_channels == i_channels */ +#define AOUT_FMTS_SIMILAR( p_first, p_second ) ( \ + ((p_first)->i_rate == (p_second)->i_rate) \ + && ((p_first)->channel_type == (p_second)->channel_type) \ + && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\ + && ((p_first)->i_chan_mode == (p_second)->i_chan_mode) ) + +#define AOUT_FMT_LINEAR( p_format ) \ + (aout_BitsPerSample((p_format)->i_format) != 0) + +#define VLC_CODEC_SPDIFL VLC_FOURCC('s','p','d','i') +#define VLC_CODEC_SPDIFB VLC_FOURCC('s','p','d','b') + +#define AOUT_FMT_SPDIF( p_format ) \ + ( ((p_format)->i_format == VLC_CODEC_SPDIFL) \ + || ((p_format)->i_format == VLC_CODEC_SPDIFB) \ + || ((p_format)->i_format == VLC_CODEC_A52) \ + || ((p_format)->i_format == VLC_CODEC_DTS) ) + +#define AOUT_FMT_HDMI( p_format ) \ + ( (p_format)->i_format == VLC_CODEC_EAC3 \ + ||(p_format)->i_format == VLC_CODEC_TRUEHD \ + ||(p_format)->i_format == VLC_CODEC_MLP \ + ) + +/* Values used for the audio-channels object variable */ +#define AOUT_VAR_CHAN_UNSET 0 /* must be zero */ +#define AOUT_VAR_CHAN_STEREO 1 +#define AOUT_VAR_CHAN_RSTEREO 2 +#define AOUT_VAR_CHAN_LEFT 3 +#define AOUT_VAR_CHAN_RIGHT 4 +#define AOUT_VAR_CHAN_DOLBYS 5 +#define AOUT_VAR_CHAN_HEADPHONES 6 +#define AOUT_VAR_CHAN_MONO 7 + +/***************************************************************************** + * Main audio output structures + *****************************************************************************/ + +/* Size of a frame for S/PDIF output. */ +#define AOUT_SPDIF_SIZE 6144 + +/* Number of samples in an A/52 frame. */ +#define A52_FRAME_NB 1536 + +/* FIXME to remove once aout.h is cleaned a bit more */ +#include + +/** Audio output object */ +struct audio_output +{ + VLC_COMMON_MEMBERS + + struct aout_sys_t *sys; /**< Private data for callbacks */ + + int (*start)(audio_output_t *, audio_sample_format_t *fmt); + /**< Starts a new stream (mandatory, cannot be NULL). + * \param fmt input stream sample format upon entry, + * output stream sample format upon return [IN/OUT] + * \return VLC_SUCCESS on success, non-zero on failure + * \note No other stream may be already started when called. + */ + void (*stop)(audio_output_t *); + /**< Stops the existing stream (optional, may be NULL). + * \note A stream must have been started when called. + */ + int (*time_get)(audio_output_t *, mtime_t *delay); + /**< Estimates playback buffer latency (optional, may be NULL). + * \param delay pointer to the delay until the next sample to be written + * to the playback buffer is rendered [OUT] + * \return 0 on success, non-zero on failure or lack of data + * \note A stream must have been started when called. + */ + void (*play)(audio_output_t *, block_t *); + /**< Queues a block of samples for playback (mandatory, cannot be NULL). + * \note A stream must have been started when called. + */ + void (*pause)( audio_output_t *, bool pause, mtime_t date); + /**< Pauses or resumes playback (optional, may be NULL). + * \param pause pause if true, resume from pause if false + * \param date timestamp when the pause or resume was requested + * \note A stream must have been started when called. + */ + void (*flush)( audio_output_t *, bool wait); + /**< Flushes or drains the playback buffers (mandatory, cannot be NULL). + * \param wait true to wait for playback of pending buffers (drain), + * false to discard pending buffers (flush) + * \note A stream must have been started when called. + */ + int (*volume_set)(audio_output_t *, float volume); + /**< Changes playback volume (optional, may be NULL). + * \param volume requested volume (0. = mute, 1. = nominal) + * \note The volume is always a positive number. + * \warning A stream may or may not have been started when called. + */ + int (*mute_set)(audio_output_t *, bool mute); + /**< Changes muting (optinal, may be NULL). + * \param mute true to mute, false to unmute + * \warning A stream may or may not have been started when called. + */ + int (*device_select)(audio_output_t *, const char *id); + /**< Selects an audio output device (optional, may be NULL). + * \param id nul-terminated device unique identifier. + * \return 0 on success, non-zero on failure. + * \warning A stream may or may not have been started when called. + */ + + struct { + bool headphones; /**< Default to false, set it to true if the current + sink is using headphones */ + } current_sink_info; + /**< Current sink informations set by the module from the start() function */ + + struct { + void (*volume_report)(audio_output_t *, float); + void (*mute_report)(audio_output_t *, bool); + void (*policy_report)(audio_output_t *, bool); + void (*device_report)(audio_output_t *, const char *); + void (*hotplug_report)(audio_output_t *, const char *, const char *); + int (*gain_request)(audio_output_t *, float); + void (*restart_request)(audio_output_t *, unsigned); + } event; +}; + +typedef enum +{ + AOUT_CHANIDX_DISABLE = -1, + AOUT_CHANIDX_LEFT, + AOUT_CHANIDX_RIGHT, + AOUT_CHANIDX_MIDDLELEFT, + AOUT_CHANIDX_MIDDLERIGHT, + AOUT_CHANIDX_REARLEFT, + AOUT_CHANIDX_REARRIGHT, + AOUT_CHANIDX_REARCENTER, + AOUT_CHANIDX_CENTER, + AOUT_CHANIDX_LFE, + AOUT_CHANIDX_MAX +} vlc_chan_order_idx_t; + +static_assert(AOUT_CHANIDX_MAX == AOUT_CHAN_MAX, "channel count mismatch"); + +#define AOUT_CHAN_REMAP_INIT { \ + AOUT_CHANIDX_LEFT, \ + AOUT_CHANIDX_RIGHT, \ + AOUT_CHANIDX_MIDDLELEFT, \ + AOUT_CHANIDX_MIDDLERIGHT, \ + AOUT_CHANIDX_REARLEFT, \ + AOUT_CHANIDX_REARRIGHT, \ + AOUT_CHANIDX_REARCENTER, \ + AOUT_CHANIDX_CENTER, \ + AOUT_CHANIDX_LFE, \ +} + +/** + * It describes the audio channel order VLC expect. + */ +static const uint32_t pi_vlc_chan_order_wg4[] = +{ + AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, + AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT, + AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_REARCENTER, + AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0 +}; + +#define AOUT_RESTART_FILTERS 0x1 +#define AOUT_RESTART_OUTPUT (AOUT_RESTART_FILTERS|0x2) +#define AOUT_RESTART_STEREOMODE (AOUT_RESTART_OUTPUT|0x4) + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * This function computes the reordering needed to go from pi_chan_order_in to + * pi_chan_order_out. + * If pi_chan_order_in or pi_chan_order_out is NULL, it will assume that vlc + * internal (WG4) order is requested. + */ +VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *, + uint32_t mask, uint8_t *table ); +VLC_API void aout_ChannelReorder(void *, size_t, uint8_t, const uint8_t *, vlc_fourcc_t); + +VLC_API void aout_Interleave(void *dst, const void *const *planes, + unsigned samples, unsigned channels, + vlc_fourcc_t fourcc); +VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples, + unsigned channels, vlc_fourcc_t fourcc); + +/** + * This function will compute the extraction parameter into pi_selection to go + * from i_channels with their type given by pi_order_src[] into the order + * describe by pi_order_dst. + * It will also set : + * - *pi_channels as the number of channels that will be extracted which is + * lower (in case of non understood channels type) or equal to i_channels. + * - the layout of the channels (*pi_layout). + * + * It will return true if channel extraction is really needed, in which case + * aout_ChannelExtract must be used + * + * XXX It must be used when the source may have channel type not understood + * by VLC. In this case the channel type pi_order_src[] must be set to 0. + * XXX It must also be used if multiple channels have the same type. + */ +VLC_API bool aout_CheckChannelExtraction( int *pi_selection, uint32_t *pi_layout, int *pi_channels, const uint32_t pi_order_dst[AOUT_CHAN_MAX], const uint32_t *pi_order_src, int i_channels ); + +/** + * Do the actual channels extraction using the parameters created by + * aout_CheckChannelExtraction. + * + * XXX this function does not work in place (p_dst and p_src must not overlap). + * XXX Only 8, 16, 32, 64 bits per sample are supported. + */ +VLC_API void aout_ChannelExtract( void *p_dst, int i_dst_channels, const void *p_src, int i_src_channels, int i_sample_count, const int *pi_selection, int i_bits_per_sample ); + +/* */ +static inline unsigned aout_FormatNbChannels(const audio_sample_format_t *fmt) +{ + return popcount(fmt->i_physical_channels); +} + +VLC_API unsigned int aout_BitsPerSample( vlc_fourcc_t i_format ) VLC_USED; +VLC_API void aout_FormatPrepare( audio_sample_format_t * p_format ); +VLC_API void aout_FormatPrint(vlc_object_t *, const char *, + const audio_sample_format_t *); +#define aout_FormatPrint(o, t, f) aout_FormatPrint(VLC_OBJECT(o), t, f) +VLC_API const char * aout_FormatPrintChannels( const audio_sample_format_t * ) VLC_USED; + +#define AOUT_VOLUME_DEFAULT 256 +#define AOUT_VOLUME_MAX 512 + +VLC_API float aout_VolumeGet (audio_output_t *); +VLC_API int aout_VolumeSet (audio_output_t *, float); +VLC_API int aout_VolumeUpdate (audio_output_t *, int, float *); +VLC_API int aout_MuteGet (audio_output_t *); +VLC_API int aout_MuteSet (audio_output_t *, bool); +VLC_API char *aout_DeviceGet (audio_output_t *); +VLC_API int aout_DeviceSet (audio_output_t *, const char *); +VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***); + +/** + * Report change of configured audio volume to the core and UI. + */ +static inline void aout_VolumeReport(audio_output_t *aout, float volume) +{ + aout->event.volume_report(aout, volume); +} + +/** + * Report change of muted flag to the core and UI. + */ +static inline void aout_MuteReport(audio_output_t *aout, bool mute) +{ + aout->event.mute_report(aout, mute); +} + +/** + * Report audio policy status. + * \param cork true to request a cork, false to undo any pending cork. + */ +static inline void aout_PolicyReport(audio_output_t *aout, bool cork) +{ + aout->event.policy_report(aout, cork); +} + +/** + * Report change of output device. + */ +static inline void aout_DeviceReport(audio_output_t *aout, const char *id) +{ + aout->event.device_report(aout, id); +} + +/** + * Report a device hot-plug event. + * @param id device ID + * @param name human-readable device name (NULL for hot unplug) + */ +static inline void aout_HotplugReport(audio_output_t *aout, + const char *id, const char *name) +{ + aout->event.hotplug_report(aout, id, name); +} + +/** + * Request a change of software audio amplification. + * \param gain linear amplitude gain (must be positive) + * \warning Values in excess 1.0 may cause overflow and distorsion. + */ +static inline int aout_GainRequest(audio_output_t *aout, float gain) +{ + return aout->event.gain_request(aout, gain); +} + +static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode) +{ + aout->event.restart_request(aout, mode); +} + +/* Audio output filters */ + +typedef struct +{ + /** + * If the remap order differs from the WG4 order, a remap audio filter will + * be inserted to remap channels according to this array. + */ + int remap[AOUT_CHANIDX_MAX]; + /** + * If true, a filter will be inserted to add a headphones effect (like a + * binauralizer audio filter). + */ + bool headphones; +} aout_filters_cfg_t; + +#define AOUT_FILTERS_CFG_INIT (aout_filters_cfg_t) \ + { .remap = AOUT_CHAN_REMAP_INIT, \ + .headphones = false, \ + }; + +typedef struct aout_filters aout_filters_t; +typedef struct aout_request_vout aout_request_vout_t; + +VLC_API aout_filters_t *aout_FiltersNew(vlc_object_t *, + const audio_sample_format_t *, + const audio_sample_format_t *, + const aout_request_vout_t *, + const aout_filters_cfg_t *cfg) VLC_USED; +#define aout_FiltersNew(o,inf,outf,rv,remap) \ + aout_FiltersNew(VLC_OBJECT(o),inf,outf,rv,remap) +VLC_API void aout_FiltersDelete(vlc_object_t *, aout_filters_t *); +#define aout_FiltersDelete(o,f) \ + aout_FiltersDelete(VLC_OBJECT(o),f) +VLC_API bool aout_FiltersAdjustResampling(aout_filters_t *, int); +VLC_API block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate); +VLC_API block_t *aout_FiltersDrain(aout_filters_t *); +VLC_API void aout_FiltersFlush(aout_filters_t *); +VLC_API void aout_FiltersChangeViewpoint(aout_filters_t *, const vlc_viewpoint_t *vp); + +VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, const video_format_t *p_fmt ); + +/** @} */ + +#endif /* VLC_AOUT_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_aout_volume.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_aout_volume.h new file mode 100644 index 0000000..7a61af5 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_aout_volume.h @@ -0,0 +1,59 @@ +/***************************************************************************** + * vlc_aout_volume.h: audio volume module + ***************************************************************************** + * Copyright (C) 2002-2009 VLC authors and VideoLAN + * $Id: df85b8fd14e00454e88c08061e3059fa67927dab $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AOUT_MIXER_H +#define VLC_AOUT_MIXER_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup audio_volume Audio output volume + * \ingroup audio_output + * @{ + * \file + * This file defines functions, structures and macros for audio output mixer object + */ + +typedef struct audio_volume audio_volume_t; + +/** + * Audio volume + */ +struct audio_volume +{ + VLC_COMMON_MEMBERS + + vlc_fourcc_t format; /**< Audio samples format */ + void (*amplify)(audio_volume_t *, block_t *, float); /**< Amplifier */ +}; + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_arrays.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_arrays.h new file mode 100644 index 0000000..136a636 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_arrays.h @@ -0,0 +1,627 @@ +/***************************************************************************** + * vlc_arrays.h : Arrays and data structures handling + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 39b69952ffce040330da239f52778c3e82024bc4 $ + * + * Authors: Samuel Hocevar + * Clément Stenac + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ARRAYS_H_ +#define VLC_ARRAYS_H_ + +/** + * \file + * This file defines functions, structures and macros for handling arrays in vlc + */ + +/* realloc() that never fails *if* downsizing */ +static inline void *realloc_down( void *ptr, size_t size ) +{ + void *ret = realloc( ptr, size ); + return ret ? ret : ptr; +} + +#define TAB_INIT( count, tab ) \ + do { \ + (count) = 0; \ + (tab) = NULL; \ + } while(0) + +#define TAB_CLEAN( count, tab ) \ + do { \ + free( tab ); \ + (count)= 0; \ + (tab)= NULL; \ + } while(0) + +#define TAB_APPEND_CAST( cast, count, tab, p ) \ + do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + (tab)[count] = (p); \ + (count)++; \ + } while(0) + +#define TAB_APPEND( count, tab, p ) \ + TAB_APPEND_CAST( , count, tab, p ) + +#define TAB_FIND( count, tab, p, idx ) \ + do { \ + for( (idx) = 0; (idx) < (count); (idx)++ ) \ + if( (tab)[(idx)] == (p) ) \ + break; \ + if( (idx) >= (count) ) \ + (idx) = -1; \ + } while(0) + + +#define TAB_ERASE( count, tab, index ) \ + do { \ + if( (count) > 1 ) \ + memmove( (tab) + (index), \ + (tab) + (index) + 1, \ + ((count) - (index) - 1 ) * sizeof( *(tab) ) );\ + (count)--; \ + if( (count) == 0 ) \ + { \ + free( tab ); \ + (tab) = NULL; \ + } \ + } while(0) + +#define TAB_REMOVE( count, tab, p ) \ + do { \ + int i_index; \ + TAB_FIND( count, tab, p, i_index ); \ + if( i_index >= 0 ) \ + TAB_ERASE( count, tab, i_index ); \ + } while(0) + +#define TAB_INSERT_CAST( cast, count, tab, p, index ) do { \ + if( (count) > 0 ) \ + (tab) = cast realloc( tab, sizeof( *(tab) ) * ( (count) + 1 ) ); \ + else \ + (tab) = cast malloc( sizeof( *(tab) ) ); \ + if( !(tab) ) abort(); \ + if( (count) - (index) > 0 ) \ + memmove( (tab) + (index) + 1, \ + (tab) + (index), \ + ((count) - (index)) * sizeof( *(tab) ) );\ + (tab)[(index)] = (p); \ + (count)++; \ +} while(0) + +#define TAB_INSERT( count, tab, p, index ) \ + TAB_INSERT_CAST( , count, tab, p, index ) + +/** + * Binary search in a sorted array. The key must be comparable by < and > + * \param entries array of entries + * \param count number of entries + * \param elem key to check within an entry (like .id, or ->i_id) + * \param zetype type of the key + * \param key value of the key + * \param answer index of answer within the array. -1 if not found + */ +#define BSEARCH( entries, count, elem, zetype, key, answer ) \ + do { \ + int low = 0, high = count - 1; \ + answer = -1; \ + while( low <= high ) {\ + int mid = ((unsigned int)low + (unsigned int)high) >> 1;\ + zetype mid_val = entries[mid] elem;\ + if( mid_val < key ) \ + low = mid + 1; \ + else if ( mid_val > key ) \ + high = mid -1; \ + else \ + { \ + answer = mid; break; \ + }\ + } \ + } while(0) + + +/************************************************************************ + * Dynamic arrays with progressive allocation + ************************************************************************/ + +/* Internal functions */ +#define _ARRAY_ALLOC(array, newsize) { \ + (array).i_alloc = newsize; \ + (array).p_elems = realloc( (array).p_elems, (array).i_alloc * \ + sizeof(*(array).p_elems) ); \ + if( !(array).p_elems ) abort(); \ +} + +#define _ARRAY_GROW1(array) { \ + if( (array).i_alloc < 10 ) \ + _ARRAY_ALLOC(array, 10 ) \ + else if( (array).i_alloc == (array).i_size ) \ + _ARRAY_ALLOC(array, (int)((array).i_alloc * 1.5) ) \ +} + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +/* API */ +#define DECL_ARRAY(type) struct { \ + int i_alloc; \ + int i_size; \ + type *p_elems; \ +} + +#define TYPEDEF_ARRAY(type, name) typedef DECL_ARRAY(type) name; + +#define ARRAY_INIT(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_RESET(array) \ + do { \ + (array).i_alloc = 0; \ + (array).i_size = 0; \ + free( (array).p_elems ); (array).p_elems = NULL; \ + } while(0) + +#define ARRAY_APPEND(array, elem) \ + do { \ + _ARRAY_GROW1(array); \ + (array).p_elems[(array).i_size] = elem; \ + (array).i_size++; \ + } while(0) + +#define ARRAY_INSERT(array,elem,pos) \ + do { \ + _ARRAY_GROW1(array); \ + if( (array).i_size - pos ) { \ + memmove( (array).p_elems + pos + 1, (array).p_elems + pos, \ + ((array).i_size-pos) * sizeof(*(array).p_elems) ); \ + } \ + (array).p_elems[pos] = elem; \ + (array).i_size++; \ + } while(0) + +#define _ARRAY_SHRINK(array) { \ + if( (array).i_size > 10 && (array).i_size < (int)((array).i_alloc / 1.5) ) { \ + _ARRAY_ALLOC(array, (array).i_size + 5); \ + } \ +} + +#define ARRAY_REMOVE(array,pos) \ + do { \ + if( (array).i_size - (pos) - 1 ) \ + { \ + memmove( (array).p_elems + pos, (array).p_elems + pos + 1, \ + ( (array).i_size - pos - 1 ) *sizeof(*(array).p_elems) ); \ + } \ + (array).i_size--; \ + _ARRAY_SHRINK(array); \ + } while(0) + +#define ARRAY_VAL(array, pos) array.p_elems[pos] + +#define ARRAY_BSEARCH(array, elem, zetype, key, answer) \ + BSEARCH( (array).p_elems, (array).i_size, elem, zetype, key, answer) + +#define FOREACH_ARRAY( item, array ) { \ + int fe_idx; \ + for( fe_idx = 0 ; fe_idx < (array).i_size ; fe_idx++ ) \ + { \ + item = (array).p_elems[fe_idx]; + +#define FOREACH_END() } } + + +/************************************************************************ + * Dynamic arrays with progressive allocation (Preferred API) + ************************************************************************/ +typedef struct vlc_array_t +{ + size_t i_count; + void ** pp_elems; +} vlc_array_t; + +static inline void vlc_array_init( vlc_array_t * p_array ) +{ + p_array->i_count = 0; + p_array->pp_elems = NULL; +} + +static inline void vlc_array_clear( vlc_array_t * p_array ) +{ + free( p_array->pp_elems ); + vlc_array_init( p_array ); +} + +/* Read */ +static inline size_t vlc_array_count( vlc_array_t * p_array ) +{ + return p_array->i_count; +} + +#ifndef __cplusplus +# define vlc_array_item_at_index(ar, idx) \ + _Generic((ar), \ + const vlc_array_t *: ((ar)->pp_elems[idx]), \ + vlc_array_t *: ((ar)->pp_elems[idx])) +#else +static inline void *vlc_array_item_at_index( vlc_array_t *ar, size_t idx ) +{ + return ar->pp_elems[idx]; +} + +static inline const void *vlc_array_item_at_index( const vlc_array_t *ar, + size_t idx ) +{ + return ar->pp_elems[idx]; +} +#endif + +static inline int vlc_array_index_of_item( const vlc_array_t *ar, + const void *elem ) +{ + for( size_t i = 0; i < ar->i_count; i++ ) + { + if( ar->pp_elems[i] == elem ) + return i; + } + return -1; +} + +/* Write */ +static inline int vlc_array_insert( vlc_array_t *ar, void *elem, int idx ) +{ + void **pp = (void **)realloc( ar->pp_elems, + sizeof( void * ) * (ar->i_count + 1) ); + if( unlikely(pp == NULL) ) + return -1; + + size_t tail = ar->i_count - idx; + if( tail > 0 ) + memmove( pp + idx + 1, pp + idx, sizeof( void * ) * tail ); + + pp[idx] = elem; + ar->i_count++; + ar->pp_elems = pp; + return 0; +} + +static inline void vlc_array_insert_or_abort( vlc_array_t *ar, void *elem, int idx ) +{ + if( vlc_array_insert( ar, elem, idx ) ) + abort(); +} + +static inline int vlc_array_append( vlc_array_t *ar, void *elem ) +{ + void **pp = (void **)realloc( ar->pp_elems, + sizeof( void * ) * (ar->i_count + 1) ); + if( unlikely(pp == NULL) ) + return -1; + + pp[ar->i_count++] = elem; + ar->pp_elems = pp; + return 0; +} + +static inline void vlc_array_append_or_abort( vlc_array_t *ar, void *elem ) +{ + if( vlc_array_append( ar, elem ) != 0 ) + abort(); +} + +static inline void vlc_array_remove( vlc_array_t *ar, size_t idx ) +{ + void **pp = ar->pp_elems; + size_t tail = ar->i_count - idx - 1; + + if( tail > 0 ) + memmove( pp + idx, pp + idx + 1, sizeof( void * ) * tail ); + + ar->i_count--; + + if( ar->i_count > 0 ) + { + pp = (void **)realloc( pp, sizeof( void * ) * ar->i_count ); + if( likely(pp != NULL) ) + ar->pp_elems = pp; + } + else + { + free( pp ); + ar->pp_elems = NULL; + } +} + + +/************************************************************************ + * Dictionaries + ************************************************************************/ + +/* This function is not intended to be crypto-secure, we only want it to be + * fast and not suck too much. This one is pretty fast and did 0 collisions + * in wenglish's dictionary. + */ +static inline uint64_t DictHash( const char *psz_string, int hashsize ) +{ + uint64_t i_hash = 0; + if( psz_string ) + { + while( *psz_string ) + { + i_hash += *psz_string++; + i_hash += i_hash << 10; + i_hash ^= i_hash >> 8; + } + } + return i_hash % hashsize; +} + +typedef struct vlc_dictionary_entry_t +{ + char * psz_key; + void * p_value; + struct vlc_dictionary_entry_t * p_next; +} vlc_dictionary_entry_t; + +typedef struct vlc_dictionary_t +{ + int i_size; + vlc_dictionary_entry_t ** p_entries; +} vlc_dictionary_t; + +static void * const kVLCDictionaryNotFound = NULL; + +static inline void vlc_dictionary_init( vlc_dictionary_t * p_dict, int i_size ) +{ + p_dict->p_entries = NULL; + + if( i_size > 0 ) + { + p_dict->p_entries = (vlc_dictionary_entry_t **)calloc( i_size, sizeof(*p_dict->p_entries) ); + if( !p_dict->p_entries ) + i_size = 0; + } + p_dict->i_size = i_size; +} + +static inline void vlc_dictionary_clear( vlc_dictionary_t * p_dict, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( p_dict->p_entries ) + { + for( int i = 0; i < p_dict->i_size; i++ ) + { + vlc_dictionary_entry_t * p_current, * p_next; + p_current = p_dict->p_entries[i]; + while( p_current ) + { + p_next = p_current->p_next; + if( pf_free != NULL ) + ( * pf_free )( p_current->p_value, p_obj ); + free( p_current->psz_key ); + free( p_current ); + p_current = p_next; + } + } + free( p_dict->p_entries ); + p_dict->p_entries = NULL; + } + p_dict->i_size = 0; +} + +static inline int +vlc_dictionary_has_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return 0; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + const vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + for( ; p_entry != NULL; p_entry = p_entry->p_next ) + { + if( !strcmp( psz_key, p_entry->psz_key ) ) + break; + } + return p_entry != NULL; +} + +static inline void * +vlc_dictionary_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key ) +{ + if( !p_dict->p_entries ) + return kVLCDictionaryNotFound; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + + if( !p_entry ) + return kVLCDictionaryNotFound; + + /* Make sure we return the right item. (Hash collision) */ + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + return p_entry->p_value; + p_entry = p_entry->p_next; + } while( p_entry ); + + return kVLCDictionaryNotFound; +} + +static inline int +vlc_dictionary_keys_count( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + int i, count = 0; + + if( !p_dict->p_entries ) + return 0; + + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) count++; + } + return count; +} + +static inline bool +vlc_dictionary_is_empty( const vlc_dictionary_t * p_dict ) +{ + if( p_dict->p_entries ) + for( int i = 0; i < p_dict->i_size; i++ ) + if( p_dict->p_entries[i] ) + return false; + return true; +} + +static inline char ** +vlc_dictionary_all_keys( const vlc_dictionary_t * p_dict ) +{ + vlc_dictionary_entry_t * p_entry; + char ** ppsz_ret; + int i, count = vlc_dictionary_keys_count( p_dict ); + + ppsz_ret = (char**)malloc(sizeof(char *) * (count + 1)); + if( unlikely(!ppsz_ret) ) + return NULL; + + count = 0; + for( i = 0; i < p_dict->i_size; i++ ) + { + for( p_entry = p_dict->p_entries[i]; p_entry; p_entry = p_entry->p_next ) + ppsz_ret[count++] = strdup( p_entry->psz_key ); + } + ppsz_ret[count] = NULL; + return ppsz_ret; +} + +static inline void +vlc_dictionary_insert_impl_( vlc_dictionary_t * p_dict, const char * psz_key, + void * p_value, bool rebuild ) +{ + if( !p_dict->p_entries ) + vlc_dictionary_init( p_dict, 1 ); + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry; + + p_entry = (vlc_dictionary_entry_t *)malloc(sizeof(*p_entry)); + p_entry->psz_key = strdup( psz_key ); + p_entry->p_value = p_value; + p_entry->p_next = p_dict->p_entries[i_pos]; + p_dict->p_entries[i_pos] = p_entry; + if( rebuild ) + { + /* Count how many items there was */ + int count; + for( count = 1; p_entry->p_next; count++ ) + p_entry = p_entry->p_next; + if( count > 3 ) /* XXX: this need tuning */ + { + /* Here it starts to be not good, rebuild a bigger dictionary */ + struct vlc_dictionary_t new_dict; + int i_new_size = ( (p_dict->i_size+2) * 3) / 2; /* XXX: this need tuning */ + int i; + vlc_dictionary_init( &new_dict, i_new_size ); + for( i = 0; i < p_dict->i_size; i++ ) + { + p_entry = p_dict->p_entries[i]; + while( p_entry ) + { + vlc_dictionary_insert_impl_( &new_dict, p_entry->psz_key, + p_entry->p_value, + false /* To avoid multiple rebuild loop */); + p_entry = p_entry->p_next; + } + } + + vlc_dictionary_clear( p_dict, NULL, NULL ); + p_dict->i_size = new_dict.i_size; + p_dict->p_entries = new_dict.p_entries; + } + } +} + +static inline void +vlc_dictionary_insert( vlc_dictionary_t * p_dict, const char * psz_key, void * p_value ) +{ + vlc_dictionary_insert_impl_( p_dict, psz_key, p_value, true ); +} + +static inline void +vlc_dictionary_remove_value_for_key( const vlc_dictionary_t * p_dict, const char * psz_key, + void ( * pf_free )( void * p_data, void * p_obj ), + void * p_obj ) +{ + if( !p_dict->p_entries ) + return; + + int i_pos = DictHash( psz_key, p_dict->i_size ); + vlc_dictionary_entry_t * p_entry = p_dict->p_entries[i_pos]; + vlc_dictionary_entry_t * p_prev; + + if( !p_entry ) + return; /* Not found, nothing to do */ + + /* Hash collision */ + p_prev = NULL; + do { + if( !strcmp( psz_key, p_entry->psz_key ) ) + { + if( pf_free != NULL ) + ( * pf_free )( p_entry->p_value, p_obj ); + if( !p_prev ) + p_dict->p_entries[i_pos] = p_entry->p_next; + else + p_prev->p_next = p_entry->p_next; + free( p_entry->psz_key ); + free( p_entry ); + return; + } + p_prev = p_entry; + p_entry = p_entry->p_next; + } while( p_entry ); + + /* No key was found */ +} + +#ifdef __cplusplus +// C++ helpers +template +void vlc_delete_all( T &container ) +{ + typename T::iterator it = container.begin(); + while ( it != container.end() ) + { + delete *it; + ++it; + } + container.clear(); +} + +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_atomic.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_atomic.h new file mode 100644 index 0000000..31d1454 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_atomic.h @@ -0,0 +1,224 @@ +/***************************************************************************** + * vlc_atomic.h: + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ATOMIC_H +# define VLC_ATOMIC_H + +/** + * \file + * Atomic operations do not require locking, but they are not very powerful. + */ + +/* Clang older versions support atomics but lacks the stdatomic.h header */ +#if defined(__clang__) +# if !defined(__has_include) || !__has_include() +# define __STDC_NO_ATOMICS__ 1 +# endif +#endif + +# ifndef __cplusplus +# if !defined (__STDC_NO_ATOMICS__) +/*** Native C11 atomics ***/ +# include + +# else +/*** Intel/GCC atomics ***/ + +# define ATOMIC_FLAG_INIT false + +# define ATOMIC_VAR_INIT(value) (value) + +# define atomic_init(obj, value) \ + do { *(obj) = (value); } while(0) + +# define kill_dependency(y) \ + ((void)0) + +# define atomic_thread_fence(order) \ + __sync_synchronize() + +# define atomic_signal_fence(order) \ + ((void)0) + +# define atomic_is_lock_free(obj) \ + false + +typedef bool atomic_flag; +typedef bool atomic_bool; +typedef char atomic_char; +typedef signed char atomic_schar; +typedef unsigned char atomic_uchar; +typedef short atomic_short; +typedef unsigned short atomic_ushort; +typedef int atomic_int; +typedef unsigned int atomic_uint; +typedef long atomic_long; +typedef unsigned long atomic_ulong; +typedef long long atomic_llong; +typedef unsigned long long atomic_ullong; +//typedef char16_t atomic_char16_t; +//typedef char32_t atomic_char32_t; +typedef wchar_t atomic_wchar_t; +typedef int_least8_t atomic_int_least8_t; +typedef uint_least8_t atomic_uint_least8_t; +typedef int_least16_t atomic_int_least16_t; +typedef uint_least16_t atomic_uint_least16_t; +typedef int_least32_t atomic_int_least32_t; +typedef uint_least32_t atomic_uint_least32_t; +typedef int_least64_t atomic_int_least64_t; +typedef uint_least64_t atomic_uint_least64_t; +typedef int_fast8_t atomic_int_fast8_t; +typedef uint_fast8_t atomic_uint_fast8_t; +typedef int_fast16_t atomic_int_fast16_t; +typedef uint_fast16_t atomic_uint_fast16_t; +typedef int_fast32_t atomic_int_fast32_t; +typedef uint_fast32_t atomic_uint_fast32_t; +typedef int_fast64_t atomic_int_fast64_t; +typedef uint_fast64_t atomic_uint_fast64_t; +typedef intptr_t atomic_intptr_t; +typedef uintptr_t atomic_uintptr_t; +typedef size_t atomic_size_t; +typedef ptrdiff_t atomic_ptrdiff_t; +typedef intmax_t atomic_intmax_t; +typedef uintmax_t atomic_uintmax_t; + +# define atomic_store(object,desired) \ + do { \ + *(object) = (desired); \ + __sync_synchronize(); \ + } while (0) + +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object,desired) + +# define atomic_load(object) \ + (__sync_synchronize(), *(object)) + +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ +({ \ + typeof (object) _obj = (object); \ + typeof (*object) _old; \ + do \ + _old = atomic_load(_obj); \ + while (!__sync_bool_compare_and_swap(_obj, _old, (desired))); \ + _old; \ +}) + +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object,desired) + +# define atomic_compare_exchange(object,expected,desired) \ +({ \ + typeof (object) _exp = (expected); \ + typeof (*object) _old = *_exp; \ + *_exp = __sync_val_compare_and_swap((object), _old, (desired)); \ + *_exp == _old; \ +}) + +# define atomic_compare_exchange_strong(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order,order_different) \ + atomic_compare_exchange_strong(object, expected, desired) + +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange(object, expected, desired) + +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order_equal,order_different) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_add(object,operand) \ + __sync_fetch_and_add(object, operand) + +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object,operand) + +# define atomic_fetch_sub(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_or(object,operand) \ + __sync_fetch_and_or(object, operand) + +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object,operand) + +# define atomic_fetch_xor(object,operand) \ + __sync_fetch_and_sub(object, operand) + +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object,operand) + +# define atomic_fetch_and(object,operand) \ + __sync_fetch_and_and(object, operand) + +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object,operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + +# endif /* !C11 */ + +typedef atomic_uint_least32_t vlc_atomic_float; + +static inline void vlc_atomic_init_float(vlc_atomic_float *var, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_init(var, u.i); +} + +/** Helper to retrieve a single precision from an atom. */ +static inline float vlc_atomic_load_float(vlc_atomic_float *atom) +{ + union { float f; uint32_t i; } u; + u.i = atomic_load(atom); + return u.f; +} + +/** Helper to store a single precision into an atom. */ +static inline void vlc_atomic_store_float(vlc_atomic_float *atom, float f) +{ + union { float f; uint32_t i; } u; + u.f = f; + atomic_store(atom, u.i); +} + +# else /* C++ */ +/*** Native C++11 atomics ***/ +# include +# endif /* C++ */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_avcodec.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_avcodec.h new file mode 100644 index 0000000..664633a --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_avcodec.h @@ -0,0 +1,34 @@ +/***************************************************************************** + * vlc_avcodec.h: VLC thread support for libavcodec + ***************************************************************************** + * Copyright (C) 2009-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_AVCODEC_H +# define VLC_AVCODEC_H 1 + +static inline void vlc_avcodec_lock (void) +{ + vlc_global_lock (VLC_AVCODEC_MUTEX); +} + +static inline void vlc_avcodec_unlock (void) +{ + vlc_global_unlock (VLC_AVCODEC_MUTEX); +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_bits.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_bits.h new file mode 100644 index 0000000..edd095b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_bits.h @@ -0,0 +1,269 @@ +/***************************************************************************** + * vlc_bits.h : Bit handling helpers + ***************************************************************************** + * Copyright (C) 2001, 2002, 2003, 2006, 2015 VLC authors and VideoLAN + * $Id: 395a789eba46ac42413f5fb5418619332589f824 $ + * + * Authors: Laurent Aimar + * Gildas Bazin + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#ifndef VLC_BITS_H +#define VLC_BITS_H 1 + +#include + +/** + * \file + * This file defines functions, structures for handling streams of bits in vlc + */ + +typedef struct bs_s +{ + uint8_t *p_start; + uint8_t *p; + uint8_t *p_end; + + ssize_t i_left; /* i_count number of available bits */ + bool b_read_only; + + /* forward read modifier (p_start, p_end, p_fwpriv, count) */ + uint8_t *(*pf_forward)(uint8_t *, uint8_t *, void *, size_t); + void *p_fwpriv; +} bs_t; + +static inline void bs_write_init( bs_t *s, void *p_data, size_t i_data ) +{ + s->p_start = (uint8_t *)p_data; + s->p = s->p_start; + s->p_end = s->p_start + i_data; + s->i_left = 8; + s->b_read_only = false; + s->p_fwpriv = NULL; + s->pf_forward = NULL; +} + +static inline void bs_init( bs_t *s, const void *p_data, size_t i_data ) +{ + bs_write_init( s, (void*) p_data, i_data ); + s->b_read_only = true; +} + +static inline int bs_pos( const bs_t *s ) +{ + return( 8 * ( s->p - s->p_start ) + 8 - s->i_left ); +} + +static inline int bs_remain( const bs_t *s ) +{ + if( s->p >= s->p_end ) + return 0; + else + return( 8 * ( s->p_end - s->p ) - 8 + s->i_left ); +} + +static inline int bs_eof( const bs_t *s ) +{ + return( s->p >= s->p_end ? 1: 0 ); +} + +#define bs_forward( s, i ) \ + s->p = s->pf_forward ? s->pf_forward( s->p, s->p_end, s->p_fwpriv, i ) : s->p + i + +static inline uint32_t bs_read( bs_t *s, int i_count ) +{ + static const uint32_t i_mask[33] = + { 0x00, + 0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff, 0x3ff, 0x7ff, 0xfff, + 0x1fff, 0x3fff, 0x7fff, 0xffff, + 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, + 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, + 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, + 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff}; + int i_shr, i_drop = 0; + uint32_t i_result = 0; + + if( i_count > 32 ) + { + i_drop = i_count - 32; + i_count = 32; + } + + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + if( ( i_shr = s->i_left - i_count ) >= 0 ) + { + /* more in the buffer than requested */ + i_result |= ( *s->p >> i_shr )&i_mask[i_count]; + s->i_left -= i_count; + if( s->i_left == 0 ) + { + bs_forward( s, 1 ); + s->i_left = 8; + } + break; + } + else + { + /* less in the buffer than requested */ + if( -i_shr == 32 ) + i_result = 0; + else + i_result |= (*s->p&i_mask[s->i_left]) << -i_shr; + i_count -= s->i_left; + bs_forward( s, 1); + s->i_left = 8; + } + } + + if( i_drop ) + bs_forward( s, i_drop ); + + return( i_result ); +} + +static inline uint32_t bs_read1( bs_t *s ) +{ + if( s->p < s->p_end ) + { + unsigned int i_result; + + s->i_left--; + i_result = ( *s->p >> s->i_left )&0x01; + if( s->i_left == 0 ) + { + bs_forward( s, 1 ); + s->i_left = 8; + } + return i_result; + } + + return 0; +} + +static inline uint32_t bs_show( bs_t *s, int i_count ) +{ + bs_t s_tmp = *s; + return bs_read( &s_tmp, i_count ); +} + +static inline void bs_skip( bs_t *s, ssize_t i_count ) +{ + s->i_left -= i_count; + + if( s->i_left <= 0 ) + { + const size_t i_bytes = 1 + s->i_left / -8; + bs_forward( s, i_bytes ); + if( i_bytes * 8 < i_bytes /* ofw */ ) + s->i_left = i_bytes; + else + s->i_left += 8 * i_bytes; + } +} + +static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits ) +{ + if( s->b_read_only ) + return; + + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + i_count--; + + if( ( i_bits >> i_count )&0x01 ) + { + *s->p |= 1 << ( s->i_left - 1 ); + } + else + { + *s->p &= ~( 1 << ( s->i_left - 1 ) ); + } + s->i_left--; + if( s->i_left == 0 ) + { + bs_forward( s, 1 ); + s->i_left = 8; + } + } +} + +static inline bool bs_aligned( bs_t *s ) +{ + return s->i_left % 8 == 0; +} + +static inline void bs_align( bs_t *s ) +{ + if( s->i_left != 8 ) + { + s->i_left = 8; + s->p++; + } +} + +static inline void bs_align_0( bs_t *s ) +{ + if( s->i_left != 8 ) + { + bs_write( s, s->i_left, 0 ); + } +} + +static inline void bs_align_1( bs_t *s ) +{ + while( !s->b_read_only && s->i_left != 8 ) + { + bs_write( s, 1, 1 ); + } +} + +/* Read unsigned Exp-Golomb code */ +static inline uint_fast32_t bs_read_ue( bs_t * bs ) +{ + unsigned i = 0; + + while( bs_read1( bs ) == 0 && bs->p < bs->p_end && i < 31 ) + i++; + + return (1U << i) - 1 + bs_read( bs, i ); +} + +/* Read signed Exp-Golomb code */ +static inline int_fast32_t bs_read_se( bs_t *s ) +{ + uint_fast32_t val = bs_read_ue( s ); + + return (val & 0x01) ? (int_fast32_t)((val + 1) / 2) + : -(int_fast32_t)(val / 2); +} + +#undef bs_forward + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_block.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_block.h new file mode 100644 index 0000000..9990104 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_block.h @@ -0,0 +1,626 @@ +/***************************************************************************** + * vlc_block.h: Data blocks management functions + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 1c9478301687233398adbb7de7da4ffc4a101f89 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_H +#define VLC_BLOCK_H 1 + +/** + * \defgroup block Data blocks + * \ingroup input + * + * Blocks of binary data. + * + * @ref block_t is a generic structure to represent a binary blob within VLC. + * The primary goal of the structure is to avoid memory copying as data is + * passed around. It is notably used between the \ref demux, the packetizer + * (if present) and the \ref decoder, and for audio, between the \ref decoder, + * the audio filters, and the \ref audio_output. + * + * @{ + * \file + * Data block definition and functions + */ + +#include /* for ssize_t */ + +/**************************************************************************** + * block: + **************************************************************************** + * - i_flags may not always be set (ie could be 0, even for a key frame + * it depends where you receive the buffer (before/after a packetizer + * and the demux/packetizer implementations. + * - i_dts/i_pts could be VLC_TS_INVALID, it means no pts/dts + * - i_length: length in microseond of the packet, can be null except in the + * sout where it is mandatory. + * + * - i_buffer number of valid data pointed by p_buffer + * you can freely decrease it but never increase it yourself + * (use block_Realloc) + * - p_buffer: pointer over datas. You should never overwrite it, you can + * only incremment it to skip datas, in others cases use block_Realloc + * (don't duplicate yourself in a bigger buffer, block_Realloc is + * optimised for preheader/postdatas increase) + ****************************************************************************/ + +/** The content doesn't follow the last block, possible some blocks in between + * have been lost */ +#define BLOCK_FLAG_DISCONTINUITY 0x0001 +/** Intra frame */ +#define BLOCK_FLAG_TYPE_I 0x0002 +/** Inter frame with backward reference only */ +#define BLOCK_FLAG_TYPE_P 0x0004 +/** Inter frame with backward and forward reference */ +#define BLOCK_FLAG_TYPE_B 0x0008 +/** For inter frame when you don't know the real type */ +#define BLOCK_FLAG_TYPE_PB 0x0010 +/** Warn that this block is a header one */ +#define BLOCK_FLAG_HEADER 0x0020 +/** This block contains the last part of a sequence */ +#define BLOCK_FLAG_END_OF_SEQUENCE 0x0040 +/** This block contains a clock reference */ +#define BLOCK_FLAG_CLOCK 0x0080 +/** This block is scrambled */ +#define BLOCK_FLAG_SCRAMBLED 0x0100 +/** This block has to be decoded but not be displayed */ +#define BLOCK_FLAG_PREROLL 0x0200 +/** This block is corrupted and/or there is data loss */ +#define BLOCK_FLAG_CORRUPTED 0x0400 +/** This block contains an interlaced picture with top field stored first */ +#define BLOCK_FLAG_TOP_FIELD_FIRST 0x0800 +/** This block contains an interlaced picture with bottom field stored first */ +#define BLOCK_FLAG_BOTTOM_FIELD_FIRST 0x1000 +/** This block contains a single field from interlaced picture. */ +#define BLOCK_FLAG_SINGLE_FIELD 0x2000 + +/** This block contains an interlaced picture */ +#define BLOCK_FLAG_INTERLACED_MASK \ + (BLOCK_FLAG_TOP_FIELD_FIRST|BLOCK_FLAG_BOTTOM_FIELD_FIRST|BLOCK_FLAG_SINGLE_FIELD) + +#define BLOCK_FLAG_TYPE_MASK \ + (BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB) + +/* These are for input core private usage only */ +#define BLOCK_FLAG_CORE_PRIVATE_MASK 0x00ff0000 +#define BLOCK_FLAG_CORE_PRIVATE_SHIFT 16 + +/* These are for module private usage only */ +#define BLOCK_FLAG_PRIVATE_MASK 0xff000000 +#define BLOCK_FLAG_PRIVATE_SHIFT 24 + +typedef void (*block_free_t) (block_t *); + +struct block_t +{ + block_t *p_next; + + uint8_t *p_buffer; /**< Payload start */ + size_t i_buffer; /**< Payload length */ + uint8_t *p_start; /**< Buffer start */ + size_t i_size; /**< Buffer total size */ + + uint32_t i_flags; + unsigned i_nb_samples; /* Used for audio */ + + mtime_t i_pts; + mtime_t i_dts; + mtime_t i_length; + + /* Rudimentary support for overloading block (de)allocation. */ + block_free_t pf_release; +}; + +VLC_API void block_Init( block_t *, void *, size_t ); + +/** + * Allocates a block. + * + * Creates a new block with the requested size. + * The block must be released with block_Release(). + * + * @param size size in bytes (possibly zero) + * @return the created block, or NULL on memory error. + */ +VLC_API block_t *block_Alloc(size_t size) VLC_USED VLC_MALLOC; + +VLC_API block_t *block_TryRealloc(block_t *, ssize_t pre, size_t body) VLC_USED; + +/** + * Reallocates a block. + * + * This function expands, shrinks or moves a data block. + * In many cases, this function can return without any memory allocation by + * reusing spare buffer space. Otherwise, a new block is created and data is + * copied. + * + * @param pre count of bytes to prepend if positive, + * count of leading bytes to discard if negative + * @param body new bytes size of the block + * + * @return the reallocated block on succes, NULL on error. + * + * @note Skipping leading bytes can be achieved directly by subtracting from + * block_t.i_buffer and adding block_t.p_buffer. + * @note Discard trailing bytes can be achieved directly by subtracting from + * block_t.i_buffer. + * @note On error, the block is discarded. + * To avoid that, use block_TryRealloc() instead. + */ +VLC_API block_t *block_Realloc(block_t *, ssize_t pre, size_t body) VLC_USED; + +/** + * Releases a block. + * + * This function works for any @ref block_t block, regardless of the way it was + * allocated. + * + * @note + * If the block is in a chain, this function does not release any + * subsequent block in the chain. Use block_ChainRelease() for that purpose. + * + * @param block block to release (cannot be NULL) + */ +static inline void block_Release(block_t *block) +{ + block->pf_release(block); +} + +static inline void block_CopyProperties( block_t *dst, block_t *src ) +{ + dst->i_flags = src->i_flags; + dst->i_nb_samples = src->i_nb_samples; + dst->i_dts = src->i_dts; + dst->i_pts = src->i_pts; + dst->i_length = src->i_length; +} + +/** + * Duplicates a block. + * + * Creates a writeable duplicate of a block. + * + * @return the duplicate on success, NULL on error. + */ +VLC_USED +static inline block_t *block_Duplicate( block_t *p_block ) +{ + block_t *p_dup = block_Alloc( p_block->i_buffer ); + if( p_dup == NULL ) + return NULL; + + block_CopyProperties( p_dup, p_block ); + memcpy( p_dup->p_buffer, p_block->p_buffer, p_block->i_buffer ); + + return p_dup; +} + +/** + * Wraps heap in a block. + * + * Creates a @ref block_t out of an existing heap allocation. + * This is provided by LibVLC so that manually heap-allocated blocks can safely + * be deallocated even after the origin plugin has been unloaded from memory. + * + * When block_Release() is called, VLC will free() the specified pointer. + * + * @param addr base address of the heap allocation (will be free()'d) + * @param length bytes length of the heap allocation + * @return NULL in case of error (ptr free()'d in that case), or a valid + * block_t pointer. + */ +VLC_API block_t *block_heap_Alloc(void *, size_t) VLC_USED VLC_MALLOC; + +/** + * Wraps a memory mapping in a block + * + * Creates a @ref block_t from a virtual address memory mapping (mmap). + * This is provided by LibVLC so that mmap blocks can safely be deallocated + * even after the allocating plugin has been unloaded from memory. + * + * @param addr base address of the mapping (as returned by mmap) + * @param length length (bytes) of the mapping (as passed to mmap) + * @return NULL if addr is MAP_FAILED, or an error occurred (in the later + * case, munmap(addr, length) is invoked before returning). + */ +VLC_API block_t *block_mmap_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; + +/** + * Wraps a System V memory segment in a block + * + * Creates a @ref block_t from a System V shared memory segment (shmget()). + * This is provided by LibVLC so that segments can safely be deallocated + * even after the allocating plugin has been unloaded from memory. + * + * @param addr base address of the segment (as returned by shmat()) + * @param length length (bytes) of the segment (as passed to shmget()) + * @return NULL if an error occurred (in that case, shmdt(addr) is invoked + * before returning NULL). + */ +VLC_API block_t * block_shm_Alloc(void *addr, size_t length) VLC_USED VLC_MALLOC; + +/** + * Maps a file handle in memory. + * + * Loads a file into a block of memory through a file descriptor. + * If possible a private file mapping is created. Otherwise, the file is read + * normally. This function is a cancellation point. + * + * @note On 32-bits platforms, + * this function will not work for very large files, + * due to memory space constraints. + * + * @param fd file descriptor to load from + * @param write If true, request a read/write private mapping. + * If false, request a read-only potentially shared mapping. + * + * @return a new block with the file content at p_buffer, and file length at + * i_buffer (release it with block_Release()), or NULL upon error (see errno). + */ +VLC_API block_t *block_File(int fd, bool write) VLC_USED VLC_MALLOC; + +/** + * Maps a file in memory. + * + * Loads a file into a block of memory from a path to the file. + * See also block_File(). + * + * @param write If true, request a read/write private mapping. + * If false, request a read-only potentially shared mapping. + */ +VLC_API block_t *block_FilePath(const char *, bool write) VLC_USED VLC_MALLOC; + +static inline void block_Cleanup (void *block) +{ + block_Release ((block_t *)block); +} +#define block_cleanup_push( block ) vlc_cleanup_push (block_Cleanup, block) + +/** + * \defgroup block_fifo Block chain + * @{ + */ + +/**************************************************************************** + * Chains of blocks functions helper + **************************************************************************** + * - block_ChainAppend : append a block to the last block of a chain. Try to + * avoid using with a lot of data as it's really slow, prefer + * block_ChainLastAppend, p_block can be NULL + * - block_ChainLastAppend : use a pointer over a pointer to the next blocks, + * and update it. + * - block_ChainRelease : release a chain of block + * - block_ChainExtract : extract data from a chain, return real bytes counts + * - block_ChainGather : gather a chain, free it and return one block. + ****************************************************************************/ +static inline void block_ChainAppend( block_t **pp_list, block_t *p_block ) +{ + if( *pp_list == NULL ) + { + *pp_list = p_block; + } + else + { + block_t *p = *pp_list; + + while( p->p_next ) p = p->p_next; + p->p_next = p_block; + } +} + +static inline void block_ChainLastAppend( block_t ***ppp_last, block_t *p_block ) +{ + block_t *p_last = p_block; + + **ppp_last = p_block; + + while( p_last->p_next ) p_last = p_last->p_next; + *ppp_last = &p_last->p_next; +} + +static inline void block_ChainRelease( block_t *p_block ) +{ + while( p_block ) + { + block_t *p_next = p_block->p_next; + block_Release( p_block ); + p_block = p_next; + } +} + +static size_t block_ChainExtract( block_t *p_list, void *p_data, size_t i_max ) +{ + size_t i_total = 0; + uint8_t *p = (uint8_t*)p_data; + + while( p_list && i_max ) + { + size_t i_copy = __MIN( i_max, p_list->i_buffer ); + memcpy( p, p_list->p_buffer, i_copy ); + i_max -= i_copy; + i_total += i_copy; + p += i_copy; + + p_list = p_list->p_next; + } + return i_total; +} + +static inline void block_ChainProperties( block_t *p_list, int *pi_count, size_t *pi_size, mtime_t *pi_length ) +{ + size_t i_size = 0; + mtime_t i_length = 0; + int i_count = 0; + + while( p_list ) + { + i_size += p_list->i_buffer; + i_length += p_list->i_length; + i_count++; + + p_list = p_list->p_next; + } + + if( pi_size ) + *pi_size = i_size; + if( pi_length ) + *pi_length = i_length; + if( pi_count ) + *pi_count = i_count; +} + +static inline block_t *block_ChainGather( block_t *p_list ) +{ + size_t i_total = 0; + mtime_t i_length = 0; + block_t *g; + + if( p_list->p_next == NULL ) + return p_list; /* Already gathered */ + + block_ChainProperties( p_list, NULL, &i_total, &i_length ); + + g = block_Alloc( i_total ); + if( !g ) + return NULL; + block_ChainExtract( p_list, g->p_buffer, g->i_buffer ); + + g->i_flags = p_list->i_flags; + g->i_pts = p_list->i_pts; + g->i_dts = p_list->i_dts; + g->i_length = i_length; + + /* free p_list */ + block_ChainRelease( p_list ); + return g; +} + +/** + * @} + * \defgroup fifo Block FIFO + * Thread-safe block queue functions + * @{ + */ + +/** + * Creates a thread-safe FIFO queue of blocks. + * + * See also block_FifoPut() and block_FifoGet(). + * The created queue must be released with block_FifoRelease(). + * + * @return the FIFO or NULL on memory error + */ +VLC_API block_fifo_t *block_FifoNew(void) VLC_USED VLC_MALLOC; + +/** + * Destroys a FIFO created by block_FifoNew(). + * + * @note Any queued blocks are also destroyed. + * @warning No other threads may be using the FIFO when this function is + * called. Otherwise, undefined behaviour will occur. + */ +VLC_API void block_FifoRelease(block_fifo_t *); + +/** + * Clears all blocks in a FIFO. + */ +VLC_API void block_FifoEmpty(block_fifo_t *); + +/** + * Immediately queue one block at the end of a FIFO. + * + * @param fifo queue + * @param block head of a block list to queue (may be NULL) + */ +VLC_API void block_FifoPut(block_fifo_t *fifo, block_t *block); + +/** + * Dequeue the first block from the FIFO. If necessary, wait until there is + * one block in the queue. This function is (always) cancellation point. + * + * @return a valid block + */ +VLC_API block_t *block_FifoGet(block_fifo_t *) VLC_USED; + +/** + * Peeks the first block in the FIFO. + * + * @warning This function leaves the block in the FIFO. + * You need to protect against concurrent threads who could dequeue the block. + * Preferably, there should be only one thread reading from the FIFO. + * + * @warning This function is undefined if the FIFO is empty. + * + * @return a valid block. + */ +VLC_API block_t *block_FifoShow(block_fifo_t *); + +size_t block_FifoSize(block_fifo_t *) VLC_USED VLC_DEPRECATED; +VLC_API size_t block_FifoCount(block_fifo_t *) VLC_USED VLC_DEPRECATED; + +typedef struct block_fifo_t vlc_fifo_t; + +/** + * Locks a block FIFO. + * + * No more than one thread can lock the FIFO at any given + * time, and no other thread can modify the FIFO while it is locked. + * vlc_fifo_Unlock() releases the lock. + * + * @note If the FIFO is already locked by another thread, this function waits. + * This function is not a cancellation point. + * + * @warning Recursively locking a single FIFO is undefined. Locking more than + * one FIFO at a time may lead to lock inversion; mind the locking order. + */ +VLC_API void vlc_fifo_Lock(vlc_fifo_t *); + +/** + * Unlocks a block FIFO. + * + * The calling thread must have locked the FIFO previously with + * vlc_fifo_Lock(). Otherwise, the behaviour is undefined. + * + * @note This function is not a cancellation point. + */ +VLC_API void vlc_fifo_Unlock(vlc_fifo_t *); + +/** + * Wakes up one thread waiting on the FIFO, if any. + * + * @note This function is not a cancellation point. + * + * @warning For race-free operations, the FIFO should be locked by the calling + * thread. The function can be called on a unlocked FIFO however. + */ +VLC_API void vlc_fifo_Signal(vlc_fifo_t *); + +/** + * Waits on the FIFO. + * + * Atomically unlocks the FIFO and waits until one thread signals the FIFO, + * then locks the FIFO again. A signal can be sent by queueing a block to the + * previously empty FIFO or by calling vlc_fifo_Signal() directly. + * This function may also return spuriously at any moment. + * + * @note This function is a cancellation point. In case of cancellation, the + * the FIFO will be locked before cancellation cleanup handlers are processed. + */ +VLC_API void vlc_fifo_Wait(vlc_fifo_t *); + +VLC_API void vlc_fifo_WaitCond(vlc_fifo_t *, vlc_cond_t *); + +/** + * Timed variant of vlc_fifo_WaitCond(). + * + * Atomically unlocks the FIFO and waits until one thread signals the FIFO up + * to a certain date, then locks the FIFO again. See vlc_fifo_Wait(). + */ +int vlc_fifo_TimedWaitCond(vlc_fifo_t *, vlc_cond_t *, mtime_t); + +/** + * Queues a linked-list of blocks into a locked FIFO. + * + * @param block the head of the list of blocks + * (if NULL, this function has no effects) + * + * @note This function is not a cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + */ +VLC_API void vlc_fifo_QueueUnlocked(vlc_fifo_t *, block_t *); + +/** + * Dequeues the first block from a locked FIFO, if any. + * + * @note This function is not a cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return the first block in the FIFO or NULL if the FIFO is empty + */ +VLC_API block_t *vlc_fifo_DequeueUnlocked(vlc_fifo_t *) VLC_USED; + +/** + * Dequeues the all blocks from a locked FIFO. + * + * This is equivalent to calling vlc_fifo_DequeueUnlocked() repeatedly until + * the FIFO is emptied, but this function is much faster. + * + * @note This function is not a cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return a linked-list of all blocks in the FIFO (possibly NULL) + */ +VLC_API block_t *vlc_fifo_DequeueAllUnlocked(vlc_fifo_t *) VLC_USED; + +/** + * Counts blocks in a FIFO. + * + * Checks how many blocks are queued in a locked FIFO. + * + * @note This function is not cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return the number of blocks in the FIFO (zero if it is empty) + */ +VLC_API size_t vlc_fifo_GetCount(const vlc_fifo_t *) VLC_USED; + +/** + * Counts bytes in a FIFO. + * + * Checks how many bytes are queued in a locked FIFO. + * + * @note This function is not cancellation point. + * + * @warning The FIFO must be locked by the calling thread using + * vlc_fifo_Lock(). Otherwise behaviour is undefined. + * + * @return the total number of bytes + * + * @note Zero bytes does not necessarily mean that the FIFO is empty since + * a block could contain zero bytes. Use vlc_fifo_GetCount() to determine if + * a FIFO is empty. + */ +VLC_API size_t vlc_fifo_GetBytes(const vlc_fifo_t *) VLC_USED; + +VLC_USED static inline bool vlc_fifo_IsEmpty(const vlc_fifo_t *fifo) +{ + return vlc_fifo_GetCount(fifo) == 0; +} + +static inline void vlc_fifo_Cleanup(void *fifo) +{ + vlc_fifo_Unlock((vlc_fifo_t *)fifo); +} +#define vlc_fifo_CleanupPush(fifo) vlc_cleanup_push(vlc_fifo_Cleanup, fifo) + +/** @} */ + +/** @} */ + +#endif /* VLC_BLOCK_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_block_helper.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_block_helper.h new file mode 100644 index 0000000..4071c2b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_block_helper.h @@ -0,0 +1,369 @@ +/***************************************************************************** + * vlc_block_helper.h: Helper functions for data blocks management. + ***************************************************************************** + * Copyright (C) 2003-2017 VLC authors and VideoLAN + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BLOCK_HELPER_H +#define VLC_BLOCK_HELPER_H 1 + +#include + +typedef struct block_bytestream_t +{ + block_t *p_chain; /**< byte stream head block */ + block_t **pp_last; /**< tail ppointer for appends */ + block_t *p_block; /**< byte stream read pointer block */ + size_t i_block_offset; /**< byte stream read pointer offset within block */ + size_t i_base_offset; /**< block base offset (previous blocks total size) */ + size_t i_total; /**< total bytes over all linked blocks */ +} block_bytestream_t; + +/***************************************************************************** + * block_bytestream_t management + *****************************************************************************/ +static inline void block_BytestreamInit( block_bytestream_t *p_bytestream ) +{ + p_bytestream->p_chain = p_bytestream->p_block = NULL; + p_bytestream->pp_last = &p_bytestream->p_chain; + p_bytestream->i_block_offset = 0; + p_bytestream->i_base_offset = 0; + p_bytestream->i_total = 0; +} + +static inline void block_BytestreamRelease( block_bytestream_t *p_bytestream ) +{ + block_ChainRelease( p_bytestream->p_chain ); +} + +/** + * It flush all data (read and unread) from a block_bytestream_t. + */ +static inline void block_BytestreamEmpty( block_bytestream_t *p_bytestream ) +{ + block_BytestreamRelease( p_bytestream ); + block_BytestreamInit( p_bytestream ); +} + +/** + * It flushes all already read data from a block_bytestream_t. + */ +static inline void block_BytestreamFlush( block_bytestream_t *p_bytestream ) +{ + block_t *block = p_bytestream->p_chain; + + while( block != p_bytestream->p_block ) + { + block_t *p_next = block->p_next; + + p_bytestream->i_total -= block->i_buffer; + p_bytestream->i_base_offset -= block->i_buffer; + block_Release( block ); + block = p_next; + } + + while( block != NULL && block->i_buffer == p_bytestream->i_block_offset ) + { + block_t *p_next = block->p_next; + + p_bytestream->i_total -= block->i_buffer; + block_Release( block ); + block = p_next; + p_bytestream->i_block_offset = 0; + } + + p_bytestream->p_chain = p_bytestream->p_block = block; + if( p_bytestream->p_chain == NULL ) + p_bytestream->pp_last = &p_bytestream->p_chain; +} + +static inline void block_BytestreamPush( block_bytestream_t *p_bytestream, + block_t *p_block ) +{ + block_ChainLastAppend( &p_bytestream->pp_last, p_block ); + if( !p_bytestream->p_block ) p_bytestream->p_block = p_block; + for( ; p_block; p_block = p_block->p_next ) + p_bytestream->i_total += p_block->i_buffer; +} + +static inline size_t block_BytestreamRemaining( const block_bytestream_t *p_bytestream ) +{ + return ( p_bytestream->i_total > p_bytestream->i_base_offset + p_bytestream->i_block_offset ) ? + p_bytestream->i_total - p_bytestream->i_base_offset - p_bytestream->i_block_offset : 0; +} + +VLC_USED +static inline block_t *block_BytestreamPop( block_bytestream_t *p_bytestream ) +{ + block_t *p_block; + + block_BytestreamFlush( p_bytestream ); + + p_block = p_bytestream->p_block; + if( unlikely( p_block == NULL ) ) + { + return NULL; + } + else if( !p_block->p_next ) + { + p_block->p_buffer += p_bytestream->i_block_offset; + p_block->i_buffer -= p_bytestream->i_block_offset; + p_bytestream->i_block_offset = 0; + p_bytestream->i_total = 0; + p_bytestream->p_chain = p_bytestream->p_block = NULL; + p_bytestream->pp_last = &p_bytestream->p_chain; + return p_block; + } + + while( p_block->p_next && p_block->p_next->p_next ) + p_block = p_block->p_next; + + block_t *p_block_old = p_block; + p_block = p_block->p_next; + p_block_old->p_next = NULL; + p_bytestream->pp_last = &p_block_old->p_next; + if( p_block ) + p_bytestream->i_total -= p_block->i_buffer; + + return p_block; +} + +static inline int block_WaitBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + if( block_BytestreamRemaining( p_bytestream ) >= i_data ) + return VLC_SUCCESS; + return VLC_EGENERIC; +} + +static inline int block_PeekBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + if( block_BytestreamRemaining( p_bytestream ) < i_data ) + return VLC_EGENERIC; + + /* Copy the data */ + size_t i_offset = p_bytestream->i_block_offset; + size_t i_size = i_data; + for( block_t *p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + size_t i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +static inline int block_GetBytes( block_bytestream_t *p_bytestream, + uint8_t *p_data, size_t i_data ) +{ + if( block_BytestreamRemaining( p_bytestream ) < i_data ) + return VLC_EGENERIC; + + /* Copy the data */ + size_t i_offset = p_bytestream->i_block_offset; + size_t i_size = i_data; + size_t i_copy = 0; + block_t *p_block; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy && p_data != NULL ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + if( i_size == 0 ) + break; + + p_bytestream->i_base_offset += p_block->i_buffer; + i_offset = 0; + } + + p_bytestream->p_block = p_block; + p_bytestream->i_block_offset = i_offset + i_copy; + + return VLC_SUCCESS; +} + +static inline int block_SkipBytes( block_bytestream_t *p_bytestream, + size_t i_data ) +{ + return block_GetBytes( p_bytestream, NULL, i_data ); +} + +static inline int block_SkipByte( block_bytestream_t *p_bytestream ) +{ + return block_GetBytes( p_bytestream, NULL, 1 ); +} + +static inline int block_PeekOffsetBytes( block_bytestream_t *p_bytestream, + size_t i_peek_offset, uint8_t *p_data, size_t i_data ) +{ + const size_t i_remain = block_BytestreamRemaining( p_bytestream ); + if( i_remain < i_data + i_peek_offset ) + return VLC_EGENERIC; + + /* Find the right place */ + size_t i_offset = p_bytestream->i_block_offset; + size_t i_size = i_peek_offset; + size_t i_copy = 0; + block_t *p_block; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( !i_size ) break; + + i_offset = 0; + } + + /* Copy the data */ + i_offset += i_copy; + i_size = i_data; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + i_copy = __MIN( i_size, p_block->i_buffer - i_offset ); + i_size -= i_copy; + + if( i_copy ) + { + memcpy( p_data, p_block->p_buffer + i_offset, i_copy ); + p_data += i_copy; + } + + i_offset = 0; + + if( !i_size ) break; + } + + return VLC_SUCCESS; +} + +typedef const uint8_t * (*block_startcode_helper_t)( const uint8_t *, const uint8_t * ); +typedef bool (*block_startcode_matcher_t)( uint8_t, size_t, const uint8_t * ); + +static inline int block_FindStartcodeFromOffset( + block_bytestream_t *p_bytestream, size_t *pi_offset, + const uint8_t *p_startcode, int i_startcode_length, + block_startcode_helper_t p_startcode_helper, + block_startcode_matcher_t p_startcode_matcher ) +{ + block_t *p_block, *p_block_backup = 0; + ssize_t i_size = 0; + size_t i_offset, i_offset_backup = 0; + int i_caller_offset_backup = 0, i_match; + + /* Find the right place */ + i_size = *pi_offset + p_bytestream->i_block_offset; + for( p_block = p_bytestream->p_block; + p_block != NULL; p_block = p_block->p_next ) + { + i_size -= p_block->i_buffer; + if( i_size < 0 ) break; + } + + if( unlikely( i_size >= 0 ) ) + { + /* Not enough data, bail out */ + return VLC_EGENERIC; + } + + /* Begin the search. + * We first look for an occurrence of the 1st startcode byte and + * if found, we do a more thorough check. */ + i_size += p_block->i_buffer; + *pi_offset -= i_size; + i_match = 0; + for( ; p_block != NULL; p_block = p_block->p_next ) + { + for( i_offset = i_size; i_offset < p_block->i_buffer; i_offset++ ) + { + /* Use optimized helper when possible */ + if( p_startcode_helper && !i_match && + (p_block->i_buffer - i_offset) > ((size_t)i_startcode_length - 1) ) + { + const uint8_t *p_res = p_startcode_helper( &p_block->p_buffer[i_offset], + &p_block->p_buffer[p_block->i_buffer] ); + if( p_res ) + { + *pi_offset += i_offset + (p_res - &p_block->p_buffer[i_offset]); + return VLC_SUCCESS; + } + /* Then parsing boundary with legacy code */ + i_offset = p_block->i_buffer - (i_startcode_length - 1); + } + + bool b_matched = ( p_startcode_matcher ) + ? p_startcode_matcher( p_block->p_buffer[i_offset], i_match, p_startcode ) + : p_block->p_buffer[i_offset] == p_startcode[i_match]; + if( b_matched ) + { + if( i_match == 0 ) + { + p_block_backup = p_block; + i_offset_backup = i_offset; + i_caller_offset_backup = *pi_offset; + } + + if( i_match + 1 == i_startcode_length ) + { + /* We have it */ + *pi_offset += i_offset - i_match; + return VLC_SUCCESS; + } + + i_match++; + } + else if ( i_match > 0 ) + { + /* False positive */ + p_block = p_block_backup; + i_offset = i_offset_backup; + *pi_offset = i_caller_offset_backup; + i_match = 0; + } + + } + i_size = 0; + *pi_offset += i_offset; + } + + *pi_offset -= i_match; + return VLC_EGENERIC; +} + +#endif /* VLC_BLOCK_HELPER_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_boxes.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_boxes.h new file mode 100644 index 0000000..aa02ffa --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_boxes.h @@ -0,0 +1,165 @@ +/***************************************************************************** + * vlc_boxes.h : Boxes/Atoms handling helpers + ***************************************************************************** + * Copyright (C) 2001, 2002, 2003, 2006, 2015 VLC authors and VideoLAN + * + * Authors: Laurent Aimar + * Gildas Bazin + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#ifndef VLC_BOXES_H +#define VLC_BOXES_H + +#include +#include + +/** + * \file + * This file defines functions, structures for handling boxes/atoms in vlc + */ + +typedef struct bo_t +{ + block_t *b; + size_t basesize; +} bo_t; + +static inline bool bo_init(bo_t *p_bo, int i_size) +{ + p_bo->b = block_Alloc(i_size); + if (p_bo->b == NULL) + return false; + + p_bo->b->i_buffer = 0; + p_bo->basesize = i_size; + + return true; +} + +static inline void bo_deinit(bo_t *p_bo) +{ + if(p_bo->b) + block_Release(p_bo->b); +} + +static inline void bo_free(bo_t *p_bo) +{ + if(!p_bo) + return; + bo_deinit(p_bo); + free(p_bo); +} + +static inline int bo_extend(bo_t *p_bo, size_t i_total) +{ + if(!p_bo->b) + return false; + const size_t i_size = p_bo->b->i_size - (p_bo->b->p_buffer - p_bo->b->p_start); + if (i_total >= i_size) + { + int i_growth = p_bo->basesize; + while(i_total >= i_size + i_growth) + i_growth += p_bo->basesize; + + int i = p_bo->b->i_buffer; /* Realloc would set payload size == buffer size */ + p_bo->b = block_Realloc(p_bo->b, 0, i_size + i_growth); + if (!p_bo->b) + return false; + p_bo->b->i_buffer = i; + } + return true; +} + +#define BO_SET_DECL_S(func, handler, type) static inline bool func(bo_t *p_bo, size_t i_offset, type val)\ + {\ + if (!bo_extend(p_bo, i_offset + sizeof(type)))\ + return false;\ + handler(&p_bo->b->p_buffer[i_offset], val);\ + return true;\ + } + +#define BO_ADD_DECL_S(func, handler, type) static inline bool func(bo_t *p_bo, type val)\ + {\ + if(!p_bo->b || !handler(p_bo, p_bo->b->i_buffer, val))\ + return false;\ + p_bo->b->i_buffer += sizeof(type);\ + return true;\ + } + +#define BO_FUNC_DECL(suffix, handler, type ) \ + BO_SET_DECL_S( bo_set_ ## suffix ## be, handler ## BE, type )\ + BO_SET_DECL_S( bo_set_ ## suffix ## le, handler ## LE, type )\ + BO_ADD_DECL_S( bo_add_ ## suffix ## be, bo_set_ ## suffix ## be, type )\ + BO_ADD_DECL_S( bo_add_ ## suffix ## le, bo_set_ ## suffix ## le, type ) + +static inline bool bo_set_8(bo_t *p_bo, size_t i_offset, uint8_t i) +{ + if (!bo_extend(p_bo, i_offset + 1)) + return false; + p_bo->b->p_buffer[i_offset] = i; + return true; +} + +static inline bool bo_add_8(bo_t *p_bo, uint8_t i) +{ + if(!p_bo->b || !bo_set_8( p_bo, p_bo->b->i_buffer, i )) + return false; + p_bo->b->i_buffer++; + return true; +} + +/* declares all bo_[set,add]_[16,32,64] */ +BO_FUNC_DECL( 16, SetW, uint16_t ) +BO_FUNC_DECL( 32, SetDW, uint32_t ) +BO_FUNC_DECL( 64, SetQW, uint64_t ) + +#undef BO_FUNC_DECL +#undef BO_SET_DECL_S +#undef BO_ADD_DECL_S + +static inline bool bo_add_24be(bo_t *p_bo, uint32_t i) +{ + if(!p_bo->b || !bo_extend(p_bo, p_bo->b->i_buffer + 3)) + return false; + p_bo->b->p_buffer[p_bo->b->i_buffer++] = ((i >> 16) & 0xff); + p_bo->b->p_buffer[p_bo->b->i_buffer++] = ((i >> 8) & 0xff); + p_bo->b->p_buffer[p_bo->b->i_buffer++] = (i & 0xff); + return true; +} + +static inline void bo_swap_32be (bo_t *p_bo, size_t i_pos, uint32_t i) +{ + if (!p_bo->b || p_bo->b->i_buffer < i_pos + 4) + return; + p_bo->b->p_buffer[i_pos ] = (i >> 24)&0xff; + p_bo->b->p_buffer[i_pos + 1] = (i >> 16)&0xff; + p_bo->b->p_buffer[i_pos + 2] = (i >> 8)&0xff; + p_bo->b->p_buffer[i_pos + 3] = (i )&0xff; +} + +static inline bool bo_add_mem(bo_t *p_bo, size_t i_size, const void *p_mem) +{ + if(!p_bo->b || !bo_extend(p_bo, p_bo->b->i_buffer + i_size)) + return false; + memcpy(&p_bo->b->p_buffer[p_bo->b->i_buffer], p_mem, i_size); + p_bo->b->i_buffer += i_size; + return true; +} + +#define bo_add_fourcc(p_bo, fcc) bo_add_mem(p_bo, 4, fcc) + +#endif // VLC_BOXES_H diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_charset.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_charset.h new file mode 100644 index 0000000..076e056 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_charset.h @@ -0,0 +1,291 @@ +/***************************************************************************** + * vlc_charset.h: Unicode UTF-8 wrappers function + ***************************************************************************** + * Copyright (C) 2003-2005 VLC authors and VideoLAN + * Copyright © 2005-2010 Rémi Denis-Courmont + * $Id: 05092257a4a1f09451dc1e956d07b02093908dd4 $ + * + * Author: Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CHARSET_H +#define VLC_CHARSET_H 1 + +/** + * \file + * Characters sets handling + * + * \ingroup strings + * @{ + */ + +/** + * Decodes a code point from UTF-8. + * + * Converts the first character in a UTF-8 sequence into a Unicode code point. + * + * \param str an UTF-8 bytes sequence [IN] + * \param pwc address of a location to store the code point [OUT] + * + * \return the number of bytes occupied by the decoded code point + * + * \retval (size_t)-1 not a valid UTF-8 sequence + * \retval 0 null character (i.e. str points to an empty string) + * \retval 1 (non-null) ASCII character + * \retval 2-4 non-ASCII character + */ +VLC_API size_t vlc_towc(const char *str, uint32_t *pwc); + +/** + * Checks UTF-8 validity. + * + * Checks whether a null-terminated string is a valid UTF-8 bytes sequence. + * + * \param str string to check + * + * \retval str the string is a valid null-terminated UTF-8 sequence + * \retval NULL the string is not an UTF-8 sequence + */ +VLC_USED static inline const char *IsUTF8(const char *str) +{ + size_t n; + uint32_t cp; + + while ((n = vlc_towc(str, &cp)) != 0) + if (likely(n != (size_t)-1)) + str += n; + else + return NULL; + return str; +} + +/** + * Removes non-UTF-8 sequences. + * + * Replaces invalid or over-long UTF-8 bytes sequences within a + * null-terminated string with question marks. This is so that the string can + * be printed at least partially. + * + * \warning Do not use this were correctness is critical. use IsUTF8() and + * handle the error case instead. This function is mainly for display or debug. + * + * \note Converting from Latin-1 to UTF-8 in place is not possible (the string + * size would be increased). So it is not attempted even if it would otherwise + * be less disruptive. + * + * \retval str the string is a valid null-terminated UTF-8 sequence + * (i.e. no changes were made) + * \retval NULL the string is not an UTF-8 sequence + */ +static inline char *EnsureUTF8(char *str) +{ + char *ret = str; + size_t n; + uint32_t cp; + + while ((n = vlc_towc(str, &cp)) != 0) + if (likely(n != (size_t)-1)) + str += n; + else + { + *str++ = '?'; + ret = NULL; + } + return ret; +} + +/* iconv wrappers (defined in src/extras/libc.c) */ +#define VLC_ICONV_ERR ((size_t) -1) +typedef void *vlc_iconv_t; +VLC_API vlc_iconv_t vlc_iconv_open( const char *, const char * ) VLC_USED; +VLC_API size_t vlc_iconv( vlc_iconv_t, const char **, size_t *, char **, size_t * ) VLC_USED; +VLC_API int vlc_iconv_close( vlc_iconv_t ); + +#include + +VLC_API int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap ); +VLC_API int utf8_fprintf( FILE *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API char * vlc_strcasestr(const char *, const char *) VLC_USED; + +VLC_API char * FromCharset( const char *charset, const void *data, size_t data_size ) VLC_USED; +VLC_API void * ToCharset( const char *charset, const char *in, size_t *outsize ) VLC_USED; + +#ifdef _WIN32 +VLC_USED +static inline char *FromWide (const wchar_t *wide) +{ + size_t len = WideCharToMultiByte (CP_UTF8, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) + return NULL; + + char *out = (char *)malloc (len); + + if (likely(out)) + WideCharToMultiByte (CP_UTF8, 0, wide, -1, out, len, NULL, NULL); + return out; +} + +VLC_USED +static inline wchar_t *ToWide (const char *utf8) +{ + int len = MultiByteToWideChar (CP_UTF8, 0, utf8, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *out = (wchar_t *)malloc (len * sizeof (wchar_t)); + + if (likely(out)) + MultiByteToWideChar (CP_UTF8, 0, utf8, -1, out, len); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *ToCodePage (unsigned cp, const char *utf8) +{ + wchar_t *wide = ToWide (utf8); + if (wide == NULL) + return NULL; + + size_t len = WideCharToMultiByte (cp, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) { + free(wide); + return NULL; + } + + char *out = (char *)malloc (len); + if (likely(out != NULL)) + WideCharToMultiByte (cp, 0, wide, -1, out, len, NULL, NULL); + free (wide); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *FromCodePage (unsigned cp, const char *mb) +{ + int len = MultiByteToWideChar (cp, 0, mb, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *wide = (wchar_t *)malloc (len * sizeof (wchar_t)); + if (unlikely(wide == NULL)) + return NULL; + MultiByteToWideChar (cp, 0, mb, -1, wide, len); + + char *utf8 = FromWide (wide); + free (wide); + return utf8; +} + +VLC_USED VLC_MALLOC +static inline char *FromANSI (const char *ansi) +{ + return FromCodePage (GetACP (), ansi); +} + +VLC_USED VLC_MALLOC +static inline char *ToANSI (const char *utf8) +{ + return ToCodePage (GetACP (), utf8); +} + +# ifdef UNICODE +# define FromT FromWide +# define ToT ToWide +# else +# define FromT FromANSI +# define ToT ToANSI +# endif +# define FromLocale FromANSI +# define ToLocale ToANSI +# define LocaleFree(s) free((char *)(s)) +# define FromLocaleDup FromANSI +# define ToLocaleDup ToANSI + +#elif defined(__OS2__) + +VLC_USED static inline char *FromLocale (const char *locale) +{ + return locale ? FromCharset ((char *)"", locale, strlen(locale)) : NULL; +} + +VLC_USED static inline char *ToLocale (const char *utf8) +{ + size_t outsize; + return utf8 ? (char *)ToCharset ("", utf8, &outsize) : NULL; +} + +VLC_USED static inline void LocaleFree (const char *str) +{ + free ((char *)str); +} + +VLC_USED static inline char *FromLocaleDup (const char *locale) +{ + return FromCharset ("", locale, strlen(locale)); +} + +VLC_USED static inline char *ToLocaleDup (const char *utf8) +{ + size_t outsize; + return (char *)ToCharset ("", utf8, &outsize); +} + +#else + +# define FromLocale(l) (l) +# define ToLocale(u) (u) +# define LocaleFree(s) ((void)(s)) +# define FromLocaleDup strdup +# define ToLocaleDup strdup +#endif + +/** + * Converts a nul-terminated string from ISO-8859-1 to UTF-8. + */ +static inline char *FromLatin1 (const char *latin) +{ + char *str = (char *)malloc (2 * strlen (latin) + 1), *utf8 = str; + unsigned char c; + + if (str == NULL) + return NULL; + + while ((c = *(latin++)) != '\0') + { + if (c >= 0x80) + { + *(utf8++) = 0xC0 | (c >> 6); + *(utf8++) = 0x80 | (c & 0x3F); + } + else + *(utf8++) = c; + } + *(utf8++) = '\0'; + + utf8 = (char *)realloc (str, utf8 - str); + return utf8 ? utf8 : str; +} + +/** @} */ + +VLC_API double us_strtod( const char *, char ** ) VLC_USED; +VLC_API float us_strtof( const char *, char ** ) VLC_USED; +VLC_API double us_atof( const char * ) VLC_USED; +VLC_API int us_vasprintf( char **, const char *, va_list ); +VLC_API int us_asprintf( char **, const char *, ... ) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_codec.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_codec.h new file mode 100644 index 0000000..6c77776 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_codec.h @@ -0,0 +1,422 @@ +/***************************************************************************** + * vlc_codec.h: Definition of the decoder and encoder structures + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * $Id: 3499ede27c1dbb94ff665a51d000c55bd45f2794 $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CODEC_H +#define VLC_CODEC_H 1 + +#include + +#include +#include +#include +#include + +/** + * \defgroup codec Codec + * Decoders and encoders + * @{ + * \file + * Decoder and encoder modules interface + * + * \defgroup decoder Decoder + * Audio, video and text decoders + * @{ + */ + +typedef struct decoder_owner_sys_t decoder_owner_sys_t; + +typedef struct decoder_cc_desc_t decoder_cc_desc_t; + +/* + * BIG FAT WARNING : the code relies in the first 4 members of filter_t + * and decoder_t to be the same, so if you have anything to add, do it + * at the end of the structure. + */ +struct decoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + decoder_sys_t * p_sys; + + /* Input format ie from demuxer (XXX: a lot of field could be invalid) */ + es_format_t fmt_in; + + /* Output format of decoder/packetizer */ + es_format_t fmt_out; + + /* Tell the decoder if it is allowed to drop frames */ + bool b_frame_drop_allowed; + +# define VLCDEC_SUCCESS VLC_SUCCESS +# define VLCDEC_ECRITICAL VLC_EGENERIC +# define VLCDEC_RELOAD (-100) + /* This function is called to decode one packetized block. + * + * The module implementation will own the input block (p_block) and should + * process and release it. Depending of the decoder type, the module should + * send output frames/blocks via decoder_QueueVideo(), decoder_QueueAudio() + * or decoder_QueueSub(). + * + * If p_block is NULL, the decoder asks the module to drain itself. The + * module should return all available output frames/block via the queue + * functions. + * + * Return values can be: + * VLCDEC_SUCCESS: pf_decode will be called again + * VLCDEC_ECRITICAL: in case of critical error, pf_decode won't be called + * again. + * VLCDEC_RELOAD: Request that the decoder should be reloaded. The current + * module will be unloaded. Reloading a module may cause a loss of frames. + * When returning this status, the implementation shouldn't release or + * modify the p_block in argument (The same p_block will be feed to the + * next decoder module). + */ + int ( * pf_decode ) ( decoder_t *, block_t *p_block ); + + /* This function is called in a loop with the same pp_block argument until + * it returns NULL. This allows a module implementation to return more than + * one output blocks for one input block. + * + * pp_block or *pp_block can be NULL. + * + * If pp_block and *pp_block are not NULL, the module implementation will + * own the input block (*pp_block) and should process and release it. The + * module can also process a part of the block. In that case, it should + * modify (*pp_block)->p_buffer/i_buffer accordingly and return a valid + * output block. The module can also set *pp_block to NULL when the input + * block is consumed. + * + * If pp_block is not NULL but *pp_block is NULL, a previous call of the pf + * function has set the *pp_block to NULL. Here, the module can return new + * output block for the same, already processed, input block (the + * pf_packetize function will be called as long as the module return an + * output block). + * + * When the pf function returns NULL, the next call to this function will + * have a new a valid pp_block (if the packetizer is not drained). + * + * If pp_block is NULL, the packetizer asks the module to drain itself. In + * that case, the module has to return all output frames available (the + * pf_packetize function will be called as long as the module return an + * output block). + */ + block_t * ( * pf_packetize )( decoder_t *, block_t **pp_block ); + /* */ + void ( * pf_flush ) ( decoder_t * ); + + /* Closed Caption (CEA 608/708) extraction. + * If set, it *may* be called after pf_packetize returned data. It should + * return CC for the pictures returned by the last pf_packetize call only, + * channel bitmaps will be used to known which cc channel are present (but + * globaly, not necessary for the current packet. Video decoders should use + * the decoder_QueueCc() function to pass closed captions. */ + block_t * ( * pf_get_cc ) ( decoder_t *, decoder_cc_desc_t * ); + + /* Meta data at codec level + * The decoder owner set it back to NULL once it has retreived what it needs. + * The decoder owner is responsible of its release except when you overwrite it. + */ + vlc_meta_t *p_description; + + /* + * Owner fields + * XXX You MUST not use them directly. + */ + + /* Video output callbacks + * XXX use decoder_NewPicture */ + int (*pf_vout_format_update)( decoder_t * ); + picture_t *(*pf_vout_buffer_new)( decoder_t * ); + + /** + * Number of extra (ie in addition to the DPB) picture buffers + * needed for decoding. + */ + int i_extra_picture_buffers; + + /* Audio output callbacks */ + int (*pf_aout_format_update)( decoder_t * ); + + /* SPU output callbacks + * XXX use decoder_NewSubpicture */ + subpicture_t *(*pf_spu_buffer_new)( decoder_t *, const subpicture_updater_t * ); + + /* Input attachments + * XXX use decoder_GetInputAttachments */ + int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment ); + + /* Display date + * XXX use decoder_GetDisplayDate */ + mtime_t (*pf_get_display_date)( decoder_t *, mtime_t ); + + /* Display rate + * XXX use decoder_GetDisplayRate */ + int (*pf_get_display_rate)( decoder_t * ); + + /* XXX use decoder_QueueVideo or decoder_QueueVideoWithCc */ + int (*pf_queue_video)( decoder_t *, picture_t * ); + /* XXX use decoder_QueueAudio */ + int (*pf_queue_audio)( decoder_t *, block_t * ); + /* XXX use decoder_QueueCC */ + int (*pf_queue_cc)( decoder_t *, block_t *, const decoder_cc_desc_t * ); + /* XXX use decoder_QueueSub */ + int (*pf_queue_sub)( decoder_t *, subpicture_t *); + void *p_queue_ctx; + + /* Private structure for the owner of the decoder */ + decoder_owner_sys_t *p_owner; +}; + +/* struct for packetizer get_cc polling/decoder queue_cc + * until we have a proper metadata way */ +struct decoder_cc_desc_t +{ + uint8_t i_608_channels; /* 608 channels bitmap */ + uint64_t i_708_channels; /* 708 */ + int i_reorder_depth; /* reorder depth, -1 for no reorder, 0 for old P/B flag based */ +}; + +/** + * @} + */ + +/** + * \defgroup encoder Encoder + * Audio, video and text encoders + * @{ + */ + +struct encoder_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + encoder_sys_t * p_sys; + + /* Properties of the input data fed to the encoder */ + es_format_t fmt_in; + + /* Properties of the output of the encoder */ + es_format_t fmt_out; + + block_t * ( * pf_encode_video )( encoder_t *, picture_t * ); + block_t * ( * pf_encode_audio )( encoder_t *, block_t * ); + block_t * ( * pf_encode_sub )( encoder_t *, subpicture_t * ); + + /* Common encoder options */ + int i_threads; /* Number of threads to use during encoding */ + int i_iframes; /* One I frame per i_iframes */ + int i_bframes; /* One B frame per i_bframes */ + int i_tolerance; /* Bitrate tolerance */ + + /* Encoder config */ + config_chain_t *p_cfg; +}; + +/** + * @} + * + * \ingroup decoder + * @{ + */ + +/** + * Updates the video output format. + * + * This function notifies the video output pipeline of a new video output + * format (fmt_out.video). If there was no video output from the decoder so far + * or if the video output format has changed, a new video output will be set + * up. decoder_NewPicture() can then be used to allocate picture buffers. + * + * If the format is unchanged, this function has no effects and returns zero. + * + * \note + * This function is not reentrant. + * + * @return 0 if the video output was set up successfully, -1 otherwise. + */ +VLC_USED +static inline int decoder_UpdateVideoFormat( decoder_t *dec ) +{ + assert( dec->fmt_in.i_cat == VIDEO_ES ); + if( dec->fmt_in.i_cat == VIDEO_ES && dec->pf_vout_format_update != NULL ) + return dec->pf_vout_format_update( dec ); + else + return -1; +} + +/** + * Allocates an output picture buffer. + * + * This function pulls an output picture buffer for the decoder from the + * buffer pool of the video output. The picture must be released with + * picture_Release() when it is no longer referenced by the decoder. + * + * \note + * This function is reentrant. However, decoder_UpdateVideoFormat() cannot be + * used concurrently; the caller is responsible for serialization. + * + * \warning + * The behaviour is undefined if decoder_UpdateVideoFormat() was not called or + * if the last call returned an error. + * + * \return a picture buffer on success, NULL on error + */ +VLC_USED +static inline picture_t *decoder_NewPicture( decoder_t *dec ) +{ + return dec->pf_vout_buffer_new( dec ); +} + +/** + * Abort any calls of decoder_NewPicture + * + * If b_abort is true, all pending and futures calls of decoder_NewPicture + * will be aborted. This function can be used by asynchronous video decoders + * to unblock a thread that is waiting for a picture. + */ +VLC_API void decoder_AbortPictures( decoder_t *dec, bool b_abort ); + +/** + * This function queues a single picture to the video output. + * + * \note + * The caller doesn't own the picture anymore after this call (even in case of + * error). + * FIXME: input_DecoderFrameNext won't work if a module use this function. + * + * \return 0 if the picture is queued, -1 on error + */ +static inline int decoder_QueueVideo( decoder_t *dec, picture_t *p_pic ) +{ + assert( p_pic->p_next == NULL ); + assert( dec->pf_queue_video != NULL ); + return dec->pf_queue_video( dec, p_pic ); +} + +/** + * This function queues the Closed Captions + * + * \param dec the decoder object + * \param p_cc the closed-caption to queue + * \param p_desc decoder_cc_desc_t description structure + * \return 0 if queued, -1 on error + */ +static inline int decoder_QueueCc( decoder_t *dec, block_t *p_cc, + const decoder_cc_desc_t *p_desc ) +{ + if( dec->pf_queue_cc == NULL ) + { + block_Release( p_cc ); + return -1; + } + return dec->pf_queue_cc( dec, p_cc, p_desc ); +} + +/** + * This function queues a single audio block to the audio output. + * + * \note + * The caller doesn't own the audio block anymore after this call (even in case + * of error). + * + * \return 0 if the block is queued, -1 on error + */ +static inline int decoder_QueueAudio( decoder_t *dec, block_t *p_aout_buf ) +{ + assert( p_aout_buf->p_next == NULL ); + assert( dec->pf_queue_audio != NULL ); + return dec->pf_queue_audio( dec, p_aout_buf ); +} + +/** + * This function queues a single subtitle to the video output. + * + * \note + * The caller doesn't own the subtitle anymore after this call (even in case of + * error). + * + * \return 0 if the subtitle is queued, -1 on error + */ +static inline int decoder_QueueSub( decoder_t *dec, subpicture_t *p_spu ) +{ + assert( p_spu->p_next == NULL ); + assert( dec->pf_queue_sub != NULL ); + return dec->pf_queue_sub( dec, p_spu ); +} + +/** + * This function notifies the audio output pipeline of a new audio output + * format (fmt_out.audio). If there is currently no audio output or if the + * audio output format has changed, a new audio output will be set up. + * @return 0 if the audio output is working, -1 if not. */ +VLC_USED +static inline int decoder_UpdateAudioFormat( decoder_t *dec ) +{ + assert(dec->fmt_in.i_cat == AUDIO_ES); + if( dec->fmt_in.i_cat == AUDIO_ES && dec->pf_aout_format_update != NULL ) + return dec->pf_aout_format_update( dec ); + else + return -1; +} + +/** + * This function will return a new audio buffer usable by a decoder as an + * output buffer. It must be released with block_Release() or returned it to + * the caller as a decoder_QueueAudio parameter. + */ +VLC_API block_t * decoder_NewAudioBuffer( decoder_t *, int i_nb_samples ) VLC_USED; + +/** + * This function will return a new subpicture usable by a decoder as an output + * buffer. You have to release it using subpicture_Delete() or by returning + * it to the caller as a decoder_QueueSub parameter. + */ +VLC_API subpicture_t * decoder_NewSubpicture( decoder_t *, const subpicture_updater_t * ) VLC_USED; + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +VLC_API int decoder_GetInputAttachments( decoder_t *, input_attachment_t ***ppp_attachment, int *pi_attachment ); + +/** + * This function converts a decoder timestamp into a display date comparable + * to mdate(). + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API mtime_t decoder_GetDisplayDate( decoder_t *, mtime_t ) VLC_USED; + +/** + * This function returns the current input rate. + * You MUST use it *only* for gathering statistics about speed. + */ +VLC_API int decoder_GetDisplayRate( decoder_t * ) VLC_USED; + +/** @} */ +/** @} */ +#endif /* _VLC_CODEC_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_common.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_common.h new file mode 100644 index 0000000..12a36ec --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_common.h @@ -0,0 +1,1049 @@ +/***************************************************************************** + * vlc_common.h: common definitions + * Collection of useful common types and macros definitions + ***************************************************************************** + * Copyright (C) 1998-2011 VLC authors and VideoLAN + * + * Authors: Samuel Hocevar + * Vincent Seguin + * Gildas Bazin + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file is a collection of common definitions and types + */ + +#ifndef VLC_COMMON_H +# define VLC_COMMON_H 1 + +/***************************************************************************** + * Required vlc headers + *****************************************************************************/ +#include "vlc_config.h" + +/***************************************************************************** + * Required system headers + *****************************************************************************/ +#include +#include + +#include +#include +#include +#include + +#ifndef __cplusplus +# include +#endif + +/***************************************************************************** + * Compilers definitions + *****************************************************************************/ +/* Helper for GCC version checks */ +#ifdef __GNUC__ +# define VLC_GCC_VERSION(maj,min) \ + ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min))) +#else +# define VLC_GCC_VERSION(maj,min) (0) +#endif + +/* Try to fix format strings for all versions of mingw and mingw64 */ +#if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO ) + #undef PRId64 + #define PRId64 "lld" + #undef PRIi64 + #define PRIi64 "lli" + #undef PRIu64 + #define PRIu64 "llu" + #undef PRIo64 + #define PRIo64 "llo" + #undef PRIx64 + #define PRIx64 "llx" + #define snprintf __mingw_snprintf + #define vsnprintf __mingw_vsnprintf + #define swprintf _snwprintf +#endif + +/* Function attributes for compiler warnings */ +#ifdef __GNUC__ +# define VLC_DEPRECATED __attribute__((deprecated)) +# if VLC_GCC_VERSION(6,0) +# define VLC_DEPRECATED_ENUM __attribute__((deprecated)) +# else +# define VLC_DEPRECATED_ENUM +# endif + +# if defined( _WIN32 ) +# define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y))) +# else +# define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y))) +# endif +# define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x))) +# define VLC_MALLOC __attribute__ ((malloc)) +# define VLC_USED __attribute__ ((warn_unused_result)) + +#else +# define VLC_DEPRECATED +# define VLC_DEPRECATED_ENUM +# define VLC_FORMAT(x,y) +# define VLC_FORMAT_ARG(x) +# define VLC_MALLOC +# define VLC_USED +#endif + + +/* Branch prediction */ +#ifdef __GNUC__ +# define likely(p) __builtin_expect(!!(p), 1) +# define unlikely(p) __builtin_expect(!!(p), 0) +# define unreachable() __builtin_unreachable() +#else +# define likely(p) (!!(p)) +# define unlikely(p) (!!(p)) +# define unreachable() ((void)0) +#endif + +#define vlc_assert_unreachable() (assert(!"unreachable"), unreachable()) + +/* Linkage */ +#ifdef __cplusplus +# define VLC_EXTERN extern "C" +#else +# define VLC_EXTERN +#endif + +#if defined (_WIN32) && defined (DLL_EXPORT) +# define VLC_EXPORT __declspec(dllexport) +#elif defined (__GNUC__) +# define VLC_EXPORT __attribute__((visibility("default"))) +#else +# define VLC_EXPORT +#endif + +#define VLC_API VLC_EXTERN VLC_EXPORT + + +/***************************************************************************** + * Basic types definitions + *****************************************************************************/ +/** + * High precision date or time interval + * + * Store a high precision date or time interval. The maximum precision is the + * microsecond, and a 64 bits integer is used to avoid overflows (maximum + * time interval is then 292271 years, which should be long enough for any + * video). Dates are stored as microseconds since a common date (usually the + * epoch). Note that date and time intervals can be manipulated using regular + * arithmetic operators, and that no special functions are required. + */ +typedef int64_t mtime_t; + +/** + * The vlc_fourcc_t type. + * + * See http://www.webartz.com/fourcc/ for a very detailed list. + */ +typedef uint32_t vlc_fourcc_t; + +#ifdef WORDS_BIGENDIAN +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \ + | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) ) + +#else +# define VLC_FOURCC( a, b, c, d ) \ + ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \ + | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) ) +# define VLC_TWOCC( a, b ) \ + ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) ) + +#endif + +/** + * Translate a vlc_fourcc into its string representation. This function + * assumes there is enough room in psz_fourcc to store 4 characters in. + * + * \param fcc a vlc_fourcc_t + * \param psz_fourcc string to store string representation of vlc_fourcc in + */ +static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc ) +{ + memcpy( psz_fourcc, &fcc, 4 ); +} + +/***************************************************************************** + * Classes declaration + *****************************************************************************/ + +/* Internal types */ +typedef struct vlc_list_t vlc_list_t; +typedef struct vlc_object_t vlc_object_t; +typedef struct libvlc_int_t libvlc_int_t; +typedef struct date_t date_t; + +/* Playlist */ + +typedef struct playlist_t playlist_t; +typedef struct playlist_item_t playlist_item_t; +typedef struct services_discovery_t services_discovery_t; +typedef struct services_discovery_sys_t services_discovery_sys_t; +typedef struct vlc_renderer_discovery_t vlc_renderer_discovery_t; +typedef struct vlc_renderer_item_t vlc_renderer_item_t; + +/* Modules */ +typedef struct module_t module_t; +typedef struct module_config_t module_config_t; + +typedef struct config_category_t config_category_t; + +/* Input */ +typedef struct input_thread_t input_thread_t; +typedef struct input_item_t input_item_t; +typedef struct input_item_node_t input_item_node_t; +typedef struct access_sys_t access_sys_t; +typedef struct stream_t stream_t; +typedef struct stream_sys_t stream_sys_t; +typedef struct demux_t demux_t; +typedef struct demux_sys_t demux_sys_t; +typedef struct es_out_t es_out_t; +typedef struct es_out_id_t es_out_id_t; +typedef struct es_out_sys_t es_out_sys_t; +typedef struct seekpoint_t seekpoint_t; +typedef struct info_t info_t; +typedef struct info_category_t info_category_t; +typedef struct input_attachment_t input_attachment_t; + +/* Format */ +typedef struct audio_format_t audio_format_t; +typedef struct video_format_t video_format_t; +typedef struct subs_format_t subs_format_t; +typedef struct es_format_t es_format_t; +typedef struct video_palette_t video_palette_t; + +/* Audio */ +typedef struct audio_output audio_output_t; +typedef struct aout_sys_t aout_sys_t; +typedef audio_format_t audio_sample_format_t; + +/* Video */ +typedef struct vout_thread_t vout_thread_t; +typedef struct vlc_viewpoint_t vlc_viewpoint_t; + +typedef video_format_t video_frame_format_t; +typedef struct picture_t picture_t; +typedef struct picture_sys_t picture_sys_t; + +/* Subpictures */ +typedef struct spu_t spu_t; +typedef struct subpicture_t subpicture_t; +typedef struct subpicture_region_t subpicture_region_t; + +typedef struct image_handler_t image_handler_t; + +/* Stream output */ +typedef struct sout_instance_t sout_instance_t; + +typedef struct sout_input_t sout_input_t; +typedef struct sout_packetizer_input_t sout_packetizer_input_t; + +typedef struct sout_access_out_t sout_access_out_t; +typedef struct sout_access_out_sys_t sout_access_out_sys_t; + +typedef struct sout_mux_t sout_mux_t; +typedef struct sout_mux_sys_t sout_mux_sys_t; + +typedef struct sout_stream_t sout_stream_t; +typedef struct sout_stream_sys_t sout_stream_sys_t; + +typedef struct config_chain_t config_chain_t; +typedef struct session_descriptor_t session_descriptor_t; + +/* Decoders */ +typedef struct decoder_t decoder_t; +typedef struct decoder_sys_t decoder_sys_t; +typedef struct decoder_synchro_t decoder_synchro_t; + +/* Encoders */ +typedef struct encoder_t encoder_t; +typedef struct encoder_sys_t encoder_sys_t; + +/* Filters */ +typedef struct filter_t filter_t; +typedef struct filter_sys_t filter_sys_t; + +/* Network */ +typedef struct vlc_url_t vlc_url_t; + +/* Misc */ +typedef struct iso639_lang_t iso639_lang_t; + +/* block */ +typedef struct block_t block_t; +typedef struct block_fifo_t block_fifo_t; + +/* Hashing */ +typedef struct md5_s md5_t; + +/* XML */ +typedef struct xml_t xml_t; +typedef struct xml_sys_t xml_sys_t; +typedef struct xml_reader_t xml_reader_t; +typedef struct xml_reader_sys_t xml_reader_sys_t; + +/* vod server */ +typedef struct vod_t vod_t; +typedef struct vod_sys_t vod_sys_t; +typedef struct vod_media_t vod_media_t; + +/* VLM */ +typedef struct vlm_t vlm_t; +typedef struct vlm_message_t vlm_message_t; + +/* misc */ +typedef struct vlc_meta_t vlc_meta_t; +typedef struct input_stats_t input_stats_t; +typedef struct addon_entry_t addon_entry_t; + +/* Update */ +typedef struct update_t update_t; + +/** + * VLC value structure + */ +typedef union +{ + int64_t i_int; + bool b_bool; + float f_float; + char * psz_string; + void * p_address; + vlc_list_t * p_list; + struct { int32_t x; int32_t y; } coords; + +} vlc_value_t; + +/** + * VLC list structure + */ +struct vlc_list_t +{ + int i_type; + int i_count; + vlc_value_t *p_values; +}; + +/***************************************************************************** + * Error values (shouldn't be exposed) + *****************************************************************************/ +#define VLC_SUCCESS (-0) /**< No error */ +#define VLC_EGENERIC (-1) /**< Unspecified error */ +#define VLC_ENOMEM (-2) /**< Not enough memory */ +#define VLC_ETIMEOUT (-3) /**< Timeout */ +#define VLC_ENOMOD (-4) /**< Module not found */ +#define VLC_ENOOBJ (-5) /**< Object not found */ +#define VLC_ENOVAR (-6) /**< Variable not found */ +#define VLC_EBADVAR (-7) /**< Bad variable value */ +#define VLC_ENOITEM (-8) /**< Item not found */ + +/***************************************************************************** + * Variable callbacks: called when the value is modified + *****************************************************************************/ +typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ + char const *, /* variable name */ + vlc_value_t, /* old value */ + vlc_value_t, /* new value */ + void * ); /* callback data */ + +/***************************************************************************** + * List callbacks: called when elements are added/removed from the list + *****************************************************************************/ +typedef int ( * vlc_list_callback_t ) ( vlc_object_t *, /* variable's object */ + char const *, /* variable name */ + int, /* VLC_VAR_* action */ + vlc_value_t *, /* new/deleted value */ + void *); /* callback data */ + +/***************************************************************************** + * OS-specific headers and thread types + *****************************************************************************/ +#if defined( _WIN32 ) +# include +# ifndef PATH_MAX +# define PATH_MAX MAX_PATH +# endif +# include +#endif + +#ifdef __APPLE__ +#include +#include +#endif + +#ifdef __OS2__ +# define OS2EMX_PLAIN_CHAR +# define INCL_BASE +# define INCL_PM +# include +# include +#endif + +#include "vlc_mtime.h" +#include "vlc_threads.h" + +/** + * Common structure members + *****************************************************************************/ + +/** + * VLC object common members + * + * Common public properties for all VLC objects. + * Object also have private properties maintained by the core, see + * \ref vlc_object_internals_t + */ +struct vlc_common_members +{ + /** Object type name + * + * A constant string identifying the type of the object (for logging) + */ + const char *object_type; + + /** Log messages header + * + * Human-readable header for log messages. This is not thread-safe and + * only used by VLM and Lua interfaces. + */ + char *header; + + int flags; + + /** Module probe flag + * + * A boolean during module probing when the probe is "forced". + * See \ref module_need(). + */ + bool force; + + /** LibVLC instance + * + * Root VLC object of the objects tree that this object belongs in. + */ + libvlc_int_t *libvlc; + + /** Parent object + * + * The parent VLC object in the objects tree. For the root (the LibVLC + * instance) object, this is NULL. + */ + vlc_object_t *parent; +}; + +/** + * Backward compatibility macro + */ +#define VLC_COMMON_MEMBERS struct vlc_common_members obj; + +/** + * Type-safe vlc_object_t cast + * + * This macro attempts to cast a pointer to a compound type to a + * \ref vlc_object_t pointer in a type-safe manner. + * It checks if the compound type actually starts with an embedded + * \ref vlc_object_t structure. + */ +#if !defined(__cplusplus) +# define VLC_OBJECT(x) \ + _Generic((x)->obj, \ + struct vlc_common_members: (vlc_object_t *)(&(x)->obj), \ + const struct vlc_common_members: (const vlc_object_t *)(&(x)->obj) \ + ) +#else +# define VLC_OBJECT( x ) ((vlc_object_t *)&(x)->obj) +#endif + +/***************************************************************************** + * Macros and inline functions + *****************************************************************************/ + +/* __MAX and __MIN: self explanatory */ +#ifndef __MAX +# define __MAX(a, b) ( ((a) > (b)) ? (a) : (b) ) +#endif +#ifndef __MIN +# define __MIN(a, b) ( ((a) < (b)) ? (a) : (b) ) +#endif + +/* clip v in [min, max] */ +#define VLC_CLIP(v, min, max) __MIN(__MAX((v), (min)), (max)) + +VLC_USED +static inline int64_t GCD ( int64_t a, int64_t b ) +{ + while( b ) + { + int64_t c = a % b; + a = b; + b = c; + } + return a; +} + +/* function imported from libavutil/common.h */ +VLC_USED +static inline uint8_t clip_uint8_vlc( int32_t a ) +{ + if( a&(~255) ) return (-a)>>31; + else return a; +} + +/** Count leading zeroes */ +VLC_USED +static inline unsigned (clz)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_clz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x >>= 1; + i--; + } + return i; +#endif +} + +#define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8)) +#define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8)) +/* XXX: this assumes that int is 32-bits or more */ +#define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8)) + +/** Count trailing zeroes */ +VLC_USED +static inline unsigned (ctz)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_ctz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x <<= 1; + i--; + } + return i; +#endif +} + +#if !defined(__NetBSD__) +/** Bit weight */ +VLC_USED +static inline unsigned (popcount)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_popcount (x); +#else + unsigned count = 0; + while (x) + { + count += x & 1; + x = x >> 1; + } + return count; +#endif +} + +/** Bit weight of long long */ +VLC_USED +static inline int (popcountll)(unsigned long long x) +{ +#ifdef __GNUC__ + return __builtin_popcountll(x); +#else + int count = 0; + while (x) + { + count += x & 1; + x = x >> 1; + } + return count; +#endif +} +#endif + +VLC_USED +static inline unsigned (parity)(unsigned x) +{ +#ifdef __GNUC__ + return __builtin_parity (x); +#else + for (unsigned i = 4 * sizeof (x); i > 0; i /= 2) + x ^= x >> i; + return x & 1; +#endif +} + +#if !defined(__NetBSD__) +/** Byte swap (16 bits) */ +VLC_USED +static inline uint16_t (bswap16)(uint16_t x) +{ + return (x << 8) | (x >> 8); +} + +/** Byte swap (32 bits) */ +VLC_USED +static inline uint32_t (bswap32)(uint32_t x) +{ +#if defined (__GNUC__) || defined(__clang__) + return __builtin_bswap32 (x); +#else + return ((x & 0x000000FF) << 24) + | ((x & 0x0000FF00) << 8) + | ((x & 0x00FF0000) >> 8) + | ((x & 0xFF000000) >> 24); +#endif +} + +/** Byte swap (64 bits) */ +VLC_USED +static inline uint64_t (bswap64)(uint64_t x) +{ +#if defined (__GNUC__) || defined(__clang__) + return __builtin_bswap64 (x); +#elif !defined (__cplusplus) + return ((x & 0x00000000000000FF) << 56) + | ((x & 0x000000000000FF00) << 40) + | ((x & 0x0000000000FF0000) << 24) + | ((x & 0x00000000FF000000) << 8) + | ((x & 0x000000FF00000000) >> 8) + | ((x & 0x0000FF0000000000) >> 24) + | ((x & 0x00FF000000000000) >> 40) + | ((x & 0xFF00000000000000) >> 56); +#else + return ((x & 0x00000000000000FFULL) << 56) + | ((x & 0x000000000000FF00ULL) << 40) + | ((x & 0x0000000000FF0000ULL) << 24) + | ((x & 0x00000000FF000000ULL) << 8) + | ((x & 0x000000FF00000000ULL) >> 8) + | ((x & 0x0000FF0000000000ULL) >> 24) + | ((x & 0x00FF000000000000ULL) >> 40) + | ((x & 0xFF00000000000000ULL) >> 56); +#endif +} +#endif + +/* Integer overflow */ +static inline bool uadd_overflow(unsigned a, unsigned b, unsigned *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_uadd_overflow(a, b, res); +#else + *res = a + b; + return (a + b) < a; +#endif +} + +static inline bool uaddl_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_uaddl_overflow(a, b, res); +#else + *res = a + b; + return (a + b) < a; +#endif +} + +static inline bool uaddll_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_uaddll_overflow(a, b, res); +#else + *res = a + b; + return (a + b) < a; +#endif +} + +#ifndef __cplusplus +# define add_overflow(a,b,r) \ + _Generic(*(r), \ + unsigned: uadd_overflow(a, b, (unsigned *)(r)), \ + unsigned long: uaddl_overflow(a, b, (unsigned long *)(r)), \ + unsigned long long: uaddll_overflow(a, b, (unsigned long long *)(r))) +#else +static inline bool add_overflow(unsigned a, unsigned b, unsigned *res) +{ + return uadd_overflow(a, b, res); +} + +static inline bool add_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ + return uaddl_overflow(a, b, res); +} + +static inline bool add_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ + return uaddll_overflow(a, b, res); +} +#endif + +#if !(VLC_GCC_VERSION(5,0) || defined(__clang__)) +# include +#endif + +static inline bool umul_overflow(unsigned a, unsigned b, unsigned *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_umul_overflow(a, b, res); +#else + *res = a * b; + return b > 0 && a > (UINT_MAX / b); +#endif +} + +static inline bool umull_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_umull_overflow(a, b, res); +#else + *res = a * b; + return b > 0 && a > (ULONG_MAX / b); +#endif +} + +static inline bool umulll_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ +#if VLC_GCC_VERSION(5,0) || defined(__clang__) + return __builtin_umulll_overflow(a, b, res); +#else + *res = a * b; + return b > 0 && a > (ULLONG_MAX / b); +#endif +} + +#ifndef __cplusplus +#define mul_overflow(a,b,r) \ + _Generic(*(r), \ + unsigned: umul_overflow(a, b, (unsigned *)(r)), \ + unsigned long: umull_overflow(a, b, (unsigned long *)(r)), \ + unsigned long long: umulll_overflow(a, b, (unsigned long long *)(r))) +#else +static inline bool mul_overflow(unsigned a, unsigned b, unsigned *res) +{ + return umul_overflow(a, b, res); +} + +static inline bool mul_overflow(unsigned long a, unsigned long b, + unsigned long *res) +{ + return umull_overflow(a, b, res); +} + +static inline bool mul_overflow(unsigned long long a, unsigned long long b, + unsigned long long *res) +{ + return umulll_overflow(a, b, res); +} +#endif + +/* Free and set set the variable to NULL */ +#define FREENULL(a) do { free( a ); a = NULL; } while(0) + +#define EMPTY_STR(str) (!str || !*str) + +VLC_API char const * vlc_error( int ) VLC_USED; + +#include + +/* MSB (big endian)/LSB (little endian) conversions - network order is always + * MSB, and should be used for both network communications and files. */ + +#ifdef WORDS_BIGENDIAN +# define hton16(i) ((uint16_t)(i)) +# define hton32(i) ((uint32_t)(i)) +# define hton64(i) ((uint64_t)(i)) +#else +# define hton16(i) bswap16(i) +# define hton32(i) bswap32(i) +# define hton64(i) bswap64(i) +#endif +#define ntoh16(i) hton16(i) +#define ntoh32(i) hton32(i) +#define ntoh64(i) hton64(i) + +/** Reads 16 bits in network byte order */ +VLC_USED +static inline uint16_t U16_AT (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh16 (x); +} + +/** Reads 32 bits in network byte order */ +VLC_USED +static inline uint32_t U32_AT (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh32 (x); +} + +/** Reads 64 bits in network byte order */ +VLC_USED +static inline uint64_t U64_AT (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); + return ntoh64 (x); +} + +#define GetWBE(p) U16_AT(p) +#define GetDWBE(p) U32_AT(p) +#define GetQWBE(p) U64_AT(p) + +/** Reads 16 bits in little-endian order */ +VLC_USED +static inline uint16_t GetWLE (const void *p) +{ + uint16_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap16 (x); +#endif + return x; +} + +/** Reads 32 bits in little-endian order */ +VLC_USED +static inline uint32_t GetDWLE (const void *p) +{ + uint32_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap32 (x); +#endif + return x; +} + +/** Reads 64 bits in little-endian order */ +VLC_USED +static inline uint64_t GetQWLE (const void *p) +{ + uint64_t x; + + memcpy (&x, p, sizeof (x)); +#ifdef WORDS_BIGENDIAN + x = bswap64 (x); +#endif + return x; +} + +/** Writes 16 bits in network byte order */ +static inline void SetWBE (void *p, uint16_t w) +{ + w = hton16 (w); + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in network byte order */ +static inline void SetDWBE (void *p, uint32_t dw) +{ + dw = hton32 (dw); + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in network byte order */ +static inline void SetQWBE (void *p, uint64_t qw) +{ + qw = hton64 (qw); + memcpy (p, &qw, sizeof (qw)); +} + +/** Writes 16 bits in little endian order */ +static inline void SetWLE (void *p, uint16_t w) +{ +#ifdef WORDS_BIGENDIAN + w = bswap16 (w); +#endif + memcpy (p, &w, sizeof (w)); +} + +/** Writes 32 bits in little endian order */ +static inline void SetDWLE (void *p, uint32_t dw) +{ +#ifdef WORDS_BIGENDIAN + dw = bswap32 (dw); +#endif + memcpy (p, &dw, sizeof (dw)); +} + +/** Writes 64 bits in little endian order */ +static inline void SetQWLE (void *p, uint64_t qw) +{ +#ifdef WORDS_BIGENDIAN + qw = bswap64 (qw); +#endif + memcpy (p, &qw, sizeof (qw)); +} + +/* */ +#define VLC_UNUSED(x) (void)(x) + +/* Stuff defined in src/extras/libc.c */ + +#if defined(_WIN32) +/* several type definitions */ +# if defined( __MINGW32__ ) +# if !defined( _OFF_T_ ) + typedef long long _off_t; + typedef _off_t off_t; +# define _OFF_T_ +# else +# ifdef off_t +# undef off_t +# endif +# define off_t long long +# endif +# endif + +# ifndef O_NONBLOCK +# define O_NONBLOCK 0 +# endif + +# include +#endif /* _WIN32 */ + +typedef struct { + unsigned num, den; +} vlc_rational_t; + +VLC_API bool vlc_ureduce( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ); + +#define container_of(ptr, type, member) \ + ((type *)(((char *)(ptr)) - offsetof(type, member))) + +VLC_USED VLC_MALLOC +static inline void *vlc_alloc(size_t count, size_t size) +{ + return mul_overflow(count, size, &size) ? NULL : malloc(size); +} + +/***************************************************************************** + * I18n stuff + *****************************************************************************/ +VLC_API char *vlc_gettext( const char *msgid ) VLC_FORMAT_ARG(1); +VLC_API char *vlc_ngettext( const char *s, const char *p, unsigned long n ) VLC_FORMAT_ARG(1) VLC_FORMAT_ARG(2); + +#define vlc_pgettext( ctx, id ) \ + vlc_pgettext_aux( ctx "\004" id, id ) + +VLC_FORMAT_ARG(2) +static inline const char *vlc_pgettext_aux( const char *ctx, const char *id ) +{ + const char *tr = vlc_gettext( ctx ); + return (tr == ctx) ? id : tr; +} + +/***************************************************************************** + * Loosy memory allocation functions. Do not use in new code. + *****************************************************************************/ +static inline void *xmalloc(size_t len) +{ + void *ptr = malloc(len); + if (unlikely(ptr == NULL && len > 0)) + abort(); + return ptr; +} + +static inline void *xrealloc(void *ptr, size_t len) +{ + void *nptr = realloc(ptr, len); + if (unlikely(nptr == NULL && len > 0)) + abort(); + return nptr; +} + +static inline void *xcalloc(size_t n, size_t size) +{ + void *ptr = calloc(n, size); + if (unlikely(ptr == NULL && (n > 0 || size > 0))) + abort (); + return ptr; +} + +static inline char *xstrdup (const char *str) +{ + char *ptr = strdup (str); + if (unlikely(ptr == NULL)) + abort (); + return ptr; +} + +/***************************************************************************** + * libvlc features + *****************************************************************************/ +VLC_API const char * VLC_CompileBy( void ) VLC_USED; +VLC_API const char * VLC_CompileHost( void ) VLC_USED; +VLC_API const char * VLC_Compiler( void ) VLC_USED; + +/***************************************************************************** + * Additional vlc stuff + *****************************************************************************/ +#include "vlc_messages.h" +#include "vlc_objects.h" +#include "vlc_variables.h" +#include "vlc_main.h" +#include "vlc_configuration.h" + +#if defined( _WIN32 ) || defined( __OS2__ ) +# define DIR_SEP_CHAR '\\' +# define DIR_SEP "\\" +# define PATH_SEP_CHAR ';' +# define PATH_SEP ";" +#else +# define DIR_SEP_CHAR '/' +# define DIR_SEP "/" +# define PATH_SEP_CHAR ':' +# define PATH_SEP ":" +#endif + +#define LICENSE_MSG \ + _("This program comes with NO WARRANTY, to the extent permitted by " \ + "law.\nYou may redistribute it under the terms of the GNU General " \ + "Public License;\nsee the file named COPYING for details.\n" \ + "Written by the VideoLAN team; see the AUTHORS file.\n") + +#endif /* !VLC_COMMON_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_config.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_config.h new file mode 100644 index 0000000..50b4887 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_config.h @@ -0,0 +1,114 @@ +/***************************************************************************** + * vlc_config.h: limits and configuration + * Defines all compilation-time configuration constants and size limits + ***************************************************************************** + * Copyright (C) 1999-2003 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines of values used in interface, vout, aout and vlc core functions. + */ + +/* Conventions regarding names of symbols and variables + * ---------------------------------------------------- + * + * - Symbols should begin with a prefix indicating in which module they are + * used, such as INTF_, VOUT_ or AOUT_. + */ + +/***************************************************************************** + * General configuration + *****************************************************************************/ + +/* All timestamp below or equal to this define are invalid/unset + * XXX the numerical value is 0 because of historical reason and will change.*/ +#define VLC_TS_INVALID INT64_C(0) +#define VLC_TS_0 INT64_C(1) + +#define CLOCK_FREQ INT64_C(1000000) + +/***************************************************************************** + * Interface configuration + *****************************************************************************/ + +/* Base delay in micro second for interface sleeps */ +#define INTF_IDLE_SLEEP (CLOCK_FREQ/20) + +/***************************************************************************** + * Input thread configuration + *****************************************************************************/ + +/* Used in ErrorThread */ +#define INPUT_IDLE_SLEEP (CLOCK_FREQ/10) + +/* + * General limitations + */ + +/* Duration between the time we receive the data packet, and the time we will + * mark it to be presented */ +#define DEFAULT_PTS_DELAY (3*CLOCK_FREQ/10) + +/***************************************************************************** + * SPU configuration + *****************************************************************************/ + +/* Buffer must avoid arriving more than SPU_MAX_PREPARE_TIME in advanced to + * the SPU */ +#define SPU_MAX_PREPARE_TIME (CLOCK_FREQ/2) + +/***************************************************************************** + * Video configuration + *****************************************************************************/ + +/* + * Default settings for video output threads + */ + +/* Multiplier value for aspect ratio calculation (2^7 * 3^3 * 5^3) */ +#define VOUT_ASPECT_FACTOR 432000 + +/* Maximum width of a scaled source picture - this should be relatively high, + * since higher stream values will result in no display at all. */ +#define VOUT_MAX_WIDTH 4096 + +/* Number of planes in a picture */ +#define VOUT_MAX_PLANES 5 + +/* + * Time settings + */ + +/* Time to sleep when waiting for a buffer (from vout or the video fifo). + * It should be approximately the time needed to perform a complete picture + * loop. Since it only happens when the video heap is full, it does not need + * to be too low, even if it blocks the decoder. */ +#define VOUT_OUTMEM_SLEEP (CLOCK_FREQ/50) + +/* The default video output window title */ +#define VOUT_TITLE "VLC" + +/***************************************************************************** + * Messages and console interfaces configuration + *****************************************************************************/ + +/* Maximal depth of the object tree output by vlc_dumpstructure */ +#define MAX_DUMPSTRUCTURE_DEPTH 100 diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_config_cat.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_config_cat.h new file mode 100644 index 0000000..e35345b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_config_cat.h @@ -0,0 +1,271 @@ +/***************************************************************************** + * vlc_config_cat.h : Definition of configuration categories + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 55d2e468d1ccc3fcd8d165dcecc10ec753021a5e $ + * + * Authors: Clément Stenac + * Anil Daoud + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HELP_H +#define VLC_HELP_H 1 +# include + +/* + * First, we need help strings for the General Settings and for the + * Plugins screen + */ +#define MAIN_TITLE N_( "VLC preferences" ) +#define MAIN_HELP N_( \ + "Select \"Advanced Options\" to see all options." ) + +/* Interface */ +#define INTF_TITLE N_("Interface") +#define INTF_HELP N_( "Settings for VLC's interfaces" ) + +#define INTF_GENERAL_HELP N_( "Main interfaces settings" ) + +#define INTF_MAIN_TITLE N_( "Main interfaces" ) +#define INTF_MAIN_HELP N_( "Settings for the main interface" ) + +#define INTF_CONTROL_TITLE N_( "Control interfaces" ) +#define INTF_CONTROL_HELP N_( "Settings for VLC's control interfaces" ) + +#define INTF_HOTKEYS_TITLE N_( "Hotkeys settings" ) +#define INTF_HOTKEYS_HELP N_( "Hotkeys settings" ) + +/* Audio */ +#define AUDIO_TITLE N_( "Audio" ) +#define AUDIO_HELP N_( "Audio settings" ) + +#define AUDIO_GENERAL_HELP N_("General audio settings") + +#define AFILTER_TITLE N_("Filters") +#define AFILTER_HELP N_( "Audio filters are used to process the audio stream." ) + +#define ARESAMPLER_TITLE N_("Audio resampler") + +#define AVISUAL_TITLE N_("Visualizations") +#define AVISUAL_HELP N_( "Audio visualizations" ) + +#define AOUT_TITLE N_( "Output modules" ) +#define AOUT_HELP N_("General settings for audio output modules.") + +#define AMISC_TITLE N_("Miscellaneous") +#define AMISC_HELP N_( "Miscellaneous audio settings and modules." ) + +/* Video */ +#define VIDEO_TITLE N_("Video") +#define VIDEO_HELP N_("Video settings") + +#define VIDEO_GENERAL_HELP N_( "General video settings" ) + +#define _VOUT_TITLE N_("Output modules" ) +#define VOUT_HELP N_("General settings for video output modules.") + +#define VFILTER_TITLE N_("Filters" ) +#define VFILTER_HELP N_("Video filters are used to process the video stream." ) + +#define SUBPIC_TITLE N_( "Subtitles / OSD") +#define SUBPIC_HELP N_( "Settings related to On-Screen-Display,"\ + " subtitles and \"overlay subpictures\"") + +#define SPLITTER_TITLE N_("Splitters") +#define SPLITTER_HELP N_("Video splitters separate the stream into multiple videos.") + +/* +#define TEXT_HELP N_( \ + "Use the settings of the \"freetype\" module to choose the font you " \ + "want VLC to use for text rendering (to display subtitles for example).") +*/ +/* Input */ +#define INPUT_TITLE N_( "Input / Codecs" ) +#define INPUT_HELP N_( "Settings for input, demultiplexing, " \ + "decoding and encoding") + +#define ACCESS_TITLE N_( "Access modules" ) +#define ACCESS_HELP N_( \ + "Settings related to the various access methods. " \ + "Common settings you may want to alter are HTTP proxy or " \ + "caching settings." ) + +#define STREAM_FILTER_TITLE N_( "Stream filters" ) +#define STREAM_FILTER_HELP N_( \ + "Stream filters are special modules that allow advanced operations on " \ + "the input side of VLC. Use with care..." ) + +#define DEMUX_TITLE N_("Demuxers") +#define DEMUX_HELP N_( "Demuxers are used to separate audio and video streams." ) + +#define VDEC_TITLE N_( "Video codecs" ) +#define VDEC_HELP N_( "Settings for the video, images or video+audio decoders and encoders." ) + +#define ADEC_TITLE N_( "Audio codecs" ) +#define ADEC_HELP N_( "Settings for the audio-only decoders and encoders." ) + +#define SDEC_TITLE N_( "Subtitle codecs") +#define SDEC_HELP N_( "Settings for subtitle, teletext and CC decoders and encoders." ) + +#define ADVANCED_HELP N_( "General input settings. Use with care..." ) + +/* Sout */ +#define SOUT_TITLE N_( "Stream output" ) +#define SOUT_HELP N_( \ + "Stream output settings are used when acting as a streaming server " \ + "or when saving incoming streams.\n" \ + "Streams are first muxed and then sent through an \"access output\" "\ + "module that can either save the stream to a file, or stream " \ + "it (UDP, HTTP, RTP/RTSP).\n" \ + "Sout streams modules allow advanced stream processing (transcoding, "\ + "duplicating...).") + +#define SOUT_GENERAL_HELP N_( "General stream output settings") + +#define SOUT_MUX_TITLE N_( "Muxers" ) +#define SOUT_MUX_HELP N_( \ + "Muxers create the encapsulation formats that are used to " \ + "put all the elementary streams (video, audio, ...) " \ + "together. This setting allows you to always force a specific muxer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each muxer." ) + +#define SOUT_ACO_TITLE N_( "Access output" ) +#define SOUT_ACO_HELP N_( \ + "Access output modules control the ways the muxed streams are sent. " \ + "This setting allows you to always force a specific access output method. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each access output.") + +#define SOUT_PACKET_TITLE N_( "Packetizers" ) +#define SOUT_PACKET_HELP N_( \ + "Packetizers are used to \"preprocess\" the elementary "\ + "streams before muxing. " \ + "This setting allows you to always force a packetizer. " \ + "You should probably not do that.\n" \ + "You can also set default parameters for each packetizer." ) + +#define SOUT_STREAM_TITLE N_("Sout stream") +#define SOUT_STREAM_HELP N_( "Sout stream modules allow to build a sout " \ + "processing chain. Please refer to the Streaming Howto for " \ + "more information. You can configure default options for " \ + "each sout stream module here.") + +#define SOUT_VOD_TITLE N_( "VOD" ) +#define SOUT_VOD_HELP N_( "VLC's implementation of Video On Demand" ) + + +/* Playlist */ +#define PLAYLIST_TITLE N_( "Playlist" ) +#define PLAYLIST_HELP N_( "Settings related to playlist behaviour " \ + "(e.g. playback mode) and to modules that automatically add "\ + "items to the playlist (\"service discovery\" modules).") + +#define PGENERAL_HELP N_( "General playlist behaviour") +#define SD_TITLE N_("Services discovery") +#define SD_HELP N_("Services discovery modules are facilities "\ + "that automatically add items to playlist.") + +/* Advanced */ +#define AADVANCED_TITLE N_( "Advanced" ) +#define AADVANCED_HELP N_( "Advanced settings. Use with care...") + +#define MISC_TITLE N_( "Advanced settings" ) + +/* This function is deprecated and is kept only for compatibility */ +static const struct config_category_t categories_array[] = +{ + /* Interface */ + { CAT_INTERFACE, INTF_TITLE, INTF_HELP }, + { SUBCAT_INTERFACE_GENERAL, INTF_TITLE, INTF_GENERAL_HELP }, + { SUBCAT_INTERFACE_MAIN, INTF_MAIN_TITLE, INTF_MAIN_HELP }, + { SUBCAT_INTERFACE_CONTROL, INTF_CONTROL_TITLE, INTF_CONTROL_HELP }, + { SUBCAT_INTERFACE_HOTKEYS, INTF_HOTKEYS_TITLE, INTF_HOTKEYS_HELP }, + + { CAT_AUDIO, AUDIO_TITLE, AUDIO_HELP }, + { SUBCAT_AUDIO_GENERAL, AUDIO_TITLE, AUDIO_GENERAL_HELP }, + { SUBCAT_AUDIO_AOUT, AOUT_TITLE, AOUT_HELP }, + { SUBCAT_AUDIO_AFILTER, AFILTER_TITLE, AFILTER_HELP }, + { SUBCAT_AUDIO_RESAMPLER, ARESAMPLER_TITLE, AFILTER_HELP }, + { SUBCAT_AUDIO_VISUAL, AVISUAL_TITLE, AVISUAL_HELP }, + { SUBCAT_AUDIO_MISC, AMISC_TITLE, AMISC_HELP }, + + { CAT_VIDEO, VIDEO_TITLE, VIDEO_HELP }, + { SUBCAT_VIDEO_GENERAL, VIDEO_TITLE, VIDEO_GENERAL_HELP }, + { SUBCAT_VIDEO_VOUT, _VOUT_TITLE, VOUT_HELP }, + { SUBCAT_VIDEO_VFILTER, VFILTER_TITLE, VFILTER_HELP }, + { SUBCAT_VIDEO_SUBPIC, SUBPIC_TITLE, SUBPIC_HELP }, + { SUBCAT_VIDEO_SPLITTER, SPLITTER_TITLE, SPLITTER_HELP }, + + { CAT_INPUT, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_GENERAL, INPUT_TITLE, INPUT_HELP }, + { SUBCAT_INPUT_ACCESS, ACCESS_TITLE, ACCESS_HELP }, + { SUBCAT_INPUT_DEMUX, DEMUX_TITLE, DEMUX_HELP }, + { SUBCAT_INPUT_VCODEC, VDEC_TITLE, VDEC_HELP }, + { SUBCAT_INPUT_ACODEC, ADEC_TITLE, ADEC_HELP }, + { SUBCAT_INPUT_SCODEC, SDEC_TITLE, SDEC_HELP }, + { SUBCAT_INPUT_STREAM_FILTER, STREAM_FILTER_TITLE, STREAM_FILTER_HELP }, + + { CAT_SOUT, SOUT_TITLE, SOUT_HELP }, + { SUBCAT_SOUT_GENERAL, SOUT_TITLE, SOUT_GENERAL_HELP }, + { SUBCAT_SOUT_STREAM, SOUT_STREAM_TITLE, SOUT_STREAM_HELP }, + { SUBCAT_SOUT_MUX, SOUT_MUX_TITLE, SOUT_MUX_HELP }, + { SUBCAT_SOUT_ACO, SOUT_ACO_TITLE, SOUT_ACO_HELP }, + { SUBCAT_SOUT_PACKETIZER, SOUT_PACKET_TITLE, SOUT_PACKET_HELP }, + { SUBCAT_SOUT_VOD, SOUT_VOD_TITLE, SOUT_VOD_HELP }, + + { CAT_PLAYLIST, PLAYLIST_TITLE , PLAYLIST_HELP }, + { SUBCAT_PLAYLIST_GENERAL, PLAYLIST_TITLE, PGENERAL_HELP }, + { SUBCAT_PLAYLIST_SD, SD_TITLE, SD_HELP }, + + { CAT_ADVANCED, AADVANCED_TITLE, AADVANCED_HELP }, + { SUBCAT_ADVANCED_MISC, MISC_TITLE, AADVANCED_HELP }, + + { -1, NULL, NULL } +}; + +VLC_USED +static inline const char *config_CategoryNameGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_name != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_name); + } + i++; + } + return NULL; +} + +VLC_USED +static inline const char *config_CategoryHelpGet( int i_value ) +{ + int i = 0; + while( categories_array[i].psz_help != NULL ) + { + if( categories_array[i].i_id == i_value ) + { + return vlc_gettext(categories_array[i].psz_help); + } + i++; + } + return NULL; +} + +#endif /* VLC_HELP_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_configuration.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_configuration.h new file mode 100644 index 0000000..067b8d1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_configuration.h @@ -0,0 +1,237 @@ +/***************************************************************************** + * vlc_configuration.h : configuration management module + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + ***************************************************************************** + * Copyright (C) 1999-2006 VLC authors and VideoLAN + * $Id: 209168615be2a7bc5db889282b32389093ab262e $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_CONFIGURATION_H +#define VLC_CONFIGURATION_H 1 + +/** + * \file + * This file describes the programming interface for the configuration module. + * It includes functions allowing to declare, get or set configuration options. + */ + +#include /* for ssize_t */ + +# ifdef __cplusplus +extern "C" { +# endif + +struct config_category_t +{ + int i_id; + const char *psz_name; + const char *psz_help; +}; + +typedef union +{ + char *psz; + int64_t i; + float f; +} module_value_t; + +typedef int (*vlc_string_list_cb)(vlc_object_t *, const char *, + char ***, char ***); +typedef int (*vlc_integer_list_cb)(vlc_object_t *, const char *, + int64_t **, char ***); + +struct module_config_t +{ + uint8_t i_type; /* Configuration type */ + char i_short; /* Optional short option name */ + unsigned b_advanced:1; /* Advanced option */ + unsigned b_internal:1; /* Hidden from prefs and help */ + unsigned b_unsaveable:1; /* Not stored in configuration */ + unsigned b_safe:1; /* Safe in web plugins and playlists */ + unsigned b_removed:1; /* Deprecated */ + + const char *psz_type; /* Configuration subtype */ + const char *psz_name; /* Option name */ + const char *psz_text; /* Short comment on the configuration option */ + const char *psz_longtext; /* Long comment on the configuration option */ + + module_value_t value; /* Option value */ + module_value_t orig; + module_value_t min; + module_value_t max; + + /* Values list */ + uint16_t list_count; /* Options list size */ + union + { + const char **psz; /* List of possible values for the option */ + const int *i; + vlc_string_list_cb psz_cb; + vlc_integer_list_cb i_cb; + } list; + const char **list_text; /* Friendly names for list values */ + const char *list_cb_name; + void *owner; +}; + +/***************************************************************************** + * Prototypes - these methods are used to get, set or manipulate configuration + * data. + *****************************************************************************/ +VLC_API int config_GetType(const char *) VLC_USED; +VLC_API int64_t config_GetInt(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutInt(vlc_object_t *, const char *, int64_t); +VLC_API float config_GetFloat(vlc_object_t *, const char *) VLC_USED; +VLC_API void config_PutFloat(vlc_object_t *, const char *, float); +VLC_API char * config_GetPsz(vlc_object_t *, const char *) VLC_USED VLC_MALLOC; +VLC_API void config_PutPsz(vlc_object_t *, const char *, const char *); +VLC_API int config_GetIntChoices(vlc_object_t *, const char *, + int64_t **, char ***) VLC_USED; +VLC_API int config_GetPszChoices(vlc_object_t *, const char *, + char ***, char ***) VLC_USED; + +VLC_API int config_SaveConfigFile( vlc_object_t * ); +#define config_SaveConfigFile(a) config_SaveConfigFile(VLC_OBJECT(a)) + +VLC_API void config_ResetAll( vlc_object_t * ); +#define config_ResetAll(a) config_ResetAll(VLC_OBJECT(a)) + +VLC_API module_config_t * config_FindConfig(const char *) VLC_USED; +VLC_API char * config_GetDataDir(void) VLC_USED VLC_MALLOC; +VLC_API char *config_GetLibDir(void) VLC_USED; + +typedef enum vlc_userdir +{ + VLC_HOME_DIR, /* User's home */ + VLC_CONFIG_DIR, /* VLC-specific configuration directory */ + VLC_DATA_DIR, /* VLC-specific data directory */ + VLC_CACHE_DIR, /* VLC-specific user cached data directory */ + /* Generic directories (same as XDG) */ + VLC_DESKTOP_DIR=0x80, + VLC_DOWNLOAD_DIR, + VLC_TEMPLATES_DIR, + VLC_PUBLICSHARE_DIR, + VLC_DOCUMENTS_DIR, + VLC_MUSIC_DIR, + VLC_PICTURES_DIR, + VLC_VIDEOS_DIR, +} vlc_userdir_t; + +VLC_API char * config_GetUserDir( vlc_userdir_t ) VLC_USED VLC_MALLOC; + +VLC_API void config_AddIntf( vlc_object_t *, const char * ); +VLC_API void config_RemoveIntf( vlc_object_t *, const char * ); +VLC_API bool config_ExistIntf( vlc_object_t *, const char * ) VLC_USED; + +#define config_GetInt(a,b) config_GetInt(VLC_OBJECT(a),b) +#define config_PutInt(a,b,c) config_PutInt(VLC_OBJECT(a),b,c) +#define config_GetFloat(a,b) config_GetFloat(VLC_OBJECT(a),b) +#define config_PutFloat(a,b,c) config_PutFloat(VLC_OBJECT(a),b,c) +#define config_GetPsz(a,b) config_GetPsz(VLC_OBJECT(a),b) +#define config_PutPsz(a,b,c) config_PutPsz(VLC_OBJECT(a),b,c) + +#define config_AddIntf(a,b) config_AddIntf(VLC_OBJECT(a),b) +#define config_RemoveIntf(a,b) config_RemoveIntf(VLC_OBJECT(a),b) +#define config_ExistIntf(a,b) config_ExistIntf(VLC_OBJECT(a),b) + +/**************************************************************************** + * config_chain_t: + ****************************************************************************/ +struct config_chain_t +{ + config_chain_t *p_next; /**< Pointer on the next config_chain_t element */ + + char *psz_name; /**< Option name */ + char *psz_value; /**< Option value */ +}; + +/** + * This function will + * - create all options in the array ppsz_options (var_Create). + * - parse the given linked list of config_chain_t and set the value (var_Set). + * + * The option names will be created by adding the psz_prefix prefix. + */ +VLC_API void config_ChainParse( vlc_object_t *, const char *psz_prefix, const char *const *ppsz_options, config_chain_t * ); +#define config_ChainParse( a, b, c, d ) config_ChainParse( VLC_OBJECT(a), b, c, d ) + +/** + * This function will parse a configuration string (psz_opts) and + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*} + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API const char *config_ChainParseOptions( config_chain_t **pp_cfg, const char *ppsz_opts ); + +/** + * This function will parse a configuration string (psz_string) and + * - set the module name (*ppsz_name) + * - set all options for this module in a chained list (*pp_cfg) + * - returns a pointer on the next module if any. + * + * The string format is + * module{option=*,option=*}[:modulenext{option=*,...}] + * + * The options values are unescaped using config_StringUnescape. + */ +VLC_API char *config_ChainCreate( char **ppsz_name, config_chain_t **pp_cfg, const char *psz_string ) VLC_USED VLC_MALLOC; + +/** + * This function will release a linked list of config_chain_t + * (Including the head) + */ +VLC_API void config_ChainDestroy( config_chain_t * ); + +/** + * This function will duplicate a linked list of config_chain_t + */ +VLC_API config_chain_t * config_ChainDuplicate( const config_chain_t * ) VLC_USED VLC_MALLOC; + +/** + * This function will unescape a string in place and will return a pointer on + * the given string. + * No memory is allocated by it (unlike config_StringEscape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The following sequences will be unescaped (only one time): + * \\ \' and \" + */ +VLC_API char * config_StringUnescape( char *psz_string ); + +/** + * This function will escape a string that can be unescaped by + * config_StringUnescape. + * The returned value is allocated by it. You have to free it once you + * do not need it anymore (unlike config_StringUnescape). + * If NULL is given as parameter nothing will be done (NULL will be returned). + * + * The escaped characters are ' " and \ + */ +VLC_API char * config_StringEscape( const char *psz_string ) VLC_USED VLC_MALLOC; + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_CONFIGURATION_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_cpu.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_cpu.h new file mode 100644 index 0000000..b2f0f45 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_cpu.h @@ -0,0 +1,192 @@ +/***************************************************************************** + * vlc_cpu.h: CPU capabilities + ***************************************************************************** + * Copyright (C) 1998-2009 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file provides CPU features detection. + */ + +#ifndef VLC_CPU_H +# define VLC_CPU_H 1 + +VLC_API unsigned vlc_CPU(void); + +# if defined (__i386__) || defined (__x86_64__) +# define HAVE_FPU 1 +# define VLC_CPU_MMX 0x00000008 +# define VLC_CPU_3dNOW 0x00000010 +# define VLC_CPU_MMXEXT 0x00000020 +# define VLC_CPU_SSE 0x00000040 +# define VLC_CPU_SSE2 0x00000080 +# define VLC_CPU_SSE3 0x00000100 +# define VLC_CPU_SSSE3 0x00000200 +# define VLC_CPU_SSE4_1 0x00000400 +# define VLC_CPU_SSE4_2 0x00000800 +# define VLC_CPU_SSE4A 0x00001000 +# define VLC_CPU_AVX 0x00002000 +# define VLC_CPU_AVX2 0x00004000 +# define VLC_CPU_XOP 0x00008000 +# define VLC_CPU_FMA4 0x00010000 + +# if defined (__MMX__) +# define vlc_CPU_MMX() (1) +# define VLC_MMX +# else +# define vlc_CPU_MMX() ((vlc_CPU() & VLC_CPU_MMX) != 0) +# define VLC_MMX __attribute__ ((__target__ ("mmx"))) +# endif + +# if defined (__SSE__) +# define vlc_CPU_MMXEXT() (1) +# define vlc_CPU_SSE() (1) +# define VLC_SSE +# else +# define vlc_CPU_MMXEXT() ((vlc_CPU() & VLC_CPU_MMXEXT) != 0) +# define vlc_CPU_SSE() ((vlc_CPU() & VLC_CPU_SSE) != 0) +# define VLC_SSE __attribute__ ((__target__ ("sse"))) +# endif + +# ifdef __SSE2__ +# define vlc_CPU_SSE2() (1) +# else +# define vlc_CPU_SSE2() ((vlc_CPU() & VLC_CPU_SSE2) != 0) +# endif + +# ifdef __SSE3__ +# define vlc_CPU_SSE3() (1) +# else +# define vlc_CPU_SSE3() ((vlc_CPU() & VLC_CPU_SSE3) != 0) +# endif + +# ifdef __SSSE3__ +# define vlc_CPU_SSSE3() (1) +# else +# define vlc_CPU_SSSE3() ((vlc_CPU() & VLC_CPU_SSSE3) != 0) +# endif + +# ifdef __SSE4_1__ +# define vlc_CPU_SSE4_1() (1) +# else +# define vlc_CPU_SSE4_1() ((vlc_CPU() & VLC_CPU_SSE4_1) != 0) +# endif + +# ifdef __SSE4_2__ +# define vlc_CPU_SSE4_2() (1) +# else +# define vlc_CPU_SSE4_2() ((vlc_CPU() & VLC_CPU_SSE4_2) != 0) +# endif + +# ifdef __SSE4A__ +# define vlc_CPU_SSE4A() (1) +# else +# define vlc_CPU_SSE4A() ((vlc_CPU() & VLC_CPU_SSE4A) != 0) +# endif + +# ifdef __AVX__ +# define vlc_CPU_AVX() (1) +# else +# define vlc_CPU_AVX() ((vlc_CPU() & VLC_CPU_AVX) != 0) +# endif + +# ifdef __AVX2__ +# define vlc_CPU_AVX2() (1) +# else +# define vlc_CPU_AVX2() ((vlc_CPU() & VLC_CPU_AVX2) != 0) +# endif + +# ifdef __3dNOW__ +# define vlc_CPU_3dNOW() (1) +# else +# define vlc_CPU_3dNOW() ((vlc_CPU() & VLC_CPU_3dNOW) != 0) +# endif + +# ifdef __XOP__ +# define vlc_CPU_XOP() (1) +# else +# define vlc_CPU_XOP() ((vlc_CPU() & VLC_CPU_XOP) != 0) +# endif + +# ifdef __FMA4__ +# define vlc_CPU_FMA4() (1) +# else +# define vlc_CPU_FMA4() ((vlc_CPU() & VLC_CPU_FMA4) != 0) +# endif + +# elif defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__) +# define HAVE_FPU 1 +# define VLC_CPU_ALTIVEC 2 + +# ifdef ALTIVEC +# define vlc_CPU_ALTIVEC() (1) +# else +# define vlc_CPU_ALTIVEC() ((vlc_CPU() & VLC_CPU_ALTIVEC) != 0) +# endif + +# elif defined (__arm__) +# if defined (__VFP_FP__) && !defined (__SOFTFP__) +# define HAVE_FPU 1 +# else +# define HAVE_FPU 0 +# endif +# define VLC_CPU_ARMv6 4 +# define VLC_CPU_ARM_NEON 2 + +# if defined (__ARM_ARCH_7A__) +# define VLC_CPU_ARM_ARCH 7 +# elif defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6T2__) +# define VLC_CPU_ARM_ARCH 6 +# else +# define VLC_CPU_ARM_ARCH 4 +# endif + +# if (VLC_CPU_ARM_ARCH >= 6) +# define vlc_CPU_ARMv6() (1) +# else +# define vlc_CPU_ARMv6() ((vlc_CPU() & VLC_CPU_ARMv6) != 0) +# endif + +# ifdef __ARM_NEON__ +# define vlc_CPU_ARM_NEON() (1) +# else +# define vlc_CPU_ARM_NEON() ((vlc_CPU() & VLC_CPU_ARM_NEON) != 0) +# endif + +# elif defined (__aarch64__) +# define HAVE_FPU 1 +// NEON is mandatory for general purpose ARMv8-a CPUs +# define vlc_CPU_ARM64_NEON() (1) + +# elif defined (__sparc__) +# define HAVE_FPU 1 + +# elif defined (__mips_hard_float) +# define HAVE_FPU 1 + +# else +/** + * Are single precision floating point operations "fast"? + * If this preprocessor constant is zero, floating point should be avoided + * (especially relevant for audio codecs). + */ +# define HAVE_FPU 0 + +# endif + +#endif /* !VLC_CPU_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_demux.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_demux.h new file mode 100644 index 0000000..74bd29a --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_demux.h @@ -0,0 +1,525 @@ +/***************************************************************************** + * vlc_demux.h: Demuxer descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2005 VLC authors and VideoLAN + * $Id: f359f547fa79d9818ed74420d906a6683be3d037 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DEMUX_H +#define VLC_DEMUX_H 1 + +#include +#include + +#include +#include +#include + +/** + * \defgroup demux Demultiplexer + * \ingroup input + * Demultiplexers (file format parsers) + * @{ + * \file + * Demultiplexer modules interface + */ + +struct demux_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* eg informative but needed (we can have access+demux) */ + char *psz_access; + char *psz_demux; + char *psz_location; + char *psz_file; + + union { + /** + * Input stream + * + * Depending on the module capability: + * - "demux": input byte stream (not NULL) + * - "access_demux": a NULL pointer + * - "demux_filter": undefined + */ + stream_t *s; + /** + * Input demuxer + * + * If the module capability is "demux_filter", this is the upstream + * demuxer or demux filter. Otherwise, this is undefined. + */ + demux_t *p_next; + }; + + /* es output */ + es_out_t *out; /* our p_es_out */ + + bool b_preparsing; /* True if the demux is used to preparse */ + + /* set by demuxer */ + int (*pf_demux) ( demux_t * ); /* demux one frame only */ + int (*pf_control)( demux_t *, int i_query, va_list args); + + /* Demux has to maintain them uptodate + * when it is responsible of seekpoint/title */ + struct + { + unsigned int i_update; /* Demux sets them on change, + Input removes them once take into account*/ + /* Seekpoint/Title at demux level */ + int i_title; /* idem, start from 0 (could be menu) */ + int i_seekpoint; /* idem, start from 0 */ + } info; + demux_sys_t *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/* pf_demux return values */ +#define VLC_DEMUXER_EOF 0 +#define VLC_DEMUXER_EGENERIC -1 +#define VLC_DEMUXER_SUCCESS 1 + +/* demux_t.info.i_update field */ +#define INPUT_UPDATE_TITLE 0x0010 +#define INPUT_UPDATE_SEEKPOINT 0x0020 +#define INPUT_UPDATE_META 0x0040 +#define INPUT_UPDATE_TITLE_LIST 0x0100 + +/* demux_meta_t is returned by "meta reader" module to the demuxer */ +typedef struct demux_meta_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; /***< the input item that is being read */ + + vlc_meta_t *p_meta; /**< meta data */ + + int i_attachments; /**< number of attachments */ + input_attachment_t **attachments; /**< array of attachments */ +} demux_meta_t; + +/** + * Control query identifiers for use with demux_t.pf_control + * + * In the individual identifier description, the input stream refers to + * demux_t.s if non-NULL, and the output refers to demux_t.out. + * + * A demuxer is synchronous if it only accesses its input stream and the + * output from within its demux_t callbacks, i.e. demux.pf_demux and + * demux_t.pf_control. + * + * A demuxer is threaded if it accesses either or both input and output + * asynchronously. + * + * An access-demuxer is a demuxer without input, i.e. demux_t.s == NULL). + */ +enum demux_query_e +{ + /** Checks whether the stream supports seeking. + * Can fail if seeking is not supported (same as returning false). + * \bug Failing should not be allowed. + * + * arg1 = bool * */ + DEMUX_CAN_SEEK, + + /** Checks whether (long) pause then stream resumption is supported. + * Can fail only if synchronous and not an access-demuxer. The + * underlying input stream then determines if pause is supported. + * \bug Failing should not be allowed. + * + * arg1= bool * */ + DEMUX_CAN_PAUSE = 0x002, + + /** Whether the stream can be read at an arbitrary pace. + * Cannot fail. + * + * arg1= bool * */ + DEMUX_CAN_CONTROL_PACE, + + /** Retrieves the PTS delay (roughly the default buffer duration). + * Can fail only if synchronous and not an access-demuxer. The + * underlying input stream then determines the PTS delay. + * + * arg1= int64_t * */ + DEMUX_GET_PTS_DELAY = 0x101, + + /** Retrieves stream meta-data. + * Should fail if no meta-data were retrieved. + * + * arg1= vlc_meta_t * */ + DEMUX_GET_META = 0x105, + + /** Retrieves an estimate of signal quality and strength. + * Can fail. + * + * arg1=double *quality, arg2=double *strength */ + DEMUX_GET_SIGNAL = 0x107, + + /** Sets the paused or playing/resumed state. + * + * Streams are initially in playing state. The control always specifies a + * change from paused to playing (false) or from playing to paused (true) + * and streams are initially playing; a no-op cannot be requested. + * + * The control is never used if DEMUX_CAN_PAUSE fails. + * Can fail. + * + * arg1= bool */ + DEMUX_SET_PAUSE_STATE = 0x200, + + /** Seeks to the beginning of a title. + * + * The control is never used if DEMUX_GET_TITLE_INFO fails. + * Can fail. + * + * arg1= int */ + DEMUX_SET_TITLE, + + /** Seeks to the beginning of a chapter of the current title. + * + * The control is never used if DEMUX_GET_TITLE_INFO fails. + * Can fail. + * + * arg1= int */ + DEMUX_SET_SEEKPOINT, /* arg1= int can fail */ + + /** Check which INPUT_UPDATE_XXX flag is set and reset the ones set. + * + * The unsigned* argument is set with the flags needed to be checked, + * on return it contains the values that were reset during the call + * + * This can can fail, in which case flags from demux_t.info.i_update + * are read/reset + * + * arg1= unsigned * */ + DEMUX_TEST_AND_CLEAR_FLAGS, /* arg1= unsigned* can fail */ + + /** Read the title number currently playing + * + * Can fail, in which case demux_t.info.i_title is used + * + * arg1= int * */ + DEMUX_GET_TITLE, /* arg1= int* can fail */ + + /* Read the seekpoint/chapter currently playing + * + * Can fail, in which case demux_t.info.i_seekpoint is used + * + * arg1= int * */ + DEMUX_GET_SEEKPOINT, /* arg1= int* can fail */ + + /* I. Common queries to access_demux and demux */ + /* POSITION double between 0.0 and 1.0 */ + DEMUX_GET_POSITION = 0x300, /* arg1= double * res= */ + DEMUX_SET_POSITION, /* arg1= double arg2= bool b_precise res=can fail */ + + /* LENGTH/TIME in microsecond, 0 if unknown */ + DEMUX_GET_LENGTH, /* arg1= int64_t * res= */ + DEMUX_GET_TIME, /* arg1= int64_t * res= */ + DEMUX_SET_TIME, /* arg1= int64_t arg2= bool b_precise res=can fail */ + + /** + * \todo Document + * + * \warning The prototype is different from STREAM_GET_TITLE_INFO + * + * Can fail, meaning there is only one title and one chapter. + * + * arg1= input_title_t ***, arg2=int *, arg3=int *pi_title_offset(0), + * arg4= int *pi_seekpoint_offset(0) */ + DEMUX_GET_TITLE_INFO, + + /* DEMUX_SET_GROUP/SET_ES only a hint for demuxer (mainly DVB) to allow not + * reading everything (you should not use this to call es_out_Control) + * if you don't know what to do with it, just IGNORE it, it is safe(r) + * -1 means all group, 0 default group (first es added) */ + DEMUX_SET_GROUP, /* arg1= int, arg2=const vlc_list_t * can fail */ + DEMUX_SET_ES, /* arg1= int can fail */ + + /* Ask the demux to demux until the given date at the next pf_demux call + * but not more (and not less, at the precision available of course). + * XXX: not mandatory (except for subtitle demux) but will help a lot + * for multi-input + */ + DEMUX_SET_NEXT_DEMUX_TIME, /* arg1= int64_t can fail */ + /* FPS for correct subtitles handling */ + DEMUX_GET_FPS, /* arg1= double * res=can fail */ + + /* Meta data */ + DEMUX_HAS_UNSUPPORTED_META, /* arg1= bool * res can fail */ + + /* Attachments */ + DEMUX_GET_ATTACHMENTS, /* arg1=input_attachment_t***, int* res=can fail */ + + /* RECORD you are ensured that it is never called twice with the same state + * you should accept it only if the stream can be recorded without + * any modification or header addition. */ + DEMUX_CAN_RECORD, /* arg1=bool* res=can fail(assume false) */ + /** + * \todo Document + * + * \warning The prototype is different from STREAM_SET_RECORD_STATE + * + * The control is never used if DEMUX_CAN_RECORD fails or returns false. + * Can fail. + * + * arg1= bool */ + DEMUX_SET_RECORD_STATE, + + /* II. Specific access_demux queries */ + + /* DEMUX_CAN_CONTROL_RATE is called only if DEMUX_CAN_CONTROL_PACE has + * returned false. *pb_rate should be true when the rate can be changed + * (using DEMUX_SET_RATE). */ + DEMUX_CAN_CONTROL_RATE, /* arg1= bool*pb_rate */ + /* DEMUX_SET_RATE is called only if DEMUX_CAN_CONTROL_RATE has returned true. + * It should return the value really used in *pi_rate */ + DEMUX_SET_RATE, /* arg1= int*pi_rate can fail */ + + /** Checks whether the stream is actually a playlist, rather than a real + * stream. + * + * \warning The prototype is different from STREAM_IS_DIRECTORY. + * + * Can fail if the stream is not a playlist (same as returning false). + * + * arg1= bool * */ + DEMUX_IS_PLAYLIST, + + /* Menu (VCD/DVD/BD) Navigation */ + /** Activate the navigation item selected. Can fail */ + DEMUX_NAV_ACTIVATE, + /** Use the up arrow to select a navigation item above. Can fail */ + DEMUX_NAV_UP, + /** Use the down arrow to select a navigation item under. Can fail */ + DEMUX_NAV_DOWN, + /** Use the left arrow to select a navigation item on the left. Can fail */ + DEMUX_NAV_LEFT, + /** Use the right arrow to select a navigation item on the right. Can fail */ + DEMUX_NAV_RIGHT, + /** Activate the popup Menu (for BD). Can fail */ + DEMUX_NAV_POPUP, + /** Activate disc Root Menu. Can fail */ + DEMUX_NAV_MENU, /* res=can fail */ + /** Enable/Disable a demux filter + * \warning This has limited support, and is likely to break if more than + * a single demux_filter is present in the chain. This is not guaranteed to + * work in future VLC versions, nor with all demux filters + */ + DEMUX_FILTER_ENABLE, + DEMUX_FILTER_DISABLE +}; + +/************************************************************************* + * Main Demux + *************************************************************************/ + +/* stream_t *s could be null and then it mean a access+demux in one */ +VLC_API demux_t *demux_New( vlc_object_t *p_obj, const char *psz_name, + const char *psz_path, stream_t *s, es_out_t *out ); + +VLC_API void demux_Delete( demux_t * ); + + +VLC_API int demux_vaControlHelper( stream_t *, int64_t i_start, int64_t i_end, + int64_t i_bitrate, int i_align, int i_query, va_list args ); + +VLC_USED static inline int demux_Demux( demux_t *p_demux ) +{ + if( !p_demux->pf_demux ) + return VLC_DEMUXER_SUCCESS; + + return p_demux->pf_demux( p_demux ); +} + +VLC_API int demux_vaControl( demux_t *p_demux, int i_query, va_list args ); + +static inline int demux_Control( demux_t *p_demux, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = demux_vaControl( p_demux, i_query, args ); + va_end( args ); + return i_result; +} + +/************************************************************************* + * Miscellaneous helpers for demuxers + *************************************************************************/ + +static inline void demux_UpdateTitleFromStream( demux_t *demux ) +{ + stream_t *s = demux->s; + unsigned title, seekpoint; + + if( vlc_stream_Control( s, STREAM_GET_TITLE, &title ) == VLC_SUCCESS + && title != (unsigned)demux->info.i_title ) + { + demux->info.i_title = title; + demux->info.i_update |= INPUT_UPDATE_TITLE; + } + + if( vlc_stream_Control( s, STREAM_GET_SEEKPOINT, + &seekpoint ) == VLC_SUCCESS + && seekpoint != (unsigned)demux->info.i_seekpoint ) + { + demux->info.i_seekpoint = seekpoint; + demux->info.i_update |= INPUT_UPDATE_SEEKPOINT; + } +} + +VLC_USED +static inline bool demux_IsPathExtension( demux_t *p_demux, const char *psz_extension ) +{ + const char *name = (p_demux->psz_file != NULL) ? p_demux->psz_file + : p_demux->psz_location; + const char *psz_ext = strrchr ( name, '.' ); + if( !psz_ext || strcasecmp( psz_ext, psz_extension ) ) + return false; + return true; +} + +VLC_USED +static inline bool demux_IsContentType(demux_t *demux, const char *type) +{ + return stream_IsMimeType(demux->s, type); +} + +VLC_USED +static inline bool demux_IsForced( demux_t *p_demux, const char *psz_name ) +{ + if( !p_demux->psz_demux || strcmp( p_demux->psz_demux, psz_name ) ) + return false; + return true; +} + +/** + * This function will create a packetizer suitable for a demuxer that parses + * elementary stream. + * + * The provided es_format_t will be cleaned on error or by + * demux_PacketizerDestroy. + */ +VLC_API decoder_t * demux_PacketizerNew( demux_t *p_demux, es_format_t *p_fmt, const char *psz_msg ) VLC_USED; + +/** + * This function will destroy a packetizer create by demux_PacketizerNew. + */ +VLC_API void demux_PacketizerDestroy( decoder_t *p_packetizer ); + +/* */ +#define DEMUX_INIT_COMMON() do { \ + p_demux->pf_control = Control; \ + p_demux->pf_demux = Demux; \ + p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) ); \ + if( !p_demux->p_sys ) return VLC_ENOMEM;\ + } while(0) + +/** + * \defgroup chained_demux Chained demultiplexer + * Demultiplexers wrapped by another demultiplexer + * @{ + */ + +typedef struct vlc_demux_chained_t vlc_demux_chained_t; + +/** + * Creates a chained demuxer. + * + * This creates a thread running a demuxer whose input stream is generated + * directly by the caller. This typically handles some sort of stream within a + * stream, e.g. MPEG-TS within something else. + * + * \note There are a number of limitations to this approach. The chained + * demuxer is run asynchronously in a separate thread. Most demuxer controls + * are synchronous and therefore unavailable in this case. Also the input + * stream is a simple FIFO, so the chained demuxer cannot perform seeks. + * Lastly, most errors cannot be detected. + * + * \param parent parent VLC object + * \param name chained demux module name (e.g. "ts") + * \param out elementary stream output for the chained demux + * \return a non-NULL pointer on success, NULL on failure. + */ +VLC_API vlc_demux_chained_t *vlc_demux_chained_New(vlc_object_t *parent, + const char *name, + es_out_t *out); + +/** + * Destroys a chained demuxer. + * + * Sends an end-of-stream to the chained demuxer, and releases all underlying + * allocated resources. + */ +VLC_API void vlc_demux_chained_Delete(vlc_demux_chained_t *); + +/** + * Sends data to a chained demuxer. + * + * This queues data for a chained demuxer to consume. + * + * \param block data block to queue + */ +VLC_API void vlc_demux_chained_Send(vlc_demux_chained_t *, block_t *block); + +/** + * Controls a chained demuxer. + * + * This performs a demux (i.e. DEMUX_...) control request on a chained + * demux. + * + * \note In most cases, vlc_demux_chained_Control() should be used instead. + * \warning As per vlc_demux_chained_New(), most demux controls are not, and + * cannot be, supported; VLC_EGENERIC is returned. + * + * \param query demux control (see \ref demux_query_e) + * \param args variable arguments (depending on the query) + */ +VLC_API int vlc_demux_chained_ControlVa(vlc_demux_chained_t *, int query, + va_list args); + +static inline int vlc_demux_chained_Control(vlc_demux_chained_t *dc, int query, + ...) +{ + va_list ap; + int ret; + + va_start(ap, query); + ret = vlc_demux_chained_ControlVa(dc, query, ap); + va_end(ap); + return ret; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_dialog.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_dialog.h new file mode 100644 index 0000000..23df3cb --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_dialog.h @@ -0,0 +1,483 @@ +/***************************************************************************** + * vlc_dialog.h: user interaction dialogs + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DIALOG_H_ +#define VLC_DIALOG_H_ +# include + +typedef struct vlc_dialog_provider vlc_dialog_provider; +typedef struct vlc_dialog_id vlc_dialog_id; +typedef struct extension_dialog_t extension_dialog_t; + +/* Called from src/libvlc.c */ +int +libvlc_InternalDialogInit(libvlc_int_t *p_libvlc); + +/* Called from src/libvlc.c */ +void +libvlc_InternalDialogClean(libvlc_int_t *p_libvlc); + +/** + * @defgroup vlc_dialog VLC dialog + * @ingroup interface + * @{ + * @file + * This file declares VLC dialog functions + * @defgroup vlc_dialog_api VLC dialog functions + * In order to interact with the user + * @{ + */ + +/** + * Dialog question type, see vlc_dialog_wait_question() + */ +typedef enum vlc_dialog_question_type +{ + VLC_DIALOG_QUESTION_NORMAL, + VLC_DIALOG_QUESTION_WARNING, + VLC_DIALOG_QUESTION_CRITICAL, +} vlc_dialog_question_type; + +/** + * Sends an error message + * + * This function returns immediately + * + * @param p_obj the VLC object emitting the error + * @param psz_title title of the error dialog + * @param psz_fmt format string for the error message + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_display_error(vlc_object_t *p_obj, const char *psz_title, + const char *psz_fmt, ...) VLC_FORMAT(3,4); +#define vlc_dialog_display_error(a, b, c, ...) \ + vlc_dialog_display_error(VLC_OBJECT(a), b, c, ##__VA_ARGS__) + +/** + * Sends an error message + * + * Equivalent to vlc_dialog_display_error() expect that it's called with a + * va_list. + */ +VLC_API int +vlc_dialog_display_error_va(vlc_object_t *p_obj, const char *psz_title, + const char *psz_fmt, va_list ap); + +/** + * Requests an user name and a password + * + * This function waits until the user dismisses the dialog or responds. It's + * interruptible via vlc_interrupt. In that case, vlc_dialog_cbs.pf_cancel() + * will be invoked. If p_store is not NULL, the user will be asked to store the + * password or not. + * + * @param p_obj the VLC object emitting the dialog + * @param ppsz_username a pointer to the user name provided by the user, it + * must be freed with free() on success + * @param ppsz_password a pointer to the password provided by the user, it must + * be freed with free() on success + * @param p_store a pointer to the store answer provided by the user (optional) + * @param psz_default_username default user name proposed + * @param psz_title title of the login dialog + * @param psz_fmt format string for the login message + * @return < 0 on error, 0 if the user cancelled it, and 1 if ppsz_username and + * ppsz_password are valid. + */ +VLC_API int +vlc_dialog_wait_login(vlc_object_t *p_obj, char **ppsz_username, + char **ppsz_password, bool *p_store, + const char *psz_default_username, + const char *psz_title, const char *psz_fmt, ...) + VLC_FORMAT(7,8); +#define vlc_dialog_wait_login(a, b, c, d, e, f, g, ...) \ + vlc_dialog_wait_login(VLC_OBJECT(a), b, c, d, e, f, g, ##__VA_ARGS__) + +/** + * Requests an user name and a password + * + * Equivalent to vlc_dialog_wait_login() expect that it's called with a + * va_list. + */ +VLC_API int +vlc_dialog_wait_login_va(vlc_object_t *p_obj, char **ppsz_username, + char **ppsz_password, bool *p_store, + const char *psz_default_username, + const char *psz_title, const char *psz_fmt, va_list ap); + +/** + * Asks a total (Yes/No/Cancel) question + * + * This function waits until the user dismisses the dialog or responds. It's + * interruptible via vlc_interrupt. In that case, vlc_dialog_cbs.pf_cancel() + * will be invoked. The psz_cancel is mandatory since this dialog is always + * cancellable by the user. + * + * @param p_obj the VLC object emitting the dialog + * @param i_type question type (severity of the question) + * @param psz_cancel text of the cancel button + * @param psz_action1 first choice/button text (optional) + * @param psz_action2 second choice/button text (optional) + * @param psz_title title of the question dialog + * @param psz_fmt format string for the question message + * @return < 0 on error, 0 if the user cancelled it, 1 on action1, 2 on action2 + */ +VLC_API int +vlc_dialog_wait_question(vlc_object_t *p_obj, + vlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2, const char *psz_title, + const char *psz_fmt, ...) VLC_FORMAT(7,8); +#define vlc_dialog_wait_question(a, b, c, d, e, f, g, ...) \ + vlc_dialog_wait_question(VLC_OBJECT(a), b, c, d, e, f, g, ##__VA_ARGS__) + +/** + * Asks a total (Yes/No/Cancel) question + * + * Equivalent to vlc_dialog_wait_question() expect that it's called with a + * va_list. + */ +VLC_API int +vlc_dialog_wait_question_va(vlc_object_t *p_obj, + vlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2, const char *psz_title, + const char *psz_fmt, va_list ap); + +/** + * Display a progress dialog + * + * This function returns immediately + * + * @param p_obj the VLC object emitting the dialog + * @param b_indeterminate true if the progress dialog is indeterminate + * @param f_position initial position of the progress bar (between 0.0 and 1.0) + * @param psz_cancel text of the cancel button, if NULL the dialog is not + * cancellable (optional) + * @param psz_title title of the progress dialog + * @param psz_fmt format string for the progress message + * @return a valid vlc_dialog_id on success, must be released with + * vlc_dialog_id_release() + */ +VLC_API vlc_dialog_id * +vlc_dialog_display_progress(vlc_object_t *p_obj, bool b_indeterminate, + float f_position, const char *psz_cancel, + const char *psz_title, const char *psz_fmt, ...) + VLC_FORMAT(6,7); +#define vlc_dialog_display_progress(a, b, c, d, e, f, ...) \ + vlc_dialog_display_progress(VLC_OBJECT(a), b, c, d, e, f, ##__VA_ARGS__) + +/** + * Display a progress dialog + * + * Equivalent to vlc_dialog_display_progress() expect that it's called with a + * va_list. + */ +VLC_API vlc_dialog_id * +vlc_dialog_display_progress_va(vlc_object_t *p_obj, bool b_indeterminate, + float f_position, const char *psz_cancel, + const char *psz_title, const char *psz_fmt, + va_list ap); + +/** + * Update the position of the progress dialog + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog to update + * @param f_position position of the progress bar (between 0.0 and 1.0) + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_update_progress(vlc_object_t *p_obj, vlc_dialog_id *p_id, + float f_position); +#define vlc_dialog_update_progress(a, b, c) \ + vlc_dialog_update_progress(VLC_OBJECT(a), b, c) + +/** + * Update the position and the message of the progress dialog + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog to update + * @param f_position position of the progress bar (between 0.0 and 1.0) + * @param psz_fmt format string for the progress message + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_update_progress_text(vlc_object_t *p_obj, vlc_dialog_id *p_id, + float f_position, const char *psz_fmt, ...) + VLC_FORMAT(4, 5); +#define vlc_dialog_update_progress_text(a, b, c, d, ...) \ + vlc_dialog_update_progress_text(VLC_OBJECT(a), b, c, d, ##__VA_ARGS__) + +/** + * Update the position and the message of the progress dialog + * + * Equivalent to vlc_dialog_update_progress_text() expect that it's called + * with a va_list. + */ +VLC_API int +vlc_dialog_update_progress_text_va(vlc_object_t *p_obj, vlc_dialog_id *p_id, + float f_position, const char *psz_fmt, + va_list ap); + +/** + * Release the dialog id returned by vlc_dialog_display_progress() + * + * It causes the vlc_dialog_cbs.pf_cancel() callback to be invoked. + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog to release + */ +VLC_API void +vlc_dialog_release(vlc_object_t *p_obj, vlc_dialog_id *p_id); +#define vlc_dialog_release(a, b) \ + vlc_dialog_release(VLC_OBJECT(a), b) + +/** + * Return true if the dialog id is cancelled + * + * @param p_obj the VLC object emitting the dialog + * @param p_id id of the dialog + */ +VLC_API bool +vlc_dialog_is_cancelled(vlc_object_t *p_obj, vlc_dialog_id *p_id); +#define vlc_dialog_is_cancelled(a, b) \ + vlc_dialog_is_cancelled(VLC_OBJECT(a), b) + +/** + * @} + * @defgroup vlc_dialog_impl VLC dialog callbacks + * Need to be implemented by GUI modules or libvlc + * @{ + */ + +/** + * Dialog callbacks to be implemented + */ +typedef struct vlc_dialog_cbs +{ + /** + * Called when an error message needs to be displayed + * + * @param p_data opaque pointer for the callback + * @param psz_title title of the dialog + * @param psz_text text of the dialog + */ + void (*pf_display_error)(void *p_data, const char *psz_title, + const char *psz_text); + + /** + * Called when a login dialog needs to be displayed + * + * You can interact with this dialog by calling vlc_dialog_id_post_login() + * to post an answer or vlc_dialog_id_dismiss() to cancel this dialog. + * + * @note to receive this callback, vlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param psz_default_username user name that should be set on the user form + * @param b_ask_store if true, ask the user if he wants to save the + * credentials + */ + void (*pf_display_login)(void *p_data, vlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + const char *psz_default_username, + bool b_ask_store); + + /** + * Called when a question dialog needs to be displayed + * + * You can interact with this dialog by calling vlc_dialog_id_post_action() + * to post an answer or vlc_dialog_id_dismiss() to cancel this dialog. + * + * @note to receive this callback, vlc_dialog_cbs.pf_cancel should not be + * NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param i_type question type (or severity) of the dialog + * @param psz_cancel text of the cancel button + * @param psz_action1 text of the first button, if NULL, don't display this + * button + * @param psz_action2 text of the second button, if NULL, don't display + * this button + */ + void (*pf_display_question)(void *p_data, vlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + vlc_dialog_question_type i_type, + const char *psz_cancel, const char *psz_action1, + const char *psz_action2); + + /** + * Called when a progress dialog needs to be displayed + * + * If cancellable (psz_cancel != NULL), you can cancel this dialog by + * calling vlc_dialog_id_dismiss() + * + * @note to receive this callback, vlc_dialog_cbs.pf_cancel and + * vlc_dialog_cbs.pf_update_progress should not be NULL. + * + * @param p_data opaque pointer for the callback + * @param p_id id used to interact with the dialog + * @param psz_title title of the dialog + * @param psz_text text of the dialog + * @param b_indeterminate true if the progress dialog is indeterminate + * @param f_position initial position of the progress bar (between 0.0 and + * 1.0) + * @param psz_cancel text of the cancel button, if NULL the dialog is not + * cancellable + */ + void (*pf_display_progress)(void *p_data, vlc_dialog_id *p_id, + const char *psz_title, const char *psz_text, + bool b_indeterminate, float f_position, + const char *psz_cancel); + + /** + * Called when a displayed dialog needs to be cancelled + * + * The implementation must call vlc_dialog_id_dismiss() to really release + * the dialog. + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + */ + void (*pf_cancel)(void *p_data, vlc_dialog_id *p_id); + + /** + * Called when a progress dialog needs to be updated + * + * @param p_data opaque pointer for the callback + * @param p_id id of the dialog + * @param f_position osition of the progress bar (between 0.0 and 1.0) + * @param psz_text new text of the progress dialog + */ + void (*pf_update_progress)(void *p_data, vlc_dialog_id *p_id, + float f_position, const char *psz_text); +} vlc_dialog_cbs; + +/** + * Register callbacks to handle VLC dialogs + * + * @param p_cbs a pointer to callbacks, or NULL to unregister callbacks. + * @param p_data opaque pointer for the callback + */ +VLC_API void +vlc_dialog_provider_set_callbacks(vlc_object_t *p_obj, + const vlc_dialog_cbs *p_cbs, void *p_data); +#define vlc_dialog_provider_set_callbacks(a, b, c) \ + vlc_dialog_provider_set_callbacks(VLC_OBJECT(a), b, c) + +/** + * Associate an opaque pointer with the dialog id + */ +VLC_API void +vlc_dialog_id_set_context(vlc_dialog_id *p_id, void *p_context); + +/** + * Return the opaque pointer associated with the dialog id + */ +VLC_API void * +vlc_dialog_id_get_context(vlc_dialog_id *p_id); + +/** + * Post a login answer + * + * After this call, p_id won't be valid anymore + * + * @see vlc_dialog_cbs.pf_display_login + * + * @param p_id id of the dialog + * @param psz_username valid and non empty string + * @param psz_password valid string (can be empty) + * @param b_store if true, store the credentials + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_id_post_login(vlc_dialog_id *p_id, const char *psz_username, + const char *psz_password, bool b_store); + +/** + * Post a question answer + * + * After this call, p_id won't be valid anymore + * + * @see vlc_dialog_cbs.pf_display_question + * + * @param p_id id of the dialog + * @param i_action 1 for action1, 2 for action2 + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_id_post_action(vlc_dialog_id *p_id, int i_action); + +/** + * Dismiss a dialog + * + * After this call, p_id won't be valid anymore + * + * @see vlc_dialog_cbs.pf_cancel + * + * @param p_id id of the dialog + * @return VLC_SUCCESS on success, or a VLC error code on error + */ +VLC_API int +vlc_dialog_id_dismiss(vlc_dialog_id *p_id); + +/** + * @} + * @defgroup vlc_dialog_ext VLC extension dialog functions + * @{ + */ + +VLC_API int +vlc_ext_dialog_update(vlc_object_t *p_obj, extension_dialog_t *dialog); +#define vlc_ext_dialog_update(a, b) \ + vlc_ext_dialog_update(VLC_OBJECT(a), b) + +/** + * Dialog extension callback to be implemented + */ +typedef void (*vlc_dialog_ext_update_cb)(extension_dialog_t *p_ext_dialog, + void *p_data); + +/** + * Register a callback for VLC extension dialog + * + * @param pf_update a pointer to the update callback, or NULL to unregister + * callback + * @param p_data opaque pointer for the callback + */ +VLC_API void +vlc_dialog_provider_set_ext_callback(vlc_object_t *p_obj, + vlc_dialog_ext_update_cb pf_update, + void *p_data); +#define vlc_dialog_provider_set_ext_callback(a, b, c) \ + vlc_dialog_provider_set_ext_callback(VLC_OBJECT(a), b, c) + +/** @} @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_epg.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_epg.h new file mode 100644 index 0000000..7ccfedf --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_epg.h @@ -0,0 +1,120 @@ +/***************************************************************************** + * vlc_epg.h: Electronic Program Guide + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: f7b9044e7c0aa1af4a44066d73f2ead943fc6a46 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EPG_H +#define VLC_EPG_H 1 + +/** + * \file + * This file defines functions and structures for storing dvb epg information + */ + +typedef struct +{ + int64_t i_start; /* Interpreted as a value return by time() */ + uint32_t i_duration; /* Duration of the event in second */ + uint16_t i_id; /* Unique event id withing the event set */ + + char *psz_name; + char *psz_short_description; + char *psz_description; + struct /* Description items in tranmission order */ + { + char *psz_key; + char *psz_value; + } * description_items; + int i_description_items; + + uint8_t i_rating; /* Parental control, set to 0 when undefined */ +} vlc_epg_event_t; + +typedef struct +{ + char *psz_name; + uint32_t i_id; /* Unique identifier for this table / events (partial sets) */ + uint16_t i_source_id;/* Channel / Program reference id this epg relates to */ + size_t i_event; + vlc_epg_event_t **pp_event; + bool b_present; /* Contains present/following or similar, and sets below */ + const vlc_epg_event_t *p_current; /* NULL, or equal to one of the entries in pp_event */ +} vlc_epg_t; + +/** + * Creates a new vlc_epg_event_t* + * + * You must call vlc_epg_event_Delete to release the associated resources. + * + * \p i_id is the event unique id + * \p i_start start in epoch time + * \p i_duration event duration in seconds + */ +VLC_API vlc_epg_event_t * vlc_epg_event_New(uint16_t i_id, + int64_t i_start, uint32_t i_duration); + +/** + * Releases a vlc_epg_event_t*. + */ +VLC_API void vlc_epg_event_Delete(vlc_epg_event_t *p_event); + +/** + * Returns a vlc_epg_event_t * duplicated from \p p_src. + * + */ +VLC_API vlc_epg_event_t * vlc_epg_event_Duplicate(const vlc_epg_event_t *p_src); + +/** + * It creates a new vlc_epg_t* + * + * You must call vlc_epg_Delete to release the associated resource. + * + * \p i_id is computed unique id depending on standard (table id, eit number) + * \p i_source_id is the associated program number + */ +VLC_API vlc_epg_t * vlc_epg_New(uint32_t i_id, uint16_t i_source_id); + +/** + * It releases a vlc_epg_t*. + */ +VLC_API void vlc_epg_Delete(vlc_epg_t *p_epg); + +/** + * It appends a new vlc_epg_event_t to a vlc_epg_t. + * Takes ownership of \p p_evt or returns false + * + * \p p_evt a vlc_epg_event_t * created with vlc_epg_event_New. + */ +VLC_API bool vlc_epg_AddEvent(vlc_epg_t *p_epg, vlc_epg_event_t *p_evt); + +/** + * It set the current event of a vlc_epg_t given a start time + */ +VLC_API void vlc_epg_SetCurrent(vlc_epg_t *p_epg, int64_t i_start); + +/** + * Returns a duplicated \p p_src and its associated events. + * + */ +VLC_API vlc_epg_t * vlc_epg_Duplicate(const vlc_epg_t *p_src); + +#endif + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_es.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_es.h new file mode 100644 index 0000000..fa49a4f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_es.h @@ -0,0 +1,668 @@ +/***************************************************************************** + * vlc_es.h: Elementary stream formats descriptions + ***************************************************************************** + * Copyright (C) 1999-2012 VLC authors and VideoLAN + * $Id: c03fca394aeef77ad642defe241bd5a5ffe5d53d $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_H +#define VLC_ES_H 1 + +#include +#include +#include +#include + +/** + * \file + * This file defines the elementary streams format types + */ + +/** + * video palette data + * \see video_format_t + * \see subs_format_t + */ +#define VIDEO_PALETTE_COLORS_MAX 256 + +struct video_palette_t +{ + int i_entries; /**< to keep the compatibility with libavcodec's palette */ + uint8_t palette[VIDEO_PALETTE_COLORS_MAX][4]; /**< 4-byte RGBA/YUVA palette */ +}; + +/** + * audio replay gain description + */ +#define AUDIO_REPLAY_GAIN_MAX (2) +#define AUDIO_REPLAY_GAIN_TRACK (0) +#define AUDIO_REPLAY_GAIN_ALBUM (1) +typedef struct +{ + /* true if we have the peak value */ + bool pb_peak[AUDIO_REPLAY_GAIN_MAX]; + /* peak value where 1.0 means full sample value */ + float pf_peak[AUDIO_REPLAY_GAIN_MAX]; + + /* true if we have the gain value */ + bool pb_gain[AUDIO_REPLAY_GAIN_MAX]; + /* gain value in dB */ + float pf_gain[AUDIO_REPLAY_GAIN_MAX]; +} audio_replay_gain_t; + + +/** + * Audio channel type + */ +typedef enum audio_channel_type_t +{ + AUDIO_CHANNEL_TYPE_BITMAP, + AUDIO_CHANNEL_TYPE_AMBISONICS, +} audio_channel_type_t; + +/** + * audio format description + */ +struct audio_format_t +{ + vlc_fourcc_t i_format; /**< audio format fourcc */ + unsigned int i_rate; /**< audio sample-rate */ + + /* Describes the channels configuration of the samples (ie. number of + * channels which are available in the buffer, and positions). */ + uint16_t i_physical_channels; + + /* Describes the chan mode, either set from the input + * (demux/codec/packetizer) or overridden by the user, used by audio + * filters. */ + uint16_t i_chan_mode; + + /* Channel type */ + audio_channel_type_t channel_type; + + /* Optional - for A/52, SPDIF and DTS types : */ + /* Bytes used by one compressed frame, depends on bitrate. */ + unsigned int i_bytes_per_frame; + + /* Number of sampleframes contained in one compressed frame. */ + unsigned int i_frame_length; + /* Please note that it may be completely arbitrary - buffers are not + * obliged to contain a integral number of so-called "frames". It's + * just here for the division : + * buffer_size = i_nb_samples * i_bytes_per_frame / i_frame_length + */ + + /* FIXME ? (used by the codecs) */ + unsigned i_bitspersample; + unsigned i_blockalign; + uint8_t i_channels; /* must be <=32 */ +}; + +/* Values available for audio channels */ +#define AOUT_CHAN_CENTER 0x1 +#define AOUT_CHAN_LEFT 0x2 +#define AOUT_CHAN_RIGHT 0x4 +#define AOUT_CHAN_REARCENTER 0x10 +#define AOUT_CHAN_REARLEFT 0x20 +#define AOUT_CHAN_REARRIGHT 0x40 +#define AOUT_CHAN_MIDDLELEFT 0x100 +#define AOUT_CHAN_MIDDLERIGHT 0x200 +#define AOUT_CHAN_LFE 0x1000 + +#define AOUT_CHANS_FRONT (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT) +#define AOUT_CHANS_MIDDLE (AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT) +#define AOUT_CHANS_REAR (AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT) +#define AOUT_CHANS_CENTER (AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_STEREO AOUT_CHANS_2_0 +#define AOUT_CHANS_2_0 (AOUT_CHANS_FRONT) +#define AOUT_CHANS_2_1 (AOUT_CHANS_FRONT | AOUT_CHAN_LFE) +#define AOUT_CHANS_3_0 (AOUT_CHANS_FRONT | AOUT_CHAN_CENTER) +#define AOUT_CHANS_3_1 (AOUT_CHANS_3_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_4_0 (AOUT_CHANS_FRONT | AOUT_CHANS_REAR) +#define AOUT_CHANS_4_1 (AOUT_CHANS_4_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_5_0 (AOUT_CHANS_4_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_5_1 (AOUT_CHANS_5_0 | AOUT_CHAN_LFE) +#define AOUT_CHANS_6_0 (AOUT_CHANS_4_0 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_7_0 (AOUT_CHANS_6_0 | AOUT_CHAN_CENTER) +#define AOUT_CHANS_7_1 (AOUT_CHANS_5_1 | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_8_1 (AOUT_CHANS_7_1 | AOUT_CHAN_REARCENTER) + +#define AOUT_CHANS_4_0_MIDDLE (AOUT_CHANS_FRONT | AOUT_CHANS_MIDDLE) +#define AOUT_CHANS_4_CENTER_REAR (AOUT_CHANS_FRONT | AOUT_CHANS_CENTER) +#define AOUT_CHANS_5_0_MIDDLE (AOUT_CHANS_4_0_MIDDLE | AOUT_CHAN_CENTER) +#define AOUT_CHANS_6_1_MIDDLE (AOUT_CHANS_5_0_MIDDLE | AOUT_CHAN_REARCENTER | AOUT_CHAN_LFE) + +/* Maximum number of mapped channels (or the maximum of bits set in + * i_physical_channels) */ +#define AOUT_CHAN_MAX 9 +/* Maximum number of unmapped channels */ +#define INPUT_CHAN_MAX 64 + +/* Values available for i_chan_mode only */ +#define AOUT_CHANMODE_DUALMONO 0x1 +#define AOUT_CHANMODE_DOLBYSTEREO 0x2 + +/** + * Picture orientation. + */ +typedef enum video_orientation_t +{ + ORIENT_TOP_LEFT = 0, /**< Top line represents top, left column left. */ + ORIENT_TOP_RIGHT, /**< Flipped horizontally */ + ORIENT_BOTTOM_LEFT, /**< Flipped vertically */ + ORIENT_BOTTOM_RIGHT, /**< Rotated 180 degrees */ + ORIENT_LEFT_TOP, /**< Transposed */ + ORIENT_LEFT_BOTTOM, /**< Rotated 90 degrees clockwise */ + ORIENT_RIGHT_TOP, /**< Rotated 90 degrees anti-clockwise */ + ORIENT_RIGHT_BOTTOM, /**< Anti-transposed */ + + ORIENT_NORMAL = ORIENT_TOP_LEFT, + ORIENT_TRANSPOSED = ORIENT_LEFT_TOP, + ORIENT_ANTI_TRANSPOSED = ORIENT_RIGHT_BOTTOM, + ORIENT_HFLIPPED = ORIENT_TOP_RIGHT, + ORIENT_VFLIPPED = ORIENT_BOTTOM_LEFT, + ORIENT_ROTATED_180 = ORIENT_BOTTOM_RIGHT, + ORIENT_ROTATED_270 = ORIENT_LEFT_BOTTOM, + ORIENT_ROTATED_90 = ORIENT_RIGHT_TOP, +} video_orientation_t; +/** Convert EXIF orientation to enum video_orientation_t */ +#define ORIENT_FROM_EXIF(exif) ((0x57642310U >> (4 * ((exif) - 1))) & 7) +/** Convert enum video_orientation_t to EXIF */ +#define ORIENT_TO_EXIF(orient) ((0x76853421U >> (4 * (orient))) & 15) +/** If the orientation is natural or mirrored */ +#define ORIENT_IS_MIRROR(orient) parity(orient) +/** If the orientation swaps dimensions */ +#define ORIENT_IS_SWAP(orient) (((orient) & 4) != 0) +/** Applies horizontal flip to an orientation */ +#define ORIENT_HFLIP(orient) ((orient) ^ 1) +/** Applies vertical flip to an orientation */ +#define ORIENT_VFLIP(orient) ((orient) ^ 2) +/** Applies horizontal flip to an orientation */ +#define ORIENT_ROTATE_180(orient) ((orient) ^ 3) + +typedef enum video_transform_t +{ + TRANSFORM_IDENTITY = ORIENT_NORMAL, + TRANSFORM_HFLIP = ORIENT_HFLIPPED, + TRANSFORM_VFLIP = ORIENT_VFLIPPED, + TRANSFORM_R180 = ORIENT_ROTATED_180, + TRANSFORM_R270 = ORIENT_ROTATED_270, + TRANSFORM_R90 = ORIENT_ROTATED_90, + TRANSFORM_TRANSPOSE = ORIENT_TRANSPOSED, + TRANSFORM_ANTI_TRANSPOSE = ORIENT_ANTI_TRANSPOSED +} video_transform_t; + +typedef enum video_multiview_mode_t +{ + /* No stereoscopy: 2D picture. */ + MULTIVIEW_2D = 0, + + /* Side-by-side with left eye first. */ + MULTIVIEW_STEREO_SBS, + + /* Top-bottom with left eye first. */ + MULTIVIEW_STEREO_TB, + + /* Row sequential with left eye first. */ + MULTIVIEW_STEREO_ROW, + + /* Column sequential with left eye first. */ + MULTIVIEW_STEREO_COL, + + /* Frame sequential with left eye first. */ + MULTIVIEW_STEREO_FRAME, + + /* Checkerboard pattern with left eye first. */ + MULTIVIEW_STEREO_CHECKERBOARD, +} video_multiview_mode_t; + +/** + * Video projection mode. + */ +typedef enum video_projection_mode_t +{ + PROJECTION_MODE_RECTANGULAR = 0, + PROJECTION_MODE_EQUIRECTANGULAR, + + PROJECTION_MODE_CUBEMAP_LAYOUT_STANDARD = 0x100, +} video_projection_mode_t; + +/** + * Video color primaries (a.k.a. chromacities) + */ +typedef enum video_color_primaries_t +{ + COLOR_PRIMARIES_UNDEF, + COLOR_PRIMARIES_BT601_525, + COLOR_PRIMARIES_BT601_625, + COLOR_PRIMARIES_BT709, + COLOR_PRIMARIES_BT2020, + COLOR_PRIMARIES_DCI_P3, + COLOR_PRIMARIES_FCC1953, +#define COLOR_PRIMARIES_SRGB COLOR_PRIMARIES_BT709 +#define COLOR_PRIMARIES_SMTPE_170 COLOR_PRIMARIES_BT601_525 +#define COLOR_PRIMARIES_SMTPE_240 COLOR_PRIMARIES_BT601_525 /* Only differs from 1e10-4 in white Y */ +#define COLOR_PRIMARIES_SMTPE_RP145 COLOR_PRIMARIES_BT601_525 +#define COLOR_PRIMARIES_EBU_3213 COLOR_PRIMARIES_BT601_625 +#define COLOR_PRIMARIES_BT470_BG COLOR_PRIMARIES_BT601_625 +#define COLOR_PRIMARIES_BT470_M COLOR_PRIMARIES_FCC1953 +#define COLOR_PRIMARIES_MAX COLOR_PRIMARIES_FCC1953 +} video_color_primaries_t; + +/** + * Video transfer functions + */ +typedef enum video_transfer_func_t +{ + TRANSFER_FUNC_UNDEF, + TRANSFER_FUNC_LINEAR, + TRANSFER_FUNC_SRGB /*< Gamma 2.2 */, + TRANSFER_FUNC_BT470_BG, + TRANSFER_FUNC_BT470_M, + TRANSFER_FUNC_BT709, + TRANSFER_FUNC_SMPTE_ST2084, + TRANSFER_FUNC_SMPTE_240, + TRANSFER_FUNC_HLG, +#define TRANSFER_FUNC_BT2020 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_170 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_274 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_293 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_SMPTE_296 TRANSFER_FUNC_BT709 +#define TRANSFER_FUNC_ARIB_B67 TRANSFER_FUNC_HLG +#define TRANSFER_FUNC_MAX TRANSFER_FUNC_HLG +} video_transfer_func_t; + +/** + * Video color space (i.e. YCbCr matrices) + */ +typedef enum video_color_space_t +{ + COLOR_SPACE_UNDEF, + COLOR_SPACE_BT601, + COLOR_SPACE_BT709, + COLOR_SPACE_BT2020, +#define COLOR_SPACE_SRGB COLOR_SPACE_BT709 +#define COLOR_SPACE_SMPTE_170 COLOR_SPACE_BT601 +#define COLOR_SPACE_SMPTE_240 COLOR_SPACE_SMPTE_170 +#define COLOR_SPACE_MAX COLOR_SPACE_BT2020 +} video_color_space_t; + +/** + * Video chroma location + */ +typedef enum video_chroma_location_t +{ + CHROMA_LOCATION_UNDEF, + CHROMA_LOCATION_LEFT, /*< Most common in MPEG-2 Video, H.264/265 */ + CHROMA_LOCATION_CENTER, /*< Most common in MPEG-1 Video, JPEG */ + CHROMA_LOCATION_TOP_LEFT, + CHROMA_LOCATION_TOP_CENTER, + CHROMA_LOCATION_BOTTOM_LEFT, + CHROMA_LOCATION_BOTTOM_CENTER, +#define CHROMA_LOCATION_MAX CHROMA_LOCATION_BOTTOM_CENTER +} video_chroma_location_t; + +/** + * video format description + */ +struct video_format_t +{ + vlc_fourcc_t i_chroma; /**< picture chroma */ + + unsigned int i_width; /**< picture width */ + unsigned int i_height; /**< picture height */ + unsigned int i_x_offset; /**< start offset of visible area */ + unsigned int i_y_offset; /**< start offset of visible area */ + unsigned int i_visible_width; /**< width of visible area */ + unsigned int i_visible_height; /**< height of visible area */ + + unsigned int i_bits_per_pixel; /**< number of bits per pixel */ + + unsigned int i_sar_num; /**< sample/pixel aspect ratio */ + unsigned int i_sar_den; + + unsigned int i_frame_rate; /**< frame rate numerator */ + unsigned int i_frame_rate_base; /**< frame rate denominator */ + + uint32_t i_rmask, i_gmask, i_bmask; /**< color masks for RGB chroma */ + int i_rrshift, i_lrshift; + int i_rgshift, i_lgshift; + int i_rbshift, i_lbshift; + video_palette_t *p_palette; /**< video palette from demuxer */ + video_orientation_t orientation; /**< picture orientation */ + video_color_primaries_t primaries; /**< color primaries */ + video_transfer_func_t transfer; /**< transfer function */ + video_color_space_t space; /**< YCbCr color space */ + bool b_color_range_full; /**< 0-255 instead of 16-235 */ + video_chroma_location_t chroma_location; /**< YCbCr chroma location */ + + video_multiview_mode_t multiview_mode; /** Multiview mode, 2D, 3D */ + + video_projection_mode_t projection_mode; /**< projection mode */ + vlc_viewpoint_t pose; + struct { + /* similar to SMPTE ST 2086 mastering display color volume */ + uint16_t primaries[3*2]; /* G,B,R / x,y */ + uint16_t white_point[2]; /* x,y */ + uint32_t max_luminance; + uint32_t min_luminance; + } mastering; + struct { + /* similar to CTA-861.3 content light level */ + uint16_t MaxCLL; /* max content light level */ + uint16_t MaxFALL; /* max frame average light level */ + } lighting; + uint32_t i_cubemap_padding; /**< padding in pixels of the cube map faces */ +}; + +/** + * Initialize a video_format_t structure with chroma 'i_chroma' + * \param p_src pointer to video_format_t structure + * \param i_chroma chroma value to use + */ +static inline void video_format_Init( video_format_t *p_src, vlc_fourcc_t i_chroma ) +{ + memset( p_src, 0, sizeof( video_format_t ) ); + p_src->i_chroma = i_chroma; + vlc_viewpoint_init( &p_src->pose ); +} + +/** + * Copy video_format_t including the palette + * \param p_dst video_format_t to copy to + * \param p_src video_format_t to copy from + */ +static inline int video_format_Copy( video_format_t *p_dst, const video_format_t *p_src ) +{ + memcpy( p_dst, p_src, sizeof( *p_dst ) ); + if( p_src->p_palette ) + { + p_dst->p_palette = (video_palette_t *) malloc( sizeof( video_palette_t ) ); + if( !p_dst->p_palette ) + return VLC_ENOMEM; + memcpy( p_dst->p_palette, p_src->p_palette, sizeof( *p_dst->p_palette ) ); + } + return VLC_SUCCESS; +} + +static inline void video_format_AdjustColorSpace( video_format_t *p_fmt ) +{ + if ( p_fmt->primaries == COLOR_PRIMARIES_UNDEF ) + { + if ( p_fmt->i_visible_height > 576 ) // HD + p_fmt->primaries = COLOR_PRIMARIES_BT709; + else if ( p_fmt->i_visible_height > 525 ) // PAL + p_fmt->primaries = COLOR_PRIMARIES_BT601_625; + else + p_fmt->primaries = COLOR_PRIMARIES_BT601_525; + } + + if ( p_fmt->transfer == TRANSFER_FUNC_UNDEF ) + { + if ( p_fmt->i_visible_height > 576 ) // HD + p_fmt->transfer = TRANSFER_FUNC_BT709; + else + p_fmt->transfer = TRANSFER_FUNC_SRGB; + } + + if ( p_fmt->space == COLOR_SPACE_UNDEF ) + { + if ( p_fmt->i_visible_height > 576 ) // HD + p_fmt->space = COLOR_SPACE_BT709; + else + p_fmt->space = COLOR_SPACE_BT601; + } +} + +/** + * Cleanup and free palette of this video_format_t + * \param p_src video_format_t structure to clean + */ +static inline void video_format_Clean( video_format_t *p_src ) +{ + free( p_src->p_palette ); + memset( p_src, 0, sizeof( video_format_t ) ); +} + +/** + * It will fill up a video_format_t using the given arguments. + * Note that the video_format_t must already be initialized. + */ +VLC_API void video_format_Setup( video_format_t *, vlc_fourcc_t i_chroma, + int i_width, int i_height, int i_visible_width, int i_visible_height, + int i_sar_num, int i_sar_den ); + +/** + * It will copy the crop properties from a video_format_t to another. + */ +VLC_API void video_format_CopyCrop( video_format_t *, const video_format_t * ); + +/** + * It will compute the crop/ar properties when scaling. + */ +VLC_API void video_format_ScaleCropAr( video_format_t *, const video_format_t * ); + +/** + * This function "normalizes" the formats orientation, by switching the a/r according to the orientation, + * producing a format whose orientation is ORIENT_NORMAL. It makes a shallow copy (pallette is not alloc'ed). + */ +VLC_API void video_format_ApplyRotation(video_format_t * /*restrict*/ out, + const video_format_t *in); + +/** + * This function applies the transform operation to fmt. + */ +VLC_API void video_format_TransformBy(video_format_t *fmt, video_transform_t transform); + +/** + * This function applies the transforms necessary to fmt so that the resulting fmt + * has the dst_orientation. + */ +VLC_API void video_format_TransformTo(video_format_t *fmt, video_orientation_t dst_orientation); + +/** + * Returns the operation required to transform src into dst. + */ +VLC_API video_transform_t video_format_GetTransform(video_orientation_t src, video_orientation_t dst); + +/** + * This function will check if the first video format is similar + * to the second one. + */ +VLC_API bool video_format_IsSimilar( const video_format_t *, const video_format_t * ); + +/** + * It prints details about the given video_format_t + */ +VLC_API void video_format_Print( vlc_object_t *, const char *, const video_format_t * ); + + +static inline video_transform_t transform_Inverse( video_transform_t transform ) +{ + switch ( transform ) { + case TRANSFORM_R90: + return TRANSFORM_R270; + case TRANSFORM_R270: + return TRANSFORM_R90; + default: + return transform; + } +} +/** + * subtitles format description + */ +struct subs_format_t +{ + /* the character encoding of the text of the subtitle. + * all gettext recognized shorts can be used */ + char *psz_encoding; + + + int i_x_origin; /**< x coordinate of the subtitle. 0 = left */ + int i_y_origin; /**< y coordinate of the subtitle. 0 = top */ + + struct + { + /* */ + uint32_t palette[16+1]; + + /* the width of the original movie the spu was extracted from */ + int i_original_frame_width; + /* the height of the original movie the spu was extracted from */ + int i_original_frame_height; + } spu; + + struct + { + int i_id; + } dvb; + struct + { + int i_magazine; + int i_page; + } teletext; + struct + { + uint8_t i_channel; + /* Reorder depth of transport video, -1 for no reordering */ + int i_reorder_depth; + } cc; + + text_style_t *p_style; /* Default styles to use */ +}; + +#define SPU_PALETTE_DEFINED 0xbeefbeef + +/** + * ES language definition + */ +typedef struct extra_languages_t +{ + char *psz_language; + char *psz_description; +} extra_languages_t; + +/** ES Categories */ +enum es_format_category_e +{ + UNKNOWN_ES = 0x00, + VIDEO_ES, + AUDIO_ES, + SPU_ES, + DATA_ES, +}; +#define ES_CATEGORY_COUNT (DATA_ES + 1) + +/** + * ES format definition + */ +#define ES_PRIORITY_NOT_SELECTABLE -2 +#define ES_PRIORITY_NOT_DEFAULTABLE -1 +#define ES_PRIORITY_SELECTABLE_MIN 0 +#define ES_PRIORITY_MIN ES_PRIORITY_NOT_SELECTABLE +struct es_format_t +{ + enum es_format_category_e i_cat; /**< ES category */ + vlc_fourcc_t i_codec; /**< FOURCC value as used in vlc */ + vlc_fourcc_t i_original_fourcc; /**< original FOURCC from the container */ + + int i_id; /**< es identifier, where means + -1: let the core mark the right id + >=0: valid id */ + int i_group; /**< group identifier, where means: + -1 : standalone + >= 0 then a "group" (program) is created + for each value */ + int i_priority; /**< priority, where means: + -2 : mean not selectable by the users + -1 : mean not selected by default even + when no other stream + >=0: priority */ + + char *psz_language; /**< human-readable language name */ + char *psz_description; /**< human-readable description of language */ + unsigned i_extra_languages; /**< length in bytes of extra language data pointer */ + extra_languages_t *p_extra_languages; /**< extra language data needed by some decoders */ + + union { + struct { + audio_format_t audio; /**< description of audio format */ + audio_replay_gain_t audio_replay_gain; /*< audio replay gain information */ + }; + video_format_t video; /**< description of video format */ + subs_format_t subs; /**< description of subtitle format */ + }; + + unsigned int i_bitrate; /**< bitrate of this ES */ + int i_profile; /**< codec specific information (like real audio flavor, mpeg audio layer, h264 profile ...) */ + int i_level; /**< codec specific information: indicates maximum restrictions on the stream (resolution, bitrate, codec features ...) */ + + bool b_packetized; /**< whether the data is packetized (ie. not truncated) */ + int i_extra; /**< length in bytes of extra data pointer */ + void *p_extra; /**< extra data needed by some decoders or muxers */ + +}; + +/** + * This function will fill all RGB shift from RGB masks. + */ +VLC_API void video_format_FixRgb( video_format_t * ); + +/** + * This function will initialize a es_format_t structure. + */ +VLC_API void es_format_Init( es_format_t *, int i_cat, vlc_fourcc_t i_codec ); + +/** + * This function will initialize a es_format_t structure from a video_format_t. + */ +VLC_API void es_format_InitFromVideo( es_format_t *, const video_format_t * ); + +/** + * This functions will copy a es_format_t. + */ +VLC_API int es_format_Copy( es_format_t *p_dst, const es_format_t *p_src ); + +/** + * This function will clean up a es_format_t and release all associated + * resources. + * You can call it multiple times on the same structure. + */ +VLC_API void es_format_Clean( es_format_t *fmt ); + +/** + * This function will check if the first ES format is similar + * to the second one. + * + * All descriptive fields are ignored. + */ +VLC_API bool es_format_IsSimilar( const es_format_t *, const es_format_t * ); + +/** + * Changes ES format to another category + * Format must have been properly initialized + */ +static inline void es_format_Change( es_format_t *fmt, int i_cat, vlc_fourcc_t i_codec ) +{ + es_format_Clean( fmt ); + es_format_Init( fmt, i_cat, i_codec ); +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_es_out.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_es_out.h new file mode 100644 index 0000000..d79ab4f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_es_out.h @@ -0,0 +1,183 @@ +/***************************************************************************** + * vlc_es_out.h: es_out (demuxer output) descriptor, queries and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: fe53c2a3d34f76eec76d83032cd0d3111be915aa $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_ES_OUT_H +#define VLC_ES_OUT_H 1 + +/** + * \defgroup es_out ES output + * \ingroup input + * Elementary streams output + * @{ + * \file + * Elementary streams output interface + */ + +enum es_out_query_e +{ + /* set or change the selected ES in its category (audio/video/spu) */ + ES_OUT_SET_ES, /* arg1= es_out_id_t* */ + ES_OUT_RESTART_ES, /* arg1= es_out_id_t* */ + ES_OUT_RESTART_ALL_ES, /* Deprecated, no effect */ + + /* set 'default' tag on ES (copied across from container) */ + ES_OUT_SET_ES_DEFAULT, /* arg1= es_out_id_t* */ + + /* force (un)selection of the ES (bypass current mode) + XXX: this will not change the state of any other ES ! (see SET_ES) */ + ES_OUT_SET_ES_STATE,/* arg1= es_out_id_t* arg2=bool */ + ES_OUT_GET_ES_STATE,/* arg1= es_out_id_t* arg2=bool* */ + + /* sets es selection policy when in auto mode */ + ES_OUT_SET_ES_CAT_POLICY, /* arg1=es_format_category_e arg2=es_out_policy_e */ + + /* */ + ES_OUT_SET_GROUP, /* arg1= int */ + + /* PCR handling, DTS/PTS will be automatically computed using thoses PCR + * XXX: SET_PCR(_GROUP) are in charge of the pace control. They will wait + * to slow down the demuxer so that it reads at the right speed. + * XXX: if you want PREROLL just call ES_OUT_SET_NEXT_DISPLAY_TIME and send + * as you would normally do. + */ + ES_OUT_SET_PCR, /* arg1=int64_t i_pcr(microsecond!) (using default group 0)*/ + ES_OUT_SET_GROUP_PCR, /* arg1= int i_group, arg2=int64_t i_pcr(microsecond!)*/ + ES_OUT_RESET_PCR, /* no arg */ + + /* Try not to use this one as it is a bit hacky */ + ES_OUT_SET_ES_FMT, /* arg1= es_out_id_t* arg2=es_format_t* */ + + /* Allow preroll of data (data with dts/pts < i_pts for all ES will be decoded but not displayed */ + ES_OUT_SET_NEXT_DISPLAY_TIME, /* arg1=int64_t i_pts(microsecond) */ + /* Set meta data for group (dynamic) (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_GROUP_META, /* arg1=int i_group arg2=const vlc_meta_t */ + /* Set epg for group (dynamic) (The vlc_epg_t is not modified nor released) */ + ES_OUT_SET_GROUP_EPG, /* arg1=int i_group arg2=const vlc_epg_t * */ + ES_OUT_SET_GROUP_EPG_EVENT, /* arg1=int i_group arg2=const vlc_epg_event_t * */ + ES_OUT_SET_EPG_TIME, /* arg1=int int64_t */ + + /* */ + ES_OUT_DEL_GROUP, /* arg1=int i_group */ + + /* Set scrambled state for one es */ + ES_OUT_SET_ES_SCRAMBLED_STATE, /* arg1=int i_group arg2=es_out_id_t* */ + + /* Stop any buffering being done, and ask if es_out has no more data to + * play. + * It will not block and so MUST be used carrefully. The only good reason + * is for interactive playback (like for DVD menu). + * XXX You SHALL call ES_OUT_RESET_PCR before any other es_out_Control/Send calls. */ + ES_OUT_GET_EMPTY, /* arg1=bool* res=cannot fail */ + + /* Set global meta data (The vlc_meta_t is not modified nor released) */ + ES_OUT_SET_META, /* arg1=const vlc_meta_t * */ + + /* PCR system clock manipulation for external clock synchronization */ + ES_OUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + ES_OUT_MODIFY_PCR_SYSTEM, /* arg1=int is_absolute, arg2=mtime_t, res=can fail */ + + ES_OUT_POST_SUBNODE, /* arg1=input_item_node_t *, res=can fail */ + + /* First value usable for private control */ + ES_OUT_PRIVATE_START = 0x10000, +}; + +enum es_out_policy_e +{ + ES_OUT_ES_POLICY_EXCLUSIVE = 0,/* Enforces single ES selection only */ + ES_OUT_ES_POLICY_SIMULTANEOUS, /* Allows multiple ES per cat */ +}; + +struct es_out_t +{ + es_out_id_t *(*pf_add) ( es_out_t *, const es_format_t * ); + int (*pf_send) ( es_out_t *, es_out_id_t *, block_t * ); + void (*pf_del) ( es_out_t *, es_out_id_t * ); + int (*pf_control)( es_out_t *, int i_query, va_list ); + void (*pf_destroy)( es_out_t * ); + + es_out_sys_t *p_sys; +}; + +VLC_USED +static inline es_out_id_t * es_out_Add( es_out_t *out, const es_format_t *fmt ) +{ + return out->pf_add( out, fmt ); +} + +static inline void es_out_Del( es_out_t *out, es_out_id_t *id ) +{ + out->pf_del( out, id ); +} + +static inline int es_out_Send( es_out_t *out, es_out_id_t *id, + block_t *p_block ) +{ + return out->pf_send( out, id, p_block ); +} + +static inline int es_out_vaControl( es_out_t *out, int i_query, va_list args ) +{ + return out->pf_control( out, i_query, args ); +} + +static inline int es_out_Control( es_out_t *out, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = es_out_vaControl( out, i_query, args ); + va_end( args ); + return i_result; +} + +static inline void es_out_Delete( es_out_t *p_out ) +{ + p_out->pf_destroy( p_out ); +} + +static inline int es_out_SetPCR( es_out_t *out, int64_t pcr ) +{ + return es_out_Control( out, ES_OUT_SET_PCR, pcr ); +} + +static inline int es_out_ControlSetMeta( es_out_t *out, const vlc_meta_t *p_meta ) +{ + return es_out_Control( out, ES_OUT_SET_META, p_meta ); +} + +static inline int es_out_ControlGetPcrSystem( es_out_t *out, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return es_out_Control( out, ES_OUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +static inline int es_out_ControlModifyPcrSystem( es_out_t *out, bool b_absolute, mtime_t i_system ) +{ + return es_out_Control( out, ES_OUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_events.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_events.h new file mode 100644 index 0000000..ac4a225 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_events.h @@ -0,0 +1,209 @@ +/***************************************************************************** + * vlc_events.h: events definitions + * Interface used to send events. + ***************************************************************************** + * Copyright (C) 2007 VLC authors and VideoLAN + * $Id: 229f4f677029763a837558932dad3e47b283e61c $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_EVENTS_H +# define VLC_EVENTS_H + +#include +#include + +/** + * \file + * This file is the interface definition for events + * (implementation in src/misc/events.c) + */ + +/***************************************************************************** + * Documentation + *****************************************************************************/ +/* + **** Background + * + * This implements a way to send and receive event for an object (which can be + * a simple C struct or less). + * + * This is in direct concurrency with the Variable based Callback + * (see src/misc/variables.c). + * + * It has the following advantages over Variable based Callback: + * - No need to implement the whole VLC_COMMON_MEMBERS in the object, + * thus it reduce it size. This is especially true for input_item_t which + * doesn't have VLC_COMMON_MEMBERS. This is the first reason of existence of + * this implementation. + * - Libvlc can easily be based upon that. + * - Existing event are clearly declared (in include/vlc_events.h) + * + * + **** Example usage + * + * (vlc_cool_object_t doesn't need to have the VLC_COMMON_MEMBERS.) + * + * struct vlc_cool_object_t + * { + * ... + * vlc_event_manager_t p_event_manager; + * ... + * } + * + * vlc_my_cool_object_new() + * { + * ... + * vlc_event_manager_init( &p_self->p_event_manager, p_self, p_a_libvlc_object ); + * ... + * } + * + * vlc_my_cool_object_release() + * { + * ... + * vlc_event_manager_fini( &p_self->p_event_manager ); + * ... + * } + * + * vlc_my_cool_object_do_something() + * { + * ... + * vlc_event_t event; + * event.type = vlc_MyCoolObjectDidSomething; + * event.u.my_cool_object_did_something.what_it_did = kSomething; + * vlc_event_send( &p_self->p_event_manager, &event ); + * } + * */ + + /***************************************************************************** + * Event Type + *****************************************************************************/ + +/* List of event */ +typedef enum vlc_event_type_t { + /* Input item events */ + vlc_InputItemMetaChanged, + vlc_InputItemSubItemTreeAdded, + vlc_InputItemDurationChanged, + vlc_InputItemPreparsedChanged, + vlc_InputItemNameChanged, + vlc_InputItemInfoChanged, + vlc_InputItemErrorWhenReadingChanged, + vlc_InputItemPreparseEnded, +} vlc_event_type_t; + +typedef struct vlc_event_listeners_group_t +{ + DECL_ARRAY(struct vlc_event_listener_t *) listeners; +} vlc_event_listeners_group_t; + +/* Event manager type */ +typedef struct vlc_event_manager_t +{ + void * p_obj; + vlc_mutex_t lock; + vlc_event_listeners_group_t events[vlc_InputItemPreparseEnded + 1]; +} vlc_event_manager_t; + +/* Event definition */ +typedef struct vlc_event_t +{ + vlc_event_type_t type; + void * p_obj; /* Sender object, automatically filled by vlc_event_send() */ + union vlc_event_type_specific + { + /* Input item events */ + struct vlc_input_item_meta_changed + { + vlc_meta_type_t meta_type; + } input_item_meta_changed; + struct vlc_input_item_subitem_added + { + input_item_t * p_new_child; + } input_item_subitem_added; + struct vlc_input_item_subitem_tree_added + { + input_item_node_t * p_root; + } input_item_subitem_tree_added; + struct vlc_input_item_duration_changed + { + mtime_t new_duration; + } input_item_duration_changed; + struct vlc_input_item_preparsed_changed + { + int new_status; + } input_item_preparsed_changed; + struct vlc_input_item_name_changed + { + const char * new_name; + } input_item_name_changed; + struct vlc_input_item_info_changed + { + void * unused; + } input_item_info_changed; + struct input_item_error_when_reading_changed + { + bool new_value; + } input_item_error_when_reading_changed; + struct input_item_preparse_ended + { + int new_status; + } input_item_preparse_ended; + } u; +} vlc_event_t; + +/* Event callback type */ +typedef void ( *vlc_event_callback_t )( const vlc_event_t *, void * ); + + /***************************************************************************** + * Event manager + *****************************************************************************/ + +/* + * p_obj points to the object that owns the event manager, and from + * which events are sent + */ +void vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj ); + +/* + * Destroy + */ +void vlc_event_manager_fini( vlc_event_manager_t * p_em ); + +/* + * Send an event to the listener attached to this p_em. + */ +void vlc_event_send( vlc_event_manager_t * p_em, vlc_event_t * ); + +/* + * Add a callback for an event. + */ +VLC_API int vlc_event_attach( vlc_event_manager_t * p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +/* + * Remove a callback for an event. + */ +VLC_API void vlc_event_detach( vlc_event_manager_t *p_event_manager, + vlc_event_type_t event_type, + vlc_event_callback_t pf_callback, + void *p_user_data ); + +#endif /* VLC_EVENTS_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_filter.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_filter.h new file mode 100644 index 0000000..3b30dbb --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_filter.h @@ -0,0 +1,470 @@ +/***************************************************************************** + * vlc_filter.h: filter related structures and functions + ***************************************************************************** + * Copyright (C) 1999-2014 VLC authors and VideoLAN + * + * Authors: Gildas Bazin + * Antoine Cellerier + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FILTER_H +#define VLC_FILTER_H 1 + +#include + +/** + * \defgroup filter Filters + * \ingroup output + * Audio, video, text filters + * @{ + * \file + * Filter modules interface + */ + +typedef struct filter_owner_sys_t filter_owner_sys_t; + +typedef struct filter_owner_t +{ + void *sys; + + union + { + struct + { + picture_t * (*buffer_new)( filter_t * ); + } video; + struct + { + subpicture_t * (*buffer_new)( filter_t * ); + } sub; + }; +} filter_owner_t; + +struct vlc_mouse_t; + +/** Structure describing a filter + * @warning BIG FAT WARNING : the code relies on the first 4 members of + * filter_t and decoder_t to be the same, so if you have anything to add, + * do it at the end of the structure. + */ +struct filter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t * p_module; + filter_sys_t * p_sys; + + /* Input format */ + es_format_t fmt_in; + + /* Output format of filter */ + es_format_t fmt_out; + bool b_allow_fmt_out_change; + + /* Name of the "video filter" shortcut that is requested, can be NULL */ + const char * psz_name; + /* Filter configuration */ + config_chain_t * p_cfg; + + union + { + /** Filter a picture (video filter) */ + picture_t * (*pf_video_filter)( filter_t *, picture_t * ); + + /** Filter an audio block (audio filter) */ + block_t * (*pf_audio_filter)( filter_t *, block_t * ); + + /** Blend a subpicture onto a picture (blend) */ + void (*pf_video_blend)( filter_t *, picture_t *, const picture_t *, + int, int, int ); + + /** Generate a subpicture (sub source) */ + subpicture_t *(*pf_sub_source)( filter_t *, mtime_t ); + + /** Filter a subpicture (sub filter) */ + subpicture_t *(*pf_sub_filter)( filter_t *, subpicture_t * ); + + /** Render text (text render) */ + int (*pf_render)( filter_t *, subpicture_region_t *, + subpicture_region_t *, const vlc_fourcc_t * ); + }; + + union + { + /* TODO: video filter drain */ + /** Drain (audio filter) */ + block_t *(*pf_audio_drain) ( filter_t * ); + }; + + /** Flush + * + * Flush (i.e. discard) any internal buffer in a video or audio filter. + */ + void (*pf_flush)( filter_t * ); + + /** Change viewpoint + * + * Pass a new viewpoint to audio filters. Filters like the spatialaudio one + * used for Ambisonics rendering will change its output according to this + * viewpoint. + */ + void (*pf_change_viewpoint)( filter_t *, const vlc_viewpoint_t * ); + + union + { + /** Filter mouse state (video filter). + * + * If non-NULL, you must convert from output to input formats: + * - If VLC_SUCCESS is returned, the mouse state is propagated. + * - Otherwise, the mouse change is not propagated. + * If NULL, the mouse state is considered unchanged and will be + * propagated. */ + int (*pf_video_mouse)( filter_t *, struct vlc_mouse_t *, + const struct vlc_mouse_t *p_old, + const struct vlc_mouse_t *p_new ); + int (*pf_sub_mouse)( filter_t *, const struct vlc_mouse_t *p_old, + const struct vlc_mouse_t *p_new, + const video_format_t * ); + }; + + /* Input attachments + * XXX use filter_GetInputAttachments */ + int (*pf_get_attachments)( filter_t *, input_attachment_t ***, int * ); + + /* Private structure for the owner of the decoder */ + filter_owner_t owner; +}; + +/** + * This function will return a new picture usable by p_filter as an output + * buffer. You have to release it using picture_Release or by returning + * it to the caller as a pf_video_filter return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new picture on success or NULL on failure + */ +static inline picture_t *filter_NewPicture( filter_t *p_filter ) +{ + picture_t *pic = p_filter->owner.video.buffer_new( p_filter ); + if( pic == NULL ) + msg_Warn( p_filter, "can't get output picture" ); + return pic; +} + +/** + * Flush a filter + * + * This function will flush the state of a filter (audio or video). + */ +static inline void filter_Flush( filter_t *p_filter ) +{ + if( p_filter->pf_flush != NULL ) + p_filter->pf_flush( p_filter ); +} + +static inline void filter_ChangeViewpoint( filter_t *p_filter, + const vlc_viewpoint_t *vp) +{ + if( p_filter->pf_change_viewpoint != NULL ) + p_filter->pf_change_viewpoint( p_filter, vp ); +} + +/** + * This function will drain, then flush an audio filter. + */ +static inline block_t *filter_DrainAudio( filter_t *p_filter ) +{ + if( p_filter->pf_audio_drain ) + return p_filter->pf_audio_drain( p_filter ); + else + return NULL; +} + +/** + * This function will return a new subpicture usable by p_filter as an output + * buffer. You have to release it using subpicture_Delete or by returning it to + * the caller as a pf_sub_source return value. + * Provided for convenience. + * + * \param p_filter filter_t object + * \return new subpicture + */ +static inline subpicture_t *filter_NewSubpicture( filter_t *p_filter ) +{ + subpicture_t *subpic = p_filter->owner.sub.buffer_new( p_filter ); + if( subpic == NULL ) + msg_Warn( p_filter, "can't get output subpicture" ); + return subpic; +} + +/** + * This function gives all input attachments at once. + * + * You MUST release the returned values + */ +static inline int filter_GetInputAttachments( filter_t *p_filter, + input_attachment_t ***ppp_attachment, + int *pi_attachment ) +{ + if( !p_filter->pf_get_attachments ) + return VLC_EGENERIC; + return p_filter->pf_get_attachments( p_filter, + ppp_attachment, pi_attachment ); +} + +/** + * This function duplicates every variables from the filter, and adds a proxy + * callback to trigger filter events from obj. + * + * \param restart_cb a vlc_callback_t to call if the event means restarting the + * filter (i.e. an event on a non-command variable) + */ +VLC_API void filter_AddProxyCallbacks( vlc_object_t *obj, filter_t *filter, + vlc_callback_t restart_cb ); +# define filter_AddProxyCallbacks(a, b, c) \ + filter_AddProxyCallbacks(VLC_OBJECT(a), b, c) + +/** + * This function removes the callbacks previously added to every duplicated + * variables, and removes them afterward. + * + * \param restart_cb the same vlc_callback_t passed to filter_AddProxyCallbacks + */ +VLC_API void filter_DelProxyCallbacks( vlc_object_t *obj, filter_t *filter, + vlc_callback_t restart_cb); +# define filter_DelProxyCallbacks(a, b, c) \ + filter_DelProxyCallbacks(VLC_OBJECT(a), b, c) + +/** + * It creates a blend filter. + * + * Only the chroma properties of the dest format is used (chroma + * type, rgb masks and shifts) + */ +VLC_API filter_t * filter_NewBlend( vlc_object_t *, const video_format_t *p_dst_chroma ) VLC_USED; + +/** + * It configures blend filter parameters that are allowed to changed + * after the creation. + */ +VLC_API int filter_ConfigureBlend( filter_t *, int i_dst_width, int i_dst_height, const video_format_t *p_src ); + +/** + * It blends a picture into another one. + * + * The input picture is not modified and not released. + */ +VLC_API int filter_Blend( filter_t *, picture_t *p_dst, int i_dst_x, int i_dst_y, const picture_t *p_src, int i_alpha ); + +/** + * It destroys a blend filter created by filter_NewBlend. + */ +VLC_API void filter_DeleteBlend( filter_t * ); + +/** + * Create a picture_t *(*)( filter_t *, picture_t * ) compatible wrapper + * using a void (*)( filter_t *, picture_t *, picture_t * ) function + * + * Currently used by the chroma video filters + */ +#define VIDEO_FILTER_WRAPPER( name ) \ + static picture_t *name ## _Filter ( filter_t *p_filter, \ + picture_t *p_pic ) \ + { \ + picture_t *p_outpic = filter_NewPicture( p_filter ); \ + if( p_outpic ) \ + { \ + name( p_filter, p_pic, p_outpic ); \ + picture_CopyProperties( p_outpic, p_pic ); \ + } \ + picture_Release( p_pic ); \ + return p_outpic; \ + } + +/** + * Filter chain management API + * The filter chain management API is used to dynamically construct filters + * and add them in a chain. + */ + +typedef struct filter_chain_t filter_chain_t; + +/** + * Create new filter chain + * + * \param p_object pointer to a vlc object + * \param psz_capability vlc capability of filters in filter chain + * \return pointer to a filter chain + */ +filter_chain_t * filter_chain_New( vlc_object_t *, const char *, enum es_format_category_e ) +VLC_USED; +#define filter_chain_New( a, b, c ) filter_chain_New( VLC_OBJECT( a ), b, c ) + +/** + * Creates a new video filter chain. + * + * \param obj pointer to parent VLC object + * \param change whether to allow changing the output format + * \param owner owner video buffer callbacks + * \return new filter chain, or NULL on error + */ +VLC_API filter_chain_t * filter_chain_NewVideo( vlc_object_t *obj, bool change, + const filter_owner_t *owner ) +VLC_USED; +#define filter_chain_NewVideo( a, b, c ) \ + filter_chain_NewVideo( VLC_OBJECT( a ), b, c ) + +/** + * Delete filter chain will delete all filters in the chain and free all + * allocated data. The pointer to the filter chain is then no longer valid. + * + * \param p_chain pointer to filter chain + */ +VLC_API void filter_chain_Delete( filter_chain_t * ); + +/** + * Reset filter chain will delete all filters in the chain and + * reset p_fmt_in and p_fmt_out to the new values. + * + * \param p_chain pointer to filter chain + * \param p_fmt_in new fmt_in params, may be NULL to leave input fmt unchanged + * \param p_fmt_out new fmt_out params, may be NULL to leave output fmt unchanged + */ +VLC_API void filter_chain_Reset( filter_chain_t *, const es_format_t *, const es_format_t * ); + +/** + * Append a filter to the chain. + * + * \param chain filter chain to append a filter to + * \param name filter name + * \param fmt_in filter input format + * \param fmt_out filter output format + * \return a pointer to the filter or NULL on error + */ +VLC_API filter_t *filter_chain_AppendFilter(filter_chain_t *chain, + const char *name, config_chain_t *cfg, const es_format_t *fmt_in, + const es_format_t *fmt_out); + +/** + * Append a conversion to the chain. + * + * \param chain filter chain to append a filter to + * \param fmt_in filter input format + * \param fmt_out filter output format + * \retval 0 on success + * \retval -1 on failure + */ +VLC_API int filter_chain_AppendConverter(filter_chain_t *chain, + const es_format_t *fmt_in, const es_format_t *fmt_out); + +/** + * Append new filter to filter chain from string. + * + * \param chain filter chain to append a filter to + * \param str filters chain nul-terminated string + */ +VLC_API int filter_chain_AppendFromString(filter_chain_t *chain, + const char *str); + +/** + * Delete filter from filter chain. This function also releases the filter + * object and unloads the filter modules. The pointer to p_filter is no + * longer valid after this function successfully returns. + * + * \param chain filter chain to remove the filter from + * \param filter filter to remove from the chain and delete + */ +VLC_API void filter_chain_DeleteFilter(filter_chain_t *chain, + filter_t *filter); + +/** + * Checks if the filter chain is empty. + * + * \param chain pointer to filter chain + * \return true if and only if there are no filters in this filter chain + */ +VLC_API bool filter_chain_IsEmpty(const filter_chain_t *chain); + +/** + * Get last output format of the last element in the filter chain. + * + * \param chain filter chain + */ +VLC_API const es_format_t *filter_chain_GetFmtOut(filter_chain_t *chain); + +/** + * Apply the filter chain to a video picture. + * + * \param chain pointer to filter chain + * \param pic picture to apply filters to + * \return modified picture after applying all video filters + */ +VLC_API picture_t *filter_chain_VideoFilter(filter_chain_t *chain, + picture_t *pic); + +/** + * Flush a video filter chain. + */ +VLC_API void filter_chain_VideoFlush( filter_chain_t * ); + +/** + * Generate subpictures from a chain of subpicture source "filters". + * + * \param chain filter chain + * \param display_date of subpictures + */ +void filter_chain_SubSource(filter_chain_t *chain, spu_t *, + mtime_t display_date); + +/** + * Apply filter chain to subpictures. + * + * \param chain filter chain + * \param subpic subpicture to apply filters on + * \return modified subpicture after applying all subpicture filters + */ +VLC_API subpicture_t *filter_chain_SubFilter(filter_chain_t *chain, + subpicture_t *subpic); + +/** + * Apply the filter chain to a mouse state. + * + * It will be applied from the output to the input. It makes sense only + * for a video filter chain. + * + * The vlc_mouse_t* pointers may be the same. + */ +VLC_API int filter_chain_MouseFilter( filter_chain_t *, struct vlc_mouse_t *, + const struct vlc_mouse_t * ); + +/** + * Inform the filter chain of mouse state. + * + * It makes sense only for a sub source chain. + */ +VLC_API int filter_chain_MouseEvent( filter_chain_t *, + const struct vlc_mouse_t *, + const video_format_t * ); + +int filter_chain_ForEach( filter_chain_t *chain, + int (*cb)( filter_t *, void * ), void *opaque ); + +/** @} */ +#endif /* _VLC_FILTER_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_fingerprinter.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_fingerprinter.h new file mode 100644 index 0000000..dc10644 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_fingerprinter.h @@ -0,0 +1,91 @@ +/***************************************************************************** + * vlc_fingerprinter.h: Fingerprinter abstraction layer + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FINGERPRINTER_H +# define VLC_FINGERPRINTER_H + +#include +#include +#include +#include + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct fingerprinter_sys_t fingerprinter_sys_t; + +struct fingerprint_request_t +{ + input_item_t *p_item; + unsigned int i_duration; /* track length hint in seconds, 0 if unknown */ + struct + { + char *psz_fingerprint; + vlc_array_t metas_array; + } results ; +}; +typedef struct fingerprint_request_t fingerprint_request_t; + +static inline fingerprint_request_t *fingerprint_request_New( input_item_t *p_item ) +{ + fingerprint_request_t *p_r = + ( fingerprint_request_t * ) calloc( 1, sizeof( fingerprint_request_t ) ); + if ( !p_r ) return NULL; + p_r->results.psz_fingerprint = NULL; + p_r->i_duration = 0; + input_item_Hold( p_item ); + p_r->p_item = p_item; + vlc_array_init( & p_r->results.metas_array ); /* shouldn't be needed */ + return p_r; +} + +static inline void fingerprint_request_Delete( fingerprint_request_t *p_f ) +{ + input_item_Release( p_f->p_item ); + free( p_f->results.psz_fingerprint ); + for( size_t i = 0; i < vlc_array_count( & p_f->results.metas_array ); i++ ) + vlc_meta_Delete( (vlc_meta_t *) vlc_array_item_at_index( & p_f->results.metas_array, i ) ); + free( p_f ); +} + +struct fingerprinter_thread_t +{ + VLC_COMMON_MEMBERS + + /* Specific interfaces */ + fingerprinter_sys_t * p_sys; + + module_t * p_module; + + int ( *pf_enqueue ) ( struct fingerprinter_thread_t *f, fingerprint_request_t *r ); + fingerprint_request_t * ( *pf_getresults ) ( struct fingerprinter_thread_t *f ); + void ( *pf_apply ) ( fingerprint_request_t *, size_t i_resultid ); +}; +typedef struct fingerprinter_thread_t fingerprinter_thread_t; + +VLC_API fingerprinter_thread_t *fingerprinter_Create( vlc_object_t *p_this ); +VLC_API void fingerprinter_Destroy( fingerprinter_thread_t *p_fingerprint ); + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_fourcc.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_fourcc.h new file mode 100644 index 0000000..0dc9f52 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_fourcc.h @@ -0,0 +1,692 @@ +/***************************************************************************** + * vlc_fourcc.h: Definition of various FOURCC and helpers + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: 9042a48a9bd206c8fb6228bbb04dbde136c25499 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FOURCC_H +#define VLC_FOURCC_H 1 + +#define VLC_CODEC_UNKNOWN VLC_FOURCC('u','n','d','f') + +/* Video codec */ +#define VLC_CODEC_MPGV VLC_FOURCC('m','p','g','v') +#define VLC_CODEC_MP4V VLC_FOURCC('m','p','4','v') +#define VLC_CODEC_DIV1 VLC_FOURCC('D','I','V','1') +#define VLC_CODEC_DIV2 VLC_FOURCC('D','I','V','2') +#define VLC_CODEC_DIV3 VLC_FOURCC('D','I','V','3') +#define VLC_CODEC_SVQ1 VLC_FOURCC('S','V','Q','1') +#define VLC_CODEC_SVQ3 VLC_FOURCC('S','V','Q','3') +#define VLC_CODEC_H264 VLC_FOURCC('h','2','6','4') +#define VLC_CODEC_H263 VLC_FOURCC('h','2','6','3') +#define VLC_CODEC_H263I VLC_FOURCC('I','2','6','3') +#define VLC_CODEC_H263P VLC_FOURCC('I','L','V','R') +#define VLC_CODEC_FLV1 VLC_FOURCC('F','L','V','1') +#define VLC_CODEC_H261 VLC_FOURCC('h','2','6','1') +#define VLC_CODEC_MJPG VLC_FOURCC('M','J','P','G') +#define VLC_CODEC_MJPGB VLC_FOURCC('m','j','p','b') +#define VLC_CODEC_LJPG VLC_FOURCC('L','J','P','G') +#define VLC_CODEC_WMV1 VLC_FOURCC('W','M','V','1') +#define VLC_CODEC_WMV2 VLC_FOURCC('W','M','V','2') +#define VLC_CODEC_WMV3 VLC_FOURCC('W','M','V','3') +#define VLC_CODEC_WMVA VLC_FOURCC('W','M','V','A') +#define VLC_CODEC_WMVP VLC_FOURCC('W','M','V','P') +#define VLC_CODEC_WMVP2 VLC_FOURCC('W','V','P','2') +#define VLC_CODEC_VC1 VLC_FOURCC('V','C','-','1') +#define VLC_CODEC_DAALA VLC_FOURCC('d','a','a','l') +#define VLC_CODEC_THEORA VLC_FOURCC('t','h','e','o') +#define VLC_CODEC_TARKIN VLC_FOURCC('t','a','r','k') +#define VLC_CODEC_DIRAC VLC_FOURCC('d','r','a','c') +#define VLC_CODEC_OGGSPOTS VLC_FOURCC('S','P','O','T') +#define VLC_CODEC_CAVS VLC_FOURCC('C','A','V','S') +#define VLC_CODEC_NUV VLC_FOURCC('N','J','P','G') +#define VLC_CODEC_RV10 VLC_FOURCC('R','V','1','0') +#define VLC_CODEC_RV13 VLC_FOURCC('R','V','1','3') +#define VLC_CODEC_RV20 VLC_FOURCC('R','V','2','0') +#define VLC_CODEC_RV30 VLC_FOURCC('R','V','3','0') +#define VLC_CODEC_RV40 VLC_FOURCC('R','V','4','0') +#define VLC_CODEC_VP3 VLC_FOURCC('V','P','3',' ') +#define VLC_CODEC_VP5 VLC_FOURCC('V','P','5',' ') +#define VLC_CODEC_VP6 VLC_FOURCC('V','P','6','2') +#define VLC_CODEC_VP6F VLC_FOURCC('V','P','6','F') +#define VLC_CODEC_VP6A VLC_FOURCC('V','P','6','A') +#define VLC_CODEC_MSVIDEO1 VLC_FOURCC('M','S','V','C') +#define VLC_CODEC_FLIC VLC_FOURCC('F','L','I','C') +#define VLC_CODEC_SP5X VLC_FOURCC('S','P','5','X') +#define VLC_CODEC_DV VLC_FOURCC('d','v',' ',' ') +#define VLC_CODEC_MSRLE VLC_FOURCC('m','r','l','e') +#define VLC_CODEC_HUFFYUV VLC_FOURCC('H','F','Y','U') +#define VLC_CODEC_FFVHUFF VLC_FOURCC('F','F','V','H') +#define VLC_CODEC_ASV1 VLC_FOURCC('A','S','V','1') +#define VLC_CODEC_ASV2 VLC_FOURCC('A','S','V','2') +#define VLC_CODEC_FFV1 VLC_FOURCC('F','F','V','1') +#define VLC_CODEC_VCR1 VLC_FOURCC('V','C','R','1') +#define VLC_CODEC_CLJR VLC_FOURCC('C','L','J','R') +#define VLC_CODEC_RPZA VLC_FOURCC('r','p','z','a') +#define VLC_CODEC_SMC VLC_FOURCC('s','m','c',' ') +#define VLC_CODEC_CINEPAK VLC_FOURCC('C','V','I','D') +#define VLC_CODEC_TSCC VLC_FOURCC('T','S','C','C') +#define VLC_CODEC_CSCD VLC_FOURCC('C','S','C','D') +#define VLC_CODEC_ZMBV VLC_FOURCC('Z','M','B','V') +#define VLC_CODEC_VMNC VLC_FOURCC('V','M','n','c') +#define VLC_CODEC_FMVC VLC_FOURCC('F','M','V','C') +#define VLC_CODEC_FRAPS VLC_FOURCC('F','P','S','1') +#define VLC_CODEC_TRUEMOTION1 VLC_FOURCC('D','U','C','K') +#define VLC_CODEC_TRUEMOTION2 VLC_FOURCC('T','M','2','0') +#define VLC_CODEC_QTRLE VLC_FOURCC('r','l','e',' ') +#define VLC_CODEC_QDRAW VLC_FOURCC('q','d','r','w') +#define VLC_CODEC_QPEG VLC_FOURCC('Q','P','E','G') +#define VLC_CODEC_ULTI VLC_FOURCC('U','L','T','I') +#define VLC_CODEC_VIXL VLC_FOURCC('V','I','X','L') +#define VLC_CODEC_LOCO VLC_FOURCC('L','O','C','O') +#define VLC_CODEC_WNV1 VLC_FOURCC('W','N','V','1') +#define VLC_CODEC_AASC VLC_FOURCC('A','A','S','C') +#define VLC_CODEC_INDEO2 VLC_FOURCC('I','V','2','0') +#define VLC_CODEC_INDEO3 VLC_FOURCC('I','V','3','1') +#define VLC_CODEC_INDEO4 VLC_FOURCC('I','V','4','1') +#define VLC_CODEC_INDEO5 VLC_FOURCC('I','V','5','0') +#define VLC_CODEC_FLASHSV VLC_FOURCC('F','S','V','1') +#define VLC_CODEC_KMVC VLC_FOURCC('K','M','V','C') +#define VLC_CODEC_SMACKVIDEO VLC_FOURCC('S','M','K','2') +#define VLC_CODEC_DNXHD VLC_FOURCC('A','V','d','n') +#define VLC_CODEC_8BPS VLC_FOURCC('8','B','P','S') +#define VLC_CODEC_MIMIC VLC_FOURCC('M','L','2','O') +#define VLC_CODEC_INTERPLAY VLC_FOURCC('i','m','v','e') +#define VLC_CODEC_IDCIN VLC_FOURCC('I','D','C','I') +#define VLC_CODEC_4XM VLC_FOURCC('4','X','M','V') +#define VLC_CODEC_ROQ VLC_FOURCC('R','o','Q','v') +#define VLC_CODEC_MDEC VLC_FOURCC('M','D','E','C') +#define VLC_CODEC_VMDVIDEO VLC_FOURCC('V','M','D','V') +#define VLC_CODEC_CDG VLC_FOURCC('C','D','G',' ') +#define VLC_CODEC_FRWU VLC_FOURCC('F','R','W','U') +#define VLC_CODEC_AMV VLC_FOURCC('A','M','V',' ') +#define VLC_CODEC_VP7 VLC_FOURCC('V','P','7','0') +#define VLC_CODEC_VP8 VLC_FOURCC('V','P','8','0') +#define VLC_CODEC_VP9 VLC_FOURCC('V','P','9','0') +#define VLC_CODEC_VP10 VLC_FOURCC('V','P',':','0') +#define VLC_CODEC_AV1 VLC_FOURCC('a','v','0','1') +#define VLC_CODEC_JPEG2000 VLC_FOURCC('J','P','2','K') +#define VLC_CODEC_LAGARITH VLC_FOURCC('L','A','G','S') +#define VLC_CODEC_FLASHSV2 VLC_FOURCC('F','S','V','2') +#define VLC_CODEC_PRORES VLC_FOURCC('a','p','c','n') +#define VLC_CODEC_MXPEG VLC_FOURCC('M','X','P','G') +#define VLC_CODEC_CDXL VLC_FOURCC('C','D','X','L') +#define VLC_CODEC_BMVVIDEO VLC_FOURCC('B','M','V','V') +#define VLC_CODEC_UTVIDEO VLC_FOURCC('U','L','R','A') +#define VLC_CODEC_VBLE VLC_FOURCC('V','B','L','E') +#define VLC_CODEC_DXTORY VLC_FOURCC('x','t','o','r') +#define VLC_CODEC_MSS1 VLC_FOURCC('M','S','S','1') +#define VLC_CODEC_MSS2 VLC_FOURCC('M','S','S','2') +#define VLC_CODEC_MSA1 VLC_FOURCC('M','S','A','1') +#define VLC_CODEC_TSC2 VLC_FOURCC('T','S','C','2') +#define VLC_CODEC_MTS2 VLC_FOURCC('M','T','S','2') +#define VLC_CODEC_HEVC VLC_FOURCC('h','e','v','c') +#define VLC_CODEC_ICOD VLC_FOURCC('i','c','o','d') +#define VLC_CODEC_G2M2 VLC_FOURCC('G','2','M','2') +#define VLC_CODEC_G2M3 VLC_FOURCC('G','2','M','3') +#define VLC_CODEC_G2M4 VLC_FOURCC('G','2','M','4') +#define VLC_CODEC_BINKVIDEO VLC_FOURCC('B','I','K','f') +#define VLC_CODEC_BINKAUDIO_DCT VLC_FOURCC('B','A','U','1') +#define VLC_CODEC_BINKAUDIO_RDFT VLC_FOURCC('B','A','U','2') +#define VLC_CODEC_XAN_WC4 VLC_FOURCC('X','x','a','n') +#define VLC_CODEC_LCL_MSZH VLC_FOURCC('M','S','Z','H') +#define VLC_CODEC_LCL_ZLIB VLC_FOURCC('Z','L','I','B') +#define VLC_CODEC_THP VLC_FOURCC('T','H','P','0') +#define VLC_CODEC_ESCAPE124 VLC_FOURCC('E','1','2','4') +#define VLC_CODEC_KGV1 VLC_FOURCC('K','G','V','1') +#define VLC_CODEC_CLLC VLC_FOURCC('C','L','L','C') +#define VLC_CODEC_AURA VLC_FOURCC('A','U','R','A') +#define VLC_CODEC_FIC VLC_FOURCC('F','I','C','V') +#define VLC_CODEC_TMV VLC_FOURCC('T','M','A','V') +#define VLC_CODEC_XAN_WC3 VLC_FOURCC('X','A','N','3') +#define VLC_CODEC_WS_VQA VLC_FOURCC('W','V','Q','A') +#define VLC_CODEC_MMVIDEO VLC_FOURCC('M','M','V','I') +#define VLC_CODEC_AVS VLC_FOURCC('A','V','S','V') +#define VLC_CODEC_DSICINVIDEO VLC_FOURCC('D','C','I','V') +#define VLC_CODEC_TIERTEXSEQVIDEO VLC_FOURCC('T','S','E','Q') +#define VLC_CODEC_DXA VLC_FOURCC('D','E','X','A') +#define VLC_CODEC_C93 VLC_FOURCC('I','C','9','3') +#define VLC_CODEC_BETHSOFTVID VLC_FOURCC('B','V','I','D') +#define VLC_CODEC_VB VLC_FOURCC('V','B','V','1') +#define VLC_CODEC_RL2 VLC_FOURCC('R','L','V','2') +#define VLC_CODEC_BFI VLC_FOURCC('B','F','&','I') +#define VLC_CODEC_CMV VLC_FOURCC('E','C','M','V') +#define VLC_CODEC_MOTIONPIXELS VLC_FOURCC('M','P','I','X') +#define VLC_CODEC_TGV VLC_FOURCC('T','G','V','V') +#define VLC_CODEC_TGQ VLC_FOURCC('T','G','Q','V') +#define VLC_CODEC_TQI VLC_FOURCC('T','Q','I','V') +#define VLC_CODEC_MAD VLC_FOURCC('M','A','D','V') +#define VLC_CODEC_ANM VLC_FOURCC('A','N','I','M') +#define VLC_CODEC_YOP VLC_FOURCC('Y','O','P','V') +#define VLC_CODEC_JV VLC_FOURCC('J','V','0','0') +#define VLC_CODEC_DFA VLC_FOURCC('D','F','I','A') +#define VLC_CODEC_HNM4_VIDEO VLC_FOURCC('H','N','M','4') +#define VLC_CODEC_TDSC VLC_FOURCC('T','D','S','C') +#define VLC_CODEC_HQX VLC_FOURCC('C','H','Q','X') +#define VLC_CODEC_HQ_HQA VLC_FOURCC('C','U','V','C') +#define VLC_CODEC_HAP VLC_FOURCC('H','A','P','1') +#define VLC_CODEC_DXV VLC_FOURCC('D','X','D','3') +#define VLC_CODEC_CINEFORM VLC_FOURCC('C','F','H','D') +#define VLC_CODEC_SPEEDHQ VLC_FOURCC('S','H','Q','2') +#define VLC_CODEC_PIXLET VLC_FOURCC('p','x','l','t') + +/*********** + * Chromas + ***********/ + +/* Planar YUV */ + +/* Planar YUV 4:1:0 Y:V:U */ +#define VLC_CODEC_YV9 VLC_FOURCC('Y','V','U','9') +/* Planar YUV 4:1:0 Y:U:V */ +#define VLC_CODEC_I410 VLC_FOURCC('I','4','1','0') +/* Planar YUV 4:1:1 Y:U:V */ +#define VLC_CODEC_I411 VLC_FOURCC('I','4','1','1') + +/* Planar YUV 4:2:0 Y:V:U */ +#define VLC_CODEC_YV12 VLC_FOURCC('Y','V','1','2') +/* Planar YUV 4:2:0 Y:U:V 8-bit */ +#define VLC_CODEC_I420 VLC_FOURCC('I','4','2','0') +/* Planar YUV 4:2:0 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I420_9L VLC_FOURCC('I','0','9','L') +#define VLC_CODEC_I420_9B VLC_FOURCC('I','0','9','B') +/* Planar YUV 4:2:0 Y:U:V 10-bit stored on 16 bits LSB */ +#define VLC_CODEC_I420_10L VLC_FOURCC('I','0','A','L') +#define VLC_CODEC_I420_10B VLC_FOURCC('I','0','A','B') +/* Planar YUV 4:2:0 Y:U:V 12-bit stored on 16 bits */ +#define VLC_CODEC_I420_12L VLC_FOURCC('I','0','C','L') +#define VLC_CODEC_I420_12B VLC_FOURCC('I','0','C','B') + +/* Planar YUV 4:2:0 Y:U:V 16-bit stored on 16 bits */ +#define VLC_CODEC_I420_16L VLC_FOURCC('I','0','F','L') +#define VLC_CODEC_I420_16B VLC_FOURCC('I','0','F','B') + +/* Planar YUV 4:2:2 Y:U:V 8-bit */ +#define VLC_CODEC_I422 VLC_FOURCC('I','4','2','2') +/* Planar YUV 4:2:2 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I422_9L VLC_FOURCC('I','2','9','L') +#define VLC_CODEC_I422_9B VLC_FOURCC('I','2','9','B') +/* Planar YUV 4:2:2 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I422_10L VLC_FOURCC('I','2','A','L') +#define VLC_CODEC_I422_10B VLC_FOURCC('I','2','A','B') +/* Planar YUV 4:2:2 Y:U:V 12-bit stored on 16 bits */ +#define VLC_CODEC_I422_12L VLC_FOURCC('I','2','C','L') +#define VLC_CODEC_I422_12B VLC_FOURCC('I','2','C','B') + +/* Planar YUV 4:4:0 Y:U:V */ +#define VLC_CODEC_I440 VLC_FOURCC('I','4','4','0') +/* Planar YUV 4:4:4 Y:U:V 8-bit */ +#define VLC_CODEC_I444 VLC_FOURCC('I','4','4','4') +/* Planar YUV 4:4:4 Y:U:V 9-bit stored on 16 bits */ +#define VLC_CODEC_I444_9L VLC_FOURCC('I','4','9','L') +#define VLC_CODEC_I444_9B VLC_FOURCC('I','4','9','B') +/* Planar YUV 4:4:4 Y:U:V 10-bit stored on 16 bits */ +#define VLC_CODEC_I444_10L VLC_FOURCC('I','4','A','L') +#define VLC_CODEC_I444_10B VLC_FOURCC('I','4','A','B') +/* Planar YUV 4:4:4 Y:U:V 12-bit stored on 16 bits */ +#define VLC_CODEC_I444_12L VLC_FOURCC('I','4','C','L') +#define VLC_CODEC_I444_12B VLC_FOURCC('I','4','C','B') +/* Planar YUV 4:4:4 Y:U:V 16-bit */ +#define VLC_CODEC_I444_16L VLC_FOURCC('I','4','F','L') +#define VLC_CODEC_I444_16B VLC_FOURCC('I','4','F','B') + +/* Planar YUV 4:2:0 Y:U:V full scale */ +#define VLC_CODEC_J420 VLC_FOURCC('J','4','2','0') +/* Planar YUV 4:2:2 Y:U:V full scale */ +#define VLC_CODEC_J422 VLC_FOURCC('J','4','2','2') +/* Planar YUV 4:4:0 Y:U:V full scale */ +#define VLC_CODEC_J440 VLC_FOURCC('J','4','4','0') +/* Planar YUV 4:4:4 Y:U:V full scale */ +#define VLC_CODEC_J444 VLC_FOURCC('J','4','4','4') +/* Palettized YUV with palette element Y:U:V:A */ +#define VLC_CODEC_YUVP VLC_FOURCC('Y','U','V','P') + +/* Planar YUV 4:4:4 Y:U:V:A */ +#define VLC_CODEC_YUVA VLC_FOURCC('Y','U','V','A') +/* Planar YUV 4:2:2 Y:U:V:A */ +#define VLC_CODEC_YUV422A VLC_FOURCC('I','4','2','A') +/* Planar YUV 4:2:0 Y:U:V:A */ +#define VLC_CODEC_YUV420A VLC_FOURCC('I','4','0','A') + +/* Planar Y:U:V:A 4:4:4 10bits */ +#define VLC_CODEC_YUVA_444_10L VLC_FOURCC('Y','A','0','L') +#define VLC_CODEC_YUVA_444_10B VLC_FOURCC('Y','A','0','B') + +/* Semi-planar Y/UV */ + +/* 2 planes Y/UV 4:2:0 */ +#define VLC_CODEC_NV12 VLC_FOURCC('N','V','1','2') +/* 2 planes Y/VU 4:2:0 */ +#define VLC_CODEC_NV21 VLC_FOURCC('N','V','2','1') +/* 2 planes Y/UV 4:2:2 */ +#define VLC_CODEC_NV16 VLC_FOURCC('N','V','1','6') +/* 2 planes Y/VU 4:2:2 */ +#define VLC_CODEC_NV61 VLC_FOURCC('N','V','6','1') +/* 2 planes Y/UV 4:4:4 */ +#define VLC_CODEC_NV24 VLC_FOURCC('N','V','2','4') +/* 2 planes Y/VU 4:4:4 */ +#define VLC_CODEC_NV42 VLC_FOURCC('N','V','4','2') +/* 2 planes Y/UV 4:2:0 10-bit */ +#define VLC_CODEC_P010 VLC_FOURCC('P','0','1','0') + +/* Packed YUV */ + +/* Packed YUV 4:2:2, U:Y:V:Y */ +#define VLC_CODEC_UYVY VLC_FOURCC('U','Y','V','Y') +/* Packed YUV 4:2:2, V:Y:U:Y */ +#define VLC_CODEC_VYUY VLC_FOURCC('V','Y','U','Y') +/* Packed YUV 4:2:2, Y:U:Y:V */ +#define VLC_CODEC_YUYV VLC_FOURCC('Y','U','Y','2') +/* Packed YUV 4:2:2, Y:V:Y:U */ +#define VLC_CODEC_YVYU VLC_FOURCC('Y','V','Y','U') +/* Packed YUV 2:1:1, Y:U:Y:V */ +#define VLC_CODEC_Y211 VLC_FOURCC('Y','2','1','1') +/* Packed YUV 4:2:2, U:Y:V:Y, reverted */ +#define VLC_CODEC_CYUV VLC_FOURCC('c','y','u','v') +/* 10-bit 4:2:2 Component YCbCr */ +#define VLC_CODEC_V210 VLC_FOURCC('v','2','1','0') +/* I420 packed for RTP (RFC 4175) */ +#define VLC_CODEC_R420 VLC_FOURCC('r','4','2','0') +/* Packed YUV 4:4:4 V:U:Y:A */ +#define VLC_CODEC_VUYA VLC_FOURCC('V','U','Y','A') + + +/* RGB */ + +/* Palettized RGB with palette element R:G:B */ +#define VLC_CODEC_RGBP VLC_FOURCC('R','G','B','P') +/* 8 bits RGB */ +#define VLC_CODEC_RGB8 VLC_FOURCC('R','G','B','8') +/* 12 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB12 VLC_FOURCC('R','V','1','2') +/* 15 bits RGB padded to 16 bits */ +#define VLC_CODEC_RGB15 VLC_FOURCC('R','V','1','5') +/* 16 bits RGB */ +#define VLC_CODEC_RGB16 VLC_FOURCC('R','V','1','6') +/* 24 bits RGB */ +#define VLC_CODEC_RGB24 VLC_FOURCC('R','V','2','4') +/* 24 bits RGB padded to 32 bits */ +#define VLC_CODEC_RGB32 VLC_FOURCC('R','V','3','2') +/* 32 bits RGBA */ +#define VLC_CODEC_RGBA VLC_FOURCC('R','G','B','A') +/* 32 bits ARGB */ +#define VLC_CODEC_ARGB VLC_FOURCC('A','R','G','B') +/* 32 bits BGRA */ +#define VLC_CODEC_BGRA VLC_FOURCC('B','G','R','A') +/* 32 bits BGRA 10:10:10:2 */ +#define VLC_CODEC_RGBA10 VLC_FOURCC('R','G','A','0') +/* 64 bits RGBA */ +#define VLC_CODEC_RGBA64 VLC_FOURCC('R','G','A','4') + +/* Planar GBR 4:4:4 8 bits */ +#define VLC_CODEC_GBR_PLANAR VLC_FOURCC('G','B','R','8') +#define VLC_CODEC_GBR_PLANAR_9B VLC_FOURCC('G','B','9','B') +#define VLC_CODEC_GBR_PLANAR_9L VLC_FOURCC('G','B','9','L') +#define VLC_CODEC_GBR_PLANAR_10B VLC_FOURCC('G','B','A','B') +#define VLC_CODEC_GBR_PLANAR_10L VLC_FOURCC('G','B','A','L') +#define VLC_CODEC_GBR_PLANAR_16L VLC_FOURCC('G','B','F','L') +#define VLC_CODEC_GBR_PLANAR_16B VLC_FOURCC('G','B','F','B') + +/* 8 bits grey */ +#define VLC_CODEC_GREY VLC_FOURCC('G','R','E','Y') + +/* VDPAU video surface YCbCr 4:2:0 */ +#define VLC_CODEC_VDPAU_VIDEO_420 VLC_FOURCC('V','D','V','0') +/* VDPAU video surface YCbCr 4:2:2 */ +#define VLC_CODEC_VDPAU_VIDEO_422 VLC_FOURCC('V','D','V','2') +/* VDPAU video surface YCbCr 4:4:4 */ +#define VLC_CODEC_VDPAU_VIDEO_444 VLC_FOURCC('V','D','V','4') +/* VDPAU output surface RGBA */ +#define VLC_CODEC_VDPAU_OUTPUT VLC_FOURCC('V','D','O','R') + +/* VAAPI opaque surface */ +#define VLC_CODEC_VAAPI_420 VLC_FOURCC('V','A','O','P') /* 4:2:0 8 bpc */ +#define VLC_CODEC_VAAPI_420_10BPP VLC_FOURCC('V','A','O','0') /* 4:2:0 10 bpc */ + +/* MediaCodec/IOMX opaque buffer type */ +#define VLC_CODEC_ANDROID_OPAQUE VLC_FOURCC('A','N','O','P') + +/* Broadcom MMAL opaque buffer type */ +#define VLC_CODEC_MMAL_OPAQUE VLC_FOURCC('M','M','A','L') + +/* DXVA2 opaque video surface for use with D3D9 */ +#define VLC_CODEC_D3D9_OPAQUE VLC_FOURCC('D','X','A','9') /* 4:2:0 8 bpc */ +#define VLC_CODEC_D3D9_OPAQUE_10B VLC_FOURCC('D','X','A','0') /* 4:2:0 10 bpc */ + +/* D3D11VA opaque video surface for use with D3D11 */ +#define VLC_CODEC_D3D11_OPAQUE VLC_FOURCC('D','X','1','1') /* 4:2:0 8 bpc */ +#define VLC_CODEC_D3D11_OPAQUE_10B VLC_FOURCC('D','X','1','0') /* 4:2:0 10 bpc */ + +/* CVPixelBuffer opaque buffer type */ +#define VLC_CODEC_CVPX_NV12 VLC_FOURCC('C','V','P','N') +#define VLC_CODEC_CVPX_UYVY VLC_FOURCC('C','V','P','Y') +#define VLC_CODEC_CVPX_I420 VLC_FOURCC('C','V','P','I') +#define VLC_CODEC_CVPX_BGRA VLC_FOURCC('C','V','P','B') +#define VLC_CODEC_CVPX_P010 VLC_FOURCC('C','V','P','P') + +/* Image codec (video) */ +#define VLC_CODEC_PNG VLC_FOURCC('p','n','g',' ') +#define VLC_CODEC_PPM VLC_FOURCC('p','p','m',' ') +#define VLC_CODEC_PGM VLC_FOURCC('p','g','m',' ') +#define VLC_CODEC_PGMYUV VLC_FOURCC('p','g','m','y') +#define VLC_CODEC_PAM VLC_FOURCC('p','a','m',' ') +#define VLC_CODEC_JPEG VLC_FOURCC('j','p','e','g') +#define VLC_CODEC_BPG VLC_FOURCC('B','P','G',0xFB) +#define VLC_CODEC_JPEGLS VLC_FOURCC('M','J','L','S') +#define VLC_CODEC_BMP VLC_FOURCC('b','m','p',' ') +#define VLC_CODEC_TIFF VLC_FOURCC('t','i','f','f') +#define VLC_CODEC_GIF VLC_FOURCC('g','i','f',' ') +#define VLC_CODEC_TARGA VLC_FOURCC('t','g','a',' ') +#define VLC_CODEC_SVG VLC_FOURCC('s','v','g',' ') +#define VLC_CODEC_SGI VLC_FOURCC('s','g','i',' ') +#define VLC_CODEC_PNM VLC_FOURCC('p','n','m',' ') +#define VLC_CODEC_PCX VLC_FOURCC('p','c','x',' ') +#define VLC_CODEC_XWD VLC_FOURCC('X','W','D',' ') +#define VLC_CODEC_TXD VLC_FOURCC('T','X','D',' ') + + +/* Audio codec */ +#define VLC_CODEC_MPGA VLC_FOURCC('m','p','g','a') +#define VLC_CODEC_MP4A VLC_FOURCC('m','p','4','a') +#define VLC_CODEC_ALS VLC_FOURCC('a','l','s',' ') +#define VLC_CODEC_A52 VLC_FOURCC('a','5','2',' ') +#define VLC_CODEC_EAC3 VLC_FOURCC('e','a','c','3') +#define VLC_CODEC_DTS VLC_FOURCC('d','t','s',' ') +#define VLC_CODEC_WMA1 VLC_FOURCC('W','M','A','1') +#define VLC_CODEC_WMA2 VLC_FOURCC('W','M','A','2') +#define VLC_CODEC_WMAP VLC_FOURCC('W','M','A','P') +#define VLC_CODEC_WMAL VLC_FOURCC('W','M','A','L') +#define VLC_CODEC_WMAS VLC_FOURCC('W','M','A','S') +#define VLC_CODEC_FLAC VLC_FOURCC('f','l','a','c') +#define VLC_CODEC_MLP VLC_FOURCC('m','l','p',' ') +#define VLC_CODEC_TRUEHD VLC_FOURCC('t','r','h','d') +#define VLC_CODEC_DVAUDIO VLC_FOURCC('d','v','a','u') +#define VLC_CODEC_SPEEX VLC_FOURCC('s','p','x',' ') +#define VLC_CODEC_OPUS VLC_FOURCC('O','p','u','s') +#define VLC_CODEC_VORBIS VLC_FOURCC('v','o','r','b') +#define VLC_CODEC_MACE3 VLC_FOURCC('M','A','C','3') +#define VLC_CODEC_MACE6 VLC_FOURCC('M','A','C','6') +#define VLC_CODEC_MUSEPACK7 VLC_FOURCC('M','P','C',' ') +#define VLC_CODEC_MUSEPACK8 VLC_FOURCC('M','P','C','K') +#define VLC_CODEC_RA_144 VLC_FOURCC('1','4','_','4') +#define VLC_CODEC_RA_288 VLC_FOURCC('2','8','_','8') +#define VLC_CODEC_INTERPLAY_DPCM VLC_FOURCC('i','d','p','c') +#define VLC_CODEC_ROQ_DPCM VLC_FOURCC('R','o','Q','a') +#define VLC_CODEC_DSICINAUDIO VLC_FOURCC('D','C','I','A') +#define VLC_CODEC_ADPCM_4XM VLC_FOURCC('4','x','m','a') +#define VLC_CODEC_ADPCM_EA VLC_FOURCC('A','D','E','A') +#define VLC_CODEC_ADPCM_XA VLC_FOURCC('x','a',' ',' ') +#define VLC_CODEC_ADPCM_ADX VLC_FOURCC('a','d','x',' ') +#define VLC_CODEC_ADPCM_IMA_WS VLC_FOURCC('A','I','W','S') +#define VLC_CODEC_ADPCM_G722 VLC_FOURCC('g','7','2','2') +#define VLC_CODEC_ADPCM_G726 VLC_FOURCC('g','7','2','6') +#define VLC_CODEC_ADPCM_SWF VLC_FOURCC('S','W','F','a') +#define VLC_CODEC_ADPCM_MS VLC_FOURCC('m','s',0x00,0x02) +#define VLC_CODEC_ADPCM_IMA_WAV VLC_FOURCC('m','s',0x00,0x11) +#define VLC_CODEC_ADPCM_IMA_AMV VLC_FOURCC('i','m','a','v') +#define VLC_CODEC_ADPCM_IMA_QT VLC_FOURCC('i','m','a','4') +#define VLC_CODEC_ADPCM_YAMAHA VLC_FOURCC('m','s',0x00,0x20) +#define VLC_CODEC_ADPCM_DK3 VLC_FOURCC('m','s',0x00,0x62) +#define VLC_CODEC_ADPCM_DK4 VLC_FOURCC('m','s',0x00,0x61) +#define VLC_CODEC_ADPCM_CREATIVE VLC_FOURCC('m','s',0x00,0xC0) +#define VLC_CODEC_ADPCM_SBPRO_2 VLC_FOURCC('m','s',0x00,0xC2) +#define VLC_CODEC_ADPCM_SBPRO_3 VLC_FOURCC('m','s',0x00,0xC3) +#define VLC_CODEC_ADPCM_SBPRO_4 VLC_FOURCC('m','s',0x00,0xC4) +#define VLC_CODEC_ADPCM_THP VLC_FOURCC('T','H','P','A') +#define VLC_CODEC_ADPCM_XA_EA VLC_FOURCC('X','A','J', 0) +#define VLC_CODEC_G723_1 VLC_FOURCC('g','7','2', 0x31) +#define VLC_CODEC_G729 VLC_FOURCC('g','7','2','9') +#define VLC_CODEC_VMDAUDIO VLC_FOURCC('v','m','d','a') +#define VLC_CODEC_AMR_NB VLC_FOURCC('s','a','m','r') +#define VLC_CODEC_AMR_WB VLC_FOURCC('s','a','w','b') +#define VLC_CODEC_ALAC VLC_FOURCC('a','l','a','c') +#define VLC_CODEC_QDM2 VLC_FOURCC('Q','D','M','2') +#define VLC_CODEC_QDMC VLC_FOURCC('Q','D','M','C') +#define VLC_CODEC_COOK VLC_FOURCC('c','o','o','k') +#define VLC_CODEC_SIPR VLC_FOURCC('s','i','p','r') +#define VLC_CODEC_TTA VLC_FOURCC('T','T','A','1') +#define VLC_CODEC_SHORTEN VLC_FOURCC('s','h','n',' ') +#define VLC_CODEC_WAVPACK VLC_FOURCC('W','V','P','K') +#define VLC_CODEC_GSM VLC_FOURCC('g','s','m',' ') +#define VLC_CODEC_GSM_MS VLC_FOURCC('a','g','s','m') +#define VLC_CODEC_ATRAC1 VLC_FOURCC('a','t','r','1') +#define VLC_CODEC_ATRAC3 VLC_FOURCC('a','t','r','c') +#define VLC_CODEC_ATRAC3P VLC_FOURCC('a','t','r','p') +#define VLC_CODEC_IMC VLC_FOURCC(0x1,0x4,0x0,0x0) +#define VLC_CODEC_TRUESPEECH VLC_FOURCC(0x22,0x0,0x0,0x0) +#define VLC_CODEC_NELLYMOSER VLC_FOURCC('N','E','L','L') +#define VLC_CODEC_APE VLC_FOURCC('A','P','E',' ') +#define VLC_CODEC_QCELP VLC_FOURCC('Q','c','l','p') +#define VLC_CODEC_302M VLC_FOURCC('3','0','2','m') +#define VLC_CODEC_DVD_LPCM VLC_FOURCC('l','p','c','m') +#define VLC_CODEC_DVDA_LPCM VLC_FOURCC('a','p','c','m') +#define VLC_CODEC_BD_LPCM VLC_FOURCC('b','p','c','m') +#define VLC_CODEC_WIDI_LPCM VLC_FOURCC('w','p','c','m') +#define VLC_CODEC_SDDS VLC_FOURCC('s','d','d','s') +#define VLC_CODEC_MIDI VLC_FOURCC('M','I','D','I') +#define VLC_CODEC_RALF VLC_FOURCC('R','A','L','F') + +#define VLC_CODEC_S8 VLC_FOURCC('s','8',' ',' ') +#define VLC_CODEC_U8 VLC_FOURCC('u','8',' ',' ') +#define VLC_CODEC_S16L VLC_FOURCC('s','1','6','l') +#define VLC_CODEC_S16L_PLANAR VLC_FOURCC('s','1','l','p') +#define VLC_CODEC_S16B VLC_FOURCC('s','1','6','b') +#define VLC_CODEC_U16L VLC_FOURCC('u','1','6','l') +#define VLC_CODEC_U16B VLC_FOURCC('u','1','6','b') +#define VLC_CODEC_S20B VLC_FOURCC('s','2','0','b') +#define VLC_CODEC_S24L VLC_FOURCC('s','2','4','l') +#define VLC_CODEC_S24B VLC_FOURCC('s','2','4','b') +#define VLC_CODEC_U24L VLC_FOURCC('u','2','4','l') +#define VLC_CODEC_U24B VLC_FOURCC('u','2','4','b') +#define VLC_CODEC_S24L32 VLC_FOURCC('s','2','4','4') +#define VLC_CODEC_S24B32 VLC_FOURCC('S','2','4','4') +#define VLC_CODEC_S32L VLC_FOURCC('s','3','2','l') +#define VLC_CODEC_S32B VLC_FOURCC('s','3','2','b') +#define VLC_CODEC_U32L VLC_FOURCC('u','3','2','l') +#define VLC_CODEC_U32B VLC_FOURCC('u','3','2','b') +#define VLC_CODEC_F32L VLC_FOURCC('f','3','2','l') +#define VLC_CODEC_F32B VLC_FOURCC('f','3','2','b') +#define VLC_CODEC_F64L VLC_FOURCC('f','6','4','l') +#define VLC_CODEC_F64B VLC_FOURCC('f','6','4','b') + +#define VLC_CODEC_ALAW VLC_FOURCC('a','l','a','w') +#define VLC_CODEC_MULAW VLC_FOURCC('m','l','a','w') +#define VLC_CODEC_DAT12 VLC_FOURCC('L','P','1','2') +#define VLC_CODEC_S24DAUD VLC_FOURCC('d','a','u','d') +#define VLC_CODEC_TWINVQ VLC_FOURCC('T','W','I','N') +#define VLC_CODEC_BMVAUDIO VLC_FOURCC('B','M','V','A') +#define VLC_CODEC_ULEAD_DV_AUDIO_NTSC VLC_FOURCC('m','s',0x02,0x15) +#define VLC_CODEC_ULEAD_DV_AUDIO_PAL VLC_FOURCC('m','s',0x02,0x16) +#define VLC_CODEC_INDEO_AUDIO VLC_FOURCC('m','s',0x04,0x02) +#define VLC_CODEC_METASOUND VLC_FOURCC('m','s',0x00,0x75) +#define VLC_CODEC_ON2AVC VLC_FOURCC('m','s',0x05,0x00) +#define VLC_CODEC_TAK VLC_FOURCC('t','a','k',' ') +#define VLC_CODEC_SMACKAUDIO VLC_FOURCC('S','M','K','A') +#define VLC_CODEC_ADPCM_IMA_EA_SEAD VLC_FOURCC('S','E','A','D') +#define VLC_CODEC_ADPCM_EA_R1 VLC_FOURCC('E','A','R','1') +#define VLC_CODEC_ADPCM_IMA_APC VLC_FOURCC('A','I','P','C') + +/* Subtitle */ +#define VLC_CODEC_SPU VLC_FOURCC('s','p','u',' ') +#define VLC_CODEC_DVBS VLC_FOURCC('d','v','b','s') +#define VLC_CODEC_SUBT VLC_FOURCC('s','u','b','t') +#define VLC_CODEC_XSUB VLC_FOURCC('X','S','U','B') +#define VLC_CODEC_SSA VLC_FOURCC('s','s','a',' ') +#define VLC_CODEC_TEXT VLC_FOURCC('T','E','X','T') +#define VLC_CODEC_TELETEXT VLC_FOURCC('t','e','l','x') +#define VLC_CODEC_KATE VLC_FOURCC('k','a','t','e') +#define VLC_CODEC_CMML VLC_FOURCC('c','m','m','l') +#define VLC_CODEC_ITU_T140 VLC_FOURCC('t','1','4','0') +#define VLC_CODEC_USF VLC_FOURCC('u','s','f',' ') +#define VLC_CODEC_OGT VLC_FOURCC('o','g','t',' ') +#define VLC_CODEC_CVD VLC_FOURCC('c','v','d',' ') +#define VLC_CODEC_TX3G VLC_FOURCC('t','x','3','g') +#define VLC_CODEC_ARIB_A VLC_FOURCC('a','r','b','a') +#define VLC_CODEC_ARIB_C VLC_FOURCC('a','r','b','c') +/* Blu-ray Presentation Graphics */ +#define VLC_CODEC_BD_PG VLC_FOURCC('b','d','p','g') +#define VLC_CODEC_BD_TEXT VLC_FOURCC('b','d','t','x') +/* EBU STL (TECH. 3264-E) */ +#define VLC_CODEC_EBU_STL VLC_FOURCC('S','T','L',' ') +#define VLC_CODEC_SCTE_18 VLC_FOURCC('S','C','1','8') +#define VLC_CODEC_SCTE_27 VLC_FOURCC('S','C','2','7') +/* EIA/CEA-608/708 */ +#define VLC_CODEC_CEA608 VLC_FOURCC('c','6','0','8') +#define VLC_CODEC_CEA708 VLC_FOURCC('c','7','0','8') +#define VLC_CODEC_TTML VLC_FOURCC('T','T','M','L') +#define VLC_CODEC_WEBVTT VLC_FOURCC('w','v','t','t') + +/* XYZ colorspace 12 bits packed in 16 bits, organisation |XXX0|YYY0|ZZZ0| */ +#define VLC_CODEC_XYZ12 VLC_FOURCC('X','Y','1','2') + + +/* Special endian dependent values + * The suffic N means Native + * The suffix I means Inverted (ie non native) */ +#ifdef WORDS_BIGENDIAN +# define VLC_CODEC_S16N VLC_CODEC_S16B +# define VLC_CODEC_U16N VLC_CODEC_U16B +# define VLC_CODEC_S24N VLC_CODEC_S24B +# define VLC_CODEC_U24N VLC_CODEC_U24B +# define VLC_CODEC_S32N VLC_CODEC_S32B +# define VLC_CODEC_U32N VLC_CODEC_U32B +# define VLC_CODEC_FL32 VLC_CODEC_F32B +# define VLC_CODEC_FL64 VLC_CODEC_F64B + +# define VLC_CODEC_S16I VLC_CODEC_S16L +# define VLC_CODEC_U16I VLC_CODEC_U16L +# define VLC_CODEC_S24I VLC_CODEC_S24L +# define VLC_CODEC_U24I VLC_CODEC_U24L +# define VLC_CODEC_S32I VLC_CODEC_S32L +# define VLC_CODEC_U32I VLC_CODEC_U32L + +#else +# define VLC_CODEC_S16N VLC_CODEC_S16L +# define VLC_CODEC_U16N VLC_CODEC_U16L +# define VLC_CODEC_S24N VLC_CODEC_S24L +# define VLC_CODEC_U24N VLC_CODEC_U24L +# define VLC_CODEC_S32N VLC_CODEC_S32L +# define VLC_CODEC_U32N VLC_CODEC_U32L +# define VLC_CODEC_FL32 VLC_CODEC_F32L +# define VLC_CODEC_FL64 VLC_CODEC_F64L + +# define VLC_CODEC_S16I VLC_CODEC_S16B +# define VLC_CODEC_U16I VLC_CODEC_U16B +# define VLC_CODEC_S24I VLC_CODEC_S24B +# define VLC_CODEC_U24I VLC_CODEC_U24B +# define VLC_CODEC_S32I VLC_CODEC_S32B +# define VLC_CODEC_U32I VLC_CODEC_U32B +#endif + +/* Non official codecs, used to force a profile in an encoder */ +/* MPEG-1 video */ +#define VLC_CODEC_MP1V VLC_FOURCC('m','p','1','v') +/* MPEG-2 video */ +#define VLC_CODEC_MP2V VLC_FOURCC('m','p','2','v') +/* MPEG-I/II layer 2 audio */ +#define VLC_CODEC_MP2 VLC_FOURCC('m','p','2',' ') +/* MPEG-I/II layer 3 audio */ +#define VLC_CODEC_MP3 VLC_FOURCC('m','p','3',' ') + +/** + * It returns the codec associated to a fourcc within an ES category. + * + * If not found, it will return the given fourcc. + * If found, it will always be one of the VLC_CODEC_ defined above. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodec( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns the codec associated to a fourcc stored in a zero terminated + * string. + * + * If the string is NULL or does not have exactly 4 characters, it will + * return 0, otherwise it behaves like vlc_fourcc_GetCodec. + * + * Provided for convenience. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char * ); + +/** + * It converts the given fourcc to an audio codec when possible. + * + * The fourccs converted are aflt, araw/pcm , twos, sowt. When an incompatible i_bits + * is detected, 0 is returned. + * The other fourccs go through vlc_fourcc_GetCodec and i_bits is not checked. + */ +VLC_API vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits ); + +/** + * It returns the description of the given fourcc or NULL if not found. + * + * You may use UNKNOWN_ES for the ES category if you don't have the information. + */ +VLC_API const char * vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc ); + +/** + * It returns a list (terminated with the value 0) of YUV fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetYUVFallback( vlc_fourcc_t ); + +/** + * It returns a list (terminated with the value 0) of RGB fourccs in + * decreasing priority order for the given chroma. + * + * It will always return a non NULL pointer that must not be freed. + */ +VLC_API const vlc_fourcc_t * vlc_fourcc_GetRGBFallback( vlc_fourcc_t ); + +/** + * It returns true if the given fourcc is YUV and false otherwise. + */ +VLC_API bool vlc_fourcc_IsYUV( vlc_fourcc_t ); + +/** + * It returns true if the two fourccs are equivalent if their U&V planes are + * swapped. + */ +VLC_API bool vlc_fourcc_AreUVPlanesSwapped(vlc_fourcc_t , vlc_fourcc_t ); + +/** + * Chroma related information. + */ +typedef struct { + unsigned plane_count; + struct { + vlc_rational_t w; + vlc_rational_t h; + } p[4]; + unsigned pixel_size; /* Number of bytes per pixel for a plane */ + unsigned pixel_bits; /* Number of bits actually used bits per pixel for a plane */ +} vlc_chroma_description_t; + +/** + * It returns a vlc_chroma_description_t describing the requested fourcc or NULL + * if not found. + */ +VLC_API const vlc_chroma_description_t * vlc_fourcc_GetChromaDescription( vlc_fourcc_t fourcc ) VLC_USED; + +#endif /* _VLC_FOURCC_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_fs.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_fs.h new file mode 100644 index 0000000..8fda513 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_fs.h @@ -0,0 +1,294 @@ +/***************************************************************************** + * vlc_fs.h: File system helpers + ***************************************************************************** + * Copyright © 2006-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_FS_H +#define VLC_FS_H 1 + +#include +#include + +struct stat; +struct iovec; + +#ifdef _WIN32 +# include +# ifndef stat +# define stat _stati64 +# endif +# ifndef fstat +# define fstat _fstati64 +# endif +# ifndef _MSC_VER +# undef lseek +# define lseek _lseeki64 +# endif +#endif + +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + + +/** + * \defgroup os Operating system + * @{ + * \defgroup file File system + * @{ + * + * \file + * The functions in this file help with using low-level Unix-style file + * descriptors, BSD sockets and directories. In general, they retain the + * prototype and most semantics from their respective standard equivalents. + * However, there are a few differences: + * - On Windows, file path arguments are expected in UTF-8 format. + * They are converted to UTF-16 internally, thus enabling access to paths + * outside of the local Windows ANSI code page. + * - On POSIX systems, file descriptors are created with the close-on-exec + * flag set (atomically where possible), so that they do not leak to + * child process after fork-and-exec. + * - vlc_scandir(), inspired by GNU scandir(), passes file names rather than + * dirent structure pointers to its callbacks. + * - vlc_accept() takes an extra boolean for nonblocking mode (compare with + * the flags parameter in POSIX.next accept4()). + * - Writing functions do not emit a SIGPIPE signal in case of broken pipe. + * + * \defgroup fd File descriptors + * @{ + */ + +/** + * Opens a system file handle. + * + * @param filename file path to open (with UTF-8 encoding) + * @param flags open() flags, see the C library open() documentation + * @return a file handle on success, -1 on error (see errno). + * @note Contrary to standard open(), this function returns a file handle + * with the close-on-exec flag preset. + */ +VLC_API int vlc_open(const char *filename, int flags, ...) VLC_USED; + +/** + * Opens a system file handle relative to an existing directory handle. + * + * @param dir directory file descriptor + * @param filename file path to open (with UTF-8 encoding) + * @param flags open() flags, see the C library open() documentation + * @return a file handle on success, -1 on error (see errno). + * @note Contrary to standard open(), this function returns a file handle + * with the close-on-exec flag preset. + */ +VLC_API int vlc_openat(int fd, const char *filename, int flags, ...) VLC_USED; + +VLC_API int vlc_mkstemp( char * ); + +/** + * Duplicates a file descriptor. The new file descriptor has the close-on-exec + * descriptor flag preset. + * @return a new file descriptor, -1 (see errno) + */ +VLC_API int vlc_dup(int) VLC_USED; + +/** + * Creates a pipe (see "man pipe" for further reference). The new file + * descriptors have the close-on-exec flag preset. + * @return 0 on success, -1 on error (see errno) + */ +VLC_API int vlc_pipe(int [2]) VLC_USED; + +/** + * Creates an anonymous regular file descriptor, i.e. a descriptor for a + * temporary file. + * + * The file is initially empty. The storage space is automatically reclaimed + * when all file descriptors referencing it are closed. + * + * The new file descriptor has the close-on-exec flag preset. + * + * @return a file descriptor on success, -1 on error (see errno) + */ +VLC_API int vlc_memfd(void) VLC_USED; + +/** + * Writes data to a file descriptor. Unlike write(), if EPIPE error occurs, + * this function does not generate a SIGPIPE signal. + * @note If the file descriptor is known to be neither a pipe/FIFO nor a + * connection-oriented socket, the normal write() should be used. + */ +VLC_API ssize_t vlc_write(int, const void *, size_t); + +/** + * Writes data from an iovec structure to a file descriptor. Unlike writev(), + * if EPIPE error occurs, this function does not generate a SIGPIPE signal. + */ +VLC_API ssize_t vlc_writev(int, const struct iovec *, int); + +/** + * Closes a file descriptor. + * + * This closes a file descriptor. If this is a last file descriptor for the + * underlying open file, the file is closed too; the exact semantics depend + * on the type of file. + * + * @note The file descriptor is always closed when the function returns, even + * if the function returns an error. The sole exception is if the file + * descriptor was not currently valid, and thus cannot be closed (errno will + * then be set to EBADF). + * + * @param fd file descriptor + * @return Normally, zero is returned. + * If an I/O error is detected before or while closing, the function may return + * -1. Such an error is unrecoverable since the descriptor is closed. + * + * A nul return value does not necessarily imply that all pending I/O + * succeeded, since I/O might still occur asynchronously afterwards. + */ +VLC_API int vlc_close(int fd); + +/** + * @} + */ + +/** + * Finds file/inode information - like stat(). + * @note As far as possible, fstat() should be used instead. + * + * @param filename UTF-8 file path + */ +VLC_API int vlc_stat(const char *filename, struct stat *) VLC_USED; + +/** + * Finds file/inode information, as lstat(). + * Consider using fstat() instead, if possible. + * + * @param filename UTF-8 file path + */ +VLC_API int vlc_lstat(const char *filename, struct stat *) VLC_USED; + +/** + * Removes a file. + * + * @param filename a UTF-8 string with the name of the file you want to delete. + * @return A 0 return value indicates success. A -1 return value indicates an + * error, and an error code is stored in errno + */ +VLC_API int vlc_unlink(const char *filename); + +/** + * Moves a file atomically. This only works within a single file system. + * + * @param oldpath path to the file before the move + * @param newpath intended path to the file after the move + * @return A 0 return value indicates success. A -1 return value indicates an + * error, and an error code is stored in errno + */ +VLC_API int vlc_rename(const char *oldpath, const char *newpath); + +VLC_API FILE * vlc_fopen( const char *filename, const char *mode ) VLC_USED; + +/** + * \defgroup dir Directories + * @{ + */ + +/** + * Opens a DIR pointer. + * + * @param dirname UTF-8 representation of the directory name + * @return a pointer to the DIR struct, or NULL in case of error. + * Release with standard closedir(). + */ +VLC_API DIR *vlc_opendir(const char *dirname) VLC_USED; + +/** + * Reads the next file name from an open directory. + * + * @param dir directory handle as returned by vlc_opendir() + * (must not be used by another thread concurrently) + * + * @return a UTF-8 string of the directory entry. The string is valid until + * the next call to vlc_readdir() or closedir() on the handle. + * If there are no more entries in the directory, NULL is returned. + * If an error occurs, errno is set and NULL is returned. + */ +VLC_API const char *vlc_readdir(DIR *dir) VLC_USED; + +VLC_API int vlc_loaddir( DIR *dir, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); +VLC_API int vlc_scandir( const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ); + +/** + * Creates a directory. + * + * @param dirname a UTF-8 string with the name of the directory that you + * want to create. + * @param mode directory permissions + * @return 0 on success, -1 on error (see errno). + */ +VLC_API int vlc_mkdir(const char *dirname, mode_t mode); + +/** + * Determines the current working directory. + * + * @return the current working directory (must be free()'d) + * or NULL on error + */ +VLC_API char *vlc_getcwd(void) VLC_USED; + +/** @} */ +/** @} */ + +#if defined( _WIN32 ) +typedef struct vlc_DIR +{ + _WDIR *wdir; /* MUST be first, see */ + char *entry; + union + { + DWORD drives; + bool insert_dot_dot; + } u; +} vlc_DIR; + +static inline int vlc_closedir( DIR *dir ) +{ + vlc_DIR *vdir = (vlc_DIR *)dir; + _WDIR *wdir = vdir->wdir; + + free( vdir->entry ); + free( vdir ); + return (wdir != NULL) ? _wclosedir( wdir ) : 0; +} +# undef closedir +# define closedir vlc_closedir + +static inline void vlc_rewinddir( DIR *dir ) +{ + _WDIR *wdir = *(_WDIR **)dir; + + _wrewinddir( wdir ); +} +# undef rewinddir +# define rewinddir vlc_rewinddir +#endif + +#ifdef __ANDROID__ +# define lseek lseek64 +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_gcrypt.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_gcrypt.h new file mode 100644 index 0000000..a04e1b1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_gcrypt.h @@ -0,0 +1,47 @@ +/***************************************************************************** + * vlc_gcrypt.h: VLC thread support for gcrypt + ***************************************************************************** + * Copyright (C) 2004-2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file implements gcrypt support functions in vlc + */ + +#include + +static inline void vlc_gcrypt_init (void) +{ + /* This would need a process-wide static mutex with all libraries linking + * to a given instance of libgcrypt. We cannot do this as we have different + * plugins linking with gcrypt, and some underlying libraries may use it + * behind our back. Only way is to always link gcrypt statically (ouch!) or + * have upstream gcrypt provide one shared object per threading system. */ + static bool done = false; + + vlc_global_lock (VLC_GCRYPT_MUTEX); + if (!done) + { + /* The suggested way for an application to make sure that global_init + * has been called is by using gcry_check_version. (see global_init + * comments in gcrypt sources) */ + gcry_check_version(NULL); + done = true; + } + vlc_global_unlock (VLC_GCRYPT_MUTEX); +} diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_http.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_http.h new file mode 100644 index 0000000..6811e5d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_http.h @@ -0,0 +1,97 @@ +/***************************************************************************** + * vlc_http.h: Shared code for HTTP clients + ***************************************************************************** + * Copyright (C) 2001-2008 VLC authors and VideoLAN + * $Id: ed7e1613da0bc45b680f3887846f80cf118f36a4 $ + * + * Authors: Laurent Aimar + * Christophe Massiot + * Rémi Denis-Courmont + * Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTP_H +#define VLC_HTTP_H 1 + +/** + * \file + * This file defines functions, structures, enums and macros shared between + * HTTP clients. + */ + +#include +#include + +/* RFC 2617: Basic and Digest Access Authentication */ +typedef struct vlc_http_auth_t +{ + char *psz_realm; + char *psz_domain; + char *psz_nonce; + char *psz_opaque; + char *psz_stale; + char *psz_algorithm; + char *psz_qop; + int i_nonce; + char *psz_cnonce; + char *psz_HA1; /* stored H(A1) value if algorithm = "MD5-sess" */ +} vlc_http_auth_t; + + +VLC_API void vlc_http_auth_Init( vlc_http_auth_t * ); +VLC_API void vlc_http_auth_Deinit( vlc_http_auth_t * ); +VLC_API void vlc_http_auth_ParseWwwAuthenticateHeader + ( vlc_object_t *, vlc_http_auth_t * , const char * ); +VLC_API int vlc_http_auth_ParseAuthenticationInfoHeader + ( vlc_object_t *, vlc_http_auth_t *, + const char *, const char *, + const char *, const char *, + const char * ); +VLC_API char *vlc_http_auth_FormatAuthorizationHeader + ( vlc_object_t *, vlc_http_auth_t *, + const char *, const char *, + const char *, const char * ) VLC_USED; + +/* RFC 6265: cookies */ + +typedef struct vlc_http_cookie_jar_t vlc_http_cookie_jar_t; + +VLC_API vlc_http_cookie_jar_t * vlc_http_cookies_new( void ) VLC_USED; +VLC_API void vlc_http_cookies_destroy( vlc_http_cookie_jar_t * p_jar ); + +/** + * Parse a value of an incoming Set-Cookie header and append the + * cookie to the cookie jar if appropriate. + * + * @param jar cookie jar object + * @param cookie header field value of Set-Cookie + * @return true, if the cookie was added, false otherwise + */ +VLC_API bool vlc_http_cookies_store( vlc_http_cookie_jar_t *jar, + const char *cookie, const char *host, const char *path ); + +/** + * Returns a cookie value that match the given URL. + * + * @param p_jar a cookie jar + * @param p_url the URL for which the cookies are returned + * @return A string consisting of semicolon-separated cookie NAME=VALUE pairs. + */ +VLC_API char *vlc_http_cookies_fetch( vlc_http_cookie_jar_t *jar, bool secure, + const char *host, const char *path ); + +#endif /* VLC_HTTP_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_httpd.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_httpd.h new file mode 100644 index 0000000..2cbf035 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_httpd.h @@ -0,0 +1,152 @@ +/***************************************************************************** + * vlc_httpd.h: builtin HTTP/RTSP server. + ***************************************************************************** + * Copyright (C) 2004-2006 VLC authors and VideoLAN + * $Id: 29b8229e7b6baa7a8eedf37f6fdb1e97bf6a9ca7 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_HTTPD_H +#define VLC_HTTPD_H 1 + +/** + * \file + * HTTP/RTSP server API. + */ + +enum +{ + HTTPD_MSG_NONE, + + /* answer */ + HTTPD_MSG_ANSWER, + + /* http request */ + HTTPD_MSG_GET, + HTTPD_MSG_HEAD, + HTTPD_MSG_POST, + + /* rtsp request */ + HTTPD_MSG_OPTIONS, + HTTPD_MSG_DESCRIBE, + HTTPD_MSG_SETUP, + HTTPD_MSG_PLAY, + HTTPD_MSG_PAUSE, + HTTPD_MSG_GETPARAMETER, + HTTPD_MSG_TEARDOWN, + + /* just to track the count of MSG */ + HTTPD_MSG_MAX +}; + +enum +{ + HTTPD_PROTO_NONE, + HTTPD_PROTO_HTTP, /* HTTP/1.x */ + HTTPD_PROTO_RTSP, /* RTSP/1.x */ + HTTPD_PROTO_HTTP0, /* HTTP/0.x */ +}; + +typedef struct httpd_host_t httpd_host_t; +typedef struct httpd_client_t httpd_client_t; +/* create a new host */ +VLC_API httpd_host_t *vlc_http_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_https_HostNew( vlc_object_t * ) VLC_USED; +VLC_API httpd_host_t *vlc_rtsp_HostNew( vlc_object_t * ) VLC_USED; +/* delete a host */ +VLC_API void httpd_HostDelete( httpd_host_t * ); + +typedef struct +{ + char * name; + char * value; +} httpd_header; + +typedef struct httpd_message_t +{ + httpd_client_t *cl; /* NULL if not throught a connection e vlc internal */ + + uint8_t i_type; + uint8_t i_proto; + uint8_t i_version; + + /* for an answer */ + int i_status; + + /* for a query */ + char *psz_url; + /* FIXME find a clean way to handle GET(psz_args) + and POST(body) through the same code */ + uint8_t *psz_args; + + /* options */ + size_t i_headers; + httpd_header *p_headers; + + /* body */ + int64_t i_body_offset; + int i_body; + uint8_t *p_body; + +} httpd_message_t; + +typedef struct httpd_url_t httpd_url_t; +typedef struct httpd_callback_sys_t httpd_callback_sys_t; +typedef int (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, const httpd_message_t *query ); +/* register a new url */ +VLC_API httpd_url_t * httpd_UrlNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password ) VLC_USED; +/* register callback on a url */ +VLC_API int httpd_UrlCatch( httpd_url_t *, int i_msg, httpd_callback_t, httpd_callback_sys_t * ); +/* delete a url */ +VLC_API void httpd_UrlDelete( httpd_url_t * ); + +VLC_API char* httpd_ClientIP( const httpd_client_t *cl, char *, int * ); +VLC_API char* httpd_ServerIP( const httpd_client_t *cl, char *, int * ); + +/* High level */ + +typedef struct httpd_file_t httpd_file_t; +typedef struct httpd_file_sys_t httpd_file_sys_t; +typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_file_t * httpd_FileNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password, httpd_file_callback_t pf_fill, httpd_file_sys_t * ) VLC_USED; +VLC_API httpd_file_sys_t * httpd_FileDelete( httpd_file_t * ); + + +typedef struct httpd_handler_t httpd_handler_t; +typedef int (*httpd_handler_callback_t)( void *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data ); +VLC_API httpd_handler_t * httpd_HandlerNew( httpd_host_t *, const char *psz_url, const char *psz_user, const char *psz_password, httpd_handler_callback_t pf_fill, void * ) VLC_USED; +VLC_API void * httpd_HandlerDelete( httpd_handler_t * ); + +typedef struct httpd_redirect_t httpd_redirect_t; +VLC_API httpd_redirect_t * httpd_RedirectNew( httpd_host_t *, const char *psz_url_dst, const char *psz_url_src ) VLC_USED; +VLC_API void httpd_RedirectDelete( httpd_redirect_t * ); + + +typedef struct httpd_stream_t httpd_stream_t; +VLC_API httpd_stream_t * httpd_StreamNew( httpd_host_t *, const char *psz_url, const char *psz_mime, const char *psz_user, const char *psz_password ) VLC_USED; +VLC_API void httpd_StreamDelete( httpd_stream_t * ); +VLC_API int httpd_StreamHeader( httpd_stream_t *, uint8_t *p_data, int i_data ); +VLC_API int httpd_StreamSend( httpd_stream_t *, const block_t *p_block ); +VLC_API int httpd_StreamSetHTTPHeaders(httpd_stream_t *, const httpd_header *, size_t); + +/* Msg functions facilities */ +VLC_API void httpd_MsgAdd( httpd_message_t *, const char *psz_name, const char *psz_value, ... ) VLC_FORMAT( 3, 4 ); +/* return "" if not found. The string is not allocated */ +VLC_API const char * httpd_MsgGet( const httpd_message_t *, const char *psz_name ); + +#endif /* _VLC_HTTPD_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_image.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_image.h new file mode 100644 index 0000000..2c5896f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_image.h @@ -0,0 +1,81 @@ +/***************************************************************************** + * vlc_image.h : wrapper for image reading/writing facilities + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: 2b308fd0e52f4d4d6e20f95d08e0d63c53822eef $ + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_IMAGE_H +#define VLC_IMAGE_H 1 + +# include +# include + +/** + * \file + * This file defines functions and structures for image conversions in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +struct image_handler_t +{ + picture_t * (*pf_read) ( image_handler_t *, block_t *, + const video_format_t *, video_format_t * ); + picture_t * (*pf_read_url) ( image_handler_t *, const char *, + video_format_t *, video_format_t * ); + block_t * (*pf_write) ( image_handler_t *, picture_t *, + const video_format_t *, const video_format_t * ); + int (*pf_write_url) ( image_handler_t *, picture_t *, + const video_format_t *, video_format_t *, + const char * ); + + picture_t * (*pf_convert) ( image_handler_t *, picture_t *, + const video_format_t *, video_format_t * ); + + /* Private properties */ + vlc_object_t *p_parent; + decoder_t *p_dec; + encoder_t *p_enc; + filter_t *p_filter; + + picture_fifo_t *outfifo; +}; + +VLC_API image_handler_t * image_HandlerCreate( vlc_object_t * ) VLC_USED; +#define image_HandlerCreate( a ) image_HandlerCreate( VLC_OBJECT(a) ) +VLC_API void image_HandlerDelete( image_handler_t * ); + +#define image_Read( a, b, c, d ) a->pf_read( a, b, c, d ) +#define image_ReadUrl( a, b, c, d ) a->pf_read_url( a, b, c, d ) +#define image_Write( a, b, c, d ) a->pf_write( a, b, c, d ) +#define image_WriteUrl( a, b, c, d, e ) a->pf_write_url( a, b, c, d, e ) +#define image_Convert( a, b, c, d ) a->pf_convert( a, b, c, d ) + +VLC_API vlc_fourcc_t image_Type2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Ext2Fourcc( const char *psz_name ); +VLC_API vlc_fourcc_t image_Mime2Fourcc( const char *psz_mime ); + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_IMAGE_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_inhibit.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_inhibit.h new file mode 100644 index 0000000..b1f7330 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_inhibit.h @@ -0,0 +1,54 @@ +/***************************************************************************** + * vlc_inhibit.h: VLC screen saver inhibition + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines the interface for screen-saver inhibition modules + */ + +#ifndef VLC_INHIBIT_H +# define VLC_INHIBIT_H 1 + +typedef struct vlc_inhibit vlc_inhibit_t; +typedef struct vlc_inhibit_sys vlc_inhibit_sys_t; + +enum vlc_inhibit_flags +{ + VLC_INHIBIT_NONE=0 /*< No inhibition */, + VLC_INHIBIT_SUSPEND=0x1 /*< Processor is in use - do not suspend */, + VLC_INHIBIT_DISPLAY=0x2 /*< Display is in use - do not blank/lock */, +#define VLC_INHIBIT_AUDIO (VLC_INHIBIT_SUSPEND) +#define VLC_INHIBIT_VIDEO (VLC_INHIBIT_SUSPEND|VLC_INHIBIT_DISPLAY) +}; + +struct vlc_inhibit +{ + VLC_COMMON_MEMBERS + + vlc_inhibit_sys_t *p_sys; + void (*inhibit) (vlc_inhibit_t *, unsigned flags); +}; + +static inline void vlc_inhibit_Set (vlc_inhibit_t *ih, unsigned flags) +{ + ih->inhibit (ih, flags); +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_input.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_input.h new file mode 100644 index 0000000..85b4d3d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_input.h @@ -0,0 +1,703 @@ +/***************************************************************************** + * vlc_input.h: Core input structures + ***************************************************************************** + * Copyright (C) 1999-2015 VLC authors and VideoLAN + * $Id: d20585ba33030980fa496cd042227b543f10827a $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INPUT_H +#define VLC_INPUT_H 1 + +/** + * \defgroup input Input + * Input thread + * @{ + * \file + * Input thread interface + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +/***************************************************************************** + * Seek point: (generalisation of chapters) + *****************************************************************************/ +struct seekpoint_t +{ + int64_t i_time_offset; + char *psz_name; +}; + +static inline seekpoint_t *vlc_seekpoint_New( void ) +{ + seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) ); + if( !point ) + return NULL; + point->i_time_offset = -1; + point->psz_name = NULL; + return point; +} + +static inline void vlc_seekpoint_Delete( seekpoint_t *point ) +{ + if( !point ) return; + free( point->psz_name ); + free( point ); +} + +static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src ) +{ + seekpoint_t *point = vlc_seekpoint_New(); + if( likely(point) ) + { + if( src->psz_name ) point->psz_name = strdup( src->psz_name ); + point->i_time_offset = src->i_time_offset; + } + return point; +} + +/***************************************************************************** + * Title: + *****************************************************************************/ + +/* input_title_t.i_flags field */ +#define INPUT_TITLE_MENU 0x01 /* Menu title */ +#define INPUT_TITLE_INTERACTIVE 0x02 /* Interactive title. Playback position has no meaning. */ + +typedef struct input_title_t +{ + char *psz_name; + + int64_t i_length; /* Length(microsecond) if known, else 0 */ + + unsigned i_flags; /* Is it a menu or a normal entry */ + + /* Title seekpoint */ + int i_seekpoint; + seekpoint_t **seekpoint; +} input_title_t; + +static inline input_title_t *vlc_input_title_New(void) +{ + input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) ); + if( !t ) + return NULL; + + t->psz_name = NULL; + t->i_flags = 0; + t->i_length = 0; + t->i_seekpoint = 0; + t->seekpoint = NULL; + + return t; +} + +static inline void vlc_input_title_Delete( input_title_t *t ) +{ + int i; + if( t == NULL ) + return; + + free( t->psz_name ); + for( i = 0; i < t->i_seekpoint; i++ ) + vlc_seekpoint_Delete( t->seekpoint[i] ); + free( t->seekpoint ); + free( t ); +} + +static inline input_title_t *vlc_input_title_Duplicate( const input_title_t *t ) +{ + input_title_t *dup = vlc_input_title_New( ); + if( dup == NULL) return NULL; + + if( t->psz_name ) dup->psz_name = strdup( t->psz_name ); + dup->i_flags = t->i_flags; + dup->i_length = t->i_length; + if( t->i_seekpoint > 0 ) + { + dup->seekpoint = (seekpoint_t**)vlc_alloc( t->i_seekpoint, sizeof(seekpoint_t*) ); + if( likely(dup->seekpoint) ) + { + for( int i = 0; i < t->i_seekpoint; i++ ) + dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] ); + dup->i_seekpoint = t->i_seekpoint; + } + } + + return dup; +} + +/***************************************************************************** + * Attachments + *****************************************************************************/ +struct input_attachment_t +{ + char *psz_name; + char *psz_mime; + char *psz_description; + + size_t i_data; + void *p_data; +}; + +static inline void vlc_input_attachment_Delete( input_attachment_t *a ) +{ + if( !a ) + return; + + free( a->p_data ); + free( a->psz_description ); + free( a->psz_mime ); + free( a->psz_name ); + free( a ); +} + +static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name, + const char *psz_mime, + const char *psz_description, + const void *p_data, + size_t i_data ) +{ + input_attachment_t *a = (input_attachment_t *)malloc( sizeof (*a) ); + if( unlikely(a == NULL) ) + return NULL; + + a->psz_name = strdup( psz_name ? psz_name : "" ); + a->psz_mime = strdup( psz_mime ? psz_mime : "" ); + a->psz_description = strdup( psz_description ? psz_description : "" ); + a->i_data = i_data; + a->p_data = malloc( i_data ); + if( i_data > 0 && likely(a->p_data != NULL) ) + memcpy( a->p_data, p_data, i_data ); + + if( unlikely(a->psz_name == NULL || a->psz_mime == NULL + || a->psz_description == NULL || (i_data > 0 && a->p_data == NULL)) ) + { + vlc_input_attachment_Delete( a ); + a = NULL; + } + return a; +} + +static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a ) +{ + return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description, + a->p_data, a->i_data ); +} + +/***************************************************************************** + * input defines/constants. + *****************************************************************************/ + +/** + * This defines an opaque input resource handler. + */ +typedef struct input_resource_t input_resource_t; + +/** + * Main structure representing an input thread. This structure is mostly + * private. The only public fields are read-only and constant. + */ +struct input_thread_t +{ + VLC_COMMON_MEMBERS +}; + +/** + * Record prefix string. + * TODO make it configurable. + */ +#define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%Hh%Mm%Ss-$ N-$ p" + +/***************************************************************************** + * Input events and variables + *****************************************************************************/ + +/** + * \defgroup inputvariable Input variables + * + * The input provides multiples variable you can write to and/or read from. + * + * TODO complete the documentation. + * The read only variables are: + * - "length" + * - "can-seek" (if you can seek, it doesn't say if 'bar display' has be shown + * or not, for that check position != 0.0) + * - "can-pause" + * - "can-rate" + * - "can-rewind" + * - "can-record" (if a stream can be recorded while playing) + * - "teletext-es" (list of id from the spu tracks (spu-es) that are teletext, the + * variable value being the one currently selected, -1 if no teletext) + * - "signal-quality" + * - "signal-strength" + * - "program-scrambled" (if the current program is scrambled) + * - "cache" (level of data cached [0 .. 1]) + * + * The read-write variables are: + * - state (\see input_state_e) + * - rate + * - position + * - time, time-offset + * - title, next-title, prev-title + * - chapter, next-chapter, next-chapter-prev + * - program, audio-es, video-es, spu-es + * - audio-delay, spu-delay + * - bookmark (bookmark list) + * - record + * - frame-next + * - navigation (list of "title %2i") + * - "title %2i" + * + * The variable used for event is + * - intf-event (\see input_event_type_e) + */ + +/** + * Input state + * + * This enum is used by the variable "state" + */ +typedef enum input_state_e +{ + INIT_S = 0, + OPENING_S, + PLAYING_S, + PAUSE_S, + END_S, + ERROR_S, +} input_state_e; + +/** + * Input rate. + * + * It is an float used by the variable "rate" in the + * range [INPUT_RATE_DEFAULT/INPUT_RATE_MAX, INPUT_RATE_DEFAULT/INPUT_RATE_MIN] + * the default value being 1. It represents the ratio of playback speed to + * nominal speed (bigger is faster). + * + * Internally, the rate is stored as a value in the range + * [INPUT_RATE_MIN, INPUT_RATE_MAX]. + * internal rate = INPUT_RATE_DEFAULT / rate variable + */ + +/** + * Default rate value + */ +#define INPUT_RATE_DEFAULT 1000 +/** + * Minimal rate value + */ +#define INPUT_RATE_MIN 32 /* Up to 32/1 */ +/** + * Maximal rate value + */ +#define INPUT_RATE_MAX 32000 /* Up to 1/32 */ + +/** + * Input events + * + * You can catch input event by adding a callback on the variable "intf-event". + * This variable is an integer that will hold a input_event_type_e value. + */ +typedef enum input_event_type_e +{ + /* "state" has changed */ + INPUT_EVENT_STATE, + /* b_dead is true */ + INPUT_EVENT_DEAD, + + /* "rate" has changed */ + INPUT_EVENT_RATE, + + /* At least one of "position" or "time" */ + INPUT_EVENT_POSITION, + + /* "length" has changed */ + INPUT_EVENT_LENGTH, + + /* A title has been added or removed or selected. + * It implies that the chapter has changed (no chapter event is sent) */ + INPUT_EVENT_TITLE, + /* A chapter has been added or removed or selected. */ + INPUT_EVENT_CHAPTER, + + /* A program ("program") has been added or removed or selected, + * or "program-scrambled" has changed.*/ + INPUT_EVENT_PROGRAM, + /* A ES has been added or removed or selected */ + INPUT_EVENT_ES, + /* "teletext-es" has changed */ + INPUT_EVENT_TELETEXT, + + /* "record" has changed */ + INPUT_EVENT_RECORD, + + /* input_item_t media has changed */ + INPUT_EVENT_ITEM_META, + /* input_item_t info has changed */ + INPUT_EVENT_ITEM_INFO, + /* input_item_t epg has changed */ + INPUT_EVENT_ITEM_EPG, + + /* Input statistics have been updated */ + INPUT_EVENT_STATISTICS, + /* At least one of "signal-quality" or "signal-strength" has changed */ + INPUT_EVENT_SIGNAL, + + /* "audio-delay" has changed */ + INPUT_EVENT_AUDIO_DELAY, + /* "spu-delay" has changed */ + INPUT_EVENT_SUBTITLE_DELAY, + + /* "bookmark" has changed */ + INPUT_EVENT_BOOKMARK, + + /* cache" has changed */ + INPUT_EVENT_CACHE, + + /* A audio_output_t object has been created/deleted by *the input* */ + INPUT_EVENT_AOUT, + /* A vout_thread_t object has been created/deleted by *the input* */ + INPUT_EVENT_VOUT, + +} input_event_type_e; + +/** + * Input queries + */ +enum input_query_e +{ + /* input variable "position" */ + INPUT_GET_POSITION, /* arg1= double * res= */ + INPUT_SET_POSITION, /* arg1= double res=can fail */ + + /* input variable "length" */ + INPUT_GET_LENGTH, /* arg1= int64_t * res=can fail */ + + /* input variable "time" */ + INPUT_GET_TIME, /* arg1= int64_t * res= */ + INPUT_SET_TIME, /* arg1= int64_t res=can fail */ + + /* input variable "rate" (nominal is INPUT_RATE_DEFAULT) */ + INPUT_GET_RATE, /* arg1= int * res= */ + INPUT_SET_RATE, /* arg1= int res=can fail */ + + /* input variable "state" */ + INPUT_GET_STATE, /* arg1= int * res= */ + INPUT_SET_STATE, /* arg1= int res=can fail */ + + /* input variable "audio-delay" and "sub-delay" */ + INPUT_GET_AUDIO_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_AUDIO_DELAY, /* arg1 = int res=can fail */ + INPUT_GET_SPU_DELAY, /* arg1 = int* res=can fail */ + INPUT_SET_SPU_DELAY, /* arg1 = int res=can fail */ + + /* Menu (VCD/DVD/BD) Navigation */ + /** Activate the navigation item selected. res=can fail */ + INPUT_NAV_ACTIVATE, + /** Use the up arrow to select a navigation item above. res=can fail */ + INPUT_NAV_UP, + /** Use the down arrow to select a navigation item under. res=can fail */ + INPUT_NAV_DOWN, + /** Use the left arrow to select a navigation item on the left. res=can fail */ + INPUT_NAV_LEFT, + /** Use the right arrow to select a navigation item on the right. res=can fail */ + INPUT_NAV_RIGHT, + /** Activate the popup Menu (for BD). res=can fail */ + INPUT_NAV_POPUP, + /** Activate disc Root Menu. res=can fail */ + INPUT_NAV_MENU, + + /* Meta datas */ + INPUT_ADD_INFO, /* arg1= char* arg2= char* arg3=... res=can fail */ + INPUT_REPLACE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_MERGE_INFOS,/* arg1= info_category_t * res=cannot fail */ + INPUT_DEL_INFO, /* arg1= char* arg2= char* res=can fail */ + + /* bookmarks */ + INPUT_GET_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_GET_BOOKMARKS, /* arg1= seekpoint_t *** arg2= int * res=can fail */ + INPUT_CLEAR_BOOKMARKS, /* res=can fail */ + INPUT_ADD_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_CHANGE_BOOKMARK, /* arg1= seekpoint_t * arg2= int * res=can fail */ + INPUT_DEL_BOOKMARK, /* arg1= seekpoint_t * res=can fail */ + INPUT_SET_BOOKMARK, /* arg1= int res=can fail */ + + /* titles */ + INPUT_GET_TITLE_INFO, /* arg1=input_title_t** arg2= int * res=can fail */ + INPUT_GET_FULL_TITLE_INFO, /* arg1=input_title_t*** arg2= int * res=can fail */ + + /* seekpoints */ + INPUT_GET_SEEKPOINTS, /* arg1=seekpoint_t*** arg2= int * res=can fail */ + + /* Attachments */ + INPUT_GET_ATTACHMENTS, /* arg1=input_attachment_t***, arg2=int* res=can fail */ + INPUT_GET_ATTACHMENT, /* arg1=input_attachment_t**, arg2=char* res=can fail */ + + /* On the fly input slave */ + INPUT_ADD_SLAVE, /* arg1= enum slave_type, arg2= const char *, + * arg3= bool forced, arg4= bool notify, + * arg5= bool check_extension */ + + /* On the fly record while playing */ + INPUT_SET_RECORD_STATE, /* arg1=bool res=can fail */ + INPUT_GET_RECORD_STATE, /* arg1=bool* res=can fail */ + + /* ES */ + INPUT_RESTART_ES, /* arg1=int (-AUDIO/VIDEO/SPU_ES for the whole category) */ + + /* Viewpoint */ + INPUT_UPDATE_VIEWPOINT, /* arg1=(const vlc_viewpoint_t*), arg2=bool b_absolute */ + INPUT_SET_INITIAL_VIEWPOINT, /* arg1=(const vlc_viewpoint_t*) */ + + /* Input ressources + * XXX You must call vlc_object_release as soon as possible */ + INPUT_GET_AOUT, /* arg1=audio_output_t ** res=can fail */ + INPUT_GET_VOUTS, /* arg1=vout_thread_t ***, size_t * res=can fail */ + INPUT_GET_ES_OBJECTS, /* arg1=int id, vlc_object_t **dec, vout_thread_t **, audio_output_t ** */ + + /* Renderers */ + INPUT_SET_RENDERER, /* arg1=vlc_renderer_item_t* */ + + /* External clock managments */ + INPUT_GET_PCR_SYSTEM, /* arg1=mtime_t *, arg2=mtime_t * res=can fail */ + INPUT_MODIFY_PCR_SYSTEM,/* arg1=int absolute, arg2=mtime_t res=can fail */ +}; + +/** @}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +VLC_API input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *, + const char *psz_log, input_resource_t *, + vlc_renderer_item_t* p_renderer ) VLC_USED; +#define input_Create(a,b,c,d,e) input_Create(VLC_OBJECT(a),b,c,d,e) + +VLC_API int input_Start( input_thread_t * ); + +VLC_API void input_Stop( input_thread_t * ); + +VLC_API int input_Read( vlc_object_t *, input_item_t * ); +#define input_Read(a,b) input_Read(VLC_OBJECT(a),b) + +VLC_API int input_vaControl( input_thread_t *, int i_query, va_list ); + +VLC_API int input_Control( input_thread_t *, int i_query, ... ); + +VLC_API void input_Close( input_thread_t * ); + +/** + * Create a new input_thread_t and start it. + * + * Provided for convenience. + * + * \see input_Create + */ +static inline +input_thread_t *input_CreateAndStart( vlc_object_t *parent, + input_item_t *item, const char *log ) +{ + input_thread_t *input = input_Create( parent, item, log, NULL, NULL ); + if( input != NULL && input_Start( input ) ) + { + vlc_object_release( input ); + input = NULL; + } + return input; +} +#define input_CreateAndStart(a,b,c) input_CreateAndStart(VLC_OBJECT(a),b,c) + +/** + * Get the input item for an input thread + * + * You have to keep a reference to the input or to the input_item_t until + * you do not need it anymore. + */ +VLC_API input_item_t* input_GetItem( input_thread_t * ) VLC_USED; + +/** + * It will return the current state of the input. + * Provided for convenience. + */ +static inline input_state_e input_GetState( input_thread_t * p_input ) +{ + input_state_e state = INIT_S; + input_Control( p_input, INPUT_GET_STATE, &state ); + return state; +} + +/** + * Return one of the video output (if any). If possible, you should use + * INPUT_GET_VOUTS directly and process _all_ video outputs instead. + * @param p_input an input thread from which to get a video output + * @return NULL on error, or a video output thread pointer (which needs to be + * released with vlc_object_release()). + */ +static inline vout_thread_t *input_GetVout( input_thread_t *p_input ) +{ + vout_thread_t **pp_vout, *p_vout; + size_t i_vout; + + if( input_Control( p_input, INPUT_GET_VOUTS, &pp_vout, &i_vout ) ) + return NULL; + + for( size_t i = 1; i < i_vout; i++ ) + vlc_object_release( (vlc_object_t *)(pp_vout[i]) ); + + p_vout = (i_vout >= 1) ? pp_vout[0] : NULL; + free( pp_vout ); + return p_vout; +} + +static inline int input_AddSlave( input_thread_t *p_input, enum slave_type type, + const char *psz_uri, bool b_forced, + bool b_notify, bool b_check_ext ) +{ + return input_Control( p_input, INPUT_ADD_SLAVE, type, psz_uri, b_forced, + b_notify, b_check_ext ); +} + +/** + * Update the viewpoint of the input thread. The viewpoint will be applied to + * all vouts and aouts. + * + * @param p_input an input thread + * @param p_viewpoint the viewpoint value + * @param b_absolute if true replace the old viewpoint with the new one. If + * false, increase/decrease it. + * @return VLC_SUCCESS or a VLC error code + */ +static inline int input_UpdateViewpoint( input_thread_t *p_input, + const vlc_viewpoint_t *p_viewpoint, + bool b_absolute ) +{ + return input_Control( p_input, INPUT_UPDATE_VIEWPOINT, p_viewpoint, + b_absolute ); +} + +/** + * Return the audio output (if any) associated with an input. + * @param p_input an input thread + * @return NULL on error, or the audio output (which needs to be + * released with vlc_object_release()). + */ +static inline audio_output_t *input_GetAout( input_thread_t *p_input ) +{ + audio_output_t *p_aout; + return input_Control( p_input, INPUT_GET_AOUT, &p_aout ) ? NULL : p_aout; +} + +/** + * Returns the objects associated to an ES. + * + * You must release all non NULL object using vlc_object_release. + * You may set pointer of pointer to NULL to avoid retreiving it. + */ +static inline int input_GetEsObjects( input_thread_t *p_input, int i_id, + vlc_object_t **pp_decoder, + vout_thread_t **pp_vout, audio_output_t **pp_aout ) +{ + return input_Control( p_input, INPUT_GET_ES_OBJECTS, i_id, + pp_decoder, pp_vout, pp_aout ); +} + +/** + * \see input_clock_GetSystemOrigin + */ +static inline int input_GetPcrSystem( input_thread_t *p_input, mtime_t *pi_system, mtime_t *pi_delay ) +{ + return input_Control( p_input, INPUT_GET_PCR_SYSTEM, pi_system, pi_delay ); +} +/** + * \see input_clock_ChangeSystemOrigin + */ +static inline int input_ModifyPcrSystem( input_thread_t *p_input, bool b_absolute, mtime_t i_system ) +{ + return input_Control( p_input, INPUT_MODIFY_PCR_SYSTEM, b_absolute, i_system ); +} + +/* */ +VLC_API decoder_t * input_DecoderCreate( vlc_object_t *, const es_format_t *, input_resource_t * ) VLC_USED; +VLC_API void input_DecoderDelete( decoder_t * ); +VLC_API void input_DecoderDecode( decoder_t *, block_t *, bool b_do_pace ); +VLC_API void input_DecoderDrain( decoder_t * ); +VLC_API void input_DecoderFlush( decoder_t * ); + +/** + * This function creates a sane filename path. + */ +VLC_API char * input_CreateFilename( input_thread_t *, const char *psz_path, const char *psz_prefix, const char *psz_extension ) VLC_USED; + +/** + * It creates an empty input resource handler. + * + * The given object MUST stay alive as long as the input_resource_t is + * not deleted. + */ +VLC_API input_resource_t * input_resource_New( vlc_object_t * ) VLC_USED; + +/** + * It releases an input resource. + */ +VLC_API void input_resource_Release( input_resource_t * ); + +/** + * Forcefully destroys the video output (e.g. when the playlist is stopped). + */ +VLC_API void input_resource_TerminateVout( input_resource_t * ); + +/** + * This function releases all resources (object). + */ +VLC_API void input_resource_Terminate( input_resource_t * ); + +/** + * \return the current audio output if any. + * Use vlc_object_release() to drop the reference. + */ +VLC_API audio_output_t *input_resource_HoldAout( input_resource_t * ); + +/** + * This function creates or recycles an audio output. + */ +VLC_API audio_output_t *input_resource_GetAout( input_resource_t * ); + +/** + * This function retains or destroys an audio output. + */ +VLC_API void input_resource_PutAout( input_resource_t *, audio_output_t * ); + +/** + * Prevents the existing audio output (if any) from being recycled. + */ +VLC_API void input_resource_ResetAout( input_resource_t * ); + +/** @} */ +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_input_item.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_input_item.h new file mode 100644 index 0000000..82f9b59 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_input_item.h @@ -0,0 +1,483 @@ +/***************************************************************************** + * vlc_input_item.h: Core input item + ***************************************************************************** + * Copyright (C) 1999-2009 VLC authors and VideoLAN + * $Id: f22c3d9330af98a15992ef08e362424313774d6f $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INPUT_ITEM_H +#define VLC_INPUT_ITEM_H 1 + +/** + * \file + * This file defines functions, structures and enums for input items in vlc + */ + +#include +#include +#include + +#include + +typedef struct input_item_opaque input_item_opaque_t; +typedef struct input_item_slave input_item_slave_t; + +struct info_t +{ + char *psz_name; /**< Name of this info */ + char *psz_value; /**< Value of the info */ +}; + +struct info_category_t +{ + char *psz_name; /**< Name of this category */ + int i_infos; /**< Number of infos in the category */ + struct info_t **pp_infos; /**< Pointer to an array of infos */ +}; + +/** + * Describes an input and is used to spawn input_thread_t objects. + */ +struct input_item_t +{ + char *psz_name; /**< text describing this item */ + char *psz_uri; /**< mrl of this item */ + + int i_options; /**< Number of input options */ + char **ppsz_options; /**< Array of input options */ + uint8_t *optflagv; /**< Some flags of input options */ + unsigned optflagc; + input_item_opaque_t *opaques; /**< List of opaque pointer values */ + + mtime_t i_duration; /**< Duration in microseconds */ + + + int i_categories; /**< Number of info categories */ + info_category_t **pp_categories; /**< Pointer to the first info category */ + + int i_es; /**< Number of es format descriptions */ + es_format_t **es; /**< Es formats */ + + input_stats_t *p_stats; /**< Statistics */ + + vlc_meta_t *p_meta; + + int i_epg; /**< Number of EPG entries */ + vlc_epg_t **pp_epg; /**< EPG entries */ + int64_t i_epg_time; /** EPG timedate as epoch time */ + const vlc_epg_t *p_epg_table; /** running/selected program cur/next EPG table */ + + int i_slaves; /**< Number of slaves */ + input_item_slave_t **pp_slaves; /**< Slave entries that will be loaded by + the input_thread */ + + vlc_event_manager_t event_manager; + + vlc_mutex_t lock; /**< Lock for the item */ + + uint8_t i_type; /**< Type (file, disc, ... see input_item_type_e) */ + bool b_net; /**< Net: always true for TYPE_STREAM, it + depends for others types */ + bool b_error_when_reading;/**< Error When Reading */ + + int i_preparse_depth; /**< How many level of sub items can be preparsed: + -1: recursive, 0: none, >0: n levels */ + + bool b_preparse_interact; /**< Force interaction with the user when + preparsing.*/ +}; + +enum input_item_type_e +{ + ITEM_TYPE_UNKNOWN, + ITEM_TYPE_FILE, + ITEM_TYPE_DIRECTORY, + ITEM_TYPE_DISC, + ITEM_TYPE_CARD, + ITEM_TYPE_STREAM, + ITEM_TYPE_PLAYLIST, + ITEM_TYPE_NODE, + + /* This one is not a real type but the number of input_item types. */ + ITEM_TYPE_NUMBER +}; + +enum input_item_net_type +{ + ITEM_NET_UNKNOWN, + ITEM_NET, + ITEM_LOCAL +}; + +enum slave_type +{ + SLAVE_TYPE_SPU, + SLAVE_TYPE_AUDIO, +}; + +enum slave_priority +{ + SLAVE_PRIORITY_MATCH_NONE = 1, + SLAVE_PRIORITY_MATCH_RIGHT, + SLAVE_PRIORITY_MATCH_LEFT, + SLAVE_PRIORITY_MATCH_ALL, + SLAVE_PRIORITY_USER +}; + +/* Extensions must be in alphabetical order */ +#define MASTER_EXTENSIONS \ + "asf", "avi", "divx", \ + "f4v", "flv", "m1v", \ + "m2v", "m4v", "mkv", \ + "mov", "mp2", "mp2v", \ + "mp4", "mp4v", "mpe", \ + "mpeg", "mpeg1", "mpeg2", \ + "mpeg4", "mpg", "mpv2", \ + "mxf", "ogv", "ogx", \ + "ps", "vro","webm", \ + "wmv", "wtv" + +#define SLAVE_SPU_EXTENSIONS \ + "aqt", "ass", "cdg", \ + "dks", "idx", "jss", \ + "mpl2", "mpsub", "pjs", \ + "psb", "rt", "sami", "sbv", \ + "scc", "smi", "srt", \ + "ssa", "stl", "sub", \ + "ttml", "tt", "usf", \ + "vtt", "webvtt" + +#define SLAVE_AUDIO_EXTENSIONS \ + "aac", "ac3", "dts", \ + "dtshd", "eac3", "flac", \ + "m4a", "mp3", "pcm" \ + +struct input_item_slave +{ + enum slave_type i_type; /**< Slave type (spu, audio) */ + enum slave_priority i_priority; /**< Slave priority */ + bool b_forced; /**< Slave should be selected */ + char psz_uri[]; /**< Slave mrl */ +}; + +struct input_item_node_t +{ + input_item_t * p_item; + int i_children; + input_item_node_t **pp_children; +}; + +VLC_API void input_item_CopyOptions( input_item_t *p_child, input_item_t *p_parent ); +VLC_API void input_item_SetName( input_item_t *p_item, const char *psz_name ); + +/** + * Start adding multiple subitems. + * + * Create a root node to hold a tree of subitems for given item + */ +VLC_API input_item_node_t * input_item_node_Create( input_item_t *p_input ) VLC_USED; + +/** + * Add a new child node to this parent node that will point to this subitem. + */ +VLC_API input_item_node_t * input_item_node_AppendItem( input_item_node_t *p_node, input_item_t *p_item ); + +/** + * Add an already created node to children of this parent node. + */ +VLC_API void input_item_node_AppendNode( input_item_node_t *p_parent, input_item_node_t *p_child ); + +/** + * Remove a node from its parent. + */ +void input_item_node_RemoveNode( input_item_node_t *parent, + input_item_node_t *child ); + +/** + * Delete a node created with input_item_node_Create() and all its children. + */ +VLC_API void input_item_node_Delete( input_item_node_t *p_node ); + +/** + * Option flags + */ +enum input_item_option_e +{ + /* Allow VLC to trust the given option. + * By default options are untrusted */ + VLC_INPUT_OPTION_TRUSTED = 0x2, + + /* Add the option, unless the same option + * is already present. */ + VLC_INPUT_OPTION_UNIQUE = 0x100, +}; + +/** + * This function allows to add an option to an existing input_item_t. + */ +VLC_API int input_item_AddOption(input_item_t *, const char *, unsigned i_flags ); +/** + * This function add several options to an existing input_item_t. + */ +VLC_API int input_item_AddOptions(input_item_t *, int i_options, + const char *const *ppsz_options, + unsigned i_flags ); +VLC_API int input_item_AddOpaque(input_item_t *, const char *, void *); + +void input_item_ApplyOptions(vlc_object_t *, input_item_t *); + +VLC_API bool input_item_slave_GetType(const char *, enum slave_type *); + +VLC_API input_item_slave_t *input_item_slave_New(const char *, enum slave_type, + enum slave_priority); +#define input_item_slave_Delete(p_slave) free(p_slave) + +/** + * This function allows adding a slave to an existing input item. + * The slave is owned by the input item after this call. + */ +VLC_API int input_item_AddSlave(input_item_t *, input_item_slave_t *); + +/* */ +VLC_API bool input_item_HasErrorWhenReading( input_item_t * ); +VLC_API void input_item_SetMeta( input_item_t *, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API bool input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_t meta_type, const char *psz ); +VLC_API char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type ) VLC_USED; +VLC_API char * input_item_GetName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetTitleFbName( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetURI( input_item_t * p_i ) VLC_USED; +VLC_API char * input_item_GetNowPlayingFb( input_item_t *p_item ) VLC_USED; +VLC_API void input_item_SetURI( input_item_t * p_i, const char *psz_uri ); +VLC_API mtime_t input_item_GetDuration( input_item_t * p_i ); +VLC_API void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration ); +VLC_API bool input_item_IsPreparsed( input_item_t *p_i ); +VLC_API bool input_item_IsArtFetched( input_item_t *p_i ); + +#define INPUT_META( name ) \ +static inline \ +void input_item_Set ## name (input_item_t *p_input, const char *val) \ +{ \ + input_item_SetMeta (p_input, vlc_meta_ ## name, val); \ +} \ +static inline \ +char *input_item_Get ## name (input_item_t *p_input) \ +{ \ + return input_item_GetMeta (p_input, vlc_meta_ ## name); \ +} + +INPUT_META(Title) +INPUT_META(Artist) +INPUT_META(AlbumArtist) +INPUT_META(Genre) +INPUT_META(Copyright) +INPUT_META(Album) +INPUT_META(TrackNumber) +INPUT_META(Description) +INPUT_META(Rating) +INPUT_META(Date) +INPUT_META(Setting) +INPUT_META(URL) +INPUT_META(Language) +INPUT_META(NowPlaying) +INPUT_META(ESNowPlaying) +INPUT_META(Publisher) +INPUT_META(EncodedBy) +INPUT_META(ArtworkURL) +INPUT_META(TrackID) +INPUT_META(TrackTotal) +INPUT_META(Director) +INPUT_META(Season) +INPUT_META(Episode) +INPUT_META(ShowName) +INPUT_META(Actors) +INPUT_META(DiscNumber) + +#define input_item_SetTrackNum input_item_SetTrackNumber +#define input_item_GetTrackNum input_item_GetTrackNumber +#define input_item_SetArtURL input_item_SetArtworkURL +#define input_item_GetArtURL input_item_GetArtworkURL + +VLC_API char * input_item_GetInfo( input_item_t *p_i, const char *psz_cat,const char *psz_name ) VLC_USED; +VLC_API int input_item_AddInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name, const char *psz_format, ... ) VLC_FORMAT( 4, 5 ); +VLC_API int input_item_DelInfo( input_item_t *p_i, const char *psz_cat, const char *psz_name ); +VLC_API void input_item_ReplaceInfos( input_item_t *, info_category_t * ); +VLC_API void input_item_MergeInfos( input_item_t *, info_category_t * ); + +/** + * This function creates a new input_item_t with the provided information. + * + * XXX You may also use input_item_New, as they need less arguments. + */ +VLC_API input_item_t * input_item_NewExt( const char *psz_uri, + const char *psz_name, + mtime_t i_duration, int i_type, + enum input_item_net_type i_net ) VLC_USED; + +#define input_item_New( psz_uri, psz_name ) \ + input_item_NewExt( psz_uri, psz_name, -1, ITEM_TYPE_UNKNOWN, ITEM_NET_UNKNOWN ) + +#define input_item_NewCard( psz_uri, psz_name ) \ + input_item_NewExt( psz_uri, psz_name, -1, ITEM_TYPE_CARD, ITEM_LOCAL ) + +#define input_item_NewDisc( psz_uri, psz_name, i_duration ) \ + input_item_NewExt( psz_uri, psz_name, i_duration, ITEM_TYPE_DISC, ITEM_LOCAL ) + +#define input_item_NewStream( psz_uri, psz_name, i_duration ) \ + input_item_NewExt( psz_uri, psz_name, i_duration, ITEM_TYPE_STREAM, ITEM_NET ) + +#define input_item_NewDirectory( psz_uri, psz_name, i_net ) \ + input_item_NewExt( psz_uri, psz_name, -1, ITEM_TYPE_DIRECTORY, i_net ) + +#define input_item_NewFile( psz_uri, psz_name, i_duration, i_net ) \ + input_item_NewExt( psz_uri, psz_name, i_duration, ITEM_TYPE_FILE, i_net ) + +/** + * This function creates a new input_item_t as a copy of another. + */ +VLC_API input_item_t * input_item_Copy(input_item_t * ) VLC_USED; + +/** Holds an input item, i.e. creates a new reference. */ +VLC_API input_item_t *input_item_Hold(input_item_t *); + +/** Releases an input item, i.e. decrements its reference counter. */ +VLC_API void input_item_Release(input_item_t *); + +typedef enum input_item_meta_request_option_t +{ + META_REQUEST_OPTION_NONE = 0x00, + META_REQUEST_OPTION_SCOPE_LOCAL = 0x01, + META_REQUEST_OPTION_SCOPE_NETWORK = 0x02, + META_REQUEST_OPTION_SCOPE_ANY = 0x03, + META_REQUEST_OPTION_DO_INTERACT = 0x04 +} input_item_meta_request_option_t; + +/* status of the vlc_InputItemPreparseEnded event */ +enum input_item_preparse_status +{ + ITEM_PREPARSE_SKIPPED, + ITEM_PREPARSE_FAILED, + ITEM_PREPARSE_TIMEOUT, + ITEM_PREPARSE_DONE +}; + +VLC_API int libvlc_MetadataRequest( libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t, + int, void * ); +VLC_API int libvlc_ArtRequest(libvlc_int_t *, input_item_t *, + input_item_meta_request_option_t ); +VLC_API void libvlc_MetadataCancel( libvlc_int_t *, void * ); + +/****************** + * Input stats + ******************/ +struct input_stats_t +{ + vlc_mutex_t lock; + + /* Input */ + int64_t i_read_packets; + int64_t i_read_bytes; + float f_input_bitrate; + float f_average_input_bitrate; + + /* Demux */ + int64_t i_demux_read_packets; + int64_t i_demux_read_bytes; + float f_demux_bitrate; + float f_average_demux_bitrate; + int64_t i_demux_corrupted; + int64_t i_demux_discontinuity; + + /* Decoders */ + int64_t i_decoded_audio; + int64_t i_decoded_video; + + /* Vout */ + int64_t i_displayed_pictures; + int64_t i_lost_pictures; + + /* Sout */ + int64_t i_sent_packets; + int64_t i_sent_bytes; + float f_send_bitrate; + + /* Aout */ + int64_t i_played_abuffers; + int64_t i_lost_abuffers; +}; + +/** + * Access pf_readdir helper struct + * \see vlc_readdir_helper_init() + * \see vlc_readdir_helper_additem() + * \see vlc_readdir_helper_finish() + */ +struct vlc_readdir_helper +{ + input_item_node_t *p_node; + void **pp_slaves; + size_t i_slaves; + void **pp_dirs; + size_t i_dirs; + int i_sub_autodetect_fuzzy; + bool b_show_hiddenfiles; + bool b_flatten; + char *psz_ignored_exts; +}; + +/** + * Init a vlc_readdir_helper struct + * + * \param p_rdh need to be cleaned with vlc_readdir_helper_finish() + * \param p_node node that will be used to add items + */ +VLC_API void vlc_readdir_helper_init(struct vlc_readdir_helper *p_rdh, + vlc_object_t *p_obj, input_item_node_t *p_node); +#define vlc_readdir_helper_init(p_rdh, p_obj, p_node) \ + vlc_readdir_helper_init(p_rdh, VLC_OBJECT(p_obj), p_node) + +/** + * Finish adding items to the node + * + * \param b_success if true, items of the node will be sorted. + */ +VLC_API void vlc_readdir_helper_finish(struct vlc_readdir_helper *p_rdh, bool b_success); + +/** + * Add a new input_item_t entry to the node of the vlc_readdir_helper struct. + * + * \param p_rdh previously inited vlc_readdir_helper struct + * \param psz_uri uri of the new item + * \param psz_flatpath flattened path of the new item. If not NULL, this + * function will create an input item for each sub folders (separated + * by '/') of psz_flatpath (so, this will un-flatten the folder + * hierarchy). Either psz_flatpath or psz_filename must be valid. + * \param psz_filename file name of the new item. If NULL, the file part of path + * will be used as a filename. Either psz_flatpath or psz_filename must + * be valid. + * \param i_type see \ref input_item_type_e + * \param i_net see \ref input_item_net_type + */ +VLC_API int vlc_readdir_helper_additem(struct vlc_readdir_helper *p_rdh, + const char *psz_uri, const char *psz_flatpath, + const char *psz_filename, + int i_type, int i_net); + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_interface.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_interface.h new file mode 100644 index 0000000..1bd325b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_interface.h @@ -0,0 +1,332 @@ +/***************************************************************************** + * vlc_interface.h: interface access for other threads + * This library provides basic functions for threads to interact with user + * interface, such as message output. + ***************************************************************************** + * Copyright (C) 1999, 2000 VLC authors and VideoLAN + * $Id: e271314c3120c270a0bef5189cfee21dd9e7b26b $ + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_INTF_H_ +#define VLC_INTF_H_ + +# ifdef __cplusplus +extern "C" { +# endif + +typedef struct intf_dialog_args_t intf_dialog_args_t; + +/** + * \defgroup interface Interface + * VLC user interfaces + * @{ + * \file + * VLC user interface modules + */ + +typedef struct intf_sys_t intf_sys_t; + +/** Describe all interface-specific data of the interface thread */ +typedef struct intf_thread_t +{ + VLC_COMMON_MEMBERS + + struct intf_thread_t *p_next; /** LibVLC interfaces book keeping */ + + /* Specific interfaces */ + intf_sys_t * p_sys; /** system interface */ + + /** Interface module */ + module_t * p_module; + + /** Specific for dialogs providers */ + void ( *pf_show_dialog ) ( struct intf_thread_t *, int, int, + intf_dialog_args_t * ); + + config_chain_t *p_cfg; +} intf_thread_t; + +/** \brief Arguments passed to a dialogs provider + * This describes the arguments passed to the dialogs provider. They are + * mainly used with INTF_DIALOG_FILE_GENERIC. + */ +struct intf_dialog_args_t +{ + intf_thread_t *p_intf; + char *psz_title; + + char **psz_results; + int i_results; + + void (*pf_callback) ( intf_dialog_args_t * ); + void *p_arg; + + /* Specifically for INTF_DIALOG_FILE_GENERIC */ + char *psz_extensions; + bool b_save; + bool b_multiple; + + /* Specific to INTF_DIALOG_INTERACTION */ + struct interaction_dialog_t *p_dialog; +}; + +VLC_API int intf_Create( playlist_t *, const char * ); + +VLC_API void libvlc_Quit( libvlc_int_t * ); + +static inline playlist_t *pl_Get( struct intf_thread_t *intf ) +{ + return (playlist_t *)(intf->obj.parent); +} + +/** + * Retrieves the current input thread from the playlist. + * @note The returned object must be released with vlc_object_release(). + */ +#define pl_CurrentInput(intf) (playlist_CurrentInput(pl_Get(intf))) + +/** + * @ingroup messages + * @{ + */ + +VLC_API void vlc_LogSet(libvlc_int_t *, vlc_log_cb cb, void *data); + +/*@}*/ + +/* Interface dialog ids for dialog providers */ +typedef enum vlc_intf_dialog { + INTF_DIALOG_FILE_SIMPLE = 1, + INTF_DIALOG_FILE, + INTF_DIALOG_DISC, + INTF_DIALOG_NET, + INTF_DIALOG_CAPTURE, + INTF_DIALOG_SAT, + INTF_DIALOG_DIRECTORY, + + INTF_DIALOG_STREAMWIZARD, + INTF_DIALOG_WIZARD, + + INTF_DIALOG_PLAYLIST, + INTF_DIALOG_MESSAGES, + INTF_DIALOG_FILEINFO, + INTF_DIALOG_PREFS, + INTF_DIALOG_BOOKMARKS, + INTF_DIALOG_EXTENDED, + INTF_DIALOG_RENDERER, + + INTF_DIALOG_POPUPMENU = 20, + INTF_DIALOG_AUDIOPOPUPMENU, + INTF_DIALOG_VIDEOPOPUPMENU, + INTF_DIALOG_MISCPOPUPMENU, + + INTF_DIALOG_FILE_GENERIC = 30, + INTF_DIALOG_INTERACTION = 50, + INTF_DIALOG_SENDKEY = 51, + + INTF_DIALOG_UPDATEVLC = 90, + INTF_DIALOG_VLM, + + INTF_DIALOG_EXIT = 99 +} vlc_intf_dialog; + +/* Useful text messages shared by interfaces */ +#define INTF_ABOUT_MSG LICENSE_MSG + +#define EXTENSIONS_AUDIO_CSV "3ga", "669", "a52", "aac", "ac3", "adt", "adts", "aif", "aifc", "aiff", \ + "amb", "amr", "aob", "ape", "au", "awb", "caf", "dts", "flac", "it", "kar", \ + "m4a", "m4b", "m4p", "m5p", "mka", "mlp", "mod", "mpa", "mp1", "mp2", "mp3", "mpc", "mpga", "mus", \ + "oga", "ogg", "oma", "opus", "qcp", "ra", "rmi", "s3m", "sid", "spx", "tak", "thd", "tta", \ + "voc", "vqf", "w64", "wav", "wma", "wv", "xa", "xm" + +#define EXTENSIONS_VIDEO_CSV "3g2", "3gp", "3gp2", "3gpp", "amv", "asf", "avi", "bik", "crf", "divx", "drc", "dv", "dvr-ms" \ + "evo", "f4v", "flv", "gvi", "gxf", "iso", \ + "m1v", "m2v", "m2t", "m2ts", "m4v", "mkv", "mov",\ + "mp2", "mp2v", "mp4", "mp4v", "mpe", "mpeg", "mpeg1", \ + "mpeg2", "mpeg4", "mpg", "mpv2", "mts", "mtv", "mxf", "mxg", "nsv", "nuv", \ + "ogg", "ogm", "ogv", "ogx", "ps", \ + "rec", "rm", "rmvb", "rpl", "thp", "tod", "ts", "tts", "txd", "vob", "vro", \ + "webm", "wm", "wmv", "wtv", "xesc" + +#define EXTENSIONS_AUDIO \ + "*.3ga;" \ + "*.669;" \ + "*.a52;" \ + "*.aac;" \ + "*.ac3;" \ + "*.adt;" \ + "*.adts;" \ + "*.aif;"\ + "*.aifc;"\ + "*.aiff;"\ + "*.amb;" \ + "*.amr;" \ + "*.aob;" \ + "*.ape;" \ + "*.au;" \ + "*.awb;" \ + "*.caf;" \ + "*.dts;" \ + "*.flac;"\ + "*.it;" \ + "*.kar;" \ + "*.m4a;" \ + "*.m4b;" \ + "*.m4p;" \ + "*.m5p;" \ + "*.mid;" \ + "*.mka;" \ + "*.mlp;" \ + "*.mod;" \ + "*.mpa;" \ + "*.mp1;" \ + "*.mp2;" \ + "*.mp3;" \ + "*.mpc;" \ + "*.mpga;" \ + "*.mus;" \ + "*.oga;" \ + "*.ogg;" \ + "*.oma;" \ + "*.opus;" \ + "*.qcp;" \ + "*.ra;" \ + "*.rmi;" \ + "*.s3m;" \ + "*.sid;" \ + "*.spx;" \ + "*.tak;" \ + "*.thd;" \ + "*.tta;" \ + "*.voc;" \ + "*.vqf;" \ + "*.w64;" \ + "*.wav;" \ + "*.wma;" \ + "*.wv;" \ + "*.xa;" \ + "*.xm" + +#define EXTENSIONS_VIDEO "*.3g2;*.3gp;*.3gp2;*.3gpp;*.amv;*.asf;*.avi;*.bik;*.bin;*.crf;*.divx;*.drc;*.dv;*.dvr-ms;*.evo;*.f4v;*.flv;*.gvi;*.gxf;*.iso;*.m1v;*.m2v;" \ + "*.m2t;*.m2ts;*.m4v;*.mkv;*.mov;*.mp2;*.mp2v;*.mp4;*.mp4v;*.mpe;*.mpeg;*.mpeg1;" \ + "*.mpeg2;*.mpeg4;*.mpg;*.mpv2;*.mts;*.mtv;*.mxf;*.mxg;*.nsv;*.nuv;" \ + "*.ogg;*.ogm;*.ogv;*.ogx;*.ps;" \ + "*.rec;*.rm;*.rmvb;*.rpl;*.thp;*.tod;*.tp;*.ts;*.tts;*.txd;*.vob;*.vro;*.webm;*.wm;*.wmv;*.wtv;*.xesc" + +#define EXTENSIONS_PLAYLIST "*.asx;*.b4s;*.cue;*.ifo;*.m3u;*.m3u8;*.pls;*.ram;*.rar;*.sdp;*.vlc;*.xspf;*.wax;*.wvx;*.zip;*.conf" + +#define EXTENSIONS_MEDIA EXTENSIONS_VIDEO ";" EXTENSIONS_AUDIO ";" \ + EXTENSIONS_PLAYLIST + +#define EXTENSIONS_SUBTITLE "*.cdg;*.idx;*.srt;" \ + "*.sub;*.utf;*.ass;" \ + "*.ssa;*.aqt;" \ + "*.jss;*.psb;" \ + "*.rt;*.sami;*.smi;*.txt;" \ + "*.smil;*.stl;*.usf;" \ + "*.dks;*.pjs;*.mpl2;*.mks;" \ + "*.vtt;*.tt;*.ttml;*.dfxp;" \ + "*.scc" + +/** \defgroup interaction Interaction + * \ingroup interface + * Interaction between user and modules + * @{ + */ + +/** + * This structure describes a piece of interaction with the user + */ +typedef struct interaction_dialog_t +{ + int i_type; ///< Type identifier + char *psz_title; ///< Title + char *psz_description; ///< Descriptor string + char *psz_default_button; ///< default button title (~OK) + char *psz_alternate_button;///< alternate button title (~NO) + /// other button title (optional,~Cancel) + char *psz_other_button; + + char *psz_returned[1]; ///< returned responses from the user + + vlc_value_t val; ///< value coming from core for dialogue + int i_timeToGo; ///< time (in sec) until shown progress is finished + bool b_cancelled; ///< was the dialogue cancelled ? + + void * p_private; ///< Private interface data + + int i_status; ///< Dialog status; + int i_action; ///< Action to perform; + int i_flags; ///< Misc flags + int i_return; ///< Return status + + vlc_object_t *p_parent; ///< The vlc object that asked + //for interaction + intf_thread_t *p_interface; + vlc_mutex_t *p_lock; +} interaction_dialog_t; + +/** + * Possible flags . Dialog types + */ +#define DIALOG_GOT_ANSWER 0x01 +#define DIALOG_YES_NO_CANCEL 0x02 +#define DIALOG_LOGIN_PW_OK_CANCEL 0x04 +#define DIALOG_PSZ_INPUT_OK_CANCEL 0x08 +#define DIALOG_BLOCKING_ERROR 0x10 +#define DIALOG_NONBLOCKING_ERROR 0x20 +#define DIALOG_USER_PROGRESS 0x80 +#define DIALOG_INTF_PROGRESS 0x100 + +/** Possible return codes */ +enum +{ + DIALOG_OK_YES, + DIALOG_NO, + DIALOG_CANCELLED +}; + +/** Possible status */ +enum +{ + ANSWERED_DIALOG, ///< Got "answer" + DESTROYED_DIALOG, ///< Interface has destroyed it +}; + +/** Possible actions */ +enum +{ + INTERACT_NEW, + INTERACT_UPDATE, + INTERACT_HIDE, + INTERACT_DESTROY +}; + +#define intf_UserStringInput( a, b, c, d ) (VLC_OBJECT(a),b,c,d, VLC_EGENERIC) +#define interaction_Register( t ) (t, VLC_EGENERIC) +#define interaction_Unregister( t ) (t, VLC_EGENERIC) + + +/** @} */ +/** @} */ + +# ifdef __cplusplus +} +# endif +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_interrupt.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_interrupt.h new file mode 100644 index 0000000..b98bbe2 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_interrupt.h @@ -0,0 +1,238 @@ +/***************************************************************************** + * vlc_interrupt.h: + ***************************************************************************** + * Copyright (C) 2015 Remlab T:mi + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * @file + * This file declares interruptible sleep functions. + */ + +#ifndef VLC_INTERRUPT_H +# define VLC_INTERRUPT_H 1 +# include +# ifndef _WIN32 +# include /* socklen_t */ +# else +# include +# endif + +struct pollfd; +struct iovec; +struct sockaddr; +struct msghdr; + +/** + * @defgroup interrupt Interruptible sleep + * @{ + * @defgroup interrupt_sleep Interruptible sleep functions + * @{ + */ + +/** + * Interruptible variant of vlc_sem_wait(). + * + * Waits on a semaphore like vlc_sem_wait(). If the calling thread has an + * interruption context (as set by vlc_interrupt_set()), and another thread + * invokes vlc_interrupt_raise() on that context, the semaphore is incremented. + * + * @warning The calling thread should be the only thread ever to wait on the + * specified semaphore. Otherwise, interruptions may not be delivered + * accurately (the wrong thread may be woken up). + * + * @note This function is (always) a cancellation point. + * + * @return EINTR if the semaphore was incremented due to an interruption, + * otherwise zero. + */ +VLC_API int vlc_sem_wait_i11e(vlc_sem_t *); + +/** + * Interruptible variant of mwait(). + * + * Waits for a specified timestamp or, if the calling thread has an + * interruption context, an interruption. + * + * @return EINTR if an interruption occurred, otherwise 0 once the timestamp is + * reached. + */ +VLC_API int vlc_mwait_i11e(mtime_t); + +/** + * Interruptible variant of msleep(). + * + * Waits for a specified timeout duration or, if the calling thread has an + * interruption context, an interruption. + * + * @param delay timeout value (in microseconds) + * + * @return EINTR if an interruption occurred, otherwise 0 once the timeout + * expired. + */ +static inline int vlc_msleep_i11e(mtime_t delay) +{ + return vlc_mwait_i11e(mdate() + delay); +} + +/** + * Interruptible variant of poll(). + * + * Waits for file descriptors I/O events, a timeout, a signal or a VLC I/O + * interruption. Except for VLC I/O interruptions, this function behaves + * just like the standard poll(). + * + * @note This function is always a cancellation point (as poll()). + * @see poll() manual page + * + * @param fds table of events to wait for + * @param nfds number of entries in the table + * @param timeout time to wait in milliseconds or -1 for infinite + * + * @return A strictly positive result represent the number of pending events. + * 0 is returned if the time-out is reached without events. + * -1 is returned if a VLC I/O interrupt occurs (and errno is set to EINTR) + * or if an error occurs. + */ +VLC_API int vlc_poll_i11e(struct pollfd *, unsigned, int); + +VLC_API ssize_t vlc_readv_i11e(int fd, struct iovec *, int); +VLC_API ssize_t vlc_writev_i11e(int fd, const struct iovec *, int); +VLC_API ssize_t vlc_read_i11e(int fd, void *, size_t); +VLC_API ssize_t vlc_write_i11e(int fd, const void *, size_t); + +VLC_API ssize_t vlc_recvmsg_i11e(int fd, struct msghdr *, int flags); +VLC_API ssize_t vlc_sendmsg_i11e(int fd, const struct msghdr *, int flags); + +VLC_API ssize_t vlc_recvfrom_i11e(int fd, void *, size_t, int flags, + struct sockaddr *, socklen_t *); +VLC_API ssize_t vlc_sendto_i11e(int fd, const void *, size_t, int flags, + const struct sockaddr *, socklen_t); + +static inline ssize_t vlc_recv_i11e(int fd, void *buf, size_t len, int flags) +{ + return vlc_recvfrom_i11e(fd, buf, len, flags, NULL, NULL); +} + +static inline +ssize_t vlc_send_i11e(int fd, const void *buf, size_t len, int flags) +{ + return vlc_sendto_i11e(fd, buf, len, flags, NULL, 0); +} + +VLC_API int vlc_accept_i11e(int fd, struct sockaddr *, socklen_t *, bool); + +/** + * Registers a custom interrupt handler. + * + * Registers a custom callback as interrupt handler for the calling thread. + * The callback must be unregistered with vlc_interrupt_unregister() before + * thread termination and before any further callback registration. + * + * If the calling thread has no interruption context, this function has no + * effects. + */ +VLC_API void vlc_interrupt_register(void (*cb)(void *), void *opaque); + +VLC_API int vlc_interrupt_unregister(void); + +/** + * @} + * @defgroup interrupt_context Interrupt context signaling and manipulation + * @{ + */ +typedef struct vlc_interrupt vlc_interrupt_t; + +/** + * Creates an interruption context. + */ +VLC_API vlc_interrupt_t *vlc_interrupt_create(void) VLC_USED; + +/** + * Destroys an interrupt context. + */ +VLC_API void vlc_interrupt_destroy(vlc_interrupt_t *); + +/** + * Sets the interruption context for the calling thread. + * @param newctx the interruption context to attach or NULL for none + * @return the previous interruption context or NULL if none + * + * @note This function is not a cancellation point. + * @warning A context can be attached to no more than one thread at a time. + */ +VLC_API vlc_interrupt_t *vlc_interrupt_set(vlc_interrupt_t *); + +/** + * Raises an interruption through a specified context. + * + * This is used to asynchronously wake a thread up while it is waiting on some + * other events (typically I/O events). + * + * @note This function is thread-safe. + * @note This function is not a cancellation point. + */ +VLC_API void vlc_interrupt_raise(vlc_interrupt_t *); + +/** + * Marks the interruption context as "killed". + * + * This is not reversible. + */ +VLC_API void vlc_interrupt_kill(vlc_interrupt_t *); + +/** + * Checks if the interruption context was "killed". + * + * Indicates whether the interruption context of the calling thread (if any) + * was killed with vlc_interrupt_kill(). + */ +VLC_API bool vlc_killed(void) VLC_USED; + +/** + * Enables forwarding of interruption. + * + * If an interruption is raised through the context of the calling thread, + * it will be forwarded to the specified other context. This is used to cross + * thread boundaries. + * + * If the calling thread has no interrupt context, this function does nothing. + * + * @param to context to forward to + */ +VLC_API void vlc_interrupt_forward_start(vlc_interrupt_t *to, + void *data[2]); + +/** + * Undoes vlc_interrupt_forward_start(). + * + * This function must be called after each successful call to + * vlc_interrupt_forward_start() before any other interruptible call is made + * in the same thread. + * + * If an interruption was raised against the context of the calling thread + * (after the previous call to vlc_interrupt_forward_start()), it is dequeued. + * + * If the calling thread has no interrupt context, this function does nothing + * and returns zero. + * + * @return 0 if no interrupt was raised, EINTR if an interrupt was raised + */ +VLC_API int vlc_interrupt_forward_stop(void *const data[2]); + +/** @} @} */ +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_keystore.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_keystore.h new file mode 100644 index 0000000..5588711 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_keystore.h @@ -0,0 +1,317 @@ +/***************************************************************************** + * vlc_keystore.h: + ***************************************************************************** + * Copyright (C) 2015-2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_KEYSTORE_H +# define VLC_KEYSTORE_H + +#include + +typedef struct vlc_keystore vlc_keystore; +typedef struct vlc_keystore_entry vlc_keystore_entry; +typedef struct vlc_credential vlc_credential; + +/* Called from src/libvlc.c */ +int +libvlc_InternalKeystoreInit(libvlc_int_t *p_libvlc); + +/* Called from src/libvlc.c */ +void +libvlc_InternalKeystoreClean(libvlc_int_t *p_libvlc); + +/** + * @defgroup keystore Keystore and credential API + * @{ + * @file + * This file declares vlc keystore API + * @defgroup keystore_public Keystore public API + * @{ + */ + +/** + * List of keys that can be stored via the keystore API + */ +enum vlc_keystore_key { + KEY_PROTOCOL, + KEY_USER, + KEY_SERVER, + KEY_PATH, + KEY_PORT, + KEY_REALM, + KEY_AUTHTYPE, + KEY_MAX, +}; +#define VLC_KEYSTORE_VALUES_INIT(ppsz_values) memset(ppsz_values, 0, sizeof(const char *) * KEY_MAX) + +/** + * Keystore entry returned by vlc_keystore_find() + */ +struct vlc_keystore_entry +{ + /** Set of key/values. Values can be NULL */ + char * ppsz_values[KEY_MAX]; + /** Secret password */ + uint8_t * p_secret; + /** Length of the secret */ + size_t i_secret_len; +}; + +/** + * Create a keystore object + * + * A keystore object is persistent across runtime. It is saved on local + * filesystem via a vlc keystore module (KWallet, SecretService, Apple Keychain + * Service ...). + * + * @note to be released with vlc_keystore_release() + * + * @param p_parent the parent object used to create the keystore object + * + * @return a pointer to the keystore object, or NULL in case of error + */ +VLC_API vlc_keystore * +vlc_keystore_create(vlc_object_t *p_parent); +#define vlc_keystore_create(x) vlc_keystore_create(VLC_OBJECT(x)) + +/** + * Release a keystore object + */ +VLC_API void +vlc_keystore_release(vlc_keystore *p_keystore); + + +/** + * Store a secret associated with a set of key/values + * + * @param ppsz_values set of key/values, see vlc_keystore_key. + * ppsz_values[KEY_PROTOCOL] and ppsz_values[KEY_SERVER] must be valid + * strings + * @param p_secret binary secret or string password + * @param i_secret_len length of p_secret. If it's less than 0, then p_secret + * is assumed to be a '\0' terminated string + * @param psz_label user friendly label + * + * @return VLC_SUCCESS on success, or VLC_EGENERIC on error + */ +VLC_API int +vlc_keystore_store(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + const uint8_t* p_secret, ssize_t i_secret_len, + const char *psz_label); + +/** + * Find all entries that match a set of key/values + * + * @param ppsz_values set of key/values, see vlc_keystore_key, any values can + * be NULL + * @param pp_entries list of found entries. To be released with + * vlc_keystore_release_entries() + * + * @return the number of entries + */ +VLC_API unsigned int +vlc_keystore_find(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + vlc_keystore_entry **pp_entries) VLC_USED; + +/** + * Remove all entries that match a set of key/values + * + * @note only entries added by VLC can be removed + * + * @param ppsz_values set of key/values, see vlc_keystore_key, any values can + * be NULL + * + * @return the number of entries + */ +VLC_API unsigned int +vlc_keystore_remove(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX]); + +/** + * Release the list of entries returned by vlc_keystore_find() + */ +VLC_API void +vlc_keystore_release_entries(vlc_keystore_entry *p_entries, unsigned int i_count); + +/** + * @} + * @defgroup credential Credential API + * @{ + */ + +/** + * @note init with vlc_credential_init() + */ +struct vlc_credential +{ + /** url to store or to search */ + const vlc_url_t *p_url; + /** http realm or smb domain to search, can be overridden after a call to + * vlc_credential_get() */ + const char *psz_realm; + /** http authtype to search, can be overridden after a call to + * vlc_credential_get() */ + const char *psz_authtype; + /** valid only if vlc_credential_get() returned true */ + const char *psz_username; + /** valid only if vlc_credential_get() returned true */ + const char *psz_password; + + /* internal */ + enum { + GET_FROM_URL, + GET_FROM_OPTION, + GET_FROM_MEMORY_KEYSTORE, + GET_FROM_KEYSTORE, + GET_FROM_DIALOG, + } i_get_order; + + vlc_keystore *p_keystore; + vlc_keystore_entry *p_entries; + unsigned int i_entries_count; + + char *psz_split_domain; + char *psz_var_username; + char *psz_var_password; + + char *psz_dialog_username; + char *psz_dialog_password; + bool b_from_keystore; + bool b_store; +}; + +/** + * Init a credential struct + * + * @note to be cleaned with vlc_credential_clean() + * + * @param psz_url url to store or to search + */ +VLC_API void +vlc_credential_init(vlc_credential *p_credential, const vlc_url_t *p_url); + +/** + * Clean a credential struct + */ +VLC_API void +vlc_credential_clean(vlc_credential *p_credential); + +/** + * Get a username/password couple + * + * This will search for a credential using url, VLC options, the vlc_keystore + * or by asking the user via dialog_Login(). This function can be called + * indefinitely, it will first return the user/password from the url (if any), + * then from VLC options (if any), then from the keystore (if any), and finally + * from the dialog (if any). This function will return true as long as the user + * fill the dialog texts and will return false when the user cancel it. + * + * @param p_parent the parent object (for var, keystore and dialog) + * @param psz_option_username VLC option name for the username + * @param psz_option_password VLC option name for the password + * @param psz_dialog_title dialog title, if NULL, this function won't use the + * keystore or the dialog + * @param psz_dialog_fmt dialog text using format + * + * @return true if vlc_credential.psz_username and vlc_credential.psz_password + * are valid, otherwise this function should not be called again. + */ + +VLC_API bool +vlc_credential_get(vlc_credential *p_credential, vlc_object_t *p_parent, + const char *psz_option_username, + const char *psz_option_password, + const char *psz_dialog_title, + const char *psz_dialog_fmt, ...) VLC_FORMAT(6, 7); +#define vlc_credential_get(a, b, c, d, e, f, ...) \ + vlc_credential_get(a, VLC_OBJECT(b), c, d, e, f, ##__VA_ARGS__) + +/** + * Store the last dialog credential returned by vlc_credential_get() + * + * This function will store the credential in the memory keystore if it's + * valid, or will store in the permanent one if it comes from the dialog and if + * the user asked for it. + * + * @return true if the credential was stored or comes from the keystore, false + * otherwise + */ +VLC_API bool +vlc_credential_store(vlc_credential *p_credential, vlc_object_t *p_parent); +#define vlc_credential_store(a, b) \ + vlc_credential_store(a, VLC_OBJECT(b)) + +/** + * @} + * @defgroup keystore_implementation Implemented by keystore modules + * @{ + */ + +#define VLC_KEYSTORE_NAME "libVLC" + +static inline int +vlc_keystore_entry_set_secret(vlc_keystore_entry *p_entry, + const uint8_t *p_secret, size_t i_secret_len) +{ + p_entry->p_secret = (uint8_t*) malloc(i_secret_len); + if (!p_entry->p_secret) + return VLC_EGENERIC; + memcpy(p_entry->p_secret, p_secret, i_secret_len); + p_entry->i_secret_len = i_secret_len; + return VLC_SUCCESS; +} + +static inline void +vlc_keystore_release_entry(vlc_keystore_entry *p_entry) +{ + for (unsigned int j = 0; j < KEY_MAX; ++j) + { + free(p_entry->ppsz_values[j]); + p_entry->ppsz_values[j] = NULL; + } + free(p_entry->p_secret); + p_entry->p_secret = NULL; +} + +typedef struct vlc_keystore_sys vlc_keystore_sys; +struct vlc_keystore +{ + VLC_COMMON_MEMBERS + module_t *p_module; + vlc_keystore_sys *p_sys; + + /** See vlc_keystore_store() */ + int (*pf_store)(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + const uint8_t *p_secret, + size_t i_secret_len, const char *psz_label); + /** See vlc_keystore_find() */ + unsigned int (*pf_find)(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX], + vlc_keystore_entry **pp_entries); + + /** See vlc_keystore_remove() */ + unsigned int (*pf_remove)(vlc_keystore *p_keystore, + const char *const ppsz_values[KEY_MAX]); +}; + +/** @} @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_main.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_main.h new file mode 100644 index 0000000..77866f2 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_main.h @@ -0,0 +1,38 @@ +/***************************************************************************** + * vlc_main.h: access to all program variables + * Declaration and extern access to LibVLC instance object. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002, 2008 VLC authors and VideoLAN + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \file + * This file defines libvlc_int_t internal libvlc instance + */ + +/***************************************************************************** + * libvlc_internal_instance_t + ***************************************************************************** + * This structure is a LibVLC instance, for use by libvlc core and plugins + *****************************************************************************/ +struct libvlc_int_t +{ + VLC_COMMON_MEMBERS +}; + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_md5.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_md5.h new file mode 100644 index 0000000..e72ff2f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_md5.h @@ -0,0 +1,59 @@ +/***************************************************************************** + * vlc_md5.h: MD5 hash + ***************************************************************************** + * Copyright © 2004-2011 VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + * Rafaël Carré + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MD5_H +# define VLC_MD5_H + +/** + * \file + * This file defines functions and structures to compute MD5 digests + */ + +struct md5_s +{ + uint32_t A, B, C, D; /* chaining variables */ + uint32_t nblocks; + uint8_t buf[64]; + int count; +}; + +VLC_API void InitMD5( struct md5_s * ); +VLC_API void AddMD5( struct md5_s *, const void *, size_t ); +VLC_API void EndMD5( struct md5_s * ); + +/** + * Returns a char representation of the md5 hash, as shown by UNIX md5 or + * md5sum tools. + */ +static inline char * psz_md5_hash( struct md5_s *md5_s ) +{ + char *psz = (char*)malloc( 33 ); /* md5 string is 32 bytes + NULL character */ + if( likely(psz) ) + { + for( int i = 0; i < 16; i++ ) + sprintf( &psz[2*i], "%02" PRIx8, md5_s->buf[i] ); + } + return psz; +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_media_library.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_media_library.h new file mode 100644 index 0000000..e7e1f70 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_media_library.h @@ -0,0 +1,127 @@ +/***************************************************************************** + * vlc_media_library.h: SQL-based media library + ***************************************************************************** + * Copyright (C) 2008-2010 the VideoLAN Team and AUTHORS + * $Id: a35d9729ca3705ec792b7be9e1819919f6e601f6 $ + * + * Authors: Antoine Lejeune + * Jean-Philippe André + * Rémi Duraffort + * Adrien Maglo + * Srikanth Raju + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MEDIA_LIBRARY_H +# define VLC_MEDIA_LIBRARY_H + +# ifdef __cplusplus +extern "C" { +# endif + +/***************************************************************************** + * ML Enums + *****************************************************************************/ + +#define ML_PERSON_ARTIST "Artist" +#define ML_PERSON_ALBUM_ARTIST "Album Artist" +#define ML_PERSON_ENCODER "Encoder" +#define ML_PERSON_PUBLISHER "Publisher" + + +/** List of Query select types. + * In a query array or variable argument list, each select type is followed + * by an argument (X) of variable type (char* or int, @see ml_element_t). + * These types can be used either in the query list or in the result array. + * Some types are reserved for the result array: + */ +typedef enum +{ + ML_ALBUM = 1, /**< Album Title */ + ML_ALBUM_ID, /**< Album ID */ + ML_ALBUM_COVER, /**< Album Cover art url */ + /* FIXME: Remove ML_ARTIST */ + ML_ARTIST, /**< Artist, interpreted as ML_PEOPLE + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_ARTIST_ID, /**< Artist ID, interpreted as ML_PEOPLE_ID + && ML_PEOPLE_ROLE = ML_PERSON_ARTIST */ + ML_COMMENT, /**< Comment about media */ + ML_COUNT_MEDIA, /**< Number of medias */ + ML_COUNT_ALBUM, /**< Number of albums */ + ML_COUNT_PEOPLE, /**< Number of people */ + ML_COVER, /**< Cover art url */ + ML_DURATION, /**< Duration in ms */ + ML_DISC_NUMBER, /**< Disc number of the track */ + ML_EXTRA, /**< Extra/comment (string) on the media */ + ML_FIRST_PLAYED, /**< First time media was played */ + ML_FILESIZE, /**< Size of the media file */ + ML_GENRE, /**< Genre of the media (if any) */ + ML_ID, /**< Media ID */ + ML_IMPORT_TIME, /**< Date when media was imported */ + ML_LANGUAGE, /**< Language */ + ML_LAST_PLAYED, /**< Last play UNIX timestamp */ + ML_LAST_SKIPPED, /**< Time when media was last skipped */ + ML_ORIGINAL_TITLE, /**< Media original title (if any) */ + ML_PEOPLE, /**< Any People associated with this media */ + ML_PEOPLE_ID, /**< Id of a person */ + ML_PEOPLE_ROLE, /**< Person role */ + ML_PLAYED_COUNT, /**< Media play count */ + ML_PREVIEW, /**< Url of the video preview */ + ML_SKIPPED_COUNT, /**< Number of times skipped */ + ML_SCORE, /**< Computed media score */ + ML_TITLE, /**< Media title */ + ML_TRACK_NUMBER, /**< Media track number (if any) */ + ML_TYPE, /**< Media type. @see ml_type_e */ + ML_URI, /**< Media full URI. */ + ML_VOTE, /**< Media user vote value */ + ML_YEAR, /**< Media publishing year */ + ML_DIRECTORY, /**< Monitored directory */ + ML_MEDIA, /**< Full media descriptor. @see ml_media_t */ + ML_MEDIA_SPARSE, /**< Sparse media. @see ml_media_t */ + ML_MEDIA_EXTRA, /**< Sparse + Extra = Full media */ + + /* Some special elements */ + ML_LIMIT = -1, /**< Limit a query to X results */ + ML_SORT_DESC = -2, /**< Sort a query descending on argument X */ + ML_SORT_ASC = -3, /**< Sort a query ascending on argument X */ + ML_DISTINCT = -4, /**< Add DISTINCT to SELECT statements. */ + ML_END = -42 /**< End of argument list */ +} ml_select_e; + +/** Media types (audio, video, etc...) */ +typedef enum +{ + ML_UNKNOWN = 0, /**< Unknown media type */ + ML_AUDIO = 1 << 0, /**< Audio only media */ + ML_VIDEO = 1 << 1, /**< Video media. May contain audio channels */ + ML_STREAM = 1 << 2, /**< Streamed media = not a local file */ + ML_NODE = 1 << 3, /**< Nodes like simple nodes, directories, playlists, etc */ + ML_REMOVABLE = 1 << 4, /**< Removable media: CD/DVD/Card/... */ +} ml_type_e; + +/** Query result item/list type: integers, strings, medias, timestamps */ +typedef enum { + ML_TYPE_INT, /**< Object is an int */ + ML_TYPE_PSZ, /**< A string char* */ + ML_TYPE_TIME, /**< A timestamp mtime_t */ + ML_TYPE_MEDIA, /**< A pointer to a media ml_media_t* */ +} ml_result_type_e; + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* VLC_MEDIA_LIBRARY_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_memstream.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_memstream.h new file mode 100644 index 0000000..0ed78a7 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_memstream.h @@ -0,0 +1,76 @@ +/***************************************************************************** + * vlc_memstream.h: + ***************************************************************************** + * Copyright (C) 2016 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MEMSTREAM_H +# define VLC_MEMSTREAM_H 1 + +# include +# include + +struct vlc_memstream +{ + union + { + FILE *stream; + int error; + }; + char *ptr; + size_t length; +}; + +VLC_API +int vlc_memstream_open(struct vlc_memstream *ms); + +VLC_API +int vlc_memstream_flush(struct vlc_memstream *ms) VLC_USED; + +VLC_API +int vlc_memstream_close(struct vlc_memstream *ms) VLC_USED; + +VLC_API +size_t vlc_memstream_write(struct vlc_memstream *ms, + const void *ptr, size_t len); + +VLC_API +int vlc_memstream_putc(struct vlc_memstream *ms, int c); + +VLC_API +int vlc_memstream_puts(struct vlc_memstream *ms, const char *str); + +VLC_API +int vlc_memstream_vprintf(struct vlc_memstream *ms, const char *fmt, + va_list args); + +VLC_API +int vlc_memstream_printf(struct vlc_memstream *s, const char *fmt, + ...) VLC_FORMAT(2,3); + +# ifdef __GNUC__ +static inline int vlc_memstream_puts_len(struct vlc_memstream *ms, + const char *str, size_t len) +{ + return (vlc_memstream_write(ms, str, len) == len) ? (int)len : EOF; +} +# define vlc_memstream_puts(ms,s) \ + (__builtin_constant_p(__builtin_strlen(s)) ? \ + vlc_memstream_puts_len(ms,s,__builtin_strlen(s)) : \ + vlc_memstream_puts(ms,s)) +# endif +#endif /* VLC_MEMSTREAM_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_messages.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_messages.h new file mode 100644 index 0000000..bcf1bca --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_messages.h @@ -0,0 +1,108 @@ +/***************************************************************************** + * vlc_messages.h: messages interface + * This library provides basic functions for threads to interact with user + * interface, such as message output. + ***************************************************************************** + * Copyright (C) 1999, 2000, 2001, 2002 VLC authors and VideoLAN + * $Id: 63f9476cd5e6d6d4e274b4d4a7b947ec59d2843e $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MESSAGES_H_ +#define VLC_MESSAGES_H_ + +#include + +/** + * \defgroup messages Logging + * \brief Message logs + * + * Functions for modules to emit log messages. + * + * @{ + * \file + * Logging functions + */ + +/** Message types */ +enum vlc_log_type +{ + VLC_MSG_INFO=0, /**< Important information */ + VLC_MSG_ERR, /**< Error */ + VLC_MSG_WARN, /**< Warning */ + VLC_MSG_DBG, /**< Debug */ +}; + +/** + * Log message + */ +typedef struct vlc_log_t +{ + uintptr_t i_object_id; /**< Emitter (temporarily) unique object ID or 0 */ + const char *psz_object_type; /**< Emitter object type name */ + const char *psz_module; /**< Emitter module (source code) */ + const char *psz_header; /**< Additional header (used by VLM media) */ + const char *file; /**< Source code file name or NULL */ + int line; /**< Source code file line number or -1 */ + const char *func; /**< Source code calling function name or NULL */ + unsigned long tid; /**< Emitter thread ID */ +} vlc_log_t; + +VLC_API void vlc_Log(vlc_object_t *obj, int prio, const char *module, + const char *file, unsigned line, const char *func, + const char *format, ...) VLC_FORMAT(7, 8); +VLC_API void vlc_vaLog(vlc_object_t *obj, int prio, const char *module, + const char *file, unsigned line, const char *func, + const char *format, va_list ap); +#define msg_GenericVa(o, p, fmt, ap) \ + vlc_vaLog(VLC_OBJECT(o), p, vlc_module_name, __FILE__, __LINE__, \ + __func__, fmt, ap) + +#define msg_Generic(o, p, ...) \ + vlc_Log(VLC_OBJECT(o), p, vlc_module_name, __FILE__, __LINE__, \ + __func__, __VA_ARGS__) +#define msg_Info(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_INFO, __VA_ARGS__) +#define msg_Err(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_ERR, __VA_ARGS__) +#define msg_Warn(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_WARN, __VA_ARGS__) +#define msg_Dbg(p_this, ...) \ + msg_Generic(p_this, VLC_MSG_DBG, __VA_ARGS__) + +extern const char vlc_module_name[]; + +VLC_API const char *vlc_strerror(int); +VLC_API const char *vlc_strerror_c(int); + +/** + * Message logging callback signature. + * \param data data pointer as provided to vlc_msg_SetCallback(). + * \param type message type (VLC_MSG_* values from enum vlc_log_type) + * \param item meta information + * \param fmt format string + * \param args format string arguments + */ +typedef void (*vlc_log_cb) (void *data, int type, const vlc_log_t *item, + const char *fmt, va_list args); + +/** + * @} + */ +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_meta.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_meta.h new file mode 100644 index 0000000..9791bb6 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_meta.h @@ -0,0 +1,165 @@ +/***************************************************************************** + * vlc_meta.h: Stream meta-data + ***************************************************************************** + * Copyright (C) 2004 VLC authors and VideoLAN + * $Id: d390d0bc4df47994d296c5720d1869c458b16cb5 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_H +#define VLC_META_H 1 + +/** + * \file + * This file defines functions and structures for stream meta-data in vlc + * + */ + +typedef enum vlc_meta_type_t +{ + vlc_meta_Title, + vlc_meta_Artist, + vlc_meta_Genre, + vlc_meta_Copyright, + vlc_meta_Album, + vlc_meta_TrackNumber, + vlc_meta_Description, + vlc_meta_Rating, + vlc_meta_Date, + vlc_meta_Setting, + vlc_meta_URL, + vlc_meta_Language, + vlc_meta_NowPlaying, + vlc_meta_ESNowPlaying, + vlc_meta_Publisher, + vlc_meta_EncodedBy, + vlc_meta_ArtworkURL, + vlc_meta_TrackID, + vlc_meta_TrackTotal, + vlc_meta_Director, + vlc_meta_Season, + vlc_meta_Episode, + vlc_meta_ShowName, + vlc_meta_Actors, + vlc_meta_AlbumArtist, + vlc_meta_DiscNumber, + vlc_meta_DiscTotal +} vlc_meta_type_t; + +#define VLC_META_TYPE_COUNT 27 + +#define ITEM_PREPARSED 1 +#define ITEM_ART_FETCHED 2 +#define ITEM_ART_NOTFOUND 4 + +/** + * Basic function to deal with meta + */ +struct vlc_meta_t; + +VLC_API vlc_meta_t * vlc_meta_New( void ) VLC_USED; +VLC_API void vlc_meta_Delete( vlc_meta_t *m ); +VLC_API void vlc_meta_Set( vlc_meta_t *p_meta, vlc_meta_type_t meta_type, const char *psz_val ); +VLC_API const char * vlc_meta_Get( const vlc_meta_t *p_meta, vlc_meta_type_t meta_type ); + +VLC_API void vlc_meta_AddExtra( vlc_meta_t *m, const char *psz_name, const char *psz_value ); +VLC_API const char * vlc_meta_GetExtra( const vlc_meta_t *m, const char *psz_name ); +VLC_API unsigned vlc_meta_GetExtraCount( const vlc_meta_t *m ); + +/** + * Allocate a copy of all extra meta names and a table with it. + * Be sure to free both the returned pointers and its name. + */ +VLC_API char ** vlc_meta_CopyExtraNames( const vlc_meta_t *m ) VLC_USED; + +VLC_API void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src ); + +VLC_API int vlc_meta_GetStatus( vlc_meta_t *m ); +VLC_API void vlc_meta_SetStatus( vlc_meta_t *m, int status ); + +/** + * Returns a localizes string describing the meta + */ +VLC_API const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type ); + +typedef struct meta_export_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + const char *psz_file; +} meta_export_t; + +VLC_API int input_item_WriteMeta(vlc_object_t *, input_item_t *); + +/* Setters for meta. + * Warning: Make sure to use the input_item meta setters (defined in vlc_input_item.h) + * instead of those one. */ +#define vlc_meta_SetTitle( meta, b ) vlc_meta_Set( meta, vlc_meta_Title, b ) +#define vlc_meta_SetArtist( meta, b ) vlc_meta_Set( meta, vlc_meta_Artist, b ) +#define vlc_meta_SetGenre( meta, b ) vlc_meta_Set( meta, vlc_meta_Genre, b ) +#define vlc_meta_SetCopyright( meta, b ) vlc_meta_Set( meta, vlc_meta_Copyright, b ) +#define vlc_meta_SetAlbum( meta, b ) vlc_meta_Set( meta, vlc_meta_Album, b ) +#define vlc_meta_SetTrackNum( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackNumber, b ) +#define vlc_meta_SetDescription( meta, b ) vlc_meta_Set( meta, vlc_meta_Description, b ) +#define vlc_meta_SetRating( meta, b ) vlc_meta_Set( meta, vlc_meta_Rating, b ) +#define vlc_meta_SetDate( meta, b ) vlc_meta_Set( meta, vlc_meta_Date, b ) +#define vlc_meta_SetSetting( meta, b ) vlc_meta_Set( meta, vlc_meta_Setting, b ) +#define vlc_meta_SetURL( meta, b ) vlc_meta_Set( meta, vlc_meta_URL, b ) +#define vlc_meta_SetLanguage( meta, b ) vlc_meta_Set( meta, vlc_meta_Language, b ) +#define vlc_meta_SetNowPlaying( meta, b ) vlc_meta_Set( meta, vlc_meta_NowPlaying, b ) +#define vlc_meta_SetPublisher( meta, b ) vlc_meta_Set( meta, vlc_meta_Publisher, b ) +#define vlc_meta_SetEncodedBy( meta, b ) vlc_meta_Set( meta, vlc_meta_EncodedBy, b ) +#define vlc_meta_SetArtURL( meta, b ) vlc_meta_Set( meta, vlc_meta_ArtworkURL, b ) +#define vlc_meta_SetTrackID( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackID, b ) +#define vlc_meta_SetTrackTotal( meta, b ) vlc_meta_Set( meta, vlc_meta_TrackTotal, b ) +#define vlc_meta_SetDirector( meta, b ) vlc_meta_Set( meta, vlc_meta_Director, b ) +#define vlc_meta_SetSeason( meta, b ) vlc_meta_Set( meta, vlc_meta_Season, b ) +#define vlc_meta_SetEpisode( meta, b ) vlc_meta_Set( meta, vlc_meta_Episode, b ) +#define vlc_meta_SetShowName( meta, b ) vlc_meta_Set( meta, vlc_meta_ShowName, b ) +#define vlc_meta_SetActors( meta, b ) vlc_meta_Set( meta, vlc_meta_Actors, b ) +#define vlc_meta_SetAlbumArtist( meta, b ) vlc_meta_Set( meta, vlc_meta_AlbumArtist, b ) +#define vlc_meta_SetDiscNumber( meta, b ) vlc_meta_Set( meta, vlc_meta_DiscNumber, b ) + +#define VLC_META_TITLE vlc_meta_TypeToLocalizedString( vlc_meta_Title ) +#define VLC_META_ARTIST vlc_meta_TypeToLocalizedString( vlc_meta_Artist ) +#define VLC_META_GENRE vlc_meta_TypeToLocalizedString( vlc_meta_Genre ) +#define VLC_META_COPYRIGHT vlc_meta_TypeToLocalizedString( vlc_meta_Copyright ) +#define VLC_META_ALBUM vlc_meta_TypeToLocalizedString( vlc_meta_Album ) +#define VLC_META_TRACK_NUMBER vlc_meta_TypeToLocalizedString( vlc_meta_TrackNumber ) +#define VLC_META_DESCRIPTION vlc_meta_TypeToLocalizedString( vlc_meta_Description ) +#define VLC_META_RATING vlc_meta_TypeToLocalizedString( vlc_meta_Rating ) +#define VLC_META_DATE vlc_meta_TypeToLocalizedString( vlc_meta_Date ) +#define VLC_META_SETTING vlc_meta_TypeToLocalizedString( vlc_meta_Setting ) +#define VLC_META_URL vlc_meta_TypeToLocalizedString( vlc_meta_URL ) +#define VLC_META_LANGUAGE vlc_meta_TypeToLocalizedString( vlc_meta_Language ) +#define VLC_META_NOW_PLAYING vlc_meta_TypeToLocalizedString( vlc_meta_NowPlaying ) +#define VLC_META_PUBLISHER vlc_meta_TypeToLocalizedString( vlc_meta_Publisher ) +#define VLC_META_ENCODED_BY vlc_meta_TypeToLocalizedString( vlc_meta_EncodedBy ) +#define VLC_META_ART_URL vlc_meta_TypeToLocalizedString( vlc_meta_ArtworkURL ) +#define VLC_META_TRACKID vlc_meta_TypeToLocalizedString( vlc_meta_TrackID ) +#define VLC_META_DIRECTOR vlc_meta_TypeToLocalizedString( vlc_meta_Director ) +#define VLC_META_SEASON vlc_meta_TypeToLocalizedString( vlc_meta_Season ) +#define VLC_META_EPISODE vlc_meta_TypeToLocalizedString( vlc_meta_Episode ) +#define VLC_META_SHOW_NAME vlc_meta_TypeToLocalizedString( vlc_meta_ShowName ) +#define VLC_META_ACTORS vlc_meta_TypeToLocalizedString( vlc_meta_Actors ) +#define VLC_META_ALBUMARTIST vlc_meta_TypeToLocalizedString( vlc_meta_AlbumArtist ) +#define VLC_META_DISCNUMBER vlc_meta_TypeToLocalizedString( vlc_meta_DiscNumber ) + +#define VLC_META_EXTRA_MB_ALBUMID "MB_ALBUMID" + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_meta_fetcher.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_meta_fetcher.h new file mode 100644 index 0000000..e806145 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_meta_fetcher.h @@ -0,0 +1,38 @@ +/***************************************************************************** + * vlc_meta_fetcher.h + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_META_FETCHER_H +#define VLC_META_FETCHER_H 1 + +typedef enum meta_fetcher_scope_t +{ + FETCHER_SCOPE_LOCAL = 0x01, + FETCHER_SCOPE_NETWORK = 0x02, + FETCHER_SCOPE_ANY = 0x03 +} meta_fetcher_scope_t; + +typedef struct meta_fetcher_t +{ + VLC_COMMON_MEMBERS + input_item_t *p_item; + meta_fetcher_scope_t e_scope; +} meta_fetcher_t; + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_mime.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_mime.h new file mode 100644 index 0000000..f04fc95 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_mime.h @@ -0,0 +1,31 @@ +/***************************************************************************** + * vlc_mime.h: Mime type recognition + ***************************************************************************** + * Copyright (C) 2012 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MIME_H +#define VLC_MIME_H 1 + +/** + * \file + * Mime type recognition helpers. + */ + +VLC_API const char * vlc_mime_Ext2Mime( const char *psz_url ); + +#endif /* _VLC_MIME_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_modules.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_modules.h new file mode 100644 index 0000000..a425fe8 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_modules.h @@ -0,0 +1,85 @@ +/***************************************************************************** + * vlc_modules.h : Module descriptor and load functions + ***************************************************************************** + * Copyright (C) 2001-2011 VLC authors and VideoLAN + * $Id: c2d3c26d20c3c45529bc01afb40377560cdf7306 $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MODULES_H +#define VLC_MODULES_H 1 + +/** + * \file + * This file defines functions for modules in vlc + */ + +typedef int (*vlc_activate_t)(void *func, va_list args); +typedef void (*vlc_deactivate_t)(void *func, va_list args); + +/***************************************************************************** + * Exported functions. + *****************************************************************************/ + +VLC_API module_t * vlc_module_load( vlc_object_t *obj, const char *cap, const char *name, bool strict, vlc_activate_t probe, ... ) VLC_USED; +#define vlc_module_load(o,c,n,s,...) \ + vlc_module_load(VLC_OBJECT(o),c,n,s,__VA_ARGS__) +VLC_API void vlc_module_unload( vlc_object_t *obj, module_t *, + vlc_deactivate_t deinit, ... ); +#define vlc_module_unload(o,m,d,...) \ + vlc_module_unload(VLC_OBJECT(o),m,d,__VA_ARGS__) + +VLC_API module_t * module_need( vlc_object_t *, const char *, const char *, bool ) VLC_USED; +#define module_need(a,b,c,d) module_need(VLC_OBJECT(a),b,c,d) +VLC_API void module_unneed( vlc_object_t *, module_t * ); +#define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b) +VLC_API bool module_exists(const char *) VLC_USED; +VLC_API module_t * module_find(const char *) VLC_USED; + +int module_start(vlc_object_t *, const module_t *); +#define module_start(o, m) module_start(VLC_OBJECT(o),m) +void module_stop(vlc_object_t *, const module_t *); +#define module_stop(o, m) module_stop(VLC_OBJECT(o),m) + +VLC_API module_config_t * module_config_get( const module_t *, unsigned * ) VLC_USED; +VLC_API void module_config_free( module_config_t * ); + +VLC_API void module_list_free(module_t **); +VLC_API module_t ** module_list_get(size_t *n) VLC_USED; + +VLC_API bool module_provides( const module_t *m, const char *cap ); +VLC_API const char * module_get_object( const module_t *m ) VLC_USED; +VLC_API const char * module_get_name( const module_t *m, bool long_name ) VLC_USED; +#define module_GetLongName( m ) module_get_name( m, true ) +VLC_API const char * module_get_help( const module_t *m ) VLC_USED; +VLC_API const char * module_get_capability( const module_t *m ) VLC_USED; +VLC_API int module_get_score( const module_t *m ) VLC_USED; +VLC_API const char * module_gettext( const module_t *, const char * ) VLC_USED; + +VLC_USED static inline module_t *module_get_main (void) +{ + return module_find ("core"); +} +#define module_get_main(a) module_get_main() + +VLC_USED static inline bool module_is_main( const module_t * p_module ) +{ + return !strcmp( module_get_object( p_module ), "core" ); +} + +#endif /* VLC_MODULES_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_mouse.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_mouse.h new file mode 100644 index 0000000..fa07ef1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_mouse.h @@ -0,0 +1,148 @@ +/***************************************************************************** + * vlc_mouse.h: mouse related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: 481c3598e905db66805cf9a8ca58f6702921e4f0 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef _VLC_MOUSE_H +#define _VLC_MOUSE_H 1 + +/** + * Mouse buttons + */ +enum +{ + MOUSE_BUTTON_LEFT=0, + MOUSE_BUTTON_CENTER, + MOUSE_BUTTON_RIGHT, + MOUSE_BUTTON_WHEEL_UP, + MOUSE_BUTTON_WHEEL_DOWN, + MOUSE_BUTTON_WHEEL_LEFT, + MOUSE_BUTTON_WHEEL_RIGHT, + MOUSE_BUTTON_MAX +}; + +/** + * Mouse state + */ +typedef struct vlc_mouse_t +{ + /* Coordinate */ + int i_x; + int i_y; + /* Mask of pressed button */ + int i_pressed; + /* Is double clicked */ + bool b_double_click; +} vlc_mouse_t; + +static inline void vlc_mouse_Init( vlc_mouse_t *p_mouse ) +{ + p_mouse->i_x = 0; + p_mouse->i_y = 0; + p_mouse->i_pressed = 0; + p_mouse->b_double_click = false; +} + +/* */ +static inline void vlc_mouse_SetPressed( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed |= 1 << i_button; +} +static inline void vlc_mouse_SetReleased( vlc_mouse_t *p_mouse, + int i_button ) +{ + p_mouse->i_pressed &= ~(1 << i_button); +} +static inline void vlc_mouse_SetPosition( vlc_mouse_t *p_mouse, + int i_x, int i_y ) +{ + p_mouse->i_x = i_x; + p_mouse->i_y = i_y; +} + +/* */ +static inline bool vlc_mouse_IsPressed( const vlc_mouse_t *p_mouse, + int i_button ) +{ + return ( p_mouse->i_pressed & (1 << i_button) ) != 0; +} +static inline bool vlc_mouse_IsLeftPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_LEFT ); +} +static inline bool vlc_mouse_IsCenterPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_CENTER ); +} +static inline bool vlc_mouse_IsRightPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_RIGHT ); +} +static inline bool vlc_mouse_IsWheelUpPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_UP ); +} +static inline bool vlc_mouse_IsWheelDownPressed( const vlc_mouse_t *p_mouse ) +{ + return vlc_mouse_IsPressed( p_mouse, MOUSE_BUTTON_WHEEL_DOWN ); +} +static inline void vlc_mouse_GetMotion( int *pi_x, int *pi_y, + const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + *pi_x = p_new->i_x - p_old->i_x; + *pi_y = p_new->i_y - p_old->i_y; +} + +/* */ +static inline bool vlc_mouse_HasChanged( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y || + p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasMoved( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_x != p_new->i_x || p_old->i_y != p_new->i_y; +} +static inline bool vlc_mouse_HasButton( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new ) +{ + return p_old->i_pressed != p_new->i_pressed; +} +static inline bool vlc_mouse_HasPressed( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) == 0 && (p_new->i_pressed & i_mask); +} +static inline bool vlc_mouse_HasReleased( const vlc_mouse_t *p_old, + const vlc_mouse_t *p_new, + int i_button ) +{ + const int i_mask = 1 << i_button; + return (p_old->i_pressed & i_mask) && (p_new->i_pressed & i_mask) == 0; +} +#endif /* _VLC_MOUSE_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_mtime.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_mtime.h new file mode 100644 index 0000000..4ba1a57 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_mtime.h @@ -0,0 +1,78 @@ +/***************************************************************************** + * vlc_mtime.h: high resolution time management functions + ***************************************************************************** + * This header provides portable high precision time management functions, + * which should be the only ones used in other segments of the program, since + * functions like gettimeofday() and ftime() are not always supported. + * Most functions are declared as inline or as macros since they are only + * interfaces to system calls and have to be called frequently. + * 'm' stands for 'micro', since maximum resolution is the microsecond. + * Functions prototyped are implemented in interface/mtime.c. + ***************************************************************************** + * Copyright (C) 1996, 1997, 1998, 1999, 2000 VLC authors and VideoLAN + * $Id: 311eb670eb7b9f35668196b78c9fa3c5cf1779db $ + * + * Authors: Vincent Seguin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef __VLC_MTIME_H +# define __VLC_MTIME_H 1 + +/***************************************************************************** + * LAST_MDATE: date which will never happen + ***************************************************************************** + * This date can be used as a 'never' date, to mark missing events in a function + * supposed to return a date, such as nothing to display in a function + * returning the date of the first image to be displayed. It can be used in + * comparaison with other values: all existing dates will be earlier. + *****************************************************************************/ +#define LAST_MDATE ((mtime_t)((uint64_t)(-1)/2)) + +/***************************************************************************** + * MSTRTIME_MAX_SIZE: maximum possible size of mstrtime + ***************************************************************************** + * This values is the maximal possible size of the string returned by the + * mstrtime() function, including '-' and the final '\0'. It should be used to + * allocate the buffer. + *****************************************************************************/ +#define MSTRTIME_MAX_SIZE 22 + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API char * secstotimestr( char *psz_buffer, int32_t secs ); + +/***************************************************************************** + * date_t: date incrementation without long-term rounding errors + *****************************************************************************/ +struct date_t +{ + mtime_t date; + uint32_t i_divider_num; + uint32_t i_divider_den; + uint32_t i_remainder; +}; + +VLC_API void date_Init( date_t *, uint32_t, uint32_t ); +VLC_API void date_Change( date_t *, uint32_t, uint32_t ); +VLC_API void date_Set( date_t *, mtime_t ); +VLC_API mtime_t date_Get( const date_t * ); +VLC_API void date_Move( date_t *, mtime_t ); +VLC_API mtime_t date_Increment( date_t *, uint32_t ); +VLC_API mtime_t date_Decrement( date_t *, uint32_t ); +VLC_API uint64_t NTPtime64( void ); +#endif /* !__VLC_MTIME_ */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_network.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_network.h new file mode 100644 index 0000000..caa4dcc --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_network.h @@ -0,0 +1,299 @@ +/***************************************************************************** + * vlc_network.h: interface to communicate with network plug-ins + ***************************************************************************** + * Copyright (C) 2002-2005 VLC authors and VideoLAN + * Copyright © 2006-2007 Rémi Denis-Courmont + * $Id: 184c23acae9ddf2413b3df600523280a8f43975b $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_NETWORK_H +# define VLC_NETWORK_H + +/** + * \ingroup os + * \defgroup net Networking + * @{ + * \file + * Definitions for sockets and low-level networking + * \defgroup sockets Internet sockets + * @{ + */ + +#include +#include + +#if defined( _WIN32 ) +# define _NO_OLDNAMES 1 +# include +# include +# define net_errno (WSAGetLastError()) +# define net_Close(fd) ((void)closesocket((SOCKET)fd)) +# ifndef IPV6_V6ONLY +# define IPV6_V6ONLY 27 +# endif +#else +# include +# include +# include +# define net_errno errno +# define net_Close(fd) ((void)vlc_close(fd)) +#endif + +#ifndef MSG_NOSIGNAL +# define MSG_NOSIGNAL 0 +#endif + +/** + * Creates a socket file descriptor. + * + * This function creates a socket, similar to the standard socket() function. + * However, the new file descriptor has the close-on-exec flag set atomically, + * so as to avoid leaking the descriptor to child processes. + * + * The non-blocking flag can also optionally be set. + * + * @param pf protocol family + * @param type socket type + * @param proto network protocol + * @param nonblock true to create a non-blocking socket + * @return a new file descriptor or -1 on error + */ +VLC_API int vlc_socket(int pf, int type, int proto, bool nonblock) VLC_USED; + +/** + * Creates a pair of socket file descriptors. + * + * This function creates a pair of sockets that are mutually connected, + * much like the standard socketpair() function. However, the new file + * descriptors have the close-on-exec flag set atomically. + * See also vlc_socket(). + * + * @param pf protocol family + * @param type socket type + * @param proto network protocol + * @param nonblock true to create non-blocking sockets + * @retval 0 on success + * @retval -1 on failure + */ +VLC_API int vlc_socketpair(int pf, int type, int proto, int fds[2], + bool nonblock); + +struct sockaddr; + +/** + * Accepts an inbound connection request on a listening socket. + * + * This function creates a connected socket from a listening socket, much like + * the standard accept() function. However, the new file descriptor has the + * close-on-exec flag set atomically. See also vlc_socket(). + * + * @param lfd listening socket file descriptor + * @param addr pointer to the peer address or NULL [OUT] + * @param alen pointer to the length of the peer address or NULL [OUT] + * @param nonblock whether to put the new socket in non-blocking mode + * @return a new file descriptor or -1 on error + */ +VLC_API int vlc_accept(int lfd, struct sockaddr *addr, socklen_t *alen, + bool nonblock) VLC_USED; + +# ifdef __cplusplus +extern "C" { +# endif + +/* Portable networking layer communication */ +int net_Socket (vlc_object_t *obj, int family, int socktype, int proto); + +VLC_API int net_Connect(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); +#define net_Connect(a, b, c, d, e) net_Connect(VLC_OBJECT(a), b, c, d, e) + +VLC_API int * net_Listen(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol); + +#define net_ListenTCP(a, b, c) net_Listen(VLC_OBJECT(a), b, c, \ + SOCK_STREAM, IPPROTO_TCP) + +static inline int net_ConnectTCP (vlc_object_t *obj, const char *host, int port) +{ + return net_Connect (obj, host, port, SOCK_STREAM, IPPROTO_TCP); +} +#define net_ConnectTCP(a, b, c) net_ConnectTCP(VLC_OBJECT(a), b, c) + +VLC_API int net_AcceptSingle(vlc_object_t *obj, int lfd); + +VLC_API int net_Accept( vlc_object_t *, int * ); +#define net_Accept(a, b) \ + net_Accept(VLC_OBJECT(a), b) + +VLC_API int net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim, int proto ); +#define net_ConnectDgram(a, b, c, d, e ) \ + net_ConnectDgram(VLC_OBJECT(a), b, c, d, e) + +static inline int net_ConnectUDP (vlc_object_t *obj, const char *host, int port, int hlim) +{ + return net_ConnectDgram (obj, host, port, hlim, IPPROTO_UDP); +} + +VLC_API int net_OpenDgram( vlc_object_t *p_this, const char *psz_bind, int i_bind, const char *psz_server, int i_server, int proto ); +#define net_OpenDgram( a, b, c, d, e, g ) \ + net_OpenDgram(VLC_OBJECT(a), b, c, d, e, g) + +static inline int net_ListenUDP1 (vlc_object_t *obj, const char *host, int port) +{ + return net_OpenDgram (obj, host, port, NULL, 0, IPPROTO_UDP); +} + +VLC_API void net_ListenClose( int *fd ); + +int net_Subscribe (vlc_object_t *obj, int fd, const struct sockaddr *addr, + socklen_t addrlen); + +VLC_API int net_SetCSCov( int fd, int sendcov, int recvcov ); + +VLC_API ssize_t net_Read( vlc_object_t *p_this, int fd, void *p_data, size_t i_data ); +#define net_Read(a,b,c,d) net_Read(VLC_OBJECT(a),b,c,d) +VLC_API ssize_t net_Write( vlc_object_t *p_this, int fd, const void *p_data, size_t i_data ); +#define net_Write(a,b,c,d) net_Write(VLC_OBJECT(a),b,c,d) +VLC_API char * net_Gets( vlc_object_t *p_this, int fd ); +#define net_Gets(a,b) net_Gets(VLC_OBJECT(a),b) + + +VLC_API ssize_t net_Printf( vlc_object_t *p_this, int fd, const char *psz_fmt, ... ) VLC_FORMAT( 3, 4 ); +#define net_Printf(o,fd,...) net_Printf(VLC_OBJECT(o),fd, __VA_ARGS__) +VLC_API ssize_t net_vaPrintf( vlc_object_t *p_this, int fd, const char *psz_fmt, va_list args ); +#define net_vaPrintf(a,b,c,d) net_vaPrintf(VLC_OBJECT(a),b,c,d) + +VLC_API int vlc_close(int); + +/** @} */ + +/* Portable network names/addresses resolution layer */ + +#define NI_MAXNUMERICHOST 64 + +#ifndef AI_NUMERICSERV +# define AI_NUMERICSERV 0 +#endif +#ifndef AI_IDN +# define AI_IDN 0 /* GNU/libc extension */ +#endif + +#ifdef _WIN32 +# if !defined(WINAPI_FAMILY) || WINAPI_FAMILY != WINAPI_FAMILY_APP +# undef gai_strerror +# define gai_strerror gai_strerrorA +# endif +#endif + +VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int ); +VLC_API int vlc_getaddrinfo (const char *, unsigned, + const struct addrinfo *, struct addrinfo **); +VLC_API int vlc_getaddrinfo_i11e(const char *, unsigned, + const struct addrinfo *, struct addrinfo **); + +static inline bool +net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len) +{ + switch (addr->sa_family) + { +#ifdef IN_MULTICAST + case AF_INET: + { + const struct sockaddr_in *v4 = (const struct sockaddr_in *)addr; + if ((size_t)len < sizeof (*v4)) + return false; + return IN_MULTICAST (ntohl (v4->sin_addr.s_addr)) != 0; + } +#endif + +#ifdef IN6_IS_ADDR_MULTICAST + case AF_INET6: + { + const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr; + if ((size_t)len < sizeof (*v6)) + return false; + return IN6_IS_ADDR_MULTICAST (&v6->sin6_addr) != 0; + } +#endif + } + + return false; +} + + +static inline int net_GetSockAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getsockname( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline int net_GetPeerAddress( int fd, char *address, int *port ) +{ + struct sockaddr_storage addr; + socklen_t addrlen = sizeof( addr ); + + return getpeername( fd, (struct sockaddr *)&addr, &addrlen ) + || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address, + NI_MAXNUMERICHOST, port, NI_NUMERICHOST ) + ? VLC_EGENERIC : 0; +} + +static inline uint16_t net_GetPort (const struct sockaddr *addr) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + return ((const struct sockaddr_in6 *)addr)->sin6_port; +#endif + case AF_INET: + return ((const struct sockaddr_in *)addr)->sin_port; + } + return 0; +} + +static inline void net_SetPort (struct sockaddr *addr, uint16_t port) +{ + switch (addr->sa_family) + { +#ifdef AF_INET6 + case AF_INET6: + ((struct sockaddr_in6 *)addr)->sin6_port = port; + break; +#endif + case AF_INET: + ((struct sockaddr_in *)addr)->sin_port = port; + break; + } +} + +VLC_API char *vlc_getProxyUrl(const char *); + +# ifdef __cplusplus +} +# endif + +/** @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_objects.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_objects.h new file mode 100644 index 0000000..53a65dc --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_objects.h @@ -0,0 +1,75 @@ +/***************************************************************************** + * vlc_objects.h: vlc_object_t definition and manipulation methods + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: 4a2814187a5cc68b0e65d6dce3dd4a0d9e8fbe59 $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/** + * \defgroup vlc_object VLC objects + * @{ + * \file + * Common VLC object defintions + */ + +/* Object flags */ +#define OBJECT_FLAGS_QUIET 0x0002 +#define OBJECT_FLAGS_NOINTERACT 0x0004 +#define OBJECT_FLAGS_INSECURE 0x1000 /* VLC 3.0 only, will be removed */ + +/***************************************************************************** + * The vlc_object_t type. Yes, it's that simple :-) + *****************************************************************************/ +/** The main vlc_object_t structure */ +struct vlc_object_t +{ + VLC_COMMON_MEMBERS +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API void *vlc_object_create( vlc_object_t *, size_t ) VLC_MALLOC VLC_USED; +VLC_API vlc_object_t *vlc_object_find_name( vlc_object_t *, const char * ) VLC_USED VLC_DEPRECATED; +VLC_API void * vlc_object_hold( vlc_object_t * ); +VLC_API void vlc_object_release( vlc_object_t * ); +VLC_API vlc_list_t *vlc_list_children( vlc_object_t * ) VLC_USED; +VLC_API void vlc_list_release( vlc_list_t * ); +VLC_API char *vlc_object_get_name( const vlc_object_t * ) VLC_USED; +#define vlc_object_get_name(o) vlc_object_get_name(VLC_OBJECT(o)) + +#define vlc_object_create(a,b) vlc_object_create( VLC_OBJECT(a), b ) + +#define vlc_object_find_name(a,b) \ + vlc_object_find_name( VLC_OBJECT(a),b) + +#define vlc_object_hold(a) \ + vlc_object_hold( VLC_OBJECT(a) ) + +#define vlc_object_release(a) \ + vlc_object_release( VLC_OBJECT(a) ) + +#define vlc_list_children(a) \ + vlc_list_children( VLC_OBJECT(a) ) + +VLC_API VLC_MALLOC void *vlc_obj_malloc(vlc_object_t *, size_t); +VLC_API VLC_MALLOC void *vlc_obj_calloc(vlc_object_t *, size_t, size_t); +VLC_API void vlc_obj_free(vlc_object_t *, void *); + +/** @} */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_opengl.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_opengl.h new file mode 100644 index 0000000..fdebfeb --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_opengl.h @@ -0,0 +1,121 @@ +/***************************************************************************** + * vlc_opengl.h: VLC GL API + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * Copyright (C) 2011 Rémi Denis-Courmont + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_GL_H +#define VLC_GL_H 1 + +/** + * \file + * This file defines GL structures and functions. + */ + +struct vout_window_t; +struct vout_window_cfg_t; + +/** + * A VLC GL context (and its underlying surface) + */ +typedef struct vlc_gl_t vlc_gl_t; + +struct vlc_gl_t +{ + VLC_COMMON_MEMBERS + + struct vout_window_t *surface; + module_t *module; + void *sys; + + int (*makeCurrent)(vlc_gl_t *); + void (*releaseCurrent)(vlc_gl_t *); + void (*resize)(vlc_gl_t *, unsigned, unsigned); + void (*swap)(vlc_gl_t *); + void*(*getProcAddress)(vlc_gl_t *, const char *); + + enum { + VLC_GL_EXT_DEFAULT, + VLC_GL_EXT_EGL, + VLC_GL_EXT_WGL, + } ext; + + union { + /* if ext == VLC_GL_EXT_EGL */ + struct { + /* call eglQueryString() with current display */ + const char *(*queryString)(vlc_gl_t *, int32_t name); + /* call eglCreateImageKHR() with current display and context, can + * be NULL */ + void *(*createImageKHR)(vlc_gl_t *, unsigned target, void *buffer, + const int32_t *attrib_list); + /* call eglDestroyImageKHR() with current display, can be NULL */ + bool (*destroyImageKHR)(vlc_gl_t *, void *image); + } egl; + /* if ext == VLC_GL_EXT_WGL */ + struct + { + const char *(*getExtensionsString)(vlc_gl_t *); + } wgl; + }; +}; + +enum { + VLC_OPENGL, + VLC_OPENGL_ES2, +}; + +VLC_API vlc_gl_t *vlc_gl_Create(struct vout_window_t *, unsigned, const char *) VLC_USED; +VLC_API void vlc_gl_Release(vlc_gl_t *); +VLC_API void vlc_gl_Hold(vlc_gl_t *); + +static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl) +{ + return gl->makeCurrent(gl); +} + +static inline void vlc_gl_ReleaseCurrent(vlc_gl_t *gl) +{ + gl->releaseCurrent(gl); +} + +static inline void vlc_gl_Resize(vlc_gl_t *gl, unsigned w, unsigned h) +{ + if (gl->resize != NULL) + gl->resize(gl, w, h); +} + +static inline void vlc_gl_Swap(vlc_gl_t *gl) +{ + gl->swap(gl); +} + +static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name) +{ + return (gl->getProcAddress != NULL) ? gl->getProcAddress(gl, name) : NULL; +} + +VLC_API vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *, + const struct vout_window_cfg_t *, + struct vout_window_t **) VLC_USED; +VLC_API bool vlc_gl_surface_CheckSize(vlc_gl_t *, unsigned *w, unsigned *h); +VLC_API void vlc_gl_surface_Destroy(vlc_gl_t *); + +#endif /* VLC_GL_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture.h new file mode 100644 index 0000000..fb35adc --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture.h @@ -0,0 +1,259 @@ +/***************************************************************************** + * vlc_picture.h: picture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: 74f156fbbd6e6a4479754c0e79fbd5374a4a1e2e $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_H +#define VLC_PICTURE_H 1 + +/** + * \file + * This file defines picture structures and functions in vlc + */ + +#include + +/** Description of a planar graphic field */ +typedef struct plane_t +{ + uint8_t *p_pixels; /**< Start of the plane's data */ + + /* Variables used for fast memcpy operations */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + + /** Size of a macropixel, defaults to 1 */ + int i_pixel_pitch; + + /* Variables used for pictures with margins */ + int i_visible_lines; /**< How many visible lines are there ? */ + int i_visible_pitch; /**< How many visible pixels are there ? */ + +} plane_t; + +/** + * Maximum number of plane for a picture + */ +#define PICTURE_PLANE_MAX (VOUT_MAX_PLANES) + +typedef struct picture_context_t +{ + void (*destroy)(struct picture_context_t *); + struct picture_context_t *(*copy)(struct picture_context_t *); +} picture_context_t; + +/** + * Video picture + */ +struct picture_t +{ + /** + * The properties of the picture + */ + video_frame_format_t format; + + plane_t p[PICTURE_PLANE_MAX]; /**< description of the planes */ + int i_planes; /**< number of allocated planes */ + + /** \name Picture management properties + * These properties can be modified using the video output thread API, + * but should never be written directly */ + /**@{*/ + mtime_t date; /**< display date */ + bool b_force; + /**@}*/ + + /** \name Picture dynamic properties + * Those properties can be changed by the decoder + * @{ + */ + bool b_progressive; /**< is it a progressive frame ? */ + bool b_top_field_first; /**< which field is first */ + unsigned int i_nb_fields; /**< # of displayed fields */ + picture_context_t *context; /**< video format-specific data pointer */ + /**@}*/ + + /** Private data - the video output plugin might want to put stuff here to + * keep track of the picture */ + picture_sys_t * p_sys; + + /** Next picture in a FIFO a pictures */ + struct picture_t *p_next; +}; + +/** + * This function will create a new picture. + * The picture created will implement a default release management compatible + * with picture_Hold and picture_Release. This default management will release + * p_sys, gc.p_sys fields if non NULL. + */ +VLC_API picture_t * picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den ) VLC_USED; + +/** + * This function will create a new picture using the given format. + * + * When possible, it is preferred to use this function over picture_New + * as more information about the format is kept. + */ +VLC_API picture_t * picture_NewFromFormat( const video_format_t *p_fmt ) VLC_USED; + +/** + * Resource for a picture. + */ +typedef struct +{ + picture_sys_t *p_sys; + void (*pf_destroy)(picture_t *); + + /* Plane resources + * XXX all fields MUST be set to the right value. + */ + struct + { + uint8_t *p_pixels; /**< Start of the plane's data */ + int i_lines; /**< Number of lines, including margins */ + int i_pitch; /**< Number of bytes in a line, including margins */ + } p[PICTURE_PLANE_MAX]; + +} picture_resource_t; + +/** + * This function will create a new picture using the provided resource. + * + * If the resource is NULL then a plain picture_NewFromFormat is returned. + */ +VLC_API picture_t * picture_NewFromResource( const video_format_t *, const picture_resource_t * ) VLC_USED; + +/** + * This function will increase the picture reference count. + * It will not have any effect on picture obtained from vout + * + * It returns the given picture for convenience. + */ +VLC_API picture_t *picture_Hold( picture_t *p_picture ); + +/** + * This function will release a picture. + * It will not have any effect on picture obtained from vout + */ +VLC_API void picture_Release( picture_t *p_picture ); + +/** + * This function will copy all picture dynamic properties. + */ +VLC_API void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src ); + +/** + * This function will reset a picture information (properties and quantizers). + * It is sometimes useful for reusing pictures (like from a pool). + */ +VLC_API void picture_Reset( picture_t * ); + +/** + * This function will copy the picture pixels. + * You can safely copy between pictures that do not have the same size, + * only the compatible(smaller) part will be copied. + */ +VLC_API void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ); +VLC_API void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ); + +/** + * This function will copy both picture dynamic properties and pixels. + * You have to notice that sometime a simple picture_Hold may do what + * you want without the copy overhead. + * Provided for convenience. + * + * \param p_dst pointer to the destination picture. + * \param p_src pointer to the source picture. + */ +VLC_API void picture_Copy( picture_t *p_dst, const picture_t *p_src ); + +/** + * Perform a shallow picture copy + * + * This function makes a shallow copy of an existing picture. The same planes + * and resources will be used, and the cloned picture reference count will be + * incremented. + * + * \return A clone picture on success, NULL on error. + */ +VLC_API picture_t *picture_Clone(picture_t *pic); + +/** + * This function will export a picture to an encoded bitstream. + * + * pp_image will contain the encoded bitstream in psz_format format. + * + * p_fmt can be NULL otherwise it will be set with the format used for the + * picture before encoding. + * + * i_override_width/height allow to override the width and/or the height of the + * picture to be encoded: + * - if strictly lower than 0, the original dimension will be used. + * - if equal to 0, it will be deduced from the other dimension which must be + * different to 0. + * - if strictly higher than 0, it will override the dimension. + * If at most one of them is > 0 then the picture aspect ratio will be kept. + */ +VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ); + +/** + * This function will setup all fields of a picture_t without allocating any + * memory. + * XXX The memory must already be initialized. + * It does not need to be released. + * + * It will return VLC_EGENERIC if the core does not understand the requested + * format. + * + * It can be useful to get the properties of planes. + */ +VLC_API int picture_Setup( picture_t *, const video_format_t * ); + + +/***************************************************************************** + * Shortcuts to access image components + *****************************************************************************/ + +/* Plane indices */ +enum +{ + Y_PLANE = 0, + U_PLANE = 1, + V_PLANE = 2, + A_PLANE = 3, +}; + +/* Shortcuts */ +#define Y_PIXELS p[Y_PLANE].p_pixels +#define Y_PITCH p[Y_PLANE].i_pitch +#define U_PIXELS p[U_PLANE].p_pixels +#define U_PITCH p[U_PLANE].i_pitch +#define V_PIXELS p[V_PLANE].p_pixels +#define V_PITCH p[V_PLANE].i_pitch +#define A_PIXELS p[A_PLANE].p_pixels +#define A_PITCH p[A_PLANE].i_pitch + +/**@}*/ + +#endif /* VLC_PICTURE_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_fifo.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_fifo.h new file mode 100644 index 0000000..d337a3b --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_fifo.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * vlc_picture_fifo.h: picture fifo definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: 73d1b20c279f628cf94bc7cfc83b2548878bcc07 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_FIFO_H +#define VLC_PICTURE_FIFO_H 1 + +/** + * \file + * This file defines picture fifo structures and functions in vlc + */ + +#include + +/** + * Picture fifo handle + * + * It is thread safe (push/pop). + */ +typedef struct picture_fifo_t picture_fifo_t; + +/** + * It creates an empty picture_fifo_t. + */ +VLC_API picture_fifo_t * picture_fifo_New( void ) VLC_USED; + +/** + * It destroys a fifo created by picture_fifo_New. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Delete( picture_fifo_t * ); + +/** + * It retreives a picture_t from the fifo. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Pop( picture_fifo_t * ) VLC_USED; + +/** + * It returns the first picture_t pointer from the fifo but does not + * remove it. The picture returned has been hold for you so you + * must call picture_Release on it. + * + * If the fifo is empty, it return NULL without waiting. + */ +VLC_API picture_t * picture_fifo_Peek( picture_fifo_t * ) VLC_USED; + +/** + * It saves a picture_t into the fifo. + */ +VLC_API void picture_fifo_Push( picture_fifo_t *, picture_t * ); + +/** + * It release all picture inside the fifo that have a lower or equal date + * if flush_before or higher or equal to if not flush_before than the given one. + * + * All pictures inside the fifo will be released by picture_Release. + */ +VLC_API void picture_fifo_Flush( picture_fifo_t *, mtime_t date, bool flush_before ); + +/** + * It applies a delta on all the picture timestamp. + */ +VLC_API void picture_fifo_OffsetDate( picture_fifo_t *, mtime_t delta ); + + +#endif /* VLC_PICTURE_FIFO_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_pool.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_pool.h new file mode 100644 index 0000000..73f3f6c --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_picture_pool.h @@ -0,0 +1,189 @@ +/***************************************************************************** + * vlc_picture_pool.h: picture pool definitions + ***************************************************************************** + * Copyright (C) 2009 VLC authors and VideoLAN + * $Id: 8b04370bfb320749eec6bcf09aaf0ba76b78058f $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PICTURE_POOL_H +#define VLC_PICTURE_POOL_H 1 + +/** + * \file + * This file defines picture pool structures and functions in vlc + */ + +#include + +/** + * Picture pool handle + */ +typedef struct picture_pool_t picture_pool_t; + +/** + * Picture pool configuration + */ +typedef struct { + unsigned picture_count; + picture_t *const *picture; + + int (*lock)(picture_t *); + void (*unlock)(picture_t *); +} picture_pool_configuration_t; + +/** + * Creates a pool of preallocated pictures. Free pictures can be allocated from + * the pool, and are returned to the pool when they are no longer referenced. + * + * This avoids allocating and deallocationg pictures repeatedly, and ensures + * that memory consumption remains within limits. + * + * To obtain a picture from the pool, use picture_pool_Get(). To increase and + * decrease the reference count, use picture_Hold() and picture_Release() + * respectively. + * + * If defined, picture_pool_configuration_t::lock will be called before + * a picture is used, and picture_pool_configuration_t::unlock will be called + * as soon as a picture is returned to the pool. + * Those callbacks can modify picture_t::p and access picture_t::p_sys. + * + * @return A pointer to the new pool on success, or NULL on error + * (pictures are not released on error). + */ +VLC_API picture_pool_t * picture_pool_NewExtended( const picture_pool_configuration_t * ) VLC_USED; + +/** + * Creates a picture pool with pictures in a given array. + * This is a convenience wrapper for picture_pool_NewExtended() without the + * lock and unlock callbacks. + * + * @param count number of pictures in the array + * @param tab array of pictures + * + * @return a pointer to the new pool on success, or NULL on error + * (pictures are not released on error) + */ +VLC_API picture_pool_t * picture_pool_New(unsigned count, + picture_t *const *tab) VLC_USED; + +/** + * Allocates pictures from the heap and creates a picture pool with them. + * This is a convenience wrapper for picture_NewFromFormat() and + * picture_pool_New(). + * + * @param fmt video format of pictures to allocate from the heap + * @param count number of pictures to allocate + * + * @return a pointer to the new pool on success, NULL on error + */ +VLC_API picture_pool_t * picture_pool_NewFromFormat(const video_format_t *fmt, + unsigned count) VLC_USED; + +/** + * Releases a pool created by picture_pool_NewExtended(), picture_pool_New() + * or picture_pool_NewFromFormat(). + * + * @note If there are no pending references to the pooled pictures, and the + * picture_resource_t.pf_destroy callback was not NULL, it will be invoked. + * Otherwise the default callback will be used. + * + * @warning If there are pending references (a.k.a. late pictures), the + * pictures will remain valid until the all pending references are dropped by + * picture_Release(). + */ +VLC_API void picture_pool_Release( picture_pool_t * ); + +/** + * Obtains a picture from a pool if any is immediately available. + * + * The picture must be released with picture_Release(). + * + * @return a picture, or NULL if all pictures in the pool are allocated + * + * @note This function is thread-safe. + */ +VLC_API picture_t * picture_pool_Get( picture_pool_t * ) VLC_USED; + +/** + * Obtains a picture from a pool. + * + * The picture must be released with picture_Release(). + * + * @return a picture or NULL on memory error + * + * @note This function is thread-safe. + */ +VLC_API picture_t *picture_pool_Wait(picture_pool_t *) VLC_USED; + +/** + * Enumerates all pictures in a pool, both free and allocated. + * + * @param cb callback to invoke once for each picture + * @param data opaque data parameter for the callback (first argument) + * + * @note Allocated pictures may be accessed asynchronously by other threads. + * Therefore, only read-only picture parameters can be read by the callback, + * typically picture_t.p_sys. + * Provided those rules are respected, the function is thread-safe. + */ +VLC_API void picture_pool_Enum( picture_pool_t *, + void (*cb)(void *, picture_t *), void *data ); + +/** + * Cancel the picture pool. + * + * It won't return any pictures via picture_pool_Get or picture_pool_Wait if + * canceled is true. This function will also unblock picture_pool_Wait. + * picture_pool_Reset will also reset the cancel state to false. + */ +void picture_pool_Cancel( picture_pool_t *, bool canceled ); + +/** + * Test if a picture belongs to the picture pool + * + * FIXME: remove this function when the vout_PutPicture() hack is fixed. + */ +bool picture_pool_OwnsPic( picture_pool_t *, picture_t *); + +/** + * Reserves pictures from a pool and creates a new pool with those. + * + * When the new pool is released, pictures are returned to the master pool. + * If the master pool was already released, pictures will be destroyed. + * + * @param count number of picture to reserve + * + * @return the new pool, or NULL if there were not enough pictures available + * or on error + * + * @note This function is thread-safe (but it might return NULL if other + * threads have already allocated too many pictures). + */ +VLC_API picture_pool_t * picture_pool_Reserve(picture_pool_t *, unsigned count) +VLC_USED; + +/** + * @return the total number of pictures in the given pool + * @note This function is thread-safe. + */ +VLC_API unsigned picture_pool_GetSize(const picture_pool_t *); + + +#endif /* VLC_PICTURE_POOL_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_playlist.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_playlist.h new file mode 100644 index 0000000..e19d4b9 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_playlist.h @@ -0,0 +1,443 @@ +/***************************************************************************** + * vlc_playlist.h : Playlist functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 9498e622cac22fc9c70cb4b298cca02722092d2e $ + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PLAYLIST_H_ +#define VLC_PLAYLIST_H_ + +# ifdef __cplusplus +extern "C" { +# endif + +#include +#include + +TYPEDEF_ARRAY(playlist_item_t*, playlist_item_array_t) + +struct intf_thread_t; + +/** + * \defgroup playlist VLC playlist + * VLC playlist controls + * @{ + * \file + * VLC playlist control interface + * + * The VLC playlist system has a tree structure. This allows advanced + * categorization, like for SAP streams (which are grouped by "sap groups"). + * + * The base structure for all playlist operations is the playlist_item_t. + * This is essentially a node within the playlist tree. Each playlist item + * references an input_item_t which contains the input stream info, such as + * location, name and meta-data. + * + * A playlist item is uniquely identified by its input item: + * \ref playlist_ItemGetByInput(). A single input item cannot be used by more + * than one playlist item at a time; if necessary, a copy of the input item can + * be made instead. + * + * The same playlist tree is visible to all user interfaces. To arbitrate + * access, a lock is used, see \ref playlist_Lock() and \ref playlist_Unlock(). + * + * Under the playlist root item node, the top-level items are the main + * media sources and include: + * - the actual playlist, + * - the media library, + * - the service discovery root node, whose children are services discovery + * module instances. + * + * So, here is an example: + * \verbatim + * Inputs array + * - input 1 -> name = foo 1 uri = ... + * - input 2 -> name = foo 2 uri = ... + * + * Playlist items tree + * - playlist (id 1) + * - category 1 (id 2) + * - foo 2 (id 6 - input 2) + * - media library (id 2) + * - foo 1 (id 5 - input 1) + * \endverbatim + * + * Sometimes, an item creates subitems. This happens for the directory access + * for example. In that case, if the item is under the "playlist" top-level + * item and playlist is configured to be flat then the item will be deleted and + * replaced with new subitems. If the item is under another top-level item, it + * will be transformed to a node and removed from the list of all items without + * nodes. + * + * For "standard" item addition, you can use playlist_Add(), playlist_AddExt() + * (more options) or playlist_AddInput() if you already created your input + * item. This will add the item at the root of "Playlist" or of "Media library" + * in each of the two trees. + * + * You can create nodes with playlist_NodeCreate() and can create items from + * existing input items to be placed under any node with + * playlist_NodeAddInput(). + * + * To delete an item, use playlist_NodeDelete( p_item ). + * + * The playlist defines the following event variables: + * + * - "item-change": It will contain a pointer to the input_item_t of a + * changed input item monitored by the playlist. + * + * - "playlist-item-append": It will contain a pointer to a playlist_item_t. + * - "playlist-item-deleted": It will contain a pointer to the playlist_item_t + * about to be deleted. + * + * - "leaf-to-parent": It will contain the playlist_item_t->i_id of an item that is transformed + * into a node. + * + * The playlist contains rate-variable which is propagated to current input if + * available also rate-slower/rate-faster is in use. + */ + +/** Helper structure to export to file part of the playlist */ +typedef struct playlist_export_t +{ + VLC_COMMON_MEMBERS + char *base_url; + FILE *p_file; + playlist_item_t *p_root; +} playlist_export_t; + +/** playlist item / node */ +struct playlist_item_t +{ + input_item_t *p_input; /**< Linked input item */ + + playlist_item_t **pp_children; /**< Children nodes/items */ + playlist_item_t *p_parent; /**< Item parent */ + int i_children; /**< Number of children, -1 if not a node */ + unsigned i_nb_played; /**< Times played */ + + int i_id; /**< Playlist item specific id */ + uint8_t i_flags; /**< Flags \see playlist_item_flags_e */ +}; + +typedef enum { + PLAYLIST_DBL_FLAG = 0x04, /**< Is it disabled ? */ + PLAYLIST_RO_FLAG = 0x08, /**< Write-enabled ? */ + PLAYLIST_SUBITEM_STOP_FLAG = 0x40, /**< Must playlist stop if the item gets subitems ?*/ + PLAYLIST_NO_INHERIT_FLAG = 0x80, /**< Will children inherit flags the R/O flag ? */ +} playlist_item_flags_e; + +/** Playlist status */ +typedef enum +{ PLAYLIST_STOPPED,PLAYLIST_RUNNING,PLAYLIST_PAUSED } playlist_status_t; + +/** Structure containing information about the playlist */ +struct playlist_t +{ + VLC_COMMON_MEMBERS + + playlist_item_array_t items; /**< Arrays of items */ + + playlist_item_array_t current; /**< Items currently being played */ + int i_current_index; /**< Index in current array */ + + /* Predefined items */ + playlist_item_t root; + playlist_item_t *p_playing; + playlist_item_t *p_media_library; +}; + +/* A bit of macro magic to generate an enum out of the following list, + * and later, to generate a list of static functions out of the same list. + * There is also SORT_RANDOM, which is always last and handled specially. + */ +#define VLC_DEFINE_SORT_FUNCTIONS \ + DEF( SORT_ID )\ + DEF( SORT_TITLE )\ + DEF( SORT_TITLE_NODES_FIRST )\ + DEF( SORT_ARTIST )\ + DEF( SORT_GENRE )\ + DEF( SORT_DURATION )\ + DEF( SORT_TITLE_NUMERIC )\ + DEF( SORT_ALBUM )\ + DEF( SORT_TRACK_NUMBER )\ + DEF( SORT_DESCRIPTION )\ + DEF( SORT_RATING )\ + DEF( SORT_URI )\ + DEF( SORT_DISC_NUMBER )\ + DEF( SORT_DATE ) + +#define DEF( s ) s, +enum +{ + VLC_DEFINE_SORT_FUNCTIONS + SORT_RANDOM, + NUM_SORT_FNS=SORT_RANDOM +}; +#undef DEF +#ifndef VLC_INTERNAL_PLAYLIST_SORT_FUNCTIONS +#undef VLC_DEFINE_SORT_FUNCTIONS +#endif + +enum +{ + ORDER_NORMAL = 0, + ORDER_REVERSE = 1, +}; + +#define PLAYLIST_END -1 + +enum pl_locked_state +{ + pl_Locked = true, + pl_Unlocked = false +}; + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/* Helpers */ +#define PL_LOCK playlist_Lock( p_playlist ) +#define PL_UNLOCK playlist_Unlock( p_playlist ) +#define PL_ASSERT_LOCKED playlist_AssertLocked( p_playlist ) + +/** Playlist commands */ +enum { + PLAYLIST_PLAY, /**< No arg. res=can fail*/ + PLAYLIST_VIEWPLAY, /**< arg1= playlist_item_t*,*/ + /** arg2 = playlist_item_t* , res=can fail */ + PLAYLIST_TOGGLE_PAUSE, /**< No arg res=can fail */ + PLAYLIST_STOP, /**< No arg res=can fail*/ + PLAYLIST_SKIP, /**< arg1=int, res=can fail*/ + PLAYLIST_PAUSE, /**< No arg */ + PLAYLIST_RESUME, /**< No arg */ +}; + +#define playlist_Play(p) playlist_Control(p,PLAYLIST_PLAY, pl_Unlocked ) +#define playlist_TogglePause(p) \ + playlist_Control(p, PLAYLIST_TOGGLE_PAUSE, pl_Unlocked) +#define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP, pl_Unlocked ) +#define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, 1) +#define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, -1) +#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, (i) ) +#define playlist_Pause(p) \ + playlist_Control(p, PLAYLIST_PAUSE, pl_Unlocked) +#define playlist_Resume(p) \ + playlist_Control(p, PLAYLIST_RESUME, pl_Unlocked) + +/** + * Locks the playlist. + * + * This function locks the playlist. While the playlist is locked, no other + * thread can modify the playlist tree layout or current playing item and node. + * + * Locking the playlist is necessary before accessing, either for reading or + * writing, any playlist item. + * + * \note Because of the potential for lock inversion / deadlocks, locking the + * playlist shall not be attemped while holding an input item lock. An input + * item lock can be acquired while holding the playlist lock. + * + * While holding the playlist lock, a thread shall not attempt to: + * - probe, initialize or deinitialize a module or a plugin, + * - install or deinstall a variable or event callback, + * - set a variable or trigger a variable callback, with the sole exception + * of the playlist core triggering add/remove/leaf item callbacks, + * - invoke a module/plugin callback other than: + * - playlist export, + * - logger message callback. + */ +VLC_API void playlist_Lock( playlist_t * ); + +/** + * Unlocks the playlist. + * + * This function unlocks the playlist, allowing other threads to lock it. The + * calling thread must have called playlist_Lock() before. + * + * This function invalidates all or any playlist item pointers. + * There are no ways to ensure that playlist items are not modified or deleted + * by another thread past this function call. + * + * To retain a reference to a playlist item while not holding the playlist + * lock, a thread should take a reference to the input item within the + * playlist item before unlocking. If this is not practical, then the thread + * can store the playlist item ID (i_id) before unlocking. + * Either way, this will not ensure that the playlist item is not deleted, so + * the thread must be ready to handle that case later when calling + * playlist_ItemGetByInput() or playlist_ItemGetById(). + * + * Furthermore, if ID is used, then the playlist item might be deleted, and + * another item could be assigned the same ID. To avoid that problem, use + * the input item instead of the ID. + */ +VLC_API void playlist_Unlock( playlist_t * ); + +VLC_API void playlist_AssertLocked( playlist_t * ); +VLC_API void playlist_Deactivate( playlist_t * ); + +/** + * Do a playlist action. + * If there is something in the playlist then you can do playlist actions. + * Possible queries are listed in vlc_common.h + * \param p_playlist the playlist to do the command on + * \param i_query the command to do + * \param b_locked TRUE if playlist is locked when entering this function + * \param variable number of arguments + */ +VLC_API void playlist_Control( playlist_t *p_playlist, int i_query, int b_locked, ... ); + +static inline void playlist_ViewPlay(playlist_t *pl, playlist_item_t *node, + playlist_item_t *item) +{ + playlist_Control(pl, PLAYLIST_VIEWPLAY, pl_Locked, node, item); +} + +/** Get current playing input. The object is retained. + */ +VLC_API input_thread_t * playlist_CurrentInput( playlist_t *p_playlist ) VLC_USED; +VLC_API input_thread_t *playlist_CurrentInputLocked( playlist_t *p_playlist ) VLC_USED; + +/** Get the duration of all items in a node. + */ +VLC_API mtime_t playlist_GetNodeDuration( playlist_item_t * ); + +/** Clear the playlist + * \param b_locked TRUE if playlist is locked when entering this function + */ +VLC_API void playlist_Clear( playlist_t *, bool ); + +/* Playlist sorting */ +VLC_API int playlist_TreeMove( playlist_t *, playlist_item_t *, playlist_item_t *, int ); +VLC_API int playlist_TreeMoveMany( playlist_t *, int, playlist_item_t **, playlist_item_t *, int ); +VLC_API int playlist_RecursiveNodeSort( playlist_t *, playlist_item_t *,int, int ); + +VLC_API playlist_item_t * playlist_CurrentPlayingItem( playlist_t * ) VLC_USED; +VLC_API int playlist_Status( playlist_t * ); + +/** + * Export a node of the playlist to a certain type of playlistfile + * \param b_playlist true for the playlist, false for the media library + * \param psz_filename the location where the exported file will be saved + * \param psz_type the type of playlist file to create (m3u, pls, ..) + * \return VLC_SUCCESS on success + */ +VLC_API int playlist_Export( playlist_t *p_playlist, const char *psz_name, + bool b_playlist, const char *psz_type ); + +/** + * Open a playlist file, add its content to the current playlist + */ +VLC_API int playlist_Import( playlist_t *p_playlist, const char *psz_file ); + +/********************** Services discovery ***********************/ + +/** Add a service discovery module */ +VLC_API int playlist_ServicesDiscoveryAdd(playlist_t *, const char *); +/** Remove a services discovery module by name */ +VLC_API int playlist_ServicesDiscoveryRemove(playlist_t *, const char *); +/** Check whether a given SD is loaded */ +VLC_API bool playlist_IsServicesDiscoveryLoaded( playlist_t *,const char *) VLC_DEPRECATED; +/** Query a services discovery */ +VLC_API int playlist_ServicesDiscoveryControl( playlist_t *, const char *, int, ... ); + +/********************** Renderer ***********************/ +/** + * Sets a renderer or remove the current one + * @param p_item The renderer item to be used, or NULL to disable the current + * one. If a renderer is provided, its reference count will be + * incremented. + */ +VLC_API int playlist_SetRenderer( playlist_t* p_pl, vlc_renderer_item_t* p_item ); + + +/******************************************************** + * Item management + ********************************************************/ + +/******************** Item addition ********************/ +VLC_API int playlist_Add( playlist_t *, const char *, bool ); +VLC_API int playlist_AddExt( playlist_t *, const char *, const char *, bool, int, const char *const *, unsigned, bool ); +VLC_API int playlist_AddInput( playlist_t *, input_item_t *, bool, bool ); +VLC_API playlist_item_t * playlist_NodeAddInput( playlist_t *, input_item_t *, playlist_item_t *, int ); +VLC_API int playlist_NodeAddCopy( playlist_t *, playlist_item_t *, playlist_item_t *, int ); + +/********************************** Item search *************************/ +VLC_API playlist_item_t * playlist_ItemGetById(playlist_t *, int ) VLC_USED; +VLC_API playlist_item_t *playlist_ItemGetByInput(playlist_t *, + const input_item_t * ) +VLC_USED; + +VLC_API int playlist_LiveSearchUpdate(playlist_t *, playlist_item_t *, const char *, bool ); + +/******************************************************** + * Tree management + ********************************************************/ +/* Node management */ +VLC_API playlist_item_t * playlist_NodeCreate( playlist_t *, const char *, playlist_item_t * p_parent, int i_pos, int i_flags ); +VLC_API playlist_item_t * playlist_ChildSearchName(playlist_item_t*, const char* ) VLC_USED; +VLC_API void playlist_NodeDelete( playlist_t *, playlist_item_t * ); + +/************************** + * Audio output management + **************************/ + +VLC_API audio_output_t *playlist_GetAout( playlist_t * ); + +VLC_API float playlist_VolumeGet( playlist_t * ); +VLC_API int playlist_VolumeSet( playlist_t *, float ); +VLC_API int playlist_VolumeUp( playlist_t *, int, float * ); +#define playlist_VolumeDown(a, b, c) playlist_VolumeUp(a, -(b), c) +VLC_API int playlist_MuteSet( playlist_t *, bool ); +VLC_API int playlist_MuteGet( playlist_t * ); + +static inline int playlist_MuteToggle( playlist_t *pl ) +{ + int val = playlist_MuteGet( pl ); + if (val >= 0) + val = playlist_MuteSet( pl, !val ); + return val; +} + +VLC_API void playlist_EnableAudioFilter( playlist_t *, const char *, bool ); + +/*********************************************************************** + * Inline functions + ***********************************************************************/ +/** Tell if the playlist is empty */ +static inline bool playlist_IsEmpty( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->items.i_size == 0; +} + +/** Tell the number of items in the current playing context */ +static inline int playlist_CurrentSize( playlist_t *p_playlist ) +{ + PL_ASSERT_LOCKED; + return p_playlist->current.i_size; +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_plugin.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_plugin.h new file mode 100644 index 0000000..ce28562 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_plugin.h @@ -0,0 +1,557 @@ +/***************************************************************************** + * vlc_plugin.h : Macros used from within a module. + ***************************************************************************** + * Copyright (C) 2001-2006 VLC authors and VideoLAN + * Copyright © 2007-2009 Rémi Denis-Courmont + * + * Authors: Samuel Hocevar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef LIBVLC_MODULES_MACROS_H +# define LIBVLC_MODULES_MACROS_H 1 + +/** + * \file + * This file implements plugin (module) macros used to define a vlc module. + */ + +enum vlc_module_properties +{ + VLC_MODULE_CREATE, + VLC_CONFIG_CREATE, + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_MODULE_CPU_REQUIREMENT=0x100, + VLC_MODULE_SHORTCUT, + VLC_MODULE_CAPABILITY, + VLC_MODULE_SCORE, + VLC_MODULE_CB_OPEN, + VLC_MODULE_CB_CLOSE, + VLC_MODULE_NO_UNLOAD, + VLC_MODULE_NAME, + VLC_MODULE_SHORTNAME, + VLC_MODULE_DESCRIPTION, + VLC_MODULE_HELP, + VLC_MODULE_TEXTDOMAIN, + /* Insert new VLC_MODULE_* here */ + + /* DO NOT EVER REMOVE, INSERT OR REPLACE ANY ITEM! It would break the ABI! + * Append new items at the end ONLY. */ + VLC_CONFIG_NAME=0x1000, + /* command line name (args=const char *) */ + + VLC_CONFIG_VALUE, + /* actual value (args=int64_t/double/const char *) */ + + VLC_CONFIG_RANGE, + /* minimum value (args=int64_t/double/const char * twice) */ + + VLC_CONFIG_ADVANCED, + /* enable advanced flag (args=none) */ + + VLC_CONFIG_VOLATILE, + /* don't write variable to storage (args=none) */ + + VLC_CONFIG_PERSISTENT_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_PRIVATE, + /* hide from user (args=none) */ + + VLC_CONFIG_REMOVED, + /* tag as no longer supported (args=none) */ + + VLC_CONFIG_CAPABILITY, + /* capability for a module or list thereof (args=const char*) */ + + VLC_CONFIG_SHORTCUT, + /* one-character (short) command line option name (args=char) */ + + VLC_CONFIG_OLDNAME_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_SAFE, + /* tag as modifiable by untrusted input item "sources" (args=none) */ + + VLC_CONFIG_DESC, + /* description (args=const char *, const char *, const char *) */ + + VLC_CONFIG_LIST_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_ADD_ACTION_OBSOLETE, + /* unused (ignored) */ + + VLC_CONFIG_LIST, + /* list of suggested values + * (args=size_t, const *, const char *const *) */ + + VLC_CONFIG_LIST_CB, + /* callback for suggested values + * (args=const char *, size_t (*)(vlc_object_t *, **, char ***)) */ + + /* Insert new VLC_CONFIG_* here */ +}; + +/* Configuration hint types */ +#define CONFIG_HINT_CATEGORY 0x02 /* Start of new category */ +#define CONFIG_HINT_USAGE 0x05 /* Usage information */ + +#define CONFIG_CATEGORY 0x06 /* Set category */ +#define CONFIG_SUBCATEGORY 0x07 /* Set subcategory */ +#define CONFIG_SECTION 0x08 /* Start of new section */ + +/* Configuration item types */ +#define CONFIG_ITEM_FLOAT 0x20 /* Float option */ +#define CONFIG_ITEM_INTEGER 0x40 /* Integer option */ +#define CONFIG_ITEM_RGB 0x41 /* RGB color option */ +#define CONFIG_ITEM_BOOL 0x60 /* Bool option */ +#define CONFIG_ITEM_STRING 0x80 /* String option */ +#define CONFIG_ITEM_PASSWORD 0x81 /* Password option (*) */ +#define CONFIG_ITEM_KEY 0x82 /* Hot key option */ +#define CONFIG_ITEM_MODULE 0x84 /* Module option */ +#define CONFIG_ITEM_MODULE_CAT 0x85 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST 0x86 /* Module option */ +#define CONFIG_ITEM_MODULE_LIST_CAT 0x87 /* Module option */ +#define CONFIG_ITEM_LOADFILE 0x8C /* Read file option */ +#define CONFIG_ITEM_SAVEFILE 0x8D /* Written file option */ +#define CONFIG_ITEM_DIRECTORY 0x8E /* Directory option */ +#define CONFIG_ITEM_FONT 0x8F /* Font option */ + +#define CONFIG_ITEM(x) (((x) & ~0xF) != 0) + +/* Categories and subcategories */ +#define CAT_INTERFACE 1 +#define SUBCAT_INTERFACE_GENERAL 101 +#define SUBCAT_INTERFACE_MAIN 102 +#define SUBCAT_INTERFACE_CONTROL 103 +#define SUBCAT_INTERFACE_HOTKEYS 104 + +#define CAT_AUDIO 2 +#define SUBCAT_AUDIO_GENERAL 201 +#define SUBCAT_AUDIO_AOUT 202 +#define SUBCAT_AUDIO_AFILTER 203 +#define SUBCAT_AUDIO_VISUAL 204 +#define SUBCAT_AUDIO_MISC 205 +#define SUBCAT_AUDIO_RESAMPLER 206 + +#define CAT_VIDEO 3 +#define SUBCAT_VIDEO_GENERAL 301 +#define SUBCAT_VIDEO_VOUT 302 +#define SUBCAT_VIDEO_VFILTER 303 +#define SUBCAT_VIDEO_SUBPIC 305 +#define SUBCAT_VIDEO_SPLITTER 306 + +#define CAT_INPUT 4 +#define SUBCAT_INPUT_GENERAL 401 +#define SUBCAT_INPUT_ACCESS 402 +#define SUBCAT_INPUT_DEMUX 403 +#define SUBCAT_INPUT_VCODEC 404 +#define SUBCAT_INPUT_ACODEC 405 +#define SUBCAT_INPUT_SCODEC 406 +#define SUBCAT_INPUT_STREAM_FILTER 407 + +#define CAT_SOUT 5 +#define SUBCAT_SOUT_GENERAL 501 +#define SUBCAT_SOUT_STREAM 502 +#define SUBCAT_SOUT_MUX 503 +#define SUBCAT_SOUT_ACO 504 +#define SUBCAT_SOUT_PACKETIZER 505 +#define SUBCAT_SOUT_VOD 507 +#define SUBCAT_SOUT_RENDERER 508 + +#define CAT_ADVANCED 6 +#define SUBCAT_ADVANCED_MISC 602 +#define SUBCAT_ADVANCED_NETWORK 603 + +#define CAT_PLAYLIST 7 +#define SUBCAT_PLAYLIST_GENERAL 701 +#define SUBCAT_PLAYLIST_SD 702 +#define SUBCAT_PLAYLIST_EXPORT 703 + + +/** + * Current plugin ABI version + */ +# define MODULE_SYMBOL 3_0_0f +# define MODULE_SUFFIX "__3_0_0f" + +/***************************************************************************** + * Add a few defines. You do not want to read this section. Really. + *****************************************************************************/ + +/* Explanation: + * + * if linking a module statically, we will need: + * #define MODULE_FUNC( zog ) module_foo_zog + * + * this can't easily be done with the C preprocessor, thus a few ugly hacks. + */ + +/* I need to do _this_ to change « foo bar » to « module_foo_bar » ! */ +#define CONCATENATE( y, z ) CRUDE_HACK( y, z ) +#define CRUDE_HACK( y, z ) y##__##z + +/* If the module is built-in, then we need to define foo_InitModule instead + * of InitModule. Same for Activate- and DeactivateModule. */ +#ifdef __PLUGIN__ +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_SYMBOL ) +# define VLC_MODULE_NAME_HIDDEN_SYMBOL \ + const char vlc_module_name[] = MODULE_STRING; +#else +# define __VLC_SYMBOL( symbol ) CONCATENATE( symbol, MODULE_NAME ) +# define VLC_MODULE_NAME_HIDDEN_SYMBOL +#endif + +#define CDECL_SYMBOL +#if defined (__PLUGIN__) +# if defined (_WIN32) +# define DLL_SYMBOL __declspec(dllexport) +# undef CDECL_SYMBOL +# define CDECL_SYMBOL __cdecl +# elif defined (__GNUC__) +# define DLL_SYMBOL __attribute__((visibility("default"))) +# else +# define DLL_SYMBOL +# endif +#else +# define DLL_SYMBOL +#endif + +#if defined( __cplusplus ) +# define EXTERN_SYMBOL extern "C" +#else +# define EXTERN_SYMBOL +#endif + +EXTERN_SYMBOL typedef int (*vlc_set_cb) (void *, void *, int, ...); + +#define vlc_plugin_set(...) vlc_set (opaque, NULL, __VA_ARGS__) +#define vlc_module_set(...) vlc_set (opaque, module, __VA_ARGS__) +#define vlc_config_set(...) vlc_set (opaque, config, __VA_ARGS__) + +/* + * InitModule: this function is called once and only once, when the module + * is looked at for the first time. We get the useful data from it, for + * instance the module name, its shortcuts, its capabilities... we also create + * a copy of its config because the module can be unloaded at any time. + */ +#define vlc_module_begin() \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \ +EXTERN_SYMBOL DLL_SYMBOL \ +int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \ +{ \ + module_t *module; \ + module_config_t *config = NULL; \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; \ + if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \ + goto error; + +#define vlc_module_end() \ + (void) config; \ + return 0; \ +error: \ + return -1; \ +} \ +VLC_MODULE_NAME_HIDDEN_SYMBOL \ +VLC_METADATA_EXPORTS + +#define add_submodule( ) \ + if (vlc_plugin_set (VLC_MODULE_CREATE, &module)) \ + goto error; + +#define add_shortcut( ... ) \ +{ \ + const char *shortcuts[] = { __VA_ARGS__ }; \ + if (vlc_module_set (VLC_MODULE_SHORTCUT, \ + sizeof(shortcuts)/sizeof(shortcuts[0]), shortcuts)) \ + goto error; \ +} + +#define set_shortname( shortname ) \ + if (vlc_module_set (VLC_MODULE_SHORTNAME, (const char *)(shortname))) \ + goto error; + +#define set_description( desc ) \ + if (vlc_module_set (VLC_MODULE_DESCRIPTION, (const char *)(desc))) \ + goto error; + +#define set_help( help ) \ + if (vlc_module_set (VLC_MODULE_HELP, (const char *)(help))) \ + goto error; + +#define set_capability( cap, score ) \ + if (vlc_module_set (VLC_MODULE_CAPABILITY, (const char *)(cap)) \ + || vlc_module_set (VLC_MODULE_SCORE, (int)(score))) \ + goto error; + +#define set_callbacks( activate, deactivate ) \ + if (vlc_module_set(VLC_MODULE_CB_OPEN, #activate, (void *)(activate)) \ + || vlc_module_set(VLC_MODULE_CB_CLOSE, #deactivate, \ + (void *)(deactivate))) \ + goto error; + +#define cannot_unload_broken_library( ) \ + if (vlc_module_set (VLC_MODULE_NO_UNLOAD)) \ + goto error; + +#define set_text_domain( dom ) \ + if (vlc_plugin_set (VLC_MODULE_TEXTDOMAIN, (dom))) \ + goto error; + +/***************************************************************************** + * Macros used to build the configuration structure. + * + * Note that internally we support only 3 types of config data: int, float + * and string. + * The other types declared here just map to one of these 3 basic types but + * have the advantage of also providing very good hints to a configuration + * interface so as to make it more user friendly. + * The configuration structure also includes category hints. These hints can + * provide a configuration interface with some very useful data and again + * allow for a more user friendly interface. + *****************************************************************************/ + +#define add_type_inner( type ) \ + vlc_plugin_set (VLC_CONFIG_CREATE, (type), &config); + +#define add_typedesc_inner( type, text, longtext ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_DESC, \ + (const char *)(text), (const char *)(longtext)); + +#define add_typeadv_inner( type, text, longtext, advc ) \ + add_typedesc_inner( type, text, longtext ) \ + if (advc) vlc_config_set (VLC_CONFIG_ADVANCED); + +#define add_typename_inner( type, name, text, longtext, advc ) \ + add_typeadv_inner( type, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); + +#define add_string_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (const char *)(v)); + +#define add_int_inner( type, name, text, longtext, advc, v ) \ + add_typename_inner( type, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(v)); + + +#define set_category( i_id ) \ + add_type_inner( CONFIG_CATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_subcategory( i_id ) \ + add_type_inner( CONFIG_SUBCATEGORY ) \ + vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id)); + +#define set_section( text, longtext ) \ + add_typedesc_inner( CONFIG_SECTION, text, longtext ) + +#define add_category_hint( text, longtext, advc ) \ + add_typeadv_inner( CONFIG_HINT_CATEGORY, text, longtext, advc ) + +#define add_usage_hint( text ) \ + add_typedesc_inner( CONFIG_HINT_USAGE, text, NULL ) + +#define add_string( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_STRING, name, text, longtext, advc, \ + value ) + +#define add_password( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_PASSWORD, name, text, longtext, advc, \ + value ) + +#define add_loadfile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_LOADFILE, name, text, longtext, advc, \ + value ) + +#define add_savefile( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_SAVEFILE, name, text, longtext, advc, \ + value ) + +#define add_directory( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_DIRECTORY, name, text, longtext, advc, \ + value ) + +#define add_font( name, value, text, longtext, advc )\ + add_string_inner( CONFIG_ITEM_FONT, name, text, longtext, advc, \ + value ) + +#define add_module( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#define add_module_list( name, psz_caps, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST, name, text, longtext, advc, \ + value ) \ + vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps)); + +#ifndef __PLUGIN__ +#define add_module_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_CAT, name, text, longtext, advc, \ + value ) \ + change_integer_range (i_subcategory /* gruik */, 0); + +#define add_module_list_cat( name, i_subcategory, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_MODULE_LIST_CAT, name, text, longtext, \ + advc, value ) \ + change_integer_range (i_subcategory /* gruik */, 0); +#endif + +#define add_integer( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_INTEGER, name, text, longtext, advc, value ) + +#define add_rgb( name, value, text, longtext, advc ) \ + add_int_inner( CONFIG_ITEM_RGB, name, text, longtext, advc, value ) \ + change_integer_range( 0, 0xFFFFFF ) + +#define add_key( name, value, text, longtext, advc ) \ + add_string_inner( CONFIG_ITEM_KEY, "global-" name, text, longtext, advc, \ + KEY_UNSET ) \ + add_string_inner( CONFIG_ITEM_KEY, name, text, longtext, advc, value ) + +#define add_integer_with_range( name, value, i_min, i_max, text, longtext, advc ) \ + add_integer( name, value, text, longtext, advc ) \ + change_integer_range( i_min, i_max ) + +#define add_float( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_FLOAT, name, text, longtext, advc ) \ + vlc_config_set (VLC_CONFIG_VALUE, (double)(v)); + +#define add_float_with_range( name, value, f_min, f_max, text, longtext, advc ) \ + add_float( name, value, text, longtext, advc ) \ + change_float_range( f_min, f_max ) + +#define add_bool( name, v, text, longtext, advc ) \ + add_typename_inner( CONFIG_ITEM_BOOL, name, text, longtext, advc ) \ + if (v) vlc_config_set (VLC_CONFIG_VALUE, (int64_t)true); + +/* For removed option */ +#define add_obsolete_inner( name, type ) \ + add_type_inner( type ) \ + vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); \ + vlc_config_set (VLC_CONFIG_REMOVED); + +#define add_obsolete_bool( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_BOOL ) + +#define add_obsolete_integer( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_INTEGER ) + +#define add_obsolete_float( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_FLOAT ) + +#define add_obsolete_string( name ) \ + add_obsolete_inner( name, CONFIG_ITEM_STRING ) + +/* Modifier macros for the config options (used for fine tuning) */ + +#define change_short( ch ) \ + vlc_config_set (VLC_CONFIG_SHORTCUT, (int)(ch)); + +#define change_string_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (char *)), \ + (const char *const *)(list), \ + (const char *const *)(list_text)); + +#define change_string_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, #cb, (void *)(cb)); + +#define change_integer_list( list, list_text ) \ + vlc_config_set (VLC_CONFIG_LIST, \ + (size_t)(sizeof (list) / sizeof (int)), \ + (const int *)(list), \ + (const char *const *)(list_text)); + +#define change_integer_cb( cb ) \ + vlc_config_set (VLC_CONFIG_LIST_CB, #cb, (cb)); + +#define change_integer_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (int64_t)(minv), (int64_t)(maxv)); + +#define change_float_range( minv, maxv ) \ + vlc_config_set (VLC_CONFIG_RANGE, (double)(minv), (double)(maxv)); + +/* For options that are saved but hidden from the preferences panel */ +#define change_private() \ + vlc_config_set (VLC_CONFIG_PRIVATE); + +/* For options that cannot be saved in the configuration */ +#define change_volatile() \ + change_private() \ + vlc_config_set (VLC_CONFIG_VOLATILE); + +#define change_safe() \ + vlc_config_set (VLC_CONFIG_SAFE); + +/* Meta data plugin exports */ +#define VLC_META_EXPORT( name, value ) \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void); \ + EXTERN_SYMBOL DLL_SYMBOL const char * CDECL_SYMBOL \ + __VLC_SYMBOL(vlc_entry_ ## name) (void) \ + { \ + return value; \ + } + +#define VLC_COPYRIGHT_VIDEOLAN \ + "\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x74\x68" \ + "\x65\x20\x56\x69\x64\x65\x6f\x4c\x41\x4e\x20\x56\x4c\x43\x20\x6d" \ + "\x65\x64\x69\x61\x20\x70\x6c\x61\x79\x65\x72\x20\x64\x65\x76\x65" \ + "\x6c\x6f\x70\x65\x72\x73" +#define VLC_LICENSE_LGPL_2_1_PLUS \ + "\x4c\x69\x63\x65\x6e\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74" \ + "\x68\x65\x20\x74\x65\x72\x6d\x73\x20\x6f\x66\x20\x74\x68\x65\x20" \ + "\x47\x4e\x55\x20\x4c\x65\x73\x73\x65\x72\x20\x47\x65\x6e\x65\x72" \ + "\x61\x6c\x20\x50\x75\x62\x6c\x69\x63\x20\x4c\x69\x63\x65\x6e\x73" \ + "\x65\x2c\x20\x76\x65\x72\x73\x69\x6f\x6e\x20\x32\x2e\x31\x20\x6f" \ + "\x72\x20\x6c\x61\x74\x65\x72\x2e" +#define VLC_LICENSE_GPL_2_PLUS \ + "\x4c\x69\x63\x65\x6e\x73\x65\x64\x20\x75\x6e\x64\x65\x72\x20\x74" \ + "\x68\x65\x20\x74\x65\x72\x6d\x73\x20\x6f\x66\x20\x74\x68\x65\x20" \ + "\x47\x4e\x55\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x50\x75\x62\x6c" \ + "\x69\x63\x20\x4c\x69\x63\x65\x6e\x73\x65\x2c\x20\x76\x65\x72\x73" \ + "\x69\x6f\x6e\x20\x32\x20\x6f\x72\x20\x6c\x61\x74\x65\x72\x2e" +#if defined (__LIBVLC__) +# define VLC_MODULE_COPYRIGHT VLC_COPYRIGHT_VIDEOLAN +# ifndef VLC_MODULE_LICENSE +# define VLC_MODULE_LICENSE VLC_LICENSE_LGPL_2_1_PLUS +# endif +#endif + +#ifdef VLC_MODULE_COPYRIGHT +# define VLC_COPYRIGHT_EXPORT VLC_META_EXPORT(copyright, VLC_MODULE_COPYRIGHT) +#else +# define VLC_COPYRIGHT_EXPORT +#endif +#ifdef VLC_MODULE_LICENSE +# define VLC_LICENSE_EXPORT VLC_META_EXPORT(license, VLC_MODULE_LICENSE) +#else +# define VLC_LICENSE_EXPORT +#endif + +#define VLC_METADATA_EXPORTS \ + VLC_COPYRIGHT_EXPORT \ + VLC_LICENSE_EXPORT + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_probe.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_probe.h new file mode 100644 index 0000000..efa4d97 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_probe.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * vlc_probe.h: service probing interface + ***************************************************************************** + * Copyright (C) 2009 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_PROBE_H +# define VLC_PROBE_H 1 + +# include + +/** + * \file + * This file defines functions and structures to run-time probe VLC extensions + */ + +# ifdef __cplusplus +extern "C" { +# endif + +void *vlc_probe (vlc_object_t *, const char *, size_t *); +#define vlc_probe(obj, cap, pcount) \ + vlc_probe(VLC_OBJECT(obj), cap, pcount) + +struct vlc_probe_t +{ + VLC_COMMON_MEMBERS + + void *list; + size_t count; +}; + +typedef struct vlc_probe_t vlc_probe_t; + +static inline int vlc_probe_add(vlc_probe_t *obj, const void *data, + size_t len) +{ + char *tab = (char *)realloc (obj->list, (obj->count + 1) * len); + + if (unlikely(tab == NULL)) + return VLC_ENOMEM; + memcpy(tab + (obj->count * len), data, len); + obj->list = tab; + obj->count++; + return VLC_SUCCESS; +} + +# define VLC_PROBE_CONTINUE VLC_EGENERIC +# define VLC_PROBE_STOP VLC_SUCCESS + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_rand.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_rand.h new file mode 100644 index 0000000..761cee5 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_rand.h @@ -0,0 +1,37 @@ +/***************************************************************************** + * vlc_rand.h: RNG + ***************************************************************************** + * Copyright © 2007 Rémi Denis-Courmont + * $Id: 3ae95ac04c55f46d116481eb89255b013f6d1c32 $ + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_RAND_H +# define VLC_RAND_H + +/** + * \file + * This file defined random number generator function in vlc + */ + +VLC_API void vlc_rand_bytes(void *buf, size_t len); + +/* Interlocked (but not reproducible) functions for the POSIX PRNG */ +VLC_API double vlc_drand48(void) VLC_USED; +VLC_API long vlc_lrand48(void) VLC_USED; +VLC_API long vlc_mrand48(void) VLC_USED; + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_renderer_discovery.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_renderer_discovery.h new file mode 100644 index 0000000..6193e48 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_renderer_discovery.h @@ -0,0 +1,219 @@ +/***************************************************************************** + * vlc_renderer_discovery.h : Renderer Discovery functions + ***************************************************************************** + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_RENDERER_DISCOVERY_H +#define VLC_RENDERER_DISCOVERY_H 1 + +#include +#include +#include + +/** + * @defgroup vlc_renderer VLC renderer discovery + * @{ + * + * @file + * This file declares VLC renderer discvoery structures and functions + * + * @defgroup vlc_renderer_item VLC renderer items returned by the discovery + * @{ + */ + +#define VLC_RENDERER_CAN_AUDIO 0x0001 +#define VLC_RENDERER_CAN_VIDEO 0x0002 + +/** + * Create a new renderer item + * + * @param psz_type type of the item + * @param psz_name name of the item + * @param psz_uri uri of the renderer item, must contains a valid protocol and + * a valid host + * @param psz_extra_sout extra sout options + * @param psz_demux_filter demux filter to use with the renderer + * @param psz_icon_uri icon uri of the renderer item + * @param i_flags flags for the item + * @return a renderer item or NULL in case of error + */ +VLC_API vlc_renderer_item_t * +vlc_renderer_item_new(const char *psz_type, const char *psz_name, + const char *psz_uri, const char *psz_extra_sout, + const char *psz_demux_filter, const char *psz_icon_uri, + int i_flags) VLC_USED; + +/** + * Hold a renderer item, i.e. creates a new reference + */ +VLC_API vlc_renderer_item_t * +vlc_renderer_item_hold(vlc_renderer_item_t *p_item); + +/** + * Releases a renderer item, i.e. decrements its reference counter + */ +VLC_API void +vlc_renderer_item_release(vlc_renderer_item_t *p_item); + +/** + * Get the human readable name of a renderer item + */ +VLC_API const char * +vlc_renderer_item_name(const vlc_renderer_item_t *p_item); + +/** + * Get the type (not translated) of a renderer item. For now, the type can only + * be "chromecast" ("upnp", "airplay" may come later). + */ +VLC_API const char * +vlc_renderer_item_type(const vlc_renderer_item_t *p_item); + +/** + * Get the demux filter to use with a renderer item + */ +VLC_API const char * +vlc_renderer_item_demux_filter(const vlc_renderer_item_t *p_item); + +/** + * Get the sout command of a renderer item + */ +VLC_API const char * +vlc_renderer_item_sout(const vlc_renderer_item_t *p_item); + +/** + * Get the icon uri of a renderer item + */ +VLC_API const char * +vlc_renderer_item_icon_uri(const vlc_renderer_item_t *p_item); + +/** + * Get the flags of a renderer item + */ +VLC_API int +vlc_renderer_item_flags(const vlc_renderer_item_t *p_item); + +/** + * @} + * @defgroup vlc_renderer_discovery VLC renderer discovery interface + * @{ + */ + +typedef struct vlc_renderer_discovery_sys vlc_renderer_discovery_sys; +struct vlc_renderer_discovery_owner; + +/** + * Return a list of renderer discovery modules + * + * @param pppsz_names a pointer to a list of module name, NULL terminated + * @param pppsz_longnames a pointer to a list of module longname, NULL + * terminated + * + * @return VLC_SUCCESS on success, or VLC_EGENERIC on error + */ +VLC_API int +vlc_rd_get_names(vlc_object_t *p_obj, char ***pppsz_names, + char ***pppsz_longnames) VLC_USED; +#define vlc_rd_get_names(a, b, c) \ + vlc_rd_get_names(VLC_OBJECT(a), b, c) + +/** + * Create a new renderer discovery module + * + * @param psz_name name of the module to load, see vlc_rd_get_names() to get + * the list of names + * + * @return a valid vlc_renderer_discovery, need to be released with + * vlc_rd_release() + */ +VLC_API vlc_renderer_discovery_t * +vlc_rd_new(vlc_object_t *p_obj, const char *psz_name, + const struct vlc_renderer_discovery_owner *owner) VLC_USED; + +VLC_API void vlc_rd_release(vlc_renderer_discovery_t *p_rd); + +/** + * @} + * @defgroup vlc_renderer_discovery_module VLC renderer module + * @{ + */ + +struct vlc_renderer_discovery_owner +{ + void *sys; + void (*item_added)(struct vlc_renderer_discovery_t *, + struct vlc_renderer_item_t *); + void (*item_removed)(struct vlc_renderer_discovery_t *, + struct vlc_renderer_item_t *); +}; + +struct vlc_renderer_discovery_t +{ + VLC_COMMON_MEMBERS + module_t * p_module; + + struct vlc_renderer_discovery_owner owner; + + char * psz_name; + config_chain_t * p_cfg; + + vlc_renderer_discovery_sys *p_sys; +}; + +/** + * Add a new renderer item + * + * This will send the vlc_RendererDiscoveryItemAdded event + */ +static inline void vlc_rd_add_item(vlc_renderer_discovery_t * p_rd, + vlc_renderer_item_t * p_item) +{ + p_rd->owner.item_added(p_rd, p_item); +} + +/** + * Add a new renderer item + * + * This will send the vlc_RendererDiscoveryItemRemoved event + */ +static inline void vlc_rd_remove_item(vlc_renderer_discovery_t * p_rd, + vlc_renderer_item_t * p_item) +{ + p_rd->owner.item_removed(p_rd, p_item); +} + +/** + * Renderer Discovery proble helpers + */ +VLC_API int +vlc_rd_probe_add(vlc_probe_t *p_probe, const char *psz_name, + const char *psz_longname); + +#define VLC_RD_PROBE_HELPER(name, longname) \ +static int vlc_rd_probe_open(vlc_object_t *obj) \ +{ \ + return vlc_rd_probe_add((struct vlc_probe_t *)obj, name, longname); \ +} + +#define VLC_RD_PROBE_SUBMODULE \ + add_submodule() \ + set_capability("renderer probe", 100) \ + set_callbacks(vlc_rd_probe_open, NULL) + +/** @} @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_services_discovery.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_services_discovery.h new file mode 100644 index 0000000..673410c --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_services_discovery.h @@ -0,0 +1,234 @@ +/***************************************************************************** + * vlc_services_discovery.h : Services Discover functions + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: e4dfcd3985a6eea1d4b5c540e72219b67d733901 $ + * + * Authors: Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SERVICES_DISCOVERY_H_ +#define VLC_SERVICES_DISCOVERY_H_ + +#include +#include + +/** + * \file + * This file lists functions and structures for service discovery (SD) in vlc + */ + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * @{ + */ + +struct services_discovery_owner_t +{ + void *sys; /**< Private data for the owner callbacks */ + void (*item_added)(struct services_discovery_t *sd, input_item_t *parent, + input_item_t *item, const char *category); + void (*item_removed)(struct services_discovery_t *sd, input_item_t *item); +}; + +/** + * Main service discovery structure to build a SD module + */ +struct services_discovery_t +{ + VLC_COMMON_MEMBERS + module_t * p_module; /**< Loaded module */ + + char *psz_name; /**< Main name of the SD */ + config_chain_t *p_cfg; /**< Configuration for the SD */ + + const char *description; /**< Human-readable name */ + + /** Control function + * \see services_discovery_command_e + */ + int ( *pf_control ) ( services_discovery_t *, int, va_list ); + + services_discovery_sys_t *p_sys; /**< Custom private data */ + + struct services_discovery_owner_t owner; /**< Owner callbacks */ +}; + +/** + * Service discovery categories + * \see vlc_sd_probe_Add + */ +enum services_discovery_category_e +{ + SD_CAT_DEVICES = 1, /**< Devices, like portable music players */ + SD_CAT_LAN, /**< LAN/WAN services, like Upnp or SAP */ + SD_CAT_INTERNET, /**< Internet or Website channels services */ + SD_CAT_MYCOMPUTER /**< Computer services, like Discs or Apps */ +}; + +/** + * Service discovery control commands + */ +enum services_discovery_command_e +{ + SD_CMD_SEARCH = 1, /**< arg1 = query */ + SD_CMD_DESCRIPTOR /**< arg1 = services_discovery_descriptor_t* */ +}; + +/** + * Service discovery capabilities + */ +enum services_discovery_capability_e +{ + SD_CAP_SEARCH = 1 /**< One can search in the SD */ +}; + +/** + * Service discovery descriptor + * \see services_discovery_command_e + */ +typedef struct +{ + char *psz_short_desc; /**< The short description, human-readable */ + char *psz_icon_url; /**< URL to the icon that represents it */ + char *psz_url; /**< URL for the service */ + int i_capabilities; /**< \see services_discovery_capability_e */ +} services_discovery_descriptor_t; + + +/*********************************************************************** + * Service Discovery + ***********************************************************************/ + +/** + * Ask for a research in the SD + * @param p_sd: the Service Discovery + * @param i_control: the command to issue + * @param args: the argument list + * @return VLC_SUCCESS in case of success, the error code overwise + */ +static inline int vlc_sd_control( services_discovery_t *p_sd, int i_control, va_list args ) +{ + if( p_sd->pf_control ) + return p_sd->pf_control( p_sd, i_control, args ); + else + return VLC_EGENERIC; +} + +/* Get the services discovery modules names to use in Create(), in a null + * terminated string array. Array and string must be freed after use. */ +VLC_API char ** vlc_sd_GetNames( vlc_object_t *, char ***, int ** ) VLC_USED; +#define vlc_sd_GetNames(obj, pln, pcat ) \ + vlc_sd_GetNames(VLC_OBJECT(obj), pln, pcat) + +/** + * Creates a services discoverer. + */ +VLC_API services_discovery_t *vlc_sd_Create(vlc_object_t *parent, + const char *chain, const struct services_discovery_owner_t *owner) +VLC_USED; + +VLC_API void vlc_sd_Destroy( services_discovery_t * ); + +/** + * Added top-level service callback. + * + * This is a convenience wrapper for services_discovery_AddSubItem(). + * It covers the most comomn case wherby the added item is a top-level service, + * i.e. it has no parent node. + */ +static inline void services_discovery_AddItem(services_discovery_t *sd, + input_item_t *item) +{ + sd->owner.item_added(sd, NULL, item, NULL); +} + +/** + * Added service callback. + * + * A services discovery module invokes this function when it "discovers" a new + * service, i.e. a new input item. + * + * @note This callback does not take ownership of the input item; it might + * however (and most probably will) add one of more references to the item. + * + * The caller is responsible for releasing its own reference(s) eventually. + * Keeping a reference is necessary to call services_discovery_RemoveItem() or + * to alter the item later. However, if the caller will never remove nor alter + * the item, it can drop its reference(s) immediately. + * + * @param sd services discoverer / services discovery module instance + * @param item input item to add + */ +static inline void services_discovery_AddSubItem(services_discovery_t *sd, + input_item_t *parent, + input_item_t *item) +{ + sd->owner.item_added(sd, parent, item, NULL); +} + +/** + * Added service backward compatibility callback. + * + * @param category Optional name of a group that the item belongs in + * (for backward compatibility with legacy modules) + */ +VLC_DEPRECATED +static inline void services_discovery_AddItemCat(services_discovery_t *sd, + input_item_t *item, + const char *category) +{ + sd->owner.item_added(sd, NULL, item, category); +} + +/** + * Removed service callback. + * + * A services discovery module invokes this function when it senses that a + * service is no longer available. + */ +static inline void services_discovery_RemoveItem(services_discovery_t *sd, + input_item_t *item) +{ + sd->owner.item_removed(sd, item); +} + +/* SD probing */ + +VLC_API int vlc_sd_probe_Add(vlc_probe_t *, const char *, const char *, int category); + +#define VLC_SD_PROBE_SUBMODULE \ + add_submodule() \ + set_capability( "services probe", 100 ) \ + set_callbacks( vlc_sd_probe_Open, NULL ) + +#define VLC_SD_PROBE_HELPER(name, longname, cat) \ +static int vlc_sd_probe_Open (vlc_object_t *obj) \ +{ \ + return vlc_sd_probe_Add ((struct vlc_probe_t *)obj, name, \ + longname, cat); \ +} + +/** @} */ +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_sout.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_sout.h new file mode 100644 index 0000000..8e6367e --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_sout.h @@ -0,0 +1,311 @@ +/***************************************************************************** + * vlc_sout.h : stream output module + ***************************************************************************** + * Copyright (C) 2002-2008 VLC authors and VideoLAN + * $Id: c710780e2e15ccd3de5ef3e12a47dcfacfbc744a $ + * + * Authors: Christophe Massiot + * Laurent Aimar + * Eric Petit + * Jean-Paul Saman + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SOUT_H_ +#define VLC_SOUT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** + * \defgroup sout Stream output + * \ingroup output + * @{ + * \file + * Stream output modules interface + */ + +/** Stream output instance (FIXME: should be private to src/ to avoid + * invalid unsynchronized access) */ +struct sout_instance_t +{ + VLC_COMMON_MEMBERS + + char *psz_sout; + + /** count of output that can't control the space */ + int i_out_pace_nocontrol; + + vlc_mutex_t lock; + sout_stream_t *p_stream; +}; + +/**************************************************************************** + * sout_stream_id_sys_t: opaque (private for all sout_stream_t) + ****************************************************************************/ +typedef struct sout_stream_id_sys_t sout_stream_id_sys_t; + +/** + * \defgroup sout_access Access output + * Raw output byte streams + * @{ + */ + +/** Stream output access_output */ +struct sout_access_out_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + char *psz_access; + + char *psz_path; + sout_access_out_sys_t *p_sys; + int (*pf_seek)( sout_access_out_t *, off_t ); + ssize_t (*pf_read)( sout_access_out_t *, block_t * ); + ssize_t (*pf_write)( sout_access_out_t *, block_t * ); + int (*pf_control)( sout_access_out_t *, int, va_list ); + + config_chain_t *p_cfg; +}; + +enum access_out_query_e +{ + ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */ + ACCESS_OUT_CAN_SEEK, /* arg1=bool *, can fail (assume false) */ +}; + +VLC_API sout_access_out_t * sout_AccessOutNew( vlc_object_t *, const char *psz_access, const char *psz_name ) VLC_USED; +#define sout_AccessOutNew( obj, access, name ) \ + sout_AccessOutNew( VLC_OBJECT(obj), access, name ) +VLC_API void sout_AccessOutDelete( sout_access_out_t * ); +VLC_API int sout_AccessOutSeek( sout_access_out_t *, off_t ); +VLC_API ssize_t sout_AccessOutRead( sout_access_out_t *, block_t * ); +VLC_API ssize_t sout_AccessOutWrite( sout_access_out_t *, block_t * ); +VLC_API int sout_AccessOutControl( sout_access_out_t *, int, ... ); + +static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao ) +{ + bool b; + if( sout_AccessOutControl( p_ao, ACCESS_OUT_CONTROLS_PACE, &b ) ) + return true; + return b; +} + +/** + * @} + * \defgroup sout_mux Multiplexer + * Multiplexers (file formatters) + * @{ + */ + +/** Muxer structure */ +struct sout_mux_t +{ + VLC_COMMON_MEMBERS + module_t *p_module; + + sout_instance_t *p_sout; + + char *psz_mux; + config_chain_t *p_cfg; + + sout_access_out_t *p_access; + + int (*pf_addstream)( sout_mux_t *, sout_input_t * ); + void (*pf_delstream)( sout_mux_t *, sout_input_t * ); + int (*pf_mux) ( sout_mux_t * ); + int (*pf_control) ( sout_mux_t *, int, va_list ); + + /* here are all inputs accepted by muxer */ + int i_nb_inputs; + sout_input_t **pp_inputs; + + /* mux private */ + sout_mux_sys_t *p_sys; + + /* XXX private to stream_output.c */ + /* if muxer doesn't support adding stream at any time then we first wait + * for stream then we refuse all stream and start muxing */ + bool b_add_stream_any_time; + bool b_waiting_stream; + /* we wait 1.5 second after first stream added */ + mtime_t i_add_stream_start; +}; + +enum sout_mux_query_e +{ + /* capabilities */ + MUX_CAN_ADD_STREAM_WHILE_MUXING, /* arg1= bool *, res=cannot fail */ + /* properties */ + MUX_GET_ADD_STREAM_WAIT, /* arg1= bool *, res=cannot fail */ + MUX_GET_MIME, /* arg1= char ** res=can fail */ +}; + +struct sout_input_t +{ + const es_format_t *p_fmt; + block_fifo_t *p_fifo; + void *p_sys; + es_format_t fmt; +}; + + +VLC_API sout_mux_t * sout_MuxNew( sout_instance_t*, const char *, sout_access_out_t * ) VLC_USED; +VLC_API sout_input_t *sout_MuxAddStream( sout_mux_t *, const es_format_t * ) VLC_USED; +VLC_API void sout_MuxDeleteStream( sout_mux_t *, sout_input_t * ); +VLC_API void sout_MuxDelete( sout_mux_t * ); +VLC_API int sout_MuxSendBuffer( sout_mux_t *, sout_input_t *, block_t * ); +VLC_API int sout_MuxGetStream(sout_mux_t *, unsigned, mtime_t *); +VLC_API void sout_MuxFlush( sout_mux_t *, sout_input_t * ); + +static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = p_mux->pf_control( p_mux, i_query, args ); + va_end( args ); + return i_result; +} + +/** @} */ + +enum sout_stream_query_e { + SOUT_STREAM_EMPTY, /* arg1=bool *, res=can fail (assume true) */ +}; + +struct sout_stream_t +{ + VLC_COMMON_MEMBERS + + module_t *p_module; + sout_instance_t *p_sout; + + char *psz_name; + config_chain_t *p_cfg; + sout_stream_t *p_next; + + /* add, remove a stream */ + sout_stream_id_sys_t *(*pf_add)( sout_stream_t *, const es_format_t * ); + void (*pf_del)( sout_stream_t *, sout_stream_id_sys_t * ); + /* manage a packet */ + int (*pf_send)( sout_stream_t *, sout_stream_id_sys_t *, block_t* ); + int (*pf_control)( sout_stream_t *, int, va_list ); + void (*pf_flush)( sout_stream_t *, sout_stream_id_sys_t * ); + + sout_stream_sys_t *p_sys; + bool pace_nocontrol; +}; + +VLC_API void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last ); +VLC_API sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout, + const char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED; + +static inline sout_stream_id_sys_t *sout_StreamIdAdd( sout_stream_t *s, + const es_format_t *fmt ) +{ + return s->pf_add( s, fmt ); +} + +static inline void sout_StreamIdDel( sout_stream_t *s, + sout_stream_id_sys_t *id ) +{ + s->pf_del( s, id ); +} + +static inline int sout_StreamIdSend( sout_stream_t *s, + sout_stream_id_sys_t *id, block_t *b ) +{ + return s->pf_send( s, id, b ); +} + +static inline void sout_StreamFlush( sout_stream_t *s, + sout_stream_id_sys_t *id ) +{ + if (s->pf_flush) + s->pf_flush( s, id ); +} + +static inline int sout_StreamControl( sout_stream_t *s, int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + if ( !s->pf_control ) + i_result = VLC_EGENERIC; + else + i_result = s->pf_control( s, i_query, args ); + va_end( args ); + return i_result; +} + +/**************************************************************************** + * Encoder + ****************************************************************************/ + +VLC_API encoder_t * sout_EncoderCreate( vlc_object_t *obj ); +#define sout_EncoderCreate(o) sout_EncoderCreate(VLC_OBJECT(o)) + +/**************************************************************************** + * Announce handler + ****************************************************************************/ +VLC_API session_descriptor_t* sout_AnnounceRegisterSDP( vlc_object_t *, const char *, const char * ) VLC_USED; +VLC_API void sout_AnnounceUnRegister(vlc_object_t *,session_descriptor_t* ); +#define sout_AnnounceRegisterSDP(o, sdp, addr) \ + sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr) +#define sout_AnnounceUnRegister(o, a) \ + sout_AnnounceUnRegister(VLC_OBJECT (o), a) + +/** SDP */ + +struct sockaddr; +struct vlc_memstream; + +VLC_API int vlc_sdp_Start(struct vlc_memstream *, vlc_object_t *obj, + const char *cfgpref, + const struct sockaddr *src, size_t slen, + const struct sockaddr *addr, size_t alen) VLC_USED; +VLC_API void sdp_AddMedia(struct vlc_memstream *, const char *type, + const char *protocol, int dport, unsigned pt, + bool bw_indep, unsigned bw, const char *ptname, + unsigned clockrate, unsigned channels, + const char *fmtp); +VLC_API void sdp_AddAttribute(struct vlc_memstream *, const char *name, + const char *fmt, ...) VLC_FORMAT(3, 4); + +/** Description module */ +typedef struct sout_description_data_t +{ + int i_es; + es_format_t **es; + vlc_sem_t *sem; +} sout_description_data_t; + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_spu.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_spu.h new file mode 100644 index 0000000..ebc4205 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_spu.h @@ -0,0 +1,105 @@ +/***************************************************************************** + * vlc_spu.h: spu_t definition and functions. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2010 Laurent Aimar + * $Id: 510ee151ec907da9fb6ac88b38cf7ef68a5c4af8 $ + * + * Authors: Gildas Bazin + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SPU_H +#define VLC_SPU_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup spu Sub-picture channels + * \ingroup video_output + * @{ + * \file + */ + +typedef struct spu_private_t spu_private_t; + +/** + * Subpicture unit descriptor + */ +struct spu_t +{ + VLC_COMMON_MEMBERS + + spu_private_t *p; +}; + + VLC_API spu_t * spu_Create( vlc_object_t *, vout_thread_t * ); +#define spu_Create(a,b) spu_Create(VLC_OBJECT(a),b) +VLC_API void spu_Destroy( spu_t * ); + +/** + * This function sends a subpicture to the spu_t core. + * + * You cannot use the provided subpicture anymore. The spu_t core + * will destroy it at its convenience. + */ +VLC_API void spu_PutSubpicture( spu_t *, subpicture_t * ); + +/** + * This function will return an unique subpicture containing the OSD and + * subtitles visibles at the requested date. + * + * \param p_chroma_list is a list of supported chroma for the output (can be NULL) + * \param p_fmt_dst is the format of the picture on which the return subpicture will be rendered. + * \param p_fmt_src is the format of the original(source) video. + * + * The returned value if non NULL must be released by subpicture_Delete(). + */ +VLC_API subpicture_t * spu_Render( spu_t *, const vlc_fourcc_t *p_chroma_list, const video_format_t *p_fmt_dst, const video_format_t *p_fmt_src, mtime_t render_subtitle_date, mtime_t render_osd_date, bool ignore_osd ); + +/** + * It registers a new SPU channel. + */ +VLC_API int spu_RegisterChannel( spu_t * ); + +/** + * It clears all subpictures associated to a SPU channel. + */ +VLC_API void spu_ClearChannel( spu_t *, int ); + +/** + * It changes the sub sources list + */ +VLC_API void spu_ChangeSources( spu_t *, const char * ); + +/** + * It changes the sub filters list + */ +VLC_API void spu_ChangeFilters( spu_t *, const char * ); + +/** @}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_SPU_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_stream.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_stream.h new file mode 100644 index 0000000..0d6d0e9 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_stream.h @@ -0,0 +1,498 @@ +/***************************************************************************** + * vlc_stream.h: Stream (between access and demux) descriptor and methods + ***************************************************************************** + * Copyright (C) 1999-2004 VLC authors and VideoLAN + * $Id: 789545e16e59dd99f215d7b2bafb655f49dfbc88 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STREAM_H +#define VLC_STREAM_H 1 + +#include + +# ifdef __cplusplus +extern "C" { +# endif + +/** + * \defgroup stream Stream + * \ingroup input + * Buffered input byte streams + * @{ + * \file + * Byte streams and byte stream filter modules interface + */ + +/** + * stream_t definition + */ + +struct stream_t +{ + VLC_COMMON_MEMBERS + + /* Module properties for stream filter */ + module_t *p_module; + + char *psz_name; + char *psz_url; /**< Full URL or MRL (can be NULL) */ + const char *psz_location; /**< Location (URL with the scheme stripped) */ + char *psz_filepath; /**< Local file path (if applicable) */ + bool b_preparsing; /**< True if this access is used to preparse */ + + /* Stream source for stream filter */ + stream_t *p_source; + + /** + * Read data. + * + * Callback to read data from the stream into a caller-supplied buffer. + * + * This may be NULL if the stream is actually a directory rather than a + * byte stream, or if \ref stream_t.pf_block is non-NULL. + * + * \param buf buffer to read data into + * \param len buffer length (in bytes) + * + * \retval -1 no data available yet + * \retval 0 end of stream (incl. fatal error) + * \retval positive number of bytes read (no more than len) + */ + ssize_t (*pf_read)(stream_t *, void *buf, size_t len); + + /** + * Read data block. + * + * Callback to read a block of data. The data is read into a block of + * memory allocated by the stream. For some streams, data can be read more + * efficiently in block of a certain size, and/or using a custom allocator + * for buffers. In such case, this callback should be provided instead of + * \ref stream_t.pf_read; otherwise, this should be NULL. + * + * \param eof storage space for end-of-stream flag [OUT] + * (*eof is always false when invoking pf_block(); pf_block() should set + * *eof to true if it detects the end of the stream) + * + * \return a data block, + * NULL if no data available yet, on error and at end-of-stream + */ + block_t *(*pf_block)(stream_t *, bool *eof); + + /** + * Read directory. + * + * Callback to fill an item node from a directory + * (see doc/browsing.txt for details). + * + * NULL if the stream is not a directory. + */ + int (*pf_readdir)(stream_t *, input_item_node_t *); + + /** + * Seek. + * + * Callback to set the stream pointer (in bytes from start). + * + * May be NULL if seeking is not supported. + */ + int (*pf_seek)(stream_t *, uint64_t); + + /** + * Stream control. + * + * Cannot be NULL. + * + * \see stream_query_e + */ + int (*pf_control)(stream_t *, int i_query, va_list); + + /** + * Private data pointer + */ + void *p_sys; + + /* Weak link to parent input */ + input_thread_t *p_input; +}; + +/** + * Possible commands to send to vlc_stream_Control() and vlc_stream_vaControl() + */ +enum stream_query_e +{ + /* capabilities */ + STREAM_CAN_SEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_FASTSEEK, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_PAUSE, /**< arg1= bool * res=cannot fail*/ + STREAM_CAN_CONTROL_PACE, /**< arg1= bool * res=cannot fail*/ + /* */ + STREAM_GET_SIZE=6, /**< arg1= uint64_t * res=can fail */ + STREAM_IS_DIRECTORY, /**< res=can fail */ + + /* */ + STREAM_GET_PTS_DELAY = 0x101,/**< arg1= int64_t* res=cannot fail */ + STREAM_GET_TITLE_INFO, /**< arg1=input_title_t*** arg2=int* res=can fail */ + STREAM_GET_TITLE, /**< arg1=unsigned * res=can fail */ + STREAM_GET_SEEKPOINT, /**< arg1=unsigned * res=can fail */ + STREAM_GET_META, /**< arg1= vlc_meta_t * res=can fail */ + STREAM_GET_CONTENT_TYPE, /**< arg1= char ** res=can fail */ + STREAM_GET_SIGNAL, /**< arg1=double *pf_quality, arg2=double *pf_strength res=can fail */ + STREAM_GET_TAGS, /**< arg1=const block_t ** res=can fail */ + + STREAM_SET_PAUSE_STATE = 0x200, /**< arg1= bool res=can fail */ + STREAM_SET_TITLE, /**< arg1= int res=can fail */ + STREAM_SET_SEEKPOINT, /**< arg1= int res=can fail */ + + /* XXX only data read through vlc_stream_Read/Block will be recorded */ + STREAM_SET_RECORD_STATE, /**< arg1=bool, arg2=const char *psz_ext (if arg1 is true) res=can fail */ + + STREAM_SET_PRIVATE_ID_STATE = 0x1000, /* arg1= int i_private_data, bool b_selected res=can fail */ + STREAM_SET_PRIVATE_ID_CA, /* arg1= int i_program_number, uint16_t i_vpid, uint16_t i_apid1, uint16_t i_apid2, uint16_t i_apid3, uint8_t i_length, uint8_t *p_data */ + STREAM_GET_PRIVATE_ID_STATE, /* arg1=int i_private_data arg2=bool * res=can fail */ +}; + +/** + * Reads data from a byte stream. + * + * This function always waits for the requested number of bytes, unless a fatal + * error is encountered or the end-of-stream is reached first. + * + * If the buffer is NULL, data is skipped instead of read. This is effectively + * a relative forward seek, but it works even on non-seekable streams. + * + * \param buf start of buffer to read data into [OUT] + * \param len number of bytes to read + * \return the number of bytes read or a negative value on error. + */ +VLC_API ssize_t vlc_stream_Read(stream_t *, void *buf, size_t len) VLC_USED; + +/** + * Reads partial data from a byte stream. + * + * This function waits until some data is available for reading from the + * stream, a fatal error is encountered or the end-of-stream is reached. + * + * Unlike vlc_stream_Read(), this function does not wait for the full requested + * bytes count. It can return a short count even before the end of the stream + * and in the absence of any error. + * + * \param buf start of buffer to read data into [OUT] + * \param len buffer size (maximum number of bytes to read) + * \return the number of bytes read or a negative value on error. + */ +VLC_API ssize_t vlc_stream_ReadPartial(stream_t *, void *buf, size_t len) +VLC_USED; + +/** + * Peeks at data from a byte stream. + * + * This function buffers for the requested number of bytes, waiting if + * necessary. Then it stores a pointer to the buffer. Unlike vlc_stream_Read() + * or vlc_stream_Block(), this function does not modify the stream read offset. + * + * \note + * The buffer remains valid until the next read/peek or seek operation on the + * same stream. In case of error, the buffer address is undefined. + * + * \param bufp storage space for the buffer address [OUT] + * \param len number of bytes to peek + * \return the number of bytes actually available (shorter than requested if + * the end-of-stream is reached), or a negative value on error. + */ +VLC_API ssize_t vlc_stream_Peek(stream_t *, const uint8_t **, size_t) VLC_USED; + +/** + * Reads a data block from a byte stream. + * + * This function dequeues the next block of data from the byte stream. The + * byte stream back-end decides on the size of the block; the caller cannot + * make any assumption about it. + * + * The function might also return NULL spuriously - this does not necessarily + * imply that the stream is ended nor that it has encountered a nonrecoverable + * error. + * + * This function should be used instead of vlc_stream_Read() or + * vlc_stream_Peek() when the caller can handle reads of any size. + * + * \return either a data block or NULL + */ +VLC_API block_t *vlc_stream_ReadBlock(stream_t *) VLC_USED; + +/** + * Tells the current stream position. + * + * This function tells the current read offset (in bytes) from the start of + * the start of the stream. + * @note The read offset may be larger than the stream size, either because of + * a seek past the end, or because the stream shrank asynchronously. + * + * @return the byte offset from the beginning of the stream (cannot fail) + */ +VLC_API uint64_t vlc_stream_Tell(const stream_t *) VLC_USED; + +/** + * Checks for end of stream. + * + * Checks if the last attempt to reads data from the stream encountered the + * end of stream before the attempt could be fully satisfied. + * The value is initially false, and is reset to false by vlc_stream_Seek(). + * + * \note The function can return false even though the current stream position + * is equal to the stream size. It will return true after the following attempt + * to read more than zero bytes. + * + * \note It might be possible to read after the end of the stream. + * It implies the size of the stream increased asynchronously in the mean time. + * Streams of most types cannot trigger such a case, + * but regular local files notably can. + * + * \note In principles, the stream size should match the stream offset when + * the end-of-stream is reached. But that rule is not enforced; it is entirely + * dependent on the underlying implementation of the stream. + */ +VLC_API bool vlc_stream_Eof(const stream_t *) VLC_USED; + +/** + * Sets the current stream position. + * + * This function changes the read offset within a stream, if the stream + * supports seeking. In case of error, the read offset is not changed. + * + * @note It is possible (but not useful) to seek past the end of a stream. + * + * @param offset byte offset from the beginning of the stream + * @return zero on success, a negative value on error + */ +VLC_API int vlc_stream_Seek(stream_t *, uint64_t offset) VLC_USED; + +VLC_API int vlc_stream_vaControl(stream_t *s, int query, va_list args); + +static inline int vlc_stream_Control(stream_t *s, int query, ...) +{ + va_list ap; + int ret; + + va_start(ap, query); + ret = vlc_stream_vaControl(s, query, ap); + va_end(ap); + return ret; +} + +VLC_API block_t *vlc_stream_Block(stream_t *s, size_t); +VLC_API char *vlc_stream_ReadLine(stream_t *); +VLC_API int vlc_stream_ReadDir(stream_t *, input_item_node_t *); + +/** + * Closes a byte stream. + * \param s byte stream to close + */ +VLC_API void vlc_stream_Delete(stream_t *s); + +VLC_API stream_t *vlc_stream_CommonNew(vlc_object_t *, void (*)(stream_t *)); + +/** + * Get the size of the stream. + */ +VLC_USED static inline int vlc_stream_GetSize( stream_t *s, uint64_t *size ) +{ + return vlc_stream_Control( s, STREAM_GET_SIZE, size ); +} + +static inline int64_t stream_Size( stream_t *s ) +{ + uint64_t i_pos; + + if( vlc_stream_GetSize( s, &i_pos ) ) + return 0; + if( i_pos >> 62 ) + return (int64_t)1 << 62; + return i_pos; +} + +VLC_USED +static inline bool stream_HasExtension( stream_t *s, const char *extension ) +{ + const char *name = (s->psz_filepath != NULL) ? s->psz_filepath + : s->psz_url; + const char *ext = strrchr( name, '.' ); + return ext != NULL && !strcasecmp( ext, extension ); +} + +/** + * Get the Content-Type of a stream, or NULL if unknown. + * Result must be free()'d. + */ +static inline char *stream_ContentType( stream_t *s ) +{ + char *res; + if( vlc_stream_Control( s, STREAM_GET_CONTENT_TYPE, &res ) ) + return NULL; + return res; +} + +/** + * Get the mime-type of a stream + * + * \warning the returned resource is to be freed by the caller + * \return the mime-type, or `NULL` if unknown + **/ +VLC_USED +static inline char *stream_MimeType( stream_t *s ) +{ + char* mime_type = stream_ContentType( s ); + + if( mime_type ) /* strip parameters */ + mime_type[strcspn( mime_type, " ;" )] = '\0'; + + return mime_type; +} + +/** + * Checks for a MIME type. + * + * Checks if the stream has a specific MIME type. + */ +VLC_USED +static inline bool stream_IsMimeType(stream_t *s, const char *type) +{ + char *mime = stream_MimeType(s); + if (mime == NULL) + return false; + + bool ok = !strcasecmp(mime, type); + free(mime); + return ok; +} + +/** + * Create a stream from a memory buffer. + * + * \param obj parent VLC object + * \param base start address of the memory buffer to read from + * \param size size in bytes of the memory buffer + * \param preserve if false, free(base) will be called when the stream is + * destroyed; if true, the memory buffer is preserved + */ +VLC_API stream_t *vlc_stream_MemoryNew(vlc_object_t *obj, uint8_t *base, + size_t size, bool preserve) VLC_USED; +#define vlc_stream_MemoryNew(a, b, c, d) \ + vlc_stream_MemoryNew(VLC_OBJECT(a), b, c, d) + +/** + * Create a stream_t reading from a URL. + * You must delete it using vlc_stream_Delete. + */ +VLC_API stream_t * vlc_stream_NewURL(vlc_object_t *obj, const char *url) +VLC_USED; +#define vlc_stream_NewURL(a, b) vlc_stream_NewURL(VLC_OBJECT(a), b) + +/** + * \defgroup stream_fifo FIFO stream + * In-memory anonymous pipe + @{ + */ + +/** + * Creates a FIFO stream. + * + * Creates a non-seekable byte stream object whose byte stream is generated + * by another thread in the process. This is the LibVLC equivalent of an + * anonymous pipe/FIFO. + * + * On the reader side, the normal stream functions are used, + * e.g. vlc_stream_Read() and vlc_stream_Delete(). + * + * The created stream object is automatically destroyed when both the reader + * and the writer sides have been closed, with vlc_stream_Delete() and + * vlc_stream_fifo_Close() respectively. + * + * \param parent parent VLC object for the stream + * \return a stream object or NULL on memory error. + */ +VLC_API stream_t *vlc_stream_fifo_New(vlc_object_t *parent); + +/** + * Writes a block to a FIFO stream. + * + * \param s FIFO stream created by vlc_stream_fifo_New() + * \param block data block to write to the stream + * \return 0 on success. -1 if the reader end has already been closed + * (errno is then set to EPIPE, and the block is deleted). + * + * \bug No congestion control is performed. If the reader end is not keeping + * up with the writer end, buffers will accumulate in memory. + */ +VLC_API int vlc_stream_fifo_Queue(stream_t *s, block_t *block); + +/** + * Writes data to a FIFO stream. + * + * This is a convenience helper for vlc_stream_fifo_Queue(). + * \param s FIFO stream created by vlc_stream_fifo_New() + * \param buf start address of data to write + * \param len length of data to write in bytes + * \return len on success, or -1 on error (errno is set accordingly) + */ +VLC_API ssize_t vlc_stream_fifo_Write(stream_t *s, const void *buf, + size_t len); + +/** + * Terminates a FIFO stream. + * + * Marks the end of the FIFO stream and releases any underlying resources. + * \param s FIFO stream created by vlc_stream_fifo_New() + */ +VLC_API void vlc_stream_fifo_Close(stream_t *s); + +/** + * @} + */ + +/** + * Try to add a stream filter to an open stream. + * @return New stream to use, or NULL if the filter could not be added. + **/ +VLC_API stream_t* vlc_stream_FilterNew( stream_t *p_source, const char *psz_stream_filter ); + +/** + * Default ReadDir implementation for stream Filter. This implementation just + * forward the pf_readdir call to the p_source stream. + */ +VLC_API int vlc_stream_FilterDefaultReadDir(stream_t *s, + input_item_node_t *p_node); + +/** + * Sets vlc_stream_FilterDefaultReadDir as the pf_readdir callback for this + * stream filter. + */ +#define stream_FilterSetDefaultReadDir(stream) \ +do { \ + (stream)->pf_readdir = vlc_stream_FilterDefaultReadDir; \ +} while (0) + +/** + * @} + */ + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_stream_extractor.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_stream_extractor.h new file mode 100644 index 0000000..78c51c0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_stream_extractor.h @@ -0,0 +1,170 @@ +/***************************************************************************** + * vlc_stream_extractor.h + ***************************************************************************** + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STREAM_EXTRACTOR_H +#define VLC_STREAM_EXTRACTOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup stream_extractor Stream Extractor + * \ingroup input + * + * If a stream can be viewed as a directory, such as when opening a + * compressed archive, a \em stream-extractor is used to get access to + * the entities inside said stream. + * + * A \em stream-extractor can do one of two things; + * + * - lists the logical entries within a stream: + * - type = \ref stream_directory_t + * - capability = "stream_directory" + * + * - extract data associated with one specific entry within a stream: + * - type = \ref stream_extractor_t + * - capability = "stream_extractor" + * + * @{ + * + **/ + +typedef struct stream_extractor_t { + VLC_COMMON_MEMBERS + + /** + * \name Callbacks for entity extraction + * + * The following members shall be populated as specified by the + * documentation associated with \ref stream_t for the equivalent name. + * + * @{ + **/ + ssize_t (*pf_read)(struct stream_extractor_t*, void* buf, size_t len); + block_t* (*pf_block)(struct stream_extractor_t*, bool* eof); + int (*pf_seek)(struct stream_extractor_t*, uint64_t); + int (*pf_control)(struct stream_extractor_t*, int request, va_list args); + /** @} */ + + char const* identifier; /**< the name of the entity to be extracted */ + stream_t* source; /**< the source stream to be consumed */ + void* p_sys; /**< private opaque handle to be used by the module */ + +} stream_extractor_t; + +typedef struct stream_directory_t { + VLC_COMMON_MEMBERS + + /** + * \name Callbacks for stream directories + * + * The following members shall be populated as specified by the + * documentation associated with \ref stream_t for the equivalent name. + * + * @{ + **/ + int (*pf_readdir)(struct stream_directory_t*, input_item_node_t* ); + /** @} */ + + stream_t* source; /**< the source stream to be consumed */ + void* p_sys; /**< private opaque handle to be used by the module */ + +} stream_directory_t; + +/** + * Create a stream for the data referred to by a \ref mrl + * + * This function will create a \ref stream that reads from the specified \ref + * mrl, potentially making use of \ref stream_extractor%s to access named + * entities within the data read from the original source. + * + * - See the \ref mrl specification for further information. + * - The returned resource shall be deleted through \ref vlc_stream_Delete. + * + * \warning This function is only to be used when \ref mrl functionality is + * explicitly needed. \ref vlc_stream_NewURL shall be used where + * applicable. + * + * \param obj the owner of the requested stream + * \param mrl the mrl for which the stream_t should be created + * \return `NULL` on error, a pointer to \ref stream_t on success. + **/ +VLC_API stream_t * vlc_stream_NewMRL(vlc_object_t *obj, const char *mrl) +VLC_USED; +#define vlc_stream_NewMRL(a, b) vlc_stream_NewMRL(VLC_OBJECT(a), b) + +/** + * Create a relative MRL for the associated entity + * + * This function shall be used by stream_directory_t's in order to + * generate an MRL that refers to an entity within the stream. Normally + * this function will only be invoked within `pf_readdir` in order to + * get the virtual path of the listed items. + * + * \warning the returned value is to be freed by the caller + * + * \param extractor the stream_directory_t for which the entity belongs + * \param subentry the name of the entity in question + * + * \return a pointer to the resulting MRL on success, NULL on failure + **/ +VLC_API char* vlc_stream_extractor_CreateMRL( stream_directory_t*, + char const* subentry ); + +/** + * \name Attach a stream-extractor to the passed stream + * + * These functions are used to attach a stream extractor to an already existing + * stream. As hinted by their names, \ref vlc_stream_extractor_Attach will + * attach an \em entity-extractor, whereas \ref vlc_stream_directory_Attach + * will attach a \em stream-directory. + * + * \param[out] stream a pointer-to-pointer to stream, `*stream` will + * refer to the attached stream on success, and left + * untouched on failure. + * \param identifier (if present) NULL or a c-style string referring to the + * desired entity + * \param module_name NULL or an explicit stream-extractor module name + * + * \return VLC_SUCCESS if a stream-extractor was successfully + * attached, an error-code on failure. + * + * @{ + **/ + +VLC_API int vlc_stream_extractor_Attach( stream_t** source, + char const* identifier, + char const* module_name ); + +VLC_API int vlc_stream_directory_Attach( stream_t** source, + char const* module_name ); +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif /* include-guard */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_strings.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_strings.h new file mode 100644 index 0000000..c222e24 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_strings.h @@ -0,0 +1,159 @@ +/***************************************************************************** + * vlc_strings.h: String functions + ***************************************************************************** + * Copyright (C) 2006 VLC authors and VideoLAN + * $Id: 9828fbd728ee791d409568405f280634132b91a6 $ + * + * Authors: Antoine Cellerier + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_STRINGS_H +#define VLC_STRINGS_H 1 + +/** + * \defgroup strings String helpers + * @{ + * \file + * Helper functions for nul-terminated strings + */ + +static inline int vlc_ascii_toupper( int c ) +{ + if ( c >= 'a' && c <= 'z' ) + return c + ( 'A' - 'a' ); + else + return c; +} + +static inline int vlc_ascii_tolower( int c ) +{ + if ( c >= 'A' && c <= 'Z' ) + return c + ( 'a' - 'A' ); + else + return c; +} + +/** + * Compare two ASCII strings ignoring case. + * + * The result is independent of the locale. If there are non-ASCII + * characters in the strings, their cases are NOT ignored in the + * comparison. + */ +static inline int vlc_ascii_strcasecmp( const char *psz1, const char *psz2 ) +{ + const char *s1 = psz1; + const char *s2 = psz2; + int d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + while ( *s1 && d == 0) + { + s1++; + s2++; + d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + } + + return d; +} + +static inline int vlc_ascii_strncasecmp( const char *psz1, const char *psz2, size_t n ) +{ + const char *s1 = psz1; + const char *s2 = psz2; + const char *s1end = psz1 + n; + int d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + while ( *s1 && s1 < s1end && d == 0) + { + s1++; + s2++; + d = vlc_ascii_tolower( *s1 ) - vlc_ascii_tolower( *s2 ); + } + + if (s1 == s1end) + return 0; + else + return d; +} + +/** + * Decodes XML entities. + * + * Decodes a null-terminated UTF-8 string of XML character data into a regular + * nul-terminated UTF-8 string. In other words, replaces XML entities and + * numerical character references with the corresponding characters. + * + * This function operates in place (the output is always of smaller or equal + * length than the input) and always succeeds. + * + * \param str null-terminated string [IN/OUT] + */ +VLC_API void vlc_xml_decode(char *st); + +/** + * Encodes XML entites. + * + * Substitutes unsafe characters in a null-terminated UTF-8 strings with an + * XML entity or numerical character reference. + * + * \param str null terminated UTF-8 string + * \return On success, a heap-allocated null-terminated string is returned. + * If the input string was not a valid UTF-8 sequence, NULL is returned and + * errno is set to EILSEQ. + * If there was not enough memory, NULL is returned and errno is to ENOMEM. + */ +VLC_API char *vlc_xml_encode(const char *str) VLC_MALLOC; + +VLC_API char * vlc_b64_encode_binary( const uint8_t *, size_t ); +VLC_API char * vlc_b64_encode( const char * ); + +VLC_API size_t vlc_b64_decode_binary_to_buffer( uint8_t *p_dst, size_t i_dst_max, const char *psz_src ); +VLC_API size_t vlc_b64_decode_binary( uint8_t **pp_dst, const char *psz_src ); +VLC_API char * vlc_b64_decode( const char *psz_src ); + +/** + * Convenience wrapper for strftime(). + * + * Formats the current time into a heap-allocated string. + * + * @param tformat time format (as with C strftime()) + * @return an allocated string (must be free()'d), or NULL on memory error. + */ +VLC_API char *vlc_strftime( const char * ); + +/** + * Formats input meta-data. + * + * Formats input and input item meta-informations into a heap-allocated string. + */ +VLC_API char *vlc_strfinput( input_thread_t *, const char * ); + +static inline char *str_format( input_thread_t *input, const char *fmt ) +{ + char *s1 = vlc_strftime( fmt ); + char *s2 = vlc_strfinput( input, s1 ); + free( s1 ); + return s2; +} + +VLC_API int vlc_filenamecmp(const char *, const char *); + +void filename_sanitize(char *); + +/** + * @} + */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_subpicture.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_subpicture.h new file mode 100644 index 0000000..67157c0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_subpicture.h @@ -0,0 +1,237 @@ +/***************************************************************************** + * vlc_subpicture.h: subpicture definitions + ***************************************************************************** + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN + * $Id: b9de52c0493687f2f9920753562e2f1eebfd1b7b $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_SUBPICTURE_H +#define VLC_SUBPICTURE_H 1 + +/** + */ + +#include +#include + +/** + * \defgroup subpicture Video sub-pictures + * \ingroup video_output + * Subpictures are pictures that should be displayed on top of the video, like + * subtitles and OSD + * @{ + * \file + * Subpictures functions + */ + +/** + * Video subtitle region spu core private + */ +typedef struct subpicture_region_private_t subpicture_region_private_t; + +/** + * Video subtitle region + * + * A subtitle region is defined by a picture (graphic) and its rendering + * coordinates. + * Subtitles contain a list of regions. + */ +struct subpicture_region_t +{ + video_format_t fmt; /**< format of the picture */ + picture_t *p_picture; /**< picture comprising this region */ + + int i_x; /**< position of region, relative to alignment */ + int i_y; /**< position of region, relative to alignment */ + int i_align; /**< alignment flags of region */ + int i_alpha; /**< transparency */ + + /* Parameters for text regions (p_picture to be rendered) */ + text_segment_t *p_text; /**< subtitle text, made of a list of segments */ + int i_text_align; /**< alignment flags of region content */ + bool b_noregionbg; /**< render background under text only */ + bool b_gridmode; /** if the decoder sends row/cols based output */ + bool b_balanced_text; /** try to balance wrapped text lines */ + int i_max_width; /** horizontal rendering/cropping target/limit */ + int i_max_height; /** vertical rendering/cropping target/limit */ + + subpicture_region_t *p_next; /**< next region in the list */ + subpicture_region_private_t *p_private; /**< Private data for spu_t *only* */ +}; + +/* Subpicture region position flags */ +#define SUBPICTURE_ALIGN_LEFT 0x1 +#define SUBPICTURE_ALIGN_RIGHT 0x2 +#define SUBPICTURE_ALIGN_TOP 0x4 +#define SUBPICTURE_ALIGN_BOTTOM 0x8 +#define SUBPICTURE_ALIGN_MASK ( SUBPICTURE_ALIGN_LEFT|SUBPICTURE_ALIGN_RIGHT| \ + SUBPICTURE_ALIGN_TOP |SUBPICTURE_ALIGN_BOTTOM ) +/** + * This function will create a new subpicture region. + * + * You must use subpicture_region_Delete to destroy it. + */ +VLC_API subpicture_region_t * subpicture_region_New( const video_format_t *p_fmt ); + +/** + * This function will destroy a subpicture region allocated by + * subpicture_region_New. + * + * You may give it NULL. + */ +VLC_API void subpicture_region_Delete( subpicture_region_t *p_region ); + +/** + * This function will destroy a list of subpicture regions allocated by + * subpicture_region_New. + * + * Provided for convenience. + */ +VLC_API void subpicture_region_ChainDelete( subpicture_region_t *p_head ); + +/** + * This function will copy a subpicture region to a new allocated one + * and transfer all the properties + * + * Provided for convenience. + */ +VLC_API subpicture_region_t *subpicture_region_Copy( subpicture_region_t *p_region ); + +/** + * + */ +typedef struct subpicture_updater_sys_t subpicture_updater_sys_t; +typedef struct +{ + /** Optional pre update callback, usually useful on video format change. + * Will skip pf_update on VLC_SUCCESS, or will delete every region before + * the call to pf_update */ + int (*pf_validate)( subpicture_t *, + bool has_src_changed, const video_format_t *p_fmt_src, + bool has_dst_changed, const video_format_t *p_fmt_dst, + mtime_t); + /** Mandatory callback called after pf_validate and doing + * the main job of creating the subpicture regions for the + * current video_format */ + void (*pf_update) ( subpicture_t *, + const video_format_t *p_fmt_src, + const video_format_t *p_fmt_dst, + mtime_t ); + /** Optional callback for subpicture private data cleanup */ + void (*pf_destroy) ( subpicture_t * ); + subpicture_updater_sys_t *p_sys; +} subpicture_updater_t; + +typedef struct subpicture_private_t subpicture_private_t; + +/** + * Video subtitle + * + * Any subtitle destined to be displayed by a video output thread should + * be stored in this structure from it's creation to it's effective display. + * Subtitle type and flags should only be modified by the output thread. Note + * that an empty subtitle MUST have its flags set to 0. + */ +struct subpicture_t +{ + /** \name Channel ID */ + /**@{*/ + int i_channel; /**< subpicture channel ID */ + /**@}*/ + + /** \name Type and flags + Should NOT be modified except by the vout thread */ + /**@{*/ + int64_t i_order; /** an increasing unique number */ + subpicture_t * p_next; /**< next subtitle to be displayed */ + /**@}*/ + + subpicture_region_t *p_region; /**< region list composing this subtitle */ + + /** \name Date properties */ + /**@{*/ + mtime_t i_start; /**< beginning of display date */ + mtime_t i_stop; /**< end of display date */ + bool b_ephemer; /**< If this flag is set to true the subtitle + will be displayed until the next one appear */ + bool b_fade; /**< enable fading */ + /**@}*/ + + /** \name Display properties + * These properties are only indicative and may be + * changed by the video output thread, or simply ignored depending of the + * subtitle type. */ + /**@{*/ + bool b_subtitle; /**< the picture is a movie subtitle */ + bool b_absolute; /**< position is absolute */ + int i_original_picture_width; /**< original width of the movie */ + int i_original_picture_height;/**< original height of the movie */ + int i_alpha; /**< transparency */ + /**@}*/ + + subpicture_updater_t updater; + + subpicture_private_t *p_private; /* Reserved to the core */ +}; + +/** + * This function create a new empty subpicture. + * + * You must use subpicture_Delete to destroy it. + */ +VLC_API subpicture_t * subpicture_New( const subpicture_updater_t * ); + +/** + * This function delete a subpicture created by subpicture_New. + * You may give it NULL. + */ +VLC_API void subpicture_Delete( subpicture_t *p_subpic ); + +/** + * This function will create a subpicture having one region in the requested + * chroma showing the given picture. + * + * The picture_t given is not released nor used inside the + * returned subpicture_t. + */ +VLC_API subpicture_t * subpicture_NewFromPicture( vlc_object_t *, picture_t *, vlc_fourcc_t i_chroma ); + +/** + * This function will update the content of a subpicture created with + * a non NULL subpicture_updater_t. + */ +VLC_API void subpicture_Update( subpicture_t *, const video_format_t *src, const video_format_t *, mtime_t ); + +/** + * This function will blend a given subpicture onto a picture. + * + * The subpicture and all its region must: + * - be absolute. + * - not be ephemere. + * - not have the fade flag. + * - contains only picture (no text rendering). + * \return the number of region(s) successfully blent + */ +VLC_API unsigned picture_BlendSubpicture( picture_t *, filter_t *p_blend, subpicture_t * ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_text_style.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_text_style.h new file mode 100644 index 0000000..13850d0 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_text_style.h @@ -0,0 +1,404 @@ +/***************************************************************************** + * vlc_text_style.h: text_style_t definition and helpers. + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * $Id: c24d76adcfedf63514255bb31483acb9325df1b1 $ + * + * Authors: Derk-Jan Hartman + * basOS G + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TEXT_STYLE_H +#define VLC_TEXT_STYLE_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Text style + * + * A text style is used to specify the formatting of text. + * A font renderer can use the supplied information to render the + * text specified. + */ +typedef struct +{ + /* Family font names */ + char * psz_fontname; /**< The name of the font */ + char * psz_monofontname; /**< The name of the mono font */ + + uint16_t i_features; /**< Feature flags (means non default) */ + uint16_t i_style_flags; /**< Formatting style flags */ + + /* Font style */ + float f_font_relsize; /**< The font size in video height % */ + int i_font_size; /**< The font size in pixels */ + int i_font_color; /**< The color of the text 0xRRGGBB + (native endianness) */ + uint8_t i_font_alpha; /**< The transparency of the text.*/ + int i_spacing; /**< The spaceing between glyphs in pixels */ + + /* Outline */ + int i_outline_color; /**< The color of the outline 0xRRGGBB */ + uint8_t i_outline_alpha; /**< The transparency of the outline */ + int i_outline_width; /**< The width of the outline in pixels */ + + /* Shadow */ + int i_shadow_color; /**< The color of the shadow 0xRRGGBB */ + uint8_t i_shadow_alpha; /**< The transparency of the shadow. */ + int i_shadow_width; /**< The width of the shadow in pixels */ + + /* Background (and karaoke) */ + int i_background_color;/**< The color of the background 0xRRGGBB */ + uint8_t i_background_alpha;/**< The transparency of the background */ + int i_karaoke_background_color;/**< Background color for karaoke 0xRRGGBB */ + uint8_t i_karaoke_background_alpha;/**< The transparency of the karaoke bg */ + + /* Line breaking */ + enum + { + STYLE_WRAP_DEFAULT = 0, /**< Breaks on whitespace or fallback on char */ + STYLE_WRAP_CHAR, /**< Breaks at character level only */ + STYLE_WRAP_NONE, /**< No line breaks (except explicit ones) */ + } e_wrapinfo; +} text_style_t; + +#define STYLE_ALPHA_OPAQUE 0xFF +#define STYLE_ALPHA_TRANSPARENT 0x00 + +/* Features flags for \ref i_features */ +#define STYLE_NO_DEFAULTS 0x0 +#define STYLE_FULLY_SET 0xFFFF +#define STYLE_HAS_FONT_COLOR (1 << 0) +#define STYLE_HAS_FONT_ALPHA (1 << 1) +#define STYLE_HAS_FLAGS (1 << 2) +#define STYLE_HAS_OUTLINE_COLOR (1 << 3) +#define STYLE_HAS_OUTLINE_ALPHA (1 << 4) +#define STYLE_HAS_SHADOW_COLOR (1 << 5) +#define STYLE_HAS_SHADOW_ALPHA (1 << 6) +#define STYLE_HAS_BACKGROUND_COLOR (1 << 7) +#define STYLE_HAS_BACKGROUND_ALPHA (1 << 8) +#define STYLE_HAS_K_BACKGROUND_COLOR (1 << 9) +#define STYLE_HAS_K_BACKGROUND_ALPHA (1 << 10) +#define STYLE_HAS_WRAP_INFO (1 << 11) + +/* Style flags for \ref text_style_t */ +#define STYLE_BOLD (1 << 0) +#define STYLE_ITALIC (1 << 1) +#define STYLE_OUTLINE (1 << 2) +#define STYLE_SHADOW (1 << 3) +#define STYLE_BACKGROUND (1 << 4) +#define STYLE_UNDERLINE (1 << 5) +#define STYLE_STRIKEOUT (1 << 6) +#define STYLE_HALFWIDTH (1 << 7) +#define STYLE_MONOSPACED (1 << 8) +#define STYLE_DOUBLEWIDTH (1 << 9) +#define STYLE_BLINK_FOREGROUND (1 << 10) +#define STYLE_BLINK_BACKGROUND (1 << 11) + +#define STYLE_DEFAULT_FONT_SIZE 20 +#define STYLE_DEFAULT_REL_FONT_SIZE 6.25 + + +typedef struct text_segment_t text_segment_t; +/** + * Text segment for subtitles + * + * This structure is used to store a formatted text, with mixed styles + * Every segment is comprised of one text and a unique style + * + * On style change, a new segment is created with the next part of text + * and the new style, and chained to the list + * + * Create with text_segment_New and clean the chain with + * text_segment_ChainDelete + */ +struct text_segment_t { + char *psz_text; /**< text string of the segment */ + text_style_t *style; /**< style applied to this segment */ + text_segment_t *p_next; /**< next segment */ +}; + +/** + * Create a default text style + */ +VLC_API text_style_t * text_style_New( void ); + +/** + * Create a text style + * + * Set feature flags as argument if you want to set style defaults + */ +VLC_API text_style_t * text_style_Create( int ); + +/** + * Copy a text style into another + */ +VLC_API text_style_t * text_style_Copy( text_style_t *, const text_style_t * ); + +/** + * Duplicate a text style + */ +VLC_API text_style_t * text_style_Duplicate( const text_style_t * ); + +/** + * Merge two styles using non default values + * + * Set b_override to true if you also want to overwrite non-defaults + */ +VLC_API void text_style_Merge( text_style_t *, const text_style_t *, bool b_override ); + +/** + * Delete a text style created by text_style_New or text_style_Duplicate + */ +VLC_API void text_style_Delete( text_style_t * ); + +/** + * This function will create a new text segment. + * + * You should use text_segment_ChainDelete to destroy it, to clean all + * the linked segments, or text_segment_Delete to free a specic one + * + * This duplicates the string passed as argument + */ +VLC_API text_segment_t *text_segment_New( const char * ); + +/** + * This function will create a new text segment and duplicates the style passed as argument + * + * You should use text_segment_ChainDelete to destroy it, to clean all + * the linked segments, or text_segment_Delete to free a specic one + * + * This doesn't initialize the text. + */ +VLC_API text_segment_t *text_segment_NewInheritStyle( const text_style_t* p_style ); + +/** + * Delete a text segment and its content. + * + * This assumes the segment is not part of a chain + */ +VLC_API void text_segment_Delete( text_segment_t * ); + +/** + * This function will destroy a list of text segments allocated + * by text_segment_New. + * + * You may pass it NULL. + */ +VLC_API void text_segment_ChainDelete( text_segment_t * ); + +/** + * This function will copy a text_segment and its chain into a new one + * + * You may give it NULL, but it will return NULL. + */ +VLC_API text_segment_t * text_segment_Copy( text_segment_t * ); + +static const struct { + const char *psz_name; + uint32_t i_value; +} p_html_colors[] = { + /* Official html colors */ + { "Aqua", 0x00FFFF }, + { "Black", 0x000000 }, + { "Blue", 0x0000FF }, + { "Fuchsia", 0xFF00FF }, + { "Gray", 0x808080 }, + { "Green", 0x008000 }, + { "Lime", 0x00FF00 }, + { "Maroon", 0x800000 }, + { "Navy", 0x000080 }, + { "Olive", 0x808000 }, + { "Purple", 0x800080 }, + { "Red", 0xFF0000 }, + { "Silver", 0xC0C0C0 }, + { "Teal", 0x008080 }, + { "White", 0xFFFFFF }, + { "Yellow", 0xFFFF00 }, + + /* Common ones */ + { "AliceBlue", 0xF0F8FF }, + { "AntiqueWhite", 0xFAEBD7 }, + { "Aqua", 0x00FFFF }, + { "Aquamarine", 0x7FFFD4 }, + { "Azure", 0xF0FFFF }, + { "Beige", 0xF5F5DC }, + { "Bisque", 0xFFE4C4 }, + { "Black", 0x000000 }, + { "BlanchedAlmond", 0xFFEBCD }, + { "Blue", 0x0000FF }, + { "BlueViolet", 0x8A2BE2 }, + { "Brown", 0xA52A2A }, + { "BurlyWood", 0xDEB887 }, + { "CadetBlue", 0x5F9EA0 }, + { "Chartreuse", 0x7FFF00 }, + { "Chocolate", 0xD2691E }, + { "Coral", 0xFF7F50 }, + { "CornflowerBlue", 0x6495ED }, + { "Cornsilk", 0xFFF8DC }, + { "Crimson", 0xDC143C }, + { "Cyan", 0x00FFFF }, + { "DarkBlue", 0x00008B }, + { "DarkCyan", 0x008B8B }, + { "DarkGoldenRod", 0xB8860B }, + { "DarkGray", 0xA9A9A9 }, + { "DarkGrey", 0xA9A9A9 }, + { "DarkGreen", 0x006400 }, + { "DarkKhaki", 0xBDB76B }, + { "DarkMagenta", 0x8B008B }, + { "DarkOliveGreen", 0x556B2F }, + { "Darkorange", 0xFF8C00 }, + { "DarkOrchid", 0x9932CC }, + { "DarkRed", 0x8B0000 }, + { "DarkSalmon", 0xE9967A }, + { "DarkSeaGreen", 0x8FBC8F }, + { "DarkSlateBlue", 0x483D8B }, + { "DarkSlateGray", 0x2F4F4F }, + { "DarkSlateGrey", 0x2F4F4F }, + { "DarkTurquoise", 0x00CED1 }, + { "DarkViolet", 0x9400D3 }, + { "DeepPink", 0xFF1493 }, + { "DeepSkyBlue", 0x00BFFF }, + { "DimGray", 0x696969 }, + { "DimGrey", 0x696969 }, + { "DodgerBlue", 0x1E90FF }, + { "FireBrick", 0xB22222 }, + { "FloralWhite", 0xFFFAF0 }, + { "ForestGreen", 0x228B22 }, + { "Fuchsia", 0xFF00FF }, + { "Gainsboro", 0xDCDCDC }, + { "GhostWhite", 0xF8F8FF }, + { "Gold", 0xFFD700 }, + { "GoldenRod", 0xDAA520 }, + { "Gray", 0x808080 }, + { "Grey", 0x808080 }, + { "Green", 0x008000 }, + { "GreenYellow", 0xADFF2F }, + { "HoneyDew", 0xF0FFF0 }, + { "HotPink", 0xFF69B4 }, + { "IndianRed", 0xCD5C5C }, + { "Indigo", 0x4B0082 }, + { "Ivory", 0xFFFFF0 }, + { "Khaki", 0xF0E68C }, + { "Lavender", 0xE6E6FA }, + { "LavenderBlush", 0xFFF0F5 }, + { "LawnGreen", 0x7CFC00 }, + { "LemonChiffon", 0xFFFACD }, + { "LightBlue", 0xADD8E6 }, + { "LightCoral", 0xF08080 }, + { "LightCyan", 0xE0FFFF }, + { "LightGoldenRodYellow", 0xFAFAD2 }, + { "LightGray", 0xD3D3D3 }, + { "LightGrey", 0xD3D3D3 }, + { "LightGreen", 0x90EE90 }, + { "LightPink", 0xFFB6C1 }, + { "LightSalmon", 0xFFA07A }, + { "LightSeaGreen", 0x20B2AA }, + { "LightSkyBlue", 0x87CEFA }, + { "LightSlateGray", 0x778899 }, + { "LightSlateGrey", 0x778899 }, + { "LightSteelBlue", 0xB0C4DE }, + { "LightYellow", 0xFFFFE0 }, + { "Lime", 0x00FF00 }, + { "LimeGreen", 0x32CD32 }, + { "Linen", 0xFAF0E6 }, + { "Magenta", 0xFF00FF }, + { "Maroon", 0x800000 }, + { "MediumAquaMarine", 0x66CDAA }, + { "MediumBlue", 0x0000CD }, + { "MediumOrchid", 0xBA55D3 }, + { "MediumPurple", 0x9370D8 }, + { "MediumSeaGreen", 0x3CB371 }, + { "MediumSlateBlue", 0x7B68EE }, + { "MediumSpringGreen", 0x00FA9A }, + { "MediumTurquoise", 0x48D1CC }, + { "MediumVioletRed", 0xC71585 }, + { "MidnightBlue", 0x191970 }, + { "MintCream", 0xF5FFFA }, + { "MistyRose", 0xFFE4E1 }, + { "Moccasin", 0xFFE4B5 }, + { "NavajoWhite", 0xFFDEAD }, + { "Navy", 0x000080 }, + { "OldLace", 0xFDF5E6 }, + { "Olive", 0x808000 }, + { "OliveDrab", 0x6B8E23 }, + { "Orange", 0xFFA500 }, + { "OrangeRed", 0xFF4500 }, + { "Orchid", 0xDA70D6 }, + { "PaleGoldenRod", 0xEEE8AA }, + { "PaleGreen", 0x98FB98 }, + { "PaleTurquoise", 0xAFEEEE }, + { "PaleVioletRed", 0xD87093 }, + { "PapayaWhip", 0xFFEFD5 }, + { "PeachPuff", 0xFFDAB9 }, + { "Peru", 0xCD853F }, + { "Pink", 0xFFC0CB }, + { "Plum", 0xDDA0DD }, + { "PowderBlue", 0xB0E0E6 }, + { "Purple", 0x800080 }, + { "RebeccaPurple", 0x663399 }, + { "Red", 0xFF0000 }, + { "RosyBrown", 0xBC8F8F }, + { "RoyalBlue", 0x4169E1 }, + { "SaddleBrown", 0x8B4513 }, + { "Salmon", 0xFA8072 }, + { "SandyBrown", 0xF4A460 }, + { "SeaGreen", 0x2E8B57 }, + { "SeaShell", 0xFFF5EE }, + { "Sienna", 0xA0522D }, + { "Silver", 0xC0C0C0 }, + { "SkyBlue", 0x87CEEB }, + { "SlateBlue", 0x6A5ACD }, + { "SlateGray", 0x708090 }, + { "SlateGrey", 0x708090 }, + { "Snow", 0xFFFAFA }, + { "SpringGreen", 0x00FF7F }, + { "SteelBlue", 0x4682B4 }, + { "Tan", 0xD2B48C }, + { "Teal", 0x008080 }, + { "Thistle", 0xD8BFD8 }, + { "Tomato", 0xFF6347 }, + { "Turquoise", 0x40E0D0 }, + { "Violet", 0xEE82EE }, + { "Wheat", 0xF5DEB3 }, + { "White", 0xFFFFFF }, + { "WhiteSmoke", 0xF5F5F5 }, + { "Yellow", 0xFFFF00 }, + { "YellowGreen", 0x9ACD32 }, + + { NULL, 0 } +}; + +/** + * Returns an integer representation of an HTML color. + * + * @param psz_value An HTML color, which can be either: + * - A standard HTML color (red, cyan, ...) as defined in p_html_colors + * - An hexadecimal color, of the form [#][AA]RRGGBB + * @param ok If non-null, true will be stored in this pointer to signal + * a successful conversion + */ +VLC_API unsigned int vlc_html_color( const char *psz_value, bool* ok ); + +#ifdef __cplusplus +} +#endif + +#endif /* VLC_TEXT_STYLE_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_threads.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_threads.h new file mode 100644 index 0000000..bf1b35a --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_threads.h @@ -0,0 +1,1068 @@ +/***************************************************************************** + * vlc_threads.h : threads implementation for the VideoLAN client + * This header provides portable declarations for mutexes & conditions + ***************************************************************************** + * Copyright (C) 1999, 2002 VLC authors and VideoLAN + * Copyright © 2007-2016 Rémi Denis-Courmont + * + * Authors: Jean-Marc Dressler + * Samuel Hocevar + * Gildas Bazin + * Christophe Massiot + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_THREADS_H_ +#define VLC_THREADS_H_ + +/** + * \ingroup os + * \defgroup thread Threads and synchronization primitives + * @{ + * \file + * Thread primitive declarations + */ + +/** + * Issues an explicit deferred cancellation point. + * + * This has no effects if thread cancellation is disabled. + * This can be called when there is a rather slow non-sleeping operation. + * This is also used to force a cancellation point in a function that would + * otherwise not always be one (block_FifoGet() is an example). + */ +VLC_API void vlc_testcancel(void); + +#if defined (_WIN32) +# include +# ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +# endif + +typedef struct vlc_thread *vlc_thread_t; +# define VLC_THREAD_CANCELED NULL +# define LIBVLC_NEED_SLEEP +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + CRITICAL_SECTION mutex; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +#define LIBVLC_NEED_CONDVAR +#define LIBVLC_NEED_SEMAPHORE +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_AUDIO THREAD_PRIORITY_HIGHEST +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT THREAD_PRIORITY_ABOVE_NORMAL +# define VLC_THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL + +#elif defined (__OS2__) +# include + +typedef struct vlc_thread *vlc_thread_t; +#define VLC_THREAD_CANCELED NULL +typedef struct +{ + bool dynamic; + union + { + struct + { + bool locked; + unsigned long contention; + }; + HMTX hmtx; + }; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { false, { { false, 0 } } } +typedef struct +{ + HEV hev; + unsigned waiters; + HEV hevAck; + unsigned signaled; +} vlc_cond_t; +#define VLC_STATIC_COND { NULLHANDLE, 0, NULLHANDLE, 0 } +#define LIBVLC_NEED_SEMAPHORE +#define LIBVLC_NEED_RWLOCK +typedef struct vlc_threadvar *vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_AUDIO MAKESHORT(PRTYD_MAXIMUM, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT \ + MAKESHORT(PRTYD_MAXIMUM / 2, PRTYC_REGULAR) +# define VLC_THREAD_PRIORITY_HIGHEST MAKESHORT(0, PRTYC_TIMECRITICAL) + +# define pthread_sigmask sigprocmask + +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + static int (*vlc_poll_os2)(struct pollfd *, unsigned, int) = NULL; + + if (!vlc_poll_os2) + { + HMODULE hmod; + CHAR szFailed[CCHMAXPATH]; + + if (DosLoadModule(szFailed, sizeof(szFailed), "vlccore", &hmod)) + return -1; + + if (DosQueryProcAddr(hmod, 0, "_vlc_poll_os2", (PFN *)&vlc_poll_os2)) + return -1; + } + + return (*vlc_poll_os2)(fds, nfds, timeout); +} +# define poll(u,n,t) vlc_poll(u, n, t) + +#elif defined (__ANDROID__) /* pthreads subset without pthread_cancel() */ +# include +# include +# include +# define LIBVLC_USE_PTHREAD_CLEANUP 1 +# define LIBVLC_NEED_SLEEP +# define LIBVLC_NEED_CONDVAR +# define LIBVLC_NEED_SEMAPHORE +# define LIBVLC_NEED_RWLOCK + +typedef struct vlc_thread *vlc_thread_t; +#define VLC_THREAD_CANCELED NULL +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER + +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 0 +# define VLC_THREAD_PRIORITY_AUDIO 0 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 0 +# define VLC_THREAD_PRIORITY_HIGHEST 0 + +static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + int val; + + do + { + int ugly_timeout = ((unsigned)timeout >= 50) ? 50 : timeout; + if (timeout >= 0) + timeout -= ugly_timeout; + + vlc_testcancel (); + val = poll (fds, nfds, ugly_timeout); + } + while (val == 0 && timeout != 0); + + return val; +} + +# define poll(u,n,t) vlc_poll(u, n, t) + +#elif defined (__APPLE__) +# define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */ +# include +# include +/* Unnamed POSIX semaphores not supported on Mac OS X */ +# include +# include +# define LIBVLC_USE_PTHREAD 1 +# define LIBVLC_USE_PTHREAD_CLEANUP 1 + +typedef pthread_t vlc_thread_t; +#define VLC_THREAD_CANCELED PTHREAD_CANCELED +typedef pthread_mutex_t vlc_mutex_t; +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER +typedef pthread_cond_t vlc_cond_t; +#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER +typedef semaphore_t vlc_sem_t; +typedef pthread_rwlock_t vlc_rwlock_t; +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER +typedef pthread_key_t vlc_threadvar_t; +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 22 +# define VLC_THREAD_PRIORITY_AUDIO 22 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 22 +# define VLC_THREAD_PRIORITY_HIGHEST 22 + +#else /* POSIX threads */ +# include /* _POSIX_SPIN_LOCKS */ +# include +# include + +/** + * Whether LibVLC threads are based on POSIX threads. + */ +# define LIBVLC_USE_PTHREAD 1 + +/** + * Whether LibVLC thread cancellation is based on POSIX threads. + */ +# define LIBVLC_USE_PTHREAD_CLEANUP 1 + +/** + * Thread handle. + */ +typedef struct +{ + pthread_t handle; +} vlc_thread_t; + +/** + * Return value of a canceled thread. + */ +#define VLC_THREAD_CANCELED PTHREAD_CANCELED + +/** + * Mutex. + * + * Storage space for a mutual exclusion lock. + */ +typedef pthread_mutex_t vlc_mutex_t; + +/** + * Static initializer for (static) mutex. + */ +#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER + +/** + * Condition variable. + * + * Storage space for a thread condition variable. + */ +typedef pthread_cond_t vlc_cond_t; + +/** + * Static initializer for (static) condition variable. + * + * \note + * The condition variable will use the default clock, which is OS-dependent. + * Therefore, where timed waits are necessary the condition variable should + * always be initialized dynamically explicit instead of using this + * initializer. + */ +#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER + +/** + * Semaphore. + * + * Storage space for a thread-safe semaphore. + */ +typedef sem_t vlc_sem_t; + +/** + * Read/write lock. + * + * Storage space for a slim reader/writer lock. + */ +typedef pthread_rwlock_t vlc_rwlock_t; + +/** + * Static initializer for (static) read/write lock. + */ +#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER + +/** + * Thread-local key handle. + */ +typedef pthread_key_t vlc_threadvar_t; + +/** + * Threaded timer handle. + */ +typedef struct vlc_timer *vlc_timer_t; + +# define VLC_THREAD_PRIORITY_LOW 0 +# define VLC_THREAD_PRIORITY_INPUT 10 +# define VLC_THREAD_PRIORITY_AUDIO 5 +# define VLC_THREAD_PRIORITY_VIDEO 0 +# define VLC_THREAD_PRIORITY_OUTPUT 15 +# define VLC_THREAD_PRIORITY_HIGHEST 20 + +#endif + +#ifdef LIBVLC_NEED_CONDVAR +typedef struct +{ + unsigned value; +} vlc_cond_t; +# define VLC_STATIC_COND { 0 } +#endif + +#ifdef LIBVLC_NEED_SEMAPHORE +typedef struct vlc_sem +{ + vlc_mutex_t lock; + vlc_cond_t wait; + unsigned value; +} vlc_sem_t; +#endif + +#ifdef LIBVLC_NEED_RWLOCK +typedef struct vlc_rwlock +{ + vlc_mutex_t mutex; + vlc_cond_t wait; + long state; +} vlc_rwlock_t; +# define VLC_STATIC_RWLOCK { VLC_STATIC_MUTEX, VLC_STATIC_COND, 0 } +#endif + +/** + * Initializes a fast mutex. + * + * Recursive locking of a fast mutex is undefined behaviour. (In debug builds, + * recursive locking will cause an assertion failure.) + */ +VLC_API void vlc_mutex_init(vlc_mutex_t *); + +/** + * Initializes a recursive mutex. + * \warning This is strongly discouraged. Please use normal mutexes. + */ +VLC_API void vlc_mutex_init_recursive(vlc_mutex_t *); + +/** + * Deinitializes a mutex. + * + * The mutex must not be locked, otherwise behaviour is undefined. + */ +VLC_API void vlc_mutex_destroy(vlc_mutex_t *); + +/** + * Acquires a mutex. + * + * If needed, this waits for any other thread to release it. + * + * \warning Beware of deadlocks when locking multiple mutexes at the same time, + * or when using mutexes from callbacks. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_mutex_lock(vlc_mutex_t *); + +/** + * Tries to acquire a mutex. + * + * This function acquires the mutex if and only if it is not currently held by + * another thread. This function never sleeps and can be used in delay-critical + * code paths. + * + * \note This function is not a cancellation point. + * + * \warning If this function fails, then the mutex is held... by another + * thread. The calling thread must deal with the error appropriately. That + * typically implies postponing the operations that would have required the + * mutex. If the thread cannot defer those operations, then it must use + * vlc_mutex_lock(). If in doubt, use vlc_mutex_lock() instead. + * + * @return 0 if the mutex could be acquired, an error code otherwise. + */ +VLC_API int vlc_mutex_trylock( vlc_mutex_t * ) VLC_USED; + +/** + * Releases a mutex. + * + * If the mutex is not held by the calling thread, the behaviour is undefined. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_mutex_unlock(vlc_mutex_t *); + +/** + * Initializes a condition variable. + */ +VLC_API void vlc_cond_init(vlc_cond_t *); + +/** + * Initializes a condition variable (wall clock). + * + * This function initializes a condition variable for timed waiting using the + * UTC wall clock time. The time reference is the same as with time() and with + * timespec_get() and TIME_UTC. + * vlc_cond_timedwait_daytime() must be instead of + * vlc_cond_timedwait() for actual waiting. + */ +void vlc_cond_init_daytime(vlc_cond_t *); + +/** + * Deinitializes a condition variable. + * + * No threads shall be waiting or signaling the condition, otherwise the + * behavior is undefined. + */ +VLC_API void vlc_cond_destroy(vlc_cond_t *); + +/** + * Wakes up one thread waiting on a condition variable. + * + * If any thread is currently waiting on the condition variable, at least one + * of those threads will be woken up. Otherwise, this function has no effects. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_cond_signal(vlc_cond_t *); + +/** + * Wakes up all threads waiting on a condition variable. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_cond_broadcast(vlc_cond_t *); + +/** + * Waits on a condition variable. + * + * The calling thread will be suspended until another thread calls + * vlc_cond_signal() or vlc_cond_broadcast() on the same condition variable, + * the thread is cancelled with vlc_cancel(), or the system causes a + * spurious unsolicited wake-up. + * + * A mutex is needed to wait on a condition variable. It must not be + * a recursive mutex. Although it is possible to use the same mutex for + * multiple condition, it is not valid to use different mutexes for the same + * condition variable at the same time from different threads. + * + * The canonical way to use a condition variable to wait for event foobar is: + @code + vlc_mutex_lock(&lock); + mutex_cleanup_push(&lock); // release the mutex in case of cancellation + + while (!foobar) + vlc_cond_wait(&wait, &lock); + + // -- foobar is now true, do something about it here -- + + vlc_cleanup_pop(); + vlc_mutex_unlock(&lock); + @endcode + * + * \note This function is a cancellation point. In case of thread cancellation, + * the mutex is always locked before cancellation proceeds. + * + * \param cond condition variable to wait on + * \param mutex mutex which is unlocked while waiting, + * then locked again when waking up. + */ +VLC_API void vlc_cond_wait(vlc_cond_t *cond, vlc_mutex_t *mutex); + +/** + * Waits on a condition variable up to a certain date. + * + * This works like vlc_cond_wait() but with an additional time-out. + * The time-out is expressed as an absolute timestamp using the same arbitrary + * time reference as the mdate() and mwait() functions. + * + * \note This function is a cancellation point. In case of thread cancellation, + * the mutex is always locked before cancellation proceeds. + * + * \param cond condition variable to wait on + * \param mutex mutex which is unlocked while waiting, + * then locked again when waking up + * \param deadline absolute timeout + * + * \warning If the variable was initialized with vlc_cond_init_daytime(), or + * was statically initialized with \ref VLC_STATIC_COND, the time reference + * used by this function is unspecified (depending on the implementation, it + * might be the Unix epoch or the mdate() clock). + * + * \return 0 if the condition was signaled, an error code in case of timeout. + */ +VLC_API int vlc_cond_timedwait(vlc_cond_t *cond, vlc_mutex_t *mutex, + mtime_t deadline); + +int vlc_cond_timedwait_daytime(vlc_cond_t *, vlc_mutex_t *, time_t); + +/** + * Initializes a semaphore. + * + * @param count initial semaphore value (typically 0) + */ +VLC_API void vlc_sem_init(vlc_sem_t *, unsigned count); + +/** + * Deinitializes a semaphore. + */ +VLC_API void vlc_sem_destroy(vlc_sem_t *); + +/** + * Increments the value of a semaphore. + * + * \note This function is not a cancellation point. + * + * \return 0 on success, EOVERFLOW in case of integer overflow. + */ +VLC_API int vlc_sem_post(vlc_sem_t *); + +/** + * Waits on a semaphore. + * + * This function atomically waits for the semaphore to become non-zero then + * decrements it, and returns. If the semaphore is non-zero on entry, it is + * immediately decremented. + * + * \note This function may be a point of cancellation. + */ +VLC_API void vlc_sem_wait(vlc_sem_t *); + +/** + * Initializes a read/write lock. + */ +VLC_API void vlc_rwlock_init(vlc_rwlock_t *); + +/** + * Destroys an initialized unused read/write lock. + */ +VLC_API void vlc_rwlock_destroy(vlc_rwlock_t *); + +/** + * Acquires a read/write lock for reading. + * + * \note Recursion is allowed. + * \note This function may be a point of cancellation. + */ +VLC_API void vlc_rwlock_rdlock(vlc_rwlock_t *); + +/** + * Acquires a read/write lock for writing. Recursion is not allowed. + * \note This function may be a point of cancellation. + */ +VLC_API void vlc_rwlock_wrlock(vlc_rwlock_t *); + +/** + * Releases a read/write lock. + * + * The calling thread must hold the lock. Otherwise behaviour is undefined. + * + * \note This function is not a cancellation point. + */ +VLC_API void vlc_rwlock_unlock(vlc_rwlock_t *); + +/** + * Allocates a thread-specific variable. + * + * @param key where to store the thread-specific variable handle + * @param destr a destruction callback. It is called whenever a thread exits + * and the thread-specific variable has a non-NULL value. + * + * @return 0 on success, a system error code otherwise. + * This function can actually fail: on most systems, there is a fixed limit to + * the number of thread-specific variables in a given process. + */ +VLC_API int vlc_threadvar_create(vlc_threadvar_t *key, void (*destr) (void *)); + +/** + * Deallocates a thread-specific variable. + */ +VLC_API void vlc_threadvar_delete(vlc_threadvar_t *); + +/** + * Sets a thread-specific variable. + + * \param key thread-local variable key (created with vlc_threadvar_create()) + * \param value new value for the variable for the calling thread + * \return 0 on success, a system error code otherwise. + */ +VLC_API int vlc_threadvar_set(vlc_threadvar_t key, void *value); + +/** + * Gets the value of a thread-local variable for the calling thread. + * This function cannot fail. + * + * \return the value associated with the given variable for the calling + * or NULL if no value was set. + */ +VLC_API void *vlc_threadvar_get(vlc_threadvar_t); + +/** + * Waits on an address. + * + * Puts the calling thread to sleep if a specific value is stored at a + * specified address. The thread will sleep until it is woken up by a call to + * vlc_addr_signal() or vlc_addr_broadcast() in another thread, or spuriously. + * + * If the value does not match, do nothing and return immediately. + * + * \param addr address to check for + * \param val value to match at the address + */ +void vlc_addr_wait(void *addr, unsigned val); + +/** + * Waits on an address with a time-out. + * + * This function operates as vlc_addr_wait() but provides an additional + * time-out. If the time-out elapses, the thread resumes and the function + * returns. + * + * \param addr address to check for + * \param val value to match at the address + * \param delay time-out duration + * + * \return true if the function was woken up before the time-out, + * false if the time-out elapsed. + */ +bool vlc_addr_timedwait(void *addr, unsigned val, mtime_t delay); + +/** + * Wakes up one thread on an address. + * + * Wakes up (at least) one of the thread sleeping on the specified address. + * The address must be equal to the first parameter given by at least one + * thread sleeping within the vlc_addr_wait() or vlc_addr_timedwait() + * functions. If no threads are found, this function does nothing. + * + * \param addr address identifying which threads may be woken up + */ +void vlc_addr_signal(void *addr); + +/** + * Wakes up all thread on an address. + * + * Wakes up all threads sleeping on the specified address (if any). + * Any thread sleeping within a call to vlc_addr_wait() or vlc_addr_timedwait() + * with the specified address as first call parameter will be woken up. + * + * \param addr address identifying which threads to wake up + */ +void vlc_addr_broadcast(void *addr); + +/** + * Creates and starts a new thread. + * + * The thread must be joined with vlc_join() to reclaim resources + * when it is not needed anymore. + * + * @param th storage space for the handle of the new thread (cannot be NULL) + * [OUT] + * @param entry entry point for the thread + * @param data data parameter given to the entry point + * @param priority thread priority value + * @return 0 on success, a standard error code on error. + * @note In case of error, the value of *th is undefined. + */ +VLC_API int vlc_clone(vlc_thread_t *th, void *(*entry)(void *), void *data, + int priority) VLC_USED; + +/** + * Marks a thread as cancelled. + * + * Next time the target thread reaches a cancellation point (while not having + * disabled cancellation), it will run its cancellation cleanup handler, the + * thread variable destructors, and terminate. + * + * vlc_join() must be used regardless of a thread being cancelled or not, to + * avoid leaking resources. + */ +VLC_API void vlc_cancel(vlc_thread_t); + +/** + * Waits for a thread to complete (if needed), then destroys it. + * + * \note This is a cancellation point. In case of cancellation, the thread is + * not joined. + + * \warning A thread cannot join itself (normally VLC will abort if this is + * attempted). Also a detached thread cannot be joined. + * + * @param th thread handle + * @param result [OUT] pointer to write the thread return value or NULL + */ +VLC_API void vlc_join(vlc_thread_t th, void **result); + +/** + * Disables thread cancellation. + * + * This functions saves the current cancellation state (enabled or disabled), + * then disables cancellation for the calling thread. It must be called before + * entering a piece of code that is not cancellation-safe, unless it can be + * proven that the calling thread will not be cancelled. + * + * \note This function is not a cancellation point. + * + * \return Previous cancellation state (opaque value for vlc_restorecancel()). + */ +VLC_API int vlc_savecancel(void); + +/** + * Restores the cancellation state. + * + * This function restores the cancellation state of the calling thread to + * a state previously saved by vlc_savecancel(). + * + * \note This function is not a cancellation point. + * + * \param state previous state as returned by vlc_savecancel(). + */ +VLC_API void vlc_restorecancel(int state); + +/** + * Internal handler for thread cancellation. + * + * Do not call this function directly. Use wrapper macros instead: + * vlc_cleanup_push(), vlc_cleanup_pop(). + */ +VLC_API void vlc_control_cancel(int cmd, ...); + +/** + * Thread handle. + * + * This function returns the thread handle of the calling thread. + * + * \note The exact type of the thread handle depends on the platform, + * including an integer type, a pointer type or a compound type of any size. + * If you need an integer identifier, use vlc_thread_id() instead. + * + * \note vlc_join(vlc_thread_self(), NULL) is undefined, + * as it obviously does not make any sense (it might result in a deadlock, but + * there are no warranties that it will). + * + * \return the thread handle + */ +VLC_API vlc_thread_t vlc_thread_self(void) VLC_USED; + +/** + * Thread identifier. + * + * This function returns the identifier of the calling thread. The identifier + * cannot change for the entire duration of the thread, and no other thread can + * have the same identifier at the same time in the same process. Typically, + * the identifier is also unique across all running threads of all existing + * processes, but that depends on the operating system. + * + * There are no particular semantics to the thread ID with LibVLC. + * It is provided mainly for tracing and debugging. + * + * \warning This function is not currently implemented on all supported + * platforms. Where not implemented, it returns (unsigned long)-1. + * + * \return the thread identifier (or -1 if unimplemented) + */ +VLC_API unsigned long vlc_thread_id(void) VLC_USED; + +/** + * Precision monotonic clock. + * + * In principles, the clock has a precision of 1 MHz. But the actual resolution + * may be much lower, especially when it comes to sleeping with mwait() or + * msleep(). Most general-purpose operating systems provide a resolution of + * only 100 to 1000 Hz. + * + * \warning The origin date (time value "zero") is not specified. It is + * typically the time the kernel started, but this is platform-dependent. + * If you need wall clock time, use gettimeofday() instead. + * + * \return a timestamp in microseconds. + */ +VLC_API mtime_t mdate(void); + +/** + * Waits until a deadline. + * + * \param deadline timestamp to wait for (\ref mdate()) + * + * \note The deadline may be exceeded due to OS scheduling. + * \note This function is a cancellation point. + */ +VLC_API void mwait(mtime_t deadline); + +/** + * Waits for an interval of time. + * + * \param delay how long to wait (in microseconds) + * + * \note The delay may be exceeded due to OS scheduling. + * \note This function is a cancellation point. + */ +VLC_API void msleep(mtime_t delay); + +#define VLC_HARD_MIN_SLEEP 10000 /* 10 milliseconds = 1 tick at 100Hz */ +#define VLC_SOFT_MIN_SLEEP 9000000 /* 9 seconds */ + +#if defined (__GNUC__) && !defined (__clang__) +/* Linux has 100, 250, 300 or 1000Hz + * + * HZ=100 by default on FreeBSD, but some architectures use a 1000Hz timer + */ + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("sorry, cannot sleep for such short a time"))) +mtime_t impossible_delay( mtime_t delay ) +{ + (void) delay; + return VLC_HARD_MIN_SLEEP; +} + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((warning("use proper event handling instead of short delay"))) +mtime_t harmful_delay( mtime_t delay ) +{ + return delay; +} + +# define check_delay( d ) \ + ((__builtin_constant_p(d < VLC_HARD_MIN_SLEEP) \ + && (d < VLC_HARD_MIN_SLEEP)) \ + ? impossible_delay(d) \ + : ((__builtin_constant_p(d < VLC_SOFT_MIN_SLEEP) \ + && (d < VLC_SOFT_MIN_SLEEP)) \ + ? harmful_delay(d) \ + : d)) + +static +__attribute__((unused)) +__attribute__((noinline)) +__attribute__((error("deadlines can not be constant"))) +mtime_t impossible_deadline( mtime_t deadline ) +{ + return deadline; +} + +# define check_deadline( d ) \ + (__builtin_constant_p(d) ? impossible_deadline(d) : d) +#else +# define check_delay(d) (d) +# define check_deadline(d) (d) +#endif + +/** + * Initializes an asynchronous timer. + * + * \param id pointer to timer to be initialized + * \param func function that the timer will call + * \param data parameter for the timer function + * \return 0 on success, a system error code otherwise. + * + * \warning Asynchronous timers are processed from an unspecified thread. + * \note Multiple occurrences of a single interval timer are serialized: + * they cannot run concurrently. + */ +VLC_API int vlc_timer_create(vlc_timer_t *id, void (*func)(void *), void *data) +VLC_USED; + +/** + * Destroys an initialized timer. + * + * If needed, the timer is first disarmed. Behaviour is undefined if the + * specified timer is not initialized. + * + * \warning This function must be called before the timer data can be + * freed and before the timer callback function can be unmapped/unloaded. + * + * \param timer timer to destroy + */ +VLC_API void vlc_timer_destroy(vlc_timer_t timer); + +/** + * Arms or disarms an initialized timer. + * + * This functions overrides any previous call to itself. + * + * \note A timer can fire later than requested due to system scheduling + * limitations. An interval timer can fail to trigger sometimes, either because + * the system is busy or suspended, or because a previous iteration of the + * timer is still running. See also vlc_timer_getoverrun(). + * + * \param timer initialized timer + * \param absolute the timer value origin is the same as mdate() if true, + * the timer value is relative to now if false. + * \param value zero to disarm the timer, otherwise the initial time to wait + * before firing the timer. + * \param interval zero to fire the timer just once, otherwise the timer + * repetition interval. + */ +VLC_API void vlc_timer_schedule(vlc_timer_t timer, bool absolute, + mtime_t value, mtime_t interval); + +/** + * Fetches and resets the overrun counter for a timer. + * + * This functions returns the number of times that the interval timer should + * have fired, but the callback was not invoked due to scheduling problems. + * The call resets the counter to zero. + * + * \param timer initialized timer + * \return the timer overrun counter (typically zero) + */ +VLC_API unsigned vlc_timer_getoverrun(vlc_timer_t) VLC_USED; + +/** + * Count CPUs. + * + * \return number of available (logical) CPUs. + */ +VLC_API unsigned vlc_GetCPUCount(void); + +enum +{ + VLC_CLEANUP_PUSH, + VLC_CLEANUP_POP, + VLC_CANCEL_ADDR_SET, + VLC_CANCEL_ADDR_CLEAR, +}; + +#if defined (LIBVLC_USE_PTHREAD_CLEANUP) +/** + * Registers a thread cancellation handler. + * + * This pushes a function to run if the thread is cancelled (or otherwise + * exits prematurely). + * + * If multiple procedures are registered, + * they are handled in last-in first-out order. + * + * \note Any call to vlc_cleanup_push() must paired with a call to + * vlc_cleanup_pop(). + * \warning Branching into or out of the block between these two function calls + * is not allowed (read: it will likely crash the whole process). + * + * \param routine procedure to call if the thread ends + * \param arg argument for the procedure + */ +# define vlc_cleanup_push( routine, arg ) pthread_cleanup_push (routine, arg) + +/** + * Unregisters the last cancellation handler. + * + * This pops the cancellation handler that was last pushed with + * vlc_cleanup_push() in the calling thread. + */ +# define vlc_cleanup_pop( ) pthread_cleanup_pop (0) + +#else +typedef struct vlc_cleanup_t vlc_cleanup_t; + +struct vlc_cleanup_t +{ + vlc_cleanup_t *next; + void (*proc) (void *); + void *data; +}; + +/* This macros opens a code block on purpose. This is needed for multiple + * calls within a single function. This also prevent Win32 developers from + * writing code that would break on POSIX (POSIX opens a block as well). */ +# define vlc_cleanup_push( routine, arg ) \ + do { \ + vlc_cleanup_t vlc_cleanup_data = { NULL, routine, arg, }; \ + vlc_control_cancel (VLC_CLEANUP_PUSH, &vlc_cleanup_data) + +# define vlc_cleanup_pop( ) \ + vlc_control_cancel (VLC_CLEANUP_POP); \ + } while (0) + +#endif /* !LIBVLC_USE_PTHREAD_CLEANUP */ + +static inline void vlc_cleanup_lock (void *lock) +{ + vlc_mutex_unlock ((vlc_mutex_t *)lock); +} +#define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock, lock) + +static inline void vlc_cancel_addr_set(void *addr) +{ + vlc_control_cancel(VLC_CANCEL_ADDR_SET, addr); +} + +static inline void vlc_cancel_addr_clear(void *addr) +{ + vlc_control_cancel(VLC_CANCEL_ADDR_CLEAR, addr); +} + +#ifdef __cplusplus +/** + * Helper C++ class to lock a mutex. + * + * The mutex is locked when the object is created, and unlocked when the object + * is destroyed. + */ +class vlc_mutex_locker +{ + private: + vlc_mutex_t *lock; + public: + vlc_mutex_locker (vlc_mutex_t *m) : lock (m) + { + vlc_mutex_lock (lock); + } + + ~vlc_mutex_locker (void) + { + vlc_mutex_unlock (lock); + } +}; +#endif + +enum +{ + VLC_AVCODEC_MUTEX = 0, + VLC_GCRYPT_MUTEX, + VLC_XLIB_MUTEX, + VLC_MOSAIC_MUTEX, + VLC_HIGHLIGHT_MUTEX, +#ifdef _WIN32 + VLC_MTA_MUTEX, +#endif + /* Insert new entry HERE */ + VLC_MAX_MUTEX +}; + +/** + * Internal handler for global mutexes. + * + * Do not use this function directly. Use helper macros instead: + * vlc_global_lock(), vlc_global_unlock(). + */ +VLC_API void vlc_global_mutex(unsigned, bool); + +/** + * Acquires a global mutex. + */ +#define vlc_global_lock( n ) vlc_global_mutex(n, true) + +/** + * Releases a global mutex. + */ +#define vlc_global_unlock( n ) vlc_global_mutex(n, false) + +/** @} */ + +#endif /* !_VLC_THREADS_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_timestamp_helper.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_timestamp_helper.h new file mode 100644 index 0000000..7068d9f --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_timestamp_helper.h @@ -0,0 +1,101 @@ +/***************************************************************************** + * vlc_timestamp_helper.h : timestamp handling helpers + ***************************************************************************** + * Copyright (C) 2014 VLC authors and VideoLAN + * $Id: 90840fbcf7a5197f235ab6160a2cc2708a87c54d $ + * + * Authors: Felix Abecassis + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TIMESTAMP_H +#define VLC_TIMESTAMP_H 1 + +/* Implementation of a circular buffer of timestamps with overwriting + * of older values. MediaCodec has only one type of timestamp, if a + * block has no PTS, we send the DTS instead. Some hardware decoders + * cannot cope with this situation and output the frames in the wrong + * order. As a workaround in this case, we use a FIFO of timestamps in + * order to remember which input packets had no PTS. Since an + * hardware decoder can silently drop frames, this might cause a + * growing desynchronization with the actual timestamp. Thus the + * circular buffer has a limited size and will overwrite older values. + */ +typedef struct +{ + uint32_t begin; + uint32_t size; + uint32_t capacity; + int64_t *buffer; +} timestamp_fifo_t; + +static inline timestamp_fifo_t *timestamp_FifoNew(uint32_t capacity) +{ + timestamp_fifo_t *fifo = calloc(1, sizeof(*fifo)); + if (!fifo) + return NULL; + fifo->buffer = vlc_alloc(capacity, sizeof(*fifo->buffer)); + if (!fifo->buffer) { + free(fifo); + return NULL; + } + fifo->capacity = capacity; + return fifo; +} + +static inline void timestamp_FifoRelease(timestamp_fifo_t *fifo) +{ + free(fifo->buffer); + free(fifo); +} + +static inline bool timestamp_FifoIsEmpty(timestamp_fifo_t *fifo) +{ + return fifo->size == 0; +} + +static inline bool timestamp_FifoIsFull(timestamp_fifo_t *fifo) +{ + return fifo->size == fifo->capacity; +} + +static inline void timestamp_FifoEmpty(timestamp_fifo_t *fifo) +{ + fifo->size = 0; +} + +static inline void timestamp_FifoPut(timestamp_fifo_t *fifo, int64_t ts) +{ + uint32_t end = (fifo->begin + fifo->size) % fifo->capacity; + fifo->buffer[end] = ts; + if (!timestamp_FifoIsFull(fifo)) + fifo->size += 1; + else + fifo->begin = (fifo->begin + 1) % fifo->capacity; +} + +static inline int64_t timestamp_FifoGet(timestamp_fifo_t *fifo) +{ + if (timestamp_FifoIsEmpty(fifo)) + return VLC_TS_INVALID; + + int64_t result = fifo->buffer[fifo->begin]; + fifo->begin = (fifo->begin + 1) % fifo->capacity; + fifo->size -= 1; + return result; +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_tls.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_tls.h new file mode 100644 index 0000000..84e44a5 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_tls.h @@ -0,0 +1,352 @@ +/***************************************************************************** + * vlc_tls.h: + ***************************************************************************** + * Copyright (C) 2004-2016 Rémi Denis-Courmont + * Copyright (C) 2005-2006 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_TLS_H +# define VLC_TLS_H + +/** + * \ingroup net + * \defgroup transport Transport layer sockets + * Network stream abstraction + * + * Originally intended for the TLS protocol (Transport Layer Security), + * the Transport Layer Sockets now provides a generic abstraction + * for connection-oriented full-duplex I/O byte streams, such as TCP/IP sockets + * and TLS protocol sessions. + * + * @{ + * \file + * Transport layer functions + */ + +# include + +/** Transport layer socket */ +typedef struct vlc_tls +{ + int (*get_fd)(struct vlc_tls *); + ssize_t (*readv)(struct vlc_tls *, struct iovec *, unsigned); + ssize_t (*writev)(struct vlc_tls *, const struct iovec *, unsigned); + int (*shutdown)(struct vlc_tls *, bool duplex); + void (*close)(struct vlc_tls *); + + struct vlc_tls *p; +} vlc_tls_t; + +/** + * \defgroup tls Transport Layer Security + * @{ + */ + +/** + * TLS credentials + * + * This structure contains the credentials for establishing TLS sessions. + * This includes root Certificate Authorities (on client side), + * trust and cryptographic parameters, + * public certificates and private keys. + */ +typedef struct vlc_tls_creds +{ + VLC_COMMON_MEMBERS + + module_t *module; + void *sys; + + vlc_tls_t *(*open)(struct vlc_tls_creds *, vlc_tls_t *sock, + const char *host, const char *const *alpn); + int (*handshake)(struct vlc_tls_creds *, vlc_tls_t *session, + const char *hostname, const char *service, + char ** /*restrict*/ alp); +} vlc_tls_creds_t; + +/** + * Allocates TLS credentials for a client. + * Credentials can be cached and reused across multiple TLS sessions. + * + * @return TLS credentials object, or NULL on error. + **/ +VLC_API vlc_tls_creds_t *vlc_tls_ClientCreate(vlc_object_t *); + +/** + * Allocates server TLS credentials. + * + * @param cert path to an x509 certificate (required) + * @param key path to the PKCS private key for the certificate, + * or NULL to use cert path + * + * @return TLS credentials object, or NULL on error. + */ +VLC_API vlc_tls_creds_t *vlc_tls_ServerCreate(vlc_object_t *, const char *cert, + const char *key); + +static inline int vlc_tls_SessionHandshake (vlc_tls_creds_t *crd, + vlc_tls_t *tls) +{ + return crd->handshake(crd, tls, NULL, NULL, NULL); +} + +/** + * Releases TLS credentials. + * + * Releases data allocated with vlc_tls_ClientCreate() or + * vlc_tls_ServerCreate(). + * + * @param srv object to be destroyed (or NULL) + */ +VLC_API void vlc_tls_Delete(vlc_tls_creds_t *); + +/** + * Initiates a client TLS session. + * + * Initiates a Transport Layer Security (TLS) session as the client side, using + * trusted root CAs previously loaded with vlc_tls_ClientCreate(). + * + * This is a blocking network operation and may be a thread cancellation point. + * + * @param creds X.509 credentials, i.e. set of root certificates of trusted + * certificate authorities + * @param sock socket through which to establish the secure channel + * @param hostname expected server name, used both as Server Name Indication + * and as expected Common Name of the peer certificate [IN] + * @param service unique identifier for the service to connect to + * (only used locally for certificates database) [IN] + * @param alpn NULL-terminated list of Application Layer Protocols + * to negotiate, or NULL to not negotiate protocols [IN] + * @param alp storage space for the negotiated Application Layer + * Protocol or NULL if negotiation was not performed [OUT] + * + * @note The credentials must remain valid until the session is finished. + * + * @return TLS session, or NULL on error. + **/ +VLC_API vlc_tls_t *vlc_tls_ClientSessionCreate(vlc_tls_creds_t *creds, + vlc_tls_t *sock, + const char *host, + const char *service, + const char *const *alpn, + char **alp); + +/** + * Creates a TLS server session. + * + * Allocates a Transport Layer Security (TLS) session as the server side, using + * cryptographic keys pair and X.509 certificates chain already loaded with + * vlc_tls_ServerCreate(). + * + * Unlike vlc_tls_ClientSessionCreate(), this function does not perform any + * actual network I/O. vlc_tls_SessionHandshake() must be used to perform the + * TLS handshake before sending and receiving data through the TLS session. + * + * This function is non-blocking and is not a cancellation point. + * + * @param creds server credentials, i.e. keys pair and X.509 certificates chain + * @param alpn NULL-terminated list of Application Layer Protocols + * to negotiate, or NULL to not negotiate protocols + * + * @return TLS session, or NULL on error. + */ +VLC_API vlc_tls_t *vlc_tls_ServerSessionCreate(vlc_tls_creds_t *creds, + vlc_tls_t *sock, + const char *const *alpn); + +/** @} */ + +/** + * Destroys a TLS session down. + * + * All resources associated with the TLS session are released. + * + * If the session was established successfully, then shutdown cleanly, the + * underlying socket can be reused. Otherwise, it must be closed. Either way, + * this function does not close the underlying socket: Use vlc_tls_Close() + * instead to close it at the same. + * + * This function is non-blocking and is not a cancellation point. + */ +VLC_API void vlc_tls_SessionDelete (vlc_tls_t *); + +static inline int vlc_tls_GetFD(vlc_tls_t *tls) +{ + return tls->get_fd(tls); +} + +/** + * Receives data through a socket. + * + * This dequeues incoming data from a transport layer socket. + * + * @param buf received buffer start address [OUT] + * @param len buffer length (in bytes) + * @param waitall whether to wait for the exact buffer length (true), + * or for any amount of data (false) + * + * @note At end of stream, the number of bytes returned may be shorter than + * requested regardless of the "waitall" flag. + * + * @return the number of bytes actually dequeued, or -1 on error. + */ +VLC_API ssize_t vlc_tls_Read(vlc_tls_t *, void *buf, size_t len, bool waitall); + +/** + * Receives a text line through a socket. + * + * This dequeues one line of text from a transport layer socket. + * @return a heap-allocated nul-terminated string, or NULL on error + */ +VLC_API char *vlc_tls_GetLine(vlc_tls_t *); + +/** + * Sends data through a socket. + */ +VLC_API ssize_t vlc_tls_Write(vlc_tls_t *, const void *buf, size_t len); + +/** + * Shuts a connection down. + * + * This sends the connection close notification. + * + * If the TLS protocol is used, this provides a secure indication to the other + * end that no further data will be sent. If using plain TCP/IP, this sets the + * FIN flag. + * + * Data can still be received until a close notification is received from the + * other end. + * + * @param duplex whether to stop receiving data as well + * @retval 0 the session was terminated securely and cleanly + * (the underlying socket can be reused for other purposes) + * @return -1 the session was terminated locally, but either a notification + * could not be sent or received (the underlying socket cannot be + * reused and must be closed) + */ +static inline int vlc_tls_Shutdown(vlc_tls_t *tls, bool duplex) +{ + return tls->shutdown(tls, duplex); +} + +/** + * Closes a connection and its underlying resources. + * + * This function closes the transport layer socket, and terminates any + * underlying connection. For instance, if the TLS protocol is used over a TCP + * stream, this function terminates both the TLS session, and then underlying + * TCP/IP connection. + * + * To close a connection but retain any underlying resources, use + * vlc_tls_SessionDelete() instead. + */ +static inline void vlc_tls_Close(vlc_tls_t *session) +{ + do + { + vlc_tls_t *p = session->p; + + vlc_tls_SessionDelete(session); + session = p; + } + while (session != NULL); +} + +/** + * Creates a transport-layer stream from a socket. + * + * Creates a transport-layer I/O stream from a socket file descriptor. + * Data will be sent and received directly through the socket. This can be used + * either to share common code between non-TLS and TLS cases, or for testing + * purposes. + * + * This function is not a cancellation point. + * + * @deprecated This function is transitional. Do not use it directly. + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpen(int fd); + +/** + * Creates a connected pair of transport-layer sockets. + */ +VLC_API int vlc_tls_SocketPair(int family, int protocol, vlc_tls_t *[2]); + +struct addrinfo; + +/** + * Creates a transport-layer stream from a struct addrinfo. + * + * This function tries to allocate a socket using the specified addrinfo + * structure. Normally, the vlc_tls_SocketOpenTCP() function takes care of + * this. But in some cases, it cannot be used, notably: + * - if the remote destination is not resolved (directly) from getaddrinfo(), + * - if the socket type is not SOCK_STREAM, + * - if the transport protocol is not TCP (IPPROTO_TCP), or + * - if TCP Fast Open should be attempted. + * + * @param ai a filled addrinfo structure (the ai_next member is ignored) + * @param defer_connect whether to attempt a TCP Fast Open connection or not + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpenAddrInfo(const struct addrinfo *ai, + bool defer_connect); + +/** + * Creates a transport-layer TCP stream from a name and port. + * + * This function resolves a hostname, and attempts to establish a TCP/IP + * connection to the specified host and port number. + * + * @note The function currently iterates through the addrinfo linked list. + * Future versions may implement different behaviour (e.g. RFC6555). + * + * @return a transport layer socket on success or NULL on error + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpenTCP(vlc_object_t *obj, + const char *hostname, unsigned port); + +/** + * Initiates a TLS session over TCP. + * + * This function resolves a hostname, attempts to establish a TCP/IP + * connection to the specified host and port number, and finally attempts to + * establish a TLS session over the TCP/IP stream. + * + * See also vlc_tls_SocketOpenTCP() and vlc_tls_SessionCreate(). + */ +VLC_API vlc_tls_t *vlc_tls_SocketOpenTLS(vlc_tls_creds_t *crd, + const char *hostname, unsigned port, + const char *service, + const char *const *alpn, char **alp); + +VLC_DEPRECATED +static inline vlc_tls_t * +vlc_tls_ClientSessionCreateFD(vlc_tls_creds_t *crd, int fd, const char *host, + const char *srv, const char *const *lp, char **p) +{ + vlc_tls_t *sock = vlc_tls_SocketOpen(fd); + if (unlikely(sock == NULL)) + return NULL; + + vlc_tls_t *tls = vlc_tls_ClientSessionCreate(crd, sock, host, srv, lp, p); + if (unlikely(tls == NULL)) + free(sock); + return tls; +} + +/** @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_url.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_url.h new file mode 100644 index 0000000..ceae349 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_url.h @@ -0,0 +1,210 @@ +/***************************************************************************** + * vlc_url.h: URL related macros + ***************************************************************************** + * Copyright (C) 2002-2006 VLC authors and VideoLAN + * $Id: e13b7a5abb57e777e5252c5287bed9f52c7e2de0 $ + * + * Authors: Christophe Massiot + * Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_URL_H +# define VLC_URL_H + +/** + * \file + * This file defines functions for manipulating URL in vlc + * + * \ingroup strings + * @{ + */ + +/** + * Converts local path to URL. + * + * Builds a URL representation from a local UTF-8 null-terminated file path. + * + * @param path file path + * @param scheme URI scheme to use (default is auto: "file", "fd" or "smb") + * @return a heap-allocated URI string on success + * or NULL in case of error (errno will be set accordingly) + */ +VLC_API char *vlc_path2uri(const char *path, const char *scheme) VLC_MALLOC; + +/** + * Converts a URI to a local path. + * + * Builds a local path (UTF-8-encoded null-terminated string) from a URI if + * the URI scheme allows. + * + * @param url URI + * @return a heap-allocated string or success + * or NULL on error + */ +VLC_API char *vlc_uri2path(const char *url) VLC_MALLOC; + +/** + * Decodes an URI component in place. + * + * Decodes one null-terminated UTF-8 URI component to aa null-terminated UTF-8 + * string in place. + * + * See also vlc_uri_decode_duplicate() for the not-in-place variant. + * + * \warning This function does NOT decode entire URIs. + * URI can only be decoded (and encoded) one component at a time + * (e.g. the host name, one directory, the file name). + * Complete URIs are always "encoded" (or they are syntaxically invalid). + * See IETF RFC3986, especially §2.4 for details. + * + * \note URI encoding is different from Javascript escaping. Especially, + * white spaces and Unicode non-ASCII code points are encoded differently. + * + * \param str null-terminated component + * \return str is returned on success. NULL if str was not properly encoded. + */ +VLC_API char *vlc_uri_decode(char *str); + +/** + * Decodes an URI component. + * + * See also vlc_uri_decode() for the in-place variant. + * + * \return a heap-allocated string on success or NULL on error. + */ +VLC_API char *vlc_uri_decode_duplicate(const char *str) VLC_MALLOC; + +/** + * Encodes a URI component. + * + * Substitutes URI-unsafe, URI delimiters and non-ASCII characters into their + * URI-encoded URI-safe representation. See also IETF RFC3986 §2. + * + * @param str nul-terminated UTF-8 representation of the component. + * @note Obviously, a URI containing nul bytes cannot be passed. + * @return heap-allocated string, or NULL if out of memory. + */ +VLC_API char *vlc_uri_encode(const char *str) VLC_MALLOC; + +/** + * Composes an URI. + * + * Converts a decomposed/parsed URI structure (\ref vlc_url_t) into a + * nul-terminated URI literal string. + * + * See also IETF RFC3986 section 5.3 for details. + * + * \bug URI fragments (i.e. HTML anchors) are not handled + * + * \return a heap-allocated nul-terminated string or NULL if out of memory + */ +VLC_API char *vlc_uri_compose(const vlc_url_t *) VLC_MALLOC; + +/** + * Resolves an URI reference. + * + * Resolves an URI reference relative to a base URI. + * If the reference is an absolute URI, then this function simply returns a + * copy of the URI reference. + * + * \param base base URI (as a nul-terminated string) + * \param ref URI reference (also as a nul-terminated string) + * + * \return a heap-allocated nul-terminated string representing the resolved + * absolute URI, or NULL if out of memory. + */ +VLC_API char *vlc_uri_resolve(const char *base, const char *ref) VLC_MALLOC; + +/** + * Fixes up a URI string. + * + * Attempts to convert a nul-terminated string into a syntactically valid URI. + * If the string is, or may be, a syntactically valid URI, an exact copy is + * returned. In any case, the result will only contain URI-safe and URI + * delimiter characters (generic delimiters or sub-delimiters) and all percent + * signs will be followed by two hexadecimal characters. + * + * @return a heap-allocated string, or NULL if on out of memory. + */ +VLC_API char *vlc_uri_fixup(const char *) VLC_MALLOC; + +struct vlc_url_t +{ + char *psz_protocol; + char *psz_username; + char *psz_password; + char *psz_host; + unsigned i_port; + char *psz_path; + char *psz_option; + + char *psz_buffer; /* to be freed */ + char *psz_pathbuffer; /* to be freed */ +}; + +/** + * Parses an URI or IRI. + * + * Extracts the following parts from an URI string: + * - scheme (i.e. protocol), + * - user (deprecated), + * - password (also deprecated), + * - host name or IP address literal, + * - port number, + * - path (including the filename preceded by any and all directories) + * - request parameters (excluding the leading question mark '?'). + * + * The function accepts URIs, as well as UTF-8-encoded IRIs. For IRIs, the hier + * part (specifically, the host name) is assumed to be an IDN and is decoded to + * ASCII according, so it can be used for DNS resolution. If the host is an + * IPv6 address literal, brackets are stripped. + * + * Any missing part is set to nul. For historical reasons, the target structure + * is always initialized, even if parsing the URI string fails. + * + * On error, errno is set to one of the following value: + * - ENOMEM in case of memory allocation failure, + * - EINVAL in case of syntax error in the input string. + * + * \bug The URI fragment is discarded if present. + * + * \note This function allocates memory. vlc_UrlClean() must be used free + * associated the allocations, even if the function fails. + * + * \param url structure of URL parts [OUT] + * \param str nul-terminated URL string to split + * \retval 0 success + * \retval -1 failure + */ +VLC_API int vlc_UrlParse(vlc_url_t *url, const char *str); + +/** + * Parses an URI or IRI and fix up the path part. + * + * \see vlc_UrlParse + * \see vlc_uri_fixup + */ +VLC_API int vlc_UrlParseFixup(vlc_url_t *url, const char *str); + +/** + * Releases resources allocated by vlc_UrlParse(). + */ +VLC_API void vlc_UrlClean(vlc_url_t *); + +/** @} */ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_variables.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_variables.h new file mode 100644 index 0000000..a397580 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_variables.h @@ -0,0 +1,671 @@ +/***************************************************************************** + * vlc_variables.h: variables handling + ***************************************************************************** + * Copyright (C) 2002-2004 VLC authors and VideoLAN + * $Id: 83752b171f82c86164142a6254f513fc9cb7a324 $ + * + * Authors: Samuel Hocevar + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VARIABLES_H +#define VLC_VARIABLES_H 1 + +/** + * \defgroup variables Variables + * \ingroup vlc_object + * + * VLC object variables and callbacks + * + * @{ + * \file + * VLC object variables and callbacks interface + */ + +#define VLC_VAR_TYPE 0x00ff +#define VLC_VAR_CLASS 0x00f0 +#define VLC_VAR_FLAGS 0xff00 + +/** + * \defgroup var_type Variable types + * These are the different types a vlc variable can have. + * @{ + */ +#define VLC_VAR_VOID 0x0010 +#define VLC_VAR_BOOL 0x0020 +#define VLC_VAR_INTEGER 0x0030 +#define VLC_VAR_STRING 0x0040 +#define VLC_VAR_FLOAT 0x0050 +#define VLC_VAR_ADDRESS 0x0070 +#define VLC_VAR_COORDS 0x00A0 +/**@}*/ + +/** \defgroup var_flags Additive flags + * These flags are added to the type field of the variable. Most as a result of + * a var_Change() call, but some may be added at creation time + * @{ + */ +#define VLC_VAR_HASCHOICE 0x0100 + +#define VLC_VAR_ISCOMMAND 0x2000 + +/** Creation flag */ +/* If the variable is not found on the current module + search all parents and finally module config until found */ +#define VLC_VAR_DOINHERIT 0x8000 +/**@}*/ + +/** + * \defgroup var_action Variable actions + * These are the different actions that can be used with var_Change(). + * The parameters given are the meaning of the two last parameters of + * var_Change() when this action is being used. + * @{ + */ + +#define VLC_VAR_SETSTEP 0x0012 + +/** + * Set the value of this variable without triggering any callbacks + * \param p_val The new value + * \param p_val2 Unused + */ +#define VLC_VAR_SETVALUE 0x0013 + +#define VLC_VAR_SETTEXT 0x0014 +#define VLC_VAR_GETTEXT 0x0015 + +#define VLC_VAR_GETMIN 0x0016 +#define VLC_VAR_GETMAX 0x0017 +#define VLC_VAR_GETSTEP 0x0018 + +#define VLC_VAR_ADDCHOICE 0x0020 +#define VLC_VAR_DELCHOICE 0x0021 +#define VLC_VAR_CLEARCHOICES 0x0022 +#define VLC_VAR_GETCHOICES 0x0024 + +#define VLC_VAR_CHOICESCOUNT 0x0026 +#define VLC_VAR_SETMINMAX 0x0027 + +/**@}*/ + +/** \defgroup var_GetAndSet Variable actions + * These are the different actions that can be used with var_GetAndSet() + * @{ + */ +enum { + VLC_VAR_BOOL_TOGGLE, /**< Invert a boolean value (param ignored) */ + VLC_VAR_INTEGER_ADD, /**< Add parameter to an integer value */ + VLC_VAR_INTEGER_OR, /**< Binary OR over an integer bits field */ + VLC_VAR_INTEGER_NAND,/**< Binary NAND over an integer bits field */ +}; +/**@}*/ + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +VLC_API int var_Create( vlc_object_t *, const char *, int ); +#define var_Create(a,b,c) var_Create( VLC_OBJECT(a), b, c ) + +VLC_API void var_Destroy( vlc_object_t *, const char * ); +#define var_Destroy(a,b) var_Destroy( VLC_OBJECT(a), b ) + +VLC_API int var_Change( vlc_object_t *, const char *, int, vlc_value_t *, vlc_value_t * ); +#define var_Change(a,b,c,d,e) var_Change( VLC_OBJECT(a), b, c, d, e ) + +VLC_API int var_Type( vlc_object_t *, const char * ) VLC_USED; +#define var_Type(a,b) var_Type( VLC_OBJECT(a), b ) + +VLC_API int var_Set( vlc_object_t *, const char *, vlc_value_t ); +#define var_Set(a,b,c) var_Set( VLC_OBJECT(a), b, c ) + +VLC_API int var_Get( vlc_object_t *, const char *, vlc_value_t * ); +#define var_Get(a,b,c) var_Get( VLC_OBJECT(a), b, c ) + +VLC_API int var_SetChecked( vlc_object_t *, const char *, int, vlc_value_t ); +#define var_SetChecked(o,n,t,v) var_SetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetChecked( vlc_object_t *, const char *, int, vlc_value_t * ); +#define var_GetChecked(o,n,t,v) var_GetChecked(VLC_OBJECT(o),n,t,v) +VLC_API int var_GetAndSet( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API int var_Inherit( vlc_object_t *, const char *, int, vlc_value_t * ); + +VLC_API void var_FreeList( vlc_value_t *, vlc_value_t * ); + + +/***************************************************************************** + * Variable callbacks + ***************************************************************************** + * int MyCallback( vlc_object_t *p_this, + * char const *psz_variable, + * vlc_value_t oldvalue, + * vlc_value_t newvalue, + * void *p_data); + *****************************************************************************/ +VLC_API void var_AddCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API void var_DelCallback( vlc_object_t *, const char *, vlc_callback_t, void * ); +VLC_API void var_TriggerCallback( vlc_object_t *, const char * ); + +VLC_API void var_AddListCallback( vlc_object_t *, const char *, vlc_list_callback_t, void * ); +VLC_API void var_DelListCallback( vlc_object_t *, const char *, vlc_list_callback_t, void * ); + +#define var_AddCallback(a,b,c,d) var_AddCallback( VLC_OBJECT(a), b, c, d ) +#define var_DelCallback(a,b,c,d) var_DelCallback( VLC_OBJECT(a), b, c, d ) +#define var_TriggerCallback(a,b) var_TriggerCallback( VLC_OBJECT(a), b ) + +#define var_AddListCallback(a,b,c,d) var_AddListCallback( VLC_OBJECT(a), b, c, d ) +#define var_DelListCallback(a,b,c,d) var_DelListCallback( VLC_OBJECT(a), b, c, d ) + +/***************************************************************************** + * helpers functions + *****************************************************************************/ + +/** + * Set the value of an integer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param i The new integer value of this variable + */ +static inline int var_SetInteger( vlc_object_t *p_obj, const char *psz_name, + int64_t i ) +{ + vlc_value_t val; + val.i_int = i; + return var_SetChecked( p_obj, psz_name, VLC_VAR_INTEGER, val ); +} + +/** + * Set the value of an boolean variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param b The new boolean value of this variable + */ +static inline int var_SetBool( vlc_object_t *p_obj, const char *psz_name, bool b ) +{ + vlc_value_t val; + val.b_bool = b; + return var_SetChecked( p_obj, psz_name, VLC_VAR_BOOL, val ); +} + +static inline int var_SetCoords( vlc_object_t *obj, const char *name, + int32_t x, int32_t y ) +{ + vlc_value_t val; + val.coords.x = x; + val.coords.y = y; + return var_SetChecked (obj, name, VLC_VAR_COORDS, val); +} +#define var_SetCoords(o,n,x,y) var_SetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Set the value of a float variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param f The new float value of this variable + */ +static inline int var_SetFloat( vlc_object_t *p_obj, const char *psz_name, float f ) +{ + vlc_value_t val; + val.f_float = f; + return var_SetChecked( p_obj, psz_name, VLC_VAR_FLOAT, val ); +} + +/** + * Set the value of a string variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param psz_string The new string value of this variable + */ +static inline int var_SetString( vlc_object_t *p_obj, const char *psz_name, const char *psz_string ) +{ + vlc_value_t val; + val.psz_string = (char *)psz_string; + return var_SetChecked( p_obj, psz_name, VLC_VAR_STRING, val ); +} + +/** + * Set the value of a pointer variable + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + * \param ptr The new pointer value of this variable + */ +static inline +int var_SetAddress( vlc_object_t *p_obj, const char *psz_name, void *ptr ) +{ + vlc_value_t val; + val.p_address = ptr; + return var_SetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, val ); +} + +#define var_SetInteger(a,b,c) var_SetInteger( VLC_OBJECT(a),b,c) +#define var_SetBool(a,b,c) var_SetBool( VLC_OBJECT(a),b,c) +#define var_SetFloat(a,b,c) var_SetFloat( VLC_OBJECT(a),b,c) +#define var_SetString(a,b,c) var_SetString( VLC_OBJECT(a),b,c) +#define var_SetAddress(o, n, p) var_SetAddress(VLC_OBJECT(o), n, p) + + +/** + * Get an integer value +* + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_GetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_INTEGER, &val ) ) + return val.i_int; + else + return 0; +} + +/** + * Get a boolean value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_GetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.b_bool = false; + + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_BOOL, &val ) ) + return val.b_bool; + else + return false; +} + +static inline void var_GetCoords( vlc_object_t *obj, const char *name, + int32_t *px, int32_t *py ) +{ + vlc_value_t val; + + if (likely(!var_GetChecked (obj, name, VLC_VAR_COORDS, &val))) + { + *px = val.coords.x; + *py = val.coords.y; + } + else + *px = *py = 0; +} +#define var_GetCoords(o,n,x,y) var_GetCoords(VLC_OBJECT(o),n,x,y) + +/** + * Get a float value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_GetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.f_float = 0.0; + if( !var_GetChecked( p_obj, psz_name, VLC_VAR_FLOAT, &val ) ) + return val.f_float; + else + return 0.0; +} + +/** + * Get a string value + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_GetString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; val.psz_string = NULL; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + else + return val.psz_string; +} + +VLC_USED VLC_MALLOC +static inline char *var_GetNonEmptyString( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_STRING, &val ) ) + return NULL; + if( val.psz_string && *val.psz_string ) + return val.psz_string; + free( val.psz_string ); + return NULL; +} + +VLC_USED +static inline void *var_GetAddress( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetChecked( p_obj, psz_name, VLC_VAR_ADDRESS, &val ) ) + return NULL; + else + return val.p_address; +} + +/** + * Increment an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_IncInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = 1; + if( var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ) ) + return 0; + return val.i_int; +} +#define var_IncInteger(a,b) var_IncInteger( VLC_OBJECT(a), b ) + +/** + * Decrement an integer variable + * \param p_obj the object that holds the variable + * \param psz_name the name of the variable + */ +static inline int64_t var_DecInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + val.i_int = -1; + if( var_GetAndSet( p_obj, psz_name, VLC_VAR_INTEGER_ADD, &val ) ) + return 0; + return val.i_int; +} +#define var_DecInteger(a,b) var_DecInteger( VLC_OBJECT(a), b ) + +static inline uint64_t var_OrInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + if( var_GetAndSet( obj, name, VLC_VAR_INTEGER_OR, &val ) ) + return 0; + return val.i_int; +} +#define var_OrInteger(a,b,c) var_OrInteger(VLC_OBJECT(a),b,c) + +static inline uint64_t var_NAndInteger( vlc_object_t *obj, const char *name, + unsigned v ) +{ + vlc_value_t val; + val.i_int = v; + if( var_GetAndSet( obj, name, VLC_VAR_INTEGER_NAND, &val ) ) + return 0; + return val.i_int; +} +#define var_NAndInteger(a,b,c) var_NAndInteger(VLC_OBJECT(a),b,c) + +/** + * Create a integer variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetInteger( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBool( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a float variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloat( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyString( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +/** + * Create an address variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline void *var_CreateGetAddress( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_ADDRESS | VLC_VAR_DOINHERIT ); + return var_GetAddress( p_obj, psz_name ); +} + +#define var_CreateGetInteger(a,b) var_CreateGetInteger( VLC_OBJECT(a),b) +#define var_CreateGetBool(a,b) var_CreateGetBool( VLC_OBJECT(a),b) +#define var_CreateGetFloat(a,b) var_CreateGetFloat( VLC_OBJECT(a),b) +#define var_CreateGetString(a,b) var_CreateGetString( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyString(a,b) var_CreateGetNonEmptyString( VLC_OBJECT(a),b) +#define var_CreateGetAddress(a,b) var_CreateGetAddress( VLC_OBJECT(a),b) + +/** + * Create a integer command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline int64_t var_CreateGetIntegerCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetInteger( p_obj, psz_name ); +} + +/** + * Create a boolean command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline bool var_CreateGetBoolCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetBool( p_obj, psz_name ); +} + +/** + * Create a float command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED +static inline float var_CreateGetFloatCommand( vlc_object_t *p_obj, const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetFloat( p_obj, psz_name ); +} + +/** + * Create a string command variable with inherit and get its value. + * + * \param p_obj The object that holds the variable + * \param psz_name The name of the variable + */ +VLC_USED VLC_MALLOC +static inline char *var_CreateGetStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetString( p_obj, psz_name ); +} + +VLC_USED VLC_MALLOC +static inline char *var_CreateGetNonEmptyStringCommand( vlc_object_t *p_obj, + const char *psz_name ) +{ + var_Create( p_obj, psz_name, VLC_VAR_STRING | VLC_VAR_DOINHERIT + | VLC_VAR_ISCOMMAND ); + return var_GetNonEmptyString( p_obj, psz_name ); +} + +#define var_CreateGetIntegerCommand(a,b) var_CreateGetIntegerCommand( VLC_OBJECT(a),b) +#define var_CreateGetBoolCommand(a,b) var_CreateGetBoolCommand( VLC_OBJECT(a),b) +#define var_CreateGetFloatCommand(a,b) var_CreateGetFloatCommand( VLC_OBJECT(a),b) +#define var_CreateGetStringCommand(a,b) var_CreateGetStringCommand( VLC_OBJECT(a),b) +#define var_CreateGetNonEmptyStringCommand(a,b) var_CreateGetNonEmptyStringCommand( VLC_OBJECT(a),b) + +VLC_USED +static inline int var_CountChoices( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t count; + if( var_Change( p_obj, psz_name, VLC_VAR_CHOICESCOUNT, &count, NULL ) ) + return 0; + return count.i_int; +} +#define var_CountChoices(a,b) var_CountChoices( VLC_OBJECT(a),b) + + +static inline bool var_ToggleBool( vlc_object_t *p_obj, const char *psz_name ) +{ + vlc_value_t val; + if( var_GetAndSet( p_obj, psz_name, VLC_VAR_BOOL_TOGGLE, &val ) ) + return false; + return val.b_bool; +} +#define var_ToggleBool(a,b) var_ToggleBool( VLC_OBJECT(a),b ) + + +VLC_USED +static inline bool var_InheritBool( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_BOOL, &val ) ) + val.b_bool = false; + return val.b_bool; +} +#define var_InheritBool(o, n) var_InheritBool(VLC_OBJECT(o), n) + +VLC_USED +static inline int64_t var_InheritInteger( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_INTEGER, &val ) ) + val.i_int = 0; + return val.i_int; +} +#define var_InheritInteger(o, n) var_InheritInteger(VLC_OBJECT(o), n) + +VLC_USED +static inline float var_InheritFloat( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_FLOAT, &val ) ) + val.f_float = 0.; + return val.f_float; +} +#define var_InheritFloat(o, n) var_InheritFloat(VLC_OBJECT(o), n) + +VLC_USED VLC_MALLOC +static inline char *var_InheritString( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_STRING, &val ) ) + val.psz_string = NULL; + else if( val.psz_string && !*val.psz_string ) + { + free( val.psz_string ); + val.psz_string = NULL; + } + return val.psz_string; +} +#define var_InheritString(o, n) var_InheritString(VLC_OBJECT(o), n) + +VLC_USED +static inline void *var_InheritAddress( vlc_object_t *obj, const char *name ) +{ + vlc_value_t val; + + if( var_Inherit( obj, name, VLC_VAR_ADDRESS, &val ) ) + val.p_address = NULL; + return val.p_address; +} +#define var_InheritAddress(o, n) var_InheritAddress(VLC_OBJECT(o), n) + +VLC_API int var_InheritURational( vlc_object_t *, unsigned *num, unsigned *den, const char *var ); +#define var_InheritURational(a,b,c,d) var_InheritURational(VLC_OBJECT(a), b, c, d) + +#define var_GetInteger(a,b) var_GetInteger( VLC_OBJECT(a),b) +#define var_GetBool(a,b) var_GetBool( VLC_OBJECT(a),b) +#define var_GetFloat(a,b) var_GetFloat( VLC_OBJECT(a),b) +#define var_GetString(a,b) var_GetString( VLC_OBJECT(a),b) +#define var_GetNonEmptyString(a,b) var_GetNonEmptyString( VLC_OBJECT(a),b) +#define var_GetAddress(a,b) var_GetAddress( VLC_OBJECT(a),b) + +VLC_API int var_LocationParse(vlc_object_t *, const char *mrl, const char *prefix); +#define var_LocationParse(o, m, p) var_LocationParse(VLC_OBJECT(o), m, p) + +/** + * @} + */ +#endif /* _VLC_VARIABLES_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_video_splitter.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_video_splitter.h new file mode 100644 index 0000000..c7ac885 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_video_splitter.h @@ -0,0 +1,158 @@ +/***************************************************************************** + * vlc_video_splitter.h: "video splitter" related structures and functions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: a5afba5230b0fb5b42c5cff3daab70a1e527f9eb $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VIDEO_SPLITTER_H +#define VLC_VIDEO_SPLITTER_H 1 + +#include +#include +#include + +/** + * \file + * This file defines the structure and types used by video splitter filters. + */ + +typedef struct video_splitter_t video_splitter_t; +typedef struct video_splitter_sys_t video_splitter_sys_t; +typedef struct video_splitter_owner_t video_splitter_owner_t; + +/** Structure describing a video splitter output properties + */ +typedef struct +{ + /* Video format of the output */ + video_format_t fmt; + + /* Window hints */ + struct + { + /* Relative position. + * (0,0) is equal to the default position. + */ + int i_x; + int i_y; + + /* Alignment inside the window + */ + int i_align; + } window; + + /* Video output module + * Use NULL for default + */ + char *psz_module; + +} video_splitter_output_t; + +/** Structure describing a video splitter + */ +struct video_splitter_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + + /* configuration */ + config_chain_t *p_cfg; + + /* Input format + * It is filled by the creator and cannot be modified. + */ + video_format_t fmt; + + /* Output formats + * + * It can only be set in the open() function and must remain + * constant. + * The module is responsible for the allocation and deallocation. + */ + int i_output; + video_splitter_output_t *p_output; + + int (*pf_filter)( video_splitter_t *, picture_t *pp_dst[], + picture_t *p_src ); + int (*pf_mouse) ( video_splitter_t *, vlc_mouse_t *, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ); + + video_splitter_sys_t *p_sys; + + /* Buffer allocation */ + int (*pf_picture_new) ( video_splitter_t *, picture_t *pp_picture[] ); + void (*pf_picture_del) ( video_splitter_t *, picture_t *pp_picture[] ); + video_splitter_owner_t *p_owner; +}; + +/** + * It will create an array of pictures suitable as output. + * + * You must either returned them through pf_filter or by calling + * video_splitter_DeletePicture. + * + * If VLC_SUCCESS is not returned, pp_picture values are undefined. + */ +static inline int video_splitter_NewPicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + int i_ret = p_splitter->pf_picture_new( p_splitter, pp_picture ); + if( i_ret ) + msg_Warn( p_splitter, "can't get output pictures" ); + return i_ret; +} + +/** + * It will release an array of pictures created by video_splitter_NewPicture. + * Provided for convenience. + */ +static inline void video_splitter_DeletePicture( video_splitter_t *p_splitter, + picture_t *pp_picture[] ) +{ + p_splitter->pf_picture_del( p_splitter, pp_picture ); +} + +/* */ +video_splitter_t * video_splitter_New( vlc_object_t *, const char *psz_name, const video_format_t * ); +void video_splitter_Delete( video_splitter_t * ); + +static inline int video_splitter_Filter( video_splitter_t *p_splitter, + picture_t *pp_dst[], picture_t *p_src ) +{ + return p_splitter->pf_filter( p_splitter, pp_dst, p_src ); +} +static inline int video_splitter_Mouse( video_splitter_t *p_splitter, + vlc_mouse_t *p_mouse, + int i_index, + const vlc_mouse_t *p_old, const vlc_mouse_t *p_new ) +{ + if( !p_splitter->pf_mouse ) + { + *p_mouse = *p_new; + return VLC_SUCCESS; + } + return p_splitter->pf_mouse( p_splitter, p_mouse, i_index, p_old, p_new ); +} + +#endif /* VLC_VIDEO_SPLITTER_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_viewpoint.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_viewpoint.h new file mode 100644 index 0000000..cf01913 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_viewpoint.h @@ -0,0 +1,68 @@ +/***************************************************************************** + * vlc_viewpoint.h: viewpoint struct and helpers + ***************************************************************************** + * Copyright (C) 2017 VLC authors and VideoLAN + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VIEWPOINT_H_ +#define VLC_VIEWPOINT_H_ 1 + +#include + +#include + +/** + * \defgroup output Output + * \ingroup output + * + * @{ + * \file + * Video and audio viewpoint struct and helpers + */ + +#define FIELD_OF_VIEW_DEGREES_DEFAULT 80.f +#define FIELD_OF_VIEW_DEGREES_MAX 150.f +#define FIELD_OF_VIEW_DEGREES_MIN 20.f + +/** + * Viewpoints + */ +struct vlc_viewpoint_t { + float yaw; /* yaw in degrees */ + float pitch; /* pitch in degrees */ + float roll; /* roll in degrees */ + float fov; /* field of view in degrees */ +}; + +static inline void vlc_viewpoint_init( vlc_viewpoint_t *p_vp ) +{ + p_vp->yaw = p_vp->pitch = p_vp->roll = 0.0f; + p_vp->fov = FIELD_OF_VIEW_DEGREES_DEFAULT; +} + +static inline void vlc_viewpoint_clip( vlc_viewpoint_t *p_vp ) +{ + p_vp->yaw = fmodf( p_vp->yaw, 360.f ); + p_vp->pitch = fmodf( p_vp->pitch, 360.f ); + p_vp->roll = fmodf( p_vp->roll, 360.f ); + p_vp->fov = VLC_CLIP( p_vp->fov, FIELD_OF_VIEW_DEGREES_MIN, + FIELD_OF_VIEW_DEGREES_MAX ); +} + +/**@}*/ + +#endif /* VLC_VIEWPOINT_H_ */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_vlm.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vlm.h new file mode 100644 index 0000000..7e3c61d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vlm.h @@ -0,0 +1,368 @@ +/***************************************************************************** + * vlc_vlm.h: VLM core structures + ***************************************************************************** + * Copyright (C) 2000, 2001 VLC authors and VideoLAN + * $Id: 88d4437cc1028468c0cadeaea32fa645769e2ee6 $ + * + * Authors: Simon Latapie + * Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VLM_H +#define VLC_VLM_H 1 + +#include + +/** + * \defgroup server VLM + * VLC stream manager + * + * VLM is the server core in vlc that allows streaming of multiple media streams + * at the same time. It provides broadcast, schedule and video on demand features + * for streaming using several streaming and network protocols. + * @{ + * \file + * VLC stream manager interface + */ + +/** VLM media */ +typedef struct +{ + int64_t id; /*< numeric id for vlm_media_t item */ + bool b_enabled; /*< vlm_media_t is enabled */ + + char *psz_name; /*< descriptive name of vlm_media_t item */ + + int i_input; /*< number of input options */ + char **ppsz_input; /*< array of input options */ + + int i_option; /*< number of output options */ + char **ppsz_option; /*< array of output options */ + + char *psz_output; /*< */ + + bool b_vod; /*< vlm_media_t is of type VOD */ + struct + { + bool b_loop; /*< this vlc_media_t broadcast item should loop */ + } broadcast; /*< Broadcast specific information */ + struct + { + char *psz_mux; /*< name of muxer to use */ + } vod; /*< VOD specific information */ + +} vlm_media_t; + +/** VLM media instance */ +typedef struct +{ + char *psz_name; /*< vlm media instance descriptive name */ + + int64_t i_time; /*< vlm media instance vlm media current time */ + int64_t i_length; /*< vlm media instance vlm media item length */ + double d_position; /*< vlm media instance position in stream */ + bool b_paused; /*< vlm media instance is paused */ + int i_rate; // normal is INPUT_RATE_DEFAULT +} vlm_media_instance_t; + +#if 0 +typedef struct +{ + +} vlm_schedule_t +#endif + +/** VLM events + * You can catch vlm event by adding a callback on the variable "intf-event" + * of the VLM object. + * This variable is an address that will hold a vlm_event_t* value. + */ +enum vlm_event_type_e +{ + /* */ + VLM_EVENT_MEDIA_ADDED = 0x100, + VLM_EVENT_MEDIA_REMOVED, + VLM_EVENT_MEDIA_CHANGED, + + /* */ + VLM_EVENT_MEDIA_INSTANCE_STARTED = 0x200, + VLM_EVENT_MEDIA_INSTANCE_STOPPED, + VLM_EVENT_MEDIA_INSTANCE_STATE, +}; + +typedef struct +{ + int i_type; /* a vlm_event_type_e value */ + int64_t id; /* Media ID */ + const char *psz_name; /* Media name */ + const char *psz_instance_name; /* Instance name or NULL */ + input_state_e input_state; /* Input instance event type */ +} vlm_event_t; + +/** VLM control query */ +enum vlm_query_e +{ + /* --- Media control */ + /* Get all medias */ + VLM_GET_MEDIAS, /* arg1=vlm_media_t ***, int *pi_media */ + /* Delete all medias */ + VLM_CLEAR_MEDIAS, /* no arg */ + + /* Add a new media */ + VLM_ADD_MEDIA, /* arg1=vlm_media_t* arg2=int64_t *p_id res=can fail */ + /* Delete an existing media */ + VLM_DEL_MEDIA, /* arg1=int64_t id */ + /* Change properties of an existing media (all fields but id and b_vod) */ + VLM_CHANGE_MEDIA, /* arg1=vlm_media_t* res=can fail */ + /* Get 1 media by it's ID */ + VLM_GET_MEDIA, /* arg1=int64_t id arg2=vlm_media_t ** */ + /* Get media ID from its name */ + VLM_GET_MEDIA_ID, /* arg1=const char *psz_name arg2=int64_t* */ + + /* Media instance control XXX VOD control are for internal use only */ + /* Get all media instances */ + VLM_GET_MEDIA_INSTANCES, /* arg1=int64_t id arg2=vlm_media_instance_t *** arg3=int *pi_instance */ + /* Delete all media instances */ + VLM_CLEAR_MEDIA_INSTANCES, /* arg1=int64_t id */ + /* Control broadcast instance */ + VLM_START_MEDIA_BROADCAST_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index res=can fail */ + /* Control VOD instance */ + VLM_START_MEDIA_VOD_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name, int i_input_index char *psz_vod_output res=can fail */ + /* Stop an instance */ + VLM_STOP_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Pause an instance */ + VLM_PAUSE_MEDIA_INSTANCE, /* arg1=int64_t id, arg2=const char *psz_instance_name res=can fail */ + /* Get instance position time (in microsecond) */ + VLM_GET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t * */ + /* Set instance position time (in microsecond) */ + VLM_SET_MEDIA_INSTANCE_TIME, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=int64_t */ + /* Get instance position ([0.0 .. 1.0]) */ + VLM_GET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double * */ + /* Set instance position ([0.0 .. 1.0]) */ + VLM_SET_MEDIA_INSTANCE_POSITION, /* arg1=int64_t id, arg2=const char *psz_instance_name arg3=double */ + + /* Schedule control */ + VLM_CLEAR_SCHEDULES, /* no arg */ + /* TODO: missing schedule control */ + + /* */ +}; + + +/* VLM specific - structures and functions */ + +/* ok, here is the structure of a vlm_message: + The parent node is ( name_of_the_command , NULL ), or + ( name_of_the_command , message_error ) on error. + If a node has children, it should not have a value (=NULL).*/ +struct vlm_message_t +{ + char *psz_name; /*< message name */ + char *psz_value; /*< message value */ + + int i_child; /*< number of child messages */ + vlm_message_t **child; /*< array of vlm_message_t */ +}; + + +#ifdef __cplusplus +extern "C" { +#endif + +VLC_API vlm_t * vlm_New( vlc_object_t * ); +#define vlm_New( a ) vlm_New( VLC_OBJECT(a) ) +VLC_API void vlm_Delete( vlm_t * ); +VLC_API int vlm_ExecuteCommand( vlm_t *, const char *, vlm_message_t ** ); +VLC_API int vlm_Control( vlm_t *p_vlm, int i_query, ... ); + +VLC_API vlm_message_t * vlm_MessageSimpleNew( const char * ); +VLC_API vlm_message_t * vlm_MessageNew( const char *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API vlm_message_t * vlm_MessageAdd( vlm_message_t *, vlm_message_t * ); +VLC_API void vlm_MessageDelete( vlm_message_t * ); + +/* media helpers */ + +/** + * Initialize a vlm_media_t instance + * \param p_media vlm_media_t instance to initialize + */ +static inline void vlm_media_Init( vlm_media_t *p_media ) +{ + memset( p_media, 0, sizeof(vlm_media_t) ); + p_media->id = 0; // invalid id + p_media->psz_name = NULL; + TAB_INIT( p_media->i_input, p_media->ppsz_input ); + TAB_INIT( p_media->i_option, p_media->ppsz_option ); + p_media->psz_output = NULL; + p_media->b_vod = false; + + p_media->vod.psz_mux = NULL; + p_media->broadcast.b_loop = false; +} + +/** + * Copy a vlm_media_t instance into another vlm_media_t instance + * \param p_dst vlm_media_t instance to copy to + * \param p_src vlm_media_t instance to copy from + */ +static inline void +#ifndef __cplusplus +vlm_media_Copy( vlm_media_t *restrict p_dst, const vlm_media_t *restrict p_src ) +#else +vlm_media_Copy( vlm_media_t *p_dst, const vlm_media_t *p_src ) +#endif +{ + int i; + + memset( p_dst, 0, sizeof(vlm_media_t) ); + p_dst->id = p_src->id; + p_dst->b_enabled = p_src->b_enabled; + if( p_src->psz_name ) + p_dst->psz_name = strdup( p_src->psz_name ); + + for( i = 0; i < p_src->i_input; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_input, p_dst->ppsz_input, strdup(p_src->ppsz_input[i]) ); + for( i = 0; i < p_src->i_option; i++ ) + TAB_APPEND_CAST( (char**), p_dst->i_option, p_dst->ppsz_option, strdup(p_src->ppsz_option[i]) ); + + if( p_src->psz_output ) + p_dst->psz_output = strdup( p_src->psz_output ); + + p_dst->b_vod = p_src->b_vod; + if( p_src->b_vod ) + { + if( p_src->vod.psz_mux ) + p_dst->vod.psz_mux = strdup( p_src->vod.psz_mux ); + } + else + { + p_dst->broadcast.b_loop = p_src->broadcast.b_loop; + } +} + +/** + * Cleanup and release memory associated with this vlm_media_t instance. + * You still need to release p_media itself with vlm_media_Delete(). + * \param p_media vlm_media_t to cleanup + */ +static inline void vlm_media_Clean( vlm_media_t *p_media ) +{ + int i; + free( p_media->psz_name ); + + for( i = 0; i < p_media->i_input; i++ ) + free( p_media->ppsz_input[i]); + TAB_CLEAN(p_media->i_input, p_media->ppsz_input ); + + for( i = 0; i < p_media->i_option; i++ ) + free( p_media->ppsz_option[i]); + TAB_CLEAN(p_media->i_option, p_media->ppsz_option ); + + free( p_media->psz_output ); + if( p_media->b_vod ) + free( p_media->vod.psz_mux ); +} + +/** + * Allocate a new vlm_media_t instance + * \return vlm_media_t instance + */ +static inline vlm_media_t *vlm_media_New(void) +{ + vlm_media_t *p_media = (vlm_media_t *)malloc( sizeof(vlm_media_t) ); + if( p_media ) + vlm_media_Init( p_media ); + return p_media; +} + +/** + * Delete a vlm_media_t instance + * \param p_media vlm_media_t instance to delete + */ +static inline void vlm_media_Delete( vlm_media_t *p_media ) +{ + vlm_media_Clean( p_media ); + free( p_media ); +} + +/** + * Copy a vlm_media_t instance + * \param p_src vlm_media_t instance to copy + * \return vlm_media_t duplicate of p_src + */ +static inline vlm_media_t *vlm_media_Duplicate( vlm_media_t *p_src ) +{ + vlm_media_t *p_dst = vlm_media_New(); + if( p_dst ) + vlm_media_Copy( p_dst, p_src ); + return p_dst; +} + +/* media instance helpers */ +/** + * Initialize vlm_media_instance_t + * \param p_instance vlm_media_instance_t to initialize + */ +static inline void vlm_media_instance_Init( vlm_media_instance_t *p_instance ) +{ + memset( p_instance, 0, sizeof(vlm_media_instance_t) ); + p_instance->psz_name = NULL; + p_instance->i_time = 0; + p_instance->i_length = 0; + p_instance->d_position = 0.0; + p_instance->b_paused = false; + p_instance->i_rate = INPUT_RATE_DEFAULT; +} + +/** + * Cleanup vlm_media_instance_t + * \param p_instance vlm_media_instance_t to cleanup + */ +static inline void vlm_media_instance_Clean( vlm_media_instance_t *p_instance ) +{ + free( p_instance->psz_name ); +} + +/** + * Allocate a new vlm_media_instance_t + * \return a new vlm_media_instance_t + */ +static inline vlm_media_instance_t *vlm_media_instance_New(void) +{ + vlm_media_instance_t *p_instance = (vlm_media_instance_t *) malloc( sizeof(vlm_media_instance_t) ); + if( p_instance ) + vlm_media_instance_Init( p_instance ); + return p_instance; +} + +/** + * Delete a vlm_media_instance_t + * \param p_instance vlm_media_instance_t to delete + */ +static inline void vlm_media_instance_Delete( vlm_media_instance_t *p_instance ) +{ + vlm_media_instance_Clean( p_instance ); + free( p_instance ); +} + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout.h new file mode 100644 index 0000000..d7306d8 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout.h @@ -0,0 +1,167 @@ +/***************************************************************************** + * vlc_vout.h: common video definitions + ***************************************************************************** + * Copyright (C) 1999 - 2008 VLC authors and VideoLAN + * $Id: 627f6cec2e3b96eea04f9566ef799ed5b3a93b2a $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Olivier Aubert + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_H_ +#define VLC_VOUT_H_ 1 + +#include +#include +#include + +/** + * \defgroup output Output + * \defgroup video_output Video output + * \ingroup output + * Video rendering, output and window management + * + * This module describes the programming interface for video output threads. + * It includes functions allowing to open a new thread, send pictures to a + * thread, and destroy a previously opened video output thread. + * @{ + * \file + * Video output thread interface + */ + +/** + * Vout configuration + */ +typedef struct { + vout_thread_t *vout; + vlc_object_t *input; + bool change_fmt; + const video_format_t *fmt; + unsigned dpb_size; +} vout_configuration_t; + +/** + * Video output thread private structure + */ +typedef struct vout_thread_sys_t vout_thread_sys_t; + +/** + * Video output thread descriptor + * + * Any independent video output device, such as an X11 window or a GGI device, + * is represented by a video output thread, and described using the following + * structure. + */ +struct vout_thread_t { + VLC_COMMON_MEMBERS + + /* Private vout_thread data */ + vout_thread_sys_t *p; +}; + +/* Alignment flags */ +#define VOUT_ALIGN_LEFT 0x0001 +#define VOUT_ALIGN_RIGHT 0x0002 +#define VOUT_ALIGN_HMASK 0x0003 +#define VOUT_ALIGN_TOP 0x0004 +#define VOUT_ALIGN_BOTTOM 0x0008 +#define VOUT_ALIGN_VMASK 0x000C + +/***************************************************************************** + * Prototypes + *****************************************************************************/ + +/** + * Returns a suitable vout or release the given one. + * + * If cfg->fmt is non NULL and valid, a vout will be returned, reusing cfg->vout + * is possible, otherwise it returns NULL. + * If cfg->vout is not used, it will be closed and released. + * + * You can release the returned value either by vout_Request or vout_Close() + * followed by a vlc_object_release() or shorter vout_CloseAndRelease() + * + * \param object a vlc object + * \param cfg the video configuration requested. + * \return a vout + */ +VLC_API vout_thread_t * vout_Request( vlc_object_t *object, const vout_configuration_t *cfg ); +#define vout_Request(a,b) vout_Request(VLC_OBJECT(a),b) + +/** + * This function will close a vout created by vout_Request. + * The associated vout module is closed. + * Note: It is not released yet, you'll have to call vlc_object_release() + * or use the convenient vout_CloseAndRelease(). + * + * \param p_vout the vout to close + */ +VLC_API void vout_Close( vout_thread_t *p_vout ); + +/** + * This function will close a vout created by vout_Create + * and then release it. + * + * \param p_vout the vout to close and release + */ +static inline void vout_CloseAndRelease( vout_thread_t *p_vout ) +{ + vout_Close( p_vout ); + vlc_object_release( p_vout ); +} + +/** + * This function will handle a snapshot request. + * + * pp_image, pp_picture and p_fmt can be NULL otherwise they will be + * set with returned value in case of success. + * + * pp_image will hold an encoded picture in psz_format format. + * + * p_fmt can be NULL otherwise it will be set with the format used for the + * picture before encoding. + * + * i_timeout specifies the time the function will wait for a snapshot to be + * available. + * + */ +VLC_API int vout_GetSnapshot( vout_thread_t *p_vout, + block_t **pp_image, picture_t **pp_picture, + video_format_t *p_fmt, + const char *psz_format, mtime_t i_timeout ); + +VLC_API void vout_ChangeAspectRatio( vout_thread_t *p_vout, + unsigned int i_num, unsigned int i_den ); + +/* */ +VLC_API picture_t * vout_GetPicture( vout_thread_t * ); +VLC_API void vout_PutPicture( vout_thread_t *, picture_t * ); + +/* Subpictures channels ID */ +#define VOUT_SPU_CHANNEL_INVALID (-1) /* Always fails in comparison */ +#define VOUT_SPU_CHANNEL_OSD 1 /* OSD channel is automatically cleared */ +#define VOUT_SPU_CHANNEL_AVAIL_FIRST 8 /* Registerable channels from this offset */ + +/* */ +VLC_API void vout_PutSubpicture( vout_thread_t *, subpicture_t * ); +VLC_API int vout_RegisterSubpictureChannel( vout_thread_t * ); +VLC_API void vout_FlushSubpictureChannel( vout_thread_t *, int ); + +/**@}*/ + +#endif /* _VLC_VIDEO_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_display.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_display.h new file mode 100644 index 0000000..36f1227 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_display.h @@ -0,0 +1,481 @@ +/***************************************************************************** + * vlc_vout_display.h: vout_display_t definitions + ***************************************************************************** + * Copyright (C) 2009 Laurent Aimar + * $Id: 80761c8762d6b2acd48091507637fdcefb3317bd $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_DISPLAY_H +#define VLC_VOUT_DISPLAY_H 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * \defgroup video_display Video output display + * Video output display: output buffers and rendering + * + * \ingroup video_output + * @{ + * \file + * Video output display modules interface + */ + +/* XXX + * Do NOT use video_format_t::i_aspect but i_sar_num/den everywhere. i_aspect + * will be removed as soon as possible. + * + */ +typedef struct vout_display_t vout_display_t; +typedef struct vout_display_sys_t vout_display_sys_t; +typedef struct vout_display_owner_t vout_display_owner_t; + +/** + * Possible alignments for vout_display. + */ +typedef enum +{ + VOUT_DISPLAY_ALIGN_CENTER, + /* */ + VOUT_DISPLAY_ALIGN_LEFT, + VOUT_DISPLAY_ALIGN_RIGHT, + /* */ + VOUT_DISPLAY_ALIGN_TOP, + VOUT_DISPLAY_ALIGN_BOTTOM, +} vout_display_align_t; + +/** + * Window management state. + */ +enum { + VOUT_WINDOW_STATE_NORMAL=0, + VOUT_WINDOW_STATE_ABOVE=1, + VOUT_WINDOW_STATE_BELOW=2, + VOUT_WINDOW_STACK_MASK=3, +}; + +/** + * Initial/Current configuration for a vout_display_t + */ +typedef struct { +#if defined(_WIN32) || defined(__OS2__) + bool is_fullscreen VLC_DEPRECATED; /* Is the display fullscreen */ +#endif + + /* Display properties */ + struct { + /* Window title (may be NULL) */ + const char *title; + + /* Display size */ + unsigned width; + unsigned height; + + /* Display SAR */ + vlc_rational_t sar; + } display; + + /* Alignment of the picture inside the display */ + struct { + int horizontal; + int vertical; + } align; + + /* Do we fill up the display with the video */ + bool is_display_filled; + + /* Zoom to use + * It will be applied to the whole display if b_display_filled is set, otherwise + * only on the video source */ + struct { + int num; + int den; + } zoom; + + vlc_viewpoint_t viewpoint; +} vout_display_cfg_t; + +/** + * Information from a vout_display_t to configure + * the core behaviour. + * + * By default they are all false or NULL. + * + */ +typedef struct { + bool is_slow; /* The picture memory has slow read/write */ + bool has_double_click; /* Is double-click generated */ + bool needs_hide_mouse; /* Needs VOUT_DISPLAY_HIDE_MOUSE, + * needs to call vout_display_SendEventMouseMoved() + * or vout_display_SendEventMouseState() */ + bool has_pictures_invalid; /* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */ + const vlc_fourcc_t *subpicture_chromas; /* List of supported chromas for subpicture rendering. */ +} vout_display_info_t; + +/** + * Control query for vout_display_t + */ +enum { + /* Hide the mouse. It will be sent when + * vout_display_t::info.needs_hide_mouse is true */ + VOUT_DISPLAY_HIDE_MOUSE VLC_DEPRECATED_ENUM, + + /* Ask to reset the internal buffers after a VOUT_DISPLAY_EVENT_PICTURES_INVALID + * request. + */ + VOUT_DISPLAY_RESET_PICTURES, + +#if defined(_WIN32) || defined(__OS2__) + /* Ask the module to acknowledge/refuse the fullscreen state change after + * being requested (externally or by VOUT_DISPLAY_EVENT_FULLSCREEN */ + VOUT_DISPLAY_CHANGE_FULLSCREEN VLC_DEPRECATED_ENUM, /* bool fs */ + /* Ask the module to acknowledge/refuse the window management state change + * after being requested externally or by VOUT_DISPLAY_WINDOW_STATE */ + VOUT_DISPLAY_CHANGE_WINDOW_STATE VLC_DEPRECATED_ENUM, /* unsigned state */ +#endif + /* Ask the module to acknowledge/refuse the display size change requested + * (externally or by VOUT_DISPLAY_EVENT_DISPLAY_SIZE) */ + VOUT_DISPLAY_CHANGE_DISPLAY_SIZE, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse fill display state change after + * being requested externally */ + VOUT_DISPLAY_CHANGE_DISPLAY_FILLED, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse zoom change after being requested + * externally */ + VOUT_DISPLAY_CHANGE_ZOOM, /* const vout_display_cfg_t *p_cfg */ + + /* Ask the module to acknowledge/refuse source aspect ratio after being + * requested externally */ + VOUT_DISPLAY_CHANGE_SOURCE_ASPECT, + + /* Ask the module to acknowledge/refuse source crop change after being + * requested externally. + * The cropping requested is stored by video_format_t::i_x/y_offset and + * video_format_t::i_visible_width/height */ + VOUT_DISPLAY_CHANGE_SOURCE_CROP, + + /* Ask the module to acknowledge/refuse VR/360° viewing direction after + * being requested externally */ + VOUT_DISPLAY_CHANGE_VIEWPOINT, /* const vout_display_cfg_t *p_cfg */ +}; + +/** + * Event from vout_display_t + * + * Events modifiying the state may be sent multiple times. + * Only the transition will be retained and acted upon. + */ +enum { + /* TODO: + * ZOOM ? DISPLAY_FILLED ? ON_TOP ? + */ + /* */ + VOUT_DISPLAY_EVENT_PICTURES_INVALID, /* The buffer are now invalid and need to be changed */ + +#if defined(_WIN32) || defined(__OS2__) + VOUT_DISPLAY_EVENT_FULLSCREEN, + VOUT_DISPLAY_EVENT_WINDOW_STATE, +#endif + + VOUT_DISPLAY_EVENT_DISPLAY_SIZE, /* The display size need to change : int i_width, int i_height */ + + /* */ + VOUT_DISPLAY_EVENT_CLOSE, + VOUT_DISPLAY_EVENT_KEY, + + /* Full mouse state. + * You can use it OR use the other mouse events. The core will do + * the conversion. + */ + VOUT_DISPLAY_EVENT_MOUSE_STATE, + + /* Mouse event */ + VOUT_DISPLAY_EVENT_MOUSE_MOVED, + VOUT_DISPLAY_EVENT_MOUSE_PRESSED, + VOUT_DISPLAY_EVENT_MOUSE_RELEASED, + VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK, + + /* VR navigation */ + VOUT_DISPLAY_EVENT_VIEWPOINT_MOVED, +}; + +/** + * Vout owner structures + */ +struct vout_display_owner_t { + /* Private place holder for the vout_display_t creator + */ + void *sys; + + /* Event coming from the module + * + * This function is set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_SendEvent* + * wrapper. + * + * You can send it at any time i.e. from any vout_display_t functions or + * from another thread. + * Be careful, it does not ensure correct serialization if it is used + * from multiple threads. + */ + void (*event)(vout_display_t *, int, va_list); + + /* Window management + * + * These functions are set prior to the module instantiation and must not + * be overwritten nor used directly (use the vout_display_*Window + * wrapper */ + vout_window_t *(*window_new)(vout_display_t *, unsigned type); + void (*window_del)(vout_display_t *, vout_window_t *); +}; + +struct vout_display_t { + VLC_COMMON_MEMBERS + + /* Module */ + module_t *module; + + /* Initial and current configuration. + * You cannot modify it directly, you must use the appropriate events. + * + * It reflects the current values, i.e. after the event has been accepted + * and applied/configured if needed. + */ + const vout_display_cfg_t *cfg; + + /* video source format. + * + * Cropping is not requested while in the open function. + * You cannot change it. + */ + video_format_t source; + + /* picture_t format. + * + * You can only change it inside the module open function to + * match what you want, and when a VOUT_DISPLAY_RESET_PICTURES control + * request is made and succeeds. + * + * By default, it is equal to ::source except for the aspect ratio + * which is undefined(0) and is ignored. + */ + video_format_t fmt; + + /* Information + * + * You can only set them in the open function. + */ + vout_display_info_t info; + + /* Return a pointer over the current picture_pool_t* (mandatory). + * + * For performance reasons, it is best to provide at least count + * pictures but it is not mandatory. + * You can return NULL when you cannot/do not want to allocate + * pictures. + * The vout display module keeps the ownership of the pool and can + * destroy it only when closing or on invalid pictures control. + */ + picture_pool_t *(*pool)(vout_display_t *, unsigned count); + + /* Prepare a picture and an optional subpicture for display (optional). + * + * It is called before the next pf_display call to provide as much + * time as possible to prepare the given picture and the subpicture + * for display. + * You are guaranted that pf_display will always be called and using + * the exact same picture_t and subpicture_t. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + */ + void (*prepare)(vout_display_t *, picture_t *, subpicture_t *); + + /* Display a picture and an optional subpicture (mandatory). + * + * The picture and the optional subpicture must be displayed as soon as + * possible. + * You cannot change the pixel content of the picture_t or of the + * subpicture_t. + * + * This function gives away the ownership of the picture and of the + * subpicture, so you must release them as soon as possible. + */ + void (*display)(vout_display_t *, picture_t *, subpicture_t *); + + /* Control on the module (mandatory) */ + int (*control)(vout_display_t *, int, va_list); + + /* Manage pending event (optional) */ + void (*manage)(vout_display_t *) VLC_DEPRECATED; + + /* Private place holder for the vout_display_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_display_sys_t *sys; + + /* Reserved for the vout_display_t owner. + * + * It must not be overwritten nor used directly by a module. + */ + vout_display_owner_t owner; +}; + +static inline void vout_display_SendEvent(vout_display_t *vd, int query, ...) +{ + va_list args; + va_start(args, query); + vd->owner.event(vd, query, args); + va_end(args); +} + +static inline void vout_display_SendEventDisplaySize(vout_display_t *vd, int width, int height) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_DISPLAY_SIZE, width, height); +} +static inline void vout_display_SendEventPicturesInvalid(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_PICTURES_INVALID); +} +static inline void vout_display_SendEventClose(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_CLOSE); +} +static inline void vout_display_SendEventKey(vout_display_t *vd, int key) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_KEY, key); +} +#if defined(_WIN32) || defined(__OS2__) +static inline void vout_display_SendEventFullscreen(vout_display_t *vd, bool is_fullscreen, + bool is_window_fullscreen) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_FULLSCREEN, is_fullscreen, is_window_fullscreen); +} +static inline void vout_display_SendWindowState(vout_display_t *vd, unsigned state) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_WINDOW_STATE, state); +} +#endif +/* The mouse position (State and Moved event) must be expressed against vout_display_t::source unit */ +static inline void vout_display_SendEventMouseState(vout_display_t *vd, int x, int y, int button_mask) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_STATE, x, y, button_mask); +} +static inline void vout_display_SendEventMouseMoved(vout_display_t *vd, int x, int y) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_MOVED, x, y); +} +static inline void vout_display_SendEventMousePressed(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_PRESSED, button); +} +static inline void vout_display_SendEventMouseReleased(vout_display_t *vd, int button) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_RELEASED, button); +} +static inline void vout_display_SendEventMouseDoubleClick(vout_display_t *vd) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK); +} +static inline void vout_display_SendEventViewpointMoved(vout_display_t *vd, + const vlc_viewpoint_t *vp) +{ + vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_VIEWPOINT_MOVED, vp); +} + +/** + * Asks for a new window of a given type. + */ +static inline vout_window_t *vout_display_NewWindow(vout_display_t *vd, unsigned type) +{ + return vd->owner.window_new(vd, type); +} +/** + * Deletes a window created by vout_display_NewWindow if window is non NULL + * or any unused windows otherwise. + */ +static inline void vout_display_DeleteWindow(vout_display_t *vd, + vout_window_t *window) +{ + vd->owner.window_del(vd, window); +} + +static inline bool vout_display_IsWindowed(vout_display_t *vd) +{ + vout_window_t *window = vout_display_NewWindow(vd, VOUT_WINDOW_TYPE_INVALID); + if (window != NULL) + vout_display_DeleteWindow(vd, window); + return window != NULL; +} + +/** + * Computes the default display size given the source and + * the display configuration. + * + * This asssumes that the picture is already cropped. + */ +VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height, const video_format_t *source, const vout_display_cfg_t *); + + +/** + * Structure used to store the result of a vout_display_PlacePicture. + */ +typedef struct { + int x; + int y; + unsigned width; + unsigned height; +} vout_display_place_t; + +/** + * Computes how to place a picture inside the display to respect + * the given parameters. + * This assumes that cropping is done by an external mean. + * + * \param p_place Place inside the window (window pixel unit) + * \param p_source Video source format + * \param p_cfg Display configuration + * \param b_clip If true, prevent the video to go outside the display (break zoom). + */ +VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping); + + +/** + * Helper function that applies the necessary transforms to the mouse position + * and then calls vout_display_SendEventMouseMoved. + * + * \param vd vout_display_t. + * \param orient_display The orientation of the picture as seen on screen (probably ORIENT_NORMAL). + * \param m_x Mouse x position (relative to place, origin is top left). + * \param m_y Mouse y position (relative to place, origin is top left). + * \param place Place of the picture. + */ +VLC_API void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y, + vout_display_place_t *place); + +/** @} */ +#endif /* VLC_VOUT_DISPLAY_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_osd.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_osd.h new file mode 100644 index 0000000..0cb6853 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_osd.h @@ -0,0 +1,102 @@ +/***************************************************************************** + * vlc_vout_osd.h: vout OSD + ***************************************************************************** + * Copyright (C) 1999-2010 VLC authors and VideoLAN + * Copyright (C) 2004-2005 M2X + * $Id: a07cd9073156d9ce0d5363543bcc3fd98a6de8f8 $ + * + * Authors: Jean-Paul Saman + * Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_OSD_H +#define VLC_VOUT_OSD_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup osd On-screen display + * \ingroup spu + * @{ + * \file + * Overlay text and widgets + */ + +/** + * OSD menu position and picture type defines + */ +enum +{ + /* Icons */ + OSD_PLAY_ICON = 1, + OSD_PAUSE_ICON, + OSD_SPEAKER_ICON, + OSD_MUTE_ICON, + /* Sliders */ + OSD_HOR_SLIDER, + OSD_VERT_SLIDER, +}; + +VLC_API int vout_OSDEpg( vout_thread_t *, input_item_t * ); + +/** + * \brief Write an informative message if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param position Position of the text + * \param duration Duration of the text being displayed + * \param text Text to be displayed + */ +VLC_API void vout_OSDText( vout_thread_t *vout, int channel, int position, mtime_t duration, const char *text ); + +/** + * \brief Write an informative message at the default location, + * for the default duration and only if the OSD option is enabled. + * \param vout The vout on which the message will be displayed + * \param channel Subpicture channel + * \param format printf style formatting + * + * Provided for convenience. + */ +VLC_API void vout_OSDMessage( vout_thread_t *, int, const char *, ... ) VLC_FORMAT( 3, 4 ); + +/** + * Display a slider on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_postion Current position in the slider + * \param i_type Types are: OSD_HOR_SLIDER and OSD_VERT_SLIDER. + */ +VLC_API void vout_OSDSlider( vout_thread_t *, int, int , short ); + +/** + * Display an Icon on the video output. + * \param p_this The object that called the function. + * \param i_channel Subpicture channel + * \param i_type Types are: OSD_PLAY_ICON, OSD_PAUSE_ICON, OSD_SPEAKER_ICON, OSD_MUTE_ICON + */ +VLC_API void vout_OSDIcon( vout_thread_t *, int, short ); + +/** @} */ +#ifdef __cplusplus +} +#endif + +#endif /* VLC_VOUT_OSD_H */ + diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_window.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_window.h new file mode 100644 index 0000000..edc94fe --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_vout_window.h @@ -0,0 +1,373 @@ +/***************************************************************************** + * vlc_vout_window.h: vout_window_t definitions + ***************************************************************************** + * Copyright (C) 2008 Rémi Denis-Courmont + * Copyright (C) 2009 Laurent Aimar + * $Id: 3a613d4e4701783a43cefd299e171f95164e30e9 $ + * + * Authors: Laurent Aimar + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VOUT_WINDOW_H +#define VLC_VOUT_WINDOW_H 1 + +#include +#include + +/** + * \defgroup video_window Video window + * \ingroup video_output + * Video output window management + * @{ + * \file + * Video output window modules interface + */ + +typedef struct vout_window_t vout_window_t; +typedef struct vout_window_sys_t vout_window_sys_t; + +struct wl_display; +struct wl_surface; + +/** + * Window handle type + */ +enum vout_window_type { + VOUT_WINDOW_TYPE_INVALID=0 /**< Invalid or unspecified window type */, + VOUT_WINDOW_TYPE_XID /**< X11 window */, + VOUT_WINDOW_TYPE_HWND /**< Win32 or OS/2 window */, + VOUT_WINDOW_TYPE_NSOBJECT /**< MacOS X view */, + VOUT_WINDOW_TYPE_ANDROID_NATIVE /**< Android native window */, + VOUT_WINDOW_TYPE_WAYLAND /**< Wayland surface */, +}; + +/** + * Control query for vout_window_t + */ +enum vout_window_control { + VOUT_WINDOW_SET_STATE, /* unsigned state */ + VOUT_WINDOW_SET_SIZE, /* unsigned i_width, unsigned i_height */ + VOUT_WINDOW_SET_FULLSCREEN, /* int b_fullscreen */ + VOUT_WINDOW_HIDE_MOUSE, /* int b_hide */ +}; + +/** + * Window mouse event type for vout_window_mouse_event_t + */ +enum vout_window_mouse_event_type { + VOUT_WINDOW_MOUSE_STATE, + VOUT_WINDOW_MOUSE_MOVED, + VOUT_WINDOW_MOUSE_PRESSED, + VOUT_WINDOW_MOUSE_RELEASED, + VOUT_WINDOW_MOUSE_DOUBLE_CLICK, +}; + +/** + * Window mouse event + */ +typedef struct vout_window_mouse_event_t +{ + enum vout_window_mouse_event_type type; + int x; + int y; + int button_mask; +} vout_window_mouse_event_t; + +typedef struct vout_window_cfg_t { + /* Window handle type */ + unsigned type; + + /* If true, a standalone window is requested */ + bool is_standalone; + bool is_fullscreen; + +#ifdef __APPLE__ + /* Window position hint */ + int x; + int y; +#endif + + /* Windows size hint */ + unsigned width; + unsigned height; + +} vout_window_cfg_t; + +typedef struct vout_window_owner { + void *sys; + void (*resized)(vout_window_t *, unsigned width, unsigned height); + void (*closed)(vout_window_t *); + void (*mouse_event)(vout_window_t *, const vout_window_mouse_event_t *mouse); +} vout_window_owner_t; + +/** + * Graphical window + * + * This structure is an abstract interface to the windowing system. + * The window is normally used to draw video (and subpictures) into, but it + * can also be used for other purpose (e.g. OpenGL visualization). + * + * The window is responsible for providing a window handle, whose exact + * meaning depends on the windowing system. It also must report some events + * such as user input (keyboard, mouse) and window resize. + * + * Finally, it must support some control requests such as for fullscreen mode. + */ +struct vout_window_t { + VLC_COMMON_MEMBERS + + /** + * Window handle type + * + * This identified the windowing system and protocol that the window + * needs to use. This also selects which member of the \ref handle union + * and the \ref display union are to be set. + * + * The possible values are defined in \ref vout_window_type. + * + * VOUT_WINDOW_TYPE_INVALID is a special placeholder type. It means that + * any windowing system is acceptable. In that case, the plugin must set + * its actual type during activation. + */ + unsigned type; + + /** + * Window handle (mandatory) + * + * This must be filled by the plugin upon activation. + * + * Depending on the \ref type above, a different member of this union is + * used. + */ + union { + void *hwnd; /**< Win32 window handle */ + uint32_t xid; /**< X11 windows ID */ + void *nsobject; /**< Mac OSX view object */ + void *anativewindow; /**< Android native window */ + struct wl_surface *wl; /**< Wayland surface (client pointer) */ + } handle; + + /** Display server (mandatory) + * + * This must be filled by the plugin upon activation. + * + * The window handle is relative to the display server. The exact meaning + * of the display server depends on the window handle type. Not all window + * handle type provide a display server field. + */ + union { + char *x11; /**< X11 display string (NULL = use default) */ + struct wl_display *wl; /**< Wayland display (client pointer) */ + } display; + + /** + * Control callback (mandatory) + * + * This callback handles some control request regarding the window. + * See \ref vout_window_control. + * + * This field should not be used directly when manipulating a window. + * vout_window_Control() should be used instead. + */ + int (*control)(vout_window_t *, int query, va_list); + + struct { + bool has_double_click; /**< Whether double click events are sent, + or need to be emulated */ + } info; + + /* Private place holder for the vout_window_t module (optional) + * + * A module is free to use it as it wishes. + */ + vout_window_sys_t *sys; + + vout_window_owner_t owner; +}; + +/** + * Creates a new window. + * + * @param module plugin name (usually "$window") + * @note If you are inside a "vout display", you must use + / vout_display_NewWindow() and vout_display_DeleteWindow() instead. + * This enables recycling windows. + */ +VLC_API vout_window_t * vout_window_New(vlc_object_t *, const char *module, const vout_window_cfg_t *, const vout_window_owner_t *); + +/** + * Deletes a window created by vout_window_New(). + * + * @note See vout_window_New() about window recycling. + */ +VLC_API void vout_window_Delete(vout_window_t *); + +void vout_window_SetInhibition(vout_window_t *window, bool enabled); + +static inline int vout_window_vaControl(vout_window_t *window, int query, + va_list ap) +{ + return window->control(window, query, ap); +} + +/** + * Reconfigures a window. + * + * @note The vout_window_* wrappers should be used instead of this function. + * + * @warning The caller must own the window, as vout_window_t is not thread safe. + */ +static inline int vout_window_Control(vout_window_t *window, int query, ...) +{ + va_list ap; + int ret; + + va_start(ap, query); + ret = vout_window_vaControl(window, query, ap); + va_end(ap); + return ret; +} + +/** + * Configures the window manager state for this window. + */ +static inline int vout_window_SetState(vout_window_t *window, unsigned state) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_STATE, state); +} + +/** + * Configures the window display (i.e. inner/useful) size. + */ +static inline int vout_window_SetSize(vout_window_t *window, + unsigned width, unsigned height) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_SIZE, width, height); +} + +/** + * Sets fullscreen mode. + */ +static inline int vout_window_SetFullScreen(vout_window_t *window, bool full) +{ + return vout_window_Control(window, VOUT_WINDOW_SET_FULLSCREEN, full); +} + +/** + * Hide the mouse cursor + */ +static inline int vout_window_HideMouse(vout_window_t *window, bool hide) +{ + return vout_window_Control(window, VOUT_WINDOW_HIDE_MOUSE, hide); +} + +/** + * Report current window size + * + * This notifies the user of the window what the pixel dimensions of the + * window are (or should be, depending on the windowing system). + * + * \note This function is thread-safe. In case of concurrent call, it is + * undefined which one is taken into account (but at least one is). + */ +static inline void vout_window_ReportSize(vout_window_t *window, + unsigned width, unsigned height) +{ + if (window->owner.resized != NULL) + window->owner.resized(window, width, height); +} + +static inline void vout_window_ReportClose(vout_window_t *window) +{ + if (window->owner.closed != NULL) + window->owner.closed(window); +} + +static inline void vout_window_SendMouseEvent(vout_window_t *window, + const vout_window_mouse_event_t *mouse) +{ + if (window->owner.mouse_event != NULL) + window->owner.mouse_event(window, mouse); +} + +/** + * Send a full mouse state + * + * The mouse position must be expressed against window unit. You can use this + * function of others vout_window_ReportMouse*() functions. + */ +static inline void vout_window_ReportMouseState(vout_window_t *window, + int x, int y, int button_mask) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_STATE, x, y, button_mask + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse movement + * + * The mouse position must be expressed against window unit. + */ +static inline void vout_window_ReportMouseMoved(vout_window_t *window, + int x, int y) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_MOVED, x, y, 0 + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse pressed event + */ +static inline void vout_window_ReportMousePressed(vout_window_t *window, + int button) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_PRESSED, 0, 0, button, + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse released event + */ +static inline void vout_window_ReportMouseReleased(vout_window_t *window, + int button) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_RELEASED, 0, 0, button, + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** + * Send a mouse double click event + */ +static inline void vout_window_ReportMouseDoubleClick(vout_window_t *window, + int button) +{ + const vout_window_mouse_event_t mouse = { + VOUT_WINDOW_MOUSE_DOUBLE_CLICK, 0, 0, button, + }; + vout_window_SendMouseEvent(window, &mouse); +} + +/** @} */ +#endif /* VLC_VOUT_WINDOW_H */ diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_xlib.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_xlib.h new file mode 100644 index 0000000..b6818c1 --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_xlib.h @@ -0,0 +1,57 @@ +/***************************************************************************** + * vlc_xlib.h: initialization of Xlib + ***************************************************************************** + * Copyright (C) 2010 Rémi Denis-Courmont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XLIB_H +# define VLC_XLIB_H 1 + +# include +# include +# include +# include + +static inline bool vlc_xlib_init (vlc_object_t *obj) +{ + if (!var_InheritBool (obj, "xlib")) + return false; + + bool ok = false; + + /* XInitThreads() can be called multiple times, + * but it is not reentrant, so we need this global lock. */ + vlc_global_lock (VLC_XLIB_MUTEX); + + if (_Xglobal_lock == NULL && unlikely(_XErrorFunction != NULL)) + /* (_Xglobal_lock == NULL) => Xlib threads not initialized */ + /* (_XErrorFunction != NULL) => Xlib already in use */ + fprintf (stderr, "%s:%u:%s: Xlib not initialized for threads.\n" + "This process is probably using LibVLC incorrectly.\n" + "Pass \"--no-xlib\" to libvlc_new() to fix this.\n", + __FILE__, __LINE__, __func__); + else if (XInitThreads ()) + ok = true; + + vlc_global_unlock (VLC_XLIB_MUTEX); + + if (!ok) + msg_Err (obj, "Xlib not initialized for threads"); + return ok; +} + +#endif diff --git a/vlcdemo/vlc/vlc3/include64/plugins/vlc_xml.h b/vlcdemo/vlc/vlc3/include64/plugins/vlc_xml.h new file mode 100644 index 0000000..661e76d --- /dev/null +++ b/vlcdemo/vlc/vlc3/include64/plugins/vlc_xml.h @@ -0,0 +1,121 @@ +/***************************************************************************** + * vlc_xml.h: XML abstraction layer + ***************************************************************************** + * Copyright (C) 2004-2010 VLC authors and VideoLAN + * + * Author: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_XML_H +#define VLC_XML_H + +/** +* \file +* This file defines functions and structures to handle xml tags in vlc +* +*/ + +# ifdef __cplusplus +extern "C" { +# endif + +struct xml_t +{ + VLC_COMMON_MEMBERS + + /* Module properties */ + module_t *p_module; + xml_sys_t *p_sys; + + void (*pf_catalog_load) ( xml_t *, const char * ); + void (*pf_catalog_add) ( xml_t *, const char *, const char *, + const char * ); +}; + +VLC_API xml_t * xml_Create( vlc_object_t * ) VLC_USED; +#define xml_Create( a ) xml_Create( VLC_OBJECT(a) ) +VLC_API void xml_Delete( xml_t * ); + +static inline void xml_CatalogLoad( xml_t *xml, const char *catalog ) +{ + xml->pf_catalog_load( xml, catalog ); +} + +static inline void xml_CatalogAdd( xml_t *xml, const char *type, + const char *orig, const char *value ) +{ + xml->pf_catalog_add( xml, type, orig, value ); +} + + +struct xml_reader_t +{ + VLC_COMMON_MEMBERS + + xml_reader_sys_t *p_sys; + stream_t *p_stream; + module_t *p_module; + + int (*pf_next_node) ( xml_reader_t *, const char ** ); + const char *(*pf_next_attr) ( xml_reader_t *, const char ** ); + + int (*pf_use_dtd) ( xml_reader_t * ); + int (*pf_is_empty) ( xml_reader_t * ); +}; + +VLC_API xml_reader_t * xml_ReaderCreate(vlc_object_t *, stream_t *) VLC_USED; +#define xml_ReaderCreate( a, s ) xml_ReaderCreate(VLC_OBJECT(a), s) +VLC_API void xml_ReaderDelete(xml_reader_t *); +VLC_API xml_reader_t * xml_ReaderReset(xml_reader_t *, stream_t *) VLC_USED; + +static inline int xml_ReaderNextNode( xml_reader_t *reader, const char **pval ) +{ + return reader->pf_next_node( reader, pval ); +} + +static inline const char *xml_ReaderNextAttr( xml_reader_t *reader, + const char **pval ) +{ + return reader->pf_next_attr( reader, pval ); +} + +static inline int xml_ReaderUseDTD( xml_reader_t *reader ) +{ + return reader->pf_use_dtd( reader ); +} + +static inline int xml_ReaderIsEmptyElement( xml_reader_t *reader ) +{ + if(reader->pf_is_empty == NULL) + return -2; + + return reader->pf_is_empty( reader ); +} + +enum { + XML_READER_ERROR=-1, + XML_READER_NONE=0, + XML_READER_STARTELEM, + XML_READER_ENDELEM, + XML_READER_TEXT, +}; + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/vlcdemo/vlc/vlc3/winlib/libvlc.lib b/vlcdemo/vlc/vlc3/winlib/libvlc.lib new file mode 100644 index 0000000000000000000000000000000000000000..0c8a82140e4d0e19869d7764a12594d60d09df47 GIT binary patch literal 257772 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Ð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 RO^i?T2Oo@2_5bO7{utC8rfC2G literal 0 HcmV?d00001 diff --git a/vlcdemo/vlc/vlc3/winlib64/libvlc.lib b/vlcdemo/vlc/vlc3/winlib64/libvlc.lib new file mode 100644 index 0000000000000000000000000000000000000000..3d8b702109d8565f0e4dd82d55639901302d7747 GIT binary patch literal 259040 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
Z(N90uVy?$u4}YFMoHPR&2&l;C#8-@ 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

gYzuDQ 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 F{eKaiguws+ literal 0 HcmV?d00001 diff --git a/vlcdemo/vlc/vlchead.h b/vlcdemo/vlc/vlchead.h new file mode 100644 index 0000000..517ae96 --- /dev/null +++ b/vlcdemo/vlc/vlchead.h @@ -0,0 +1,71 @@ +/***************************************************************************** + * vlc.h: global header for libvlc + ***************************************************************************** + * Copyright (C) 1998-2008 VLC authors and VideoLAN + * $Id: 8f39094bd4b15c99288cecd001f76fcc10565daa $ + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Gildas Bazin + * Derk-Jan Hartman + * Pierre d'Herbemont + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_VLC_H +#define VLC_VLC_H 1 + +/** + * \file + * This file defines libvlc new external API + */ + +# ifdef __cplusplus +extern "C" { +# endif + +#ifdef vlc3 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +# ifdef __cplusplus +} +# endif + +#endif /* _VLC_VLC_H */ diff --git a/vlcdemo/vlcdemo.pro b/vlcdemo/vlcdemo.pro new file mode 100644 index 0000000..86484b8 --- /dev/null +++ b/vlcdemo/vlcdemo.pro @@ -0,0 +1,22 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = vlcdemo +TEMPLATE = app +MOC_DIR = temp/moc +RCC_DIR = temp/rcc +UI_DIR = temp/ui +OBJECTS_DIR = temp/obj +DESTDIR = $$PWD/../bin + +#vlc2表示用vlc2版本 可以改成vlc3表示用vlc3版本 +#qt32表示采用32位的vlc 可以改成qt64表示采用64位的vlc +DEFINES += vlc2 qt32 +SOURCES += main.cpp widget.cpp +HEADERS += widget.h +FORMS += widget.ui +CONFIG += warn_off + +INCLUDEPATH += $$PWD/vlc +include ($$PWD/vlc/vlc.pri) diff --git a/vlcdemo/widget.cpp b/vlcdemo/widget.cpp new file mode 100644 index 0000000..dfc815a --- /dev/null +++ b/vlcdemo/widget.cpp @@ -0,0 +1,38 @@ +#pragma execution_character_set("utf-8") +#include "widget.h" +#include "ui_widget.h" + +Widget::Widget(QWidget *parent) + : QWidget(parent) + , ui(new Ui::Widget) +{ + ui->setupUi(this); + + QStringList urls; + urls << "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"; + urls << "rtsp://admin:Admin123456@192.168.1.64:554/Streaming/Channels/102?transportmode=unicast&profile=Profile_2"; + urls << "rtsp://192.168.1.108:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif"; + urls << "rtsp://192.168.1.15:554/media/video1"; + urls << "rtsp://192.168.1.15:554/media/video2"; + urls << "rtsp://192.168.1.247:554/av0_0"; + urls << "rtsp://192.168.1.247:554/av0_1"; + ui->cboxUrl->addItems(urls); +} + +Widget::~Widget() +{ + delete ui; +} + +void Widget::on_btnOpen_clicked() +{ + if (ui->btnOpen->text() == "打开") { + ui->btnOpen->setText("关闭"); + QString url = ui->cboxUrl->currentText().trimmed(); + ui->vlcWidget->setUrl(url); + ui->vlcWidget->open(); + } else { + ui->btnOpen->setText("打开"); + ui->vlcWidget->close(); + } +} diff --git a/vlcdemo/widget.h b/vlcdemo/widget.h new file mode 100644 index 0000000..0d54597 --- /dev/null +++ b/vlcdemo/widget.h @@ -0,0 +1,24 @@ +#ifndef WIDGET_H +#define WIDGET_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class Widget; } +QT_END_NAMESPACE + +class Widget : public QWidget +{ + Q_OBJECT + +public: + Widget(QWidget *parent = 0); + ~Widget(); + +private slots: + void on_btnOpen_clicked(); + +private: + Ui::Widget *ui; +}; +#endif // WIDGET_H diff --git a/vlcdemo/widget.ui b/vlcdemo/widget.ui new file mode 100644 index 0000000..32b150f --- /dev/null +++ b/vlcdemo/widget.ui @@ -0,0 +1,63 @@ + + + Widget + + + + 0 + 0 + 700 + 600 + + + + Widget + + + + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + + + + true + + + + + + + 打开 + + + + + + + + + + VlcWidget + QWidget +

vlc.h
+ 1 + + + + +

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 literal 0 HcmV?d00001 diff --git a/snap/vlcdemo.png b/snap/vlcdemo.png new file mode 100644 index 0000000000000000000000000000000000000000..195c6402bb1da11f1d15a43fb42c0008df74a941 GIT binary patch literal 482080 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