| @@ -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(); | |||
| @@ -41,82 +41,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; | |||
| } | |||
| } | |||