VP8: collect times while playing the video and print a summary to the log afterwards.

git-svn-id: https://svn.eduke32.com/eduke32@2832 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2012-07-13 18:20:55 +00:00
parent 0cb2d3e528
commit 5802857eb7
3 changed files with 52 additions and 5 deletions

View file

@ -344,6 +344,8 @@ void G_PlayAnim(const char *fn,char t)
while (getticks() < nextframetime); while (getticks() < nextframetime);
} }
animvpx_print_stats(&codec);
// //
kclose(handle); kclose(handle);
animvpx_restore_glstate(); animvpx_restore_glstate();

View file

@ -131,6 +131,10 @@ int32_t animvpx_init_codec(const animvpx_ivf_header_t *info, int32_t inhandle, a
codec->errmsg_detail = codec->errmsg = NULL; codec->errmsg_detail = codec->errmsg = NULL;
codec->numframes = 0;
Bmemset(codec->sumtimes, 0, sizeof(codec->sumtimes));
Bmemset(codec->maxtimes, 0, sizeof(codec->maxtimes));
return 0; return 0;
} }
@ -220,9 +224,13 @@ int32_t animvpx_nextpic(animvpx_codec_ctx *codec, uint8_t **picptr)
int32_t ret, corrupted; int32_t ret, corrupted;
vpx_image_t *img; vpx_image_t *img;
int32_t t[3];
if (codec->initstate <= 0) // not inited or error if (codec->initstate <= 0) // not inited or error
return 1; return 1;
t[0] = getticks();
if (codec->decstate == 0) // first time / begin if (codec->decstate == 0) // first time / begin
{ {
read_ivf_frame: read_ivf_frame:
@ -280,9 +288,10 @@ read_ivf_frame:
return 5; return 5;
} }
t[1] = getticks();
/*** 3 planes --> packed conversion ***/ /*** 3 planes --> packed conversion ***/
{ {
// int32_t t=getticks();
uint8_t *const dstpic = codec->pic; uint8_t *const dstpic = codec->pic;
const uint8_t *const yplane = img->planes[VPX_PLANE_Y]; const uint8_t *const yplane = img->planes[VPX_PLANE_Y];
@ -319,10 +328,16 @@ read_ivf_frame:
dstpic[((width*(y+1) + x+1)<<2) + 2] = v; dstpic[((width*(y+1) + x+1)<<2) + 2] = v;
} }
} }
// initprintf("%d ms\n", getticks()-t);
} }
t[2] = getticks();
codec->sumtimes[0] += t[1]-t[0];
codec->sumtimes[1] += t[2]-t[1];
codec->maxtimes[0] = max(codec->maxtimes[0], t[1]-t[0]);
codec->maxtimes[1] = max(codec->maxtimes[0], t[2]-t[1]);
*picptr = codec->pic; *picptr = codec->pic;
return 0; return 0;
} }
@ -450,8 +465,10 @@ void animvpx_restore_glstate(void)
texuploaded = 0; texuploaded = 0;
} }
int32_t animvpx_render_frame(const animvpx_codec_ctx *codec) int32_t animvpx_render_frame(animvpx_codec_ctx *codec)
{ {
int32_t t = getticks();
if (codec->initstate <= 0) // not inited or error if (codec->initstate <= 0) // not inited or error
return 1; return 1;
@ -503,5 +520,26 @@ int32_t animvpx_render_frame(const animvpx_codec_ctx *codec)
bglEnd(); bglEnd();
} }
t = getticks()-t;
codec->sumtimes[2] += t;
codec->maxtimes[2] = max(codec->maxtimes[2], t);
codec->numframes++;
return 0; return 0;
} }
void animvpx_print_stats(const animvpx_codec_ctx *codec)
{
if (codec->numframes != 0)
{
const int32_t *s = codec->sumtimes;
const int32_t *m = codec->maxtimes;
int32_t n = codec->numframes;
initprintf("VP8 timing stats (mean, max) [ms] for %d frames:\n"
" read and decode frame: %.02f, %d\n"
" 3 planes -> packed conversion: %.02f, %d\n"
" upload and display: %.02f, %d\n",
n, (double)s[0]/n, m[0], (double)s[1]/n, m[1], (double)s[2]/n, m[2]);
}
}

View file

@ -66,6 +66,11 @@ typedef struct
vpx_codec_ctx_t codec; vpx_codec_ctx_t codec;
vpx_codec_iter_t iter; vpx_codec_iter_t iter;
// statistics
int32_t numframes;
int32_t sumtimes[3];
int32_t maxtimes[3];
} animvpx_codec_ctx; } animvpx_codec_ctx;
@ -77,7 +82,9 @@ int32_t animvpx_nextpic(animvpx_codec_ctx *codec, uint8_t **pic);
void animvpx_setup_glstate(void); void animvpx_setup_glstate(void);
void animvpx_restore_glstate(void); void animvpx_restore_glstate(void);
int32_t animvpx_render_frame(const animvpx_codec_ctx *codec); int32_t animvpx_render_frame(animvpx_codec_ctx *codec);
void animvpx_print_stats(const animvpx_codec_ctx *codec);
#endif // !defined ANIM_VPX_H #endif // !defined ANIM_VPX_H