📄 decode.c
字号:
#include "global.h"int markslice(int marking, int mode, int slicegroup, int slice_type){ int prio; if ( mode == 0 ) { if ( marking == 1){ switch(slice_type){ case 0: prio = 2; printf("Slice type: 0 - Inter (P)\n"); break; case 1: prio = 3; printf("Slice type: 1 - B\n"); break; case 2: prio = 3; printf("Slice type: 2 - SP\n"); break; case 3: prio = 1; printf("Slice type: 3 - Intra (I)\n"); break; default: prio = 3; break; } } } return prio;}int fmo_slicegroup(int format, int pattern, int x, int y){ int *pointer; int yoffset, slice_group; int fmo_qcif_2[] = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, }; int fmo_qcif_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; int fmo_cif_2[] = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, }; int fmo_cif_3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; if (format == 1){ yoffset = 11; if (pattern == 2) pointer = &fmo_qcif_2[0]; else if (pattern == 3) pointer = &fmo_qcif_3[0]; else if (pattern == 0) return 0; } else if (format == 2){ yoffset = 22; if (pattern == 2) pointer = &fmo_cif_2[0]; else if (pattern == 3) pointer = &fmo_cif_3[0]; else if (pattern == 0) return 0; } pointer = pointer + (yoffset * y) + x; slice_group = *pointer; return slice_group;}int dec_slice(int mode, unsigned char *pt){ int first_mb_in_sliceX, first_mb_in_sliceY, slice_type, pic_par_set_id, frame_num; int bitpos, bytepos=0; int pic_id = 0, slice_id, initialQP, slicegroup; int prio = 3; read_bits_result rbres1; bitpos = 0; if (mode<2){ rbres1 = uvlc(pt,bitpos); pic_par_set_id = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; rbres1 = uvlc(pt,bitpos); pic_id = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; /*currentframe = pic_id;*/ rbres1 = uvlc(pt,bitpos); slice_type = rbres1.value; printf("slice_type:%d\n", slice_type); pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; printf("ParameterSet: %d\nPictureID: %d\n", pic_par_set_id, pic_id); rbres1 = uvlc(pt,bitpos); first_mb_in_sliceX = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; rbres1 = uvlc(pt,bitpos); first_mb_in_sliceY = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; printf("FirstMBInSliceX: %d\nFirstMBInSliceY: %d\n", \ first_mb_in_sliceX, first_mb_in_sliceY); if (first_mb_in_sliceX == 0 && first_mb_in_sliceY == 0) currentframe++; printf("Current frame: %d\n", currentframe); rbres1 = uvlc(pt,bitpos); initialQP = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; printf("InitialQP: %d\n", initialQP); slicegroup = fmo_slicegroup(format,pattern,first_mb_in_sliceX, first_mb_in_sliceY); printf("Slice group for pattern %d, macroblock at X = %d and Y = %d : %d\n", pattern,first_mb_in_sliceX, first_mb_in_sliceY,slicegroup); if (mode == 1){ rbres1 = uvlc(pt,bitpos); slice_id = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; printf("SliceID: %d\n",slice_id); } else { printf("\n"); } prio = markslice(marking, mode, slicegroup, slice_type); } else { rbres1 = uvlc(pt,bitpos); pic_id = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; rbres1 = uvlc(pt,bitpos); slice_id = rbres1.value; pt = pt + rbres1.bytesread; bitpos = rbres1.bitpos; printf("PictureID: %d\nSliceID: %d\n", pic_id,slice_id); prio = markslice(marking, mode, 0 , 0); } return prio;}int dec_nal_u(unsigned char *pt){ unsigned char byte; char r1; int packet_type,error_ind,pos,prio = 3; byte = *pt; pt++; packet_type = byte & 15; error_ind = (byte >> 7) & 1; printf("\nPacket type: %d\tError indication: %d\n",packet_type, error_ind); switch (packet_type){ case 0: prio = dec_slice(0, pt); printf("Single Slice. Priority: %d\n",prio); break; case 1: prio = dec_slice(1, pt); printf("Header Data Partition (A). Priority: %d\n",prio); break; case 2: prio = dec_slice(2, pt); printf("Intra Data Partition (B). Priority: %d\n",prio); break; case 3: prio = dec_slice(3, pt); printf("Inter Data Partition (C). Priority: %d\n",prio); break; case 6: prio = 1; printf("Parameter Update Packet. Priority: %d\n",prio); break; default: printf("Unknown Packet type\n"); prio = 3; break; } return prio;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -