| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-08-20 16:59:26 +00:00
										 |  |  |  * Sony PlayStation MDEC (Motion DECoder) | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |  * Copyright (c) 2003 Michael Niedermayer | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2007-07-05 10:37:29 +00:00
										 |  |  |  * based upon code from Sebastian Jedruszkiewicz <elf@frogger.rules.pl> | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * This file is part of FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * FFmpeg is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * License along with FFmpeg; if not, write to the Free Software | 
					
						
							| 
									
										
										
										
											2006-01-12 22:43:26 +00:00
										 |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-04-20 14:45:34 +00:00
										 |  |  |  * @file | 
					
						
							| 
									
										
										
										
											2008-08-20 16:59:26 +00:00
										 |  |  |  * Sony PlayStation MDEC (Motion DECoder) | 
					
						
							|  |  |  |  * This is very similar to intra-only MPEG-1. | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | #include "avcodec.h"
 | 
					
						
							|  |  |  | #include "dsputil.h"
 | 
					
						
							|  |  |  | #include "mpegvideo.h"
 | 
					
						
							| 
									
										
										
										
											2008-08-19 20:52:26 +00:00
										 |  |  | #include "mpeg12.h"
 | 
					
						
							| 
									
										
										
										
											2011-03-22 22:36:57 +01:00
										 |  |  | #include "thread.h"
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct MDECContext{ | 
					
						
							|  |  |  |     AVCodecContext *avctx; | 
					
						
							|  |  |  |     DSPContext dsp; | 
					
						
							|  |  |  |     AVFrame picture; | 
					
						
							|  |  |  |     GetBitContext gb; | 
					
						
							|  |  |  |     ScanTable scantable; | 
					
						
							|  |  |  |     int version; | 
					
						
							|  |  |  |     int qscale; | 
					
						
							|  |  |  |     int last_dc[3]; | 
					
						
							|  |  |  |     int mb_width; | 
					
						
							|  |  |  |     int mb_height; | 
					
						
							|  |  |  |     int mb_x, mb_y; | 
					
						
							| 
									
										
										
										
											2010-03-06 14:24:59 +00:00
										 |  |  |     DECLARE_ALIGNED(16, DCTELEM, block)[6][64]; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     uint8_t *bitstream_buffer; | 
					
						
							| 
									
										
										
										
											2006-01-25 22:10:13 +00:00
										 |  |  |     unsigned int bitstream_buffer_size; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     int block_last_index[6]; | 
					
						
							|  |  |  | } MDECContext; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-20 16:59:26 +00:00
										 |  |  | //very similar to MPEG-1
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | static inline int mdec_decode_block_intra(MDECContext *a, DCTELEM *block, int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int level, diff, i, j, run; | 
					
						
							|  |  |  |     int component; | 
					
						
							| 
									
										
										
										
											2007-07-05 09:21:55 +00:00
										 |  |  |     RLTable *rl = &ff_rl_mpeg1; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     uint8_t * const scantable= a->scantable.permutated; | 
					
						
							|  |  |  |     const uint16_t *quant_matrix= ff_mpeg1_default_intra_matrix; | 
					
						
							|  |  |  |     const int qscale= a->qscale; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-20 16:59:26 +00:00
										 |  |  |     /* DC coefficient */ | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     if(a->version==2){ | 
					
						
							| 
									
										
										
										
											2003-09-01 17:05:28 +00:00
										 |  |  |         block[0]= 2*get_sbits(&a->gb, 10) + 1024; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     }else{ | 
					
						
							|  |  |  |         component = (n <= 3 ? 0 : n - 4 + 1); | 
					
						
							|  |  |  |         diff = decode_dc(&a->gb, component); | 
					
						
							|  |  |  |         if (diff >= 0xffff) | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         a->last_dc[component]+= diff; | 
					
						
							|  |  |  |         block[0] = a->last_dc[component]<<3; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     i = 0; | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         OPEN_READER(re, &a->gb); | 
					
						
							| 
									
										
										
										
											2008-08-20 16:59:26 +00:00
										 |  |  |         /* now quantify & encode AC coefficients */ | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |         for(;;) { | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &a->gb); | 
					
						
							| 
									
										
										
										
											2005-04-18 20:07:48 +00:00
										 |  |  |             GET_RL_VLC(level, run, re, &a->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |             if(level == 127){ | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } else if(level != 0) { | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 level= (level*qscale*quant_matrix[j])>>3; | 
					
						
							|  |  |  |                 level = (level ^ SHOW_SBITS(re, &a->gb, 1)) - SHOW_SBITS(re, &a->gb, 1); | 
					
						
							|  |  |  |                 LAST_SKIP_BITS(re, &a->gb, 1); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 /* escape */ | 
					
						
							|  |  |  |                 run = SHOW_UBITS(re, &a->gb, 6)+1; LAST_SKIP_BITS(re, &a->gb, 6); | 
					
						
							|  |  |  |                 UPDATE_CACHE(re, &a->gb); | 
					
						
							| 
									
										
										
										
											2003-09-01 16:40:25 +00:00
										 |  |  |                 level = SHOW_SBITS(re, &a->gb, 10); SKIP_BITS(re, &a->gb, 10); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							| 
									
										
										
										
											2003-09-01 17:05:28 +00:00
										 |  |  |                 if(level<0){ | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |                     level= -level; | 
					
						
							| 
									
										
										
										
											2003-09-01 17:05:28 +00:00
										 |  |  |                     level= (level*qscale*quant_matrix[j])>>3; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							| 
									
										
										
										
											2003-09-01 17:05:28 +00:00
										 |  |  |                 }else{ | 
					
						
							|  |  |  |                     level= (level*qscale*quant_matrix[j])>>3; | 
					
						
							|  |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (i > 63){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(a->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", a->mb_x, a->mb_y); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             block[j] = level; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         CLOSE_READER(re, &a->gb); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     a->block_last_index[n] = i; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int decode_mb(MDECContext *a, DCTELEM block[6][64]){ | 
					
						
							|  |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2003-09-01 17:42:07 +00:00
										 |  |  |     const int block_index[6]= {5,4,0,1,2,3}; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     a->dsp.clear_blocks(block[0]); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-01 17:05:28 +00:00
										 |  |  |     for(i=0; i<6; i++){ | 
					
						
							| 
									
										
										
										
											2011-05-10 11:29:08 -04:00
										 |  |  |         if( mdec_decode_block_intra(a, block[ block_index[i] ], block_index[i]) < 0 || | 
					
						
							|  |  |  |             get_bits_left(&a->gb) < 0) | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |             return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void idct_put(MDECContext *a, int mb_x, int mb_y){ | 
					
						
							|  |  |  |     DCTELEM (*block)[64]= a->block; | 
					
						
							|  |  |  |     int linesize= a->picture.linesize[0]; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     uint8_t *dest_y  = a->picture.data[0] + (mb_y * 16* linesize              ) + mb_x * 16; | 
					
						
							|  |  |  |     uint8_t *dest_cb = a->picture.data[1] + (mb_y * 8 * a->picture.linesize[1]) + mb_x * 8; | 
					
						
							|  |  |  |     uint8_t *dest_cr = a->picture.data[2] + (mb_y * 8 * a->picture.linesize[2]) + mb_x * 8; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     a->dsp.idct_put(dest_y                 , linesize, block[0]); | 
					
						
							|  |  |  |     a->dsp.idct_put(dest_y              + 8, linesize, block[1]); | 
					
						
							|  |  |  |     a->dsp.idct_put(dest_y + 8*linesize    , linesize, block[2]); | 
					
						
							|  |  |  |     a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(!(a->avctx->flags&CODEC_FLAG_GRAY)){ | 
					
						
							|  |  |  |         a->dsp.idct_put(dest_cb, a->picture.linesize[1], block[4]); | 
					
						
							|  |  |  |         a->dsp.idct_put(dest_cr, a->picture.linesize[2], block[5]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static int decode_frame(AVCodecContext *avctx, | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |                         void *data, int *data_size, | 
					
						
							| 
									
										
										
										
											2009-04-07 15:59:50 +00:00
										 |  |  |                         AVPacket *avpkt) | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-07 15:59:50 +00:00
										 |  |  |     const uint8_t *buf = avpkt->data; | 
					
						
							|  |  |  |     int buf_size = avpkt->size; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     MDECContext * const a = avctx->priv_data; | 
					
						
							|  |  |  |     AVFrame *picture = data; | 
					
						
							| 
									
										
										
										
											2008-06-27 18:53:41 +00:00
										 |  |  |     AVFrame * const p= &a->picture; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(p->data[0]) | 
					
						
							| 
									
										
										
										
											2011-03-22 22:36:57 +01:00
										 |  |  |         ff_thread_release_buffer(avctx, p); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     p->reference= 0; | 
					
						
							| 
									
										
										
										
											2011-03-22 22:36:57 +01:00
										 |  |  |     if(ff_thread_get_buffer(avctx, p) < 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-28 01:40:44 +02:00
										 |  |  |     p->pict_type= AV_PICTURE_TYPE_I; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     p->key_frame= 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-12 13:17:37 +00:00
										 |  |  |     av_fast_malloc(&a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); | 
					
						
							|  |  |  |     if (!a->bitstream_buffer) | 
					
						
							|  |  |  |         return AVERROR(ENOMEM); | 
					
						
							| 
									
										
										
										
											2003-08-30 19:31:49 +00:00
										 |  |  |     for(i=0; i<buf_size; i+=2){ | 
					
						
							|  |  |  |         a->bitstream_buffer[i]  = buf[i+1]; | 
					
						
							|  |  |  |         a->bitstream_buffer[i+1]= buf[i  ]; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     init_get_bits(&a->gb, a->bitstream_buffer, buf_size*8); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-01 15:53:01 +00:00
										 |  |  |     /* skip over 4 preamble bytes in stream (typically 0xXX 0xXX 0x00 0x38) */ | 
					
						
							|  |  |  |     skip_bits(&a->gb, 32); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     a->qscale=  get_bits(&a->gb, 16); | 
					
						
							|  |  |  |     a->version= get_bits(&a->gb, 16); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 13:11:18 +00:00
										 |  |  |     a->last_dc[0]= | 
					
						
							|  |  |  |     a->last_dc[1]= | 
					
						
							|  |  |  |     a->last_dc[2]= 128; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-01 16:40:25 +00:00
										 |  |  |     for(a->mb_x=0; a->mb_x<a->mb_width; a->mb_x++){ | 
					
						
							|  |  |  |         for(a->mb_y=0; a->mb_y<a->mb_height; a->mb_y++){ | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |             if( decode_mb(a, a->block) <0) | 
					
						
							|  |  |  |                 return -1; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |             idct_put(a, a->mb_x, a->mb_y); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-27 18:50:06 +00:00
										 |  |  |     p->quality= a->qscale * FF_QP2LAMBDA; | 
					
						
							| 
									
										
										
										
											2010-01-23 18:01:38 +00:00
										 |  |  |     memset(p->qscale_table, a->qscale, a->mb_width); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-27 18:53:41 +00:00
										 |  |  |     *picture   = a->picture; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     *data_size = sizeof(AVPicture); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return (get_bits_count(&a->gb)+31)/32*4; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-21 03:11:20 +00:00
										 |  |  | static av_cold void mdec_common_init(AVCodecContext *avctx){ | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     MDECContext * const a = avctx->priv_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dsputil_init(&a->dsp, avctx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-27 11:50:56 +00:00
										 |  |  |     a->mb_width   = (avctx->coded_width  + 15) / 16; | 
					
						
							|  |  |  |     a->mb_height  = (avctx->coded_height + 15) / 16; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-02 02:15:15 +02:00
										 |  |  |     avcodec_get_frame_defaults(&a->picture); | 
					
						
							| 
									
										
										
										
											2008-06-27 18:53:41 +00:00
										 |  |  |     avctx->coded_frame= &a->picture; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     a->avctx= avctx; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-21 03:11:20 +00:00
										 |  |  | static av_cold int decode_init(AVCodecContext *avctx){ | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     MDECContext * const a = avctx->priv_data; | 
					
						
							| 
									
										
										
										
											2008-06-27 18:53:41 +00:00
										 |  |  |     AVFrame *p= &a->picture; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     mdec_common_init(avctx); | 
					
						
							| 
									
										
										
										
											2008-08-20 17:05:14 +00:00
										 |  |  |     ff_mpeg12_init_vlcs(); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_zigzag_direct); | 
					
						
							| 
									
										
										
										
											2008-06-27 18:51:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-02 11:16:21 +00:00
										 |  |  |     if( avctx->idct_algo == FF_IDCT_AUTO ) | 
					
						
							|  |  |  |         avctx->idct_algo = FF_IDCT_SIMPLE; | 
					
						
							| 
									
										
										
										
											2010-01-23 18:01:38 +00:00
										 |  |  |     p->qstride= 0; | 
					
						
							|  |  |  |     p->qscale_table= av_mallocz(a->mb_width); | 
					
						
							| 
									
										
										
										
											2011-01-02 11:16:21 +00:00
										 |  |  |     avctx->pix_fmt= PIX_FMT_YUVJ420P; | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-22 22:36:57 +01:00
										 |  |  | static av_cold int decode_init_thread_copy(AVCodecContext *avctx){ | 
					
						
							|  |  |  |     MDECContext * const a = avctx->priv_data; | 
					
						
							|  |  |  |     AVFrame *p = (AVFrame*)&a->picture; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     avctx->coded_frame= p; | 
					
						
							|  |  |  |     a->avctx= avctx; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 02:58:38 +02:00
										 |  |  |     p->qscale_table= av_mallocz(a->mb_width); | 
					
						
							| 
									
										
										
										
											2011-03-22 22:36:57 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 05:12:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-21 03:11:20 +00:00
										 |  |  | static av_cold int decode_end(AVCodecContext *avctx){ | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     MDECContext * const a = avctx->priv_data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-23 18:04:09 +00:00
										 |  |  |     if(a->picture.data[0]) | 
					
						
							|  |  |  |         avctx->release_buffer(avctx, &a->picture); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     av_freep(&a->bitstream_buffer); | 
					
						
							|  |  |  |     av_freep(&a->picture.qscale_table); | 
					
						
							|  |  |  |     a->bitstream_buffer_size=0; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 21:40:11 +00:00
										 |  |  | AVCodec ff_mdec_decoder = { | 
					
						
							| 
									
										
										
										
											2011-07-17 12:54:31 +02:00
										 |  |  |     .name           = "mdec", | 
					
						
							|  |  |  |     .type           = AVMEDIA_TYPE_VIDEO, | 
					
						
							|  |  |  |     .id             = CODEC_ID_MDEC, | 
					
						
							|  |  |  |     .priv_data_size = sizeof(MDECContext), | 
					
						
							|  |  |  |     .init           = decode_init, | 
					
						
							|  |  |  |     .close          = decode_end, | 
					
						
							|  |  |  |     .decode         = decode_frame, | 
					
						
							|  |  |  |     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, | 
					
						
							| 
									
										
										
										
											2008-06-12 21:50:13 +00:00
										 |  |  |     .long_name= NULL_IF_CONFIG_SMALL("Sony PlayStation MDEC (Motion DECoder)"), | 
					
						
							| 
									
										
										
										
											2011-03-22 22:36:57 +01:00
										 |  |  |     .init_thread_copy= ONLY_IF_THREADS_ENABLED(decode_init_thread_copy) | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 |