@ -31,19 +31,22 @@
# include "intreadwrite.h"
# include "version.h"
void av_read_image_line ( uint16_t * dst ,
void av_read_image_line2 ( void * dst ,
const uint8_t * data [ 4 ] , const int linesize [ 4 ] ,
const AVPixFmtDescriptor * desc ,
int x , int y , int c , int w ,
int read_pal_component )
int read_pal_component ,
int dst_element_size )
{
AVComponentDescriptor comp = desc - > comp [ c ] ;
int plane = comp . plane ;
int depth = comp . depth ;
int mask = ( 1 < < depth ) - 1 ;
unsigned mask = ( 1ULL < < depth ) - 1 ;
int shift = comp . shift ;
int step = comp . step ;
int flags = desc - > flags ;
uint16_t * dst16 = dst ;
uint32_t * dst32 = dst ;
if ( flags & AV_PIX_FMT_FLAG_BITSTREAM ) {
int skip = x * step + comp . offset ;
@ -57,38 +60,56 @@ void av_read_image_line(uint16_t *dst,
shift - = step ;
p - = shift > > 3 ;
shift & = 7 ;
* dst + + = val ;
if ( dst_element_size = = 4 ) * dst32 + + = val ;
else * dst16 + + = val ;
}
} else {
const uint8_t * p = data [ plane ] + y * linesize [ plane ] +
x * step + comp . offset ;
int is_8bit = shift + depth < = 8 ;
int is_16bit = shift + depth < = 16 ;
if ( is_8bit )
p + = ! ! ( flags & AV_PIX_FMT_FLAG_BE ) ;
while ( w - - ) {
int val = is_8bit ? * p :
flags & AV_PIX_FMT_FLAG_BE ? AV_RB16 ( p ) : AV_RL16 ( p ) ;
unsigned val ;
if ( is_8bit ) val = * p ;
else if ( is_16bit ) val = flags & AV_PIX_FMT_FLAG_BE ? AV_RB16 ( p ) : AV_RL16 ( p ) ;
else val = flags & AV_PIX_FMT_FLAG_BE ? AV_RB32 ( p ) : AV_RL32 ( p ) ;
val = ( val > > shift ) & mask ;
if ( read_pal_component )
val = data [ 1 ] [ 4 * val + c ] ;
p + = step ;
* dst + + = val ;
if ( dst_element_size = = 4 ) * dst32 + + = val ;
else * dst16 + + = val ;
}
}
}
void av_write_image_line ( const uint16_t * src ,
void av_read_image_line ( uint16_t * dst ,
const uint8_t * data [ 4 ] , const int linesize [ 4 ] ,
const AVPixFmtDescriptor * desc ,
int x , int y , int c , int w ,
int read_pal_component )
{
av_read_image_line2 ( dst , data , linesize , desc , x , y , c , w ,
read_pal_component ,
2 ) ;
}
void av_write_image_line2 ( const void * src ,
uint8_t * data [ 4 ] , const int linesize [ 4 ] ,
const AVPixFmtDescriptor * desc ,
int x , int y , int c , int w )
int x , int y , int c , int w , int src_element_size )
{
AVComponentDescriptor comp = desc - > comp [ c ] ;
int plane = comp . plane ;
int depth = comp . depth ;
int step = comp . step ;
int flags = desc - > flags ;
const uint32_t * src32 = src ;
const uint16_t * src16 = src ;
if ( flags & AV_PIX_FMT_FLAG_BITSTREAM ) {
int skip = x * step + comp . offset ;
@ -96,7 +117,7 @@ void av_write_image_line(const uint16_t *src,
int shift = 8 - depth - ( skip & 7 ) ;
while ( w - - ) {
* p | = * src + + < < shift ;
* p | = ( src_element_size = = 4 ? * src32 + + : * src16 + + ) < < shift ;
shift - = step ;
p - = shift > > 3 ;
shift & = 7 ;
@ -109,17 +130,28 @@ void av_write_image_line(const uint16_t *src,
if ( shift + depth < = 8 ) {
p + = ! ! ( flags & AV_PIX_FMT_FLAG_BE ) ;
while ( w - - ) {
* p | = ( * src + + < < shift ) ;
* p | = ( ( src_element_size = = 4 ? * src32 + + : * src16 + + ) < < shift ) ;
p + = step ;
}
} else {
while ( w - - ) {
if ( flags & AV_PIX_FMT_FLAG_BE ) {
uint16_t val = AV_RB16 ( p ) | ( * src + + < < shift ) ;
AV_WB16 ( p , val ) ;
unsigned s = ( src_element_size = = 4 ? * src32 + + : * src16 + + ) ;
if ( shift + depth < = 16 ) {
if ( flags & AV_PIX_FMT_FLAG_BE ) {
uint16_t val = AV_RB16 ( p ) | ( s < < shift ) ;
AV_WB16 ( p , val ) ;
} else {
uint16_t val = AV_RL16 ( p ) | ( s < < shift ) ;
AV_WL16 ( p , val ) ;
}
} else {
uint16_t val = AV_RL16 ( p ) | ( * src + + < < shift ) ;
AV_WL16 ( p , val ) ;
if ( flags & AV_PIX_FMT_FLAG_BE ) {
uint32_t val = AV_RB32 ( p ) | ( s < < shift ) ;
AV_WB32 ( p , val ) ;
} else {
uint32_t val = AV_RL32 ( p ) | ( s < < shift ) ;
AV_WL32 ( p , val ) ;
}
}
p + = step ;
}
@ -127,6 +159,14 @@ void av_write_image_line(const uint16_t *src,
}
}
void av_write_image_line ( const uint16_t * src ,
uint8_t * data [ 4 ] , const int linesize [ 4 ] ,
const AVPixFmtDescriptor * desc ,
int x , int y , int c , int w )
{
av_write_image_line2 ( src , data , linesize , desc , x , y , c , w , 2 ) ;
}
# if FF_API_PLUS1_MINUS1
FF_DISABLE_DEPRECATION_WARNINGS
# endif