| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2003-03-06 11:32:04 +00:00
										 |  |  |  * MPEG1 codec / MPEG2 decoder | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * Copyright (c) 2000,2001 Fabrice Bellard. | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * This file is part of FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +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. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * FFmpeg is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:45:33 +00:00
										 |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-06 11:32:04 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file mpeg12.c | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |  * MPEG1/2 codec | 
					
						
							| 
									
										
										
										
											2003-03-06 11:32:04 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-15 22:33:03 +00:00
										 |  |  | //#define DEBUG
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | #include "avcodec.h"
 | 
					
						
							|  |  |  | #include "dsputil.h"
 | 
					
						
							|  |  |  | #include "mpegvideo.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "mpeg12data.h"
 | 
					
						
							| 
									
										
										
										
											2007-03-04 02:59:11 +00:00
										 |  |  | #include "bytestream.h"
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  | //#undef NDEBUG
 | 
					
						
							|  |  |  | //#include <assert.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* Start codes. */ | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  | #define SEQ_END_CODE            0x000001b7
 | 
					
						
							|  |  |  | #define SEQ_START_CODE          0x000001b3
 | 
					
						
							|  |  |  | #define GOP_START_CODE          0x000001b8
 | 
					
						
							|  |  |  | #define PICTURE_START_CODE      0x00000100
 | 
					
						
							|  |  |  | #define SLICE_MIN_START_CODE    0x00000101
 | 
					
						
							|  |  |  | #define SLICE_MAX_START_CODE    0x000001af
 | 
					
						
							|  |  |  | #define EXT_START_CODE          0x000001b5
 | 
					
						
							|  |  |  | #define USER_START_CODE         0x000001b2
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  | #define DC_VLC_BITS 9
 | 
					
						
							|  |  |  | #define MV_VLC_BITS 9
 | 
					
						
							|  |  |  | #define MBINCR_VLC_BITS 9
 | 
					
						
							|  |  |  | #define MB_PAT_VLC_BITS 9
 | 
					
						
							|  |  |  | #define MB_PTYPE_VLC_BITS 6
 | 
					
						
							|  |  |  | #define MB_BTYPE_VLC_BITS 6
 | 
					
						
							|  |  |  | #define TEX_VLC_BITS 9
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-14 04:15:53 +00:00
										 |  |  | #ifdef CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static void mpeg1_encode_block(MpegEncContext *s, | 
					
						
							|  |  |  |                          DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                          int component); | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  | static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code);    // RAL: f_code parameter added
 | 
					
						
							| 
									
										
										
										
											2003-10-14 04:15:53 +00:00
										 |  |  | #endif //CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg1_decode_block_inter(MpegEncContext *s, | 
					
						
							|  |  |  |                               DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                               int n); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg1_decode_block_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                               DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                               int n); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  | static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                                         DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                                         int n); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg2_decode_block_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                                     DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                                     int n); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  | static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, DCTELEM *block, int n); | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  | static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, DCTELEM *block, int n); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); | 
					
						
							| 
									
										
										
										
											2003-11-13 21:55:05 +00:00
										 |  |  | static void exchange_uv(MpegEncContext *s); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | #ifdef HAVE_XVMC
 | 
					
						
							|  |  |  | extern int XVMC_field_start(MpegEncContext *s, AVCodecContext *avctx); | 
					
						
							|  |  |  | extern int XVMC_field_end(MpegEncContext *s); | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  | extern void XVMC_pack_pblocks(MpegEncContext *s,int cbp); | 
					
						
							| 
									
										
										
										
											2003-11-13 21:55:05 +00:00
										 |  |  | extern void XVMC_init_block(MpegEncContext *s);//set s->block
 | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-12 23:14:20 +00:00
										 |  |  | static const enum PixelFormat pixfmt_yuv_420[]= {PIX_FMT_YUV420P,-1}; | 
					
						
							|  |  |  | static const enum PixelFormat pixfmt_yuv_422[]= {PIX_FMT_YUV422P,-1}; | 
					
						
							|  |  |  | static const enum PixelFormat pixfmt_yuv_444[]= {PIX_FMT_YUV444P,-1}; | 
					
						
							|  |  |  | static const enum PixelFormat pixfmt_xvmc_mpg2_420[] = { | 
					
						
							| 
									
										
										
										
											2004-02-19 00:30:33 +00:00
										 |  |  |                                            PIX_FMT_XVMC_MPEG2_IDCT, | 
					
						
							|  |  |  |                                            PIX_FMT_XVMC_MPEG2_MC, | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                                            -1}; | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  | #ifdef CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2007-03-13 22:47:05 +00:00
										 |  |  | static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1]; | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  | static uint8_t fcode_tab[MAX_MV*2+1]; | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  | static uint8_t  uni_mpeg1_ac_vlc_len [64*64*2]; | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  | static uint8_t  uni_mpeg2_ac_vlc_len [64*64*2]; | 
					
						
							| 
									
										
										
										
											2003-06-22 11:08:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* simple include everything table for dc, first byte is bits number next 3 are code*/ | 
					
						
							|  |  |  | static uint32_t mpeg1_lum_dc_uni[512]; | 
					
						
							|  |  |  | static uint32_t mpeg1_chr_dc_uni[512]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static uint8_t mpeg1_index_run[2][64]; | 
					
						
							|  |  |  | static int8_t mpeg1_max_level[2][64]; | 
					
						
							| 
									
										
										
										
											2003-10-14 04:15:53 +00:00
										 |  |  | #endif //CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-14 13:19:19 +00:00
										 |  |  | static uint8_t static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  | static void init_2d_vlc_rl(RLTable *rl, int use_static) | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-08-28 08:15:30 +00:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     init_vlc(&rl->vlc, TEX_VLC_BITS, rl->n + 2, | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  |              &rl->table_vlc[0][1], 4, 2, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |              &rl->table_vlc[0][0], 4, 2, use_static); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     if(use_static) | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |         rl->rl_vlc[0]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         rl->rl_vlc[0]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for(i=0; i<rl->vlc.table_size; i++){ | 
					
						
							|  |  |  |         int code= rl->vlc.table[i][0]; | 
					
						
							|  |  |  |         int len = rl->vlc.table[i][1]; | 
					
						
							|  |  |  |         int level, run; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  |         if(len==0){ // illegal code
 | 
					
						
							|  |  |  |             run= 65; | 
					
						
							|  |  |  |             level= MAX_LEVEL; | 
					
						
							|  |  |  |         }else if(len<0){ //more bits needed
 | 
					
						
							|  |  |  |             run= 0; | 
					
						
							|  |  |  |             level= code; | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             if(code==rl->n){ //esc
 | 
					
						
							|  |  |  |                 run= 65; | 
					
						
							|  |  |  |                 level= 0; | 
					
						
							|  |  |  |             }else if(code==rl->n+1){ //eob
 | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 run= 0; | 
					
						
							|  |  |  |                 level= 127; | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  |             }else{ | 
					
						
							|  |  |  |                 run=   rl->table_run  [code] + 1; | 
					
						
							|  |  |  |                 level= rl->table_level[code]; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         rl->rl_vlc[0][i].len= len; | 
					
						
							|  |  |  |         rl->rl_vlc[0][i].level= level; | 
					
						
							|  |  |  |         rl->rl_vlc[0][i].run= run; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-22 11:08:22 +00:00
										 |  |  | #ifdef CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2006-05-13 15:43:51 +00:00
										 |  |  | static void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len){ | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(i=0; i<128; i++){ | 
					
						
							|  |  |  |         int level= i-64; | 
					
						
							|  |  |  |         int run; | 
					
						
							|  |  |  |         for(run=0; run<64; run++){ | 
					
						
							|  |  |  |             int len, bits, code; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-11 23:17:58 +00:00
										 |  |  |             int alevel= FFABS(level); | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  |             int sign= (level>>31)&1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (alevel > rl->max_level[0][run]) | 
					
						
							|  |  |  |                 code= 111; /*rl->n*/ | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 code= rl->index_run[0][run] + alevel - 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (code < 111 /* rl->n */) { | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                 /* store the vlc & sign at once */ | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |                 len=   rl->table_vlc[code][1]+1; | 
					
						
							|  |  |  |                 bits= (rl->table_vlc[code][0]<<1) + sign; | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |                 len=  rl->table_vlc[111/*rl->n*/][1]+6; | 
					
						
							|  |  |  |                 bits= rl->table_vlc[111/*rl->n*/][0]<<6; | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 bits|= run; | 
					
						
							|  |  |  |                 if (alevel < 128) { | 
					
						
							|  |  |  |                     bits<<=8; len+=8; | 
					
						
							|  |  |  |                     bits|= level & 0xff; | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     bits<<=16; len+=16; | 
					
						
							|  |  |  |                     bits|= level & 0xff; | 
					
						
							|  |  |  |                     if (level < 0) { | 
					
						
							|  |  |  |                         bits|= 0x8001 + level + 255; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         bits|= level & 0xffff; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             uni_ac_vlc_len [UNI_AC_ENC_INDEX(run, i)]= len; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int find_frame_rate_index(MpegEncContext *s){ | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     int64_t dmin= INT64_MAX; | 
					
						
							|  |  |  |     int64_t d; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(i=1;i<14;i++) { | 
					
						
							| 
									
										
										
										
											2006-07-02 14:50:23 +00:00
										 |  |  |         int64_t n0= 1001LL/ff_frame_rate_tab[i].den*ff_frame_rate_tab[i].num*s->avctx->time_base.num; | 
					
						
							| 
									
										
										
										
											2005-04-30 21:43:59 +00:00
										 |  |  |         int64_t n1= 1001LL*s->avctx->time_base.den; | 
					
						
							| 
									
										
										
										
											2005-05-08 20:15:42 +00:00
										 |  |  |         if(s->avctx->strict_std_compliance > FF_COMPLIANCE_INOFFICIAL && i>=9) break; | 
					
						
							| 
									
										
										
										
											2004-02-26 18:29:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-11 23:17:58 +00:00
										 |  |  |         d = FFABS(n0 - n1); | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  |         if(d < dmin){ | 
					
						
							|  |  |  |             dmin=d; | 
					
						
							|  |  |  |             s->frame_rate_index= i; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if(dmin) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int encode_init(AVCodecContext *avctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     MpegEncContext *s = avctx->priv_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(MPV_encode_init(avctx) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(find_frame_rate_index(s) < 0){ | 
					
						
							| 
									
										
										
										
											2005-05-08 20:15:42 +00:00
										 |  |  |         if(s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ | 
					
						
							| 
									
										
										
										
											2005-04-30 21:43:59 +00:00
										 |  |  |             av_log(avctx, AV_LOG_ERROR, "MPEG1/2 does not support %d/%d fps\n", avctx->time_base.den, avctx->time_base.num); | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  |             return -1; | 
					
						
							|  |  |  |         }else{ | 
					
						
							| 
									
										
										
										
											2005-04-30 21:43:59 +00:00
										 |  |  |             av_log(avctx, AV_LOG_INFO, "MPEG1/2 does not support %d/%d fps, there may be AV sync issues\n", avctx->time_base.den, avctx->time_base.num); | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-01 09:47:36 +00:00
										 |  |  |     if(avctx->profile == FF_PROFILE_UNKNOWN){ | 
					
						
							|  |  |  |         if(avctx->level != FF_LEVEL_UNKNOWN){ | 
					
						
							|  |  |  |             av_log(avctx, AV_LOG_ERROR, "Set profile and level\n"); | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         avctx->profile = s->chroma_format == CHROMA_420 ? 4 : 0; /* Main or 4:2:2 */ | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-01 09:47:36 +00:00
										 |  |  |     if(avctx->level == FF_LEVEL_UNKNOWN){ | 
					
						
							|  |  |  |         if(avctx->profile == 0){ /* 4:2:2 */ | 
					
						
							|  |  |  |             if(avctx->width <= 720 && avctx->height <= 608) avctx->level = 5; /* Main */ | 
					
						
							|  |  |  |             else                                            avctx->level = 2; /* High */ | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             if(avctx->profile != 1 && s->chroma_format != CHROMA_420){ | 
					
						
							|  |  |  |                 av_log(avctx, AV_LOG_ERROR, "Only High(1) and 4:2:2(0) profiles support 4:2:2 color sampling\n"); | 
					
						
							|  |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if(avctx->width <= 720 && avctx->height <= 576) avctx->level = 8; /* Main */ | 
					
						
							|  |  |  |             else if(avctx->width <= 1440)                   avctx->level = 6; /* High 1440 */ | 
					
						
							|  |  |  |             else                                            avctx->level = 4; /* High */ | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-07 13:45:08 +00:00
										 |  |  |     if((avctx->flags2 & CODEC_FLAG2_DROP_FRAME_TIMECODE) && s->frame_rate_index != 4){ | 
					
						
							|  |  |  |         av_log(avctx, AV_LOG_ERROR, "Drop frame time code only allowed with 1001/30000 fps\n"); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | static void put_header(MpegEncContext *s, int header) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     align_put_bits(&s->pb); | 
					
						
							| 
									
										
										
										
											2002-02-13 04:19:10 +00:00
										 |  |  |     put_bits(&s->pb, 16, header>>16); | 
					
						
							|  |  |  |     put_bits(&s->pb, 16, header&0xFFFF); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* put sequence header if needed */ | 
					
						
							|  |  |  | static void mpeg1_encode_sequence_header(MpegEncContext *s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |         unsigned int vbv_buffer_size; | 
					
						
							| 
									
										
										
										
											2001-07-23 18:58:11 +00:00
										 |  |  |         unsigned int fps, v; | 
					
						
							| 
									
										
										
										
											2004-03-24 23:32:48 +00:00
										 |  |  |         int i; | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |         uint64_t time_code; | 
					
						
							| 
									
										
										
										
											2002-12-06 16:19:25 +00:00
										 |  |  |         float best_aspect_error= 1E10; | 
					
						
							| 
									
										
										
										
											2003-10-20 20:23:46 +00:00
										 |  |  |         float aspect_ratio= av_q2d(s->avctx->sample_aspect_ratio); | 
					
						
							| 
									
										
										
										
											2003-09-24 00:06:33 +00:00
										 |  |  |         int constraint_parameter_flag; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-20 20:23:46 +00:00
										 |  |  |         if(aspect_ratio==0.0) aspect_ratio= 1.0; //pixel aspect 1:1 (VGA)
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-04 10:04:03 +00:00
										 |  |  |         if (s->current_picture.key_frame) { | 
					
						
							| 
									
										
										
										
											2006-07-02 14:50:23 +00:00
										 |  |  |             AVRational framerate= ff_frame_rate_tab[s->frame_rate_index]; | 
					
						
							| 
									
										
										
										
											2004-02-26 18:29:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             /* mpeg1 header repeated every gop */ | 
					
						
							|  |  |  |             put_header(s, SEQ_START_CODE); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             put_bits(&s->pb, 12, s->width); | 
					
						
							|  |  |  |             put_bits(&s->pb, 12, s->height); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-06 16:19:25 +00:00
										 |  |  |             for(i=1; i<15; i++){ | 
					
						
							| 
									
										
										
										
											2003-10-20 23:24:39 +00:00
										 |  |  |                 float error= aspect_ratio; | 
					
						
							|  |  |  |                 if(s->codec_id == CODEC_ID_MPEG1VIDEO || i <=1) | 
					
						
							| 
									
										
										
										
											2003-10-30 19:55:44 +00:00
										 |  |  |                     error-= 1.0/mpeg1_aspect[i]; | 
					
						
							| 
									
										
										
										
											2003-10-20 23:24:39 +00:00
										 |  |  |                 else | 
					
						
							|  |  |  |                     error-= av_q2d(mpeg2_aspect[i])*s->height/s->width; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-11 23:17:58 +00:00
										 |  |  |                 error= FFABS(error); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-06 16:19:25 +00:00
										 |  |  |                 if(error < best_aspect_error){ | 
					
						
							|  |  |  |                     best_aspect_error= error; | 
					
						
							|  |  |  |                     s->aspect_ratio_info= i; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-06 16:19:25 +00:00
										 |  |  |             put_bits(&s->pb, 4, s->aspect_ratio_info); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             put_bits(&s->pb, 4, s->frame_rate_index); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-29 19:42:23 +00:00
										 |  |  |             if(s->avctx->rc_max_rate){ | 
					
						
							|  |  |  |                 v = (s->avctx->rc_max_rate + 399) / 400; | 
					
						
							|  |  |  |                 if (v > 0x3ffff && s->codec_id == CODEC_ID_MPEG1VIDEO) | 
					
						
							|  |  |  |                     v = 0x3ffff; | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 v= 0x3FFFF; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2002-09-02 09:51:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if(s->avctx->rc_buffer_size) | 
					
						
							|  |  |  |                 vbv_buffer_size = s->avctx->rc_buffer_size; | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 /* VBV calculation: Scaled so that a VCD has the proper VBV size of 40 kilobytes */ | 
					
						
							| 
									
										
										
										
											2003-08-29 19:42:23 +00:00
										 |  |  |                 vbv_buffer_size = (( 20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024; | 
					
						
							|  |  |  |             vbv_buffer_size= (vbv_buffer_size + 16383) / 16384; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             put_bits(&s->pb, 18, v & 0x3FFFF); | 
					
						
							|  |  |  |             put_bits(&s->pb, 1, 1); /* marker */ | 
					
						
							| 
									
										
										
										
											2003-09-24 00:06:33 +00:00
										 |  |  |             put_bits(&s->pb, 10, vbv_buffer_size & 0x3FF); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             constraint_parameter_flag= | 
					
						
							|  |  |  |                 s->width <= 768 && s->height <= 576 && | 
					
						
							| 
									
										
										
										
											2003-09-24 00:06:33 +00:00
										 |  |  |                 s->mb_width * s->mb_height <= 396 && | 
					
						
							| 
									
										
										
										
											2004-02-26 18:29:39 +00:00
										 |  |  |                 s->mb_width * s->mb_height * framerate.num <= framerate.den*396*25 && | 
					
						
							|  |  |  |                 framerate.num <= framerate.den*30 && | 
					
						
							| 
									
										
										
										
											2004-10-18 23:07:18 +00:00
										 |  |  |                 s->avctx->me_range && s->avctx->me_range < 128 && | 
					
						
							| 
									
										
										
										
											2003-09-24 00:06:33 +00:00
										 |  |  |                 vbv_buffer_size <= 20 && | 
					
						
							|  |  |  |                 v <= 1856000/400 && | 
					
						
							|  |  |  |                 s->codec_id == CODEC_ID_MPEG1VIDEO; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-24 00:06:33 +00:00
										 |  |  |             put_bits(&s->pb, 1, constraint_parameter_flag); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 22:18:08 +00:00
										 |  |  |             ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); | 
					
						
							|  |  |  |             ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |             if(s->codec_id == CODEC_ID_MPEG2VIDEO){ | 
					
						
							|  |  |  |                 put_header(s, EXT_START_CODE); | 
					
						
							|  |  |  |                 put_bits(&s->pb, 4, 1); //seq ext
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-01 09:47:36 +00:00
										 |  |  |                 put_bits(&s->pb, 1, s->avctx->profile == 0); //escx 1 for 4:2:2 profile */
 | 
					
						
							| 
									
										
										
										
											2004-08-13 13:59:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |                 put_bits(&s->pb, 3, s->avctx->profile); //profile
 | 
					
						
							|  |  |  |                 put_bits(&s->pb, 4, s->avctx->level); //level
 | 
					
						
							| 
									
										
										
										
											2004-08-13 13:59:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  |                 put_bits(&s->pb, 1, s->progressive_sequence); | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |                 put_bits(&s->pb, 2, s->chroma_format); | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |                 put_bits(&s->pb, 2, 0); //horizontal size ext
 | 
					
						
							|  |  |  |                 put_bits(&s->pb, 2, 0); //vertical size ext
 | 
					
						
							|  |  |  |                 put_bits(&s->pb, 12, v>>18); //bitrate ext
 | 
					
						
							|  |  |  |                 put_bits(&s->pb, 1, 1); //marker
 | 
					
						
							|  |  |  |                 put_bits(&s->pb, 8, vbv_buffer_size >>10); //vbv buffer ext
 | 
					
						
							|  |  |  |                 put_bits(&s->pb, 1, s->low_delay); | 
					
						
							|  |  |  |                 put_bits(&s->pb, 2, 0); // frame_rate_ext_n
 | 
					
						
							|  |  |  |                 put_bits(&s->pb, 5, 0); // frame_rate_ext_d
 | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             put_header(s, GOP_START_CODE); | 
					
						
							| 
									
										
										
										
											2007-03-08 18:25:47 +00:00
										 |  |  |             put_bits(&s->pb, 1, !!(s->avctx->flags2 & CODEC_FLAG2_DROP_FRAME_TIMECODE)); /* drop frame flag */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             /* time code : we must convert from the real frame rate to a
 | 
					
						
							|  |  |  |                fake mpeg frame rate in case of low frame rate */ | 
					
						
							| 
									
										
										
										
											2004-02-26 18:29:39 +00:00
										 |  |  |             fps = (framerate.num + framerate.den/2)/ framerate.den; | 
					
						
							| 
									
										
										
										
											2006-11-07 13:45:08 +00:00
										 |  |  |             time_code = s->current_picture_ptr->coded_picture_number + s->avctx->timecode_frame_start; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             s->gop_picture_number = s->current_picture_ptr->coded_picture_number; | 
					
						
							|  |  |  |             if (s->avctx->flags2 & CODEC_FLAG2_DROP_FRAME_TIMECODE) { | 
					
						
							|  |  |  |                 /* only works for NTSC 29.97 */ | 
					
						
							|  |  |  |                 int d = time_code / 17982; | 
					
						
							|  |  |  |                 int m = time_code % 17982; | 
					
						
							| 
									
										
										
										
											2006-11-07 13:50:41 +00:00
										 |  |  |                 //if (m < 2) m += 2; /* not needed since -2,-1 / 1798 in C returns 0 */
 | 
					
						
							| 
									
										
										
										
											2006-11-07 13:45:08 +00:00
										 |  |  |                 time_code += 18 * d + 2 * ((m - 2) / 1798); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |             put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); | 
					
						
							|  |  |  |             put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             put_bits(&s->pb, 1, 1); | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |             put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); | 
					
						
							| 
									
										
										
										
											2004-01-04 22:13:14 +00:00
										 |  |  |             put_bits(&s->pb, 6, (uint32_t)((time_code % fps))); | 
					
						
							| 
									
										
										
										
											2004-01-22 19:48:28 +00:00
										 |  |  |             put_bits(&s->pb, 1, !!(s->flags & CODEC_FLAG_CLOSED_GOP)); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             put_bits(&s->pb, 1, 0); /* broken link */ | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  | static inline void encode_mb_skip_run(MpegEncContext *s, int run){ | 
					
						
							|  |  |  |     while (run >= 33) { | 
					
						
							|  |  |  |         put_bits(&s->pb, 11, 0x008); | 
					
						
							|  |  |  |         run -= 33; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     put_bits(&s->pb, mbAddrIncrTable[run][1], | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |              mbAddrIncrTable[run][0]); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2003-10-14 04:15:53 +00:00
										 |  |  | #endif //CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | static void common_init(MpegEncContext *s) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  |     s->y_dc_scale_table= | 
					
						
							| 
									
										
										
										
											2004-04-30 13:44:29 +00:00
										 |  |  |     s->c_dc_scale_table= mpeg2_dc_scale_table[s->intra_dc_precision]; | 
					
						
							| 
									
										
										
										
											2004-03-22 20:54:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-02-13 15:26:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-22 11:08:22 +00:00
										 |  |  | void ff_mpeg1_clean_buffers(MpegEncContext *s){ | 
					
						
							|  |  |  |     s->last_dc[0] = 1 << (7 + s->intra_dc_precision); | 
					
						
							|  |  |  |     s->last_dc[1] = s->last_dc[0]; | 
					
						
							|  |  |  |     s->last_dc[2] = s->last_dc[0]; | 
					
						
							|  |  |  |     memset(s->last_mv, 0, sizeof(s->last_mv)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-16 23:05:38 +00:00
										 |  |  | #ifdef CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  | static av_always_inline void put_qscale(MpegEncContext *s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if(s->q_scale_type){ | 
					
						
							|  |  |  |         assert(s->qscale>=1 && s->qscale <=12); | 
					
						
							|  |  |  |         put_bits(&s->pb, 5, inv_non_linear_qscale[s->qscale]); | 
					
						
							|  |  |  |     }else{ | 
					
						
							|  |  |  |         put_bits(&s->pb, 5, s->qscale); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  | void ff_mpeg1_encode_slice_header(MpegEncContext *s){ | 
					
						
							|  |  |  |     put_header(s, SLICE_MIN_START_CODE + s->mb_y); | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |     put_qscale(s); | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |     put_bits(&s->pb, 1, 0); /* slice extra information */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     mpeg1_encode_sequence_header(s); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* mpeg1 picture header */ | 
					
						
							|  |  |  |     put_header(s, PICTURE_START_CODE); | 
					
						
							|  |  |  |     /* temporal reference */ | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // RAL: s->picture_number instead of s->fake_picture_number
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     put_bits(&s->pb, 10, (s->picture_number - | 
					
						
							|  |  |  |                           s->gop_picture_number) & 0x3ff); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     put_bits(&s->pb, 3, s->pict_type); | 
					
						
							| 
									
										
										
										
											2003-12-17 19:53:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-06 15:27:31 +00:00
										 |  |  |     s->vbv_delay_ptr= s->pb.buf + put_bits_count(&s->pb)/8; | 
					
						
							| 
									
										
										
										
											2003-12-17 19:53:05 +00:00
										 |  |  |     put_bits(&s->pb, 16, 0xFFFF); /* vbv_delay */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |     // RAL: Forward f_code also needed for B frames
 | 
					
						
							|  |  |  |     if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         put_bits(&s->pb, 1, 0); /* half pel coordinates */ | 
					
						
							| 
									
										
										
										
											2003-08-30 19:40:30 +00:00
										 |  |  |         if(s->codec_id == CODEC_ID_MPEG1VIDEO) | 
					
						
							|  |  |  |             put_bits(&s->pb, 3, s->f_code); /* forward_f_code */ | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             put_bits(&s->pb, 3, 7); /* forward_f_code */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |     // RAL: Backward f_code necessary for B frames
 | 
					
						
							|  |  |  |     if (s->pict_type == B_TYPE) { | 
					
						
							|  |  |  |         put_bits(&s->pb, 1, 0); /* half pel coordinates */ | 
					
						
							| 
									
										
										
										
											2003-08-30 19:40:30 +00:00
										 |  |  |         if(s->codec_id == CODEC_ID_MPEG1VIDEO) | 
					
						
							|  |  |  |             put_bits(&s->pb, 3, s->b_code); /* backward_f_code */ | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             put_bits(&s->pb, 3, 7); /* backward_f_code */ | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     put_bits(&s->pb, 1, 0); /* extra bit picture */ | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     s->frame_pred_frame_dct = 1; | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     if(s->codec_id == CODEC_ID_MPEG2VIDEO){ | 
					
						
							|  |  |  |         put_header(s, EXT_START_CODE); | 
					
						
							|  |  |  |         put_bits(&s->pb, 4, 8); //pic ext
 | 
					
						
							| 
									
										
										
										
											2003-08-30 19:40:30 +00:00
										 |  |  |         if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { | 
					
						
							|  |  |  |             put_bits(&s->pb, 4, s->f_code); | 
					
						
							|  |  |  |             put_bits(&s->pb, 4, s->f_code); | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             put_bits(&s->pb, 8, 255); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (s->pict_type == B_TYPE) { | 
					
						
							|  |  |  |             put_bits(&s->pb, 4, s->b_code); | 
					
						
							|  |  |  |             put_bits(&s->pb, 4, s->b_code); | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             put_bits(&s->pb, 8, 255); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |         put_bits(&s->pb, 2, s->intra_dc_precision); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-13 17:54:10 +00:00
										 |  |  |         assert(s->picture_structure == PICT_FRAME); | 
					
						
							|  |  |  |         put_bits(&s->pb, 2, s->picture_structure); | 
					
						
							| 
									
										
										
										
											2003-12-12 16:56:38 +00:00
										 |  |  |         if (s->progressive_sequence) { | 
					
						
							|  |  |  |             put_bits(&s->pb, 1, 0); /* no repeat */ | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  |         /* XXX: optimize the generation of this flag with entropy
 | 
					
						
							|  |  |  |            measures */ | 
					
						
							|  |  |  |         s->frame_pred_frame_dct = s->progressive_sequence; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  |         put_bits(&s->pb, 1, s->frame_pred_frame_dct); | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |         put_bits(&s->pb, 1, s->concealment_motion_vectors); | 
					
						
							|  |  |  |         put_bits(&s->pb, 1, s->q_scale_type); | 
					
						
							|  |  |  |         put_bits(&s->pb, 1, s->intra_vlc_format); | 
					
						
							|  |  |  |         put_bits(&s->pb, 1, s->alternate_scan); | 
					
						
							|  |  |  |         put_bits(&s->pb, 1, s->repeat_first_field); | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  |         s->progressive_frame = s->progressive_sequence; | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |         put_bits(&s->pb, 1, s->chroma_format == CHROMA_420 ? s->progressive_frame : 0); /* chroma_420_type */ | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  |         put_bits(&s->pb, 1, s->progressive_frame); | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |         put_bits(&s->pb, 1, 0); //composite_display_flag
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-01-04 00:23:14 +00:00
										 |  |  |     if(s->flags & CODEC_FLAG_SVCD_SCAN_OFFSET){ | 
					
						
							|  |  |  |         int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         put_header(s, USER_START_CODE); | 
					
						
							|  |  |  |         for(i=0; i<sizeof(svcd_scan_offset_placeholder); i++){ | 
					
						
							|  |  |  |             put_bits(&s->pb, 8, svcd_scan_offset_placeholder[i]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |     s->mb_y=0; | 
					
						
							|  |  |  |     ff_mpeg1_encode_slice_header(s); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline void put_mb_modes(MpegEncContext *s, int n, int bits, | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                                 int has_mv, int field_motion) | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     put_bits(&s->pb, n, bits); | 
					
						
							|  |  |  |     if (!s->frame_pred_frame_dct) { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         if (has_mv) | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |             put_bits(&s->pb, 2, 2 - field_motion); /* motion_type: frame/field */ | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  |         put_bits(&s->pb, 1, s->interlaced_dct); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-08 00:35:08 +00:00
										 |  |  | static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |                                                    DCTELEM block[6][64], | 
					
						
							|  |  |  |                                                    int motion_x, int motion_y, | 
					
						
							|  |  |  |                                                    int mb_block_count) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |     int i, cbp; | 
					
						
							|  |  |  |     const int mb_x = s->mb_x; | 
					
						
							|  |  |  |     const int mb_y = s->mb_y; | 
					
						
							|  |  |  |     const int first_mb= mb_x == s->resync_mb_x && mb_y == s->resync_mb_y; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* compute cbp */ | 
					
						
							|  |  |  |     cbp = 0; | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |     for(i=0;i<mb_block_count;i++) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         if (s->block_last_index[i] >= 0) | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |             cbp |= 1 << (mb_block_count - 1 - i); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-04-02 19:48:20 +00:00
										 |  |  |     if (cbp == 0 && !first_mb && s->mv_type == MV_TYPE_16X16 && | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         (mb_x != s->mb_width - 1 || (mb_y != s->mb_height - 1 && s->codec_id == CODEC_ID_MPEG1VIDEO)) && | 
					
						
							| 
									
										
										
										
											2004-04-02 19:48:20 +00:00
										 |  |  |         ((s->pict_type == P_TYPE && (motion_x | motion_y) == 0) || | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |         (s->pict_type == B_TYPE && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) | | 
					
						
							|  |  |  |         ((s->mv_dir & MV_DIR_BACKWARD) ? ((s->mv[1][0][0] - s->last_mv[1][0][0])|(s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) { | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |         s->mb_skip_run++; | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |         s->qscale -= s->dquant; | 
					
						
							| 
									
										
										
										
											2002-10-09 17:18:24 +00:00
										 |  |  |         s->skip_count++; | 
					
						
							|  |  |  |         s->misc_bits++; | 
					
						
							|  |  |  |         s->last_bits++; | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |         if(s->pict_type == P_TYPE){ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             s->last_mv[0][1][0]= s->last_mv[0][0][0]= | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |             s->last_mv[0][1][1]= s->last_mv[0][0][1]= 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |         if(first_mb){ | 
					
						
							|  |  |  |             assert(s->mb_skip_run == 0); | 
					
						
							|  |  |  |             encode_mb_skip_run(s, s->mb_x); | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             encode_mb_skip_run(s, s->mb_skip_run); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         if (s->pict_type == I_TYPE) { | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |             if(s->dquant && cbp){ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 put_mb_modes(s, 2, 1, 0, 0); /* macroblock_type : macroblock_quant = 1 */ | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |                 put_qscale(s); | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |             }else{ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 put_mb_modes(s, 1, 1, 0, 0); /* macroblock_type : macroblock_quant = 0 */ | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                 s->qscale -= s->dquant; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2002-10-09 17:18:24 +00:00
										 |  |  |             s->misc_bits+= get_bits_diff(s); | 
					
						
							|  |  |  |             s->i_count++; | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |         } else if (s->mb_intra) { | 
					
						
							|  |  |  |             if(s->dquant && cbp){ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 put_mb_modes(s, 6, 0x01, 0, 0); | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |                 put_qscale(s); | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |             }else{ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 put_mb_modes(s, 5, 0x03, 0, 0); | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |                 s->qscale -= s->dquant; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             s->misc_bits+= get_bits_diff(s); | 
					
						
							|  |  |  |             s->i_count++; | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |             memset(s->last_mv, 0, sizeof(s->last_mv)); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         } else if (s->pict_type == P_TYPE) { | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |             if(s->mv_type == MV_TYPE_16X16){ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 if (cbp != 0) { | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                     if ((motion_x|motion_y) == 0) { | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                         if(s->dquant){ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                             put_mb_modes(s, 5, 1, 0, 0); /* macroblock_pattern & quant */ | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |                             put_qscale(s); | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                         }else{ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                             put_mb_modes(s, 2, 1, 0, 0); /* macroblock_pattern only */ | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2002-10-09 17:18:24 +00:00
										 |  |  |                         s->misc_bits+= get_bits_diff(s); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                         if(s->dquant){ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                             put_mb_modes(s, 5, 2, 1, 0); /* motion + cbp */ | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |                             put_qscale(s); | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                         }else{ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                             put_mb_modes(s, 1, 1, 1, 0); /* motion + cbp */ | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2002-10-09 17:18:24 +00:00
										 |  |  |                         s->misc_bits+= get_bits_diff(s); | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |                         mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);    // RAL: f_code parameter added
 | 
					
						
							|  |  |  |                         mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);    // RAL: f_code parameter added
 | 
					
						
							| 
									
										
										
										
											2002-10-09 17:18:24 +00:00
										 |  |  |                         s->mv_bits+= get_bits_diff(s); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     put_bits(&s->pb, 3, 1); /* motion only */ | 
					
						
							| 
									
										
										
										
											2003-12-10 16:51:54 +00:00
										 |  |  |                     if (!s->frame_pred_frame_dct) | 
					
						
							|  |  |  |                         put_bits(&s->pb, 2, 2); /* motion_type: frame */ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                     s->misc_bits+= get_bits_diff(s); | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |                     mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);    // RAL: f_code parameter added
 | 
					
						
							|  |  |  |                     mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);    // RAL: f_code parameter added
 | 
					
						
							| 
									
										
										
										
											2002-09-24 12:33:37 +00:00
										 |  |  |                     s->qscale -= s->dquant; | 
					
						
							| 
									
										
										
										
											2002-10-09 17:18:24 +00:00
										 |  |  |                     s->mv_bits+= get_bits_diff(s); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 s->last_mv[0][1][0]= s->last_mv[0][0][0]= motion_x; | 
					
						
							|  |  |  |                 s->last_mv[0][1][1]= s->last_mv[0][0][1]= motion_y; | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 assert(!s->frame_pred_frame_dct && s->mv_type == MV_TYPE_FIELD); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (cbp) { | 
					
						
							|  |  |  |                     if(s->dquant){ | 
					
						
							|  |  |  |                         put_mb_modes(s, 5, 2, 1, 1); /* motion + cbp */ | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |                         put_qscale(s); | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                     }else{ | 
					
						
							|  |  |  |                         put_mb_modes(s, 1, 1, 1, 1); /* motion + cbp */ | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 } else { | 
					
						
							|  |  |  |                     put_bits(&s->pb, 3, 1); /* motion only */ | 
					
						
							|  |  |  |                     put_bits(&s->pb, 2, 1); /* motion_type: field */ | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |                     s->qscale -= s->dquant; | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 s->misc_bits+= get_bits_diff(s); | 
					
						
							|  |  |  |                 for(i=0; i<2; i++){ | 
					
						
							|  |  |  |                     put_bits(&s->pb, 1, s->field_select[0][i]); | 
					
						
							|  |  |  |                     mpeg1_encode_motion(s, s->mv[0][i][0] -  s->last_mv[0][i][0]    , s->f_code); | 
					
						
							|  |  |  |                     mpeg1_encode_motion(s, s->mv[0][i][1] - (s->last_mv[0][i][1]>>1), s->f_code); | 
					
						
							|  |  |  |                     s->last_mv[0][i][0]=   s->mv[0][i][0]; | 
					
						
							|  |  |  |                     s->last_mv[0][i][1]= 2*s->mv[0][i][1]; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 s->mv_bits+= get_bits_diff(s); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |             if(cbp) { | 
					
						
							|  |  |  |                 if (s->chroma_y_shift) { | 
					
						
							|  |  |  |                     put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     put_bits(&s->pb, mbPatTable[cbp>>2][1], mbPatTable[cbp>>2][0]); | 
					
						
							|  |  |  |                     put_bits(&s->pb, 2, cbp & 3); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |             s->f_count++; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         } else{ | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |             static const int mb_type_len[4]={0,3,4,2}; //bak,for,bi
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if(s->mv_type == MV_TYPE_16X16){ | 
					
						
							|  |  |  |                 if (cbp){    // With coded bloc pattern
 | 
					
						
							|  |  |  |                     if (s->dquant) { | 
					
						
							|  |  |  |                         if(s->mv_dir == MV_DIR_FORWARD) | 
					
						
							|  |  |  |                             put_mb_modes(s, 6, 3, 1, 0); | 
					
						
							|  |  |  |                         else | 
					
						
							|  |  |  |                             put_mb_modes(s, mb_type_len[s->mv_dir]+3, 2, 1, 0); | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |                         put_qscale(s); | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                     } else { | 
					
						
							|  |  |  |                         put_mb_modes(s, mb_type_len[s->mv_dir], 3, 1, 0); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }else{    // No coded bloc pattern
 | 
					
						
							|  |  |  |                     put_bits(&s->pb, mb_type_len[s->mv_dir], 2); | 
					
						
							|  |  |  |                     if (!s->frame_pred_frame_dct) | 
					
						
							|  |  |  |                         put_bits(&s->pb, 2, 2); /* motion_type: frame */ | 
					
						
							|  |  |  |                     s->qscale -= s->dquant; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 s->misc_bits += get_bits_diff(s); | 
					
						
							|  |  |  |                 if (s->mv_dir&MV_DIR_FORWARD){ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                     mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code); | 
					
						
							|  |  |  |                     mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                     s->last_mv[0][0][0]=s->last_mv[0][1][0]= s->mv[0][0][0]; | 
					
						
							|  |  |  |                     s->last_mv[0][0][1]=s->last_mv[0][1][1]= s->mv[0][0][1]; | 
					
						
							|  |  |  |                     s->f_count++; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (s->mv_dir&MV_DIR_BACKWARD){ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                     mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code); | 
					
						
							|  |  |  |                     mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                     s->last_mv[1][0][0]=s->last_mv[1][1][0]= s->mv[1][0][0]; | 
					
						
							|  |  |  |                     s->last_mv[1][0][1]=s->last_mv[1][1][1]= s->mv[1][0][1]; | 
					
						
							|  |  |  |                     s->b_count++; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 assert(s->mv_type == MV_TYPE_FIELD); | 
					
						
							|  |  |  |                 assert(!s->frame_pred_frame_dct); | 
					
						
							|  |  |  |                 if (cbp){    // With coded bloc pattern
 | 
					
						
							|  |  |  |                     if (s->dquant) { | 
					
						
							|  |  |  |                         if(s->mv_dir == MV_DIR_FORWARD) | 
					
						
							|  |  |  |                             put_mb_modes(s, 6, 3, 1, 1); | 
					
						
							|  |  |  |                         else | 
					
						
							|  |  |  |                             put_mb_modes(s, mb_type_len[s->mv_dir]+3, 2, 1, 1); | 
					
						
							| 
									
										
										
										
											2007-03-04 02:26:20 +00:00
										 |  |  |                         put_qscale(s); | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                     } else { | 
					
						
							|  |  |  |                         put_mb_modes(s, mb_type_len[s->mv_dir], 3, 1, 1); | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |                 }else{    // No coded bloc pattern
 | 
					
						
							|  |  |  |                     put_bits(&s->pb, mb_type_len[s->mv_dir], 2); | 
					
						
							|  |  |  |                     put_bits(&s->pb, 2, 1); /* motion_type: field */ | 
					
						
							|  |  |  |                     s->qscale -= s->dquant; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 s->misc_bits += get_bits_diff(s); | 
					
						
							|  |  |  |                 if (s->mv_dir&MV_DIR_FORWARD){ | 
					
						
							|  |  |  |                     for(i=0; i<2; i++){ | 
					
						
							|  |  |  |                         put_bits(&s->pb, 1, s->field_select[0][i]); | 
					
						
							|  |  |  |                         mpeg1_encode_motion(s, s->mv[0][i][0] -  s->last_mv[0][i][0]    , s->f_code); | 
					
						
							|  |  |  |                         mpeg1_encode_motion(s, s->mv[0][i][1] - (s->last_mv[0][i][1]>>1), s->f_code); | 
					
						
							|  |  |  |                         s->last_mv[0][i][0]=   s->mv[0][i][0]; | 
					
						
							|  |  |  |                         s->last_mv[0][i][1]= 2*s->mv[0][i][1]; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     s->f_count++; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (s->mv_dir&MV_DIR_BACKWARD){ | 
					
						
							|  |  |  |                     for(i=0; i<2; i++){ | 
					
						
							|  |  |  |                         put_bits(&s->pb, 1, s->field_select[1][i]); | 
					
						
							|  |  |  |                         mpeg1_encode_motion(s, s->mv[1][i][0] -  s->last_mv[1][i][0]    , s->b_code); | 
					
						
							|  |  |  |                         mpeg1_encode_motion(s, s->mv[1][i][1] - (s->last_mv[1][i][1]>>1), s->b_code); | 
					
						
							|  |  |  |                         s->last_mv[1][i][0]=   s->mv[1][i][0]; | 
					
						
							|  |  |  |                         s->last_mv[1][i][1]= 2*s->mv[1][i][1]; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     s->b_count++; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |             s->mv_bits += get_bits_diff(s); | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |             if(cbp) { | 
					
						
							|  |  |  |                 if (s->chroma_y_shift) { | 
					
						
							|  |  |  |                     put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     put_bits(&s->pb, mbPatTable[cbp>>2][1], mbPatTable[cbp>>2][0]); | 
					
						
							|  |  |  |                     put_bits(&s->pb, 2, cbp & 3); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |         for(i=0;i<mb_block_count;i++) { | 
					
						
							|  |  |  |             if (cbp & (1 << (mb_block_count - 1 - i))) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 mpeg1_encode_block(s, block[i], i); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |         s->mb_skip_run = 0; | 
					
						
							| 
									
										
										
										
											2002-10-09 17:18:24 +00:00
										 |  |  |         if(s->mb_intra) | 
					
						
							|  |  |  |             s->i_tex_bits+= get_bits_diff(s); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             s->p_tex_bits+= get_bits_diff(s); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  | void mpeg1_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int motion_y) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (s->chroma_format == CHROMA_420) mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 6); | 
					
						
							|  |  |  |     else                                mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 8); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  | // RAL: Parameter added: f_or_b_code
 | 
					
						
							|  |  |  | static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-06-25 14:11:44 +00:00
										 |  |  |     int code, bit_size, l, bits, range, sign; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (val == 0) { | 
					
						
							|  |  |  |         /* zero vector */ | 
					
						
							|  |  |  |         code = 0; | 
					
						
							|  |  |  |         put_bits(&s->pb, | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                  mbMotionVectorTable[0][1], | 
					
						
							|  |  |  |                  mbMotionVectorTable[0][0]); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  |         bit_size = f_or_b_code - 1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         range = 1 << bit_size; | 
					
						
							|  |  |  |         /* modulo encoding */ | 
					
						
							| 
									
										
										
										
											2004-06-25 14:11:44 +00:00
										 |  |  |         l= INT_BIT - 5 - bit_size; | 
					
						
							|  |  |  |         val= (val<<l)>>l; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (val >= 0) { | 
					
						
							|  |  |  |             val--; | 
					
						
							|  |  |  |             code = (val >> bit_size) + 1; | 
					
						
							|  |  |  |             bits = val & (range - 1); | 
					
						
							|  |  |  |             sign = 0; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             val = -val; | 
					
						
							|  |  |  |             val--; | 
					
						
							|  |  |  |             code = (val >> bit_size) + 1; | 
					
						
							|  |  |  |             bits = val & (range - 1); | 
					
						
							|  |  |  |             sign = 1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         assert(code > 0 && code <= 16); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         put_bits(&s->pb, | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                  mbMotionVectorTable[code][1], | 
					
						
							|  |  |  |                  mbMotionVectorTable[code][0]); | 
					
						
							| 
									
										
										
										
											2003-02-08 12:00:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         put_bits(&s->pb, 1, sign); | 
					
						
							|  |  |  |         if (bit_size > 0) { | 
					
						
							|  |  |  |             put_bits(&s->pb, bit_size, bits); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | void ff_mpeg1_encode_init(MpegEncContext *s) | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     static int done=0; | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     common_init(s); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  |     if(!done){ | 
					
						
							|  |  |  |         int f_code; | 
					
						
							|  |  |  |         int mv; | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |         int i; | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         done=1; | 
					
						
							| 
									
										
										
										
											2007-03-14 13:19:19 +00:00
										 |  |  |         init_rl(&rl_mpeg1, static_rl_table_store[0]); | 
					
						
							| 
									
										
										
										
											2007-03-14 13:20:29 +00:00
										 |  |  |         init_rl(&rl_mpeg2, static_rl_table_store[1]); | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |         for(i=0; i<64; i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |                 mpeg1_max_level[0][i]= rl_mpeg1.max_level[0][i]; | 
					
						
							|  |  |  |                 mpeg1_index_run[0][i]= rl_mpeg1.index_run[0][i]; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-13 15:43:51 +00:00
										 |  |  |         init_uni_ac_vlc(&rl_mpeg1, uni_mpeg1_ac_vlc_len); | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |         if(s->intra_vlc_format) | 
					
						
							|  |  |  |             init_uni_ac_vlc(&rl_mpeg2, uni_mpeg2_ac_vlc_len); | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |         /* build unified dc encoding tables */ | 
					
						
							|  |  |  |         for(i=-255; i<256; i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |                 int adiff, index; | 
					
						
							|  |  |  |                 int bits, code; | 
					
						
							|  |  |  |                 int diff=i; | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-11 23:17:58 +00:00
										 |  |  |                 adiff = FFABS(diff); | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                 if(diff<0) diff--; | 
					
						
							|  |  |  |                 index = av_log2(2*adiff); | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                 bits= vlc_dc_lum_bits[index] + index; | 
					
						
							|  |  |  |                 code= (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1)); | 
					
						
							|  |  |  |                 mpeg1_lum_dc_uni[i+255]= bits + (code<<8); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                 bits= vlc_dc_chroma_bits[index] + index; | 
					
						
							|  |  |  |                 code= (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1)); | 
					
						
							|  |  |  |                 mpeg1_chr_dc_uni[i+255]= bits + (code<<8); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  |         for(f_code=1; f_code<=MAX_FCODE; f_code++){ | 
					
						
							|  |  |  |             for(mv=-MAX_MV; mv<=MAX_MV; mv++){ | 
					
						
							|  |  |  |                 int len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if(mv==0) len= mbMotionVectorTable[0][1]; | 
					
						
							|  |  |  |                 else{ | 
					
						
							|  |  |  |                     int val, bit_size, range, code; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-16 16:57:27 +00:00
										 |  |  |                     bit_size = f_code - 1; | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  |                     range = 1 << bit_size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     val=mv; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                     if (val < 0) | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  |                         val = -val; | 
					
						
							|  |  |  |                     val--; | 
					
						
							|  |  |  |                     code = (val >> bit_size) + 1; | 
					
						
							|  |  |  |                     if(code<17){ | 
					
						
							|  |  |  |                         len= mbMotionVectorTable[code][1] + 1 + bit_size; | 
					
						
							|  |  |  |                     }else{ | 
					
						
							|  |  |  |                         len= mbMotionVectorTable[16][1] + 2 + bit_size; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 mv_penalty[f_code][mv+MAX_MV]= len; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for(f_code=MAX_FCODE; f_code>0; f_code--){ | 
					
						
							|  |  |  |             for(mv=-(8<<f_code); mv<(8<<f_code); mv++){ | 
					
						
							|  |  |  |                 fcode_tab[mv+MAX_MV]= f_code; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-12-27 23:51:46 +00:00
										 |  |  |     s->me.mv_penalty= mv_penalty; | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  |     s->fcode_tab= fcode_tab; | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     if(s->codec_id == CODEC_ID_MPEG1VIDEO){ | 
					
						
							|  |  |  |         s->min_qcoeff=-255; | 
					
						
							|  |  |  |         s->max_qcoeff= 255; | 
					
						
							|  |  |  |     }else{ | 
					
						
							|  |  |  |         s->min_qcoeff=-2047; | 
					
						
							|  |  |  |         s->max_qcoeff= 2047; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |     if (s->intra_vlc_format) { | 
					
						
							|  |  |  |         s->intra_ac_vlc_length= | 
					
						
							|  |  |  |         s->intra_ac_vlc_last_length= uni_mpeg2_ac_vlc_len; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         s->intra_ac_vlc_length= | 
					
						
							|  |  |  |         s->intra_ac_vlc_last_length= uni_mpeg1_ac_vlc_len; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-10-05 15:32:39 +00:00
										 |  |  |     s->inter_ac_vlc_length= | 
					
						
							|  |  |  |     s->inter_ac_vlc_last_length= uni_mpeg1_ac_vlc_len; | 
					
						
							| 
									
										
										
										
											2002-03-22 23:22:08 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | static inline void encode_dc(MpegEncContext *s, int diff, int component) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2004-04-30 13:44:29 +00:00
										 |  |  |   if(((unsigned) (diff+255)) >= 511){ | 
					
						
							|  |  |  |         int index; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if(diff<0){ | 
					
						
							|  |  |  |             index= av_log2_16bit(-2*diff); | 
					
						
							|  |  |  |             diff--; | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             index= av_log2_16bit(2*diff); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (component == 0) { | 
					
						
							|  |  |  |             put_bits( | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                 &s->pb, | 
					
						
							| 
									
										
										
										
											2004-04-30 13:44:29 +00:00
										 |  |  |                 vlc_dc_lum_bits[index] + index, | 
					
						
							|  |  |  |                 (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1))); | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             put_bits( | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                 &s->pb, | 
					
						
							| 
									
										
										
										
											2004-04-30 13:44:29 +00:00
										 |  |  |                 vlc_dc_chroma_bits[index] + index, | 
					
						
							|  |  |  |                 (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1))); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |   }else{ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (component == 0) { | 
					
						
							| 
									
										
										
										
											2002-02-13 15:26:28 +00:00
										 |  |  |         put_bits( | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |             &s->pb, | 
					
						
							|  |  |  |             mpeg1_lum_dc_uni[diff+255]&0xFF, | 
					
						
							|  |  |  |             mpeg1_lum_dc_uni[diff+255]>>8); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-02-13 15:26:28 +00:00
										 |  |  |         put_bits( | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             &s->pb, | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |             mpeg1_chr_dc_uni[diff+255]&0xFF, | 
					
						
							|  |  |  |             mpeg1_chr_dc_uni[diff+255]>>8); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-04-30 13:44:29 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static void mpeg1_encode_block(MpegEncContext *s, | 
					
						
							|  |  |  |                                DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                                int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int alevel, level, last_non_zero, dc, diff, i, j, run, last_index, sign; | 
					
						
							|  |  |  |     int code, component; | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |     const uint16_t (*table_vlc)[2] = rl_mpeg1.table_vlc; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     last_index = s->block_last_index[n]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* DC coef */ | 
					
						
							|  |  |  |     if (s->mb_intra) { | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |         component = (n <= 3 ? 0 : (n&1) + 1); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         dc = block[0]; /* overflow is impossible */ | 
					
						
							|  |  |  |         diff = dc - s->last_dc[component]; | 
					
						
							|  |  |  |         encode_dc(s, diff, component); | 
					
						
							|  |  |  |         s->last_dc[component] = dc; | 
					
						
							|  |  |  |         i = 1; | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |         if (s->intra_vlc_format) | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |             table_vlc = rl_mpeg2.table_vlc; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         /* encode the first coefficient : needs to be done here because
 | 
					
						
							|  |  |  |            it is handled slightly differently */ | 
					
						
							|  |  |  |         level = block[0]; | 
					
						
							|  |  |  |         if (abs(level) == 1) { | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |                 code = ((uint32_t)level >> 31); /* the sign bit */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 put_bits(&s->pb, 2, code | 0x02); | 
					
						
							|  |  |  |                 i = 1; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             i = 0; | 
					
						
							|  |  |  |             last_non_zero = -1; | 
					
						
							|  |  |  |             goto next_coef; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |     last_non_zero = i - 1; | 
					
						
							| 
									
										
										
										
											2002-02-13 04:19:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     for(;i<=last_index;i++) { | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  |         j = s->intra_scantable.permutated[i]; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         level = block[j]; | 
					
						
							|  |  |  |     next_coef: | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  |         if (level != 0) | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |             dprintf(s->avctx, "level[%d]=%d\n", i, level); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         /* encode using VLC */ | 
					
						
							|  |  |  |         if (level != 0) { | 
					
						
							|  |  |  |             run = i - last_non_zero - 1; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  |             alevel= level; | 
					
						
							|  |  |  |             MASK_ABS(sign, alevel) | 
					
						
							|  |  |  |             sign&=1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-01 00:42:18 +00:00
										 |  |  |             if (alevel <= mpeg1_max_level[0][run]){ | 
					
						
							| 
									
										
										
										
											2002-02-13 04:19:10 +00:00
										 |  |  |                 code= mpeg1_index_run[0][run] + alevel - 1; | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                 /* store the vlc & sign at once */ | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |                 put_bits(&s->pb, table_vlc[code][1]+1, (table_vlc[code][0]<<1) + sign); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                 /* escape seems to be pretty rare <5% so i dont optimize it */ | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |                 put_bits(&s->pb, table_vlc[111][1], table_vlc[111][0]); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 /* escape: only clip in this case */ | 
					
						
							|  |  |  |                 put_bits(&s->pb, 6, run); | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |                 if(s->codec_id == CODEC_ID_MPEG1VIDEO){ | 
					
						
							|  |  |  |                     if (alevel < 128) { | 
					
						
							|  |  |  |                         put_bits(&s->pb, 8, level & 0xff); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                     } else { | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |                         if (level < 0) { | 
					
						
							|  |  |  |                             put_bits(&s->pb, 16, 0x8001 + level + 255); | 
					
						
							|  |  |  |                         } else { | 
					
						
							|  |  |  |                             put_bits(&s->pb, 16, level & 0xffff); | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |                 }else{ | 
					
						
							|  |  |  |                     put_bits(&s->pb, 12, level & 0xfff); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             last_non_zero = i; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* end of block */ | 
					
						
							| 
									
										
										
										
											2006-05-13 17:16:58 +00:00
										 |  |  |     put_bits(&s->pb, table_vlc[112][1], table_vlc[112][0]); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2003-02-16 23:05:38 +00:00
										 |  |  | #endif //CONFIG_ENCODERS
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /******************************************/ | 
					
						
							|  |  |  | /* decoding */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static VLC dc_lum_vlc; | 
					
						
							|  |  |  | static VLC dc_chroma_vlc; | 
					
						
							|  |  |  | static VLC mv_vlc; | 
					
						
							|  |  |  | static VLC mbincr_vlc; | 
					
						
							|  |  |  | static VLC mb_ptype_vlc; | 
					
						
							|  |  |  | static VLC mb_btype_vlc; | 
					
						
							|  |  |  | static VLC mb_pat_vlc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-24 23:32:48 +00:00
										 |  |  | static void init_vlcs(void) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     static int done = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!done) { | 
					
						
							| 
									
										
										
										
											2002-06-11 13:44:14 +00:00
										 |  |  |         done = 1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         init_vlc(&dc_lum_vlc, DC_VLC_BITS, 12, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                  vlc_dc_lum_bits, 1, 1, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |                  vlc_dc_lum_code, 2, 2, 1); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         init_vlc(&dc_chroma_vlc,  DC_VLC_BITS, 12, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                  vlc_dc_chroma_bits, 1, 1, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |                  vlc_dc_chroma_code, 2, 2, 1); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         init_vlc(&mv_vlc, MV_VLC_BITS, 17, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                  &mbMotionVectorTable[0][1], 2, 1, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |                  &mbMotionVectorTable[0][0], 2, 1, 1); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         init_vlc(&mbincr_vlc, MBINCR_VLC_BITS, 36, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                  &mbAddrIncrTable[0][1], 2, 1, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |                  &mbAddrIncrTable[0][0], 2, 1, 1); | 
					
						
							| 
									
										
										
										
											2004-03-02 18:39:25 +00:00
										 |  |  |         init_vlc(&mb_pat_vlc, MB_PAT_VLC_BITS, 64, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                  &mbPatTable[0][1], 2, 1, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |                  &mbPatTable[0][0], 2, 1, 1); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         init_vlc(&mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                  &table_mb_ptype[0][1], 2, 1, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |                  &table_mb_ptype[0][0], 2, 1, 1); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         init_vlc(&mb_btype_vlc, MB_BTYPE_VLC_BITS, 11, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                  &table_mb_btype[0][1], 2, 1, | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |                  &table_mb_btype[0][0], 2, 1, 1); | 
					
						
							| 
									
										
										
										
											2007-03-14 13:19:19 +00:00
										 |  |  |         init_rl(&rl_mpeg1, static_rl_table_store[0]); | 
					
						
							|  |  |  |         init_rl(&rl_mpeg2, static_rl_table_store[1]); | 
					
						
							| 
									
										
										
										
											2002-07-14 18:36:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-27 18:10:06 +00:00
										 |  |  |         init_2d_vlc_rl(&rl_mpeg1, 1); | 
					
						
							|  |  |  |         init_2d_vlc_rl(&rl_mpeg2, 1); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int get_dmv(MpegEncContext *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     if(get_bits1(&s->gb)) | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |         return 1 - (get_bits1(&s->gb) << 1); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:08 +00:00
										 |  |  | static inline int get_qscale(MpegEncContext *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2003-05-13 23:38:51 +00:00
										 |  |  |     int qscale = get_bits(&s->gb, 5); | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |     if (s->q_scale_type) { | 
					
						
							|  |  |  |         return non_linear_qscale[qscale]; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return qscale << 1; | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:08 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* motion type (for mpeg2) */ | 
					
						
							|  |  |  | #define MT_FIELD 1
 | 
					
						
							|  |  |  | #define MT_FRAME 2
 | 
					
						
							|  |  |  | #define MT_16X8  2
 | 
					
						
							|  |  |  | #define MT_DMV   3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int mpeg_decode_mb(MpegEncContext *s, | 
					
						
							| 
									
										
										
										
											2004-03-01 14:55:21 +00:00
										 |  |  |                           DCTELEM block[12][64]) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-10-15 15:24:08 +00:00
										 |  |  |     int i, j, k, cbp, val, mb_type, motion_type; | 
					
						
							| 
									
										
										
										
											2005-04-04 11:25:44 +00:00
										 |  |  |     const int mb_block_count = 4 + (1<< s->chroma_format); | 
					
						
							| 
									
										
										
										
											2004-06-12 16:51:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(s->avctx, "decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-24 17:21:11 +00:00
										 |  |  |     assert(s->mb_skipped==0); | 
					
						
							| 
									
										
										
										
											2003-01-20 20:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |     if (s->mb_skip_run-- != 0) { | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         if(s->pict_type == I_TYPE){ | 
					
						
							| 
									
										
										
										
											2005-04-24 17:21:11 +00:00
										 |  |  |             av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             return -1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         /* skip mb */ | 
					
						
							|  |  |  |         s->mb_intra = 0; | 
					
						
							| 
									
										
										
										
											2004-03-01 14:55:21 +00:00
										 |  |  |         for(i=0;i<12;i++) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             s->block_last_index[i] = -1; | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |         if(s->picture_structure == PICT_FRAME) | 
					
						
							|  |  |  |             s->mv_type = MV_TYPE_16X16; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             s->mv_type = MV_TYPE_FIELD; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         if (s->pict_type == P_TYPE) { | 
					
						
							|  |  |  |             /* if P type, zero motion vector is implied */ | 
					
						
							|  |  |  |             s->mv_dir = MV_DIR_FORWARD; | 
					
						
							|  |  |  |             s->mv[0][0][0] = s->mv[0][0][1] = 0; | 
					
						
							|  |  |  |             s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0; | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  |             s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0; | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |             s->field_select[0][0]= s->picture_structure - 1; | 
					
						
							| 
									
										
										
										
											2005-04-24 17:21:11 +00:00
										 |  |  |             s->mb_skipped = 1; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2005-03-26 17:01:49 +00:00
										 |  |  |             int mb_type; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-26 17:01:49 +00:00
										 |  |  |             if(s->mb_x) | 
					
						
							|  |  |  |                 mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]; | 
					
						
							|  |  |  |             else | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                 mb_type= s->current_picture.mb_type[ s->mb_width + (s->mb_y-1)*s->mb_stride - 1]; // FIXME not sure if this is allowed in mpeg at all,
 | 
					
						
							| 
									
										
										
										
											2005-03-26 17:01:49 +00:00
										 |  |  |             if(IS_INTRA(mb_type)) | 
					
						
							|  |  |  |                 return -1; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             /* if B type, reuse previous vectors and directions */ | 
					
						
							|  |  |  |             s->mv[0][0][0] = s->last_mv[0][0][0]; | 
					
						
							|  |  |  |             s->mv[0][0][1] = s->last_mv[0][0][1]; | 
					
						
							|  |  |  |             s->mv[1][0][0] = s->last_mv[1][0][0]; | 
					
						
							|  |  |  |             s->mv[1][0][1] = s->last_mv[1][0][1]; | 
					
						
							| 
									
										
										
										
											2003-01-20 20:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= | 
					
						
							| 
									
										
										
										
											2005-03-26 17:01:49 +00:00
										 |  |  |                 mb_type | MB_TYPE_SKIP; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | //            assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8));
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0) | 
					
						
							| 
									
										
										
										
											2005-04-24 17:21:11 +00:00
										 |  |  |                 s->mb_skipped = 1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-12-17 11:25:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch(s->pict_type) { | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |     case I_TYPE: | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |         if (get_bits1(&s->gb) == 0) { | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  |             if (get_bits1(&s->gb) == 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 return -1; | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             mb_type = MB_TYPE_INTRA; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case P_TYPE: | 
					
						
							| 
									
										
										
										
											2002-07-13 16:10:27 +00:00
										 |  |  |         mb_type = get_vlc2(&s->gb, mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1); | 
					
						
							| 
									
										
										
										
											2002-07-17 15:54:56 +00:00
										 |  |  |         if (mb_type < 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |             av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             return -1; | 
					
						
							| 
									
										
										
										
											2002-07-17 15:54:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         mb_type = ptype2mb_type[ mb_type ]; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         break; | 
					
						
							|  |  |  |     case B_TYPE: | 
					
						
							| 
									
										
										
										
											2002-07-13 16:10:27 +00:00
										 |  |  |         mb_type = get_vlc2(&s->gb, mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1); | 
					
						
							| 
									
										
										
										
											2002-07-17 15:54:56 +00:00
										 |  |  |         if (mb_type < 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |             av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             return -1; | 
					
						
							| 
									
										
										
										
											2002-07-17 15:54:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         mb_type = btype2mb_type[ mb_type ]; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(s->avctx, "mb_type=%x\n", mb_type); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | //    motion_type = 0; /* avoid warning */
 | 
					
						
							|  |  |  |     if (IS_INTRA(mb_type)) { | 
					
						
							| 
									
										
										
										
											2005-04-21 21:23:22 +00:00
										 |  |  |         s->dsp.clear_blocks(s->block[0]); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-21 21:23:22 +00:00
										 |  |  |         if(!s->chroma_y_shift){ | 
					
						
							|  |  |  |             s->dsp.clear_blocks(s->block[6]); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         /* compute dct type */ | 
					
						
							|  |  |  |         if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var?
 | 
					
						
							|  |  |  |             !s->frame_pred_frame_dct) { | 
					
						
							|  |  |  |             s->interlaced_dct = get_bits1(&s->gb); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         if (IS_QUANT(mb_type)) | 
					
						
							|  |  |  |             s->qscale = get_qscale(s); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         if (s->concealment_motion_vectors) { | 
					
						
							|  |  |  |             /* just parse them */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             if (s->picture_structure != PICT_FRAME) | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |                 skip_bits1(&s->gb); /* field select */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] = | 
					
						
							| 
									
										
										
										
											2003-06-21 00:50:40 +00:00
										 |  |  |                 mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] = | 
					
						
							| 
									
										
										
										
											2003-06-21 00:50:40 +00:00
										 |  |  |                 mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             skip_bits1(&s->gb); /* marker */ | 
					
						
							| 
									
										
										
										
											2003-06-21 00:50:40 +00:00
										 |  |  |         }else | 
					
						
							|  |  |  |             memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         s->mb_intra = 1; | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  | #ifdef HAVE_XVMC
 | 
					
						
							|  |  |  |         //one 1 we memcpy blocks in xvmcvideo
 | 
					
						
							|  |  |  |         if(s->avctx->xvmc_acceleration > 1){ | 
					
						
							|  |  |  |             XVMC_pack_pblocks(s,-1);//inter are always full blocks
 | 
					
						
							|  |  |  |             if(s->swap_uv){ | 
					
						
							|  |  |  |                 exchange_uv(s); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |         if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  |             if(s->flags2 & CODEC_FLAG2_FAST){ | 
					
						
							|  |  |  |                 for(i=0;i<6;i++) { | 
					
						
							|  |  |  |                     mpeg2_fast_decode_block_intra(s, s->pblocks[i], i); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 for(i=0;i<mb_block_count;i++) { | 
					
						
							|  |  |  |                     if (mpeg2_decode_block_intra(s, s->pblocks[i], i) < 0) | 
					
						
							|  |  |  |                         return -1; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             for(i=0;i<6;i++) { | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  |                 if (mpeg1_decode_block_intra(s, s->pblocks[i], i) < 0) | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                     return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         if (mb_type & MB_TYPE_ZERO_MV){ | 
					
						
							| 
									
										
										
										
											2003-12-04 18:34:47 +00:00
										 |  |  |             assert(mb_type & MB_TYPE_CBP); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             /* compute dct type */ | 
					
						
							|  |  |  |             if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var?
 | 
					
						
							|  |  |  |                 !s->frame_pred_frame_dct) { | 
					
						
							|  |  |  |                 s->interlaced_dct = get_bits1(&s->gb); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (IS_QUANT(mb_type)) | 
					
						
							|  |  |  |                 s->qscale = get_qscale(s); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             s->mv_dir = MV_DIR_FORWARD; | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |             if(s->picture_structure == PICT_FRAME) | 
					
						
							|  |  |  |                 s->mv_type = MV_TYPE_16X16; | 
					
						
							|  |  |  |             else{ | 
					
						
							|  |  |  |                 s->mv_type = MV_TYPE_FIELD; | 
					
						
							|  |  |  |                 mb_type |= MB_TYPE_INTERLACED; | 
					
						
							|  |  |  |                 s->field_select[0][0]= s->picture_structure - 1; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             s->last_mv[0][0][0] = 0; | 
					
						
							|  |  |  |             s->last_mv[0][0][1] = 0; | 
					
						
							|  |  |  |             s->last_mv[0][1][0] = 0; | 
					
						
							|  |  |  |             s->last_mv[0][1][1] = 0; | 
					
						
							|  |  |  |             s->mv[0][0][0] = 0; | 
					
						
							|  |  |  |             s->mv[0][0][1] = 0; | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             assert(mb_type & MB_TYPE_L0L1); | 
					
						
							|  |  |  | //FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
 | 
					
						
							| 
									
										
										
										
											2007-04-07 14:09:20 +00:00
										 |  |  |             /* get additional motion vector type */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             if (s->frame_pred_frame_dct) | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                 motion_type = MT_FRAME; | 
					
						
							|  |  |  |             else{ | 
					
						
							|  |  |  |                 motion_type = get_bits(&s->gb, 2); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /* compute dct type */ | 
					
						
							|  |  |  |             if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var?
 | 
					
						
							| 
									
										
										
										
											2003-12-04 18:34:47 +00:00
										 |  |  |                 !s->frame_pred_frame_dct && HAS_CBP(mb_type)) { | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                 s->interlaced_dct = get_bits1(&s->gb); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (IS_QUANT(mb_type)) | 
					
						
							|  |  |  |                 s->qscale = get_qscale(s); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /* motion vectors */ | 
					
						
							|  |  |  |             s->mv_dir = 0; | 
					
						
							|  |  |  |             for(i=0;i<2;i++) { | 
					
						
							|  |  |  |                 if (USES_LIST(mb_type, i)) { | 
					
						
							|  |  |  |                     s->mv_dir |= (MV_DIR_FORWARD >> i); | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |                     dprintf(s->avctx, "motion_type=%d\n", motion_type); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                     switch(motion_type) { | 
					
						
							|  |  |  |                     case MT_FRAME: /* or MT_16X8 */ | 
					
						
							|  |  |  |                         if (s->picture_structure == PICT_FRAME) { | 
					
						
							|  |  |  |                             /* MT_FRAME */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             mb_type |= MB_TYPE_16x16; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             s->mv_type = MV_TYPE_16X16; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] = | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                 mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] = | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                 mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                             /* full_pel: only for mpeg1 */ | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             if (s->full_pel[i]){ | 
					
						
							|  |  |  |                                 s->mv[i][0][0] <<= 1; | 
					
						
							|  |  |  |                                 s->mv[i][0][1] <<= 1; | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                         } else { | 
					
						
							|  |  |  |                             /* MT_16X8 */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             s->mv_type = MV_TYPE_16X8; | 
					
						
							|  |  |  |                             for(j=0;j<2;j++) { | 
					
						
							|  |  |  |                                 s->field_select[i][j] = get_bits1(&s->gb); | 
					
						
							|  |  |  |                                 for(k=0;k<2;k++) { | 
					
						
							|  |  |  |                                     val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], | 
					
						
							|  |  |  |                                                              s->last_mv[i][j][k]); | 
					
						
							|  |  |  |                                     s->last_mv[i][j][k] = val; | 
					
						
							|  |  |  |                                     s->mv[i][j][k] = val; | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                             } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     case MT_FIELD: | 
					
						
							|  |  |  |                         s->mv_type = MV_TYPE_FIELD; | 
					
						
							|  |  |  |                         if (s->picture_structure == PICT_FRAME) { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             for(j=0;j<2;j++) { | 
					
						
							|  |  |  |                                 s->field_select[i][j] = get_bits1(&s->gb); | 
					
						
							|  |  |  |                                 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0], | 
					
						
							|  |  |  |                                                          s->last_mv[i][j][0]); | 
					
						
							|  |  |  |                                 s->last_mv[i][j][0] = val; | 
					
						
							|  |  |  |                                 s->mv[i][j][0] = val; | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |                                 dprintf(s->avctx, "fmx=%d\n", val); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                 val = mpeg_decode_motion(s, s->mpeg_f_code[i][1], | 
					
						
							|  |  |  |                                                          s->last_mv[i][j][1] >> 1); | 
					
						
							|  |  |  |                                 s->last_mv[i][j][1] = val << 1; | 
					
						
							|  |  |  |                                 s->mv[i][j][1] = val; | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |                                 dprintf(s->avctx, "fmy=%d\n", val); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             } | 
					
						
							|  |  |  |                         } else { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             s->field_select[i][0] = get_bits1(&s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                             for(k=0;k<2;k++) { | 
					
						
							|  |  |  |                                 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                                          s->last_mv[i][0][k]); | 
					
						
							|  |  |  |                                 s->last_mv[i][0][k] = val; | 
					
						
							|  |  |  |                                 s->last_mv[i][1][k] = val; | 
					
						
							|  |  |  |                                 s->mv[i][0][k] = val; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                             } | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     case MT_DMV: | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             int dmx, dmy, mx, my, m; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0], | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                                     s->last_mv[i][0][0]); | 
					
						
							|  |  |  |                             s->last_mv[i][0][0] = mx; | 
					
						
							|  |  |  |                             s->last_mv[i][1][0] = mx; | 
					
						
							|  |  |  |                             dmx = get_dmv(s); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                             my = mpeg_decode_motion(s, s->mpeg_f_code[i][1], | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                                     s->last_mv[i][0][1] >> 1); | 
					
						
							|  |  |  |                             dmy = get_dmv(s); | 
					
						
							|  |  |  |                             s->mv_type = MV_TYPE_DMV; | 
					
						
							| 
									
										
										
										
											2003-06-23 22:32:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                             s->last_mv[i][0][1] = my<<1; | 
					
						
							|  |  |  |                             s->last_mv[i][1][1] = my<<1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                             s->mv[i][0][0] = mx; | 
					
						
							|  |  |  |                             s->mv[i][0][1] = my; | 
					
						
							|  |  |  |                             s->mv[i][1][0] = mx;//not used
 | 
					
						
							|  |  |  |                             s->mv[i][1][1] = my;//not used
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             if (s->picture_structure == PICT_FRAME) { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                                 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-23 22:32:15 +00:00
										 |  |  |                                 //m = 1 + 2 * s->top_field_first;
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                 m = s->top_field_first ? 1 : 3; | 
					
						
							| 
									
										
										
										
											2003-06-23 22:32:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                 /* top -> top pred */ | 
					
						
							| 
									
										
										
										
											2003-06-23 22:32:15 +00:00
										 |  |  |                                 s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx; | 
					
						
							|  |  |  |                                 s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                                 m = 4 - m; | 
					
						
							|  |  |  |                                 s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx; | 
					
						
							|  |  |  |                                 s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1; | 
					
						
							|  |  |  |                             } else { | 
					
						
							|  |  |  |                                 mb_type |= MB_TYPE_16x16; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-23 22:32:15 +00:00
										 |  |  |                                 s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx; | 
					
						
							|  |  |  |                                 s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy; | 
					
						
							|  |  |  |                                 if(s->picture_structure == PICT_TOP_FIELD) | 
					
						
							|  |  |  |                                     s->mv[i][2][1]--; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                                 else | 
					
						
							| 
									
										
										
										
											2003-06-23 22:32:15 +00:00
										 |  |  |                                     s->mv[i][2][1]++; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                             } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                         break; | 
					
						
							| 
									
										
										
										
											2003-12-10 02:34:09 +00:00
										 |  |  |                     default: | 
					
						
							|  |  |  |                         av_log(s->avctx, AV_LOG_ERROR, "00 motion_type at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							|  |  |  |                         return -1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         s->mb_intra = 0; | 
					
						
							| 
									
										
										
										
											2003-12-04 18:34:47 +00:00
										 |  |  |         if (HAS_CBP(mb_type)) { | 
					
						
							| 
									
										
										
										
											2005-04-21 21:23:22 +00:00
										 |  |  |             s->dsp.clear_blocks(s->block[0]); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-21 21:23:22 +00:00
										 |  |  |             if(!s->chroma_y_shift){ | 
					
						
							|  |  |  |                 s->dsp.clear_blocks(s->block[6]); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             cbp = get_vlc2(&s->gb, mb_pat_vlc.table, MB_PAT_VLC_BITS, 1); | 
					
						
							| 
									
										
										
										
											2004-03-04 14:58:48 +00:00
										 |  |  |             if (cbp < 0 || ((cbp == 0) && (s->chroma_format < 2)) ){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "invalid cbp at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                 return -1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2004-06-12 16:51:15 +00:00
										 |  |  |             if(mb_block_count > 6){ | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                  cbp<<= mb_block_count-6; | 
					
						
							|  |  |  |                  cbp |= get_bits(&s->gb, mb_block_count-6); | 
					
						
							| 
									
										
										
										
											2004-03-01 14:55:21 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  | #ifdef HAVE_XVMC
 | 
					
						
							|  |  |  |             //on 1 we memcpy blocks in xvmcvideo
 | 
					
						
							|  |  |  |             if(s->avctx->xvmc_acceleration > 1){ | 
					
						
							|  |  |  |                 XVMC_pack_pblocks(s,cbp); | 
					
						
							|  |  |  |                 if(s->swap_uv){ | 
					
						
							|  |  |  |                     exchange_uv(s); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |             if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |                 if(s->flags2 & CODEC_FLAG2_FAST){ | 
					
						
							|  |  |  |                     for(i=0;i<6;i++) { | 
					
						
							|  |  |  |                         if(cbp & 32) { | 
					
						
							|  |  |  |                             mpeg2_fast_decode_block_non_intra(s, s->pblocks[i], i); | 
					
						
							|  |  |  |                         } else { | 
					
						
							|  |  |  |                             s->block_last_index[i] = -1; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         cbp+=cbp; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }else{ | 
					
						
							|  |  |  |                     cbp<<= 12-mb_block_count; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |                     for(i=0;i<mb_block_count;i++) { | 
					
						
							|  |  |  |                         if ( cbp & (1<<11) ) { | 
					
						
							|  |  |  |                             if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0) | 
					
						
							|  |  |  |                                 return -1; | 
					
						
							|  |  |  |                         } else { | 
					
						
							|  |  |  |                             s->block_last_index[i] = -1; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         cbp+=cbp; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |                 if(s->flags2 & CODEC_FLAG2_FAST){ | 
					
						
							|  |  |  |                     for(i=0;i<6;i++) { | 
					
						
							|  |  |  |                         if (cbp & 32) { | 
					
						
							|  |  |  |                             mpeg1_fast_decode_block_inter(s, s->pblocks[i], i); | 
					
						
							|  |  |  |                         } else { | 
					
						
							|  |  |  |                             s->block_last_index[i] = -1; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         cbp+=cbp; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 }else{ | 
					
						
							|  |  |  |                     for(i=0;i<6;i++) { | 
					
						
							|  |  |  |                         if (cbp & 32) { | 
					
						
							|  |  |  |                             if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) | 
					
						
							|  |  |  |                                 return -1; | 
					
						
							|  |  |  |                         } else { | 
					
						
							|  |  |  |                             s->block_last_index[i] = -1; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         cbp+=cbp; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         }else{ | 
					
						
							| 
									
										
										
										
											2005-11-20 23:09:05 +00:00
										 |  |  |             for(i=0;i<12;i++) | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                 s->block_last_index[i] = -1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= mb_type; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* as h263, but only 17 codes */ | 
					
						
							|  |  |  | static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2003-05-14 01:08:02 +00:00
										 |  |  |     int code, sign, val, l, shift; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-13 16:10:27 +00:00
										 |  |  |     code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (code == 0) { | 
					
						
							|  |  |  |         return pred; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |     if (code < 0) { | 
					
						
							|  |  |  |         return 0xffff; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     sign = get_bits1(&s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     shift = fcode - 1; | 
					
						
							| 
									
										
										
										
											2003-05-14 01:08:02 +00:00
										 |  |  |     val = code; | 
					
						
							|  |  |  |     if (shift) { | 
					
						
							|  |  |  |         val = (val - 1) << shift; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         val |= get_bits(&s->gb, shift); | 
					
						
							| 
									
										
										
										
											2003-05-14 01:08:02 +00:00
										 |  |  |         val++; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (sign) | 
					
						
							|  |  |  |         val = -val; | 
					
						
							|  |  |  |     val += pred; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     /* modulo decoding */ | 
					
						
							| 
									
										
										
										
											2004-06-25 14:11:44 +00:00
										 |  |  |     l= INT_BIT - 5 - shift; | 
					
						
							|  |  |  |     val = (val<<l)>>l; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return val; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | static inline int decode_dc(GetBitContext *gb, int component) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int code, diff; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (component == 0) { | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |         code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |         code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-07-17 15:54:56 +00:00
										 |  |  |     if (code < 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |         av_log(NULL, AV_LOG_ERROR, "invalid dc code at\n"); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return 0xffff; | 
					
						
							| 
									
										
										
										
											2002-07-17 15:54:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (code == 0) { | 
					
						
							|  |  |  |         diff = 0; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |         diff = get_xbits(gb, code); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return diff; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg1_decode_block_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                                DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                                int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int level, dc, diff, i, j, run; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |     int component; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     RLTable *rl = &rl_mpeg1; | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |     uint8_t * const scantable= s->intra_scantable.permutated; | 
					
						
							|  |  |  |     const uint16_t *quant_matrix= s->intra_matrix; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |     const int qscale= s->qscale; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |     /* DC coef */ | 
					
						
							|  |  |  |     component = (n <= 3 ? 0 : n - 4 + 1); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     diff = decode_dc(&s->gb, component); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |     if (diff >= 0xffff) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     dc = s->last_dc[component]; | 
					
						
							|  |  |  |     dc += diff; | 
					
						
							|  |  |  |     s->last_dc[component] = dc; | 
					
						
							|  |  |  |     block[0] = dc<<3; | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(s->avctx, "dc=%d diff=%d\n", dc, diff); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |     i = 0; | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         OPEN_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |         /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |         for(;;) { | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2005-04-18 20:07:48 +00:00
										 |  |  |             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |             if(level == 127){ | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } else if(level != 0) { | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |                 level= (level*qscale*quant_matrix[j])>>4; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 level= (level-1)|1; | 
					
						
							|  |  |  |                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | 
					
						
							|  |  |  |                 LAST_SKIP_BITS(re, &s->gb, 1); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 /* escape */ | 
					
						
							|  |  |  |                 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | 
					
						
							|  |  |  |                 UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |                 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | 
					
						
							|  |  |  |                 if (level == -128) { | 
					
						
							|  |  |  |                     level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); | 
					
						
							|  |  |  |                 } else if (level == 0) { | 
					
						
							|  |  |  |                     level = SHOW_UBITS(re, &s->gb, 8)      ; LAST_SKIP_BITS(re, &s->gb, 8); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 if(level<0){ | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |                     level= (level*qscale*quant_matrix[j])>>4; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							|  |  |  |                 }else{ | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |                     level= (level*qscale*quant_matrix[j])>>4; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (i > 63){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             block[j] = level; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         CLOSE_READER(re, &s->gb); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     s->block_last_index[n] = i; | 
					
						
							|  |  |  |    return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg1_decode_block_inter(MpegEncContext *s, | 
					
						
							|  |  |  |                                DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                                int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int level, i, j, run; | 
					
						
							|  |  |  |     RLTable *rl = &rl_mpeg1; | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |     uint8_t * const scantable= s->intra_scantable.permutated; | 
					
						
							|  |  |  |     const uint16_t *quant_matrix= s->inter_matrix; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |     const int qscale= s->qscale; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-07-09 10:35:10 +00:00
										 |  |  |         OPEN_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |         i = -1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         /* special case for the first coef. no need to add a second vlc table */ | 
					
						
							| 
									
										
										
										
											2002-07-09 10:35:10 +00:00
										 |  |  |         UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |         if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |             level= (3*qscale*quant_matrix[0])>>5; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |             level= (level-1)|1; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(GET_CACHE(re, &s->gb)&0x40000000) | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 level= -level; | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             block[0] = level; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |             i++; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             SKIP_BITS(re, &s->gb, 2); | 
					
						
							|  |  |  |             if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |                 goto end; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |         /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |         for(;;) { | 
					
						
							| 
									
										
										
										
											2005-04-18 20:07:48 +00:00
										 |  |  |             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(level != 0) { | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |                 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 level= (level-1)|1; | 
					
						
							|  |  |  |                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |                 SKIP_BITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 /* escape */ | 
					
						
							|  |  |  |                 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | 
					
						
							|  |  |  |                 UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |                 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | 
					
						
							|  |  |  |                 if (level == -128) { | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |                     level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 } else if (level == 0) { | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |                     level = SHOW_UBITS(re, &s->gb, 8)      ; SKIP_BITS(re, &s->gb, 8); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 if(level<0){ | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |                     level= ((level*2+1)*qscale*quant_matrix[j])>>5; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							|  |  |  |                 }else{ | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |                     level= ((level*2+1)*qscale*quant_matrix[j])>>5; | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |             if (i > 63){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             block[j] = level; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  | end: | 
					
						
							|  |  |  |         LAST_SKIP_BITS(re, &s->gb, 2); | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |         CLOSE_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-09-30 16:14:14 +00:00
										 |  |  |     s->block_last_index[n] = i; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  | static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int level, i, j, run; | 
					
						
							|  |  |  |     RLTable *rl = &rl_mpeg1; | 
					
						
							|  |  |  |     uint8_t * const scantable= s->intra_scantable.permutated; | 
					
						
							|  |  |  |     const int qscale= s->qscale; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         OPEN_READER(re, &s->gb); | 
					
						
							|  |  |  |         i = -1; | 
					
						
							|  |  |  |         /* special case for the first coef. no need to add a second vlc table */ | 
					
						
							|  |  |  |         UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |         if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | 
					
						
							| 
									
										
										
										
											2004-09-02 18:46:41 +00:00
										 |  |  |             level= (3*qscale)>>1; | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |             level= (level-1)|1; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(GET_CACHE(re, &s->gb)&0x40000000) | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |                 level= -level; | 
					
						
							|  |  |  |             block[0] = level; | 
					
						
							|  |  |  |             i++; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             SKIP_BITS(re, &s->gb, 2); | 
					
						
							|  |  |  |             if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |                 goto end; | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |         for(;;) { | 
					
						
							| 
									
										
										
										
											2005-04-18 20:07:48 +00:00
										 |  |  |             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(level != 0) { | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 level= ((level*2+1)*qscale)>>1; | 
					
						
							|  |  |  |                 level= (level-1)|1; | 
					
						
							|  |  |  |                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |                 SKIP_BITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 /* escape */ | 
					
						
							|  |  |  |                 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | 
					
						
							|  |  |  |                 UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |                 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | 
					
						
							|  |  |  |                 if (level == -128) { | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |                     level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |                 } else if (level == 0) { | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |                     level = SHOW_UBITS(re, &s->gb, 8)      ; SKIP_BITS(re, &s->gb, 8); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 if(level<0){ | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							|  |  |  |                     level= ((level*2+1)*qscale)>>1; | 
					
						
							|  |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							|  |  |  |                 }else{ | 
					
						
							|  |  |  |                     level= ((level*2+1)*qscale)>>1; | 
					
						
							|  |  |  |                     level= (level-1)|1; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             block[j] = level; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  | end: | 
					
						
							|  |  |  |         LAST_SKIP_BITS(re, &s->gb, 2); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:46:03 +00:00
										 |  |  |         CLOSE_READER(re, &s->gb); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     s->block_last_index[n] = i; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                                DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |                                int n) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int level, i, j, run; | 
					
						
							|  |  |  |     RLTable *rl = &rl_mpeg1; | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |     uint8_t * const scantable= s->intra_scantable.permutated; | 
					
						
							|  |  |  |     const uint16_t *quant_matrix; | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     const int qscale= s->qscale; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     int mismatch; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mismatch = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2002-07-09 10:35:10 +00:00
										 |  |  |         OPEN_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |         i = -1; | 
					
						
							| 
									
										
										
										
											2002-07-09 10:35:10 +00:00
										 |  |  |         if (n < 4) | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             quant_matrix = s->inter_matrix; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             quant_matrix = s->chroma_inter_matrix; | 
					
						
							| 
									
										
										
										
											2002-07-09 10:35:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         /* special case for the first coef. no need to add a second vlc table */ | 
					
						
							| 
									
										
										
										
											2002-07-09 10:35:10 +00:00
										 |  |  |         UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |         if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             level= (3*qscale*quant_matrix[0])>>5; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(GET_CACHE(re, &s->gb)&0x40000000) | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |                 level= -level; | 
					
						
							|  |  |  |             block[0] = level; | 
					
						
							|  |  |  |             mismatch ^= level; | 
					
						
							|  |  |  |             i++; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             SKIP_BITS(re, &s->gb, 2); | 
					
						
							|  |  |  |             if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |                 goto end; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |         /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |         for(;;) { | 
					
						
							| 
									
										
										
										
											2005-04-18 20:07:48 +00:00
										 |  |  |             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(level != 0) { | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | 
					
						
							|  |  |  |                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |                 SKIP_BITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 /* escape */ | 
					
						
							|  |  |  |                 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | 
					
						
							|  |  |  |                 UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |                 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 if(level<0){ | 
					
						
							|  |  |  |                     level= ((-level*2+1)*qscale*quant_matrix[j])>>5; | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							|  |  |  |                 }else{ | 
					
						
							|  |  |  |                     level= ((level*2+1)*qscale*quant_matrix[j])>>5; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (i > 63){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             mismatch ^= level; | 
					
						
							|  |  |  |             block[j] = level; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  | end: | 
					
						
							|  |  |  |         LAST_SKIP_BITS(re, &s->gb, 2); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |         CLOSE_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     block[63] ^= (mismatch & 1); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     s->block_last_index[n] = i; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                                DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |                                int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int level, i, j, run; | 
					
						
							|  |  |  |     RLTable *rl = &rl_mpeg1; | 
					
						
							|  |  |  |     uint8_t * const scantable= s->intra_scantable.permutated; | 
					
						
							|  |  |  |     const int qscale= s->qscale; | 
					
						
							|  |  |  |     OPEN_READER(re, &s->gb); | 
					
						
							|  |  |  |     i = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* special case for the first coef. no need to add a second vlc table */ | 
					
						
							|  |  |  |     UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |     if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |         level= (3*qscale)>>1; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |         if(GET_CACHE(re, &s->gb)&0x40000000) | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |             level= -level; | 
					
						
							|  |  |  |         block[0] = level; | 
					
						
							|  |  |  |         i++; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |         SKIP_BITS(re, &s->gb, 2); | 
					
						
							|  |  |  |         if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |             goto end; | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |     for(;;) { | 
					
						
							| 
									
										
										
										
											2005-04-18 20:07:48 +00:00
										 |  |  |         GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |         if(level != 0) { | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |             i += run; | 
					
						
							|  |  |  |             j = scantable[i]; | 
					
						
							|  |  |  |             level= ((level*2+1)*qscale)>>1; | 
					
						
							|  |  |  |             level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |             SKIP_BITS(re, &s->gb, 1); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             /* escape */ | 
					
						
							|  |  |  |             run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |             level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             i += run; | 
					
						
							|  |  |  |             j = scantable[i]; | 
					
						
							|  |  |  |             if(level<0){ | 
					
						
							|  |  |  |                 level= ((-level*2+1)*qscale)>>1; | 
					
						
							|  |  |  |                 level= -level; | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 level= ((level*2+1)*qscale)>>1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |         block[j] = level; | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  |         if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-04-19 11:37:01 +00:00
										 |  |  | end: | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     LAST_SKIP_BITS(re, &s->gb, 2); | 
					
						
							| 
									
										
										
										
											2004-09-02 15:30:46 +00:00
										 |  |  |     CLOSE_READER(re, &s->gb); | 
					
						
							|  |  |  |     s->block_last_index[n] = i; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg2_decode_block_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                                DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |                                int n) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int level, dc, diff, i, j, run; | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     int component; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     RLTable *rl; | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |     uint8_t * const scantable= s->intra_scantable.permutated; | 
					
						
							|  |  |  |     const uint16_t *quant_matrix; | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     const int qscale= s->qscale; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     int mismatch; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* DC coef */ | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     if (n < 4){ | 
					
						
							|  |  |  |         quant_matrix = s->intra_matrix; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         component = 0; | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     }else{ | 
					
						
							|  |  |  |         quant_matrix = s->chroma_intra_matrix; | 
					
						
							| 
									
										
										
										
											2004-03-01 14:55:21 +00:00
										 |  |  |         component = (n&1) + 1; | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     diff = decode_dc(&s->gb, component); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (diff >= 0xffff) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     dc = s->last_dc[component]; | 
					
						
							|  |  |  |     dc += diff; | 
					
						
							|  |  |  |     s->last_dc[component] = dc; | 
					
						
							|  |  |  |     block[0] = dc << (3 - s->intra_dc_precision); | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(s->avctx, "dc=%d\n", block[0]); | 
					
						
							| 
									
										
										
										
											2001-08-11 22:08:23 +00:00
										 |  |  |     mismatch = block[0] ^ 1; | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     i = 0; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (s->intra_vlc_format) | 
					
						
							|  |  |  |         rl = &rl_mpeg2; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         rl = &rl_mpeg1; | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         OPEN_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |         /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |         for(;;) { | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2005-04-18 20:07:48 +00:00
										 |  |  |             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             if(level == 127){ | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } else if(level != 0) { | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 level= (level*qscale*quant_matrix[j])>>4; | 
					
						
							|  |  |  |                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | 
					
						
							|  |  |  |                 LAST_SKIP_BITS(re, &s->gb, 1); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 /* escape */ | 
					
						
							|  |  |  |                 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | 
					
						
							|  |  |  |                 UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |                 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | 
					
						
							|  |  |  |                 i += run; | 
					
						
							|  |  |  |                 j = scantable[i]; | 
					
						
							|  |  |  |                 if(level<0){ | 
					
						
							|  |  |  |                     level= (-level*qscale*quant_matrix[j])>>4; | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							|  |  |  |                 }else{ | 
					
						
							|  |  |  |                     level= (level*qscale*quant_matrix[j])>>4; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (i > 63){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |             mismatch^= level; | 
					
						
							|  |  |  |             block[j] = level; | 
					
						
							| 
									
										
										
										
											2002-07-17 15:54:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |         CLOSE_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-10-01 23:11:40 +00:00
										 |  |  |     block[63]^= mismatch&1; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     s->block_last_index[n] = i; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, | 
					
						
							|  |  |  |                                DCTELEM *block, | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  |                                int n) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int level, dc, diff, j, run; | 
					
						
							|  |  |  |     int component; | 
					
						
							|  |  |  |     RLTable *rl; | 
					
						
							|  |  |  |     uint8_t * scantable= s->intra_scantable.permutated; | 
					
						
							|  |  |  |     const uint16_t *quant_matrix; | 
					
						
							|  |  |  |     const int qscale= s->qscale; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* DC coef */ | 
					
						
							|  |  |  |     if (n < 4){ | 
					
						
							|  |  |  |         quant_matrix = s->intra_matrix; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         component = 0; | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  |     }else{ | 
					
						
							|  |  |  |         quant_matrix = s->chroma_intra_matrix; | 
					
						
							|  |  |  |         component = (n&1) + 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     diff = decode_dc(&s->gb, component); | 
					
						
							|  |  |  |     if (diff >= 0xffff) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     dc = s->last_dc[component]; | 
					
						
							|  |  |  |     dc += diff; | 
					
						
							|  |  |  |     s->last_dc[component] = dc; | 
					
						
							|  |  |  |     block[0] = dc << (3 - s->intra_dc_precision); | 
					
						
							|  |  |  |     if (s->intra_vlc_format) | 
					
						
							|  |  |  |         rl = &rl_mpeg2; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         rl = &rl_mpeg1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         OPEN_READER(re, &s->gb); | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  |         /* now quantify & encode AC coefs */ | 
					
						
							|  |  |  |         for(;;) { | 
					
						
							|  |  |  |             UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  |             if(level == 127){ | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } else if(level != 0) { | 
					
						
							|  |  |  |                 scantable += run; | 
					
						
							|  |  |  |                 j = *scantable; | 
					
						
							|  |  |  |                 level= (level*qscale*quant_matrix[j])>>4; | 
					
						
							|  |  |  |                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | 
					
						
							|  |  |  |                 LAST_SKIP_BITS(re, &s->gb, 1); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 /* escape */ | 
					
						
							|  |  |  |                 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | 
					
						
							|  |  |  |                 UPDATE_CACHE(re, &s->gb); | 
					
						
							|  |  |  |                 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | 
					
						
							|  |  |  |                 scantable += run; | 
					
						
							|  |  |  |                 j = *scantable; | 
					
						
							|  |  |  |                 if(level<0){ | 
					
						
							|  |  |  |                     level= (-level*qscale*quant_matrix[j])>>4; | 
					
						
							|  |  |  |                     level= -level; | 
					
						
							|  |  |  |                 }else{ | 
					
						
							|  |  |  |                     level= (level*qscale*quant_matrix[j])>>4; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  |             block[j] = level; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         CLOSE_READER(re, &s->gb); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-20 20:31:04 +00:00
										 |  |  |     s->block_last_index[n] = scantable - s->intra_scantable.permutated; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | typedef struct Mpeg1Context { | 
					
						
							|  |  |  |     MpegEncContext mpeg_enc_ctx; | 
					
						
							|  |  |  |     int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ | 
					
						
							| 
									
										
										
										
											2002-03-16 02:41:00 +00:00
										 |  |  |     int repeat_field; /* true if we must repeat the field */ | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |     AVPanScan pan_scan; /** some temporary storage for the panscan */ | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     int slice_count; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |     int swap_uv;//indicate VCR2
 | 
					
						
							|  |  |  |     int save_aspect_info; | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  |     AVRational frame_rate_ext;       ///< MPEG-2 specific framerate modificator
 | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } Mpeg1Context; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int mpeg_decode_init(AVCodecContext *avctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s = avctx->priv_data; | 
					
						
							| 
									
										
										
										
											2004-03-16 16:11:29 +00:00
										 |  |  |     MpegEncContext *s2 = &s->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2004-04-29 23:20:46 +00:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-04-29 23:20:46 +00:00
										 |  |  |     //we need some parmutation to store
 | 
					
						
							|  |  |  |     //matrixes, until MPV_common_init()
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     //set the real permutatuon
 | 
					
						
							| 
									
										
										
										
											2004-04-29 23:20:46 +00:00
										 |  |  |     for(i=0;i<64;i++) | 
					
						
							|  |  |  |        s2->dsp.idct_permutation[i]=i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-16 16:11:29 +00:00
										 |  |  |     MPV_decode_defaults(s2); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-08 18:44:36 +00:00
										 |  |  |     s->mpeg_enc_ctx.avctx= avctx; | 
					
						
							| 
									
										
										
										
											2002-07-16 00:48:29 +00:00
										 |  |  |     s->mpeg_enc_ctx.flags= avctx->flags; | 
					
						
							| 
									
										
										
										
											2004-01-22 19:48:28 +00:00
										 |  |  |     s->mpeg_enc_ctx.flags2= avctx->flags2; | 
					
						
							| 
									
										
										
										
											2002-06-18 00:46:02 +00:00
										 |  |  |     common_init(&s->mpeg_enc_ctx); | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |     init_vlcs(); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     s->mpeg_enc_ctx_allocated = 0; | 
					
						
							|  |  |  |     s->mpeg_enc_ctx.picture_number = 0; | 
					
						
							| 
									
										
										
										
											2002-03-16 02:41:00 +00:00
										 |  |  |     s->repeat_field = 0; | 
					
						
							| 
									
										
										
										
											2002-04-27 12:30:26 +00:00
										 |  |  |     s->mpeg_enc_ctx.codec_id= avctx->codec->id; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm, | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |                                      const uint8_t *new_perm){ | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  |     uint16_t temp_matrix[64]; | 
					
						
							|  |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     memcpy(temp_matrix,matrix,64*sizeof(uint16_t)); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |     for(i=0;i<64;i++){ | 
					
						
							|  |  |  |         matrix[new_perm[i]] = temp_matrix[old_perm[i]]; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //Call this function when we know all parameters
 | 
					
						
							|  |  |  | //it may be called in different places for mpeg1 and mpeg2
 | 
					
						
							|  |  |  | static int mpeg_decode_postinit(AVCodecContext *avctx){ | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  |     Mpeg1Context *s1 = avctx->priv_data; | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							|  |  |  |     uint8_t old_permutation[64]; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if ( | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |         (s1->mpeg_enc_ctx_allocated == 0)|| | 
					
						
							| 
									
										
										
										
											2004-09-27 11:50:56 +00:00
										 |  |  |         avctx->coded_width  != s->width || | 
					
						
							|  |  |  |         avctx->coded_height != s->height|| | 
					
						
							| 
									
										
										
										
											2005-04-03 17:34:31 +00:00
										 |  |  |         s1->save_aspect_info != s->aspect_ratio_info|| | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |         0) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |         if (s1->mpeg_enc_ctx_allocated) { | 
					
						
							| 
									
										
										
										
											2005-05-14 15:34:49 +00:00
										 |  |  |             ParseContext pc= s->parse_context; | 
					
						
							|  |  |  |             s->parse_context.buffer=0; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |             MPV_common_end(s); | 
					
						
							| 
									
										
										
										
											2005-05-14 15:34:49 +00:00
										 |  |  |             s->parse_context= pc; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |         if( (s->width == 0 )||(s->height == 0)) | 
					
						
							|  |  |  |             return -2; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-27 11:50:56 +00:00
										 |  |  |         avcodec_set_dimensions(avctx, s->width, s->height); | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |         avctx->bit_rate = s->bit_rate; | 
					
						
							|  |  |  |         s1->save_aspect_info = s->aspect_ratio_info; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      //low_delay may be forced, in this case we will have B frames
 | 
					
						
							|  |  |  |      //that behave like P frames
 | 
					
						
							|  |  |  |         avctx->has_b_frames = !(s->low_delay); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if(avctx->sub_id==1){//s->codec_id==avctx->codec_id==CODEC_ID
 | 
					
						
							|  |  |  |             //mpeg1 fps
 | 
					
						
							| 
									
										
										
										
											2006-07-02 14:50:23 +00:00
										 |  |  |             avctx->time_base.den= ff_frame_rate_tab[s->frame_rate_index].num; | 
					
						
							|  |  |  |             avctx->time_base.num= ff_frame_rate_tab[s->frame_rate_index].den; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |             //mpeg1 aspect
 | 
					
						
							|  |  |  |             avctx->sample_aspect_ratio= av_d2q( | 
					
						
							|  |  |  |                     1.0/mpeg1_aspect[s->aspect_ratio_info], 255); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         }else{//mpeg2
 | 
					
						
							|  |  |  |         //mpeg2 fps
 | 
					
						
							|  |  |  |             av_reduce( | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                 &s->avctx->time_base.den, | 
					
						
							|  |  |  |                 &s->avctx->time_base.num, | 
					
						
							| 
									
										
										
										
											2006-07-02 14:50:23 +00:00
										 |  |  |                 ff_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num, | 
					
						
							|  |  |  |                 ff_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den, | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |                 1<<30); | 
					
						
							|  |  |  |         //mpeg2 aspect
 | 
					
						
							|  |  |  |             if(s->aspect_ratio_info > 1){ | 
					
						
							| 
									
										
										
										
											2004-03-16 15:38:40 +00:00
										 |  |  |                 if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) ){ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                     s->avctx->sample_aspect_ratio= | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |                         av_div_q( | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                          mpeg2_aspect[s->aspect_ratio_info], | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |                          (AVRational){s->width, s->height} | 
					
						
							|  |  |  |                          ); | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |                 }else{ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                     s->avctx->sample_aspect_ratio= | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |                         av_div_q( | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                          mpeg2_aspect[s->aspect_ratio_info], | 
					
						
							| 
									
										
										
										
											2004-03-16 15:38:40 +00:00
										 |  |  |                          (AVRational){s1->pan_scan.width, s1->pan_scan.height} | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |                         ); | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |             }else{ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                 s->avctx->sample_aspect_ratio= | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |                     mpeg2_aspect[s->aspect_ratio_info]; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         }//mpeg2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if(avctx->xvmc_acceleration){ | 
					
						
							|  |  |  |             avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420); | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             if(s->chroma_format <  2){ | 
					
						
							|  |  |  |                 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420); | 
					
						
							|  |  |  |             }else | 
					
						
							|  |  |  |             if(s->chroma_format == 2){ | 
					
						
							|  |  |  |                 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_422); | 
					
						
							|  |  |  |             }else | 
					
						
							|  |  |  |             if(s->chroma_format >  2){ | 
					
						
							|  |  |  |                 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_444); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         //until then pix_fmt may be changed right after codec init
 | 
					
						
							|  |  |  |         if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT ) | 
					
						
							|  |  |  |             if( avctx->idct_algo == FF_IDCT_AUTO ) | 
					
						
							|  |  |  |                 avctx->idct_algo = FF_IDCT_SIMPLE; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         //quantization matrixes may need reordering
 | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |         //if dct permutation is changed
 | 
					
						
							|  |  |  |         memcpy(old_permutation,s->dsp.idct_permutation,64*sizeof(uint8_t)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (MPV_common_init(s) < 0) | 
					
						
							|  |  |  |             return -2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         quant_matrix_rebuild(s->intra_matrix,       old_permutation,s->dsp.idct_permutation); | 
					
						
							|  |  |  |         quant_matrix_rebuild(s->inter_matrix,       old_permutation,s->dsp.idct_permutation); | 
					
						
							|  |  |  |         quant_matrix_rebuild(s->chroma_intra_matrix,old_permutation,s->dsp.idct_permutation); | 
					
						
							|  |  |  |         quant_matrix_rebuild(s->chroma_inter_matrix,old_permutation,s->dsp.idct_permutation); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         s1->mpeg_enc_ctx_allocated = 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static int mpeg1_decode_picture(AVCodecContext *avctx, | 
					
						
							| 
									
										
										
										
											2004-03-05 14:21:56 +00:00
										 |  |  |                                 const uint8_t *buf, int buf_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s1 = avctx->priv_data; | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2003-12-17 19:53:05 +00:00
										 |  |  |     int ref, f_code, vbv_delay; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     if(mpeg_decode_postinit(s->avctx) < 0) | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |        return -2; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-21 17:34:12 +00:00
										 |  |  |     init_get_bits(&s->gb, buf, buf_size*8); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ref = get_bits(&s->gb, 10); /* temporal ref */ | 
					
						
							|  |  |  |     s->pict_type = get_bits(&s->gb, 3); | 
					
						
							| 
									
										
										
										
											2005-03-26 17:01:49 +00:00
										 |  |  |     if(s->pict_type == 0 || s->pict_type > 3) | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2002-11-18 09:28:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-17 19:53:05 +00:00
										 |  |  |     vbv_delay= get_bits(&s->gb, 16); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |         s->full_pel[0] = get_bits1(&s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         f_code = get_bits(&s->gb, 3); | 
					
						
							| 
									
										
										
										
											2005-07-11 22:15:03 +00:00
										 |  |  |         if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             return -1; | 
					
						
							|  |  |  |         s->mpeg_f_code[0][0] = f_code; | 
					
						
							|  |  |  |         s->mpeg_f_code[0][1] = f_code; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (s->pict_type == B_TYPE) { | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |         s->full_pel[1] = get_bits1(&s->gb); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         f_code = get_bits(&s->gb, 3); | 
					
						
							| 
									
										
										
										
											2005-07-11 22:15:03 +00:00
										 |  |  |         if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             return -1; | 
					
						
							|  |  |  |         s->mpeg_f_code[1][0] = f_code; | 
					
						
							|  |  |  |         s->mpeg_f_code[1][1] = f_code; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-12-04 10:04:03 +00:00
										 |  |  |     s->current_picture.pict_type= s->pict_type; | 
					
						
							|  |  |  |     s->current_picture.key_frame= s->pict_type == I_TYPE; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-26 17:01:49 +00:00
										 |  |  |     if(avctx->debug & FF_DEBUG_PICT_INFO) | 
					
						
							|  |  |  |         av_log(avctx, AV_LOG_DEBUG, "vbv_delay %d, ref %d type:%d\n", vbv_delay, ref, s->pict_type); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     s->y_dc_scale = 8; | 
					
						
							|  |  |  |     s->c_dc_scale = 8; | 
					
						
							|  |  |  |     s->first_slice = 1; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  | static void mpeg_decode_sequence_extension(Mpeg1Context *s1) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  |     MpegEncContext *s= &s1->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     int horiz_size_ext, vert_size_ext; | 
					
						
							| 
									
										
										
										
											2004-01-04 00:23:14 +00:00
										 |  |  |     int bit_rate_ext; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     skip_bits(&s->gb, 1); /* profil and level esc*/ | 
					
						
							| 
									
										
										
										
											2004-08-13 13:59:28 +00:00
										 |  |  |     s->avctx->profile= get_bits(&s->gb, 3); | 
					
						
							|  |  |  |     s->avctx->level= get_bits(&s->gb, 4); | 
					
						
							| 
									
										
										
										
											2002-03-16 02:41:00 +00:00
										 |  |  |     s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */ | 
					
						
							| 
									
										
										
										
											2004-03-01 14:55:21 +00:00
										 |  |  |     s->chroma_format = get_bits(&s->gb, 2); /* chroma_format 1=420, 2=422, 3=444 */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     horiz_size_ext = get_bits(&s->gb, 2); | 
					
						
							|  |  |  |     vert_size_ext = get_bits(&s->gb, 2); | 
					
						
							|  |  |  |     s->width |= (horiz_size_ext << 12); | 
					
						
							|  |  |  |     s->height |= (vert_size_ext << 12); | 
					
						
							|  |  |  |     bit_rate_ext = get_bits(&s->gb, 12);  /* XXX: handle it */ | 
					
						
							| 
									
										
										
										
											2005-03-05 03:37:19 +00:00
										 |  |  |     s->bit_rate += (bit_rate_ext << 18) * 400; | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     skip_bits1(&s->gb); /* marker */ | 
					
						
							| 
									
										
										
										
											2004-01-01 02:56:35 +00:00
										 |  |  |     s->avctx->rc_buffer_size += get_bits(&s->gb, 8)*1024*16<<10; | 
					
						
							| 
									
										
										
										
											2003-07-06 21:24:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-06 16:04:30 +00:00
										 |  |  |     s->low_delay = get_bits1(&s->gb); | 
					
						
							| 
									
										
										
										
											2003-07-06 21:24:04 +00:00
										 |  |  |     if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  |     s1->frame_rate_ext.num = get_bits(&s->gb, 2)+1; | 
					
						
							|  |  |  |     s1->frame_rate_ext.den = get_bits(&s->gb, 5)+1; | 
					
						
							| 
									
										
										
										
											2003-03-12 15:16:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(s->avctx, "sequence extension\n"); | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:24:39 +00:00
										 |  |  |     s->avctx->sub_id = 2; /* indicates mpeg2 found */ | 
					
						
							| 
									
										
										
										
											2002-12-06 16:04:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     if(s->avctx->debug & FF_DEBUG_PICT_INFO) | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n", | 
					
						
							| 
									
										
										
										
											2004-08-13 13:59:28 +00:00
										 |  |  |                s->avctx->profile, s->avctx->level, s->avctx->rc_buffer_size, s->bit_rate); | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  | static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     MpegEncContext *s= &s1->mpeg_enc_ctx; | 
					
						
							|  |  |  |     int color_description, w, h; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     skip_bits(&s->gb, 3); /* video format */ | 
					
						
							|  |  |  |     color_description= get_bits1(&s->gb); | 
					
						
							|  |  |  |     if(color_description){ | 
					
						
							|  |  |  |         skip_bits(&s->gb, 8); /* color primaries */ | 
					
						
							|  |  |  |         skip_bits(&s->gb, 8); /* transfer_characteristics */ | 
					
						
							|  |  |  |         skip_bits(&s->gb, 8); /* matrix_coefficients */ | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     w= get_bits(&s->gb, 14); | 
					
						
							|  |  |  |     skip_bits(&s->gb, 1); //marker
 | 
					
						
							|  |  |  |     h= get_bits(&s->gb, 14); | 
					
						
							|  |  |  |     skip_bits(&s->gb, 1); //marker
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |     s1->pan_scan.width= 16*w; | 
					
						
							|  |  |  |     s1->pan_scan.height=16*h; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |     if(s->avctx->debug & FF_DEBUG_PICT_INFO) | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |         av_log(s->avctx, AV_LOG_DEBUG, "sde w:%d, h:%d\n", w, h); | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void mpeg_decode_picture_display_extension(Mpeg1Context *s1) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     MpegEncContext *s= &s1->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2004-03-16 15:38:40 +00:00
										 |  |  |     int i,nofco; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     nofco = 1; | 
					
						
							|  |  |  |     if(s->progressive_sequence){ | 
					
						
							|  |  |  |         if(s->repeat_first_field){ | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |             nofco++; | 
					
						
							|  |  |  |             if(s->top_field_first) | 
					
						
							|  |  |  |                 nofco++; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2004-03-16 15:38:40 +00:00
										 |  |  |     }else{ | 
					
						
							|  |  |  |         if(s->picture_structure == PICT_FRAME){ | 
					
						
							|  |  |  |             nofco++; | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |             if(s->repeat_first_field) | 
					
						
							|  |  |  |                 nofco++; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2004-03-16 15:38:40 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     for(i=0; i<nofco; i++){ | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |         s1->pan_scan.position[i][0]= get_sbits(&s->gb, 16); | 
					
						
							|  |  |  |         skip_bits(&s->gb, 1); //marker
 | 
					
						
							|  |  |  |         s1->pan_scan.position[i][1]= get_sbits(&s->gb, 16); | 
					
						
							|  |  |  |         skip_bits(&s->gb, 1); //marker
 | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |     if(s->avctx->debug & FF_DEBUG_PICT_INFO) | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         av_log(s->avctx, AV_LOG_DEBUG, "pde (%d,%d) (%d,%d) (%d,%d)\n", | 
					
						
							|  |  |  |             s1->pan_scan.position[0][0], s1->pan_scan.position[0][1], | 
					
						
							|  |  |  |             s1->pan_scan.position[1][0], s1->pan_scan.position[1][1], | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |             s1->pan_scan.position[2][0], s1->pan_scan.position[2][1] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2001-08-07 22:47:08 +00:00
										 |  |  |     int i, v, j; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(s->avctx, "matrix extension\n"); | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     if (get_bits1(&s->gb)) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         for(i=0;i<64;i++) { | 
					
						
							|  |  |  |             v = get_bits(&s->gb, 8); | 
					
						
							| 
									
										
										
										
											2003-03-03 14:54:00 +00:00
										 |  |  |             j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | 
					
						
							| 
									
										
										
										
											2001-08-07 22:47:08 +00:00
										 |  |  |             s->intra_matrix[j] = v; | 
					
						
							|  |  |  |             s->chroma_intra_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     if (get_bits1(&s->gb)) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         for(i=0;i<64;i++) { | 
					
						
							|  |  |  |             v = get_bits(&s->gb, 8); | 
					
						
							| 
									
										
										
										
											2003-03-03 14:54:00 +00:00
										 |  |  |             j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | 
					
						
							| 
									
										
										
										
											2002-04-27 12:30:26 +00:00
										 |  |  |             s->inter_matrix[j] = v; | 
					
						
							|  |  |  |             s->chroma_inter_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     if (get_bits1(&s->gb)) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         for(i=0;i<64;i++) { | 
					
						
							|  |  |  |             v = get_bits(&s->gb, 8); | 
					
						
							| 
									
										
										
										
											2003-03-03 14:54:00 +00:00
										 |  |  |             j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | 
					
						
							| 
									
										
										
										
											2001-08-07 22:47:08 +00:00
										 |  |  |             s->chroma_intra_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     if (get_bits1(&s->gb)) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         for(i=0;i<64;i++) { | 
					
						
							|  |  |  |             v = get_bits(&s->gb, 8); | 
					
						
							| 
									
										
										
										
											2003-03-03 14:54:00 +00:00
										 |  |  |             j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | 
					
						
							| 
									
										
										
										
											2002-04-27 12:30:26 +00:00
										 |  |  |             s->chroma_inter_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void mpeg_decode_picture_coding_extension(MpegEncContext *s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     s->full_pel[0] = s->full_pel[1] = 0; | 
					
						
							|  |  |  |     s->mpeg_f_code[0][0] = get_bits(&s->gb, 4); | 
					
						
							|  |  |  |     s->mpeg_f_code[0][1] = get_bits(&s->gb, 4); | 
					
						
							|  |  |  |     s->mpeg_f_code[1][0] = get_bits(&s->gb, 4); | 
					
						
							|  |  |  |     s->mpeg_f_code[1][1] = get_bits(&s->gb, 4); | 
					
						
							|  |  |  |     s->intra_dc_precision = get_bits(&s->gb, 2); | 
					
						
							|  |  |  |     s->picture_structure = get_bits(&s->gb, 2); | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     s->top_field_first = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->frame_pred_frame_dct = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->concealment_motion_vectors = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->q_scale_type = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->intra_vlc_format = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->alternate_scan = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->repeat_first_field = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->chroma_420_type = get_bits1(&s->gb); | 
					
						
							|  |  |  |     s->progressive_frame = get_bits1(&s->gb); | 
					
						
							| 
									
										
										
										
											2003-12-30 16:07:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-24 07:33:39 +00:00
										 |  |  |     if(s->picture_structure == PICT_FRAME){ | 
					
						
							| 
									
										
										
										
											2003-03-05 17:48:19 +00:00
										 |  |  |         s->first_field=0; | 
					
						
							| 
									
										
										
										
											2006-10-24 07:33:39 +00:00
										 |  |  |         s->v_edge_pos= 16*s->mb_height; | 
					
						
							|  |  |  |     }else{ | 
					
						
							| 
									
										
										
										
											2003-03-05 17:48:19 +00:00
										 |  |  |         s->first_field ^= 1; | 
					
						
							| 
									
										
										
										
											2006-10-24 07:33:39 +00:00
										 |  |  |         s->v_edge_pos=  8*s->mb_height; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         memset(s->mbskip_table, 0, s->mb_stride*s->mb_height); | 
					
						
							| 
									
										
										
										
											2003-03-05 17:48:19 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-01 23:47:04 +00:00
										 |  |  |     if(s->alternate_scan){ | 
					
						
							| 
									
										
										
										
											2003-05-19 13:30:59 +00:00
										 |  |  |         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_alternate_vertical_scan); | 
					
						
							|  |  |  |         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_alternate_vertical_scan); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:47:04 +00:00
										 |  |  |     }else{ | 
					
						
							| 
									
										
										
										
											2003-05-19 13:30:59 +00:00
										 |  |  |         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_zigzag_direct); | 
					
						
							|  |  |  |         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_zigzag_direct); | 
					
						
							| 
									
										
										
										
											2002-10-01 23:47:04 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     /* composite display not parsed */ | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(s->avctx, "intra_dc_precision=%d\n", s->intra_dc_precision); | 
					
						
							|  |  |  |     dprintf(s->avctx, "picture_structure=%d\n", s->picture_structure); | 
					
						
							|  |  |  |     dprintf(s->avctx, "top field first=%d\n", s->top_field_first); | 
					
						
							|  |  |  |     dprintf(s->avctx, "repeat first field=%d\n", s->repeat_first_field); | 
					
						
							|  |  |  |     dprintf(s->avctx, "conceal=%d\n", s->concealment_motion_vectors); | 
					
						
							|  |  |  |     dprintf(s->avctx, "intra_vlc_format=%d\n", s->intra_vlc_format); | 
					
						
							|  |  |  |     dprintf(s->avctx, "alternate_scan=%d\n", s->alternate_scan); | 
					
						
							|  |  |  |     dprintf(s->avctx, "frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct); | 
					
						
							|  |  |  |     dprintf(s->avctx, "progressive_frame=%d\n", s->progressive_frame); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static void mpeg_decode_extension(AVCodecContext *avctx, | 
					
						
							| 
									
										
										
										
											2004-03-05 14:21:56 +00:00
										 |  |  |                                   const uint8_t *buf, int buf_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s1 = avctx->priv_data; | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							|  |  |  |     int ext_type; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-21 17:34:12 +00:00
										 |  |  |     init_get_bits(&s->gb, buf, buf_size*8); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     ext_type = get_bits(&s->gb, 4); | 
					
						
							|  |  |  |     switch(ext_type) { | 
					
						
							|  |  |  |     case 0x1: | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  |         mpeg_decode_sequence_extension(s1); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |     case 0x2: | 
					
						
							|  |  |  |         mpeg_decode_sequence_display_extension(s1); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     case 0x3: | 
					
						
							|  |  |  |         mpeg_decode_quant_matrix_extension(s); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  |     case 0x7: | 
					
						
							|  |  |  |         mpeg_decode_picture_display_extension(s1); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     case 0x8: | 
					
						
							|  |  |  |         mpeg_decode_picture_coding_extension(s); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  | static void exchange_uv(MpegEncContext *s){ | 
					
						
							| 
									
										
										
										
											2004-09-10 18:54:02 +00:00
										 |  |  |     short * tmp = s->pblocks[4]; | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  |     s->pblocks[4] = s->pblocks[5]; | 
					
						
							|  |  |  |     s->pblocks[5] = tmp; | 
					
						
							| 
									
										
										
										
											2003-07-26 00:49:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  | static int mpeg_field_start(MpegEncContext *s){ | 
					
						
							|  |  |  |     AVCodecContext *avctx= s->avctx; | 
					
						
							|  |  |  |     Mpeg1Context *s1 = (Mpeg1Context*)s; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* start frame decoding */ | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     if(s->first_field || s->picture_structure==PICT_FRAME){ | 
					
						
							| 
									
										
										
										
											2002-10-27 00:02:23 +00:00
										 |  |  |         if(MPV_frame_start(s, avctx) < 0) | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |             return -1; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ff_er_frame_start(s); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-26 17:26:20 +00:00
										 |  |  |         /* first check if we must repeat the frame */ | 
					
						
							| 
									
										
										
										
											2003-08-22 08:29:44 +00:00
										 |  |  |         s->current_picture_ptr->repeat_pict = 0; | 
					
						
							| 
									
										
										
										
											2003-02-26 17:26:20 +00:00
										 |  |  |         if (s->repeat_first_field) { | 
					
						
							|  |  |  |             if (s->progressive_sequence) { | 
					
						
							|  |  |  |                 if (s->top_field_first) | 
					
						
							| 
									
										
										
										
											2003-08-22 08:29:44 +00:00
										 |  |  |                     s->current_picture_ptr->repeat_pict = 4; | 
					
						
							| 
									
										
										
										
											2003-02-26 17:26:20 +00:00
										 |  |  |                 else | 
					
						
							| 
									
										
										
										
											2003-08-22 08:29:44 +00:00
										 |  |  |                     s->current_picture_ptr->repeat_pict = 2; | 
					
						
							| 
									
										
										
										
											2003-02-26 17:26:20 +00:00
										 |  |  |             } else if (s->progressive_frame) { | 
					
						
							| 
									
										
										
										
											2003-08-22 08:29:44 +00:00
										 |  |  |                 s->current_picture_ptr->repeat_pict = 1; | 
					
						
							| 
									
										
										
										
											2003-02-26 17:26:20 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-10-20 09:52:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         *s->current_picture_ptr->pan_scan= s1->pan_scan; | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     }else{ //second field
 | 
					
						
							| 
									
										
										
										
											2003-03-16 20:22:22 +00:00
										 |  |  |             int i; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-11 22:53:03 +00:00
										 |  |  |             if(!s->current_picture_ptr){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "first field missing\n"); | 
					
						
							| 
									
										
										
										
											2003-04-11 22:53:03 +00:00
										 |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-16 20:22:22 +00:00
										 |  |  |             for(i=0; i<4; i++){ | 
					
						
							|  |  |  |                 s->current_picture.data[i] = s->current_picture_ptr->data[i]; | 
					
						
							|  |  |  |                 if(s->picture_structure == PICT_BOTTOM_FIELD){ | 
					
						
							|  |  |  |                     s->current_picture.data[i] += s->current_picture_ptr->linesize[i]; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2003-03-16 20:22:22 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | #ifdef HAVE_XVMC
 | 
					
						
							|  |  |  | // MPV_frame_start will call this function too,
 | 
					
						
							|  |  |  | // but we need to call it on every field
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     if(s->avctx->xvmc_acceleration) | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  |          XVMC_field_start(s,avctx); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define DECODE_SLICE_ERROR -1
 | 
					
						
							|  |  |  | #define DECODE_SLICE_OK 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * decodes a slice. MpegEncContext.mb_y must be set to the MB row from the startcode | 
					
						
							|  |  |  |  * @return DECODE_SLICE_ERROR if the slice is damaged<br> | 
					
						
							|  |  |  |  *         DECODE_SLICE_OK if this slice is ok<br> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y, | 
					
						
							| 
									
										
										
										
											2004-03-05 14:21:56 +00:00
										 |  |  |                              const uint8_t **buf, int buf_size) | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							|  |  |  |     AVCodecContext *avctx= s->avctx; | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  |     const int field_pic= s->picture_structure != PICT_FRAME; | 
					
						
							| 
									
										
										
										
											2004-09-25 23:18:58 +00:00
										 |  |  |     const int lowres= s->avctx->lowres; | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     s->resync_mb_x= | 
					
						
							|  |  |  |     s->resync_mb_y= -1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-04-22 21:41:08 +00:00
										 |  |  |     if (mb_y<<field_pic >= s->mb_height){ | 
					
						
							|  |  |  |         av_log(s->avctx, AV_LOG_ERROR, "slice below image (%d >= %d)\n", mb_y, s->mb_height); | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |     init_get_bits(&s->gb, *buf, buf_size*8); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     ff_mpeg1_clean_buffers(s); | 
					
						
							|  |  |  |     s->interlaced_dct = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-11 19:04:08 +00:00
										 |  |  |     s->qscale = get_qscale(s); | 
					
						
							| 
									
										
										
										
											2003-12-14 16:15:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |     if(s->qscale == 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |         av_log(s->avctx, AV_LOG_ERROR, "qscale == 0\n"); | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     /* extra slice info */ | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     while (get_bits1(&s->gb) != 0) { | 
					
						
							|  |  |  |         skip_bits(&s->gb, 8); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |     s->mb_x=0; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |     for(;;) { | 
					
						
							|  |  |  |         int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         if (code < 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |             av_log(s->avctx, AV_LOG_ERROR, "first mb_incr damaged\n"); | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |             return -1; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |         if (code >= 33) { | 
					
						
							|  |  |  |             if (code == 33) { | 
					
						
							|  |  |  |                 s->mb_x += 33; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             /* otherwise, stuffing, nothing to do */ | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             s->mb_x += code; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-02-09 02:21:34 +00:00
										 |  |  |     if(s->mb_x >= (unsigned)s->mb_width){ | 
					
						
							|  |  |  |         av_log(s->avctx, AV_LOG_ERROR, "initial skip overflow\n"); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |     s->resync_mb_x= s->mb_x; | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     s->resync_mb_y= s->mb_y= mb_y; | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |     s->mb_skip_run= 0; | 
					
						
							| 
									
										
										
										
											2003-07-29 02:09:12 +00:00
										 |  |  |     ff_init_block_index(s); | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     if (s->mb_y==0 && s->mb_x==0 && (s->first_field || s->picture_structure==PICT_FRAME)) { | 
					
						
							|  |  |  |         if(s->avctx->debug&FF_DEBUG_PICT_INFO){ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |              av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%2d%2d%2d%2d %s %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n", | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |                  s->qscale, s->mpeg_f_code[0][0],s->mpeg_f_code[0][1],s->mpeg_f_code[1][0],s->mpeg_f_code[1][1], | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                  s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")), | 
					
						
							|  |  |  |                  s->progressive_sequence ? "ps" :"", s->progressive_frame ? "pf" : "", s->alternate_scan ? "alt" :"", s->top_field_first ? "top" :"", | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |                  s->intra_dc_precision, s->picture_structure, s->frame_pred_frame_dct, s->concealment_motion_vectors, | 
					
						
							|  |  |  |                  s->q_scale_type, s->intra_vlc_format, s->repeat_first_field, s->chroma_420_type ? "420" :""); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     for(;;) { | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  | #ifdef HAVE_XVMC
 | 
					
						
							|  |  |  |         //one 1 we memcpy blocks in xvmcvideo
 | 
					
						
							|  |  |  |         if(s->avctx->xvmc_acceleration > 1) | 
					
						
							|  |  |  |             XVMC_init_block(s);//set s->block
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-30 23:24:58 +00:00
										 |  |  |         ret = mpeg_decode_mb(s, s->block); | 
					
						
							| 
									
										
										
										
											2003-12-01 15:23:14 +00:00
										 |  |  |         s->chroma_qscale= s->qscale; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |         dprintf(s->avctx, "ret=%d\n", ret); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         if (ret < 0) | 
					
						
							|  |  |  |             return -1; | 
					
						
							| 
									
										
										
										
											2003-12-09 01:49:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-14 20:48:12 +00:00
										 |  |  |         if(s->current_picture.motion_val[0] && !s->encoding){ //note motion_val is normally NULL unless we want to extract the MVs
 | 
					
						
							| 
									
										
										
										
											2004-04-16 01:01:45 +00:00
										 |  |  |             const int wrap = field_pic ? 2*s->b8_stride : s->b8_stride; | 
					
						
							|  |  |  |             int xy = s->mb_x*2 + s->mb_y*2*wrap; | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |             int motion_x, motion_y, dir, i; | 
					
						
							| 
									
										
										
										
											2003-12-14 20:48:12 +00:00
										 |  |  |             if(field_pic && !s->first_field) | 
					
						
							|  |  |  |                 xy += wrap/2; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-02 17:21:55 +00:00
										 |  |  |             for(i=0; i<2; i++){ | 
					
						
							|  |  |  |                 for(dir=0; dir<2; dir++){ | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |                     if (s->mb_intra || (dir==1 && s->pict_type != B_TYPE)) { | 
					
						
							|  |  |  |                         motion_x = motion_y = 0; | 
					
						
							| 
									
										
										
										
											2004-04-18 17:46:52 +00:00
										 |  |  |                     }else if (s->mv_type == MV_TYPE_16X16 || (s->mv_type == MV_TYPE_FIELD && field_pic)){ | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |                         motion_x = s->mv[dir][0][0]; | 
					
						
							|  |  |  |                         motion_y = s->mv[dir][0][1]; | 
					
						
							|  |  |  |                     } else /*if ((s->mv_type == MV_TYPE_FIELD) || (s->mv_type == MV_TYPE_16X8))*/ { | 
					
						
							|  |  |  |                         motion_x = s->mv[dir][i][0]; | 
					
						
							|  |  |  |                         motion_y = s->mv[dir][i][1]; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2004-04-19 03:33:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |                     s->current_picture.motion_val[dir][xy    ][0] = motion_x; | 
					
						
							|  |  |  |                     s->current_picture.motion_val[dir][xy    ][1] = motion_y; | 
					
						
							|  |  |  |                     s->current_picture.motion_val[dir][xy + 1][0] = motion_x; | 
					
						
							|  |  |  |                     s->current_picture.motion_val[dir][xy + 1][1] = motion_y; | 
					
						
							| 
									
										
										
										
											2004-04-19 03:33:23 +00:00
										 |  |  |                     s->current_picture.ref_index [dir][xy    ]= | 
					
						
							|  |  |  |                     s->current_picture.ref_index [dir][xy + 1]= s->field_select[dir][i]; | 
					
						
							| 
									
										
										
										
											2005-05-12 10:15:19 +00:00
										 |  |  |                     assert(s->field_select[dir][i]==0 || s->field_select[dir][i]==1); | 
					
						
							| 
									
										
										
										
											2004-02-28 21:02:49 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2004-03-02 17:21:55 +00:00
										 |  |  |                 xy += wrap; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-12-09 01:49:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-25 23:18:58 +00:00
										 |  |  |         s->dest[0] += 16 >> lowres; | 
					
						
							|  |  |  |         s->dest[1] += 16 >> (s->chroma_x_shift + lowres); | 
					
						
							|  |  |  |         s->dest[2] += 16 >> (s->chroma_x_shift + lowres); | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-29 02:09:12 +00:00
										 |  |  |         MPV_decode_mb(s, s->block); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |         if (++s->mb_x >= s->mb_width) { | 
					
						
							| 
									
										
										
										
											2004-09-26 13:03:43 +00:00
										 |  |  |             const int mb_size= 16>>s->avctx->lowres; | 
					
						
							| 
									
										
										
										
											2003-07-26 00:49:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-26 13:03:43 +00:00
										 |  |  |             ff_draw_horiz_band(s, mb_size*s->mb_y, mb_size); | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             s->mb_x = 0; | 
					
						
							|  |  |  |             s->mb_y++; | 
					
						
							| 
									
										
										
										
											2003-05-30 00:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if(s->mb_y<<field_pic >= s->mb_height){ | 
					
						
							|  |  |  |                 int left= s->gb.size_in_bits - get_bits_count(&s->gb); | 
					
						
							| 
									
										
										
										
											2006-05-02 09:03:22 +00:00
										 |  |  |                 int is_d10= s->chroma_format==2 && s->pict_type==I_TYPE && avctx->profile==0 && avctx->level==5 | 
					
						
							|  |  |  |                             && s->intra_dc_precision == 2 && s->q_scale_type == 1 && s->alternate_scan == 0 | 
					
						
							|  |  |  |                             && s->progressive_frame == 0 /* vbv_delay == 0xBBB || 0xE10*/; | 
					
						
							| 
									
										
										
										
											2003-05-30 00:02:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-02 09:03:22 +00:00
										 |  |  |                 if(left < 0 || (left && show_bits(&s->gb, FFMIN(left, 23)) && !is_d10) | 
					
						
							| 
									
										
										
										
											2003-05-30 00:02:25 +00:00
										 |  |  |                    || (avctx->error_resilience >= FF_ER_AGGRESSIVE && left>8)){ | 
					
						
							| 
									
										
										
										
											2006-05-02 09:03:22 +00:00
										 |  |  |                     av_log(avctx, AV_LOG_ERROR, "end mismatch left=%d %0X\n", left, show_bits(&s->gb, FFMIN(left, 23))); | 
					
						
							| 
									
										
										
										
											2003-05-30 00:02:25 +00:00
										 |  |  |                     return -1; | 
					
						
							|  |  |  |                 }else | 
					
						
							|  |  |  |                     goto eos; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-29 02:09:12 +00:00
										 |  |  |             ff_init_block_index(s); | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /* skip mb handling */ | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |         if (s->mb_skip_run == -1) { | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |             /* read again increment */ | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |             s->mb_skip_run = 0; | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |             for(;;) { | 
					
						
							|  |  |  |                 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2); | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                 if (code < 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                     av_log(s->avctx, AV_LOG_ERROR, "mb incr damaged\n"); | 
					
						
							| 
									
										
										
										
											2003-04-11 21:15:17 +00:00
										 |  |  |                     return -1; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |                 if (code >= 33) { | 
					
						
							|  |  |  |                     if (code == 33) { | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |                         s->mb_skip_run += 33; | 
					
						
							| 
									
										
										
										
											2003-04-11 21:15:17 +00:00
										 |  |  |                     }else if(code == 35){ | 
					
						
							|  |  |  |                         if(s->mb_skip_run != 0 || show_bits(&s->gb, 15) != 0){ | 
					
						
							| 
									
										
										
										
											2003-11-03 13:26:22 +00:00
										 |  |  |                             av_log(s->avctx, AV_LOG_ERROR, "slice mismatch\n"); | 
					
						
							| 
									
										
										
										
											2003-04-11 21:15:17 +00:00
										 |  |  |                             return -1; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         goto eos; /* end of slice */ | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |                     } | 
					
						
							|  |  |  |                     /* otherwise, stuffing, nothing to do */ | 
					
						
							|  |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2003-03-30 19:26:01 +00:00
										 |  |  |                     s->mb_skip_run += code; | 
					
						
							| 
									
										
										
										
											2002-10-02 16:36:43 +00:00
										 |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  | eos: // end of slice
 | 
					
						
							|  |  |  |     *buf += get_bits_count(&s->gb)/8 - 1; | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | //printf("y %d %d %d %d\n", s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y);
 | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  | static int slice_decode_thread(AVCodecContext *c, void *arg){ | 
					
						
							|  |  |  |     MpegEncContext *s= arg; | 
					
						
							| 
									
										
										
										
											2004-03-05 14:09:12 +00:00
										 |  |  |     const uint8_t *buf= s->gb.buffer; | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     int mb_y= s->start_mb_y; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s->error_count= 3*(s->end_mb_y - s->start_mb_y)*s->mb_width; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(;;){ | 
					
						
							| 
									
										
										
										
											2006-09-27 19:47:39 +00:00
										 |  |  |         uint32_t start_code; | 
					
						
							|  |  |  |         int ret; | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ret= mpeg_decode_slice((Mpeg1Context*)s, mb_y, &buf, s->gb.buffer_end - buf); | 
					
						
							|  |  |  |         emms_c(); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | //av_log(c, AV_LOG_DEBUG, "ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n",
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  | //ret, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, s->start_mb_y, s->end_mb_y, s->error_count);
 | 
					
						
							|  |  |  |         if(ret < 0){ | 
					
						
							|  |  |  |             if(s->resync_mb_x>=0 && s->resync_mb_y>=0) | 
					
						
							|  |  |  |                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |         if(s->mb_y == s->end_mb_y) | 
					
						
							|  |  |  |             return 0; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-04 20:32:02 +00:00
										 |  |  |         start_code= -1; | 
					
						
							|  |  |  |         buf = ff_find_start_code(buf, s->gb.buffer_end, &start_code); | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |         mb_y= start_code - SLICE_MIN_START_CODE; | 
					
						
							|  |  |  |         if(mb_y < 0 || mb_y >= s->end_mb_y) | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     return 0; //not reached
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * handles slice ends. | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |  * @return 1 if it seems to be the last slice of | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | static int slice_end(AVCodecContext *avctx, AVFrame *pict) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s1 = avctx->priv_data; | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-12 18:20:29 +00:00
										 |  |  |     if (!s1->mpeg_enc_ctx_allocated || !s->current_picture_ptr) | 
					
						
							| 
									
										
										
										
											2003-06-16 14:09:18 +00:00
										 |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | #ifdef HAVE_XVMC
 | 
					
						
							|  |  |  |     if(s->avctx->xvmc_acceleration) | 
					
						
							|  |  |  |         XVMC_field_end(s); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     /* end of slice reached */ | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |     if (/*s->mb_y<<field_pic == s->mb_height &&*/ !s->first_field) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         /* end of image */ | 
					
						
							| 
									
										
										
										
											2002-12-04 10:04:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-05 11:16:05 +00:00
										 |  |  |         s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2; | 
					
						
							| 
									
										
										
										
											2003-04-18 12:45:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-10 13:18:38 +00:00
										 |  |  |         ff_er_frame_end(s); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         MPV_frame_end(s); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-09 00:29:17 +00:00
										 |  |  |         if (s->pict_type == B_TYPE || s->low_delay) { | 
					
						
							| 
									
										
										
										
											2003-06-27 12:58:40 +00:00
										 |  |  |             *pict= *(AVFrame*)s->current_picture_ptr; | 
					
						
							| 
									
										
										
										
											2003-12-30 02:12:12 +00:00
										 |  |  |             ff_print_debug_info(s, pict); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2002-12-04 10:04:03 +00:00
										 |  |  |             s->picture_number++; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             /* latency of 1 frame for I and P frames */ | 
					
						
							|  |  |  |             /* XXX: use another variable than picture_number */ | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |             if (s->last_picture_ptr != NULL) { | 
					
						
							| 
									
										
										
										
											2003-06-27 12:58:40 +00:00
										 |  |  |                 *pict= *(AVFrame*)s->last_picture_ptr; | 
					
						
							| 
									
										
										
										
											2003-12-30 02:12:12 +00:00
										 |  |  |                  ff_print_debug_info(s, pict); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-07-26 00:49:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |         return 1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static int mpeg1_decode_sequence(AVCodecContext *avctx, | 
					
						
							| 
									
										
										
										
											2004-03-05 14:21:56 +00:00
										 |  |  |                                  const uint8_t *buf, int buf_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s1 = avctx->priv_data; | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |     int width,height; | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |     int i, v, j; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:24:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-01-21 17:34:12 +00:00
										 |  |  |     init_get_bits(&s->gb, buf, buf_size*8); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |     width = get_bits(&s->gb, 12); | 
					
						
							|  |  |  |     height = get_bits(&s->gb, 12); | 
					
						
							|  |  |  |     if (width <= 0 || height <= 0 || | 
					
						
							|  |  |  |         (width % 2) != 0 || (height % 2) != 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2002-12-06 16:04:30 +00:00
										 |  |  |     s->aspect_ratio_info= get_bits(&s->gb, 4); | 
					
						
							| 
									
										
										
										
											2003-12-10 11:18:36 +00:00
										 |  |  |     if (s->aspect_ratio_info == 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     s->frame_rate_index = get_bits(&s->gb, 4); | 
					
						
							| 
									
										
										
										
											2004-02-26 18:29:39 +00:00
										 |  |  |     if (s->frame_rate_index == 0 || s->frame_rate_index > 13) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return -1; | 
					
						
							|  |  |  |     s->bit_rate = get_bits(&s->gb, 18) * 400; | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     if (get_bits1(&s->gb) == 0) /* marker */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |     s->width = width; | 
					
						
							|  |  |  |     s->height = height; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-01 02:56:35 +00:00
										 |  |  |     s->avctx->rc_buffer_size= get_bits(&s->gb, 10) * 1024*16; | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     skip_bits(&s->gb, 1); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* get matrix */ | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     if (get_bits1(&s->gb)) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         for(i=0;i<64;i++) { | 
					
						
							|  |  |  |             v = get_bits(&s->gb, 8); | 
					
						
							| 
									
										
										
										
											2004-02-16 03:34:11 +00:00
										 |  |  |             if(v==0){ | 
					
						
							|  |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "intra matrix damaged\n"); | 
					
						
							|  |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |             j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | 
					
						
							| 
									
										
										
										
											2001-08-07 22:47:08 +00:00
										 |  |  |             s->intra_matrix[j] = v; | 
					
						
							|  |  |  |             s->chroma_intra_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  | #ifdef DEBUG
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |         dprintf(s->avctx, "intra matrix present\n"); | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  |         for(i=0;i<64;i++) | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |             dprintf(s->avctx, " %d", s->intra_matrix[s->dsp.idct_permutation[i]]); | 
					
						
							|  |  |  |         dprintf(s->avctx, "\n"); | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         for(i=0;i<64;i++) { | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |             j = s->dsp.idct_permutation[i]; | 
					
						
							| 
									
										
										
										
											2002-07-10 21:01:45 +00:00
										 |  |  |             v = ff_mpeg1_default_intra_matrix[i]; | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  |             s->intra_matrix[j] = v; | 
					
						
							|  |  |  |             s->chroma_intra_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-08-04 00:46:50 +00:00
										 |  |  |     if (get_bits1(&s->gb)) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         for(i=0;i<64;i++) { | 
					
						
							|  |  |  |             v = get_bits(&s->gb, 8); | 
					
						
							| 
									
										
										
										
											2004-02-16 03:34:11 +00:00
										 |  |  |             if(v==0){ | 
					
						
							|  |  |  |                 av_log(s->avctx, AV_LOG_ERROR, "inter matrix damaged\n"); | 
					
						
							|  |  |  |                 return -1; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |             j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | 
					
						
							| 
									
										
										
										
											2002-04-27 12:30:26 +00:00
										 |  |  |             s->inter_matrix[j] = v; | 
					
						
							|  |  |  |             s->chroma_inter_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  | #ifdef DEBUG
 | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |         dprintf(s->avctx, "non intra matrix present\n"); | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  |         for(i=0;i<64;i++) | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |             dprintf(s->avctx, " %d", s->inter_matrix[s->dsp.idct_permutation[i]]); | 
					
						
							|  |  |  |         dprintf(s->avctx, "\n"); | 
					
						
							| 
									
										
										
										
											2001-08-12 00:52:01 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         for(i=0;i<64;i++) { | 
					
						
							| 
									
										
										
										
											2003-03-03 14:54:00 +00:00
										 |  |  |             int j= s->dsp.idct_permutation[i]; | 
					
						
							| 
									
										
										
										
											2002-07-10 21:01:45 +00:00
										 |  |  |             v = ff_mpeg1_default_non_intra_matrix[i]; | 
					
						
							| 
									
										
										
										
											2002-09-29 22:44:22 +00:00
										 |  |  |             s->inter_matrix[j] = v; | 
					
						
							|  |  |  |             s->chroma_inter_matrix[j] = v; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-16 03:34:11 +00:00
										 |  |  |     if(show_bits(&s->gb, 23) != 0){ | 
					
						
							|  |  |  |         av_log(s->avctx, AV_LOG_ERROR, "sequence header damaged\n"); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* we set mpeg2 parameters so that it emulates mpeg1 */ | 
					
						
							|  |  |  |     s->progressive_sequence = 1; | 
					
						
							|  |  |  |     s->progressive_frame = 1; | 
					
						
							|  |  |  |     s->picture_structure = PICT_FRAME; | 
					
						
							|  |  |  |     s->frame_pred_frame_dct = 1; | 
					
						
							| 
									
										
										
										
											2004-03-02 00:40:18 +00:00
										 |  |  |     s->chroma_format = 1; | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG1VIDEO; | 
					
						
							| 
									
										
										
										
											2002-05-20 16:24:39 +00:00
										 |  |  |     avctx->sub_id = 1; /* indicates mpeg1 */ | 
					
						
							| 
									
										
										
										
											2004-03-15 00:08:24 +00:00
										 |  |  |     s->out_format = FMT_MPEG1; | 
					
						
							|  |  |  |     s->swap_uv = 0;//AFAIK VCR2 don't have SEQ_HEADER
 | 
					
						
							| 
									
										
										
										
											2003-12-09 14:51:49 +00:00
										 |  |  |     if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-01 02:56:35 +00:00
										 |  |  |     if(s->avctx->debug & FF_DEBUG_PICT_INFO) | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |         av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%d\n", | 
					
						
							| 
									
										
										
										
											2004-01-01 02:56:35 +00:00
										 |  |  |                s->avctx->rc_buffer_size, s->bit_rate); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  | static int vcr2_init_sequence(AVCodecContext *avctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s1 = avctx->priv_data; | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2003-07-24 23:44:45 +00:00
										 |  |  |     int i, v; | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* start new mpeg1 context decoding */ | 
					
						
							|  |  |  |     s->out_format = FMT_MPEG1; | 
					
						
							|  |  |  |     if (s1->mpeg_enc_ctx_allocated) { | 
					
						
							|  |  |  |         MPV_common_end(s); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-09-27 11:50:56 +00:00
										 |  |  |     s->width  = avctx->coded_width; | 
					
						
							|  |  |  |     s->height = avctx->coded_height; | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  |     avctx->has_b_frames= 0; //true?
 | 
					
						
							| 
									
										
										
										
											2003-07-26 00:49:46 +00:00
										 |  |  |     s->low_delay= 1; | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-19 00:30:33 +00:00
										 |  |  |     if(avctx->xvmc_acceleration){ | 
					
						
							|  |  |  |         avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420); | 
					
						
							|  |  |  |     }else{ | 
					
						
							|  |  |  |         avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  |     if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT ) | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  |         if( avctx->idct_algo == FF_IDCT_AUTO ) | 
					
						
							|  |  |  |             avctx->idct_algo = FF_IDCT_SIMPLE; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  |     if (MPV_common_init(s) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  |     exchange_uv(s);//common init reset pblocks, so we swap them here
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     s->swap_uv = 1;// in case of xvmc we need to swap uv for each MB
 | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  |     s1->mpeg_enc_ctx_allocated = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(i=0;i<64;i++) { | 
					
						
							|  |  |  |         int j= s->dsp.idct_permutation[i]; | 
					
						
							|  |  |  |         v = ff_mpeg1_default_intra_matrix[i]; | 
					
						
							|  |  |  |         s->intra_matrix[j] = v; | 
					
						
							|  |  |  |         s->chroma_intra_matrix[j] = v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         v = ff_mpeg1_default_non_intra_matrix[i]; | 
					
						
							|  |  |  |         s->inter_matrix[j] = v; | 
					
						
							|  |  |  |         s->chroma_inter_matrix[j] = v; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s->progressive_sequence = 1; | 
					
						
							|  |  |  |     s->progressive_frame = 1; | 
					
						
							|  |  |  |     s->picture_structure = PICT_FRAME; | 
					
						
							|  |  |  |     s->frame_pred_frame_dct = 1; | 
					
						
							| 
									
										
										
										
											2004-03-02 00:40:18 +00:00
										 |  |  |     s->chroma_format = 1; | 
					
						
							| 
									
										
										
										
											2003-08-25 22:47:32 +00:00
										 |  |  |     s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; | 
					
						
							| 
									
										
										
										
											2003-07-24 23:44:45 +00:00
										 |  |  |     avctx->sub_id = 2; /* indicates mpeg2 */ | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static void mpeg_decode_user_data(AVCodecContext *avctx, | 
					
						
							| 
									
										
										
										
											2003-02-25 09:56:56 +00:00
										 |  |  |                                   const uint8_t *buf, int buf_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const uint8_t *p; | 
					
						
							|  |  |  |     int len, flags; | 
					
						
							|  |  |  |     p = buf; | 
					
						
							|  |  |  |     len = buf_size; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* we parse the DTG active format information */ | 
					
						
							|  |  |  |     if (len >= 5 && | 
					
						
							|  |  |  |         p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') { | 
					
						
							|  |  |  |         flags = p[4]; | 
					
						
							|  |  |  |         p += 5; | 
					
						
							|  |  |  |         len -= 5; | 
					
						
							|  |  |  |         if (flags & 0x80) { | 
					
						
							|  |  |  |             /* skip event id */ | 
					
						
							|  |  |  |             if (len < 2) | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             p += 2; | 
					
						
							|  |  |  |             len -= 2; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (flags & 0x40) { | 
					
						
							|  |  |  |             if (len < 1) | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             avctx->dtg_active_format = p[0] & 0x0f; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static void mpeg_decode_gop(AVCodecContext *avctx, | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |                             const uint8_t *buf, int buf_size){ | 
					
						
							|  |  |  |     Mpeg1Context *s1 = avctx->priv_data; | 
					
						
							|  |  |  |     MpegEncContext *s = &s1->mpeg_enc_ctx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int drop_frame_flag; | 
					
						
							|  |  |  |     int time_code_hours, time_code_minutes; | 
					
						
							|  |  |  |     int time_code_seconds, time_code_pictures; | 
					
						
							|  |  |  |     int broken_link; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     init_get_bits(&s->gb, buf, buf_size*8); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     drop_frame_flag = get_bits1(&s->gb); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  |     time_code_hours=get_bits(&s->gb,5); | 
					
						
							|  |  |  |     time_code_minutes = get_bits(&s->gb,6); | 
					
						
							|  |  |  |     skip_bits1(&s->gb);//marker bit
 | 
					
						
							|  |  |  |     time_code_seconds = get_bits(&s->gb,6); | 
					
						
							|  |  |  |     time_code_pictures = get_bits(&s->gb,6); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*broken_link indicate that after editing the
 | 
					
						
							|  |  |  |       reference frames of the first B-Frames after GOP I-Frame | 
					
						
							|  |  |  |       are missing (open gop)*/ | 
					
						
							|  |  |  |     broken_link = get_bits1(&s->gb); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(s->avctx->debug & FF_DEBUG_PICT_INFO) | 
					
						
							|  |  |  |         av_log(s->avctx, AV_LOG_DEBUG, "GOP (%2d:%02d:%02d.[%02d]) broken_link=%d\n", | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |             time_code_hours, time_code_minutes, time_code_seconds, | 
					
						
							|  |  |  |             time_code_pictures, broken_link); | 
					
						
							| 
									
										
										
										
											2004-03-15 16:41:15 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * finds the end of the current frame in the bitstream. | 
					
						
							|  |  |  |  * @return the position of the first byte of the next frame, or -1 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2006-11-06 10:46:54 +00:00
										 |  |  | static int mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) | 
					
						
							| 
									
										
										
										
											2004-04-29 14:21:33 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2006-02-04 20:32:02 +00:00
										 |  |  |     uint32_t state= pc->state; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |     i=0; | 
					
						
							|  |  |  |     if(!pc->frame_start_found){ | 
					
						
							|  |  |  |         for(i=0; i<buf_size; i++){ | 
					
						
							| 
									
										
										
										
											2006-02-04 20:32:02 +00:00
										 |  |  |             i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |             if(state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE){ | 
					
						
							|  |  |  |                 i++; | 
					
						
							|  |  |  |                 pc->frame_start_found=1; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |     if(pc->frame_start_found){ | 
					
						
							| 
									
										
										
										
											2004-04-29 14:21:33 +00:00
										 |  |  |         /* EOF considered as end of frame */ | 
					
						
							|  |  |  |         if (buf_size == 0) | 
					
						
							|  |  |  |             return 0; | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |         for(; i<buf_size; i++){ | 
					
						
							| 
									
										
										
										
											2006-02-04 20:32:02 +00:00
										 |  |  |             i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |             if((state&0xFFFFFF00) == 0x100){ | 
					
						
							|  |  |  |                 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){ | 
					
						
							|  |  |  |                     pc->frame_start_found=0; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |                     pc->state=-1; | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |                     return i-3; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |     pc->state= state; | 
					
						
							| 
									
										
										
										
											2003-04-27 01:11:26 +00:00
										 |  |  |     return END_NOT_FOUND; | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /* handle buffering and image synchronisation */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | static int mpeg_decode_frame(AVCodecContext *avctx, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                              void *data, int *data_size, | 
					
						
							| 
									
										
										
										
											2003-02-11 16:35:48 +00:00
										 |  |  |                              uint8_t *buf, int buf_size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s = avctx->priv_data; | 
					
						
							| 
									
										
										
										
											2004-03-05 14:21:56 +00:00
										 |  |  |     const uint8_t *buf_end; | 
					
						
							|  |  |  |     const uint8_t *buf_ptr; | 
					
						
							| 
									
										
										
										
											2006-09-27 19:47:39 +00:00
										 |  |  |     uint32_t start_code; | 
					
						
							|  |  |  |     int ret, input_size; | 
					
						
							| 
									
										
										
										
											2002-12-09 12:03:43 +00:00
										 |  |  |     AVFrame *picture = data; | 
					
						
							| 
									
										
										
										
											2002-03-16 02:41:00 +00:00
										 |  |  |     MpegEncContext *s2 = &s->mpeg_enc_ctx; | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |     dprintf(avctx, "fill_buffer\n"); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-16 18:36:39 +00:00
										 |  |  |     if (buf_size == 0) { | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |         /* special case for last picture */ | 
					
						
							|  |  |  |         if (s2->low_delay==0 && s2->next_picture_ptr) { | 
					
						
							|  |  |  |             *picture= *(AVFrame*)s2->next_picture_ptr; | 
					
						
							|  |  |  |             s2->next_picture_ptr= NULL; | 
					
						
							| 
									
										
										
										
											2002-12-04 10:04:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-22 01:10:11 +00:00
										 |  |  |             *data_size = sizeof(AVFrame); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |     if(s2->flags&CODEC_FLAG_TRUNCATED){ | 
					
						
							| 
									
										
										
										
											2006-11-06 10:46:54 +00:00
										 |  |  |         int next= mpeg1_find_frame_end(&s2->parse_context, buf, buf_size); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-04-29 14:21:33 +00:00
										 |  |  |         if( ff_combine_frame(&s2->parse_context, next, &buf, &buf_size) < 0 ) | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |             return buf_size; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     buf_ptr = buf; | 
					
						
							|  |  |  |     buf_end = buf + buf_size; | 
					
						
							| 
									
										
										
										
											2002-05-14 19:56:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | #if 0
 | 
					
						
							|  |  |  |     if (s->repeat_field % 2 == 1) { | 
					
						
							| 
									
										
										
										
											2002-03-16 02:41:00 +00:00
										 |  |  |         s->repeat_field++; | 
					
						
							|  |  |  |         //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number,
 | 
					
						
							| 
									
										
										
										
											2002-05-14 19:56:42 +00:00
										 |  |  |         //        s2->picture_number, s->repeat_field);
 | 
					
						
							|  |  |  |         if (avctx->flags & CODEC_FLAG_REPEAT_FIELD) { | 
					
						
							|  |  |  |             *data_size = sizeof(AVPicture); | 
					
						
							|  |  |  |             goto the_end; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2002-03-16 02:41:00 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2002-05-14 19:56:42 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-07-24 23:32:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if(s->mpeg_enc_ctx_allocated==0 && avctx->codec_tag == ff_get_fourcc("VCR2")) | 
					
						
							|  |  |  |         vcr2_init_sequence(avctx); | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |     s->slice_count= 0; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  |     for(;;) { | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         /* find start next code */ | 
					
						
							| 
									
										
										
										
											2006-02-04 20:32:02 +00:00
										 |  |  |         start_code = -1; | 
					
						
							|  |  |  |         buf_ptr = ff_find_start_code(buf_ptr,buf_end, &start_code); | 
					
						
							| 
									
										
										
										
											2006-09-27 19:47:39 +00:00
										 |  |  |         if (start_code > 0x1ff){ | 
					
						
							| 
									
										
										
										
											2005-07-14 21:39:36 +00:00
										 |  |  |             if(s2->pict_type != B_TYPE || avctx->skip_frame <= AVDISCARD_DEFAULT){ | 
					
						
							| 
									
										
										
										
											2004-02-23 20:56:56 +00:00
										 |  |  |                 if(avctx->thread_count > 1){ | 
					
						
							|  |  |  |                     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     avctx->execute(avctx, slice_decode_thread,  (void**)&(s2->thread_context[0]), NULL, s->slice_count); | 
					
						
							|  |  |  |                     for(i=0; i<s->slice_count; i++) | 
					
						
							|  |  |  |                         s2->error_count += s2->thread_context[i]->error_count; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2003-09-27 00:02:29 +00:00
										 |  |  |                 if (slice_end(avctx, picture)) { | 
					
						
							| 
									
										
										
										
											2003-12-09 14:51:49 +00:00
										 |  |  |                     if(s2->last_picture_ptr || s2->low_delay) //FIXME merge with the stuff in mpeg_decode_slice
 | 
					
						
							| 
									
										
										
										
											2003-09-27 00:02:29 +00:00
										 |  |  |                         *data_size = sizeof(AVPicture); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2003-05-27 12:31:03 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2003-04-27 13:44:01 +00:00
										 |  |  |             return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-30 00:02:25 +00:00
										 |  |  |         input_size = buf_end - buf_ptr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if(avctx->debug & FF_DEBUG_STARTCODE){ | 
					
						
							| 
									
										
										
										
											2004-03-24 23:32:48 +00:00
										 |  |  |             av_log(avctx, AV_LOG_DEBUG, "%3X at %zd left %d\n", start_code, buf_ptr-buf, input_size); | 
					
						
							| 
									
										
										
										
											2003-05-30 00:02:25 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2003-04-22 13:55:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |         /* prepare data for next start code */ | 
					
						
							|  |  |  |         switch(start_code) { | 
					
						
							|  |  |  |         case SEQ_START_CODE: | 
					
						
							|  |  |  |             mpeg1_decode_sequence(avctx, buf_ptr, | 
					
						
							|  |  |  |                                     input_size); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |         case PICTURE_START_CODE: | 
					
						
							|  |  |  |             /* we have a complete image : we try to decompress it */ | 
					
						
							|  |  |  |             mpeg1_decode_picture(avctx, | 
					
						
							|  |  |  |                                     buf_ptr, input_size); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case EXT_START_CODE: | 
					
						
							|  |  |  |             mpeg_decode_extension(avctx, | 
					
						
							|  |  |  |                                     buf_ptr, input_size); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case USER_START_CODE: | 
					
						
							|  |  |  |             mpeg_decode_user_data(avctx, | 
					
						
							|  |  |  |                                     buf_ptr, input_size); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case GOP_START_CODE: | 
					
						
							|  |  |  |             s2->first_field=0; | 
					
						
							|  |  |  |             mpeg_decode_gop(avctx, | 
					
						
							|  |  |  |                                     buf_ptr, input_size); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             if (start_code >= SLICE_MIN_START_CODE && | 
					
						
							|  |  |  |                 start_code <= SLICE_MAX_START_CODE) { | 
					
						
							|  |  |  |                 int mb_y= start_code - SLICE_MIN_START_CODE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if(s2->last_picture_ptr==NULL){ | 
					
						
							|  |  |  |                 /* skip b frames if we dont have reference frames */ | 
					
						
							|  |  |  |                     if(s2->pict_type==B_TYPE) break; | 
					
						
							|  |  |  |                 /* skip P frames if we dont have reference frame no valid header */ | 
					
						
							|  |  |  | //                    if(s2->pict_type==P_TYPE && s2->first_field && !s2->first_slice) break;
 | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 /* skip b frames if we are in a hurry */ | 
					
						
							|  |  |  |                 if(avctx->hurry_up && s2->pict_type==B_TYPE) break; | 
					
						
							|  |  |  |                 if(  (avctx->skip_frame >= AVDISCARD_NONREF && s2->pict_type==B_TYPE) | 
					
						
							|  |  |  |                     ||(avctx->skip_frame >= AVDISCARD_NONKEY && s2->pict_type!=I_TYPE) | 
					
						
							|  |  |  |                     || avctx->skip_frame >= AVDISCARD_ALL) | 
					
						
							| 
									
										
										
										
											2003-07-07 11:25:31 +00:00
										 |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |                 /* skip everything if we are in a hurry>=5 */ | 
					
						
							|  |  |  |                 if(avctx->hurry_up>=5) break; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |                 if (!s->mpeg_enc_ctx_allocated) break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if(s2->codec_id == CODEC_ID_MPEG2VIDEO){ | 
					
						
							|  |  |  |                     if(mb_y < avctx->skip_top || mb_y >= s2->mb_height - avctx->skip_bottom) | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |                 if(s2->first_slice){ | 
					
						
							|  |  |  |                     s2->first_slice=0; | 
					
						
							|  |  |  |                             if(mpeg_field_start(s2) < 0) | 
					
						
							|  |  |  |                         return -1; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2007-01-15 23:26:09 +00:00
										 |  |  |                 if(!s2->current_picture_ptr){ | 
					
						
							|  |  |  |                     av_log(avctx, AV_LOG_ERROR, "current_picture not initalized\n"); | 
					
						
							|  |  |  |                     return -1; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |                 if(avctx->thread_count > 1){ | 
					
						
							|  |  |  |                     int threshold= (s2->mb_height*s->slice_count + avctx->thread_count/2) / avctx->thread_count; | 
					
						
							|  |  |  |                     if(threshold <= mb_y){ | 
					
						
							|  |  |  |                         MpegEncContext *thread_context= s2->thread_context[s->slice_count]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         thread_context->start_mb_y= mb_y; | 
					
						
							|  |  |  |                         thread_context->end_mb_y  = s2->mb_height; | 
					
						
							|  |  |  |                         if(s->slice_count){ | 
					
						
							|  |  |  |                             s2->thread_context[s->slice_count-1]->end_mb_y= mb_y; | 
					
						
							|  |  |  |                             ff_update_duplicate_context(thread_context, s2); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |                         init_get_bits(&thread_context->gb, buf_ptr, input_size*8); | 
					
						
							|  |  |  |                         s->slice_count++; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     buf_ptr += 2; //FIXME add minimum num of bytes per slice
 | 
					
						
							|  |  |  |                 }else{ | 
					
						
							|  |  |  |                     ret = mpeg_decode_slice(s, mb_y, &buf_ptr, input_size); | 
					
						
							|  |  |  |                     emms_c(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if(ret < 0){ | 
					
						
							|  |  |  |                         if(s2->resync_mb_x>=0 && s2->resync_mb_y>=0) | 
					
						
							|  |  |  |                             ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); | 
					
						
							|  |  |  |                     }else{ | 
					
						
							|  |  |  |                         ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x-1, s2->mb_y, AC_END|DC_END|MV_END); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2006-11-01 21:09:14 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int mpeg_decode_end(AVCodecContext *avctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Mpeg1Context *s = avctx->priv_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (s->mpeg_enc_ctx_allocated) | 
					
						
							|  |  |  |         MPV_common_end(&s->mpeg_enc_ctx); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-08-26 07:42:25 +00:00
										 |  |  | AVCodec mpeg1video_decoder = { | 
					
						
							|  |  |  |     "mpeg1video", | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     CODEC_TYPE_VIDEO, | 
					
						
							|  |  |  |     CODEC_ID_MPEG1VIDEO, | 
					
						
							|  |  |  |     sizeof(Mpeg1Context), | 
					
						
							|  |  |  |     mpeg_decode_init, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     mpeg_decode_end, | 
					
						
							|  |  |  |     mpeg_decode_frame, | 
					
						
							| 
									
										
										
										
											2005-01-23 18:09:06 +00:00
										 |  |  |     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | 
					
						
							| 
									
										
										
										
											2003-08-26 07:42:25 +00:00
										 |  |  |     .flush= ff_mpeg_flush, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec mpeg2video_decoder = { | 
					
						
							|  |  |  |     "mpeg2video", | 
					
						
							|  |  |  |     CODEC_TYPE_VIDEO, | 
					
						
							|  |  |  |     CODEC_ID_MPEG2VIDEO, | 
					
						
							|  |  |  |     sizeof(Mpeg1Context), | 
					
						
							|  |  |  |     mpeg_decode_init, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     mpeg_decode_end, | 
					
						
							|  |  |  |     mpeg_decode_frame, | 
					
						
							| 
									
										
										
										
											2005-01-23 18:09:06 +00:00
										 |  |  |     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | 
					
						
							| 
									
										
										
										
											2003-11-12 01:19:36 +00:00
										 |  |  |     .flush= ff_mpeg_flush, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //legacy decoder
 | 
					
						
							|  |  |  | AVCodec mpegvideo_decoder = { | 
					
						
							|  |  |  |     "mpegvideo", | 
					
						
							|  |  |  |     CODEC_TYPE_VIDEO, | 
					
						
							|  |  |  |     CODEC_ID_MPEG2VIDEO, | 
					
						
							|  |  |  |     sizeof(Mpeg1Context), | 
					
						
							|  |  |  |     mpeg_decode_init, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     mpeg_decode_end, | 
					
						
							|  |  |  |     mpeg_decode_frame, | 
					
						
							| 
									
										
										
										
											2005-01-23 18:09:06 +00:00
										 |  |  |     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | 
					
						
							| 
									
										
										
										
											2003-07-17 12:29:07 +00:00
										 |  |  |     .flush= ff_mpeg_flush, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  | #ifdef CONFIG_ENCODERS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec mpeg1video_encoder = { | 
					
						
							|  |  |  |     "mpeg1video", | 
					
						
							|  |  |  |     CODEC_TYPE_VIDEO, | 
					
						
							|  |  |  |     CODEC_ID_MPEG1VIDEO, | 
					
						
							|  |  |  |     sizeof(MpegEncContext), | 
					
						
							|  |  |  |     encode_init, | 
					
						
							|  |  |  |     MPV_encode_picture, | 
					
						
							|  |  |  |     MPV_encode_end, | 
					
						
							| 
									
										
										
										
											2006-07-02 14:50:23 +00:00
										 |  |  |     .supported_framerates= ff_frame_rate_tab+1, | 
					
						
							| 
									
										
										
										
											2005-03-08 20:35:27 +00:00
										 |  |  |     .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1}, | 
					
						
							| 
									
										
										
										
											2004-06-30 23:12:21 +00:00
										 |  |  |     .capabilities= CODEC_CAP_DELAY, | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec mpeg2video_encoder = { | 
					
						
							|  |  |  |     "mpeg2video", | 
					
						
							|  |  |  |     CODEC_TYPE_VIDEO, | 
					
						
							|  |  |  |     CODEC_ID_MPEG2VIDEO, | 
					
						
							|  |  |  |     sizeof(MpegEncContext), | 
					
						
							|  |  |  |     encode_init, | 
					
						
							|  |  |  |     MPV_encode_picture, | 
					
						
							|  |  |  |     MPV_encode_end, | 
					
						
							| 
									
										
										
										
											2006-07-02 14:50:23 +00:00
										 |  |  |     .supported_framerates= ff_frame_rate_tab+1, | 
					
						
							| 
									
										
										
										
											2006-05-16 15:19:54 +00:00
										 |  |  |     .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, -1}, | 
					
						
							| 
									
										
										
										
											2004-06-30 23:12:21 +00:00
										 |  |  |     .capabilities= CODEC_CAP_DELAY, | 
					
						
							| 
									
										
										
										
											2004-01-18 21:41:44 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | #ifdef HAVE_XVMC
 | 
					
						
							|  |  |  | static int mpeg_mc_decode_init(AVCodecContext *avctx){ | 
					
						
							|  |  |  |     Mpeg1Context *s; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  |     if( avctx->thread_count > 1) | 
					
						
							| 
									
										
										
										
											2004-06-12 16:51:15 +00:00
										 |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  |     if( !(avctx->slice_flags & SLICE_FLAG_CODED_ORDER) ) | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  |     if( !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD) ){ | 
					
						
							| 
									
										
										
										
											2007-03-12 12:36:41 +00:00
										 |  |  |         dprintf(avctx, "mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n"); | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  |     mpeg_decode_init(avctx); | 
					
						
							|  |  |  |     s = avctx->priv_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     avctx->pix_fmt = PIX_FMT_XVMC_MPEG2_IDCT; | 
					
						
							| 
									
										
										
										
											2003-10-27 23:22:43 +00:00
										 |  |  |     avctx->xvmc_acceleration = 2;//2 - the blocks are packed!
 | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodec mpeg_xvmc_decoder = { | 
					
						
							|  |  |  |     "mpegvideo_xvmc", | 
					
						
							|  |  |  |     CODEC_TYPE_VIDEO, | 
					
						
							|  |  |  |     CODEC_ID_MPEG2VIDEO_XVMC, | 
					
						
							|  |  |  |     sizeof(Mpeg1Context), | 
					
						
							|  |  |  |     mpeg_mc_decode_init, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     mpeg_decode_end, | 
					
						
							|  |  |  |     mpeg_decode_frame, | 
					
						
							| 
									
										
										
										
											2005-01-23 18:09:06 +00:00
										 |  |  |     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY, | 
					
						
							| 
									
										
										
										
											2004-03-01 14:55:21 +00:00
										 |  |  |     .flush= ff_mpeg_flush, | 
					
						
							| 
									
										
										
										
											2003-07-26 01:28:49 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-06 10:43:49 +00:00
										 |  |  | #ifdef CONFIG_MPEGVIDEO_PARSER
 | 
					
						
							|  |  |  | static void mpegvideo_extract_headers(AVCodecParserContext *s, | 
					
						
							|  |  |  |                                       AVCodecContext *avctx, | 
					
						
							|  |  |  |                                       const uint8_t *buf, int buf_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ParseContext1 *pc = s->priv_data; | 
					
						
							|  |  |  |     const uint8_t *buf_end; | 
					
						
							|  |  |  |     uint32_t start_code; | 
					
						
							|  |  |  |     int frame_rate_index, ext_type, bytes_left; | 
					
						
							|  |  |  |     int frame_rate_ext_n, frame_rate_ext_d; | 
					
						
							|  |  |  |     int picture_structure, top_field_first, repeat_first_field, progressive_frame; | 
					
						
							|  |  |  |     int horiz_size_ext, vert_size_ext, bit_rate_ext; | 
					
						
							|  |  |  | //FIXME replace the crap with get_bits()
 | 
					
						
							|  |  |  |     s->repeat_pict = 0; | 
					
						
							|  |  |  |     buf_end = buf + buf_size; | 
					
						
							|  |  |  |     while (buf < buf_end) { | 
					
						
							|  |  |  |         start_code= -1; | 
					
						
							|  |  |  |         buf= ff_find_start_code(buf, buf_end, &start_code); | 
					
						
							|  |  |  |         bytes_left = buf_end - buf; | 
					
						
							|  |  |  |         switch(start_code) { | 
					
						
							|  |  |  |         case PICTURE_START_CODE: | 
					
						
							|  |  |  |             if (bytes_left >= 2) { | 
					
						
							|  |  |  |                 s->pict_type = (buf[1] >> 3) & 7; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SEQ_START_CODE: | 
					
						
							|  |  |  |             if (bytes_left >= 7) { | 
					
						
							|  |  |  |                 pc->width  = (buf[0] << 4) | (buf[1] >> 4); | 
					
						
							|  |  |  |                 pc->height = ((buf[1] & 0x0f) << 8) | buf[2]; | 
					
						
							|  |  |  |                 avcodec_set_dimensions(avctx, pc->width, pc->height); | 
					
						
							|  |  |  |                 frame_rate_index = buf[3] & 0xf; | 
					
						
							|  |  |  |                 pc->frame_rate.den = avctx->time_base.den = ff_frame_rate_tab[frame_rate_index].num; | 
					
						
							|  |  |  |                 pc->frame_rate.num = avctx->time_base.num = ff_frame_rate_tab[frame_rate_index].den; | 
					
						
							|  |  |  |                 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400; | 
					
						
							|  |  |  |                 avctx->codec_id = CODEC_ID_MPEG1VIDEO; | 
					
						
							|  |  |  |                 avctx->sub_id = 1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case EXT_START_CODE: | 
					
						
							|  |  |  |             if (bytes_left >= 1) { | 
					
						
							|  |  |  |                 ext_type = (buf[0] >> 4); | 
					
						
							|  |  |  |                 switch(ext_type) { | 
					
						
							|  |  |  |                 case 0x1: /* sequence extension */ | 
					
						
							|  |  |  |                     if (bytes_left >= 6) { | 
					
						
							|  |  |  |                         horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7); | 
					
						
							|  |  |  |                         vert_size_ext = (buf[2] >> 5) & 3; | 
					
						
							|  |  |  |                         bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1); | 
					
						
							|  |  |  |                         frame_rate_ext_n = (buf[5] >> 5) & 3; | 
					
						
							|  |  |  |                         frame_rate_ext_d = (buf[5] & 0x1f); | 
					
						
							|  |  |  |                         pc->progressive_sequence = buf[1] & (1 << 3); | 
					
						
							|  |  |  |                         avctx->has_b_frames= !(buf[5] >> 7); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         pc->width  |=(horiz_size_ext << 12); | 
					
						
							|  |  |  |                         pc->height |=( vert_size_ext << 12); | 
					
						
							|  |  |  |                         avctx->bit_rate += (bit_rate_ext << 18) * 400; | 
					
						
							|  |  |  |                         avcodec_set_dimensions(avctx, pc->width, pc->height); | 
					
						
							|  |  |  |                         avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1); | 
					
						
							|  |  |  |                         avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1); | 
					
						
							|  |  |  |                         avctx->codec_id = CODEC_ID_MPEG2VIDEO; | 
					
						
							|  |  |  |                         avctx->sub_id = 2; /* forces MPEG2 */ | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case 0x8: /* picture coding extension */ | 
					
						
							|  |  |  |                     if (bytes_left >= 5) { | 
					
						
							|  |  |  |                         picture_structure = buf[2]&3; | 
					
						
							|  |  |  |                         top_field_first = buf[3] & (1 << 7); | 
					
						
							|  |  |  |                         repeat_first_field = buf[3] & (1 << 1); | 
					
						
							|  |  |  |                         progressive_frame = buf[4] & (1 << 7); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         /* check if we must repeat the frame */ | 
					
						
							|  |  |  |                         if (repeat_first_field) { | 
					
						
							|  |  |  |                             if (pc->progressive_sequence) { | 
					
						
							|  |  |  |                                 if (top_field_first) | 
					
						
							|  |  |  |                                     s->repeat_pict = 4; | 
					
						
							|  |  |  |                                 else | 
					
						
							|  |  |  |                                     s->repeat_pict = 2; | 
					
						
							|  |  |  |                             } else if (progressive_frame) { | 
					
						
							|  |  |  |                                 s->repeat_pict = 1; | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         /* the packet only represents half a frame
 | 
					
						
							|  |  |  |                            XXX,FIXME maybe find a different solution */ | 
					
						
							|  |  |  |                         if(picture_structure != 3) | 
					
						
							|  |  |  |                             s->repeat_pict = -1; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case -1: | 
					
						
							|  |  |  |             goto the_end; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             /* we stop parsing when we encounter a slice. It ensures
 | 
					
						
							|  |  |  |                that this function takes a negligible amount of time */ | 
					
						
							|  |  |  |             if (start_code >= SLICE_MIN_START_CODE && | 
					
						
							|  |  |  |                 start_code <= SLICE_MAX_START_CODE) | 
					
						
							|  |  |  |                 goto the_end; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |  the_end: ; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int mpegvideo_parse(AVCodecParserContext *s, | 
					
						
							|  |  |  |                            AVCodecContext *avctx, | 
					
						
							|  |  |  |                            uint8_t **poutbuf, int *poutbuf_size, | 
					
						
							|  |  |  |                            const uint8_t *buf, int buf_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ParseContext1 *pc1 = s->priv_data; | 
					
						
							|  |  |  |     ParseContext *pc= &pc1->pc; | 
					
						
							|  |  |  |     int next; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ | 
					
						
							|  |  |  |         next= buf_size; | 
					
						
							|  |  |  |     }else{ | 
					
						
							| 
									
										
										
										
											2006-11-06 10:46:54 +00:00
										 |  |  |         next= mpeg1_find_frame_end(pc, buf, buf_size); | 
					
						
							| 
									
										
										
										
											2006-11-06 10:43:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) { | 
					
						
							|  |  |  |             *poutbuf = NULL; | 
					
						
							|  |  |  |             *poutbuf_size = 0; | 
					
						
							|  |  |  |             return buf_size; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* we have a full frame : we just parse the first few MPEG headers
 | 
					
						
							|  |  |  |        to have the full timing information. The time take by this | 
					
						
							|  |  |  |        function should be negligible for uncorrupted streams */ | 
					
						
							|  |  |  |     mpegvideo_extract_headers(s, avctx, buf, buf_size); | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  |     printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n", | 
					
						
							|  |  |  |            s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *poutbuf = (uint8_t *)buf; | 
					
						
							|  |  |  |     *poutbuf_size = buf_size; | 
					
						
							|  |  |  |     return next; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int mpegvideo_split(AVCodecContext *avctx, | 
					
						
							|  |  |  |                            const uint8_t *buf, int buf_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     uint32_t state= -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for(i=0; i<buf_size; i++){ | 
					
						
							|  |  |  |         state= (state<<8) | buf[i]; | 
					
						
							|  |  |  |         if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100) | 
					
						
							|  |  |  |             return i-3; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVCodecParser mpegvideo_parser = { | 
					
						
							|  |  |  |     { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO }, | 
					
						
							|  |  |  |     sizeof(ParseContext1), | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     mpegvideo_parse, | 
					
						
							|  |  |  |     ff_parse1_close, | 
					
						
							|  |  |  |     mpegvideo_split, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #endif /* !CONFIG_MPEGVIDEO_PARSER */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-04 02:59:11 +00:00
										 |  |  | static int imx_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, | 
					
						
							|  |  |  |                            uint8_t **poutbuf, int *poutbuf_size, | 
					
						
							|  |  |  |                            const uint8_t *buf, int buf_size, int keyframe) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /* MXF essence element key */ | 
					
						
							|  |  |  |     static const uint8_t imx_header[16] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x05,0x01,0x01,0x00 }; | 
					
						
							|  |  |  |     uint8_t *poutbufp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (avctx->codec_id != CODEC_ID_MPEG2VIDEO) { | 
					
						
							|  |  |  |         av_log(avctx, AV_LOG_ERROR, "imx bitstream filter only applies to mpeg2video codec\n"); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *poutbuf = av_malloc(buf_size + 20 + FF_INPUT_BUFFER_PADDING_SIZE); | 
					
						
							|  |  |  |     poutbufp = *poutbuf; | 
					
						
							|  |  |  |     bytestream_put_buffer(&poutbufp, imx_header, 16); | 
					
						
							|  |  |  |     bytestream_put_byte(&poutbufp, 0x83); /* KLV BER long form */ | 
					
						
							|  |  |  |     bytestream_put_be24(&poutbufp, buf_size); | 
					
						
							|  |  |  |     bytestream_put_buffer(&poutbufp, buf, buf_size); | 
					
						
							|  |  |  |     *poutbuf_size = poutbufp - *poutbuf; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AVBitStreamFilter imx_dump_header_bsf = { | 
					
						
							|  |  |  |     "imxdump", | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     imx_dump_header, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | /* this is ugly i know, but the alternative is too make
 | 
					
						
							| 
									
										
										
										
											2003-08-22 14:59:04 +00:00
										 |  |  |    hundreds of vars global and prefix them with ff_mpeg1_ | 
					
						
							|  |  |  |    which is far uglier. */ | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | #include "mdec.c"
 |