提交 e0df9e44 编写于 作者: V Vitor Sessak

Do not allocate RoqTempData on the stack

Originally committed as revision 16739 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 c6f79c3e
......@@ -39,6 +39,8 @@ typedef struct {
int d[2];
} motion_vect;
struct RoqTempData;
typedef struct RoqContext {
AVCodecContext *avctx;
......@@ -69,6 +71,7 @@ typedef struct RoqContext {
AVFrame *frame_to_enc;
uint8_t *out_buf;
struct RoqTempData *tmpData;
} RoqContext;
#define RoQ_INFO 0x1001
......
......@@ -220,7 +220,7 @@ typedef struct
/**
* Temporary vars
*/
typedef struct
typedef struct RoqTempData
{
CelEvaluation *cel_evals;
......@@ -881,14 +881,14 @@ static void generate_new_codebooks(RoqContext *enc, RoqTempdata *tempData)
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 @@ static void roq_encode_video(RoqContext *enc)
retry_encode:
for (i=0; i<enc->width*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 @@ static void roq_encode_video(RoqContext *enc)
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 @@ static int roq_encode_init(AVCodecContext *avctx)
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 @@ static int roq_encode_end(AVCodecContext *avctx)
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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册