基于Linux的ffmepg decoder

源代码在线查看: mem_transfer.c

软件大小: 5443 K
上传用户: dan_che
关键词: decoder ffmepg Linux
下载地址: 免注册下载 普通下载 VIP

相关代码

				#include "../global.h"				#include "mem_transfer.h"				#include "decoder.h"				#include "define.h"								/* Function pointers - Initialized in the xvid.c module */								TRANSFER_8TO16COPY_PTR transfer_8to16copy;				TRANSFER_16TO8COPY_PTR transfer_16to8copy;								TRANSFER_8TO16SUB_PTR  transfer_8to16sub;				TRANSFER_8TO16SUB2_PTR transfer_8to16sub2;				TRANSFER_16TO8ADD_PTR  transfer_16to8add;								// ben-mark-04'10/21:	TRANSFER8X8_COPY_PTR transfer8x8_copy;												/*****************************************************************************				 *				 * All these functions are used to transfer data from a 8 bit data array				 * to a 16 bit data array.				 *				 * This is typically used during motion compensation, that's why some				 * functions also do the addition/substraction of another buffer during the				 * so called  transfer.				 *				 ****************************************************************************/								/*				 * SRC - the source buffer				 * DST - the destination buffer				 *				 * Then the function does the 8->16 bit transfer and this serie of operations :				 *				 *    SRC (8bit)  = SRC				 *    DST (16bit) = SRC				 */				void				transfer_8to16copy_c(int16_t * const dst,									 const uint8_t * const src,									 uint32_t stride)				{					uint32_t i, j;									for (j = 0; j < 8; j++) {						for (i = 0; i < 8; i++) {							dst[j * 8 + i] = (int16_t) src[j * stride + i];						}					}				}								/*				 * SRC - the source buffer				 * DST - the destination buffer				 *				 * Then the function does the 8->16 bit transfer and this serie of operations :				 *				 *    SRC (16bit) = SRC				 *    DST (8bit)  = max(min(SRC, 255), 0)				 */				void				transfer_16to8copy_c(uint8_t * const dst,									 const int16_t * const src,									 uint32_t stride)				{					uint32_t i, j;									for (j = 0; j < 8; j++) {						for (i = 0; i < 8; i++) {							int16_t pixel = src[j * 8 + i];											if (pixel < 0) {								pixel = 0;							} else if (pixel > 255) {								pixel = 255;							}							dst[j * stride + i] = (uint8_t) pixel;						}					}				}																				/*				 * C   - the current buffer				 * R   - the reference buffer				 * DCT - the dct coefficient buffer				 *				 * Then the function does the 8->16 bit transfer and this serie of operations :				 *				 *    R   (8bit)  = R				 *    C   (8bit)  = R				 *    DCT (16bit) = C - R				 */				void				transfer_8to16sub_c(int16_t * const dct,									uint8_t * const cur,									const uint8_t * ref,									const uint32_t stride)				{					uint32_t i, j;									for (j = 0; j < 8; j++) {						for (i = 0; i < 8; i++) {							uint8_t c = cur[j * stride + i];							uint8_t r = ref[j * stride + i];											cur[j * stride + i] = r;							dct[j * 8 + i] = (int16_t) c - (int16_t) r;						}					}				}												/*				 * C   - the current buffer				 * R1  - the 1st reference buffer				 * R2  - the 2nd reference buffer				 * DCT - the dct coefficient buffer				 *				 * Then the function does the 8->16 bit transfer and this serie of operations :				 *				 *    R1  (8bit) = R1				 *    R2  (8bit) = R2				 *    C   (8bit) = C				 *    DCT (16bit)= C - min((R1 + R2)/2, 255)				 */				void				transfer_8to16sub2_c(int16_t * const dct,									 uint8_t * const cur,									 const uint8_t * ref1,									 const uint8_t * ref2,									 const uint32_t stride)				{					uint32_t i, j;									for (j = 0; j < 8; j++) {						for (i = 0; i < 8; i++) {							uint8_t c = cur[j * stride + i];							int r = (ref1[j * stride + i] + ref2[j * stride + i] + 1) / 2;											if (r > 255) {								r = 255;							}							//cur[j * stride + i] = r;							dct[j * 8 + i] = (int16_t) c - (int16_t) r;						}					}				}												/*				 * SRC - the source buffer				 * DST - the destination buffer				 *				 * Then the function does the 16->8 bit transfer and this serie of operations :				 *				 *    SRC (16bit) = SRC				 *    DST (8bit)  = max(min(DST+SRC, 255), 0)				 */				void				transfer_16to8add_c(uint8_t * const dst,									const int16_t * const src,									uint32_t stride)				{					uint32_t i, j;									for (j = 0; j < 8; j++) {						for (i = 0; i < 8; i++) {							int16_t pixel = (int16_t) dst[j * stride + i] + src[j * 8 + i];											if (pixel < 0) {								pixel = 0;							} else if (pixel > 255) {								pixel = 255;							}							dst[j * stride + i] = (uint8_t) pixel;						}					}				}				#if 0// ben-mark-04'10/21:					/*				 * SRC - the source buffer				 * DST - the destination buffer				 *				 * Then the function does the 8->8 bit transfer and this serie of operations :				 *				 *    SRC (8bit) = SRC				 *    DST (8bit) = SRC				 */				void				transfer8x8_copy_c(uint8_t * const dst,								   const uint8_t * const src,								   const uint32_t stride)				{					uint32_t i, j;									for (j = 0; j < 8; j++) {						for (i = 0; i < 8; i++) {							dst[j * stride + i] = src[j * stride + i];						}					}				}				#endif				void				transfer_nxm_copy_ben(uint8_t * dst,								   const uint8_t * src,								   const int n,								   const int m)				{					uint32_t i, j;									for (j = 0; j < m; j++) {						for (i = 0; i < n; i++) {							*(dst ++) = *(src ++);						}						dst += (8 - n);						src += (8 - n);					}				}				void				transfer8x8_copy_ben(DECODER * const dec,								int curoffset,								uint8_t * cur,								uint8_t * ref,								int refx,								int refy)				{					int refoffset;									refoffset = ((refx >> 3) + ((int)dec->mb_width * 2) * (refy >> 3)) *SIZE_U;					transfer_nxm_copy_ben(cur + curoffset,									ref + refoffset									+ (refy & 7) * 8 + (refx & 7),									8 - (refx & 7),									8 - (refy & 7));					if ((refx & 7) != 0)						transfer_nxm_copy_ben(cur + curoffset + (8 - (refx & 7)),										ref + refoffset + 64 + (refy & 7) * 8,										refx & 7,										refy & 7);					if ((refy & 7) != 0) {						curoffset += (8 - (refx & 7)) * 8;						refoffset += (int)dec->mb_width * 2 * SIZE_U;						transfer_nxm_copy_ben(cur + curoffset,										ref + refoffset + (refx & 7),										8 - (refx & 7),										8 - (refy & 7));						if ((refx & 7) != 0)							transfer_nxm_copy_ben(cur + curoffset + (8 - (refx & 7)),											ref + refoffset + 64,											8 - (refx & 7),											8 - (refy & 7));					}				}											

相关资源