⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.c

📁 一个264程序在NS2下面的仿真程序。非常好用
💻 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 + -