From d5cf0ceae7fbbdb0ed21685e05c18541fb71675b Mon Sep 17 00:00:00 2001 From: brunzelchen Date: Mon, 7 Feb 2011 23:05:43 +0000 Subject: - added "ac_drop_decode_video_package" - method to acinerella: decoding of a frame without scaling - added threaded video decoding - added video frame buffer (50 frames) git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/1.0.1 Challenge MOD@2803 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/lib/acinerella/acinerella.c | 44 ++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'Game/Code/lib/acinerella/acinerella.c') diff --git a/Game/Code/lib/acinerella/acinerella.c b/Game/Code/lib/acinerella/acinerella.c index 5b0178e4..d807ec4f 100644 --- a/Game/Code/lib/acinerella/acinerella.c +++ b/Game/Code/lib/acinerella/acinerella.c @@ -680,7 +680,7 @@ int ac_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder pDecoder->pSwsCtx = sws_getCachedContext(pDecoder->pSwsCtx, pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, pDecoder->pCodecCtx->pix_fmt, pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, convert_pix_format(pDecoder->decoder.pacInstance->output_format), - SWS_BICUBIC, NULL, NULL, NULL); + SWS_FAST_BILINEAR, NULL, NULL, NULL); sws_scale( pDecoder->pSwsCtx, @@ -780,6 +780,48 @@ int CALL_CONVT ac_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder) return 0; } +int CALL_CONVT ac_drop_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder) { + if (pDecoder->type == AC_DECODER_TYPE_VIDEO) { + return ac_drop_decode_video_package(pPackage, (lp_ac_video_decoder)pDecoder, pDecoder); + } + return 0; +} + +int ac_drop_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder, lp_ac_decoder pDec) { + int finished; + double pts; + + avcodec_decode_video2( + pDecoder->pCodecCtx, pDecoder->pFrame, &finished, + &(((lp_ac_package_data)pPackage)->ffpackage)); + + if (finished) { + pts=0; + global_video_pkt_pts = ((lp_ac_package_data)pPackage)->ffpackage.pts; + + if(((lp_ac_package_data)pPackage)->ffpackage.dts == AV_NOPTS_VALUE && + *(uint64_t*)pDecoder->pFrame->opaque != AV_NOPTS_VALUE ){ + pts = *(uint64_t*)pDecoder->pFrame->opaque; + } else if(((lp_ac_package_data)pPackage)->ffpackage.dts != AV_NOPTS_VALUE){ + pts = ((lp_ac_package_data)pPackage)->ffpackage.dts; + } else { + pts = 0; + } + + if(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time != AV_NOPTS_VALUE){ + pts -= ((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time; + } + + pts *= av_q2d(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base); + + pts = ac_sync_video(pPackage, pDec, pDecoder->pFrame, pts); + pDec->timecode = pts; + + return 1; + } + return 0; +} + //Seek function int CALL_CONVT ac_seek(lp_ac_decoder pDecoder, int dir, int64_t target_pos) { AVRational timebase = -- cgit v1.2.3