Пример #1
0
void FreePartition (DataPartition *dp, int n)
{
	int i;
	
	assert (dp != NULL);
	assert (dp->bitstream != NULL);
	assert (dp->bitstream->streamBuffer != NULL);
	for (i=0; i<n; i++)
	{
		//h264_free (dp[i].bitstream->streamBuffer);
		h264_free (dp[i].bitstream);
	}
	h264_free (dp);
}
Пример #2
0
/*!
 ************************************************************************
 * \brief
 *    free 2D memory array
 *    which was alocated with get_mem2Dint()
 *-----------------------------------------------------------------------			
 *	 Function Argument List Changed [Removing Global Variables] 
 *	 Input parameters added are 
 *			- h264_decoder* dec_params
 *
 *		<*****@*****.**>
 ************************************************************************
 */
void free_mem2Dint(int **array2D)
{
  if (array2D)
  {
    if (array2D[0])
	{
      h264_free (array2D[0]);
	}
    else
	{
		printf("free_mem2Dint: trying to free unused memory");
	}
    h264_free (array2D);
  }
  else
  {
    printf("free_mem2Dint: trying to free unused memory");
  }
}
Пример #3
0
/*!
 ************************************************************************
 * \brief
 *    free 2D memory array
 *    which was alocated with get_mem2Dint64()
 *-----------------------------------------------------------------------			
 *	 Function Argument List Changed [Removing Global Variables] 
 *	 Input parameters added are 
 *			- h264_decoder* dec_params
 *
 *		<*****@*****.**>
 ************************************************************************
 */
void free_mem2Dint64(int64 **array2D)
{
  if (array2D)
  {
    if (array2D[0]) 
	{
      h264_free (array2D[0]);
	}
    else
	{
		printf("free_mem2Dint64: trying to free unused memory");
	}
    h264_free (array2D);
  }
  else
  {
    printf("free_mem2Dint64: trying to free unused memory");
	exit(0);
  }
}
Пример #4
0
/*!
 ************************************************************************
 * \brief
 *    free 2D memory array
 *    which was alocated with get_mem2Dpel()
 *-----------------------------------------------------------------------			
 *	 Function Argument List Changed [Removing Global Variables] 
 *	 Input parameters added are 
 *			- h264_decoder* dec_params
 *
 *		<*****@*****.**>
 ************************************************************************
 */
void free_mem2Dpel(imgpel **array2D)
{
  if (array2D)
  {
    if (array2D[0])
      h264_free (array2D[0]);
    else 
	{
		printf("free_mem2Dpel: trying to free unused memory",100);
		exit(0);
	}

    h264_free (array2D);
  } 
  else
  {
    printf("free_mem2Dpel: trying to free unused memory");
	exit(0);
  }
}
Пример #5
0
/*!
************************************************************************
* \brief
*    Memory frees of the Slice structure and of its dependent
*    data structures
*
* \par Input:
*    Input Parameters struct inp_par *inp,  struct img_par *img
************************************************************************
*/
void free_slice(InputParameters *inp,ImageParameters *img)
{
	Slice *currSlice = img->currentSlice;
	
	//FreePartition (currSlice->partArr, 3);
	FreePartition (currSlice->partArr, currSlice->max_part_nr);
	//      if (inp->symbol_mode == CABAC)
	if (1)
	{
		// delete all context models
		//delete_contexts_MotionInfo(currSlice->mot_ctx);
		//delete_contexts_TextureInfo(currSlice->tex_ctx);
	}
	h264_free(img->currentSlice);
	
	currSlice = NULL;
}
Пример #6
0
/*!
 ************************************************************************
 * \brief
 *    free 4D short memory array 
 *    which was allocated with get_mem4Dshort()
 *-----------------------------------------------------------------------			
 *	 Function Argument List Changed [Removing Global Variables] 
 *	 Input parameters added are 
 *			- h264_decoder* dec_params
 *
 *		<*****@*****.**>
 ************************************************************************
 */
void free_mem4Dshort(short ****array4D, int idx, int frames )
{
  int  j;

  if (array4D)
  {
	  for(j=0;j<idx;j++)
	  {
      free_mem3Dshort( array4D[j], frames) ;
	  }
    h264_free (array4D);
  }
  else
  {
    printf("free_mem4Dshort: trying to free unused memory");
	exit(0);
  }
}
Пример #7
0
/*!
 ************************************************************************
 * \brief
 *    free 3D short memory array 
 *    which was allocated with get_mem3Dshort()
 *-----------------------------------------------------------------------			
 *	 Function Argument List Changed [Removing Global Variables] 
 *	 Input parameters added are 
 *			- h264_decoder* dec_params
 *
 *		<*****@*****.**>
 ************************************************************************
 */
