Browse code

sws_ prefix, more seperation between internal & external swscaler API sws_scale() returns the number of outputed lines

Originally committed as revision 9495 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc

Michael Niedermayer authored on 2003/02/24 07:05:55
Showing 7 changed files
... ...
@@ -226,11 +226,11 @@ float sws_lum_sharpen= 0.0;
226 226
    (if there is no support for something compiled in it wont appear here) */
227 227
 static CpuCaps cpuCaps;
228 228
 
229
-void (*swScale)(SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
229
+int (*swScale)(SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
230 230
              int srcSliceH, uint8_t* dst[], int dstStride[])=NULL;
231 231
 
232
-static SwsVector *getConvVec(SwsVector *a, SwsVector *b);
233
-
232
+static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b);
233
+		  
234 234
 extern const uint8_t dither_2x2_4[2][8];
235 235
 extern const uint8_t dither_2x2_8[2][8];
236 236
 extern const uint8_t dither_8x8_32[8][8];
... ...
@@ -306,9 +306,9 @@ static void doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcForma
306 306
 		out[i]= malloc(refStride[i]*h);
307 307
 	}
308 308
 
309
-	srcContext= getSwsContext(w, h, IMGFMT_YV12, srcW, srcH, srcFormat, flags, NULL, NULL);
310
-	dstContext= getSwsContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL);
311
-	outContext= getSwsContext(dstW, dstH, dstFormat, w, h, IMGFMT_YV12, flags, NULL, NULL);
309
+	srcContext= sws_getContext(w, h, IMGFMT_YV12, srcW, srcH, srcFormat, flags, NULL, NULL);
310
+	dstContext= sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL);
311
+	outContext= sws_getContext(dstW, dstH, dstFormat, w, h, IMGFMT_YV12, flags, NULL, NULL);
312 312
 	if(srcContext==NULL ||dstContext==NULL ||outContext==NULL){
313 313
 		printf("Failed allocating swsContext\n");
314 314
 		goto end;
... ...
@@ -340,9 +340,9 @@ static void doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcForma
340 340
 
341 341
 	end:
342 342
 	
343
-	freeSwsContext(srcContext);
344
-	freeSwsContext(dstContext);
345
-	freeSwsContext(outContext);
343
+	sws_freeContext(srcContext);
344
+	sws_freeContext(dstContext);
345
+	sws_freeContext(outContext);
346 346
 
347 347
 	for(i=0; i<3; i++){
348 348
 		free(src[i]);
... ...
@@ -918,12 +918,12 @@ void SwScale_YV12slice(unsigned char* src[], int srcStride[], int srcSliceY ,
918 918
 		default: return;
919 919
 	}
920 920
 
921
-	if(!context) context=getSwsContextFromCmdLine(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat);
921
+	if(!context) context=sws_getContextFromCmdLine(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat);
922 922
 
923 923
 	context->swScale(context, src, srcStride, srcSliceY, srcSliceH, dst, dstStride3);
924 924
 }
925 925
 
926
-void swsGetFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam)
926
+void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam)
927 927
 {
928 928
 	static int firstTime=1;
929 929
 	*flags=0;
... ...
@@ -939,62 +939,62 @@ void swsGetFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, Sws
939 939
 	}
940 940
 	else if(verbose>1) *flags= SWS_PRINT_INFO;
941 941
 
942
-	if(src_filter.lumH) freeVec(src_filter.lumH);
943
-	if(src_filter.lumV) freeVec(src_filter.lumV);
944
-	if(src_filter.chrH) freeVec(src_filter.chrH);
945
-	if(src_filter.chrV) freeVec(src_filter.chrV);
942
+	if(src_filter.lumH) sws_freeVec(src_filter.lumH);
943
+	if(src_filter.lumV) sws_freeVec(src_filter.lumV);
944
+	if(src_filter.chrH) sws_freeVec(src_filter.chrH);
945
+	if(src_filter.chrV) sws_freeVec(src_filter.chrV);
946 946
 
947 947
 	if(sws_lum_gblur!=0.0){
948
-		src_filter.lumH= getGaussianVec(sws_lum_gblur, 3.0);
949
-		src_filter.lumV= getGaussianVec(sws_lum_gblur, 3.0);
948
+		src_filter.lumH= sws_getGaussianVec(sws_lum_gblur, 3.0);
949
+		src_filter.lumV= sws_getGaussianVec(sws_lum_gblur, 3.0);
950 950
 	}else{
951
-		src_filter.lumH= getIdentityVec();
952
-		src_filter.lumV= getIdentityVec();
951
+		src_filter.lumH= sws_getIdentityVec();
952
+		src_filter.lumV= sws_getIdentityVec();
953 953
 	}
