Merge remote-tracking branch 'qatar/master'
* 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>
This commit is contained in:
commit
9f088a1ed4
46
configure
vendored
46
configure
vendored
@ -1361,6 +1361,7 @@ CONFIG_EXTRA="
|
||||
lgplv3
|
||||
lpc
|
||||
mpegaudiodsp
|
||||
mpegvideo
|
||||
nettle
|
||||
rtpdec
|
||||
sinewin
|
||||
@ -1500,18 +1501,18 @@ atrac1_decoder_select="mdct sinewin"
|
||||
atrac3_decoder_select="mdct"
|
||||
binkaudio_dct_decoder_select="mdct rdft dct sinewin"
|
||||
binkaudio_rdft_decoder_select="mdct rdft sinewin"
|
||||
cavs_decoder_select="golomb"
|
||||
cavs_decoder_select="golomb mpegvideo"
|
||||
cook_decoder_select="mdct sinewin"
|
||||
cscd_decoder_suggest="zlib"
|
||||
dca_decoder_select="mdct"
|
||||
dirac_decoder_select="dwt golomb"
|
||||
dnxhd_encoder_select="aandcttables"
|
||||
dnxhd_encoder_select="aandcttables mpegvideo"
|
||||
dxa_decoder_select="zlib"
|
||||
eac3_decoder_select="ac3_decoder"
|
||||
eac3_encoder_select="mdct ac3dsp"
|
||||
eamad_decoder_select="aandcttables"
|
||||
eatgq_decoder_select="aandcttables"
|
||||
eatqi_decoder_select="aandcttables"
|
||||
eatqi_decoder_select="aandcttables mpegvideo"
|
||||
exr_decoder_select="zlib"
|
||||
ffv1_decoder_select="golomb"
|
||||
flac_decoder_select="golomb"
|
||||
@ -1523,14 +1524,15 @@ flashsv2_decoder_select="zlib"
|
||||
flv_decoder_select="h263_decoder"
|
||||
flv_encoder_select="h263_encoder"
|
||||
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"
|
||||
h263i_decoder_select="h263_decoder"
|
||||
h263p_encoder_select="h263_encoder"
|
||||
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_select="dxva2 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"
|
||||
jpegls_decoder_select="golomb"
|
||||
jpegls_encoder_select="golomb"
|
||||
ljpeg_encoder_select="aandcttables"
|
||||
ljpeg_encoder_select="aandcttables mpegvideo"
|
||||
loco_decoder_select="golomb"
|
||||
mjpeg_encoder_select="aandcttables"
|
||||
mdec_decoder_select="mpegvideo"
|
||||
mjpeg_encoder_select="aandcttables mpegvideo"
|
||||
mlp_decoder_select="mlp_parser"
|
||||
mp1_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"
|
||||
mpeg1_vdpau_decoder_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_dxva2_hwaccel_deps="dxva2api_h"
|
||||
mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder"
|
||||
mpeg2_vdpau_hwaccel_select="vdpau 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_decoder_select="h263_decoder mpeg4video_parser"
|
||||
mpeg4_encoder_select="h263_encoder"
|
||||
@ -1593,17 +1598,18 @@ rv10_decoder_select="h263_decoder"
|
||||
rv10_encoder_select="h263_encoder"
|
||||
rv20_decoder_select="h263_decoder"
|
||||
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"
|
||||
sipr_decoder_select="lsp"
|
||||
snow_decoder_select="dwt"
|
||||
snow_encoder_select="aandcttables dwt"
|
||||
snow_encoder_select="aandcttables dwt mpegvideo"
|
||||
sonic_decoder_select="golomb"
|
||||
sonic_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"
|
||||
theora_decoder_select="vp3_decoder"
|
||||
tiff_decoder_suggest="zlib"
|
||||
@ -1653,7 +1659,10 @@ vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
|
||||
vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
|
||||
|
||||
# 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
|
||||
libaacplus_encoder_deps="libaacplus"
|
||||
@ -1709,12 +1718,13 @@ matroska_demuxer_suggest="zlib bzlib"
|
||||
mov_demuxer_suggest="zlib"
|
||||
mp3_demuxer_select="mpegaudio_parser"
|
||||
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"
|
||||
mxf_d10_muxer_select="mxf_muxer"
|
||||
ogg_demuxer_select="golomb"
|
||||
psp_muxer_select="mov_muxer"
|
||||
rtp_demuxer_select="sdp_demuxer"
|
||||
rtp_muxer_select="mpegvideo"
|
||||
rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
|
||||
rtsp_demuxer_select="http_protocol rtpdec"
|
||||
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
|
||||
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
|
||||
@example
|
||||
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
|
||||
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv
|
||||
@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
|
||||
|
||||
As a special exception, you can use a bitmap subtitle stream as input: it
|
||||
|
21
ffmpeg.c
21
ffmpeg.c
@ -565,7 +565,7 @@ static int check_recording_time(OutputStream *ost)
|
||||
if (of->recording_time != INT64_MAX &&
|
||||
av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
|
||||
AV_TIME_BASE_Q) >= 0) {
|
||||
ost->is_past_recording_time = 1;
|
||||
ost->finished = 1;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
@ -1315,7 +1315,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
|
||||
|
||||
if (of->recording_time != INT64_MAX &&
|
||||
ist->pts >= of->recording_time + of->start_time) {
|
||||
ost->is_past_recording_time = 1;
|
||||
ost->finished = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1911,7 +1911,7 @@ static int transcode_init(void)
|
||||
{
|
||||
int ret = 0, i, j, k;
|
||||
AVFormatContext *oc;
|
||||
AVCodecContext *codec, *icodec = NULL;
|
||||
AVCodecContext *codec;
|
||||
OutputStream *ost;
|
||||
InputStream *ist;
|
||||
char error[1024];
|
||||
@ -1942,6 +1942,7 @@ static int transcode_init(void)
|
||||
|
||||
/* for each output stream, we compute the right encoding parameters */
|
||||
for (i = 0; i < nb_output_streams; i++) {
|
||||
AVCodecContext *icodec = NULL;
|
||||
ost = output_streams[i];
|
||||
oc = output_files[ost->file_index]->ctx;
|
||||
ist = get_input_stream(ost);
|
||||
@ -2367,13 +2368,13 @@ static int need_output(void)
|
||||
OutputFile *of = output_files[ost->file_index];
|
||||
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))
|
||||
continue;
|
||||
if (ost->frame_number >= ost->max_frames) {
|
||||
int 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;
|
||||
}
|
||||
|
||||
@ -2424,7 +2425,7 @@ static int select_input_file(void)
|
||||
|
||||
for (i = 0; i < nb_output_streams; i++)
|
||||
nb_active_out -= output_streams[i]->unavailable =
|
||||
output_streams[i]->is_past_recording_time;
|
||||
output_streams[i]->finished;
|
||||
while (nb_active_out) {
|
||||
opts_min = INT64_MAX;
|
||||
ost_index = -1;
|
||||
@ -3078,10 +3079,10 @@ int main(int argc, char **argv)
|
||||
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();
|
||||
if (transcode() < 0)
|
||||
|
2
ffmpeg.h
2
ffmpeg.h
@ -306,7 +306,7 @@ typedef struct OutputStream {
|
||||
int64_t swr_dither_method;
|
||||
double swr_dither_scale;
|
||||
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 stream_copy;
|
||||
const char *attachment_filename;
|
||||
|
@ -54,6 +54,7 @@ OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o
|
||||
OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \
|
||||
mpegaudiodsp_fixed.o \
|
||||
mpegaudiodsp_float.o
|
||||
OBJS-$(CONFIG_MPEGVIDEO) += mpegvideo.o mpegvideo_motion.o
|
||||
RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o
|
||||
OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes)
|
||||
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_C93_DECODER) += c93.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_CDXL_DECODER) += cdxl.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_ENCODER) += dnxhdenc.o dnxhddata.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_ENCODER) += dpxenc.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
|
||||
OBJS-$(CONFIG_EACMV_DECODER) += eacmv.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_EATGV_DECODER) += eatgv.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_EIGHTSVX_EXP_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_GSM_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o
|
||||
OBJS-$(CONFIG_GSM_MS_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o
|
||||
OBJS-$(CONFIG_H261_DECODER) += h261dec.o 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 \
|
||||
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 \
|
||||
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_ENCODER) += mpegvideo_enc.o mpeg4video.o \
|
||||
mpeg4videoenc.o motion_est.o \
|
||||
ratecontrol.o h263.o ituh263enc.o \
|
||||
flvenc.o mpeg12data.o \
|
||||
mpegvideo.o error_resilience.o
|
||||
error_resilience.o
|
||||
OBJS-$(CONFIG_H264_DECODER) += h264.o \
|
||||
h264_loopfilter.o h264_direct.o \
|
||||
cabac.o h264_sei.o h264_ps.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_VAAPI_HWACCEL) += vaapi_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_LJPEG_ENCODER) += ljpegenc.o mjpegenc.o mjpeg.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_MACE3_DECODER) += mace.o
|
||||
OBJS-$(CONFIG_MACE6_DECODER) += mace.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_MIMIC_DECODER) += mimic.o
|
||||
OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o mjpeg.o
|
||||
OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpeg.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_MLP_DECODER) += mlpdec.o mlpdsp.o
|
||||
OBJS-$(CONFIG_MMVIDEO_DECODER) += mmvideo.o
|
||||
@ -304,21 +297,21 @@ OBJS-$(CONFIG_MPEGVIDEO_DECODER) += mpeg12.o mpeg12data.o \
|
||||
mpegvideo.o error_resilience.o
|
||||
OBJS-$(CONFIG_MPEG_XVMC_DECODER) += mpegvideo_xvmc.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 \
|
||||
timecode.o \
|
||||
motion_est.o ratecontrol.o \
|
||||
mpeg12.o mpeg12data.o \
|
||||
mpegvideo.o error_resilience.o
|
||||
error_resilience.o
|
||||
OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
|
||||
OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.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 \
|
||||
timecode.o \
|
||||
motion_est.o ratecontrol.o \
|
||||
mpeg12.o mpeg12data.o \
|
||||
mpegvideo.o error_resilience.o
|
||||
error_resilience.o
|
||||
OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o
|
||||
OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.o msmpeg4data.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_ENCODER) += rv20enc.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 \
|
||||
mpegvideo.o error_resilience.o
|
||||
error_resilience.o
|
||||
OBJS-$(CONFIG_SAMI_DECODER) += samidec.o ass.o
|
||||
OBJS-$(CONFIG_S302M_DECODER) += s302m.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_ENCODER) += snowenc.o snow.o rangecoder.o \
|
||||
motion_est.o ratecontrol.o \
|
||||
h263.o mpegvideo.o \
|
||||
h263.o \
|
||||
error_resilience.o ituh263enc.o \
|
||||
mpegvideo_enc.o mpeg12data.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_ENCODER) += sunrastenc.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 \
|
||||
motion_est.o h263.o \
|
||||
mpegvideo.o error_resilience.o \
|
||||
error_resilience.o \
|
||||
ituh263enc.o mpegvideo_enc.o \
|
||||
ratecontrol.o mpeg12data.o
|
||||
OBJS-$(CONFIG_SVQ3_DECODER) += h264.o svq3.o \
|
||||
h264_loopfilter.o h264_direct.o \
|
||||
h264_sei.o h264_ps.o h264_refs.o \
|
||||
h264_cavlc.o h264_cabac.o cabac.o \
|
||||
mpegvideo.o error_resilience.o \
|
||||
error_resilience.o \
|
||||
svq1dec.o svq1.o h263.o
|
||||
OBJS-$(CONFIG_TARGA_DECODER) += targa.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_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o ac3tab.o timecode.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_MXF_MUXER) += timecode.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
|
||||
OBJS-$(CONFIG_OGG_MUXER) += xiph.o flac.o flacdata.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_MUXER) += dca.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_loopfilter.o h264_cabac.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_MJPEG_PARSER) += mjpeg_parser.o
|
||||
OBJS-$(CONFIG_MLP_PARSER) += mlp_parser.o mlp.o
|
||||
OBJS-$(CONFIG_MPEG4VIDEO_PARSER) += mpeg4video_parser.o h263.o \
|
||||
mpegvideo.o error_resilience.o \
|
||||
error_resilience.o \
|
||||
mpeg4videodec.o mpeg4video.o \
|
||||
ituh263dec.o h263dec.o
|
||||
OBJS-$(CONFIG_PNG_PARSER) += png_parser.o
|
||||
@ -750,13 +743,13 @@ OBJS-$(CONFIG_MPEGAUDIO_PARSER) += mpegaudio_parser.o \
|
||||
mpegaudiodecheader.o mpegaudiodata.o
|
||||
OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \
|
||||
mpeg12.o mpeg12data.o \
|
||||
mpegvideo.o error_resilience.o
|
||||
error_resilience.o
|
||||
OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o
|
||||
OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o
|
||||
OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o
|
||||
OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o vc1.o vc1data.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_VP3_PARSER) += vp3_parser.o
|
||||
OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o
|
||||
|
@ -369,12 +369,10 @@ static void push_output_configuration(AACContext *ac) {
|
||||
* configuration is unlocked.
|
||||
*/
|
||||
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 "internal.h"
|
||||
#include "mpegvideo.h"
|
||||
#include "mpegvideo_common.h"
|
||||
#include "dnxhdenc.h"
|
||||
#include "internal.h"
|
||||
|
||||
|
@ -138,6 +138,13 @@ if ((y) < (x)) {\
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MASK_ABS
|
||||
#define MASK_ABS(mask, level) do { \
|
||||
mask = level >> 31; \
|
||||
level = (level ^ mask) - mask; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef NEG_SSR32
|
||||
# define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
|
||||
#endif
|
||||
|
@ -895,7 +895,7 @@ static void mpeg1_encode_block(MpegEncContext *s,
|
||||
run = i - last_non_zero - 1;
|
||||
|
||||
alevel= level;
|
||||
MASK_ABS(sign, alevel)
|
||||
MASK_ABS(sign, alevel);
|
||||
sign&=1;
|
||||
|
||||
if (alevel <= mpeg1_max_level[0][run]){
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include "dsputil.h"
|
||||
#include "internal.h"
|
||||
#include "mpegvideo.h"
|
||||
#include "mpegvideo_common.h"
|
||||
#include "mjpegenc.h"
|
||||
#include "msmpeg4.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;
|
||||
}
|
||||
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_qpix= s->me.qpel_avg;
|
||||
}
|
||||
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,\
|
||||
};
|
||||
|
||||
/**
|
||||
* 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);
|
||||
int ff_MPV_common_init(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);
|
||||
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);
|
||||
int ff_dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
|
||||
|
||||
void ff_init_block_index(MpegEncContext *s);
|
||||
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.
|
||||
* The pixels are allocated/set by calling get_buffer() if shared = 0.
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
#include "mpegvideo.h"
|
||||
#include "mpegvideo_common.h"
|
||||
#include "h263.h"
|
||||
#include "mjpegenc.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) {
|
||||
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_qpix = s->dsp.avg_qpel_pixels_tab;
|
||||
}
|
||||
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) {
|
||||
|
@ -1,5 +1,4 @@
|
||||
/*
|
||||
* The simplest mpeg encoder (well, it was the simplest!)
|
||||
* Copyright (c) 2000,2001 Fabrice Bellard
|
||||
* 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
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* The simplest mpeg encoder (well, it was the simplest!).
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_MPEGVIDEO_COMMON_H
|
||||
#define AVCODEC_MPEGVIDEO_COMMON_H
|
||||
|
||||
#include <string.h>
|
||||
#include "libavutil/avassert.h"
|
||||
#include "avcodec.h"
|
||||
@ -39,14 +30,6 @@
|
||||
#include "msmpeg4.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,
|
||||
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
|
||||
uint8_t **ref_picture)
|
||||
@ -357,21 +340,39 @@ if(s->quarter_sample)
|
||||
}
|
||||
}
|
||||
/* 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(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,
|
||||
motion_x, motion_y, h, 1, mb_y);
|
||||
else
|
||||
#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,
|
||||
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);
|
||||
}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,
|
||||
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{
|
||||
/* 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 */
|
||||
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 {
|
||||
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,
|
||||
0, 0, s->field_select[dir][0],
|
||||
s->field_select[dir][0],
|
||||
ref_picture, pix_op,
|
||||
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,
|
||||
0, 0, s->field_select[dir][i],
|
||||
s->field_select[dir][i],
|
||||
ref2picture, pix_op,
|
||||
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++){
|
||||
int 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;
|
||||
}
|
||||
}else{
|
||||
for(i=0; i<2; i++){
|
||||
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,
|
||||
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(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,
|
||||
ref_picture, pix_op, qpix_op, 0);
|
||||
}
|
||||
#endif /* AVCODEC_MPEGVIDEO_COMMON_H */
|
@ -31,7 +31,7 @@
|
||||
#include "dsputil.h"
|
||||
#include "mpegvideo.h"
|
||||
#include "msmpeg4.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "h263.h"
|
||||
#include "mpeg4video.h"
|
||||
#include "msmpeg4data.h"
|
||||
|
@ -19,7 +19,7 @@
|
||||
* 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 "libavcodec/ac3dsp.h"
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
#include "libavcodec/cabac.h"
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "config.h"
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/cavsdsp.h"
|
||||
#include "dsputil_mmx.h"
|
||||
|
@ -21,7 +21,7 @@
|
||||
* 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"
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/h264dsp.h"
|
||||
#include "libavcodec/mpegvideo.h"
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
|
||||
typedef struct { uint64_t a, b; } xmm_reg;
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/mpegvideo.h"
|
||||
#include "libavcodec/mathops.h"
|
||||
|
@ -20,7 +20,7 @@
|
||||
* 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 "dwt.h"
|
||||
|
||||
|
@ -31,7 +31,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/fmtconvert.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/h264dsp.h"
|
||||
#include "dsputil_mmx.h"
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include "libavutil/common.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "dsputil_mmx.h"
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
@ -39,7 +39,7 @@
|
||||
*/
|
||||
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "idct_xvid.h"
|
||||
#include "dsputil_mmx.h"
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
* 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 "libavcodec/lpc.h"
|
||||
|
||||
|
@ -101,6 +101,12 @@ __asm__ volatile(\
|
||||
);
|
||||
#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 ...)
|
||||
#define NEG_SSR32 NEG_SSR32
|
||||
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
|
||||
*/
|
||||
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/mlp.h"
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
* 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 "dsputil_mmx.h"
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/mpegaudiodsp.h"
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/avcodec.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/mpegvideo.h"
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/rv34dsp.h"
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/avcodec.h"
|
||||
#include "libavcodec/snow.h"
|
||||
#include "libavcodec/dwt.h"
|
||||
|
@ -25,7 +25,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "dsputil_mmx.h"
|
||||
#include "libavcodec/vc1dsp.h"
|
||||
|
@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/vp56dsp.h"
|
||||
|
||||
|
@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/vp8dsp.h"
|
||||
|
||||
#if HAVE_YASM
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavfilter/gradfun.h"
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavcodec/x86/dsputil_mmx.h"
|
||||
#include "libavfilter/yadif.h"
|
||||
|
||||
|
@ -52,15 +52,17 @@
|
||||
typedef enum {
|
||||
STATE_START, ///< client has not done anything yet
|
||||
STATE_HANDSHAKED, ///< client has performed handshake
|
||||
STATE_RELEASING, ///< client releasing stream before publish it (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_PUBLISHING, ///< client has started sending multimedia data to server (for output)
|
||||
STATE_STOPPED, ///< the broadcast has been stopped
|
||||
} ClientState;
|
||||
|
||||
typedef struct TrackedMethod {
|
||||
char *name;
|
||||
int id;
|
||||
} TrackedMethod;
|
||||
|
||||
/** protocol handler context */
|
||||
typedef struct RTMPContext {
|
||||
const AVClass *class;
|
||||
@ -86,7 +88,6 @@ typedef struct RTMPContext {
|
||||
uint8_t flv_header[11]; ///< partial incoming flv packet header
|
||||
int flv_header_bytes; ///< number of initialized bytes in flv_header
|
||||
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* flashver; ///< version of the flash plugin
|
||||
char* swfurl; ///< url of the swf player
|
||||
@ -96,6 +97,9 @@ typedef struct RTMPContext {
|
||||
int client_buffer_time; ///< client buffer time in ms
|
||||
int flush_interval; ///< number of packets flushed in the same request (RTMPT 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;
|
||||
|
||||
#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
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
char *field, *value;
|
||||
@ -269,11 +339,7 @@ static int gen_connect(URLContext *s, RTMPContext *rt)
|
||||
|
||||
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_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_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_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_number(&p, ++rt->nb_invokes);
|
||||
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_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->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_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, "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;
|
||||
bytestream_put_be16(&p, 7);
|
||||
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;
|
||||
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_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;
|
||||
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,
|
||||
@ -622,11 +642,7 @@ static int gen_fcsubscribe_stream(URLContext *s, RTMPContext *rt,
|
||||
ff_amf_write_null(&p);
|
||||
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,
|
||||
@ -1010,7 +1026,8 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt)
|
||||
RTMPContext *rt = s->priv_data;
|
||||
int i, t;
|
||||
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?
|
||||
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);
|
||||
return -1;
|
||||
} 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;
|
||||
GetByteContext gbc;
|
||||
double pkt_id;
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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)) {
|
||||
const uint8_t* ptr = pkt->data + 11;
|
||||
@ -1113,7 +1134,9 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt)
|
||||
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)
|
||||
ret = gen_delete_stream(h, rt);
|
||||
|
||||
free_tracked_methods(rt);
|
||||
av_freep(&rt->flv_data);
|
||||
ffurl_close(rt->stream);
|
||||
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) {
|
||||
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;
|
||||
ff_rtmp_packet_destroy(&rt->out_pkt);
|
||||
rt->flv_size = 0;
|
||||
rt->flv_off = 0;
|
||||
rt->flv_header_bytes = 0;
|
||||
|
@ -37,7 +37,6 @@
|
||||
#include "libavutil/avstring.h"
|
||||
#include "libavcodec/get_bits.h"
|
||||
#include "avformat.h"
|
||||
#include "mpegts.h"
|
||||
|
||||
#include "network.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
|
||||
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;
|
||||
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;
|
||||
/* 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)
|
||||
av_abort();
|
||||
return AVERROR(EINVAL);
|
||||
n = 0;
|
||||
while (size > 0) {
|
||||
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);
|
||||
n += (s->buf_ptr - s->buf);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
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_U8:
|
||||
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_U16LE:
|
||||
case AV_CODEC_ID_PCM_S16BE:
|
||||
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:
|
||||
/* 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,
|
||||
* the correct parameter for send_samples_bits is 8 bits per stream
|
||||
* 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:
|
||||
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_MP3:
|
||||
rtp_send_mpegaudio(s1, pkt->data, size);
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "rtpenc_chain.h"
|
||||
#include "url.h"
|
||||
#include "rtpenc.h"
|
||||
#include "mpegts.h"
|
||||
|
||||
//#define DEBUG
|
||||
|
||||
@ -370,7 +371,9 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
|
||||
get_word(buf1, sizeof(buf1), &p); /* port */
|
||||
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 */
|
||||
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")) {
|
||||
/* 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 &&
|
||||
codec_type == AVMEDIA_TYPE_DATA) {
|
||||
/* 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);
|
||||
} else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC)
|
||||
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);
|
||||
}
|
||||
rtsp_st->transport_priv = NULL;
|
||||
@ -594,6 +599,8 @@ void ff_rtsp_close_streams(AVFormatContext *s)
|
||||
if (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->recvbuf);
|
||||
}
|
||||
@ -617,6 +624,8 @@ int ff_rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
|
||||
rtsp_st->rtp_handle = NULL;
|
||||
if (ret < 0)
|
||||
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)
|
||||
rtsp_st->transport_priv = ff_rdt_parse_open(s, st->index,
|
||||
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) {
|
||||
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) {
|
||||
ff_rtp_parse_set_dynamic_protocol(rtsp_st->transport_priv,
|
||||
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);
|
||||
profile[0] = '\0';
|
||||
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"))
|
||||
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)
|
||||
trans_pref = "x-pn-tng";
|
||||
else if (rt->transport == RTSP_TRANSPORT_RAW)
|
||||
trans_pref = "RAW/RAW";
|
||||
else
|
||||
trans_pref = "RTP/AVP";
|
||||
|
||||
@ -1753,8 +1773,15 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
if (rt->cur_transport_priv) {
|
||||
if (rt->transport == RTSP_TRANSPORT_RDT) {
|
||||
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);
|
||||
} 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) {
|
||||
rt->cur_transport_priv = NULL;
|
||||
return 0;
|
||||
@ -1817,7 +1844,7 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
return AVERROR_EOF;
|
||||
if (rt->transport == RTSP_TRANSPORT_RDT) {
|
||||
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);
|
||||
if (ret < 0) {
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
} 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:
|
||||
if (ret < 0)
|
||||
|
@ -52,6 +52,7 @@ enum RTSPLowerTransport {
|
||||
enum RTSPTransport {
|
||||
RTSP_TRANSPORT_RTP, /**< Standards-compliant RTP */
|
||||
RTSP_TRANSPORT_RDT, /**< Realmedia Data Transport */
|
||||
RTSP_TRANSPORT_RAW, /**< Raw data (over UDP) */
|
||||
RTSP_TRANSPORT_NB
|
||||
};
|
||||
|
||||
@ -310,6 +311,13 @@ typedef struct RTSPState {
|
||||
* other cases, this is a copy of AVFormatContext->filename. */
|
||||
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
|
||||
* separately, eg for HTTP tunneling. */
|
||||
URLContext *rtsp_hd_out;
|
||||
|
@ -31,7 +31,7 @@
|
||||
|
||||
#define LIBAVFORMAT_VERSION_MAJOR 54
|
||||
#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, \
|
||||
LIBAVFORMAT_VERSION_MINOR, \
|
||||
|
@ -93,38 +93,10 @@ struct AVDictionary {
|
||||
# define offsetof(T, F) ((unsigned int)((char *)&((T *)0)->F))
|
||||
#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 */
|
||||
|
||||
#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 */
|
||||
#undef malloc
|
||||
#define malloc please_use_av_malloc
|
||||
|
110
libavutil/x86/asm.h
Normal file
110
libavutil/x86/asm.h
Normal file
@ -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 <string.h>
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavutil/cpu.h"
|
||||
|
||||
#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.
|
||||
*/
|
||||
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
|
||||
#undef REAL_PAVGB
|
||||
#undef PAVGB
|
||||
|
@ -18,7 +18,7 @@
|
||||
* 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 "libswresample/swresample_internal.h"
|
||||
|
||||
|
@ -46,7 +46,7 @@
|
||||
#include "libavutil/mathematics.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/pixdesc.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "rgb2rgb.h"
|
||||
#include "swscale.h"
|
||||
#include "swscale_internal.h"
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
#include "config.h"
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/bswap.h"
|
||||
#include "libswscale/rgb2rgb.h"
|
||||
|
@ -25,7 +25,7 @@
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/pixdesc.h"
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
#include "libswscale/swscale.h"
|
||||
#include "libswscale/swscale_internal.h"
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/x86_cpu.h"
|
||||
#include "libavutil/x86/asm.h"
|
||||
#include "libavutil/cpu.h"
|
||||
|
||||
#if HAVE_INLINE_ASM
|
||||
|
Loading…
Reference in New Issue
Block a user