void free_mem3Dshort(short ***array3D, int frames)
{
  int i;

  if (array3D)
  {
    for (i=0;i<frames;i++)
    { 
      free_mem2Dshort(array3D[i]);
    }
   h264_free (array3D);
  }
  else
  {
    printf("free_mem3Dshort: trying to free unused memory");
	exit(0);
  }
}
Пример #8
0
static void ProcessSpsNalu(unsigned char* data, int length) {
    const char naluHeader[] = {0x00, 0x00, 0x00, 0x01};
    h264_stream_t* stream = h264_new();
    
    // Read the old NALU
    read_nal_unit(stream, &data[sizeof(naluHeader)], length-sizeof(naluHeader));
    
    // Fixup the SPS to what OS X needs to use hardware acceleration
    stream->sps->num_ref_frames = 1;
    stream->sps->vui.max_dec_frame_buffering = 1;
    
    // Copy the NALU prefix over from the original SPS
    memcpy(s_LastSps, naluHeader, sizeof(naluHeader));
    
    // Copy the modified NALU data
    s_LastSpsLength = sizeof(naluHeader) + write_nal_unit(stream,
                                                          &s_LastSps[sizeof(naluHeader)],
                                                          sizeof(s_LastSps)-sizeof(naluHeader));
    
    h264_free(stream);
}
Пример #9
0
//自己写的,解析NAL数据的函数
char* probe_nal_unit(char* filename,int data_offset,int data_lenth){
	//清空字符串-----------------
	memset(outputstr,'\0',100000);
	//tempstr=(char *)malloc(10000);
	//outputstr=(char *)malloc(100000);
	//内存用于存放NAL(包含起始码)
	uint8_t *nal_temp=(uint8_t *)malloc(data_lenth);
	//从文件读取
	FILE *fp=fopen(filename,"rb");
	fseek(fp,data_offset,SEEK_SET);
	fread(nal_temp,data_lenth,1,fp);
	// read some H264 data into buf
	int nal_start,nal_end;
	h264_stream_t* h = h264_new();
	find_nal_unit(nal_temp, data_lenth, &nal_start, &nal_end);
	read_nal_unit(h, &nal_temp[nal_start], nal_end - nal_start);
	debug_nal(h,h->nal);
	free(nal_temp);
	fclose(fp);
	h264_free(h);

	return outputstr;
}
Пример #10
0
int main(int argc, char **argv)
{
	int Flag = TRUE;

	//long ftell_position;//, expected_slice_type;
	//int ret;
	NALU_t *nalu;
	
	h264_decoder* dec_params;
	char *ptr;
	
	ptr =  (  char*)malloc(10 * sizeof(char)); 

    if ((dec_params =  (  h264_decoder*)h264_malloc(1 * sizeof(h264_decoder)))==NULL) 
 //	if ((dec_params =  (  h264_decoder*)h264_malloc(1 * 100))==NULL) 
	{
		Flag=FALSE;
	}

  	if ((dec_params->input =  (InputParameters *)h264_malloc(1 * sizeof(InputParameters)))==NULL) 
	{
		printf("main: input");
		exit(0);
	}
	if ((dec_params->img   =  (ImageParameters *)h264_malloc(1 * sizeof(ImageParameters)))==NULL) 
	{
		printf("main: img");
		exit(0);
	}

	////////// ADDED INITIALIZATIONS //////
	dec_params->active_sps       = NULL;
	dec_params->active_pps       = NULL;
 	dec_params->Co_located       = NULL;
	dec_params->dec_picture     = NULL;
	dec_params->global_init_done = 0;
	dec_params->dpb.init_done	 = 0;
	dec_params->img->DeblockCall = 0;
//	dec_params->img->structure   = 0;
	dec_params->MapUnitToSliceGroupMap = NULL;
	dec_params->MbToSliceGroupMap      = NULL;
	dec_params->img->errorConcealmentFlag = 0;			// ERROR CONCEALMENT FLAG SET TO ZERO , NO ERROR CONCEALMENT
	dec_params->img->no_output_of_prior_pics_flag = -1;

	///////////////////////////////////////
	Initializations(dec_params);
	
	Configure ( argc, argv,dec_params );
	
		
	init_old_slice(dec_params);
	
	switch (dec_params->input->FileFormat)
	{
	case 0:
		OpenBitstreamFile (dec_params->input->infile,dec_params);
		break;
	case 1:
		OpenRTPFile (dec_params->input->infile,dec_params);
		break;
	default:
		printf ("Unsupported file format %d, exit\n", dec_params->input->FileFormat);
	}
	
	// Allocate Slice data struct
	malloc_slice(dec_params->input,dec_params->img,dec_params);
	
	init(dec_params->img,dec_params);
	
	dec_params->dec_picture = NULL;
	
	dec_params->dpb.init_done = 0;
	//dec_params->g_nFrame = 0;
	
//	init_out_buffer(dec_params);
	
  //dec_params->img->idr_psnr_number=dec_params->input->ref_offset;
  //dec_params->img->psnr_number=0;
	
	dec_params->img->number=0;
	dec_params->img->type = I_SLICE;
	dec_params->img->dec_ref_pic_marking_buffer = NULL;
	
	// B pictures
	dec_params->Bframe_ctr=0;

	// time for total decoding session
	dec_params->tot_time = 0;

	dec_params->nalu = AllocNALU(MAX_CODED_FRAME_SIZE,dec_params);
	nalu = dec_params->nalu;

	dec_params->dp   = AllocPartition(1, dec_params,1024);
	dec_params->sps  = AllocSPS();
	dec_params->pps  = AllocPPS();


	{
		while ( decode_one_frame( dec_params ) != EOS );
	}	
	//report( dec_params->input, dec_params->img, dec_params->snr,dec_params,);
	report( dec_params->input, dec_params->img,dec_params);
	free_slice( dec_params->input,dec_params->img);

	FreeNALU(dec_params->nalu);
	FreePartition (dec_params->dp, 1);
	FreeSPS (dec_params->sps);
    if (dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].Valid == TRUE && dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].slice_group_id != NULL)
	{
		h264_free (dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].slice_group_id);
		dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].slice_group_id = NULL;
	}
	
	// IF FMO PRESENT
	if (dec_params->active_pps->num_slice_groups_minus1) 
	{
	FmoFinit(dec_params);
	}	

	FreePPS (dec_params->pps);
	
	
	free_global_buffers_baseline(dec_params);
	
	flush_dpb(dec_params);
	