954 954
 
955 955
 	if(sws_chr_gblur!=0.0){
956
-		src_filter.chrH= getGaussianVec(sws_chr_gblur, 3.0);
957
-		src_filter.chrV= getGaussianVec(sws_chr_gblur, 3.0);
956
+		src_filter.chrH= sws_getGaussianVec(sws_chr_gblur, 3.0);
957
+		src_filter.chrV= sws_getGaussianVec(sws_chr_gblur, 3.0);
958 958
 	}else{
959
-		src_filter.chrH= getIdentityVec();
960
-		src_filter.chrV= getIdentityVec();
959
+		src_filter.chrH= sws_getIdentityVec();
960
+		src_filter.chrV= sws_getIdentityVec();
961 961
 	}
962 962
 
963 963
 	if(sws_chr_sharpen!=0.0){
964
-		SwsVector *g= getConstVec(-1.0, 3);
965
-		SwsVector *id= getConstVec(10.0/sws_chr_sharpen, 1);
964
+		SwsVector *g= sws_getConstVec(-1.0, 3);
965
+		SwsVector *id= sws_getConstVec(10.0/sws_chr_sharpen, 1);
966 966
 		g->coeff[1]=2.0;
967
-		addVec(id, g);
968
-		convVec(src_filter.chrH, id);
969
-		convVec(src_filter.chrV, id);
970
-		freeVec(g);
971
-		freeVec(id);
967
+		sws_addVec(id, g);
968
+		sws_convVec(src_filter.chrH, id);
969
+		sws_convVec(src_filter.chrV, id);
970
+		sws_freeVec(g);
971
+		sws_freeVec(id);
972 972
 	}
973 973
 
974 974
 	if(sws_lum_sharpen!=0.0){
975
-		SwsVector *g= getConstVec(-1.0, 3);
976
-		SwsVector *id= getConstVec(10.0/sws_lum_sharpen, 1);
975
+		SwsVector *g= sws_getConstVec(-1.0, 3);
976
+		SwsVector *id= sws_getConstVec(10.0/sws_lum_sharpen, 1);
977 977
 		g->coeff[1]=2.0;
978
-		addVec(id, g);
979
-		convVec(src_filter.lumH, id);
980
-		convVec(src_filter.lumV, id);
981
-		freeVec(g);
982
-		freeVec(id);
978
+		sws_addVec(id, g);
979
+		sws_convVec(src_filter.lumH, id);
980
+		sws_convVec(src_filter.lumV, id);
981
+		sws_freeVec(g);
982
+		sws_freeVec(id);
983 983
 	}
984 984
 
985 985
 	if(sws_chr_hshift)
986
-		shiftVec(src_filter.chrH, sws_chr_hshift);
986
+		sws_shiftVec(src_filter.chrH, sws_chr_hshift);
987 987
 
988 988
 	if(sws_chr_vshift)
989
-		shiftVec(src_filter.chrV, sws_chr_vshift);
989
+		sws_shiftVec(src_filter.chrV, sws_chr_vshift);
990 990
 
991
-	normalizeVec(src_filter.chrH, 1.0);
992
-	normalizeVec(src_filter.chrV, 1.0);
993
-	normalizeVec(src_filter.lumH, 1.0);
994
-	normalizeVec(src_filter.lumV, 1.0);
991
+	sws_normalizeVec(src_filter.chrH, 1.0);
992
+	sws_normalizeVec(src_filter.chrV, 1.0);
993
+	sws_normalizeVec(src_filter.lumH, 1.0);
994
+	sws_normalizeVec(src_filter.lumV, 1.0);
995 995
 
996
-	if(verbose > 1) printVec(src_filter.chrH);
997
-	if(verbose > 1) printVec(src_filter.lumH);
996
+	if(verbose > 1) sws_printVec(src_filter.chrH);
997
+	if(verbose > 1) sws_printVec(src_filter.lumH);
998 998
 
999 999
 	switch(sws_flags)
1000 1000
 	{
... ...
@@ -1017,13 +1017,13 @@ void swsGetFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, Sws
1017 1017
 }
1018 1018
 
1019 1019
 // will use sws_flags & src_filter (from cmd line)
1020
-SwsContext *getSwsContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat)
1020
+SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat)
1021 1021
 {
1022 1022
 	int flags;
1023 1023
 	SwsFilter *dstFilterParam, *srcFilterParam;
1024
-	swsGetFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam);
1024
+	sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam);
1025 1025
 
