YUV 411/422/444 support for pp

Originally committed as revision 8806 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
pull/126/head
Michael Niedermayer 22 years ago
parent f7b47594dc
commit e9effafdf9
  1. 12
      postproc/postprocess.c
  2. 8
      postproc/postprocess.h
  3. 3
      postproc/postprocess_internal.h
  4. 11
      postproc/postprocess_template.c

@ -753,6 +753,13 @@ pp_context_t *pp_get_context(int width, int height, int cpuCaps){
memset(c, 0, sizeof(PPContext)); memset(c, 0, sizeof(PPContext));
c->cpuCaps= cpuCaps; c->cpuCaps= cpuCaps;
if(cpuCaps&PP_FORMAT){
c->hChromaSubSample= cpuCaps&0x3;
c->vChromaSubSample= (cpuCaps>>4)&0x3;
}else{
c->hChromaSubSample= 1;
c->vChromaSubSample= 1;
}
reallocBuffers(c, width, height, stride); reallocBuffers(c, width, height, stride);
@ -796,7 +803,6 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
if(c->stride < minStride) if(c->stride < minStride)
reallocBuffers(c, width, height, minStride); reallocBuffers(c, width, height, minStride);
if(QP_store==NULL || (mode->lumMode & FORCE_QUANT)) if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
{ {
int i; int i;
@ -840,8 +846,8 @@ for(y=0; y<mbHeight; y++){
postProcess(src[0], srcStride[0], dst[0], dstStride[0], postProcess(src[0], srcStride[0], dst[0], dstStride[0],
width, height, QP_store, QPStride, 0, mode, c); width, height, QP_store, QPStride, 0, mode, c);
width = (width +1)>>1; width = (width )>>c->hChromaSubSample;
height = (height+1)>>1; height = (height)>>c->vChromaSubSample;
if(mode->chromMode) if(mode->chromMode)
{ {

@ -43,11 +43,17 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
pp_mode_t *pp_get_mode_by_name_and_quality(char *name, int quality); pp_mode_t *pp_get_mode_by_name_and_quality(char *name, int quality);
void pp_free_mode(pp_mode_t *mode); void pp_free_mode(pp_mode_t *mode);
pp_context_t *pp_get_context(int width, int height, int cpuCaps); pp_context_t *pp_get_context(int width, int height, int flags);
void pp_free_context(pp_context_t *ppContext); void pp_free_context(pp_context_t *ppContext);
#define PP_CPU_CAPS_MMX 0x80000000 #define PP_CPU_CAPS_MMX 0x80000000
#define PP_CPU_CAPS_MMX2 0x20000000 #define PP_CPU_CAPS_MMX2 0x20000000
#define PP_CPU_CAPS_3DNOW 0x40000000 #define PP_CPU_CAPS_3DNOW 0x40000000
#define PP_FORMAT 0x00000008
#define PP_FORMAT_420 (0x00000011|PP_FORMAT)
#define PP_FORMAT_422 (0x00000001|PP_FORMAT)
#define PP_FORMAT_411 (0x00000002|PP_FORMAT)
#define PP_FORMAT_444 (0x00000000|PP_FORMAT)
#endif #endif

@ -120,6 +120,9 @@ typedef struct PPContext{
int stride; //size of some buffers (needed to realloc them if needed) int stride; //size of some buffers (needed to realloc them if needed)
int hChromaSubSample;
int vChromaSubSample;
PPMode ppMode; PPMode ppMode;
} PPContext; } PPContext;

@ -2663,6 +2663,9 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
int i; int i;
#endif #endif
const int qpHShift= isColor ? 4-c.hChromaSubSample : 4;
const int qpVShift= isColor ? 4-c.vChromaSubSample : 4;
//FIXME remove //FIXME remove
uint64_t * const yHistogram= c.yHistogram; uint64_t * const yHistogram= c.yHistogram;
uint8_t * const tempSrc= c.tempSrc; uint8_t * const tempSrc= c.tempSrc;
@ -2846,8 +2849,8 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
uint8_t *tempBlock1= c.tempBlocks; uint8_t *tempBlock1= c.tempBlocks;
uint8_t *tempBlock2= c.tempBlocks + 8; uint8_t *tempBlock2= c.tempBlocks + 8;
#endif #endif
int8_t *QPptr= isColor ? &QPs[(y>>3)*QPStride] :&QPs[(y>>4)*QPStride]; int8_t *QPptr= &QPs[(y>>qpVShift)*QPStride];
int8_t *nonBQPptr= isColor ? &c.nonBQPTable[(y>>3)*mbWidth] :&c.nonBQPTable[(y>>4)*mbWidth]; int8_t *nonBQPptr= &c.nonBQPTable[(y>>qpVShift)*mbWidth];
int QP=0; int QP=0;
/* can we mess with a 8x16 block from srcBlock/dstBlock downwards and 1 line upwards /* can we mess with a 8x16 block from srcBlock/dstBlock downwards and 1 line upwards
if not than use a temporary buffer */ if not than use a temporary buffer */
@ -2886,8 +2889,8 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
#endif #endif
if(isColor) if(isColor)
{ {
QP= QPptr[x>>3]; QP= QPptr[x>>qpHShift];
c.nonBQP= nonBQPptr[x>>3]; c.nonBQP= nonBQPptr[x>>qpHShift];
} }
else else
{ {

Loading…
Cancel
Save