aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/utils.c
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2008-02-15 20:23:49 +0000
committerVitor Sessak <vitor1001@gmail.com>2008-02-15 20:23:49 +0000
commitdb7ae7d1b96bec521793a200ad46574bca728b6e (patch)
tree14fa281731a372bd643b4b9eda498c524bf7243f /libavcodec/utils.c
parent4fe109ebdd0e3fa5c4448f18ddb72f3cdcb3d677 (diff)
downloadffmpeg-db7ae7d1b96bec521793a200ad46574bca728b6e.tar.gz
Simplify avcodec_default_get_buffer()
Originally committed as revision 11962 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/utils.c')
-rw-r--r--libavcodec/utils.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index bb0e5e2ea2..1a32c2c48f 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -31,6 +31,7 @@
#include "integer.h"
#include "opt.h"
#include "crc.h"
+#include "imgconvert.h"
#include <stdarg.h>
#include <limits.h>
#include <float.h>
@@ -271,7 +272,8 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
buf->last_pic_num= *picture_number;
}else{
int h_chroma_shift, v_chroma_shift;
- int pixel_size, size[4];
+ int size[4] = {0};
+ int tmpsize;
AVPicture picture;
avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
@@ -284,23 +286,23 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
}
avcodec_align_dimensions(s, &w, &h);
- avpicture_fill(&picture, NULL, s->pix_fmt, w, h);
- pixel_size= picture.linesize[0]*8 / w;
-//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d\n", (int)picture.data[1], w, h, s->pix_fmt);
- assert(pixel_size>=1);
- //FIXME next ensures that linesize= 2^x uvlinesize, that is needed because some MC code assumes it
- if(pixel_size == 3*8)
- w= ALIGN(w, STRIDE_ALIGN<<h_chroma_shift);
+ ff_fill_linesize(&picture, s->pix_fmt, w);
+
+ for (i=1; i<4; i++)
+ picture.linesize[i] = ALIGN(picture.linesize[i], STRIDE_ALIGN);
+
+ /* next ensures that linesize= 2^x uvlinesize, that is needed because
+ * some MC code assumes it */
+ if (picture.linesize[1])
+ picture.linesize[0] = ALIGN(picture.linesize[0], picture.linesize[1]);
else
- w= ALIGN(pixel_size*w, STRIDE_ALIGN<<(h_chroma_shift+3)) / pixel_size;
- size[1] = avpicture_fill(&picture, NULL, s->pix_fmt, w, h);
- size[0] = picture.linesize[0] * h;
- size[1] -= size[0];
- size[2] = size[3] = 0;
- if(picture.data[2])
- size[1]= size[2]= size[1]/2;
- if(picture.data[3])
- size[3] = picture.linesize[3] * h;
+ picture.linesize[0] = ALIGN(picture.linesize[0], STRIDE_ALIGN);
+
+ tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h);
+
+ for (i=0; i<3 && picture.data[i+1]; i++)
+ size[i] = picture.data[i+1] - picture.data[i];
+ size[i] = tmpsize - size[i];
buf->last_pic_num= -256*256*256*64;
memset(buf->base, 0, sizeof(buf->base));