1026
-	return getSwsContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, srcFilterParam, dstFilterParam);
1026
+	return sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, srcFilterParam, dstFilterParam);
1027 1027
 }
1028 1028
 
1029 1029
 static double getSplineCoeff(double a, double b, double c, double d, double dist)
... ...
@@ -1245,7 +1245,7 @@ static inline void initFilter(int16_t **outFilter, int16_t **filterPos, int *out
1245 1245
 		scaleFilter.coeff= filter + i*filterSize;
1246 1246
 		scaleFilter.length= filterSize;
1247 1247
 
1248
-		if(srcFilter) outVec= getConvVec(srcFilter, &scaleFilter);
1248
+		if(srcFilter) outVec= sws_getConvVec(srcFilter, &scaleFilter);
1249 1249
 		else	      outVec= &scaleFilter;
1250 1250
 
1251 1251
 		ASSERT(outVec->length == filter2Size)
... ...
@@ -1258,7 +1258,7 @@ static inline void initFilter(int16_t **outFilter, int16_t **filterPos, int *out
1258 1258
 
1259 1259
 		(*filterPos)[i]+= (filterSize-1)/2 - (filter2Size-1)/2;
1260 1260
 
1261
-		if(outVec != &scaleFilter) freeVec(outVec);
1261
+		if(outVec != &scaleFilter) sws_freeVec(outVec);
1262 1262
 	}
1263 1263
 	free(filter); filter=NULL;
1264 1264
 
... ...
@@ -1607,7 +1607,7 @@ cpuCaps= gCpuCaps;
1607 1607
 #endif //!RUNTIME_CPUDETECT
1608 1608
 }
1609 1609
 
1610
-static void PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1610
+static int PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1611 1611
              int srcSliceH, uint8_t* dstParam[], int dstStride[]){
1612 1612
 	uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
1613 1613
 	/* Copy Y plane */
... ...
@@ -1630,9 +1630,10 @@ static void PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[],
1630 1630
 		interleaveBytes( src[1],src[2],dst,c->srcW,srcSliceH,srcStride[1],srcStride[2],dstStride[0] );
1631 1631
 	else /* I420 & IYUV */
1632 1632
 		interleaveBytes( src[2],src[1],dst,c->srcW,srcSliceH,srcStride[2],srcStride[1],dstStride[0] );
1633
+	return srcSliceH;
1633 1634
 }
1634 1635
 
1635
-static void PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1636
+static int PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1636 1637
              int srcSliceH, uint8_t* dstParam[], int dstStride[]){
1637 1638
 	uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
1638 1639
 
... ...
@@ -1640,10 +1641,11 @@ static void PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[],
1640 1640
 		yv12toyuy2( src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] );
1641 1641
 	else /* I420 & IYUV */
1642 1642
 		yv12toyuy2( src[0],src[2],src[1],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] );
1643
+	return srcSliceH;
1643 1644
 }
1644 1645
 
1645 1646
 /* {RGB,BGR}{15,16,24,32} -> {RGB,BGR}{15,16,24,32} */
1646
-static void rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1647
+static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1647 1648
 			   int srcSliceH, uint8_t* dst[], int dstStride[]){
1648 1649
 	const int srcFormat= c->srcFormat;
1649 1650
 	const int dstFormat= c->dstFormat;
... ...
@@ -1714,9 +1716,10 @@ static void rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int s
1714 1714
 			dstPtr+= dstStride[0];
1715 1715
 		}
1716 1716
 	}     
1717
+	return srcSliceH;
1717 1718
 }
1718 1719
 
1719
-static void bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1720
+static int bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1720 1721
              int srcSliceH, uint8_t* dst[], int dstStride[]){
1721 1722
 
1722 1723
 	rgb24toyv12(
... ...
@@ -1726,9 +1729,10 @@ static void bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], i
1726 1726
 		dst[2]+(srcSliceY>>1)*dstStride[2],
1727 1727
 		c->srcW, srcSliceH, 
1728 1728
 		dstStride[0], dstStride[1], srcStride[0]);
1729
+	return srcSliceH;
1729 1730
 }
1730 1731
 
1731
-static void yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1732
+static int yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
1732 1733
              int srcSliceH, uint8_t* dst[], int dstStride[]){
1733 1734
 	int i;
1734 1735
 
... ...
@@ -1754,6 +1758,7 @@ static void yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], in
1754 1754
 		planar2x(src[1], dst[2], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[2]);
1755 1755
 		planar2x(src[2], dst[1], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[1]);
