Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-08-20 04:19:37 +0400
committerMichael Niedermayer <michaelni@gmx.at>2012-08-20 04:46:09 +0400
commitba2cf854d03ac8f563af5f71dfba27f7bd857a06 (patch)
tree3972f45701fc12f25821195b429a01a51073a3db /libavcodec/rawdec.c
parenta93c221ccd7a036de052e79659fe5b082f586279 (diff)
lavc: move AVRn to a seperate decoder.
The special cases in demuxers and decoders are a mess otherwise (and more would be needed to support it fully) Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/rawdec.c')
-rw-r--r--libavcodec/rawdec.c60
1 files changed, 15 insertions, 45 deletions
diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c
index 9e2fbaafbe..9920e7875e 100644
--- a/libavcodec/rawdec.c
+++ b/libavcodec/rawdec.c
@@ -39,7 +39,6 @@ typedef struct RawVideoContext {
unsigned char * buffer; /* block of memory for holding one frame */
int length; /* number of bytes in buffer */
int flip;
- int interlace;
AVFrame pic; ///< AVCodecContext.coded_frame
int tff;
} RawVideoContext;
@@ -131,17 +130,6 @@ static av_cold int raw_init_decoder(AVCodecContext *avctx)
avctx->codec_tag == MKTAG(3, 0, 0, 0) || avctx->codec_tag == MKTAG('W','R','A','W'))
context->flip=1;
- if(avctx->extradata_size >= 9 && avctx->extradata[4]+28 < avctx->extradata_size && !context->buffer && avctx->pix_fmt == PIX_FMT_UYVY422) {
- int ndx = avctx->extradata[4] + 4;
- context->interlace = !memcmp(avctx->extradata + ndx, "1:1(", 4);
- if(context->interlace) {
- context->buffer = av_malloc(context->length);
- if (!context->buffer)
- return AVERROR(ENOMEM);
- context->tff = avctx->extradata[ndx + 24] == 1;
- }
- }
-
return 0;
}
@@ -185,41 +173,23 @@ static int raw_decode(AVCodecContext *avctx,
if (context->buffer) {
int i;
uint8_t *dst = context->buffer;
- if(avctx->pix_fmt == PIX_FMT_PAL8){
- buf_size = context->length - AVPALETTE_SIZE;
- if (avctx->bits_per_coded_sample == 4){
- for(i=0; 2*i+1 < buf_size && i<avpkt->size; i++){
- dst[2*i+0]= buf[i]>>4;
- dst[2*i+1]= buf[i]&15;
- }
- linesize_align = 8;
- } else {
- av_assert0(avctx->bits_per_coded_sample == 2);
- for(i=0; 4*i+3 < buf_size && i<avpkt->size; i++){
- dst[4*i+0]= buf[i]>>6;
- dst[4*i+1]= buf[i]>>4&3;
- dst[4*i+2]= buf[i]>>2&3;
- dst[4*i+3]= buf[i] &3;
- }
- linesize_align = 16;
+ buf_size = context->length - AVPALETTE_SIZE;
+ if (avctx->bits_per_coded_sample == 4){
+ for(i=0; 2*i+1 < buf_size && i<avpkt->size; i++){
+ dst[2*i+0]= buf[i]>>4;
+ dst[2*i+1]= buf[i]&15;
}
- } else if(context->interlace && avctx->pix_fmt == PIX_FMT_UYVY422) {
- int x, y;
- int true_height = buf_size / (2*avctx->width);
- int tff = !!context->tff;
- av_assert0(avctx->height * avctx->width * 2 == context->length);
- if (buf_size < context->length) {
- av_log(avctx, AV_LOG_ERROR, "Invalid buffer size, packet size %d < context length %d\n", buf_size, context->length);
- return AVERROR(EINVAL);
+ linesize_align = 8;
+ } else {
+ av_assert0(avctx->bits_per_coded_sample == 2);
+ for(i=0; 4*i+3 < buf_size && i<avpkt->size; i++){
+ dst[4*i+0]= buf[i]>>6;
+ dst[4*i+1]= buf[i]>>4&3;
+ dst[4*i+2]= buf[i]>>2&3;
+ dst[4*i+3]= buf[i] &3;
}
- buf += (true_height - avctx->height)*avctx->width;
- for(y = 0; y < avctx->height-1; y+=2) {
- memcpy(dst + (y+ tff)*2*avctx->width, buf , 2*avctx->width);
- memcpy(dst + (y+!tff)*2*avctx->width, buf + avctx->width*true_height+4, 2*avctx->width);
- buf += 2*avctx->width;
- }
- }else
- av_assert0(0);
+ linesize_align = 16;
+ }
buf= dst;
}