mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
mpeg2 qscale flag
a few bugfixes for the C pp code minor optimization Originally committed as revision 1786 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
22cf045590
commit
0426af3111
@ -15,8 +15,8 @@ extern "C" {
|
||||
|
||||
#define LIBAVCODEC_VERSION_INT 0x000406
|
||||
#define LIBAVCODEC_VERSION "0.4.6"
|
||||
#define LIBAVCODEC_BUILD 4663
|
||||
#define LIBAVCODEC_BUILD_STR "4663"
|
||||
#define LIBAVCODEC_BUILD 4664
|
||||
#define LIBAVCODEC_BUILD_STR "4664"
|
||||
|
||||
#define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR
|
||||
|
||||
@ -314,8 +314,15 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG,
|
||||
* - encoding: unused\
|
||||
* - decoding: set by lavc\
|
||||
*/\
|
||||
int repeat_pict;
|
||||
int repeat_pict;\
|
||||
\
|
||||
/**\
|
||||
* \
|
||||
*/\
|
||||
int qscale_type;\
|
||||
|
||||
#define FF_QSCALE_TYPE_MPEG1 0
|
||||
#define FF_QSCALE_TYPE_MPEG2 1
|
||||
|
||||
#define FF_BUFFER_TYPE_INTERNAL 1
|
||||
#define FF_BUFFER_TYPE_USER 2 ///< Direct rendering buffers
|
||||
|
@ -199,8 +199,9 @@ static inline int isHorizDC(uint8_t src[], int stride, PPContext *c)
|
||||
{
|
||||
int numEq= 0;
|
||||
int y;
|
||||
const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
|
||||
const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
|
||||
const int dcThreshold= dcOffset*2 + 1;
|
||||
|
||||
for(y=0; y<BLOCK_SIZE; y++)
|
||||
{
|
||||
if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++;
|
||||
@ -221,8 +222,9 @@ static inline int isHorizDC(uint8_t src[], int stride, PPContext *c)
|
||||
static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){
|
||||
int numEq= 0;
|
||||
int y;
|
||||
const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
|
||||
const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
|
||||
const int dcThreshold= dcOffset*2 + 1;
|
||||
|
||||
src+= stride*4; // src points to begin of the 8x8 Block
|
||||
for(y=0; y<BLOCK_SIZE-1; y++)
|
||||
{
|
||||
@ -735,12 +737,13 @@ static void reallocAlign(void **p, int alignment, int size){
|
||||
memset(*p, 0, size);
|
||||
}
|
||||
|
||||
static void reallocBuffers(PPContext *c, int width, int height, int stride){
|
||||
static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
|
||||
int mbWidth = (width+15)>>4;
|
||||
int mbHeight= (height+15)>>4;
|
||||
int i;
|
||||
|
||||
c->stride= stride;
|
||||
c->qpStride= qpStride;
|
||||
|
||||
reallocAlign((void **)&c->tempDst, 8, stride*24);
|
||||
reallocAlign((void **)&c->tempSrc, 8, stride*24);
|
||||
@ -757,7 +760,8 @@ static void reallocBuffers(PPContext *c, int width, int height, int stride){
|
||||
}
|
||||
|
||||
reallocAlign((void **)&c->deintTemp, 8, 2*width+32);
|
||||
reallocAlign((void **)&c->nonBQPTable, 8, mbWidth*mbHeight*sizeof(QP_STORE_T));
|
||||
reallocAlign((void **)&c->nonBQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
|
||||
reallocAlign((void **)&c->stdQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
|
||||
reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
|
||||
}
|
||||
|
||||
@ -772,6 +776,7 @@ static void global_init(){
|
||||
pp_context_t *pp_get_context(int width, int height, int cpuCaps){
|
||||
PPContext *c= memalign(32, sizeof(PPContext));
|
||||
int stride= (width+15)&(~15); //assumed / will realloc if needed
|
||||
int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
|
||||
|
||||
global_init();
|
||||
|
||||
@ -785,7 +790,7 @@ pp_context_t *pp_get_context(int width, int height, int cpuCaps){
|
||||
c->vChromaSubSample= 1;
|
||||
}
|
||||
|
||||
reallocBuffers(c, width, height, stride);
|
||||
reallocBuffers(c, width, height, stride, qpStride);
|
||||
|
||||
c->frameNum=-1;
|
||||
|
||||
@ -804,6 +809,7 @@ void pp_free_context(void *vc){
|
||||
free(c->tempDst);
|
||||
free(c->tempSrc);
|
||||
free(c->deintTemp);
|
||||
free(c->stdQPTable);
|
||||
free(c->nonBQPTable);
|
||||
free(c->forcedQPTable);
|
||||
|
||||
@ -823,9 +829,11 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
|
||||
PPMode *mode = (PPMode*)vm;
|
||||
PPContext *c = (PPContext*)vc;
|
||||
int minStride= MAX(srcStride[0], dstStride[0]);
|
||||
|
||||
if(c->stride < minStride)
|
||||
reallocBuffers(c, width, height, minStride);
|
||||
|
||||
if(c->stride < minStride || c->qpStride < QPStride)
|
||||
reallocBuffers(c, width, height,
|
||||
MAX(minStride, c->stride),
|
||||
MAX(c->qpStride, QPStride));
|
||||
|
||||
if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
|
||||
{
|
||||
@ -837,6 +845,20 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
|
||||
else
|
||||
for(i=0; i<mbWidth; i++) QP_store[i]= 1;
|
||||
}
|
||||
//printf("pict_type:%d\n", pict_type);
|
||||
|
||||
if(pict_type & PP_PICT_TYPE_QP2){
|
||||
int i;
|
||||
const int count= mbHeight * QPStride;
|
||||
for(i=0; i<(count>>2); i++){
|
||||
((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
|
||||
}
|
||||
for(i<<=2; i<count; i++){
|
||||
c->stdQPTable[i] = QP_store[i]>>1;
|
||||
}
|
||||
QP_store= c->stdQPTable;
|
||||
}
|
||||
|
||||
if(0){
|
||||
int x,y;
|
||||
for(y=0; y<mbHeight; y++){
|
||||
@ -847,18 +869,16 @@ for(y=0; y<mbHeight; y++){
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
//printf("pict_type:%d\n", pict_type);
|
||||
|
||||
if(pict_type!=3)
|
||||
if((pict_type&7)!=3)
|
||||
{
|
||||
int x,y;
|
||||
for(y=0; y<mbHeight; y++){
|
||||
for(x=0; x<mbWidth; x++){
|
||||
int qscale= QP_store[x + y*QPStride];
|
||||
if(qscale&~31)
|
||||
qscale=31;
|
||||
c->nonBQPTable[y*mbWidth + x]= qscale;
|
||||
}
|
||||
int i;
|
||||
const int count= mbHeight * QPStride;
|
||||
for(i=0; i<(count>>2); i++){
|
||||
((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x1F1F1F1F;
|
||||
}
|
||||
for(i<<=2; i<count; i++){
|
||||
c->nonBQPTable[i] = QP_store[i] & 0x1F;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,6 +66,8 @@ void pp_free_context(pp_context_t *ppContext);
|
||||
#define PP_FORMAT_411 (0x00000002|PP_FORMAT)
|
||||
#define PP_FORMAT_444 (0x00000000|PP_FORMAT)
|
||||
|
||||
#define PP_PICT_TYPE_QP2 0x00000010 ///< MPEG2 style QScale
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -137,6 +137,7 @@ typedef struct PPContext{
|
||||
uint64_t __attribute__((aligned(8))) mmxDcOffset[32];
|
||||
uint64_t __attribute__((aligned(8))) mmxDcThreshold[32];
|
||||
|
||||
QP_STORE_T *stdQPTable; ///< used to fix MPEG2 style qscale
|
||||
QP_STORE_T *nonBQPTable;
|
||||
QP_STORE_T *forcedQPTable;
|
||||
|
||||
@ -147,7 +148,8 @@ typedef struct PPContext{
|
||||
|
||||
int cpuCaps;
|
||||
|
||||
int stride; ///<size of some buffers (needed to realloc them if needed)
|
||||
int qpStride; ///<size of qp buffers (needed to realloc them if needed)
|
||||
int stride; ///<size of some buffers (needed to realloc them if needed)
|
||||
|
||||
int hChromaSubSample;
|
||||
int vChromaSubSample;
|
||||
@ -155,3 +157,4 @@ typedef struct PPContext{
|
||||
PPMode ppMode;
|
||||
} PPContext;
|
||||
|
||||
|
||||
|
@ -2993,7 +2993,7 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
|
||||
uint8_t *tempBlock2= c.tempBlocks + 8;
|
||||
#endif
|
||||
int8_t *QPptr= &QPs[(y>>qpVShift)*QPStride];
|
||||
int8_t *nonBQPptr= &c.nonBQPTable[(y>>qpVShift)*mbWidth];
|
||||
int8_t *nonBQPptr= &c.nonBQPTable[(y>>qpVShift)*QPStride];
|
||||
int QP=0;
|
||||
/* can we mess with a 8x16 block from srcBlock/dstBlock downwards and 1 line upwards
|
||||
if not than use a temporary buffer */
|
||||
|
@ -2001,8 +2001,11 @@ eos: //end of slice
|
||||
if (s->mb_y<<field_pic == s->mb_height && !s->first_field) {
|
||||
/* end of image */
|
||||
|
||||
if(s->mpeg2)
|
||||
s->qscale >>=1;
|
||||
if(s->mpeg2){
|
||||
s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2;
|
||||
}else
|
||||
s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG1;
|
||||
|
||||
ff_er_frame_end(s);
|
||||
|
||||
MPV_frame_end(s);
|
||||
|
Loading…
Reference in New Issue
Block a user