#ifdef PAIR_FIELDS_IN_OUTPUT
	flush_pending_output(dec_params->p_out);
#endif
	
	CloseBitstreamFile(dec_params);
	
	//close(dec_params->p_out);
	fclose (dec_params->f_out);
	//  fclose(p_out2);

#if TRACE
	fclose(p_trace);
#endif
	
	//ercClose(dec_params->erc_errorVar,dec_params);
	ercClose(dec_params);
	
	free_dpb(dec_params);
//	uninit_out_buffer(dec_params);
	
	free_colocated(dec_params);
	if(dec_params->dec_picture != NULL)
	{
		free (dec_params->dec_picture);
		dec_params->dec_picture = NULL;
	}
	if(dec_params->input != NULL)
	{
		h264_free (dec_params->input);
		dec_params->input = NULL;
	}
	if(dec_params->img != NULL)
	{
		h264_free (dec_params->img);
		dec_params->img = NULL;
	}
	if(dec_params != NULL)
	{
		h264_free (dec_params);
		dec_params = NULL;
	}
	return 0;
}
Пример #11
0
/*!
 ************************************************************************
 * \brief
 *    Free allocated memory of frame size related global buffers
 *    buffers are defined in global.h, allocated memory is allocated in
 *    int init_global_buffers()
 *
 * \par Input:
 *    Input Parameters struct inp_par *inp, Image Parameters struct img_par *img
 *
 * \par Output:
 *    none
 *
 *-----------------------------------------------------------------------			
 *	 Function Argument List Changed [Removing Global Variables] 
 *	 Input parameters added are 
 *			- h264_decoder* dec_params
 *
 *		<*****@*****.**>
  
 ************************************************************************
*/
void free_global_buffers_baseline( h264_decoder* dec_params )
{
	ImageParameters* img = dec_params->img;

//	h264_free (dec_params->img->nz_coeff);

	h264_free (dec_params->img->nz_coeff1);
	
	// free mem, allocated for structure img
//	if (img->mb_data != NULL) 
//		h264_free(img->mb_data);

	// faisal
	h264_free(img->slice_nr);
	h264_free(img->ei_flag);
	
	///////////////////////////////////////////////////////////////////////////////////
	// memory deallocation for the new mb_data structure in the ImageParam structure //
	///////////////////////////////////////////////////////////////////////////////////
	h264_free(img->mb_data1.cbp_blk);
	h264_free(img->mb_data1.LFAlphaC0Offset);
	h264_free(img->mb_data1.LFBetaOffset);
	h264_free(img->mb_data1.LFDisableIdc);
	h264_free(img->mb_data1.mb_type);
	h264_free(img->mb_data1.partition);
	h264_free(img->mb_data1.mbAvailA);
	h264_free(img->mb_data1.mbAvailB);
	h264_free(img->mb_data1.NoMbPartLessThan8x8Flag);
	h264_free(img->mb_data1.qp);
	///////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////

	h264_free (dec_params->img->intra_block);
	free_mem2D ( (byte **) dec_params->img->ipredmode);
	free_mem3Dint(dec_params->img->wp_weight, 2);
	free_mem3Dint(dec_params->img->wp_offset, 6);
	free_mem4Dint(dec_params->img->wbp_weight, 6, MAX_REFERENCE_PICTURES);
	/* End of Change*/
//	h264_free (dec_params->img->quad);
    delete_contexts_MotionInfo(dec_params->mot_ctx);
    delete_contexts_TextureInfo(dec_params->tex_ctx);
	dec_params->global_init_done = 0;
}
Пример #12
0
int main(int argc, char *argv[])
{
    FILE* infile;

    uint8_t* buf = (uint8_t*)malloc( BUFSIZE );

    h264_stream_t* h = h264_new();

    if (argc < 2) { usage(); return EXIT_FAILURE; }

    int opt_verbose = 1;
    int opt_probe = 0;

#ifdef HAVE_GETOPT_LONG
    int c;
    int long_options_index;
    extern char* optarg;
    extern int   optind;

    while ( ( c = getopt_long( argc, argv, "o:p:hv", long_options, &long_options_index) ) != -1 )
    {
        switch ( c )
        {
            case 'o':
                if (h264_dbgfile == NULL) { h264_dbgfile = fopen( optarg, "wt"); }
                break;
            case 'p':
                opt_probe = 1;
                opt_verbose = 0;
                break;
            case 'v':
                opt_verbose = atoi( optarg );
                break;
            case 'h':
            default:
                usage( );
                return 1;
        }
    }

    infile = fopen(argv[optind], "rb");

#else

    infile = fopen(argv[1], "rb");

#endif

    if (infile == NULL) { fprintf( stderr, "!! Error: could not open file: %s \n", strerror(errno)); exit(EXIT_FAILURE); }

    if (h264_dbgfile == NULL) { h264_dbgfile = stdout; }
    

    size_t rsz = 0;
    size_t sz = 0;
    int64_t off = 0;
    uint8_t* p = buf;

    int nal_start, nal_end;

    while (1)
    {
        rsz = fread(buf + sz, 1, BUFSIZE - sz, infile);
        if (rsz == 0)
        {
            if (ferror(infile)) { fprintf( stderr, "!! Error: read failed: %s \n", strerror(errno)); break; }
            break;  // if (feof(infile)) 
        }

        sz += rsz;

        while (find_nal_unit(p, sz, &nal_start, &nal_end) > 0)
        {
            if ( opt_verbose > 0 )
            {
               fprintf( h264_dbgfile, "!! Found NAL at offset %lld (0x%04llX), size %lld (0x%04llX) \n",
                      (long long int)(off + (p - buf) + nal_start),
                      (long long int)(off + (p - buf) + nal_start),
                      (long long int)(nal_end - nal_start),
                      (long long int)(nal_end - nal_start) );
            }

            p += nal_start;
            read_nal_unit(h, p, nal_end - nal_start);

            if ( opt_probe && h->nal->nal_unit_type == NAL_UNIT_TYPE_SPS )
            {
                // print codec parameter, per RFC 6381.
                int constraint_byte = h->sps->constraint_set0_flag << 7;
                constraint_byte = h->sps->constraint_set1_flag << 6;
                constraint_byte = h->sps->constraint_set2_flag << 5;
                constraint_byte = h->sps->constraint_set3_flag << 4;
                constraint_byte = h->sps->constraint_set4_flag << 3;
                constraint_byte = h->sps->constraint_set4_flag << 3;

                fprintf( h264_dbgfile, "codec: avc1.%02X%02X%02X\n",h->sps->profile_idc, constraint_byte, h->sps->level_idc );

                // TODO: add more, move to h264_stream (?)
                break; // we've seen enough, bailing out.
            }

            if ( opt_verbose > 0 )
            {
                fprintf( h264_dbgfile, "XX ");
                debug_bytes(p-4, nal_end - nal_start + 4 >= 16 ? 16: nal_end - nal_start + 4);

                debug_nal(h, h->nal);
            }

            p += (nal_end - nal_start);
            sz -= nal_end;
        }

        // if no NALs found in buffer, discard it
        if (p == buf) 
        {
            fprintf( stderr, "!! Did not find any NALs between offset %lld (0x%04llX), size %lld (0x%04llX), discarding \n",
                   (long long int)off, 
                   (long long int)off, 
                   (long long int)off + sz, 
                   (long long int)off + sz);

            p = buf + sz;
            sz = 0;
        }

        memmove(buf, p, sz);
        off += p - buf;
        p = buf;
    }

    h264_free(h);
    free(buf);

    fclose(h264_dbgfile);
    fclose(infile);

    return 0;
}
Пример #13
0
int main(int argc, char *argv[])
{
    uint8_t* buf = (uint8_t*)malloc(BUFSIZE);
    h264_stream_t* h = h264_new();

    if (argc < 2)
    {
        printf("h264_analyze, version 0.1.6\n");
        printf("Usage: \n");
        printf("  h264_analyze stream.h264\n");
        printf("where stream.h264 is a raw H264 stream, as produced by JM or x264\n");
    }

    int fd = open(argv[1], O_RDONLY);
    if (fd == -1) { perror("could not open file"); exit(0); }

    int rsz = 0;
    int sz = 0;
    int64_t off = 0;
    uint8_t* p = buf;

    int nal_start, nal_end;

    while ((rsz = read(fd, buf + sz, BUFSIZE - sz)))
    {
        sz += rsz;

        while (find_nal_unit(p, sz, &nal_start, &nal_end) > 0)
        {
            printf("!! Found NAL at offset %"PRId64" (0x%04"PRIX64"), size %"PRId64" (0x%04"PRIX64") \n", 
                   (int64_t)(off + (p - buf) + nal_start), 
                   (int64_t)(off + (p - buf) + nal_start), 
                   (int64_t)(nal_end - nal_start), 
                   (int64_t)(nal_end - nal_start) );
            p += nal_start;
            read_nal_unit(h, p, nal_end - nal_start);
            debug_nal(h, h->nal);
            p += (nal_end - nal_start);
            sz -= nal_end;
        }

        // if no NALs found in buffer, discard it
        if (p == buf) 
        {
            printf("!! Did not find any NALs between offset %"PRId64" (0x%04"PRIX64"), size %"PRId64" (0x%04"PRIX64"), discarding \n", 
                   (int64_t)off, 
                   (int64_t)off, 
                   (int64_t)off + sz, 
                   (int64_t)off + sz);

            p = buf + sz;
            sz = 0;
        }

        memmove(buf, p, sz);
        off += p - buf;
        p = buf;
    }

    h264_free(h);
    free(buf);
}
Пример #14
0
/* Main Routine to verify HRD compliance */
void calc_buffer(InputParameters *inp)
{
    unsigned long NumberLeakyBuckets, *Rmin, *Bmin, *Fmin;
    float B_interp,  F_interp;
    unsigned long iBucket;
    float dnr, frac1, frac2;
    unsigned long R_decoder, B_decoder, F_decoder;
    FILE *outf;

    if ((outf=fopen(inp->LeakyBucketParamFile,"rb"))==NULL)
    {
        snprintf(dec_params->errortext, ET_SIZE, "Error open file %s \n",inp->LeakyBucketParamFile);
        error(dec_params->errortext,1,dec_outputs);
    }

    NumberLeakyBuckets = GetBigDoubleWord(outf);
    printf(" Number Leaky Buckets: %8ld \n\n", NumberLeakyBuckets);
    Rmin = h264_calloc(sizeof(unsigned long), NumberLeakyBuckets);
    Bmin = h264_calloc(sizeof(unsigned long), NumberLeakyBuckets);
    Fmin = h264_calloc(sizeof(unsigned long), NumberLeakyBuckets);

    for(iBucket =0; iBucket < NumberLeakyBuckets; iBucket++)
    {
        Rmin[iBucket] = GetBigDoubleWord(outf);
        Bmin[iBucket] = GetBigDoubleWord(outf);
        Fmin[iBucket] = GetBigDoubleWord(outf);
        printf(" %8ld %8ld %8ld \n", Rmin[iBucket], Bmin[iBucket], Fmin[iBucket]);
    }
    fclose(outf);

    R_decoder = inp->R_decoder;
    F_decoder = inp->F_decoder;
    B_decoder = inp->B_decoder;

    for( iBucket =0; iBucket < NumberLeakyBuckets; iBucket++)
    {
        if(R_decoder < Rmin[iBucket])
        {
            break;
        }
    }

    printf("\n");
    if(iBucket > 0 )
    {
        if(iBucket < NumberLeakyBuckets)
        {
            dnr = (float) (Rmin[iBucket] - Rmin[iBucket-1]);
            frac1 = (float) (R_decoder - Rmin[iBucket-1]);
            frac2 = (float) (Rmin[iBucket] - R_decoder);
            B_interp = (float) (Bmin[iBucket] * frac1 + Bmin[iBucket-1] * frac2) /dnr;
            F_interp = (float) (Fmin[iBucket] * frac1 + Fmin[iBucket-1] * frac2) /dnr;
        }
        else
        {
            B_interp = (float) Bmin[iBucket-1];
            F_interp = (float) Fmin[iBucket-1];
        }
        printf(" Min.buffer %8.2f Decoder buffer size %ld \n Minimum Delay %8.2f DecoderDelay %ld \n", B_interp, B_decoder, F_interp, F_decoder);
        if(B_decoder > B_interp && F_decoder > F_interp)
        {
            printf(" HRD Compliant \n");
        }
        else
        {
            printf(" HRD Non Compliant \n");
        }
    }
    else
    {   // (iBucket = 0)
        printf(" Decoder Rate is too small; HRD cannot be verified \n");
    }

    h264_free(Rmin);
    h264_free(Bmin);
    h264_free(Fmin);
    return;
}
Пример #15
0
void dec_ref_pic_marking(Bitstream *currStream,   h264_decoder* dec_params)
{
  int val;

  DecRefPicMarking_t *tmp_drpm,*tmp_drpm2;

  // free old buffer content
  while (dec_params->img->dec_ref_pic_marking_buffer)
  { 
    tmp_drpm=dec_params->img->dec_ref_pic_marking_buffer;

    dec_params->img->dec_ref_pic_marking_buffer=tmp_drpm->Next;
    h264_free (tmp_drpm);
  } 

  if (dec_params->img->idr_flag)
  {
    dec_params->img->no_output_of_prior_pics_flag = u_1("SH: no_output_of_prior_pics_flag", currStream,dec_params);
    dec_params->img->long_term_reference_flag = u_1("SH: long_term_reference_flag", currStream,dec_params);
  }
  else
  {
    dec_params->img->adaptive_ref_pic_buffering_flag = u_1("SH: adaptive_ref_pic_buffering_flag", currStream,dec_params);
    if (dec_params->img->adaptive_ref_pic_buffering_flag)
    {
      // read Memory Management Control Operation 
      do
      {
		tmp_drpm=(DecRefPicMarking_t*) h264_malloc (1*sizeof (DecRefPicMarking_t));
        tmp_drpm->Next=NULL;
        
        val = tmp_drpm->memory_management_control_operation = ue_v("SH: memory_management_control_operation", currStream,dec_params);

        if ((val==1)||(val==3)) 
        {
          tmp_drpm->difference_of_pic_nums_minus1 = ue_v("SH: difference_of_pic_nums_minus1", currStream,dec_params);
        }
        if (val==2)
        {
          tmp_drpm->long_term_pic_num = ue_v("SH: long_term_pic_num", currStream,dec_params);
        }
          
        if ((val==3)||(val==6))
        {
          tmp_drpm->long_term_frame_idx = ue_v("SH: long_term_frame_idx", currStream,dec_params);
        }
        if (val==4)
        {
          tmp_drpm->max_long_term_frame_idx_plus1 = ue_v("SH: max_long_term_pic_idx_plus1", currStream,dec_params);
        }
        
        // add command
        if (dec_params->img->dec_ref_pic_marking_buffer==NULL) 
        {
          dec_params->img->dec_ref_pic_marking_buffer=tmp_drpm;
        }
        else
        {
          tmp_drpm2=dec_params->img->dec_ref_pic_marking_buffer;
          while (tmp_drpm2->Next!=NULL) tmp_drpm2=tmp_drpm2->Next;
          tmp_drpm2->Next=tmp_drpm;
        }
        
      }while (val != 0);
      
    }
  }
}