# HG changeset patch # User vitor # Date 1232784943 0 # Node ID 1fa3e8a72ca5405268f30bc4d310be0607905b04 # Parent 178d5dfccad411c66d5bcb7788826817a5a4f85b Do not allocate RoqTempData on the stack diff -r 178d5dfccad4 -r 1fa3e8a72ca5 roqvideo.h --- a/roqvideo.h Fri Jan 23 22:27:19 2009 +0000 +++ b/roqvideo.h Sat Jan 24 08:15:43 2009 +0000 @@ -39,6 +39,8 @@ int d[2]; } motion_vect; +struct RoqTempData; + typedef struct RoqContext { AVCodecContext *avctx; @@ -69,6 +71,7 @@ AVFrame *frame_to_enc; uint8_t *out_buf; + struct RoqTempData *tmpData; } RoqContext; #define RoQ_INFO 0x1001 diff -r 178d5dfccad4 -r 1fa3e8a72ca5 roqvideoenc.c --- a/roqvideoenc.c Fri Jan 23 22:27:19 2009 +0000 +++ b/roqvideoenc.c Sat Jan 24 08:15:43 2009 +0000 @@ -220,7 +220,7 @@ /** * Temporary vars */ -typedef struct +typedef struct RoqTempData { CelEvaluation *cel_evals; @@ -881,14 +881,14 @@ static void roq_encode_video(RoqContext *enc) { - RoqTempdata tempData; + RoqTempdata *tempData = enc->tmpData; int i; - memset(&tempData, 0, sizeof(tempData)); + memset(tempData, 0, sizeof(*tempData)); - create_cel_evals(enc, &tempData); + create_cel_evals(enc, tempData); - generate_new_codebooks(enc, &tempData); + generate_new_codebooks(enc, tempData); if (enc->framesSinceKeyframe >= 1) { motion_search(enc, 8); @@ -897,19 +897,19 @@ retry_encode: for (i=0; iwidth*enc->height/64; i++) - gather_data_for_cel(tempData.cel_evals + i, enc, &tempData); + gather_data_for_cel(tempData->cel_evals + i, enc, tempData); /* Quake 3 can't handle chunks bigger than 65536 bytes */ - if (tempData.mainChunkSize/8 > 65536) { + if (tempData->mainChunkSize/8 > 65536) { enc->lambda *= .8; goto retry_encode; } - remap_codebooks(enc, &tempData); + remap_codebooks(enc, tempData); - write_codebooks(enc, &tempData); + write_codebooks(enc, tempData); - reconstruct_and_encode_image(enc, &tempData, enc->width, enc->height, + reconstruct_and_encode_image(enc, tempData, enc->width, enc->height, enc->width*enc->height/64); enc->avctx->coded_frame = enc->current_frame; @@ -919,8 +919,8 @@ FFSWAP(motion_vect *, enc->last_motion4, enc->this_motion4); FFSWAP(motion_vect *, enc->last_motion8, enc->this_motion8); - av_free(tempData.cel_evals); - av_free(tempData.closest_cb2); + av_free(tempData->cel_evals); + av_free(tempData->closest_cb2); enc->framesSinceKeyframe++; } @@ -955,6 +955,8 @@ enc->last_frame = &enc->frames[0]; enc->current_frame = &enc->frames[1]; + enc->tmpData = av_malloc(sizeof(RoqTempdata)); + enc->this_motion4 = av_mallocz((enc->width*enc->height/16)*sizeof(motion_vect)); @@ -1050,6 +1052,7 @@ avctx->release_buffer(avctx, enc->last_frame); avctx->release_buffer(avctx, enc->current_frame); + av_free(enc->tmpData); av_free(enc->this_motion4); av_free(enc->last_motion4); av_free(enc->this_motion8);