summaryrefslogtreecommitdiff
path: root/contrib/ffmpeg/libavcodec/flashsvenc.c
diff options
context:
space:
mode:
authorDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2008-03-01 03:05:13 +0100
committerDiego 'Flameeyes' Pettenò <flameeyes@gmail.com>2008-03-01 03:05:13 +0100
commit1d0b3b20c34517b9d1ddf3ea347776304b0c4b44 (patch)
tree89f4fc640c2becc6f00ae08996754952ecf149c1 /contrib/ffmpeg/libavcodec/flashsvenc.c
parent09496ad3469a0ade8dbd9a351e639b78f20b7942 (diff)
downloadxine-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.c85
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));