1756 1756
 	}
1757
+	return srcSliceH;
1757 1758
 }
1758 1759
 
1759 1760
 /**
... ...
@@ -1792,7 +1797,7 @@ inline void sws_orderYUV(int format, uint8_t * sortedP[], int sortedStride[], ui
1792 1792
 }
1793 1793
 
1794 1794
 /* unscaled copy like stuff (assumes nearly identical formats) */
1795
-static void simpleCopy(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
1795
+static int simpleCopy(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
1796 1796
              int srcSliceH, uint8_t* dstParam[], int dstStrideParam[]){
1797 1797
 
1798 1798
 	int srcStride[3];
... ...
@@ -1860,6 +1865,7 @@ static void simpleCopy(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[],
1860 1860
 			}
1861 1861
 		}
1862 1862
 	}
1863
+	return srcSliceH;
1863 1864
 }
1864 1865
 
1865 1866
 static int remove_dup_fourcc(int fourcc)
... ...
@@ -1985,7 +1991,7 @@ int sws_getColorspaceDetails(SwsContext *c, int **inv_table, int *srcRange, int
1985 1985
 	return 0;	
1986 1986
 }
1987 1987
 
1988
-SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
1988
+SwsContext *sws_getContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
1989 1989
                          SwsFilter *srcFilter, SwsFilter *dstFilter){
1990 1990
 
1991 1991
 	SwsContext *c;
... ...
@@ -2374,11 +2380,20 @@ SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH,
2374 2374
 }
2375 2375
 
2376 2376
 /**
2377
+ * swscale warper, so we dont need to export the SwsContext
2378
+ */
2379
+int sws_scale(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
2380
+                           int srcSliceH, uint8_t* dst[], int dstStride[]){
2381
+	return c->swScale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride);
2382
+}
2383
+//FIXME order YV12/I420 here
2384
+
2385
+/**
2377 2386
  * returns a normalized gaussian curve used to filter stuff
2378 2387
  * quality=3 is high quality, lowwer is lowwer quality
2379 2388
  */
2380 2389
 
