diff options
author | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2008-03-01 03:05:13 +0100 |
---|---|---|
committer | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2008-03-01 03:05:13 +0100 |
commit | 1d0b3b20c34517b9d1ddf3ea347776304b0c4b44 (patch) | |
tree | 89f4fc640c2becc6f00ae08996754952ecf149c1 /contrib/ffmpeg/libavcodec/flashsvenc.c | |
parent | 09496ad3469a0ade8dbd9a351e639b78f20b7942 (diff) | |
download | xine-lib-1d0b3b20c34517b9d1ddf3ea347776304b0c4b44.tar.gz xine-lib-1d0b3b20c34517b9d1ddf3ea347776304b0c4b44.tar.bz2 |
Update internal FFmpeg copy.
Diffstat (limited to 'contrib/ffmpeg/libavcodec/flashsvenc.c')
-rw-r--r-- | contrib/ffmpeg/libavcodec/flashsvenc.c | 85 |
1 files changed, 18 insertions, 67 deletions
diff --git a/contrib/ffmpeg/libavcodec/flashsvenc.c b/contrib/ffmpeg/libavcodec/flashsvenc.c index cbf488328..2b791c294 100644 --- a/contrib/ffmpeg/libavcodec/flashsvenc.c +++ b/contrib/ffmpeg/libavcodec/flashsvenc.c @@ -58,7 +58,6 @@ #include <stdlib.h> #include <zlib.h> -#include "common.h" #include "avcodec.h" #include "bitstream.h" #include "bytestream.h" @@ -100,7 +99,7 @@ static int copy_region_enc(uint8_t *sptr, uint8_t *dptr, static int flashsv_encode_init(AVCodecContext *avctx) { - FlashSVContext *s = (FlashSVContext *)avctx->priv_data; + FlashSVContext *s = avctx->priv_data; s->avctx = avctx; @@ -115,16 +114,6 @@ static int flashsv_encode_init(AVCodecContext *avctx) // Needed if zlib unused or init aborted before deflateInit memset(&(s->zstream), 0, sizeof(z_stream)); -/* - s->zstream.zalloc = NULL; //av_malloc; - s->zstream.zfree = NULL; //av_free; - s->zstream.opaque = NULL; - zret = deflateInit(&(s->zstream), 9); - if (zret != Z_OK) { - av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret); - return -1; - } -*/ s->last_key_frame=0; @@ -194,22 +183,7 @@ static int encode_bitstream(FlashSVContext *s, AVFrame *p, uint8_t *buf, int buf //ret = deflateReset(&(s->zstream)); if (ret != Z_OK) av_log(s->avctx, AV_LOG_ERROR, "error while compressing block %dx%d\n", i, j); - /* - s->zstream.next_in = s->tmpblock; - s->zstream.avail_in = 3*ws*hs; - s->zstream.total_in = 0; - s->zstream.next_out = ptr+2; - s->zstream.avail_out = buf_size-buf_pos-2; - s->zstream.total_out = 0; - - ret = deflate(&(s->zstream), Z_FINISH); - if ((ret != Z_OK) && (ret != Z_STREAM_END)) - av_log(s->avctx, AV_LOG_ERROR, "error while compressing block %dx%d\n", i, j); - - size = s->zstream.total_out; - //av_log(avctx, AV_LOG_INFO, "compressed blocks: %d\n", size); - */ bytestream_put_be16(&ptr,(unsigned int)zsize); buf_pos += zsize+2; //av_log(avctx, AV_LOG_ERROR, "buf_pos = %d\n", buf_pos); @@ -232,9 +206,10 @@ static int encode_bitstream(FlashSVContext *s, AVFrame *p, uint8_t *buf, int buf static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size, void *data) { - FlashSVContext * const s = (FlashSVContext *)avctx->priv_data; + FlashSVContext * const s = avctx->priv_data; AVFrame *pict = data; AVFrame * const p = &s->frame; + uint8_t *pfptr; int res; int I_frame = 0; int opt_w, opt_h; @@ -243,7 +218,7 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz /* First frame needs to be a keyframe */ if (avctx->frame_number == 0) { - s->previous_frame = av_mallocz(p->linesize[0]*s->image_height); + s->previous_frame = av_mallocz(FFABS(p->linesize[0])*s->image_height); if (!s->previous_frame) { av_log(avctx, AV_LOG_ERROR, "Memory allocation failed.\n"); return -1; @@ -251,6 +226,11 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz I_frame = 1; } + if (p->linesize[0] < 0) + pfptr = s->previous_frame - ((s->image_height-1) * p->linesize[0]); + else + pfptr = s->previous_frame; + /* Check the placement of keyframes */ if (avctx->gop_size > 0) { if (avctx->frame_number >= s->last_key_frame + avctx->gop_size) { @@ -258,40 +238,8 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz } } -#if 0 - int w, h; - int optim_sizes[16][16]; - int smallest_size; - //Try all possible combinations and store the encoded frame sizes - for (w=1 ; w<17 ; w++) { - for (h=1 ; h<17 ; h++) { - optim_sizes[w-1][h-1] = encode_bitstream(s, p, s->encbuffer, s->image_width*s->image_height*4, w*16, h*16, s->previous_frame); - //av_log(avctx, AV_LOG_ERROR, "[%d][%d]size = %d\n",w,h,optim_sizes[w-1][h-1]); - } - } - - //Search for the smallest framesize and encode the frame with those parameters - smallest_size=optim_sizes[0][0]; - opt_w = 0; - opt_h = 0; - for (w=0 ; w<16 ; w++) { - for (h=0 ; h<16 ; h++) { - if (optim_sizes[w][h] < smallest_size) { - smallest_size = optim_sizes[w][h]; - opt_w = w; - opt_h = h; - } - } - } - res = encode_bitstream(s, p, buf, buf_size, (opt_w+1)*16, (opt_h+1)*16, s->previous_frame); - av_log(avctx, AV_LOG_ERROR, "[%d][%d]optimal size = %d, res = %d|\n", opt_w, opt_h, smallest_size, res); - - if (buf_size < res) - av_log(avctx, AV_LOG_ERROR, "buf_size %d < res %d\n", buf_size, res); - -#else - opt_w=1; - opt_h=1; + opt_w=4; + opt_h=4; if (buf_size < s->image_width*s->image_height*3) { //Conservative upper bound check for compressed data @@ -299,10 +247,13 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz return -1; } - res = encode_bitstream(s, p, buf, buf_size, opt_w*16, opt_h*16, s->previous_frame, &I_frame); -#endif + res = encode_bitstream(s, p, buf, buf_size, opt_w*16, opt_h*16, pfptr, &I_frame); + //save the current frame - memcpy(s->previous_frame, p->data[0], s->image_height*p->linesize[0]); + if(p->linesize[0] > 0) + memcpy(s->previous_frame, p->data[0], s->image_height*p->linesize[0]); + else + memcpy(s->previous_frame, p->data[0] + p->linesize[0] * (s->image_height-1), s->image_height*FFABS(p->linesize[0])); //mark the frame type so the muxer can mux it correctly if (I_frame) { @@ -322,7 +273,7 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz static int flashsv_encode_end(AVCodecContext *avctx) { - FlashSVContext *s = (FlashSVContext *)avctx->priv_data; + FlashSVContext *s = avctx->priv_data; deflateEnd(&(s->zstream)); |