* qatar/master: mpegvideo: reduce excessive inlining of mpeg_motion() mpegvideo: convert mpegvideo_common.h to a .c file build: factor out mpegvideo.o dependencies to CONFIG_MPEGVIDEO Move MASK_ABS macro to libavcodec/mathops.h x86: move MANGLE() and related macros to libavutil/x86/asm.h x86: rename libavutil/x86_cpu.h to libavutil/x86/asm.h aacdec: Don't fall back to the old output configuration when no old configuration is present. rtmp: Add message tracking rtsp: Support mpegts in raw udp packets rtsp: Support receiving plain data over UDP without any RTP encapsulation rtpdec: Remove an unused include rtpenc: Remove an av_abort() that depends on user-supplied data vsrc_movie: discourage its use with avconv. avconv: allow no input files. avconv: prevent invalid reads in transcode_init() avconv: rename OutputStream.is_past_recording_time to finished. Conflicts: configure doc/filters.texi ffmpeg.c ffmpeg.h libavcodec/Makefile libavcodec/aacdec.c libavcodec/mpegvideo.c libavformat/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
| @@ -1361,6 +1361,7 @@ CONFIG_EXTRA=" | |||||
| lgplv3 | lgplv3 | ||||
| lpc | lpc | ||||
| mpegaudiodsp | mpegaudiodsp | ||||
| mpegvideo | |||||
| nettle | nettle | ||||
| rtpdec | rtpdec | ||||
| sinewin | sinewin | ||||
| @@ -1500,18 +1501,18 @@ atrac1_decoder_select="mdct sinewin" | |||||
| atrac3_decoder_select="mdct" | atrac3_decoder_select="mdct" | ||||
| binkaudio_dct_decoder_select="mdct rdft dct sinewin" | binkaudio_dct_decoder_select="mdct rdft dct sinewin" | ||||
| binkaudio_rdft_decoder_select="mdct rdft sinewin" | binkaudio_rdft_decoder_select="mdct rdft sinewin" | ||||
| cavs_decoder_select="golomb" | |||||
| cavs_decoder_select="golomb mpegvideo" | |||||
| cook_decoder_select="mdct sinewin" | cook_decoder_select="mdct sinewin" | ||||
| cscd_decoder_suggest="zlib" | cscd_decoder_suggest="zlib" | ||||
| dca_decoder_select="mdct" | dca_decoder_select="mdct" | ||||
| dirac_decoder_select="dwt golomb" | dirac_decoder_select="dwt golomb" | ||||
| dnxhd_encoder_select="aandcttables" | |||||
| dnxhd_encoder_select="aandcttables mpegvideo" | |||||
| dxa_decoder_select="zlib" | dxa_decoder_select="zlib" | ||||
| eac3_decoder_select="ac3_decoder" | eac3_decoder_select="ac3_decoder" | ||||
| eac3_encoder_select="mdct ac3dsp" | eac3_encoder_select="mdct ac3dsp" | ||||
| eamad_decoder_select="aandcttables" | eamad_decoder_select="aandcttables" | ||||
| eatgq_decoder_select="aandcttables" | eatgq_decoder_select="aandcttables" | ||||
| eatqi_decoder_select="aandcttables" | |||||
| eatqi_decoder_select="aandcttables mpegvideo" | |||||
| exr_decoder_select="zlib" | exr_decoder_select="zlib" | ||||
| ffv1_decoder_select="golomb" | ffv1_decoder_select="golomb" | ||||
| flac_decoder_select="golomb" | flac_decoder_select="golomb" | ||||
| @@ -1523,14 +1524,15 @@ flashsv2_decoder_select="zlib" | |||||
| flv_decoder_select="h263_decoder" | flv_decoder_select="h263_decoder" | ||||
| flv_encoder_select="h263_encoder" | flv_encoder_select="h263_encoder" | ||||
| fraps_decoder_select="huffman" | fraps_decoder_select="huffman" | ||||
| h261_encoder_select="aandcttables" | |||||
| h263_decoder_select="h263_parser" | |||||
| h263_encoder_select="aandcttables" | |||||
| h261_decoder_select="mpegvideo" | |||||
| h261_encoder_select="aandcttables mpegvideo" | |||||
| h263_decoder_select="h263_parser mpegvideo" | |||||
| h263_encoder_select="aandcttables mpegvideo" | |||||
| h263_vaapi_hwaccel_select="vaapi h263_decoder" | h263_vaapi_hwaccel_select="vaapi h263_decoder" | ||||
| h263i_decoder_select="h263_decoder" | h263i_decoder_select="h263_decoder" | ||||
| h263p_encoder_select="h263_encoder" | h263p_encoder_select="h263_encoder" | ||||
| h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser" | h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser" | ||||
| h264_decoder_select="golomb h264chroma h264dsp h264pred h264qpel" | |||||
| h264_decoder_select="golomb h264chroma h264dsp h264pred h264qpel mpegvideo" | |||||
| h264_dxva2_hwaccel_deps="dxva2api_h" | h264_dxva2_hwaccel_deps="dxva2api_h" | ||||
| h264_dxva2_hwaccel_select="dxva2 h264_decoder" | h264_dxva2_hwaccel_select="dxva2 h264_decoder" | ||||
| h264_vaapi_hwaccel_select="vaapi h264_decoder" | h264_vaapi_hwaccel_select="vaapi h264_decoder" | ||||
| @@ -1541,9 +1543,10 @@ iac_decoder_select="fft mdct sinewin" | |||||
| imc_decoder_select="fft mdct sinewin" | imc_decoder_select="fft mdct sinewin" | ||||
| jpegls_decoder_select="golomb" | jpegls_decoder_select="golomb" | ||||
| jpegls_encoder_select="golomb" | jpegls_encoder_select="golomb" | ||||
| ljpeg_encoder_select="aandcttables" | |||||
| ljpeg_encoder_select="aandcttables mpegvideo" | |||||
| loco_decoder_select="golomb" | loco_decoder_select="golomb" | ||||
| mjpeg_encoder_select="aandcttables" | |||||
| mdec_decoder_select="mpegvideo" | |||||
| mjpeg_encoder_select="aandcttables mpegvideo" | |||||
| mlp_decoder_select="mlp_parser" | mlp_decoder_select="mlp_parser" | ||||
| mp1_decoder_select="mpegaudiodsp" | mp1_decoder_select="mpegaudiodsp" | ||||
| mp1float_decoder_select="mpegaudiodsp" | mp1float_decoder_select="mpegaudiodsp" | ||||
| @@ -1562,13 +1565,15 @@ mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h" | |||||
| mpeg_xvmc_decoder_select="mpegvideo_decoder" | mpeg_xvmc_decoder_select="mpegvideo_decoder" | ||||
| mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder" | mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder" | ||||
| mpeg1_vdpau_hwaccel_select="vdpau mpeg1video_decoder" | mpeg1_vdpau_hwaccel_select="vdpau mpeg1video_decoder" | ||||
| mpeg1video_encoder_select="aandcttables" | |||||
| mpeg1video_decoder_select="mpegvideo" | |||||
| mpeg1video_encoder_select="aandcttables mpegvideo" | |||||
| mpeg2_crystalhd_decoder_select="crystalhd" | mpeg2_crystalhd_decoder_select="crystalhd" | ||||
| mpeg2_dxva2_hwaccel_deps="dxva2api_h" | mpeg2_dxva2_hwaccel_deps="dxva2api_h" | ||||
| mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder" | mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder" | ||||
| mpeg2_vdpau_hwaccel_select="vdpau mpeg2video_decoder" | mpeg2_vdpau_hwaccel_select="vdpau mpeg2video_decoder" | ||||
| mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder" | mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder" | ||||
| mpeg2video_encoder_select="aandcttables" | |||||
| mpeg2video_encoder_select="mpegvideo" | |||||
| mpeg2video_encoder_select="aandcttables mpegvideo" | |||||
| mpeg4_crystalhd_decoder_select="crystalhd" | mpeg4_crystalhd_decoder_select="crystalhd" | ||||
| mpeg4_decoder_select="h263_decoder mpeg4video_parser" | mpeg4_decoder_select="h263_decoder mpeg4video_parser" | ||||
| mpeg4_encoder_select="h263_encoder" | mpeg4_encoder_select="h263_encoder" | ||||
| @@ -1593,17 +1598,18 @@ rv10_decoder_select="h263_decoder" | |||||
| rv10_encoder_select="h263_encoder" | rv10_encoder_select="h263_encoder" | ||||
| rv20_decoder_select="h263_decoder" | rv20_decoder_select="h263_decoder" | ||||
| rv20_encoder_select="h263_encoder" | rv20_encoder_select="h263_encoder" | ||||
| rv30_decoder_select="golomb h264chroma h264pred h264qpel" | |||||
| rv40_decoder_select="golomb h264chroma h264pred h264qpel" | |||||
| rv30_decoder_select="golomb h264chroma h264pred h264qpel mpegvideo" | |||||
| rv40_decoder_select="golomb h264chroma h264pred h264qpel mpegvideo" | |||||
| shorten_decoder_select="golomb" | shorten_decoder_select="golomb" | ||||
| sipr_decoder_select="lsp" | sipr_decoder_select="lsp" | ||||
| snow_decoder_select="dwt" | snow_decoder_select="dwt" | ||||
| snow_encoder_select="aandcttables dwt" | |||||
| snow_encoder_select="aandcttables dwt mpegvideo" | |||||
| sonic_decoder_select="golomb" | sonic_decoder_select="golomb" | ||||
| sonic_encoder_select="golomb" | sonic_encoder_select="golomb" | ||||
| sonic_ls_encoder_select="golomb" | sonic_ls_encoder_select="golomb" | ||||
| svq1_encoder_select="aandcttables" | |||||
| svq3_decoder_select="golomb h264chroma h264dsp h264pred h264qpel" | |||||
| svq1_encoder_select="mpegvideo" | |||||
| svq1_encoder_select="aandcttables mpegvideo" | |||||
| svq3_decoder_select="golomb h264chroma h264dsp h264pred h264qpel mpegvideo" | |||||
| svq3_decoder_suggest="zlib" | svq3_decoder_suggest="zlib" | ||||
| theora_decoder_select="vp3_decoder" | theora_decoder_select="vp3_decoder" | ||||
| tiff_decoder_suggest="zlib" | tiff_decoder_suggest="zlib" | ||||
| @@ -1653,7 +1659,10 @@ vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads" | |||||
| vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h" | vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h" | ||||
| # parsers | # parsers | ||||
| h264_parser_select="golomb h264dsp h264pred" | |||||
| h264_parser_select="golomb h264dsp h264pred mpegvideo" | |||||
| mpeg4video_parser_select="mpegvideo" | |||||
| mpegvideo_parser_select="mpegvideo" | |||||
| vc1_parser_select="mpegvideo" | |||||
| # external libraries | # external libraries | ||||
| libaacplus_encoder_deps="libaacplus" | libaacplus_encoder_deps="libaacplus" | ||||
| @@ -1709,12 +1718,13 @@ matroska_demuxer_suggest="zlib bzlib" | |||||
| mov_demuxer_suggest="zlib" | mov_demuxer_suggest="zlib" | ||||
| mp3_demuxer_select="mpegaudio_parser" | mp3_demuxer_select="mpegaudio_parser" | ||||
| mp4_muxer_select="mov_muxer" | mp4_muxer_select="mov_muxer" | ||||
| mpegts_muxer_select="adts_muxer latm_muxer" | |||||
| mpegts_muxer_select="adts_muxer latm_muxer mpegvideo" | |||||
| mpegtsraw_demuxer_select="mpegts_demuxer" | mpegtsraw_demuxer_select="mpegts_demuxer" | ||||
| mxf_d10_muxer_select="mxf_muxer" | mxf_d10_muxer_select="mxf_muxer" | ||||
| ogg_demuxer_select="golomb" | ogg_demuxer_select="golomb" | ||||
| psp_muxer_select="mov_muxer" | psp_muxer_select="mov_muxer" | ||||
| rtp_demuxer_select="sdp_demuxer" | rtp_demuxer_select="sdp_demuxer" | ||||
| rtp_muxer_select="mpegvideo" | |||||
| rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer" | rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer" | ||||
| rtsp_demuxer_select="http_protocol rtpdec" | rtsp_demuxer_select="http_protocol rtpdec" | ||||
| rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol" | rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol" | ||||
| @@ -965,6 +965,9 @@ the matching type. | |||||
| Output link labels are referred to with @option{-map}. Unlabeled outputs are | Output link labels are referred to with @option{-map}. Unlabeled outputs are | ||||
| added to the first output file. | added to the first output file. | ||||
| Note that with this option it is possible to use only lavfi sources without | |||||
| normal input files. | |||||
| For example, to overlay an image over video | For example, to overlay an image over video | ||||
| @example | @example | ||||
| ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map | ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map | ||||
| @@ -987,6 +990,11 @@ graph will be added to the output file automatically, so we can simply write | |||||
| @example | @example | ||||
| ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv | ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv | ||||
| @end example | @end example | ||||
| To generate 5 seconds of pure red video using lavfi @code{color} source: | |||||
| @example | |||||
| ffmpeg -filter_complex 'color=red' -t 5 out.mkv | |||||
| @end example | |||||
| @end table | @end table | ||||
| As a special exception, you can use a bitmap subtitle stream as input: it | As a special exception, you can use a bitmap subtitle stream as input: it | ||||
| @@ -565,7 +565,7 @@ static int check_recording_time(OutputStream *ost) | |||||
| if (of->recording_time != INT64_MAX && | if (of->recording_time != INT64_MAX && | ||||
| av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time, | av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time, | ||||
| AV_TIME_BASE_Q) >= 0) { | AV_TIME_BASE_Q) >= 0) { | ||||
| ost->is_past_recording_time = 1; | |||||
| ost->finished = 1; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| return 1; | return 1; | ||||
| @@ -1315,7 +1315,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p | |||||
| if (of->recording_time != INT64_MAX && | if (of->recording_time != INT64_MAX && | ||||
| ist->pts >= of->recording_time + of->start_time) { | ist->pts >= of->recording_time + of->start_time) { | ||||
| ost->is_past_recording_time = 1; | |||||
| ost->finished = 1; | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -1911,7 +1911,7 @@ static int transcode_init(void) | |||||
| { | { | ||||
| int ret = 0, i, j, k; | int ret = 0, i, j, k; | ||||
| AVFormatContext *oc; | AVFormatContext *oc; | ||||
| AVCodecContext *codec, *icodec = NULL; | |||||
| AVCodecContext *codec; | |||||
| OutputStream *ost; | OutputStream *ost; | ||||
| InputStream *ist; | InputStream *ist; | ||||
| char error[1024]; | char error[1024]; | ||||
| @@ -1942,6 +1942,7 @@ static int transcode_init(void) | |||||
| /* for each output stream, we compute the right encoding parameters */ | /* for each output stream, we compute the right encoding parameters */ | ||||
| for (i = 0; i < nb_output_streams; i++) { | for (i = 0; i < nb_output_streams; i++) { | ||||
| AVCodecContext *icodec = NULL; | |||||
| ost = output_streams[i]; | ost = output_streams[i]; | ||||
| oc = output_files[ost->file_index]->ctx; | oc = output_files[ost->file_index]->ctx; | ||||
| ist = get_input_stream(ost); | ist = get_input_stream(ost); | ||||
| @@ -2367,13 +2368,13 @@ static int need_output(void) | |||||
| OutputFile *of = output_files[ost->file_index]; | OutputFile *of = output_files[ost->file_index]; | ||||
| AVFormatContext *os = output_files[ost->file_index]->ctx; | AVFormatContext *os = output_files[ost->file_index]->ctx; | ||||
| if (ost->is_past_recording_time || | |||||
| if (ost->finished || | |||||
| (os->pb && avio_tell(os->pb) >= of->limit_filesize)) | (os->pb && avio_tell(os->pb) >= of->limit_filesize)) | ||||
| continue; | continue; | ||||
| if (ost->frame_number >= ost->max_frames) { | if (ost->frame_number >= ost->max_frames) { | ||||
| int j; | int j; | ||||
| for (j = 0; j < of->ctx->nb_streams; j++) | for (j = 0; j < of->ctx->nb_streams; j++) | ||||
| output_streams[of->ost_index + j]->is_past_recording_time = 1; | |||||
| output_streams[of->ost_index + j]->finished = 1; | |||||
| continue; | continue; | ||||
| } | } | ||||
| @@ -2424,7 +2425,7 @@ static int select_input_file(void) | |||||
| for (i = 0; i < nb_output_streams; i++) | for (i = 0; i < nb_output_streams; i++) | ||||
| nb_active_out -= output_streams[i]->unavailable = | nb_active_out -= output_streams[i]->unavailable = | ||||
| output_streams[i]->is_past_recording_time; | |||||
| output_streams[i]->finished; | |||||
| while (nb_active_out) { | while (nb_active_out) { | ||||
| opts_min = INT64_MAX; | opts_min = INT64_MAX; | ||||
| ost_index = -1; | ost_index = -1; | ||||
| @@ -3078,10 +3079,10 @@ int main(int argc, char **argv) | |||||
| exit_program(1); | exit_program(1); | ||||
| } | } | ||||
| if (nb_input_files == 0) { | |||||
| av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n"); | |||||
| exit_program(1); | |||||
| } | |||||
| // if (nb_input_files == 0) { | |||||
| // av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n"); | |||||
| // exit_program(1); | |||||
| // } | |||||
| current_time = ti = getutime(); | current_time = ti = getutime(); | ||||
| if (transcode() < 0) | if (transcode() < 0) | ||||
| @@ -306,7 +306,7 @@ typedef struct OutputStream { | |||||
| int64_t swr_dither_method; | int64_t swr_dither_method; | ||||
| double swr_dither_scale; | double swr_dither_scale; | ||||
| AVDictionary *opts; | AVDictionary *opts; | ||||
| int is_past_recording_time; | |||||
| int finished; /* no more packets should be written for this stream */ | |||||
| int unavailable; /* true if the steram is unavailable (possibly temporarily) */ | int unavailable; /* true if the steram is unavailable (possibly temporarily) */ | ||||
| int stream_copy; | int stream_copy; | ||||
| const char *attachment_filename; | const char *attachment_filename; | ||||
| @@ -54,6 +54,7 @@ OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o | |||||
| OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \ | OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \ | ||||
| mpegaudiodsp_fixed.o \ | mpegaudiodsp_fixed.o \ | ||||
| mpegaudiodsp_float.o | mpegaudiodsp_float.o | ||||
| OBJS-$(CONFIG_MPEGVIDEO) += mpegvideo.o mpegvideo_motion.o | |||||
| RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o | RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o | ||||
| OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes) | OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes) | ||||
| OBJS-$(CONFIG_SINEWIN) += sinewin.o | OBJS-$(CONFIG_SINEWIN) += sinewin.o | ||||
| @@ -126,7 +127,7 @@ OBJS-$(CONFIG_BMV_VIDEO_DECODER) += bmv.o | |||||
| OBJS-$(CONFIG_BMV_AUDIO_DECODER) += bmv.o | OBJS-$(CONFIG_BMV_AUDIO_DECODER) += bmv.o | ||||
| OBJS-$(CONFIG_C93_DECODER) += c93.o | OBJS-$(CONFIG_C93_DECODER) += c93.o | ||||
| OBJS-$(CONFIG_CAVS_DECODER) += cavs.o cavsdec.o cavsdsp.o \ | OBJS-$(CONFIG_CAVS_DECODER) += cavs.o cavsdec.o cavsdsp.o \ | ||||
| mpeg12data.o mpegvideo.o | |||||
| mpeg12data.o | |||||
| OBJS-$(CONFIG_CDGRAPHICS_DECODER) += cdgraphics.o | OBJS-$(CONFIG_CDGRAPHICS_DECODER) += cdgraphics.o | ||||
| OBJS-$(CONFIG_CDXL_DECODER) += cdxl.o | OBJS-$(CONFIG_CDXL_DECODER) += cdxl.o | ||||
| OBJS-$(CONFIG_CINEPAK_DECODER) += cinepak.o | OBJS-$(CONFIG_CINEPAK_DECODER) += cinepak.o | ||||
| @@ -145,8 +146,7 @@ OBJS-$(CONFIG_DFA_DECODER) += dfa.o | |||||
| OBJS-$(CONFIG_DNXHD_DECODER) += dnxhddec.o dnxhddata.o | OBJS-$(CONFIG_DNXHD_DECODER) += dnxhddec.o dnxhddata.o | ||||
| OBJS-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.o dnxhddata.o \ | OBJS-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.o dnxhddata.o \ | ||||
| mpegvideo_enc.o motion_est.o \ | mpegvideo_enc.o motion_est.o \ | ||||
| ratecontrol.o mpeg12data.o \ | |||||
| mpegvideo.o | |||||
| ratecontrol.o mpeg12data.o | |||||
| OBJS-$(CONFIG_DPX_DECODER) += dpx.o | OBJS-$(CONFIG_DPX_DECODER) += dpx.o | ||||
| OBJS-$(CONFIG_DPX_ENCODER) += dpxenc.o | OBJS-$(CONFIG_DPX_ENCODER) += dpxenc.o | ||||
| OBJS-$(CONFIG_DSICINAUDIO_DECODER) += dsicinav.o | OBJS-$(CONFIG_DSICINAUDIO_DECODER) += dsicinav.o | ||||
| @@ -164,13 +164,11 @@ OBJS-$(CONFIG_EAC3_ENCODER) += eac3enc.o ac3enc.o ac3enc_float.o \ | |||||
| ac3tab.o ac3.o kbdwin.o eac3_data.o | ac3tab.o ac3.o kbdwin.o eac3_data.o | ||||
| OBJS-$(CONFIG_EACMV_DECODER) += eacmv.o | OBJS-$(CONFIG_EACMV_DECODER) += eacmv.o | ||||
| OBJS-$(CONFIG_EAMAD_DECODER) += eamad.o eaidct.o mpeg12.o \ | OBJS-$(CONFIG_EAMAD_DECODER) += eamad.o eaidct.o mpeg12.o \ | ||||
| mpeg12data.o mpegvideo.o \ | |||||
| error_resilience.o | |||||
| mpeg12data.o error_resilience.o | |||||
| OBJS-$(CONFIG_EATGQ_DECODER) += eatgq.o eaidct.o | OBJS-$(CONFIG_EATGQ_DECODER) += eatgq.o eaidct.o | ||||
| OBJS-$(CONFIG_EATGV_DECODER) += eatgv.o | OBJS-$(CONFIG_EATGV_DECODER) += eatgv.o | ||||
| OBJS-$(CONFIG_EATQI_DECODER) += eatqi.o eaidct.o mpeg12.o \ | OBJS-$(CONFIG_EATQI_DECODER) += eatqi.o eaidct.o mpeg12.o \ | ||||
| mpeg12data.o mpegvideo.o \ | |||||
| error_resilience.o | |||||
| mpeg12data.o error_resilience.o | |||||
| OBJS-$(CONFIG_EIGHTBPS_DECODER) += 8bps.o | OBJS-$(CONFIG_EIGHTBPS_DECODER) += 8bps.o | ||||
| OBJS-$(CONFIG_EIGHTSVX_EXP_DECODER) += 8svx.o | OBJS-$(CONFIG_EIGHTSVX_EXP_DECODER) += 8svx.o | ||||
| OBJS-$(CONFIG_EIGHTSVX_FIB_DECODER) += 8svx.o | OBJS-$(CONFIG_EIGHTSVX_FIB_DECODER) += 8svx.o | ||||
| @@ -200,27 +198,24 @@ OBJS-$(CONFIG_GIF_DECODER) += gifdec.o lzw.o | |||||
| OBJS-$(CONFIG_GIF_ENCODER) += gif.o lzwenc.o | OBJS-$(CONFIG_GIF_ENCODER) += gif.o lzwenc.o | ||||
| OBJS-$(CONFIG_GSM_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o | OBJS-$(CONFIG_GSM_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o | ||||
| OBJS-$(CONFIG_GSM_MS_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o | OBJS-$(CONFIG_GSM_MS_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o | ||||
| OBJS-$(CONFIG_H261_DECODER) += h261dec.o h261.o h261data.o \ | |||||
| mpegvideo.o error_resilience.o | |||||
| OBJS-$(CONFIG_H261_DECODER) += h261dec.o h261.o h261data.o error_resilience.o | |||||
| OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261.o h261data.o \ | OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261.o h261data.o \ | ||||
| mpegvideo_enc.o motion_est.o \ | mpegvideo_enc.o motion_est.o \ | ||||
| ratecontrol.o mpeg12data.o \ | |||||
| mpegvideo.o | |||||
| ratecontrol.o mpeg12data.o | |||||
| OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o ituh263dec.o \ | OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o ituh263dec.o \ | ||||
| mpeg4video.o mpeg4videodec.o flvdec.o\ | mpeg4video.o mpeg4videodec.o flvdec.o\ | ||||
| intelh263dec.o mpegvideo.o \ | |||||
| error_resilience.o | |||||
| intelh263dec.o error_resilience.o | |||||
| OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o | OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o | ||||
| OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o mpeg4video.o \ | OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o mpeg4video.o \ | ||||
| mpeg4videoenc.o motion_est.o \ | mpeg4videoenc.o motion_est.o \ | ||||
| ratecontrol.o h263.o ituh263enc.o \ | ratecontrol.o h263.o ituh263enc.o \ | ||||
| flvenc.o mpeg12data.o \ | flvenc.o mpeg12data.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_H264_DECODER) += h264.o \ | OBJS-$(CONFIG_H264_DECODER) += h264.o \ | ||||
| h264_loopfilter.o h264_direct.o \ | h264_loopfilter.o h264_direct.o \ | ||||
| cabac.o h264_sei.o h264_ps.o \ | cabac.o h264_sei.o h264_ps.o \ | ||||
| h264_refs.o h264_cavlc.o h264_cabac.o\ | h264_refs.o h264_cavlc.o h264_cabac.o\ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o | OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o | ||||
| OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o | OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o | ||||
| OBJS-$(CONFIG_H264_VDA_HWACCEL) += vda_h264.o | OBJS-$(CONFIG_H264_VDA_HWACCEL) += vda_h264.o | ||||
| @@ -250,20 +245,18 @@ OBJS-$(CONFIG_KMVC_DECODER) += kmvc.o | |||||
| OBJS-$(CONFIG_LAGARITH_DECODER) += lagarith.o lagarithrac.o | OBJS-$(CONFIG_LAGARITH_DECODER) += lagarith.o lagarithrac.o | ||||
| OBJS-$(CONFIG_LJPEG_ENCODER) += ljpegenc.o mjpegenc.o mjpeg.o \ | OBJS-$(CONFIG_LJPEG_ENCODER) += ljpegenc.o mjpegenc.o mjpeg.o \ | ||||
| mpegvideo_enc.o motion_est.o \ | mpegvideo_enc.o motion_est.o \ | ||||
| ratecontrol.o mpeg12data.o \ | |||||
| mpegvideo.o | |||||
| ratecontrol.o mpeg12data.o | |||||
| OBJS-$(CONFIG_LOCO_DECODER) += loco.o | OBJS-$(CONFIG_LOCO_DECODER) += loco.o | ||||
| OBJS-$(CONFIG_MACE3_DECODER) += mace.o | OBJS-$(CONFIG_MACE3_DECODER) += mace.o | ||||
| OBJS-$(CONFIG_MACE6_DECODER) += mace.o | OBJS-$(CONFIG_MACE6_DECODER) += mace.o | ||||
| OBJS-$(CONFIG_MDEC_DECODER) += mdec.o mpeg12.o mpeg12data.o \ | OBJS-$(CONFIG_MDEC_DECODER) += mdec.o mpeg12.o mpeg12data.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_MICRODVD_DECODER) += microdvddec.o ass.o | OBJS-$(CONFIG_MICRODVD_DECODER) += microdvddec.o ass.o | ||||
| OBJS-$(CONFIG_MIMIC_DECODER) += mimic.o | OBJS-$(CONFIG_MIMIC_DECODER) += mimic.o | ||||
| OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o mjpeg.o | OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o mjpeg.o | ||||
| OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpeg.o \ | OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpeg.o \ | ||||
| mpegvideo_enc.o motion_est.o \ | mpegvideo_enc.o motion_est.o \ | ||||
| ratecontrol.o mpeg12data.o \ | |||||
| mpegvideo.o | |||||
| ratecontrol.o mpeg12data.o | |||||
| OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o mjpegdec.o mjpeg.o | OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o mjpegdec.o mjpeg.o | ||||
| OBJS-$(CONFIG_MLP_DECODER) += mlpdec.o mlpdsp.o | OBJS-$(CONFIG_MLP_DECODER) += mlpdec.o mlpdsp.o | ||||
| OBJS-$(CONFIG_MMVIDEO_DECODER) += mmvideo.o | OBJS-$(CONFIG_MMVIDEO_DECODER) += mmvideo.o | ||||
| @@ -304,21 +297,21 @@ OBJS-$(CONFIG_MPEGVIDEO_DECODER) += mpeg12.o mpeg12data.o \ | |||||
| mpegvideo.o error_resilience.o | mpegvideo.o error_resilience.o | ||||
| OBJS-$(CONFIG_MPEG_XVMC_DECODER) += mpegvideo_xvmc.o | OBJS-$(CONFIG_MPEG_XVMC_DECODER) += mpegvideo_xvmc.o | ||||
| OBJS-$(CONFIG_MPEG1VIDEO_DECODER) += mpeg12.o mpeg12data.o \ | OBJS-$(CONFIG_MPEG1VIDEO_DECODER) += mpeg12.o mpeg12data.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_MPEG1VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ | OBJS-$(CONFIG_MPEG1VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ | ||||
| timecode.o \ | timecode.o \ | ||||
| motion_est.o ratecontrol.o \ | motion_est.o ratecontrol.o \ | ||||
| mpeg12.o mpeg12data.o \ | mpeg12.o mpeg12data.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o | OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o | ||||
| OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o | OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o | ||||
| OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12.o mpeg12data.o \ | OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12.o mpeg12data.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ | OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ | ||||
| timecode.o \ | timecode.o \ | ||||
| motion_est.o ratecontrol.o \ | motion_est.o ratecontrol.o \ | ||||
| mpeg12.o mpeg12data.o \ | mpeg12.o mpeg12data.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o | OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o | ||||
| OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.o msmpeg4data.o | OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.o msmpeg4data.o | ||||
| OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | ||||
| @@ -400,9 +393,9 @@ OBJS-$(CONFIG_RV10_ENCODER) += rv10enc.o | |||||
| OBJS-$(CONFIG_RV20_DECODER) += rv10.o | OBJS-$(CONFIG_RV20_DECODER) += rv10.o | ||||
| OBJS-$(CONFIG_RV20_ENCODER) += rv20enc.o | OBJS-$(CONFIG_RV20_ENCODER) += rv20enc.o | ||||
| OBJS-$(CONFIG_RV30_DECODER) += rv30.o rv34.o rv30dsp.o rv34dsp.o \ | OBJS-$(CONFIG_RV30_DECODER) += rv30.o rv34.o rv30dsp.o rv34dsp.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_RV40_DECODER) += rv40.o rv34.o rv34dsp.o rv40dsp.o \ | OBJS-$(CONFIG_RV40_DECODER) += rv40.o rv34.o rv34dsp.o rv40dsp.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_SAMI_DECODER) += samidec.o ass.o | OBJS-$(CONFIG_SAMI_DECODER) += samidec.o ass.o | ||||
| OBJS-$(CONFIG_S302M_DECODER) += s302m.o | OBJS-$(CONFIG_S302M_DECODER) += s302m.o | ||||
| OBJS-$(CONFIG_SANM_DECODER) += sanm.o | OBJS-$(CONFIG_SANM_DECODER) += sanm.o | ||||
| @@ -419,7 +412,7 @@ OBJS-$(CONFIG_SMC_DECODER) += smc.o | |||||
| OBJS-$(CONFIG_SNOW_DECODER) += snowdec.o snow.o rangecoder.o | OBJS-$(CONFIG_SNOW_DECODER) += snowdec.o snow.o rangecoder.o | ||||
| OBJS-$(CONFIG_SNOW_ENCODER) += snowenc.o snow.o rangecoder.o \ | OBJS-$(CONFIG_SNOW_ENCODER) += snowenc.o snow.o rangecoder.o \ | ||||
| motion_est.o ratecontrol.o \ | motion_est.o ratecontrol.o \ | ||||
| h263.o mpegvideo.o \ | |||||
| h263.o \ | |||||
| error_resilience.o ituh263enc.o \ | error_resilience.o ituh263enc.o \ | ||||
| mpegvideo_enc.o mpeg12data.o | mpegvideo_enc.o mpeg12data.o | ||||
| OBJS-$(CONFIG_SOL_DPCM_DECODER) += dpcm.o | OBJS-$(CONFIG_SOL_DPCM_DECODER) += dpcm.o | ||||
| @@ -433,17 +426,17 @@ OBJS-$(CONFIG_SUBVIEWER_DECODER) += subviewerdec.o ass.o | |||||
| OBJS-$(CONFIG_SUNRAST_DECODER) += sunrast.o | OBJS-$(CONFIG_SUNRAST_DECODER) += sunrast.o | ||||
| OBJS-$(CONFIG_SUNRAST_ENCODER) += sunrastenc.o | OBJS-$(CONFIG_SUNRAST_ENCODER) += sunrastenc.o | ||||
| OBJS-$(CONFIG_SVQ1_DECODER) += svq1dec.o svq1.o h263.o \ | OBJS-$(CONFIG_SVQ1_DECODER) += svq1dec.o svq1.o h263.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_SVQ1_ENCODER) += svq1enc.o svq1.o \ | OBJS-$(CONFIG_SVQ1_ENCODER) += svq1enc.o svq1.o \ | ||||
| motion_est.o h263.o \ | motion_est.o h263.o \ | ||||
| mpegvideo.o error_resilience.o \ | |||||
| error_resilience.o \ | |||||
| ituh263enc.o mpegvideo_enc.o \ | ituh263enc.o mpegvideo_enc.o \ | ||||
| ratecontrol.o mpeg12data.o | ratecontrol.o mpeg12data.o | ||||
| OBJS-$(CONFIG_SVQ3_DECODER) += h264.o svq3.o \ | OBJS-$(CONFIG_SVQ3_DECODER) += h264.o svq3.o \ | ||||
| h264_loopfilter.o h264_direct.o \ | h264_loopfilter.o h264_direct.o \ | ||||
| h264_sei.o h264_ps.o h264_refs.o \ | h264_sei.o h264_ps.o h264_refs.o \ | ||||
| h264_cavlc.o h264_cabac.o cabac.o \ | h264_cavlc.o h264_cabac.o cabac.o \ | ||||
| mpegvideo.o error_resilience.o \ | |||||
| error_resilience.o \ | |||||
| svq1dec.o svq1.o h263.o | svq1dec.o svq1.o h263.o | ||||
| OBJS-$(CONFIG_TARGA_DECODER) += targa.o | OBJS-$(CONFIG_TARGA_DECODER) += targa.o | ||||
| OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o | OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o | ||||
| @@ -652,7 +645,7 @@ OBJS-$(CONFIG_MP2_MUXER) += mpegaudiodata.o mpegaudiodecheader.o | |||||
| OBJS-$(CONFIG_MP3_MUXER) += mpegaudiodata.o mpegaudiodecheader.o | OBJS-$(CONFIG_MP3_MUXER) += mpegaudiodata.o mpegaudiodecheader.o | ||||
| OBJS-$(CONFIG_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o ac3tab.o timecode.o | OBJS-$(CONFIG_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o ac3tab.o timecode.o | ||||
| OBJS-$(CONFIG_MOV_MUXER) += mpeg4audio.o mpegaudiodata.o | OBJS-$(CONFIG_MOV_MUXER) += mpeg4audio.o mpegaudiodata.o | ||||
| OBJS-$(CONFIG_MPEGTS_MUXER) += mpegvideo.o mpeg4audio.o | |||||
| OBJS-$(CONFIG_MPEGTS_MUXER) += mpeg4audio.o | |||||
| OBJS-$(CONFIG_MPEGTS_DEMUXER) += mpeg4audio.o mpegaudiodata.o | OBJS-$(CONFIG_MPEGTS_DEMUXER) += mpeg4audio.o mpegaudiodata.o | ||||
| OBJS-$(CONFIG_MXF_MUXER) += timecode.o | OBJS-$(CONFIG_MXF_MUXER) += timecode.o | ||||
| OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o | OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o | ||||
| @@ -661,7 +654,7 @@ OBJS-$(CONFIG_OGG_DEMUXER) += xiph.o flac.o flacdata.o \ | |||||
| dirac.o vorbis_data.o | dirac.o vorbis_data.o | ||||
| OBJS-$(CONFIG_OGG_MUXER) += xiph.o flac.o flacdata.o \ | OBJS-$(CONFIG_OGG_MUXER) += xiph.o flac.o flacdata.o \ | ||||
| vorbis_data.o | vorbis_data.o | ||||
| OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o mpegvideo.o xiph.o | |||||
| OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o xiph.o | |||||
| OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o | OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o | ||||
| OBJS-$(CONFIG_SPDIF_MUXER) += dca.o | OBJS-$(CONFIG_SPDIF_MUXER) += dca.o | ||||
| OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o mpegaudiodata.o \ | OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o mpegaudiodata.o \ | ||||
| @@ -737,12 +730,12 @@ OBJS-$(CONFIG_H264_PARSER) += h264_parser.o h264.o \ | |||||
| h264_refs.o h264_sei.o h264_direct.o \ | h264_refs.o h264_sei.o h264_direct.o \ | ||||
| h264_loopfilter.o h264_cabac.o \ | h264_loopfilter.o h264_cabac.o \ | ||||
| h264_cavlc.o h264_ps.o \ | h264_cavlc.o h264_ps.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_AAC_LATM_PARSER) += latm_parser.o | OBJS-$(CONFIG_AAC_LATM_PARSER) += latm_parser.o | ||||
| OBJS-$(CONFIG_MJPEG_PARSER) += mjpeg_parser.o | OBJS-$(CONFIG_MJPEG_PARSER) += mjpeg_parser.o | ||||
| OBJS-$(CONFIG_MLP_PARSER) += mlp_parser.o mlp.o | OBJS-$(CONFIG_MLP_PARSER) += mlp_parser.o mlp.o | ||||
| OBJS-$(CONFIG_MPEG4VIDEO_PARSER) += mpeg4video_parser.o h263.o \ | OBJS-$(CONFIG_MPEG4VIDEO_PARSER) += mpeg4video_parser.o h263.o \ | ||||
| mpegvideo.o error_resilience.o \ | |||||
| error_resilience.o \ | |||||
| mpeg4videodec.o mpeg4video.o \ | mpeg4videodec.o mpeg4video.o \ | ||||
| ituh263dec.o h263dec.o | ituh263dec.o h263dec.o | ||||
| OBJS-$(CONFIG_PNG_PARSER) += png_parser.o | OBJS-$(CONFIG_PNG_PARSER) += png_parser.o | ||||
| @@ -750,13 +743,13 @@ OBJS-$(CONFIG_MPEGAUDIO_PARSER) += mpegaudio_parser.o \ | |||||
| mpegaudiodecheader.o mpegaudiodata.o | mpegaudiodecheader.o mpegaudiodata.o | ||||
| OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \ | OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \ | ||||
| mpeg12.o mpeg12data.o \ | mpeg12.o mpeg12data.o \ | ||||
| mpegvideo.o error_resilience.o | |||||
| error_resilience.o | |||||
| OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o | OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o | ||||
| OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o | OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o | ||||
| OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o | OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o | ||||
| OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o vc1.o vc1data.o \ | OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o vc1.o vc1data.o \ | ||||
| msmpeg4.o msmpeg4data.o mpeg4video.o \ | msmpeg4.o msmpeg4data.o mpeg4video.o \ | ||||
| h263.o mpegvideo.o error_resilience.o | |||||
| h263.o error_resilience.o | |||||
| OBJS-$(CONFIG_VORBIS_PARSER) += vorbis_parser.o xiph.o | OBJS-$(CONFIG_VORBIS_PARSER) += vorbis_parser.o xiph.o | ||||
| OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o | OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o | ||||
| OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o | OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o | ||||
| @@ -369,12 +369,10 @@ static void push_output_configuration(AACContext *ac) { | |||||
| * configuration is unlocked. | * configuration is unlocked. | ||||
| */ | */ | ||||
| static void pop_output_configuration(AACContext *ac) { | static void pop_output_configuration(AACContext *ac) { | ||||
| if (ac->oc[1].status != OC_LOCKED) { | |||||
| if (ac->oc[0].status == OC_LOCKED) { | |||||
| ac->oc[1] = ac->oc[0]; | |||||
| ac->avctx->channels = ac->oc[1].channels; | |||||
| ac->avctx->channel_layout = ac->oc[1].channel_layout; | |||||
| } | |||||
| if (ac->oc[1].status != OC_LOCKED && ac->oc[0].status != OC_NONE) { | |||||
| ac->oc[1] = ac->oc[0]; | |||||
| ac->avctx->channels = ac->oc[1].channels; | |||||
| ac->avctx->channel_layout = ac->oc[1].channel_layout; | |||||
| } | } | ||||
| } | } | ||||
| @@ -31,7 +31,6 @@ | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "mpegvideo.h" | #include "mpegvideo.h" | ||||
| #include "mpegvideo_common.h" | |||||
| #include "dnxhdenc.h" | #include "dnxhdenc.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| @@ -138,6 +138,13 @@ if ((y) < (x)) {\ | |||||
| } | } | ||||
| #endif | #endif | ||||
| #ifndef MASK_ABS | |||||
| #define MASK_ABS(mask, level) do { \ | |||||
| mask = level >> 31; \ | |||||
| level = (level ^ mask) - mask; \ | |||||
| } while (0) | |||||
| #endif | |||||
| #ifndef NEG_SSR32 | #ifndef NEG_SSR32 | ||||
| # define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s))) | # define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s))) | ||||
| #endif | #endif | ||||
| @@ -895,7 +895,7 @@ static void mpeg1_encode_block(MpegEncContext *s, | |||||
| run = i - last_non_zero - 1; | run = i - last_non_zero - 1; | ||||
| alevel= level; | alevel= level; | ||||
| MASK_ABS(sign, alevel) | |||||
| MASK_ABS(sign, alevel); | |||||
| sign&=1; | sign&=1; | ||||
| if (alevel <= mpeg1_max_level[0][run]){ | if (alevel <= mpeg1_max_level[0][run]){ | ||||
| @@ -33,7 +33,6 @@ | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "mpegvideo.h" | #include "mpegvideo.h" | ||||
| #include "mpegvideo_common.h" | |||||
| #include "mjpegenc.h" | #include "mjpegenc.h" | ||||
| #include "msmpeg4.h" | #include "msmpeg4.h" | ||||
| #include "xvmc_internal.h" | #include "xvmc_internal.h" | ||||
| @@ -2388,12 +2387,12 @@ void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], | |||||
| op_pix = s->dsp.put_no_rnd_pixels_tab; | op_pix = s->dsp.put_no_rnd_pixels_tab; | ||||
| } | } | ||||
| if (s->mv_dir & MV_DIR_FORWARD) { | if (s->mv_dir & MV_DIR_FORWARD) { | ||||
| MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix); | |||||
| ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix); | |||||
| op_pix = s->dsp.avg_pixels_tab; | op_pix = s->dsp.avg_pixels_tab; | ||||
| op_qpix= s->me.qpel_avg; | op_qpix= s->me.qpel_avg; | ||||
| } | } | ||||
| if (s->mv_dir & MV_DIR_BACKWARD) { | if (s->mv_dir & MV_DIR_BACKWARD) { | ||||
| MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix); | |||||
| ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -748,6 +748,13 @@ static const AVClass name ## _class = {\ | |||||
| .version = LIBAVUTIL_VERSION_INT,\ | .version = LIBAVUTIL_VERSION_INT,\ | ||||
| }; | }; | ||||
| /** | |||||
| * Set the given MpegEncContext to common defaults (same for encoding | |||||
| * and decoding). The changed fields will not depend upon the prior | |||||
| * state of the MpegEncContext. | |||||
| */ | |||||
| void ff_MPV_common_defaults(MpegEncContext *s); | |||||
| void ff_MPV_decode_defaults(MpegEncContext *s); | void ff_MPV_decode_defaults(MpegEncContext *s); | ||||
| int ff_MPV_common_init(MpegEncContext *s); | int ff_MPV_common_init(MpegEncContext *s); | ||||
| void ff_MPV_common_end(MpegEncContext *s); | void ff_MPV_common_end(MpegEncContext *s); | ||||
| @@ -786,10 +793,18 @@ void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int en | |||||
| int ff_dct_common_init(MpegEncContext *s); | int ff_dct_common_init(MpegEncContext *s); | ||||
| void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64], | void ff_convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64], | ||||
| const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra); | const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra); | ||||
| int ff_dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow); | |||||
| void ff_init_block_index(MpegEncContext *s); | void ff_init_block_index(MpegEncContext *s); | ||||
| void ff_copy_picture(Picture *dst, Picture *src); | void ff_copy_picture(Picture *dst, Picture *src); | ||||
| void ff_MPV_motion(MpegEncContext *s, | |||||
| uint8_t *dest_y, uint8_t *dest_cb, | |||||
| uint8_t *dest_cr, int dir, | |||||
| uint8_t **ref_picture, | |||||
| op_pixels_func (*pix_op)[4], | |||||
| qpel_mc_func (*qpix_op)[16]); | |||||
| /** | /** | ||||
| * Allocate a Picture. | * Allocate a Picture. | ||||
| * The pixels are allocated/set by calling get_buffer() if shared = 0. | * The pixels are allocated/set by calling get_buffer() if shared = 0. | ||||
| @@ -33,7 +33,6 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "mpegvideo.h" | #include "mpegvideo.h" | ||||
| #include "mpegvideo_common.h" | |||||
| #include "h263.h" | #include "h263.h" | ||||
| #include "mjpegenc.h" | #include "mjpegenc.h" | ||||
| #include "msmpeg4.h" | #include "msmpeg4.h" | ||||
| @@ -1897,14 +1896,16 @@ static av_always_inline void encode_mb_internal(MpegEncContext *s, | |||||
| } | } | ||||
| if (s->mv_dir & MV_DIR_FORWARD) { | if (s->mv_dir & MV_DIR_FORWARD) { | ||||
| MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, | |||||
| op_pix, op_qpix); | |||||
| ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, | |||||
| s->last_picture.f.data, | |||||
| op_pix, op_qpix); | |||||
| op_pix = s->dsp.avg_pixels_tab; | op_pix = s->dsp.avg_pixels_tab; | ||||
| op_qpix = s->dsp.avg_qpel_pixels_tab; | op_qpix = s->dsp.avg_qpel_pixels_tab; | ||||
| } | } | ||||
| if (s->mv_dir & MV_DIR_BACKWARD) { | if (s->mv_dir & MV_DIR_BACKWARD) { | ||||
| MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, | |||||
| op_pix, op_qpix); | |||||
| ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, | |||||
| s->next_picture.f.data, | |||||
| op_pix, op_qpix); | |||||
| } | } | ||||
| if (s->flags & CODEC_FLAG_INTERLACED_DCT) { | if (s->flags & CODEC_FLAG_INTERLACED_DCT) { | ||||
| @@ -1,5 +1,4 @@ | |||||
| /* | /* | ||||
| * The simplest mpeg encoder (well, it was the simplest!) | |||||
| * Copyright (c) 2000,2001 Fabrice Bellard | * Copyright (c) 2000,2001 Fabrice Bellard | ||||
| * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | ||||
| * | * | ||||
| @@ -22,14 +21,6 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| /** | |||||
| * @file | |||||
| * The simplest mpeg encoder (well, it was the simplest!). | |||||
| */ | |||||
| #ifndef AVCODEC_MPEGVIDEO_COMMON_H | |||||
| #define AVCODEC_MPEGVIDEO_COMMON_H | |||||
| #include <string.h> | #include <string.h> | ||||
| #include "libavutil/avassert.h" | #include "libavutil/avassert.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| @@ -39,14 +30,6 @@ | |||||
| #include "msmpeg4.h" | #include "msmpeg4.h" | ||||
| #include <limits.h> | #include <limits.h> | ||||
| int ff_dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow); | |||||
| /** | |||||
| * Set the given MpegEncContext to common defaults (same for encoding and decoding). | |||||
| * The changed fields will not depend upon the prior state of the MpegEncContext. | |||||
| */ | |||||
| void ff_MPV_common_defaults(MpegEncContext *s); | |||||
| static inline void gmc1_motion(MpegEncContext *s, | static inline void gmc1_motion(MpegEncContext *s, | ||||
| uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | ||||
| uint8_t **ref_picture) | uint8_t **ref_picture) | ||||
| @@ -357,21 +340,39 @@ if(s->quarter_sample) | |||||
| } | } | ||||
| } | } | ||||
| /* apply one mpeg motion vector to the three components */ | /* apply one mpeg motion vector to the three components */ | ||||
| static av_always_inline | |||||
| void mpeg_motion(MpegEncContext *s, | |||||
| uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |||||
| int field_based, int bottom_field, int field_select, | |||||
| uint8_t **ref_picture, op_pixels_func (*pix_op)[4], | |||||
| int motion_x, int motion_y, int h, int mb_y) | |||||
| static void mpeg_motion(MpegEncContext *s, | |||||
| uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |||||
| int field_select, uint8_t **ref_picture, | |||||
| op_pixels_func (*pix_op)[4], | |||||
| int motion_x, int motion_y, int h, int mb_y) | |||||
| { | { | ||||
| #if !CONFIG_SMALL | #if !CONFIG_SMALL | ||||
| if(s->out_format == FMT_MPEG1) | if(s->out_format == FMT_MPEG1) | ||||
| mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, field_based, | |||||
| mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0, | |||||
| field_select, ref_picture, pix_op, | |||||
| motion_x, motion_y, h, 1, mb_y); | |||||
| else | |||||
| #endif | |||||
| mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0, | |||||
| field_select, ref_picture, pix_op, | |||||
| motion_x, motion_y, h, 0, mb_y); | |||||
| } | |||||
| static void mpeg_motion_field(MpegEncContext *s, uint8_t *dest_y, | |||||
| uint8_t *dest_cb, uint8_t *dest_cr, | |||||
| int bottom_field, int field_select, | |||||
| uint8_t **ref_picture, | |||||
| op_pixels_func (*pix_op)[4], | |||||
| int motion_x, int motion_y, int h, int mb_y) | |||||
| { | |||||
| #if !CONFIG_SMALL | |||||
| if(s->out_format == FMT_MPEG1) | |||||
| mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1, | |||||
| bottom_field, field_select, ref_picture, pix_op, | bottom_field, field_select, ref_picture, pix_op, | ||||
| motion_x, motion_y, h, 1, mb_y); | motion_x, motion_y, h, 1, mb_y); | ||||
| else | else | ||||
| #endif | #endif | ||||
| mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, field_based, | |||||
| mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1, | |||||
| bottom_field, field_select, ref_picture, pix_op, | bottom_field, field_select, ref_picture, pix_op, | ||||
| motion_x, motion_y, h, 0, mb_y); | motion_x, motion_y, h, 0, mb_y); | ||||
| } | } | ||||
| @@ -726,8 +727,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, | |||||
| s->mv[dir][0][0], s->mv[dir][0][1], 16); | s->mv[dir][0][0], s->mv[dir][0][1], 16); | ||||
| }else | }else | ||||
| { | { | ||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, | |||||
| 0, 0, 0, | |||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, | |||||
| ref_picture, pix_op, | ref_picture, pix_op, | ||||
| s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y); | s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y); | ||||
| } | } | ||||
| @@ -800,15 +800,15 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, | |||||
| } | } | ||||
| }else{ | }else{ | ||||
| /* top field */ | /* top field */ | ||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, | |||||
| 1, 0, s->field_select[dir][0], | |||||
| ref_picture, pix_op, | |||||
| s->mv[dir][0][0], s->mv[dir][0][1], 8, mb_y); | |||||
| mpeg_motion_field(s, dest_y, dest_cb, dest_cr, | |||||
| 0, s->field_select[dir][0], | |||||
| ref_picture, pix_op, | |||||
| s->mv[dir][0][0], s->mv[dir][0][1], 8, mb_y); | |||||
| /* bottom field */ | /* bottom field */ | ||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, | |||||
| 1, 1, s->field_select[dir][1], | |||||
| ref_picture, pix_op, | |||||
| s->mv[dir][1][0], s->mv[dir][1][1], 8, mb_y); | |||||
| mpeg_motion_field(s, dest_y, dest_cb, dest_cr, | |||||
| 1, s->field_select[dir][1], | |||||
| ref_picture, pix_op, | |||||
| s->mv[dir][1][0], s->mv[dir][1][1], 8, mb_y); | |||||
| } | } | ||||
| } else { | } else { | ||||
| if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){ | if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){ | ||||
| @@ -816,7 +816,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, | |||||
| } | } | ||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, | mpeg_motion(s, dest_y, dest_cb, dest_cr, | ||||
| 0, 0, s->field_select[dir][0], | |||||
| s->field_select[dir][0], | |||||
| ref_picture, pix_op, | ref_picture, pix_op, | ||||
| s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y>>1); | s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y>>1); | ||||
| } | } | ||||
| @@ -833,7 +833,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, | |||||
| } | } | ||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, | mpeg_motion(s, dest_y, dest_cb, dest_cr, | ||||
| 0, 0, s->field_select[dir][i], | |||||
| s->field_select[dir][i], | |||||
| ref2picture, pix_op, | ref2picture, pix_op, | ||||
| s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8, mb_y>>1); | s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8, mb_y>>1); | ||||
| @@ -847,17 +847,17 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, | |||||
| for(i=0; i<2; i++){ | for(i=0; i<2; i++){ | ||||
| int j; | int j; | ||||
| for(j=0; j<2; j++){ | for(j=0; j<2; j++){ | ||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, | |||||
| 1, j, j^i, | |||||
| ref_picture, pix_op, | |||||
| s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8, mb_y); | |||||
| mpeg_motion_field(s, dest_y, dest_cb, dest_cr, | |||||
| j, j^i, ref_picture, pix_op, | |||||
| s->mv[dir][2*i + j][0], | |||||
| s->mv[dir][2*i + j][1], 8, mb_y); | |||||
| } | } | ||||
| pix_op = s->dsp.avg_pixels_tab; | pix_op = s->dsp.avg_pixels_tab; | ||||
| } | } | ||||
| }else{ | }else{ | ||||
| for(i=0; i<2; i++){ | for(i=0; i<2; i++){ | ||||
| mpeg_motion(s, dest_y, dest_cb, dest_cr, | mpeg_motion(s, dest_y, dest_cb, dest_cr, | ||||
| 0, 0, s->picture_structure != i+1, | |||||
| s->picture_structure != i+1, | |||||
| ref_picture, pix_op, | ref_picture, pix_op, | ||||
| s->mv[dir][2*i][0],s->mv[dir][2*i][1],16, mb_y>>1); | s->mv[dir][2*i][0],s->mv[dir][2*i][1],16, mb_y>>1); | ||||
| @@ -875,12 +875,12 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, | |||||
| } | } | ||||
| } | } | ||||
| static inline void MPV_motion(MpegEncContext *s, | |||||
| uint8_t *dest_y, uint8_t *dest_cb, | |||||
| uint8_t *dest_cr, int dir, | |||||
| uint8_t **ref_picture, | |||||
| op_pixels_func (*pix_op)[4], | |||||
| qpel_mc_func (*qpix_op)[16]) | |||||
| void ff_MPV_motion(MpegEncContext *s, | |||||
| uint8_t *dest_y, uint8_t *dest_cb, | |||||
| uint8_t *dest_cr, int dir, | |||||
| uint8_t **ref_picture, | |||||
| op_pixels_func (*pix_op)[4], | |||||
| qpel_mc_func (*qpix_op)[16]) | |||||
| { | { | ||||
| #if !CONFIG_SMALL | #if !CONFIG_SMALL | ||||
| if(s->out_format == FMT_MPEG1) | if(s->out_format == FMT_MPEG1) | ||||
| @@ -891,4 +891,3 @@ static inline void MPV_motion(MpegEncContext *s, | |||||
| MPV_motion_internal(s, dest_y, dest_cb, dest_cr, dir, | MPV_motion_internal(s, dest_y, dest_cb, dest_cr, dir, | ||||
| ref_picture, pix_op, qpix_op, 0); | ref_picture, pix_op, qpix_op, 0); | ||||
| } | } | ||||
| #endif /* AVCODEC_MPEGVIDEO_COMMON_H */ | |||||
| @@ -31,7 +31,7 @@ | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| #include "mpegvideo.h" | #include "mpegvideo.h" | ||||
| #include "msmpeg4.h" | #include "msmpeg4.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "h263.h" | #include "h263.h" | ||||
| #include "mpeg4video.h" | #include "mpeg4video.h" | ||||
| #include "msmpeg4data.h" | #include "msmpeg4data.h" | ||||
| @@ -19,7 +19,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| #include "libavcodec/ac3dsp.h" | #include "libavcodec/ac3dsp.h" | ||||
| @@ -23,7 +23,7 @@ | |||||
| #include "libavcodec/cabac.h" | #include "libavcodec/cabac.h" | ||||
| #include "libavutil/attributes.h" | #include "libavutil/attributes.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavutil/internal.h" | #include "libavutil/internal.h" | ||||
| #include "config.h" | #include "config.h" | ||||
| @@ -24,7 +24,7 @@ | |||||
| #include "libavutil/common.h" | #include "libavutil/common.h" | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/cavsdsp.h" | #include "libavcodec/cavsdsp.h" | ||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| @@ -21,7 +21,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dnxhdenc.h" | #include "libavcodec/dnxhdenc.h" | ||||
| #if HAVE_INLINE_ASM | #if HAVE_INLINE_ASM | ||||
| @@ -23,7 +23,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/h264dsp.h" | #include "libavcodec/h264dsp.h" | ||||
| #include "libavcodec/mpegvideo.h" | #include "libavcodec/mpegvideo.h" | ||||
| @@ -24,7 +24,7 @@ | |||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| typedef struct { uint64_t a, b; } xmm_reg; | typedef struct { uint64_t a, b; } xmm_reg; | ||||
| @@ -23,7 +23,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/mpegvideo.h" | #include "libavcodec/mpegvideo.h" | ||||
| #include "libavcodec/mathops.h" | #include "libavcodec/mathops.h" | ||||
| @@ -20,7 +20,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| #include "dwt.h" | #include "dwt.h" | ||||
| @@ -31,7 +31,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/common.h" | #include "libavutil/common.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #if HAVE_INLINE_ASM | #if HAVE_INLINE_ASM | ||||
| @@ -23,7 +23,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/fmtconvert.h" | #include "libavcodec/fmtconvert.h" | ||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| @@ -19,7 +19,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/h264dsp.h" | #include "libavcodec/h264dsp.h" | ||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| @@ -22,7 +22,7 @@ | |||||
| #include "libavutil/common.h" | #include "libavutil/common.h" | ||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| #if HAVE_INLINE_ASM | #if HAVE_INLINE_ASM | ||||
| @@ -39,7 +39,7 @@ | |||||
| */ | */ | ||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "idct_xvid.h" | #include "idct_xvid.h" | ||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| @@ -19,7 +19,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavcodec/lpc.h" | #include "libavcodec/lpc.h" | ||||
| @@ -101,6 +101,12 @@ __asm__ volatile(\ | |||||
| ); | ); | ||||
| #endif | #endif | ||||
| #define MASK_ABS(mask, level) \ | |||||
| __asm__ ("cltd \n\t" \ | |||||
| "xorl %1, %0 \n\t" \ | |||||
| "subl %1, %0 \n\t" \ | |||||
| : "+a"(level), "=&d"(mask)) | |||||
| // avoid +32 for shift optimization (gcc should do that ...) | // avoid +32 for shift optimization (gcc should do that ...) | ||||
| #define NEG_SSR32 NEG_SSR32 | #define NEG_SSR32 NEG_SSR32 | ||||
| static inline int32_t NEG_SSR32( int32_t a, int8_t s){ | static inline int32_t NEG_SSR32( int32_t a, int8_t s){ | ||||
| @@ -19,7 +19,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/mlp.h" | #include "libavcodec/mlp.h" | ||||
| @@ -22,7 +22,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| @@ -20,7 +20,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/mpegaudiodsp.h" | #include "libavcodec/mpegaudiodsp.h" | ||||
| @@ -23,7 +23,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/avcodec.h" | #include "libavcodec/avcodec.h" | ||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/mpegvideo.h" | #include "libavcodec/mpegvideo.h" | ||||
| @@ -20,7 +20,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/rv34dsp.h" | #include "libavcodec/rv34dsp.h" | ||||
| @@ -20,7 +20,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/avcodec.h" | #include "libavcodec/avcodec.h" | ||||
| #include "libavcodec/snow.h" | #include "libavcodec/snow.h" | ||||
| #include "libavcodec/dwt.h" | #include "libavcodec/dwt.h" | ||||
| @@ -25,7 +25,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "dsputil_mmx.h" | #include "dsputil_mmx.h" | ||||
| #include "libavcodec/vc1dsp.h" | #include "libavcodec/vc1dsp.h" | ||||
| @@ -21,7 +21,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/dsputil.h" | #include "libavcodec/dsputil.h" | ||||
| #include "libavcodec/vp56dsp.h" | #include "libavcodec/vp56dsp.h" | ||||
| @@ -21,7 +21,7 @@ | |||||
| */ | */ | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/vp8dsp.h" | #include "libavcodec/vp8dsp.h" | ||||
| #if HAVE_YASM | #if HAVE_YASM | ||||
| @@ -20,7 +20,7 @@ | |||||
| #include "libavutil/attributes.h" | #include "libavutil/attributes.h" | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavfilter/gradfun.h" | #include "libavfilter/gradfun.h" | ||||
| #if HAVE_INLINE_ASM | #if HAVE_INLINE_ASM | ||||
| @@ -20,7 +20,7 @@ | |||||
| #include "libavutil/attributes.h" | #include "libavutil/attributes.h" | ||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavcodec/x86/dsputil_mmx.h" | #include "libavcodec/x86/dsputil_mmx.h" | ||||
| #include "libavfilter/yadif.h" | #include "libavfilter/yadif.h" | ||||
| @@ -52,15 +52,17 @@ | |||||
| typedef enum { | typedef enum { | ||||
| STATE_START, ///< client has not done anything yet | STATE_START, ///< client has not done anything yet | ||||
| STATE_HANDSHAKED, ///< client has performed handshake | STATE_HANDSHAKED, ///< client has performed handshake | ||||
| STATE_RELEASING, ///< client releasing stream before publish it (for output) | |||||
| STATE_FCPUBLISH, ///< client FCPublishing stream (for output) | STATE_FCPUBLISH, ///< client FCPublishing stream (for output) | ||||
| STATE_CONNECTING, ///< client connected to server successfully | |||||
| STATE_READY, ///< client has sent all needed commands and waits for server reply | |||||
| STATE_PLAYING, ///< client has started receiving multimedia data from server | STATE_PLAYING, ///< client has started receiving multimedia data from server | ||||
| STATE_PUBLISHING, ///< client has started sending multimedia data to server (for output) | STATE_PUBLISHING, ///< client has started sending multimedia data to server (for output) | ||||
| STATE_STOPPED, ///< the broadcast has been stopped | STATE_STOPPED, ///< the broadcast has been stopped | ||||
| } ClientState; | } ClientState; | ||||
| typedef struct TrackedMethod { | |||||
| char *name; | |||||
| int id; | |||||
| } TrackedMethod; | |||||
| /** protocol handler context */ | /** protocol handler context */ | ||||
| typedef struct RTMPContext { | typedef struct RTMPContext { | ||||
| const AVClass *class; | const AVClass *class; | ||||
| @@ -86,7 +88,6 @@ typedef struct RTMPContext { | |||||
| uint8_t flv_header[11]; ///< partial incoming flv packet header | uint8_t flv_header[11]; ///< partial incoming flv packet header | ||||
| int flv_header_bytes; ///< number of initialized bytes in flv_header | int flv_header_bytes; ///< number of initialized bytes in flv_header | ||||
| int nb_invokes; ///< keeps track of invoke messages | int nb_invokes; ///< keeps track of invoke messages | ||||
| int create_stream_invoke; ///< invoke id for the create stream command | |||||
| char* tcurl; ///< url of the target stream | char* tcurl; ///< url of the target stream | ||||
| char* flashver; ///< version of the flash plugin | char* flashver; ///< version of the flash plugin | ||||
| char* swfurl; ///< url of the swf player | char* swfurl; ///< url of the swf player | ||||
| @@ -96,6 +97,9 @@ typedef struct RTMPContext { | |||||
| int client_buffer_time; ///< client buffer time in ms | int client_buffer_time; ///< client buffer time in ms | ||||
| int flush_interval; ///< number of packets flushed in the same request (RTMPT only) | int flush_interval; ///< number of packets flushed in the same request (RTMPT only) | ||||
| int encrypted; ///< use an encrypted connection (RTMPE only) | int encrypted; ///< use an encrypted connection (RTMPE only) | ||||
| TrackedMethod*tracked_methods; ///< tracked methods buffer | |||||
| int nb_tracked_methods; ///< number of tracked methods | |||||
| int tracked_methods_size; ///< size of the tracked methods buffer | |||||
| } RTMPContext; | } RTMPContext; | ||||
| #define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing | #define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing | ||||
| @@ -121,6 +125,72 @@ static const uint8_t rtmp_server_key[] = { | |||||
| 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE | 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE | ||||
| }; | }; | ||||
| static int add_tracked_method(RTMPContext *rt, const char *name, int id) | |||||
| { | |||||
| void *ptr; | |||||
| if (rt->nb_tracked_methods + 1 > rt->tracked_methods_size) { | |||||
| rt->tracked_methods_size = (rt->nb_tracked_methods + 1) * 2; | |||||
| ptr = av_realloc(rt->tracked_methods, | |||||
| rt->tracked_methods_size * sizeof(*rt->tracked_methods)); | |||||
| if (!ptr) | |||||
| return AVERROR(ENOMEM); | |||||
| rt->tracked_methods = ptr; | |||||
| } | |||||
| rt->tracked_methods[rt->nb_tracked_methods].name = av_strdup(name); | |||||
| if (!rt->tracked_methods[rt->nb_tracked_methods].name) | |||||
| return AVERROR(ENOMEM); | |||||
| rt->tracked_methods[rt->nb_tracked_methods].id = id; | |||||
| rt->nb_tracked_methods++; | |||||
| return 0; | |||||
| } | |||||
| static void del_tracked_method(RTMPContext *rt, int index) | |||||
| { | |||||
| memmove(&rt->tracked_methods[index], &rt->tracked_methods[index + 1], | |||||
| sizeof(*rt->tracked_methods) * (rt->nb_tracked_methods - index - 1)); | |||||
| rt->nb_tracked_methods--; | |||||
| } | |||||
| static void free_tracked_methods(RTMPContext *rt) | |||||
| { | |||||
| int i; | |||||
| for (i = 0; i < rt->nb_tracked_methods; i ++) | |||||
| av_free(rt->tracked_methods[i].name); | |||||
| av_free(rt->tracked_methods); | |||||
| } | |||||
| static int rtmp_send_packet(RTMPContext *rt, RTMPPacket *pkt, int track) | |||||
| { | |||||
| int ret; | |||||
| if (pkt->type == RTMP_PT_INVOKE && track) { | |||||
| GetByteContext gbc; | |||||
| char name[128]; | |||||
| double pkt_id; | |||||
| int len; | |||||
| bytestream2_init(&gbc, pkt->data, pkt->data_size); | |||||
| if ((ret = ff_amf_read_string(&gbc, name, sizeof(name), &len)) < 0) | |||||
| goto fail; | |||||
| if ((ret = ff_amf_read_number(&gbc, &pkt_id)) < 0) | |||||
| goto fail; | |||||
| if ((ret = add_tracked_method(rt, name, pkt_id)) < 0) | |||||
| goto fail; | |||||
| } | |||||
| ret = ff_rtmp_packet_write(rt->stream, pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| fail: | |||||
| ff_rtmp_packet_destroy(pkt); | |||||
| return ret; | |||||
| } | |||||
| static int rtmp_write_amf_data(URLContext *s, char *param, uint8_t **p) | static int rtmp_write_amf_data(URLContext *s, char *param, uint8_t **p) | ||||
| { | { | ||||
| char *field, *value; | char *field, *value; | ||||
| @@ -269,11 +339,7 @@ static int gen_connect(URLContext *s, RTMPContext *rt) | |||||
| pkt.data_size = p - pkt.data; | pkt.data_size = p - pkt.data; | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 1); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -297,11 +363,7 @@ static int gen_release_stream(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_null(&p); | ff_amf_write_null(&p); | ||||
| ff_amf_write_string(&p, rt->playpath); | ff_amf_write_string(&p, rt->playpath); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -325,11 +387,7 @@ static int gen_fcpublish_stream(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_null(&p); | ff_amf_write_null(&p); | ||||
| ff_amf_write_string(&p, rt->playpath); | ff_amf_write_string(&p, rt->playpath); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -353,11 +411,7 @@ static int gen_fcunpublish_stream(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_null(&p); | ff_amf_write_null(&p); | ||||
| ff_amf_write_string(&p, rt->playpath); | ff_amf_write_string(&p, rt->playpath); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -380,13 +434,8 @@ static int gen_create_stream(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_string(&p, "createStream"); | ff_amf_write_string(&p, "createStream"); | ||||
| ff_amf_write_number(&p, ++rt->nb_invokes); | ff_amf_write_number(&p, ++rt->nb_invokes); | ||||
| ff_amf_write_null(&p); | ff_amf_write_null(&p); | ||||
| rt->create_stream_invoke = rt->nb_invokes; | |||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 1); | |||||
| } | } | ||||
| @@ -412,11 +461,7 @@ static int gen_delete_stream(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_null(&p); | ff_amf_write_null(&p); | ||||
| ff_amf_write_number(&p, rt->main_channel_id); | ff_amf_write_number(&p, rt->main_channel_id); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -437,11 +482,7 @@ static int gen_buffer_time(URLContext *s, RTMPContext *rt) | |||||
| bytestream_put_be32(&p, rt->main_channel_id); | bytestream_put_be32(&p, rt->main_channel_id); | ||||
| bytestream_put_be32(&p, rt->client_buffer_time); | bytestream_put_be32(&p, rt->client_buffer_time); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -469,11 +510,7 @@ static int gen_play(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_string(&p, rt->playpath); | ff_amf_write_string(&p, rt->playpath); | ||||
| ff_amf_write_number(&p, rt->live); | ff_amf_write_number(&p, rt->live); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 1); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -500,11 +537,7 @@ static int gen_publish(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_string(&p, rt->playpath); | ff_amf_write_string(&p, rt->playpath); | ||||
| ff_amf_write_string(&p, "live"); | ff_amf_write_string(&p, "live"); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 1); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -529,11 +562,8 @@ static int gen_pong(URLContext *s, RTMPContext *rt, RTMPPacket *ppkt) | |||||
| p = pkt.data; | p = pkt.data; | ||||
| bytestream_put_be16(&p, 7); | bytestream_put_be16(&p, 7); | ||||
| bytestream_put_be32(&p, AV_RB32(ppkt->data+2)); | bytestream_put_be32(&p, AV_RB32(ppkt->data+2)); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -551,11 +581,8 @@ static int gen_server_bw(URLContext *s, RTMPContext *rt) | |||||
| p = pkt.data; | p = pkt.data; | ||||
| bytestream_put_be32(&p, rt->server_bw); | bytestream_put_be32(&p, rt->server_bw); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -576,11 +603,7 @@ static int gen_check_bw(URLContext *s, RTMPContext *rt) | |||||
| ff_amf_write_number(&p, RTMP_NOTIFICATION); | ff_amf_write_number(&p, RTMP_NOTIFICATION); | ||||
| ff_amf_write_null(&p); | ff_amf_write_null(&p); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -598,11 +621,8 @@ static int gen_bytes_read(URLContext *s, RTMPContext *rt, uint32_t ts) | |||||
| p = pkt.data; | p = pkt.data; | ||||
| bytestream_put_be32(&p, rt->bytes_read); | bytestream_put_be32(&p, rt->bytes_read); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 0); | |||||
| } | } | ||||
| static int gen_fcsubscribe_stream(URLContext *s, RTMPContext *rt, | static int gen_fcsubscribe_stream(URLContext *s, RTMPContext *rt, | ||||
| @@ -622,11 +642,7 @@ static int gen_fcsubscribe_stream(URLContext *s, RTMPContext *rt, | |||||
| ff_amf_write_null(&p); | ff_amf_write_null(&p); | ||||
| ff_amf_write_string(&p, subscribe); | ff_amf_write_string(&p, subscribe); | ||||
| ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, | |||||
| rt->prev_pkt[1]); | |||||
| ff_rtmp_packet_destroy(&pkt); | |||||
| return ret; | |||||
| return rtmp_send_packet(rt, &pkt, 1); | |||||
| } | } | ||||
| int ff_rtmp_calc_digest(const uint8_t *src, int len, int gap, | int ff_rtmp_calc_digest(const uint8_t *src, int len, int gap, | ||||
| @@ -1010,7 +1026,8 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt) | |||||
| RTMPContext *rt = s->priv_data; | RTMPContext *rt = s->priv_data; | ||||
| int i, t; | int i, t; | ||||
| const uint8_t *data_end = pkt->data + pkt->data_size; | const uint8_t *data_end = pkt->data + pkt->data_size; | ||||
| int ret; | |||||
| char *tracked_method = NULL; | |||||
| int ret = 0; | |||||
| //TODO: check for the messages sent for wrong state? | //TODO: check for the messages sent for wrong state? | ||||
| if (!memcmp(pkt->data, "\002\000\006_error", 9)) { | if (!memcmp(pkt->data, "\002\000\006_error", 9)) { | ||||
| @@ -1021,68 +1038,72 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt) | |||||
| av_log(s, AV_LOG_ERROR, "Server error: %s\n",tmpstr); | av_log(s, AV_LOG_ERROR, "Server error: %s\n",tmpstr); | ||||
| return -1; | return -1; | ||||
| } else if (!memcmp(pkt->data, "\002\000\007_result", 10)) { | } else if (!memcmp(pkt->data, "\002\000\007_result", 10)) { | ||||
| switch (rt->state) { | |||||
| case STATE_HANDSHAKED: | |||||
| if (!rt->is_input) { | |||||
| if ((ret = gen_release_stream(s, rt)) < 0) | |||||
| return ret; | |||||
| if ((ret = gen_fcpublish_stream(s, rt)) < 0) | |||||
| return ret; | |||||
| rt->state = STATE_RELEASING; | |||||
| } else { | |||||
| if ((ret = gen_server_bw(s, rt)) < 0) | |||||
| return ret; | |||||
| rt->state = STATE_CONNECTING; | |||||
| } | |||||
| if ((ret = gen_create_stream(s, rt)) < 0) | |||||
| return ret; | |||||
| if (rt->is_input) { | |||||
| /* Send the FCSubscribe command when the name of live | |||||
| * stream is defined by the user or if it's a live stream. */ | |||||
| if (rt->subscribe) { | |||||
| if ((ret = gen_fcsubscribe_stream(s, rt, | |||||
| rt->subscribe)) < 0) | |||||
| return ret; | |||||
| } else if (rt->live == -1) { | |||||
| if ((ret = gen_fcsubscribe_stream(s, rt, | |||||
| rt->playpath)) < 0) | |||||
| return ret; | |||||
| } | |||||
| } | |||||
| break; | |||||
| case STATE_FCPUBLISH: | |||||
| rt->state = STATE_CONNECTING; | |||||
| break; | |||||
| case STATE_RELEASING: | |||||
| rt->state = STATE_FCPUBLISH; | |||||
| /* hack for Wowza Media Server, it does not send result for | |||||
| * releaseStream and FCPublish calls */ | |||||
| if (!pkt->data[10]) { | |||||
| int pkt_id = av_int2double(AV_RB64(pkt->data + 11)); | |||||
| if (pkt_id == rt->create_stream_invoke) | |||||
| rt->state = STATE_CONNECTING; | |||||
| } | |||||
| if (rt->state != STATE_CONNECTING) | |||||
| break; | |||||
| case STATE_CONNECTING: | |||||
| //extract a number from the result | |||||
| if (pkt->data[10] || pkt->data[19] != 5 || pkt->data[20]) { | |||||
| av_log(s, AV_LOG_WARNING, "Unexpected reply on connect()\n"); | |||||
| } else { | |||||
| rt->main_channel_id = av_int2double(AV_RB64(pkt->data + 21)); | |||||
| } | |||||
| if (rt->is_input) { | |||||
| if ((ret = gen_play(s, rt)) < 0) | |||||
| return ret; | |||||
| if ((ret = gen_buffer_time(s, rt)) < 0) | |||||
| return ret; | |||||
| } else { | |||||
| if ((ret = gen_publish(s, rt)) < 0) | |||||
| return ret; | |||||
| GetByteContext gbc; | |||||
| double pkt_id; | |||||
| bytestream2_init(&gbc, pkt->data + 10, pkt->data_size); | |||||
| if ((ret = ff_amf_read_number(&gbc, &pkt_id)) < 0) | |||||
| return ret; | |||||
| for (i = 0; i < rt->nb_tracked_methods; i++) { | |||||
| if (rt->tracked_methods[i].id != pkt_id) | |||||
| continue; | |||||
| tracked_method = rt->tracked_methods[i].name; | |||||
| del_tracked_method(rt, i); | |||||
| break; | |||||
| } | |||||
| if (!tracked_method) { | |||||
| /* Ignore this reply when the current method is not tracked. */ | |||||
| return 0; | |||||
| } | |||||
| if (!memcmp(tracked_method, "connect", 7)) { | |||||
| if (!rt->is_input) { | |||||
| if ((ret = gen_release_stream(s, rt)) < 0) | |||||
| goto invoke_fail; | |||||
| if ((ret = gen_fcpublish_stream(s, rt)) < 0) | |||||
| goto invoke_fail; | |||||
| } else { | |||||
| if ((ret = gen_server_bw(s, rt)) < 0) | |||||
| goto invoke_fail; | |||||
| } | |||||
| if ((ret = gen_create_stream(s, rt)) < 0) | |||||
| goto invoke_fail; | |||||
| if (rt->is_input) { | |||||
| /* Send the FCSubscribe command when the name of live | |||||
| * stream is defined by the user or if it's a live stream. */ | |||||
| if (rt->subscribe) { | |||||
| if ((ret = gen_fcsubscribe_stream(s, rt, | |||||
| rt->subscribe)) < 0) | |||||
| goto invoke_fail; | |||||
| } else if (rt->live == -1) { | |||||
| if ((ret = gen_fcsubscribe_stream(s, rt, | |||||
| rt->playpath)) < 0) | |||||
| goto invoke_fail; | |||||
| } | } | ||||
| rt->state = STATE_READY; | |||||
| break; | |||||
| } | |||||
| } else if (!memcmp(tracked_method, "createStream", 12)) { | |||||
| //extract a number from the result | |||||
| if (pkt->data[10] || pkt->data[19] != 5 || pkt->data[20]) { | |||||
| av_log(s, AV_LOG_WARNING, "Unexpected reply on connect()\n"); | |||||
| } else { | |||||
| rt->main_channel_id = av_int2double(AV_RB64(pkt->data + 21)); | |||||
| } | |||||
| if (!rt->is_input) { | |||||
| if ((ret = gen_publish(s, rt)) < 0) | |||||
| goto invoke_fail; | |||||
| } else { | |||||
| if ((ret = gen_play(s, rt)) < 0) | |||||
| goto invoke_fail; | |||||
| if ((ret = gen_buffer_time(s, rt)) < 0) | |||||
| goto invoke_fail; | |||||
| } | |||||
| } | } | ||||
| } else if (!memcmp(pkt->data, "\002\000\010onStatus", 11)) { | } else if (!memcmp(pkt->data, "\002\000\010onStatus", 11)) { | ||||
| const uint8_t* ptr = pkt->data + 11; | const uint8_t* ptr = pkt->data + 11; | ||||
| @@ -1113,7 +1134,9 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| return 0; | |||||
| invoke_fail: | |||||
| av_free(tracked_method); | |||||
| return ret; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -1283,6 +1306,7 @@ static int rtmp_close(URLContext *h) | |||||
| if (rt->state > STATE_HANDSHAKED) | if (rt->state > STATE_HANDSHAKED) | ||||
| ret = gen_delete_stream(h, rt); | ret = gen_delete_stream(h, rt); | ||||
| free_tracked_methods(rt); | |||||
| av_freep(&rt->flv_data); | av_freep(&rt->flv_data); | ||||
| ffurl_close(rt->stream); | ffurl_close(rt->stream); | ||||
| return ret; | return ret; | ||||
| @@ -1570,10 +1594,8 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) | |||||
| if (rt->flv_off == rt->flv_size) { | if (rt->flv_off == rt->flv_size) { | ||||
| rt->skip_bytes = 4; | rt->skip_bytes = 4; | ||||
| if ((ret = ff_rtmp_packet_write(rt->stream, &rt->out_pkt, | |||||
| rt->chunk_size, rt->prev_pkt[1])) < 0) | |||||
| if ((ret = rtmp_send_packet(rt, &rt->out_pkt, 0)) < 0) | |||||
| return ret; | return ret; | ||||
| ff_rtmp_packet_destroy(&rt->out_pkt); | |||||
| rt->flv_size = 0; | rt->flv_size = 0; | ||||
| rt->flv_off = 0; | rt->flv_off = 0; | ||||
| rt->flv_header_bytes = 0; | rt->flv_header_bytes = 0; | ||||
| @@ -37,7 +37,6 @@ | |||||
| #include "libavutil/avstring.h" | #include "libavutil/avstring.h" | ||||
| #include "libavcodec/get_bits.h" | #include "libavcodec/get_bits.h" | ||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "mpegts.h" | |||||
| #include "network.h" | #include "network.h" | ||||
| #include <assert.h> | #include <assert.h> | ||||
| @@ -281,8 +281,8 @@ void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) | |||||
| /* send an integer number of samples and compute time stamp and fill | /* send an integer number of samples and compute time stamp and fill | ||||
| the rtp send buffer before sending. */ | the rtp send buffer before sending. */ | ||||
| static void rtp_send_samples(AVFormatContext *s1, | |||||
| const uint8_t *buf1, int size, int sample_size_bits) | |||||
| static int rtp_send_samples(AVFormatContext *s1, | |||||
| const uint8_t *buf1, int size, int sample_size_bits) | |||||
| { | { | ||||
| RTPMuxContext *s = s1->priv_data; | RTPMuxContext *s = s1->priv_data; | ||||
| int len, max_packet_size, n; | int len, max_packet_size, n; | ||||
| @@ -292,7 +292,7 @@ static void rtp_send_samples(AVFormatContext *s1, | |||||
| max_packet_size = (s->max_payload_size / aligned_samples_size) * aligned_samples_size; | max_packet_size = (s->max_payload_size / aligned_samples_size) * aligned_samples_size; | ||||
| /* Not needed, but who knows. Don't check if samples aren't an even number of bytes. */ | /* Not needed, but who knows. Don't check if samples aren't an even number of bytes. */ | ||||
| if ((sample_size_bits % 8) == 0 && ((8 * size) % sample_size_bits) != 0) | if ((sample_size_bits % 8) == 0 && ((8 * size) % sample_size_bits) != 0) | ||||
| av_abort(); | |||||
| return AVERROR(EINVAL); | |||||
| n = 0; | n = 0; | ||||
| while (size > 0) { | while (size > 0) { | ||||
| s->buf_ptr = s->buf; | s->buf_ptr = s->buf; | ||||
| @@ -307,6 +307,7 @@ static void rtp_send_samples(AVFormatContext *s1, | |||||
| ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); | ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); | ||||
| n += (s->buf_ptr - s->buf); | n += (s->buf_ptr - s->buf); | ||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| static void rtp_send_mpegaudio(AVFormatContext *s1, | static void rtp_send_mpegaudio(AVFormatContext *s1, | ||||
| @@ -461,25 +462,21 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) | |||||
| case AV_CODEC_ID_PCM_ALAW: | case AV_CODEC_ID_PCM_ALAW: | ||||
| case AV_CODEC_ID_PCM_U8: | case AV_CODEC_ID_PCM_U8: | ||||
| case AV_CODEC_ID_PCM_S8: | case AV_CODEC_ID_PCM_S8: | ||||
| rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels); | |||||
| break; | |||||
| return rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels); | |||||
| case AV_CODEC_ID_PCM_U16BE: | case AV_CODEC_ID_PCM_U16BE: | ||||
| case AV_CODEC_ID_PCM_U16LE: | case AV_CODEC_ID_PCM_U16LE: | ||||
| case AV_CODEC_ID_PCM_S16BE: | case AV_CODEC_ID_PCM_S16BE: | ||||
| case AV_CODEC_ID_PCM_S16LE: | case AV_CODEC_ID_PCM_S16LE: | ||||
| rtp_send_samples(s1, pkt->data, size, 16 * st->codec->channels); | |||||
| break; | |||||
| return rtp_send_samples(s1, pkt->data, size, 16 * st->codec->channels); | |||||
| case AV_CODEC_ID_ADPCM_G722: | case AV_CODEC_ID_ADPCM_G722: | ||||
| /* The actual sample size is half a byte per sample, but since the | /* The actual sample size is half a byte per sample, but since the | ||||
| * stream clock rate is 8000 Hz while the sample rate is 16000 Hz, | * stream clock rate is 8000 Hz while the sample rate is 16000 Hz, | ||||
| * the correct parameter for send_samples_bits is 8 bits per stream | * the correct parameter for send_samples_bits is 8 bits per stream | ||||
| * clock. */ | * clock. */ | ||||
| rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels); | |||||
| break; | |||||
| return rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels); | |||||
| case AV_CODEC_ID_ADPCM_G726: | case AV_CODEC_ID_ADPCM_G726: | ||||
| rtp_send_samples(s1, pkt->data, size, | |||||
| st->codec->bits_per_coded_sample * st->codec->channels); | |||||
| break; | |||||
| return rtp_send_samples(s1, pkt->data, size, | |||||
| st->codec->bits_per_coded_sample * st->codec->channels); | |||||
| case AV_CODEC_ID_MP2: | case AV_CODEC_ID_MP2: | ||||
| case AV_CODEC_ID_MP3: | case AV_CODEC_ID_MP3: | ||||
| rtp_send_mpegaudio(s1, pkt->data, size); | rtp_send_mpegaudio(s1, pkt->data, size); | ||||
| @@ -46,6 +46,7 @@ | |||||
| #include "rtpenc_chain.h" | #include "rtpenc_chain.h" | ||||
| #include "url.h" | #include "url.h" | ||||
| #include "rtpenc.h" | #include "rtpenc.h" | ||||
| #include "mpegts.h" | |||||
| //#define DEBUG | //#define DEBUG | ||||
| @@ -370,7 +371,9 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, | |||||
| get_word(buf1, sizeof(buf1), &p); /* port */ | get_word(buf1, sizeof(buf1), &p); /* port */ | ||||
| rtsp_st->sdp_port = atoi(buf1); | rtsp_st->sdp_port = atoi(buf1); | ||||
| get_word(buf1, sizeof(buf1), &p); /* protocol (ignored) */ | |||||
| get_word(buf1, sizeof(buf1), &p); /* protocol */ | |||||
| if (!strcmp(buf1, "udp")) | |||||
| rt->transport = RTSP_TRANSPORT_RAW; | |||||
| /* XXX: handle list of formats */ | /* XXX: handle list of formats */ | ||||
| get_word(buf1, sizeof(buf1), &p); /* format list */ | get_word(buf1, sizeof(buf1), &p); /* format list */ | ||||
| @@ -378,6 +381,8 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, | |||||
| if (!strcmp(ff_rtp_enc_name(rtsp_st->sdp_payload_type), "MP2T")) { | if (!strcmp(ff_rtp_enc_name(rtsp_st->sdp_payload_type), "MP2T")) { | ||||
| /* no corresponding stream */ | /* no corresponding stream */ | ||||
| if (rt->transport == RTSP_TRANSPORT_RAW && !rt->ts && CONFIG_RTPDEC) | |||||
| rt->ts = ff_mpegts_parse_open(s); | |||||
| } else if (rt->server_type == RTSP_SERVER_WMS && | } else if (rt->server_type == RTSP_SERVER_WMS && | ||||
| codec_type == AVMEDIA_TYPE_DATA) { | codec_type == AVMEDIA_TYPE_DATA) { | ||||
| /* RTX stream, a stream that carries all the other actual | /* RTX stream, a stream that carries all the other actual | ||||
| @@ -563,7 +568,7 @@ void ff_rtsp_undo_setup(AVFormatContext *s) | |||||
| avformat_free_context(rtpctx); | avformat_free_context(rtpctx); | ||||
| } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC) | } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC) | ||||
| ff_rdt_parse_close(rtsp_st->transport_priv); | ff_rdt_parse_close(rtsp_st->transport_priv); | ||||
| else if (CONFIG_RTPDEC) | |||||
| else if (rt->transport == RTSP_TRANSPORT_RAW && CONFIG_RTPDEC) | |||||
| ff_rtp_parse_close(rtsp_st->transport_priv); | ff_rtp_parse_close(rtsp_st->transport_priv); | ||||
| } | } | ||||
| rtsp_st->transport_priv = NULL; | rtsp_st->transport_priv = NULL; | ||||
| @@ -594,6 +599,8 @@ void ff_rtsp_close_streams(AVFormatContext *s) | |||||
| if (rt->asf_ctx) { | if (rt->asf_ctx) { | ||||
| avformat_close_input(&rt->asf_ctx); | avformat_close_input(&rt->asf_ctx); | ||||
| } | } | ||||
| if (rt->ts && CONFIG_RTPDEC) | |||||
| ff_mpegts_parse_close(rt->ts); | |||||
| av_free(rt->p); | av_free(rt->p); | ||||
| av_free(rt->recvbuf); | av_free(rt->recvbuf); | ||||
| } | } | ||||
| @@ -617,6 +624,8 @@ int ff_rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st) | |||||
| rtsp_st->rtp_handle = NULL; | rtsp_st->rtp_handle = NULL; | ||||
| if (ret < 0) | if (ret < 0) | ||||
| return ret; | return ret; | ||||
| } else if (rt->transport == RTSP_TRANSPORT_RAW) { | |||||
| return 0; // Don't need to open any parser here | |||||
| } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC) | } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC) | ||||
| rtsp_st->transport_priv = ff_rdt_parse_open(s, st->index, | rtsp_st->transport_priv = ff_rdt_parse_open(s, st->index, | ||||
| rtsp_st->dynamic_protocol_context, | rtsp_st->dynamic_protocol_context, | ||||
| @@ -629,7 +638,7 @@ int ff_rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st) | |||||
| if (!rtsp_st->transport_priv) { | if (!rtsp_st->transport_priv) { | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| } else if (rt->transport != RTSP_TRANSPORT_RDT && CONFIG_RTPDEC) { | |||||
| } else if (rt->transport == RTSP_TRANSPORT_RTP && CONFIG_RTPDEC) { | |||||
| if (rtsp_st->dynamic_handler) { | if (rtsp_st->dynamic_handler) { | ||||
| ff_rtp_parse_set_dynamic_protocol(rtsp_st->transport_priv, | ff_rtp_parse_set_dynamic_protocol(rtsp_st->transport_priv, | ||||
| rtsp_st->dynamic_protocol_context, | rtsp_st->dynamic_protocol_context, | ||||
| @@ -698,6 +707,15 @@ static void rtsp_parse_transport(RTSPMessageHeader *reply, const char *p) | |||||
| get_word_sep(lower_transport, sizeof(lower_transport), "/;,", &p); | get_word_sep(lower_transport, sizeof(lower_transport), "/;,", &p); | ||||
| profile[0] = '\0'; | profile[0] = '\0'; | ||||
| th->transport = RTSP_TRANSPORT_RDT; | th->transport = RTSP_TRANSPORT_RDT; | ||||
| } else if (!av_strcasecmp(transport_protocol, "raw")) { | |||||
| get_word_sep(profile, sizeof(profile), "/;,", &p); | |||||
| lower_transport[0] = '\0'; | |||||
| /* raw/raw/<protocol> */ | |||||
| if (*p == '/') { | |||||
| get_word_sep(lower_transport, sizeof(lower_transport), | |||||
| ";,", &p); | |||||
| } | |||||
| th->transport = RTSP_TRANSPORT_RAW; | |||||
| } | } | ||||
| if (!av_strcasecmp(lower_transport, "TCP")) | if (!av_strcasecmp(lower_transport, "TCP")) | ||||
| th->lower_transport = RTSP_LOWER_TRANSPORT_TCP; | th->lower_transport = RTSP_LOWER_TRANSPORT_TCP; | ||||
| @@ -1187,6 +1205,8 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, | |||||
| if (rt->transport == RTSP_TRANSPORT_RDT) | if (rt->transport == RTSP_TRANSPORT_RDT) | ||||
| trans_pref = "x-pn-tng"; | trans_pref = "x-pn-tng"; | ||||
| else if (rt->transport == RTSP_TRANSPORT_RAW) | |||||
| trans_pref = "RAW/RAW"; | |||||
| else | else | ||||
| trans_pref = "RTP/AVP"; | trans_pref = "RTP/AVP"; | ||||
| @@ -1753,8 +1773,15 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| if (rt->cur_transport_priv) { | if (rt->cur_transport_priv) { | ||||
| if (rt->transport == RTSP_TRANSPORT_RDT) { | if (rt->transport == RTSP_TRANSPORT_RDT) { | ||||
| ret = ff_rdt_parse_packet(rt->cur_transport_priv, pkt, NULL, 0); | ret = ff_rdt_parse_packet(rt->cur_transport_priv, pkt, NULL, 0); | ||||
| } else | |||||
| } else if (rt->transport == RTSP_TRANSPORT_RTP) { | |||||
| ret = ff_rtp_parse_packet(rt->cur_transport_priv, pkt, NULL, 0); | ret = ff_rtp_parse_packet(rt->cur_transport_priv, pkt, NULL, 0); | ||||
| } else if (rt->ts && CONFIG_RTPDEC) { | |||||
| ret = ff_mpegts_parse_packet(rt->ts, pkt, rt->recvbuf + rt->recvbuf_pos, rt->recvbuf_len - rt->recvbuf_pos); | |||||
| if (ret >= 0) { | |||||
| rt->recvbuf_pos += ret; | |||||
| ret = rt->recvbuf_pos < rt->recvbuf_len; | |||||
| } | |||||
| } | |||||
| if (ret == 0) { | if (ret == 0) { | ||||
| rt->cur_transport_priv = NULL; | rt->cur_transport_priv = NULL; | ||||
| return 0; | return 0; | ||||
| @@ -1817,7 +1844,7 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| return AVERROR_EOF; | return AVERROR_EOF; | ||||
| if (rt->transport == RTSP_TRANSPORT_RDT) { | if (rt->transport == RTSP_TRANSPORT_RDT) { | ||||
| ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len); | ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len); | ||||
| } else { | |||||
| } else if (rt->transport == RTSP_TRANSPORT_RTP) { | |||||
| ret = ff_rtp_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len); | ret = ff_rtp_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len); | ||||
| if (ret < 0) { | if (ret < 0) { | ||||
| /* Either bad packet, or a RTCP packet. Check if the | /* Either bad packet, or a RTCP packet. Check if the | ||||
| @@ -1856,6 +1883,20 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| return AVERROR_EOF; | return AVERROR_EOF; | ||||
| } | } | ||||
| } | } | ||||
| } else if (rt->ts && CONFIG_RTPDEC) { | |||||
| ret = ff_mpegts_parse_packet(rt->ts, pkt, rt->recvbuf, len); | |||||
| if (ret >= 0) { | |||||
| if (ret < len) { | |||||
| rt->recvbuf_len = len; | |||||
| rt->recvbuf_pos = ret; | |||||
| rt->cur_transport_priv = rt->ts; | |||||
| return 1; | |||||
| } else { | |||||
| ret = 0; | |||||
| } | |||||
| } | |||||
| } else { | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | } | ||||
| end: | end: | ||||
| if (ret < 0) | if (ret < 0) | ||||
| @@ -52,6 +52,7 @@ enum RTSPLowerTransport { | |||||
| enum RTSPTransport { | enum RTSPTransport { | ||||
| RTSP_TRANSPORT_RTP, /**< Standards-compliant RTP */ | RTSP_TRANSPORT_RTP, /**< Standards-compliant RTP */ | ||||
| RTSP_TRANSPORT_RDT, /**< Realmedia Data Transport */ | RTSP_TRANSPORT_RDT, /**< Realmedia Data Transport */ | ||||
| RTSP_TRANSPORT_RAW, /**< Raw data (over UDP) */ | |||||
| RTSP_TRANSPORT_NB | RTSP_TRANSPORT_NB | ||||
| }; | }; | ||||
| @@ -310,6 +311,13 @@ typedef struct RTSPState { | |||||
| * other cases, this is a copy of AVFormatContext->filename. */ | * other cases, this is a copy of AVFormatContext->filename. */ | ||||
| char control_uri[1024]; | char control_uri[1024]; | ||||
| /** The following are used for parsing raw mpegts in udp */ | |||||
| //@{ | |||||
| struct MpegTSContext *ts; | |||||
| int recvbuf_pos; | |||||
| int recvbuf_len; | |||||
| //@} | |||||
| /** Additional output handle, used when input and output are done | /** Additional output handle, used when input and output are done | ||||
| * separately, eg for HTTP tunneling. */ | * separately, eg for HTTP tunneling. */ | ||||
| URLContext *rtsp_hd_out; | URLContext *rtsp_hd_out; | ||||
| @@ -31,7 +31,7 @@ | |||||
| #define LIBAVFORMAT_VERSION_MAJOR 54 | #define LIBAVFORMAT_VERSION_MAJOR 54 | ||||
| #define LIBAVFORMAT_VERSION_MINOR 22 | #define LIBAVFORMAT_VERSION_MINOR 22 | ||||
| #define LIBAVFORMAT_VERSION_MICRO 103 | |||||
| #define LIBAVFORMAT_VERSION_MICRO 104 | |||||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||
| LIBAVFORMAT_VERSION_MINOR, \ | LIBAVFORMAT_VERSION_MINOR, \ | ||||
| @@ -93,38 +93,10 @@ struct AVDictionary { | |||||
| # define offsetof(T, F) ((unsigned int)((char *)&((T *)0)->F)) | # define offsetof(T, F) ((unsigned int)((char *)&((T *)0)->F)) | ||||
| #endif | #endif | ||||
| /* Use to export labels from asm. */ | |||||
| #define LABEL_MANGLE(a) EXTERN_PREFIX #a | |||||
| // Use rip-relative addressing if compiling PIC code on x86-64. | |||||
| #if ARCH_X86_64 && defined(PIC) | |||||
| # define LOCAL_MANGLE(a) #a "(%%rip)" | |||||
| #else | |||||
| # define LOCAL_MANGLE(a) #a | |||||
| #endif | |||||
| #define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a) | |||||
| /* debug stuff */ | /* debug stuff */ | ||||
| #define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0) | #define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0) | ||||
| /* math */ | |||||
| #if ARCH_X86 && HAVE_INLINE_ASM | |||||
| #define MASK_ABS(mask, level)\ | |||||
| __asm__ volatile(\ | |||||
| "cltd \n\t"\ | |||||
| "xorl %1, %0 \n\t"\ | |||||
| "subl %1, %0 \n\t"\ | |||||
| : "+a" (level), "=&d" (mask)\ | |||||
| ); | |||||
| #else | |||||
| #define MASK_ABS(mask, level)\ | |||||
| mask = level >> 31;\ | |||||
| level = (level ^ mask) - mask; | |||||
| #endif | |||||
| /* avoid usage of dangerous/inappropriate system functions */ | /* avoid usage of dangerous/inappropriate system functions */ | ||||
| #undef malloc | #undef malloc | ||||
| #define malloc please_use_av_malloc | #define malloc please_use_av_malloc | ||||
| @@ -0,0 +1,110 @@ | |||||
| /* | |||||
| * copyright (c) 2006 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 Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * FFmpeg is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * 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_X86_ASM_H | |||||
| #define AVUTIL_X86_ASM_H | |||||
| #include <stdint.h> | |||||
| #include "config.h" | |||||
| #if ARCH_X86_64 | |||||
| # define OPSIZE "q" | |||||
| # define REG_a "rax" | |||||
| # define REG_b "rbx" | |||||
| # define REG_c "rcx" | |||||
| # define REG_d "rdx" | |||||
| # define REG_D "rdi" | |||||
| # define REG_S "rsi" | |||||
| # define PTR_SIZE "8" | |||||
| typedef int64_t x86_reg; | |||||
| # define REG_SP "rsp" | |||||
| # define REG_BP "rbp" | |||||
| # define REGBP rbp | |||||
| # define REGa rax | |||||
| # define REGb rbx | |||||
| # define REGc rcx | |||||
| # define REGd rdx | |||||
| # define REGSP rsp | |||||
| #elif ARCH_X86_32 | |||||
| # define OPSIZE "l" | |||||
| # define REG_a "eax" | |||||
| # define REG_b "ebx" | |||||
| # define REG_c "ecx" | |||||
| # define REG_d "edx" | |||||
| # define REG_D "edi" | |||||
| # define REG_S "esi" | |||||
| # define PTR_SIZE "4" | |||||
| typedef int32_t x86_reg; | |||||
| # define REG_SP "esp" | |||||
| # define REG_BP "ebp" | |||||
| # define REGBP ebp | |||||
| # define REGa eax | |||||
| # define REGb ebx | |||||
| # define REGc ecx | |||||
| # define REGd edx | |||||
| # define REGSP esp | |||||
| #else | |||||
| typedef int x86_reg; | |||||
| #endif | |||||
| #define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE && HAVE_EBP_AVAILABLE)) | |||||
| #define HAVE_6REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE || HAVE_EBP_AVAILABLE)) | |||||
| #if ARCH_X86_64 && defined(PIC) | |||||
| # define BROKEN_RELOCATIONS 1 | |||||
| #endif | |||||
| /* | |||||
| * If gcc is not set to support sse (-msse) it will not accept xmm registers | |||||
| * in the clobber list for inline asm. XMM_CLOBBERS takes a list of xmm | |||||
| * registers to be marked as clobbered and evaluates to nothing if they are | |||||
| * not supported, or to the list itself if they are supported. Since a clobber | |||||
| * list may not be empty, XMM_CLOBBERS_ONLY should be used if the xmm | |||||
| * registers are the only in the clobber list. | |||||
| * For example a list with "eax" and "xmm0" as clobbers should become: | |||||
| * : XMM_CLOBBERS("xmm0",) "eax" | |||||
| * and a list with only "xmm0" should become: | |||||
| * XMM_CLOBBERS_ONLY("xmm0") | |||||
| */ | |||||
| #if HAVE_XMM_CLOBBERS | |||||
| # define XMM_CLOBBERS(...) __VA_ARGS__ | |||||
| # define XMM_CLOBBERS_ONLY(...) : __VA_ARGS__ | |||||
| #else | |||||
| # define XMM_CLOBBERS(...) | |||||
| # define XMM_CLOBBERS_ONLY(...) | |||||
| #endif | |||||
| /* Use to export labels from asm. */ | |||||
| #define LABEL_MANGLE(a) EXTERN_PREFIX #a | |||||
| // Use rip-relative addressing if compiling PIC code on x86-64. | |||||
| #if ARCH_X86_64 && defined(PIC) | |||||
| # define LOCAL_MANGLE(a) #a "(%%rip)" | |||||
| #else | |||||
| # define LOCAL_MANGLE(a) #a | |||||
| #endif | |||||
| #define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a) | |||||
| #endif /* AVUTIL_X86_ASM_H */ | |||||
| @@ -22,7 +22,7 @@ | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #if HAVE_INLINE_ASM | #if HAVE_INLINE_ASM | ||||
| @@ -1,98 +1 @@ | |||||
| /* | |||||
| * copyright (c) 2006 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 Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * FFmpeg is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * 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_X86_CPU_H | |||||
| #define AVUTIL_X86_CPU_H | |||||
| #include <stdint.h> | |||||
| #include "config.h" | |||||
| #if ARCH_X86_64 | |||||
| # define OPSIZE "q" | |||||
| # define REG_a "rax" | |||||
| # define REG_b "rbx" | |||||
| # define REG_c "rcx" | |||||
| # define REG_d "rdx" | |||||
| # define REG_D "rdi" | |||||
| # define REG_S "rsi" | |||||
| # define PTR_SIZE "8" | |||||
| typedef int64_t x86_reg; | |||||
| # define REG_SP "rsp" | |||||
| # define REG_BP "rbp" | |||||
| # define REGBP rbp | |||||
| # define REGa rax | |||||
| # define REGb rbx | |||||
| # define REGc rcx | |||||
| # define REGd rdx | |||||
| # define REGSP rsp | |||||
| #elif ARCH_X86_32 | |||||
| # define OPSIZE "l" | |||||
| # define REG_a "eax" | |||||
| # define REG_b "ebx" | |||||
| # define REG_c "ecx" | |||||
| # define REG_d "edx" | |||||
| # define REG_D "edi" | |||||
| # define REG_S "esi" | |||||
| # define PTR_SIZE "4" | |||||
| typedef int32_t x86_reg; | |||||
| # define REG_SP "esp" | |||||
| # define REG_BP "ebp" | |||||
| # define REGBP ebp | |||||
| # define REGa eax | |||||
| # define REGb ebx | |||||
| # define REGc ecx | |||||
| # define REGd edx | |||||
| # define REGSP esp | |||||
| #else | |||||
| typedef int x86_reg; | |||||
| #endif | |||||
| #define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE && HAVE_EBP_AVAILABLE)) | |||||
| #define HAVE_6REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE || HAVE_EBP_AVAILABLE)) | |||||
| #if ARCH_X86_64 && defined(PIC) | |||||
| # define BROKEN_RELOCATIONS 1 | |||||
| #endif | |||||
| /* | |||||
| * If gcc is not set to support sse (-msse) it will not accept xmm registers | |||||
| * in the clobber list for inline asm. XMM_CLOBBERS takes a list of xmm | |||||
| * registers to be marked as clobbered and evaluates to nothing if they are | |||||
| * not supported, or to the list itself if they are supported. Since a clobber | |||||
| * list may not be empty, XMM_CLOBBERS_ONLY should be used if the xmm | |||||
| * registers are the only in the clobber list. | |||||
| * For example a list with "eax" and "xmm0" as clobbers should become: | |||||
| * : XMM_CLOBBERS("xmm0",) "eax" | |||||
| * and a list with only "xmm0" should become: | |||||
| * XMM_CLOBBERS_ONLY("xmm0") | |||||
| */ | |||||
| #if HAVE_XMM_CLOBBERS | |||||
| # define XMM_CLOBBERS(...) __VA_ARGS__ | |||||
| # define XMM_CLOBBERS_ONLY(...) : __VA_ARGS__ | |||||
| #else | |||||
| # define XMM_CLOBBERS(...) | |||||
| # define XMM_CLOBBERS_ONLY(...) | |||||
| #endif | |||||
| #endif /* AVUTIL_X86_CPU_H */ | |||||
| #include "libavutil/x86/asm.h" | |||||
| @@ -23,7 +23,7 @@ | |||||
| * mmx/mmx2/3dnow postprocess code. | * mmx/mmx2/3dnow postprocess code. | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #undef REAL_PAVGB | #undef REAL_PAVGB | ||||
| #undef PAVGB | #undef PAVGB | ||||
| @@ -18,7 +18,7 @@ | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libswresample/swresample_internal.h" | #include "libswresample/swresample_internal.h" | ||||
| @@ -46,7 +46,7 @@ | |||||
| #include "libavutil/mathematics.h" | #include "libavutil/mathematics.h" | ||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||
| #include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "rgb2rgb.h" | #include "rgb2rgb.h" | ||||
| #include "swscale.h" | #include "swscale.h" | ||||
| #include "swscale_internal.h" | #include "swscale_internal.h" | ||||
| @@ -27,7 +27,7 @@ | |||||
| #include "config.h" | #include "config.h" | ||||
| #include "libavutil/attributes.h" | #include "libavutil/attributes.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/bswap.h" | #include "libavutil/bswap.h" | ||||
| #include "libswscale/rgb2rgb.h" | #include "libswscale/rgb2rgb.h" | ||||
| @@ -25,7 +25,7 @@ | |||||
| #include "libavutil/attributes.h" | #include "libavutil/attributes.h" | ||||
| #include "libavutil/avassert.h" | #include "libavutil/avassert.h" | ||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||
| @@ -34,7 +34,7 @@ | |||||
| #include "libswscale/swscale.h" | #include "libswscale/swscale.h" | ||||
| #include "libswscale/swscale_internal.h" | #include "libswscale/swscale_internal.h" | ||||
| #include "libavutil/attributes.h" | #include "libavutil/attributes.h" | ||||
| #include "libavutil/x86_cpu.h" | |||||
| #include "libavutil/x86/asm.h" | |||||
| #include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
| #if HAVE_INLINE_ASM | #if HAVE_INLINE_ASM | ||||