2381
-SwsVector *getGaussianVec(double variance, double quality){
2390
+SwsVector *sws_getGaussianVec(double variance, double quality){
2382 2391
 	const int length= (int)(variance*quality + 0.5) | 1;
2383 2392
 	int i;
2384 2393
 	double *coeff= memalign(sizeof(double), length*sizeof(double));
... ...
@@ -2394,12 +2409,12 @@ SwsVector *getGaussianVec(double variance, double quality){
2394 2394
 		coeff[i]= exp( -dist*dist/(2*variance*variance) ) / sqrt(2*variance*PI);
2395 2395
 	}
2396 2396
 
2397
-	normalizeVec(vec, 1.0);
2397
+	sws_normalizeVec(vec, 1.0);
2398 2398
 
2399 2399
 	return vec;
2400 2400
 }
2401 2401
 
2402
-SwsVector *getConstVec(double c, int length){
2402
+SwsVector *sws_getConstVec(double c, int length){
2403 2403
 	int i;
2404 2404
 	double *coeff= memalign(sizeof(double), length*sizeof(double));
2405 2405
 	SwsVector *vec= malloc(sizeof(SwsVector));
... ...
@@ -2414,7 +2429,7 @@ SwsVector *getConstVec(double c, int length){
2414 2414
 }
2415 2415
 
2416 2416
 
2417
-SwsVector *getIdentityVec(void){
2417
+SwsVector *sws_getIdentityVec(void){
2418 2418
 	double *coeff= memalign(sizeof(double), sizeof(double));
2419 2419
 	SwsVector *vec= malloc(sizeof(SwsVector));
2420 2420
 	coeff[0]= 1.0;
... ...
@@ -2425,7 +2440,7 @@ SwsVector *getIdentityVec(void){
2425 2425
 	return vec;
2426 2426
 }
2427 2427
 
2428
-void normalizeVec(SwsVector *a, double height){
2428
+void sws_normalizeVec(SwsVector *a, double height){
2429 2429
 	int i;
2430 2430
 	double sum=0;
2431 2431
 	double inv;
... ...
@@ -2439,14 +2454,14 @@ void normalizeVec(SwsVector *a, double height){
2439 2439
 		a->coeff[i]*= inv;
2440 2440
 }
2441 2441
 
2442
-void scaleVec(SwsVector *a, double scalar){
2442
+void sws_scaleVec(SwsVector *a, double scalar){
2443 2443
 	int i;
2444 2444
 
2445 2445
 	for(i=0; i<a->length; i++)
2446 2446
 		a->coeff[i]*= scalar;
2447 2447
 }
2448 2448
 
2449
-static SwsVector *getConvVec(SwsVector *a, SwsVector *b){
2449
+static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b){
2450 2450
 	int length= a->length + b->length - 1;
2451 2451
 	double *coeff= memalign(sizeof(double), length*sizeof(double));
2452 2452
 	int i, j;
... ...
@@ -2468,7 +2483,7 @@ static SwsVector *getConvVec(SwsVector *a, SwsVector *b){
2468 2468
 	return vec;
2469 2469
 }
2470 2470
 
2471
-static SwsVector *sumVec(SwsVector *a, SwsVector *b){
2471
+static SwsVector *sws_sumVec(SwsVector *a, SwsVector *b){
2472 2472
 	int length= MAX(a->length, b->length);
2473 2473
 	double *coeff= memalign(sizeof(double), length*sizeof(double));
2474 2474
 	int i;
... ...
@@ -2485,7 +2500,7 @@ static SwsVector *sumVec(SwsVector *a, SwsVector *b){
2485 2485
 	return vec;
2486 2486
 }
2487 2487
 
2488
-static SwsVector *diffVec(SwsVector *a, SwsVector *b){
2488
+static SwsVector *sws_diffVec(SwsVector *a, SwsVector *b){
2489 2489
 	int length= MAX(a->length, b->length);
2490 2490
 	double *coeff= memalign(sizeof(double), length*sizeof(double));
2491 2491
 	int i;
... ...
@@ -2503,7 +2518,7 @@ static SwsVector *diffVec(SwsVector *a, SwsVector *b){
2503 2503
 }
2504 2504
 
2505 2505
 /* shift left / or right if "shift" is negative */
2506
-static SwsVector *getShiftedVec(SwsVector *a, int shift){
2506
+static SwsVector *sws_getShiftedVec(SwsVector *a, int shift){
2507 2507
 	int length= a->length + ABS(shift)*2;
2508 2508
 	double *coeff= memalign(sizeof(double), length*sizeof(double));
2509 2509
 	int i;
... ...
@@ -2522,39 +2537,39 @@ static SwsVector *getShiftedVec(SwsVector *a, int shift){
2522 2522
 	return vec;
2523 2523
 }
2524 2524
 
2525
-void shiftVec(SwsVector *a, int shift){
2526
-	SwsVector *shifted= getShiftedVec(a, shift);
2525
+void sws_shiftVec(SwsVector *a, int shift){
2526
+	SwsVector *shifted= sws_getShiftedVec(a, shift);
2527 2527
 	free(a->coeff);
2528 2528
 	a->coeff= shifted->coeff;
2529 2529
 	a->length= shifted->length;
2530 2530
 	free(shifted);
2531 2531
 }
2532 2532
 
2533
-void addVec(SwsVector *a, SwsVector *b){
2534
-	SwsVector *sum= sumVec(a, b);
2533
+void sws_addVec(SwsVector *a, SwsVector *b){
2534
+	SwsVector *sum= sws_sumVec(a, b);
2535 2535
 	free(a->coeff);
2536 2536
 	a->coeff= sum->coeff;
2537 2537
 	a->length= sum->length;
2538 2538
 	free(sum);
2539 2539
 }
2540 2540
 
2541
-void subVec(SwsVector *a, SwsVector *b){
2542
-	SwsVector *diff= diffVec(a, b);
2541
+void sws_subVec(SwsVector *a, SwsVector *b){
2542
+	SwsVector *diff= sws_diffVec(a, b);
2543 2543
 	free(a->coeff);
2544 2544
 	a->coeff= diff->coeff;
2545 2545
 	a->length= diff->length;
2546 2546
 	free(diff);
2547 2547
 }
2548 2548
 
2549
-void convVec(SwsVector *a, SwsVector *b){
2550
-	SwsVector *conv= getConvVec(a, b);
2551
-	free(a->coeff);
2549
+void sws_convVec(SwsVector *a, SwsVector *b){
2550
+	SwsVector *conv= sws_getConvVec(a, b);
2551
+	free(a->coeff);  
2552 2552
 	a->coeff= conv->coeff;
2553 2553
 	a->length= conv->length;
2554 2554
 	free(conv);
2555 2555
 }
2556 2556
 
2557
-SwsVector *cloneVec(SwsVector *a){
2557
+SwsVector *sws_cloneVec(SwsVector *a){
2558 2558
 	double *coeff= memalign(sizeof(double), a->length*sizeof(double));
2559 2559
 	int i;
2560 2560
 	SwsVector *vec= malloc(sizeof(SwsVector));
... ...
@@ -2567,7 +2582,7 @@ SwsVector *cloneVec(SwsVector *a){
2567 2567
 	return vec;
2568 2568
 }
2569 2569
 
2570
-void printVec(SwsVector *a){
2570
+void sws_printVec(SwsVector *a){
2571 2571
 	int i;
2572 2572
 	double max=0;
2573 2573
 	double min=0;
... ...
@@ -2590,7 +2605,7 @@ void printVec(SwsVector *a){
2590 2590
 	}
2591 2591
 }
2592 2592
 
2593
-void freeVec(SwsVector *a){
2593
+void sws_freeVec(SwsVector *a){
2594 2594
 	if(!a) return;
2595 2595
 	if(a->coeff) free(a->coeff);
2596 2596
 	a->coeff=NULL;
... ...
@@ -2598,7 +2613,7 @@ void freeVec(SwsVector *a){
2598 2598
 	free(a);
2599 2599
 }
2600 2600
 
2601
-void freeSwsContext(SwsContext *c){
2601
+void sws_freeContext(SwsContext *c){
2602 2602
 	int i;
2603 2603
 	if(!c) return;
2604 2604
 
... ...
@@ -19,7 +19,15 @@
19 19
 #ifndef SWSCALE_H
20 20
 #define SWSCALE_H
21 21
 
22
-#include "swscale_internal.h" //FIXME HACK REMOVE
22
+/**
23
+ * @file swscale.h
24
+ * @brief 
25
+ *     external api for the swscale stuff
26
+ */
27
+
28
+#ifdef __cplusplus
29
+extern "C" {
30
+#endif
23 31
 
24 32
 /* values for the flags, the stuff on the command line is different */
25 33
 #define SWS_FAST_BILINEAR 1
... ...
@@ -76,42 +84,47 @@ typedef struct {
76 76
 	SwsVector *chrV;
77 77
 } SwsFilter;
78 78
 
79
+struct SwsContext;
79 80
 
81
+//typedef struct SwsContext;
80 82
 // *** bilinear scaling and yuv->rgb & yuv->yuv conversion of yv12 slices:
81 83
 // *** Note: it's called multiple times while decoding a frame, first time y==0
82 84
 // dstbpp == 12 -> yv12 output
83 85
 // will use sws_flags
86
+// deprecated, will be removed
84 87
 void SwScale_YV12slice(unsigned char* src[],int srcStride[], int srcSliceY,
85 88
 			     int srcSliceH, uint8_t* dst[], int dstStride, int dstbpp,
86 89
 			     int srcW, int srcH, int dstW, int dstH);
87 90
 
88
-// Obsolete, will be removed soon
89
-void SwScale_Init();
90
-
91 91
 
92
+void sws_freeContext(struct SwsContext *swsContext);
92 93
 
93
-void freeSwsContext(SwsContext *swsContext);
94
-
95
-SwsContext *getSwsContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat);
96
-SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
94
+struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat);
95
+struct SwsContext *sws_getContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
97 96
 			 SwsFilter *srcFilter, SwsFilter *dstFilter);
98
-void swsGetFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam);
99
-
100
-int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation);
101
-int sws_getColorspaceDetails(SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation);
102
-
103
-SwsVector *getGaussianVec(double variance, double quality);
104
-SwsVector *getConstVec(double c, int length);
105
-SwsVector *getIdentityVec(void);
106
-void scaleVec(SwsVector *a, double scalar);
107
-void normalizeVec(SwsVector *a, double height);
108
-void convVec(SwsVector *a, SwsVector *b);
109
-void addVec(SwsVector *a, SwsVector *b);
110
-void subVec(SwsVector *a, SwsVector *b);
111
-void shiftVec(SwsVector *a, int shift);
112
-SwsVector *cloneVec(SwsVector *a);
113
-
114
-void printVec(SwsVector *a);
115
-void freeVec(SwsVector *a);
97
+int sws_scale(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
98
+                           int srcSliceH, uint8_t* dst[], int dstStride[]);
99
+
100
+void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam); //FIXME try to seperate this 
101
+
102
+int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation);
103
+int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation);
104
+SwsVector *sws_getGaussianVec(double variance, double quality);
105
+SwsVector *sws_getConstVec(double c, int length);
106
+SwsVector *sws_getIdentityVec(void);
107
+void sws_scaleVec(SwsVector *a, double scalar);
108
+void sws_normalizeVec(SwsVector *a, double height);
109
+void sws_convVec(SwsVector *a, SwsVector *b);
110
+void sws_addVec(SwsVector *a, SwsVector *b);
111
+void sws_subVec(SwsVector *a, SwsVector *b);
112
+void sws_shiftVec(SwsVector *a, int shift);
113
+SwsVector *sws_cloneVec(SwsVector *a);
114
+
115
+void sws_printVec(SwsVector *a);
116
+void sws_freeVec(SwsVector *a);
117
+
118
+#ifdef __cplusplus
119
+}
120
+#endif
116 121
 
117 122
 #endif
... ...
@@ -21,13 +21,12 @@
21 21
 
22 22
 #define MAX_FILTER_SIZE 256
23 23
 
24
-struct SwsContext;
25
-
26
-typedef void (*SwsFunc)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
24
+typedef int (*SwsFunc)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
27 25
              int srcSliceH, uint8_t* dst[], int dstStride[]);
28 26
 
29 27
 /* this struct should be aligned on at least 32-byte boundary */
30 28
 typedef struct SwsContext{
29
+	SwsFunc swScale;
31 30
 	int srcW, srcH, dstH;
32 31
 	int chrSrcW, chrSrcH, chrDstW, chrDstH;
33 32
 	int lumXInc, chrXInc;
... ...
@@ -85,8 +84,6 @@ typedef struct SwsContext{
85 85
 	int dstColorspaceTable[4];
86 86
 	int srcRange, dstRange;
87 87
 
88
-	SwsFunc swScale;
89
-
90 88
 #define RED_DITHER   "0*8"
91 89
 #define GREEN_DITHER "1*8"
92 90
 #define BLUE_DITHER  "2*8"
... ...
@@ -121,7 +118,6 @@ typedef struct SwsContext{
121 121
 	int esp;
122 122
 } SwsContext;
123 123
 //FIXME check init (where 0)
124
-//FIXME split private & public
125 124
 
126 125
 inline void sws_orderYUV(int format, uint8_t * sortedP[], int sortedStride[], uint8_t * p[], int stride[]);
127 126
 SwsFunc yuv2rgb_get_func_ptr (SwsContext *c);
... ...
@@ -2502,7 +2502,7 @@ FUNNY_UV_CODE
2502 2502
    }
2503 2503
 }
2504 2504
 
2505
-static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
2505
+static int RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
2506 2506
              int srcSliceH, uint8_t* dstParam[], int dstStrideParam[]){
2507 2507
 
2508 2508
 	/* load a few things into local vars to make the code more readable? and faster */
... ...
@@ -2540,6 +2540,7 @@ static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStridePar
2540 2540
 	uint8_t *formatConvBuffer= c->formatConvBuffer;
2541 2541
 	const int chrSrcSliceY= srcSliceY >> c->chrSrcVSubSample;
2542 2542
 	const int chrSrcSliceH= -((-srcSliceH) >> c->chrSrcVSubSample);
2543
+	int lastDstY;
2543 2544
 
2544 2545
 	/* vars whch will change and which we need to storw back in the context */
2545 2546
 	int dstY= c->dstY;
... ...
@@ -2603,6 +2604,8 @@ i--;
2603 2603
 		lastInChrBuf= -1;
2604 2604
 	}
2605 2605
 
2606
+	lastDstY= dstY;
2607
+
2606 2608
 	for(;dstY < dstH; dstY++){
2607 2609
 		unsigned char *dest =dst[0]+dstStride[0]*dstY;
2608 2610
 		const int chrDstY= dstY>>c->chrDstVSubSample;
... ...
@@ -2810,4 +2813,6 @@ i--;
2810 2810
 	c->chrBufIndex= chrBufIndex;
2811 2811
 	c->lastInLumBuf= lastInLumBuf;
2812 2812
 	c->lastInChrBuf= lastInChrBuf;
2813
+
2814
+	return dstY - lastDstY;
2813 2815
 }
... ...
@@ -262,7 +262,7 @@ const int32_t Inverse_Table_6_9[8][4] = {
262 262
 	dst_2[6*i+3] = b[Y]; dst_2[6*i+4] = g[Y]; dst_2[6*i+5] = r[Y];
263 263
 
264 264
 #define PROLOG(func_name, dst_type) \
265
-static void func_name(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, \
265
+static int func_name(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, \
266 266
              int srcSliceH, uint8_t* dst[], int dstStride[]){\
267 267
     uint8_t *src[3];\
268 268
     int srcStride[3];\
... ...
@@ -294,6 +294,7 @@ static void func_name(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[],
294 294
 	    dst_2 += dst_delta;\
295 295
 	}\
296 296
     }\
297
+    return srcSliceH;\
297 298
 }
298 299
 
299 300
 PROLOG(yuv2rgb_c_32, uint32_t)
... ...
@@ -33,7 +33,7 @@
33 33
 #include "../libvo/img_format.h" //FIXME try to reduce dependency of such stuff
34 34
 #include "swscale.h"
35 35
 
36
-static void mlib_YUV2ARGB420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, 
36
+static int mlib_YUV2ARGB420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, 
37 37
              int srcSliceH, uint8_t* dst[], int dstStride[]){
38 38
     uint8_t *src[3];
39 39
     int srcStride[3];
... ...
@@ -48,9 +48,10 @@ static void mlib_YUV2ARGB420_32(SwsContext *c, uint8_t* srcParam[], int srcStrid
48 48
  
49 49
     mlib_VideoColorYUV2ARGB420(dst[0], src[0], src[1], src[2], c->dstW,
50 50
 			     c->dstH, dstStride[0], srcStride[0], srcStride[1]);
51
+    return srcSliceH;
51 52
 }
52 53
 
53
-static void mlib_YUV2ABGR420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, 
54
+static int mlib_YUV2ABGR420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, 
54 55
              int srcSliceH, uint8_t* dst[], int dstStride[]){
55 56
     uint8_t *src[3];
56 57
     int srcStride[3];
... ...
@@ -65,9 +66,10 @@ static void mlib_YUV2ABGR420_32(SwsContext *c, uint8_t* srcParam[], int srcStrid
65 65
  
66 66
     mlib_VideoColorYUV2ABGR420(dst[0], src[0], src[1], src[2], c->dstW,
67 67
 			     c->dstH, dstStride[0], srcStride[0], srcStride[1]);
68
+    return srcSliceH;
68 69
 }
69 70
 
70
-static void mlib_YUV2RGB420_24(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, 
71
+static int mlib_YUV2RGB420_24(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, 
71 72
              int srcSliceH, uint8_t* dst[], int dstStride[]){
72 73
     uint8_t *src[3];
73 74
     int srcStride[3];
... ...
@@ -82,6 +84,7 @@ static void mlib_YUV2RGB420_24(SwsContext *c, uint8_t* srcParam[], int srcStride
82 82
  
83 83
     mlib_VideoColorYUV2RGB420(dst[0], src[0], src[1], src[2], c->dstW,
84 84
 			     c->dstH, dstStride[0], srcStride[0], srcStride[1]);
85
+    return srcSliceH;
85 86
 }
86 87
 
87 88
 
... ...
@@ -123,7 +123,7 @@
123 123
 		     "punpcklbw %%mm5, %%mm2;" /* G7 G6 G5 G4 G3 G2 G1 G0 */\
124 124
 
125 125
 
126
-static inline void RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
126
+static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
127 127
              int srcSliceH, uint8_t* dst[], int dstStride[]){
128 128
     int srcStride[3];
129 129
     uint8_t *src[3];
... ...
@@ -217,9 +217,11 @@ YUV2RGB
217 217
     }
218 218
 
219 219
     __asm__ __volatile__ (EMMS);
220
+    
221
+    return srcSliceH;
220 222
 }
221 223
 
222
-static inline void RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
224
+static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
223 225
              int srcSliceH, uint8_t* dst[], int dstStride[]){
224 226
     int srcStride[3];
225 227
     uint8_t *src[3];
... ...
@@ -308,9 +310,10 @@ YUV2RGB
308 308
     }
309 309
 
310 310
     __asm__ __volatile__ (EMMS);
311
+    return srcSliceH;
311 312
 }
312 313
 
313
-static inline void RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
314
+static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
314 315
              int srcSliceH, uint8_t* dst[], int dstStride[]){
315 316
     int srcStride[3];
316 317
     uint8_t *src[3];
... ...
@@ -456,9 +459,10 @@ YUV2RGB
456 456
     }
457 457
 
458 458
     __asm__ __volatile__ (EMMS);
459
+    return srcSliceH;
459 460
 }
460 461
 
461
-static inline void RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
462
+static inline int RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY,
462 463
              int srcSliceH, uint8_t* dst[], int dstStride[]){
463 464
     int srcStride[3];
464 465
     uint8_t *src[3];
... ...
@@ -544,4 +548,5 @@ YUV2RGB
544 544
     }
545 545
 
546 546
     __asm__ __volatile__ (EMMS);
547
+    return srcSliceH;
547 548
 }