提交 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 { ...@@ -39,6 +39,8 @@ typedef struct {
int d[2]; int d[2];
} motion_vect; } motion_vect;
struct RoqTempData;
typedef struct RoqContext { typedef struct RoqContext {
AVCodecContext *avctx; AVCodecContext *avctx;
...@@ -69,6 +71,7 @@ typedef struct RoqContext { ...@@ -69,6 +71,7 @@ typedef struct RoqContext {
AVFrame *frame_to_enc; AVFrame *frame_to_enc;
uint8_t *out_buf; uint8_t *out_buf;
struct RoqTempData *tmpData;
} RoqContext; } RoqContext;
#define RoQ_INFO 0x1001 #define RoQ_INFO 0x1001
......
...@@ -220,7 +220,7 @@ typedef struct ...@@ -220,7 +220,7 @@ typedef struct
/** /**
* Temporary vars * Temporary vars
*/ */
typedef struct typedef struct RoqTempData
{ {
CelEvaluation *cel_evals; CelEvaluation *cel_evals;
...@@ -881,14 +881,14 @@ static void generate_new_codebooks(RoqContext *enc, RoqTempdata *tempData) ...@@ -881,14 +881,14 @@ static void generate_new_codebooks(RoqContext *enc, RoqTempdata *tempData)
static void roq_encode_video(RoqContext *enc) static void roq_encode_video(RoqContext *enc)
{ {
RoqTempdata tempData; RoqTempdata *tempData = enc->tmpData;
int i; 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) { if (enc->framesSinceKeyframe >= 1) {
motion_search(enc, 8); motion_search(enc, 8);
...@@ -897,19 +897,19 @@ static void roq_encode_video(RoqContext *enc) ...@@ -897,19 +897,19 @@ static void roq_encode_video(RoqContext *enc)
retry_encode: retry_encode:
for (i=0; i<enc->width*enc->height/64; i++) 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 */ /* Quake 3 can't handle chunks bigger than 65536 bytes */
if (tempData.mainChunkSize/8 > 65536) { if (tempData->mainChunkSize/8 > 65536) {
enc->lambda *= .8; enc->lambda *= .8;
goto retry_encode; 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->width*enc->height/64);
enc->avctx->coded_frame = enc->current_frame; enc->avctx->coded_frame = enc->current_frame;
...@@ -919,8 +919,8 @@ static void roq_encode_video(RoqContext *enc) ...@@ -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_motion4, enc->this_motion4);
FFSWAP(motion_vect *, enc->last_motion8, enc->this_motion8); FFSWAP(motion_vect *, enc->last_motion8, enc->this_motion8);
av_free(tempData.cel_evals); av_free(tempData->cel_evals);
av_free(tempData.closest_cb2); av_free(tempData->closest_cb2);
enc->framesSinceKeyframe++; enc->framesSinceKeyframe++;
} }
...@@ -955,6 +955,8 @@ static int roq_encode_init(AVCodecContext *avctx) ...@@ -955,6 +955,8 @@ static int roq_encode_init(AVCodecContext *avctx)
enc->last_frame = &enc->frames[0]; enc->last_frame = &enc->frames[0];
enc->current_frame = &enc->frames[1]; enc->current_frame = &enc->frames[1];
enc->tmpData = av_malloc(sizeof(RoqTempdata));
enc->this_motion4 = enc->this_motion4 =
av_mallocz((enc->width*enc->height/16)*sizeof(motion_vect)); av_mallocz((enc->width*enc->height/16)*sizeof(motion_vect));
...@@ -1050,6 +1052,7 @@ static int roq_encode_end(AVCodecContext *avctx) ...@@ -1050,6 +1052,7 @@ static int roq_encode_end(AVCodecContext *avctx)
avctx->release_buffer(avctx, enc->last_frame); avctx->release_buffer(avctx, enc->last_frame);
avctx->release_buffer(avctx, enc->current_frame); avctx->release_buffer(avctx, enc->current_frame);
av_free(enc->tmpData);
av_free(enc->this_motion4); av_free(enc->this_motion4);
av_free(enc->last_motion4); av_free(enc->last_motion4);
av_free(enc->this_motion8); av_free(enc->this_motion8);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册