Browse Source

Do not allocate RoqTempData on the stack

Originally committed as revision 16739 to svn://svn.ffmpeg.org/ffmpeg/trunk
tags/v0.5
Vitor Sessak 17 years ago
parent
commit
e0df9e4425
2 changed files with 18 additions and 12 deletions
  1. +3
    -0
      libavcodec/roqvideo.h
  2. +15
    -12
      libavcodec/roqvideoenc.c

+ 3
- 0
libavcodec/roqvideo.h View File

@@ -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


+ 15
- 12
libavcodec/roqvideoenc.c View File

@@ -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);


Loading…
Cancel
Save