@ -26,12 +26,12 @@
static av_cold int decode_init ( AVCodecContext * avctx )
{
if ( avctx - > width & 1 ) {
if ( avctx - > width & 1 ) {
av_log ( avctx , AV_LOG_ERROR , " v210x needs even width \n " ) ;
return AVERROR ( EINVAL ) ;
}
avctx - > pix_fmt = AV_PIX_FMT_YUV422P16 ;
avctx - > bits_per_raw_sample = 10 ;
avctx - > pix_fmt = AV_PIX_FMT_YUV422P16 ;
avctx - > bits_per_raw_sample = 10 ;
avctx - > coded_frame = avcodec_alloc_frame ( ) ;
if ( ! avctx - > coded_frame )
@ -43,82 +43,82 @@ static av_cold int decode_init(AVCodecContext *avctx)
static int decode_frame ( AVCodecContext * avctx , void * data , int * got_frame ,
AVPacket * avpkt )
{
int y = 0 ;
int width = avctx - > width ;
AVFrame * pic = avctx - > coded_frame ;
const uint32_t * src = ( const uint32_t * ) avpkt - > data ;
const uint32_t * src = ( const uint32_t * ) avpkt - > data ;
AVFrame * pic = avctx - > coded_frame ;
int width = avctx - > width ;
int y = 0 ;
uint16_t * ydst , * udst , * vdst , * yend ;
int ret ;
if ( pic - > data [ 0 ] )
if ( pic - > data [ 0 ] )
avctx - > release_buffer ( avctx , pic ) ;
if ( avpkt - > size < avctx - > width * avctx - > height * 8 / 3 ) {
if ( avpkt - > size < avctx - > width * avctx - > height * 8 / 3 ) {
av_log ( avctx , AV_LOG_ERROR , " Packet too small \n " ) ;
return AVERROR_INVALIDDATA ;
}
if ( avpkt - > size > avctx - > width * avctx - > height * 8 / 3 ) {
if ( avpkt - > size > avctx - > width * avctx - > height * 8 / 3 ) {
av_log_ask_for_sample ( avctx , " Probably padded data \n " ) ;
}
pic - > reference = 0 ;
pic - > reference = 0 ;
if ( ( ret = ff_get_buffer ( avctx , pic ) ) < 0 )
return ret ;
ydst = ( uint16_t * ) pic - > data [ 0 ] ;
udst = ( uint16_t * ) pic - > data [ 1 ] ;
vdst = ( uint16_t * ) pic - > data [ 2 ] ;
yend = ydst + width ;
pic - > pict_type = AV_PICTURE_TYPE_I ;
pic - > key_frame = 1 ;
for ( ; ; ) {
uint32_t v = av_be2ne32 ( * src + + ) ;
* udst + + = ( v > > 16 ) & 0xFFC0 ;
* ydst + + = ( v > > 6 ) & 0xFFC0 ;
* vdst + + = ( v < < 4 ) & 0xFFC0 ;
v = av_be2ne32 ( * src + + ) ;
* ydst + + = ( v > > 16 ) & 0xFFC0 ;
if ( ydst > = yend ) {
ydst + = pic - > linesize [ 0 ] / 2 - width ;
udst + = pic - > linesize [ 1 ] / 2 - width / 2 ;
vdst + = pic - > linesize [ 2 ] / 2 - width / 2 ;
yend = ydst + width ;
if ( + + y > = avctx - > height )
ydst = ( uint16_t * ) pic - > data [ 0 ] ;
udst = ( uint16_t * ) pic - > data [ 1 ] ;
vdst = ( uint16_t * ) pic - > data [ 2 ] ;
yend = ydst + width ;
pic - > pict_type = AV_PICTURE_TYPE_I ;
pic - > key_frame = 1 ;
for ( ; ; ) {
uint32_t v = av_be2ne32 ( * src + + ) ;
* udst + + = ( v > > 16 ) & 0xFFC0 ;
* ydst + + = ( v > > 6 ) & 0xFFC0 ;
* vdst + + = ( v < < 4 ) & 0xFFC0 ;
v = av_be2ne32 ( * src + + ) ;
* ydst + + = ( v > > 16 ) & 0xFFC0 ;
if ( ydst > = yend ) {
ydst + = pic - > linesize [ 0 ] / 2 - width ;
udst + = pic - > linesize [ 1 ] / 2 - width / 2 ;
vdst + = pic - > linesize [ 2 ] / 2 - width / 2 ;
yend = ydst + width ;
if ( + + y > = avctx - > height )
break ;
}
* udst + + = ( v > > 6 ) & 0xFFC0 ;
* ydst + + = ( v < < 4 ) & 0xFFC0 ;
* udst + + = ( v > > 6 ) & 0xFFC0 ;
* ydst + + = ( v < < 4 ) & 0xFFC0 ;
v = av_be2ne32 ( * src + + ) ;
* vdst + + = ( v > > 16 ) & 0xFFC0 ;
* ydst + + = ( v > > 6 ) & 0xFFC0 ;
v = av_be2ne32 ( * src + + ) ;
* vdst + + = ( v > > 16 ) & 0xFFC0 ;
* ydst + + = ( v > > 6 ) & 0xFFC0 ;
if ( ydst > = yend ) {
ydst + = pic - > linesize [ 0 ] / 2 - width ;
udst + = pic - > linesize [ 1 ] / 2 - width / 2 ;
vdst + = pic - > linesize [ 2 ] / 2 - width / 2 ;
yend = ydst + width ;
if ( + + y > = avctx - > height )
if ( ydst > = yend ) {
ydst + = pic - > linesize [ 0 ] / 2 - width ;
udst + = pic - > linesize [ 1 ] / 2 - width / 2 ;
vdst + = pic - > linesize [ 2 ] / 2 - width / 2 ;
yend = ydst + width ;
if ( + + y > = avctx - > height )
break ;
}
* udst + + = ( v < < 4 ) & 0xFFC0 ;
v = av_be2ne32 ( * src + + ) ;
* ydst + + = ( v > > 16 ) & 0xFFC0 ;
* vdst + + = ( v > > 6 ) & 0xFFC0 ;
* ydst + + = ( v < < 4 ) & 0xFFC0 ;
if ( ydst > = yend ) {
ydst + = pic - > linesize [ 0 ] / 2 - width ;
udst + = pic - > linesize [ 1 ] / 2 - width / 2 ;
vdst + = pic - > linesize [ 2 ] / 2 - width / 2 ;
yend = ydst + width ;
if ( + + y > = avctx - > height )
* udst + + = ( v < < 4 ) & 0xFFC0 ;
v = av_be2ne32 ( * src + + ) ;
* ydst + + = ( v > > 16 ) & 0xFFC0 ;
* vdst + + = ( v > > 6 ) & 0xFFC0 ;
* ydst + + = ( v < < 4 ) & 0xFFC0 ;
if ( ydst > = yend ) {
ydst + = pic - > linesize [ 0 ] / 2 - width ;
udst + = pic - > linesize [ 1 ] / 2 - width / 2 ;
vdst + = pic - > linesize [ 2 ] / 2 - width / 2 ;
yend = ydst + width ;
if ( + + y > = avctx - > height )
break ;
}
}