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

📄 mpeg2enc.c

📁 MPEG2解编码程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* mpeg2enc.c, main() and parameter file reading                            */



/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */



/*

 * Disclaimer of Warranty

 *

 * These software programs are available to the user without any license fee or

 * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims

 * any and all warranties, whether express, implied, or statuary, including any

 * implied warranties or merchantability or of fitness for a particular

 * purpose.  In no event shall the copyright-holder be liable for any

 * incidental, punitive, or consequential damages of any kind whatsoever

 * arising from the use of these programs.

 *

 * This disclaimer of warranty extends to the user of these programs and user's

 * customers, employees, agents, transferees, successors, and assigns.

 *

 * The MPEG Software Simulation Group does not represent or warrant that the

 * programs furnished hereunder are free of infringement of any third-party

 * patents.

 *

 * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,

 * are subject to royalty fees to patent holders.  Many of these patents are

 * general enough such that they are unavoidable regardless of implementation

 * design.

 *

 */



#include <stdio.h>

#include <stdlib.h>



#define GLOBAL /* used by global.h */

#include "config.h"

#include "global.h"



/* private prototypes */

static void init _ANSI_ARGS_((void));

static void readparmfile _ANSI_ARGS_((char *fname));

static void readquantmat _ANSI_ARGS_((void));





int main(argc,argv)

int argc;

char *argv[];

{

  if (argc!=3)

  {

    printf("\n%s, %s\n",version,author);

    printf("Usage: mpeg2encode in.par out.m2v\n");

    exit(0);

  }



  /* read parameter file */

  readparmfile(argv[1]);



  /* read quantization matrices */

  readquantmat();



  /* open output file */

  if (!(outfile=fopen(argv[2],"wb")))

  {

    sprintf(errortext,"Couldn't create output file %s",argv[2]);

    error(errortext);

  }



  init();

  putseq();



  fclose(outfile);

  fclose(statfile);

  fclose(matlab_file);



  return 0;

}



static void init()

{

  int i, size;

  static int block_count_tab[3] = {6,8,12};



  initbits();

  init_fdct();

  init_idct();



  /* round picture dimensions to nearest multiple of 16 or 32 */

  mb_width = (horizontal_size+15)/16;

  mb_height = prog_seq ? (vertical_size+15)/16 : 2*((vertical_size+31)/32);

  mb_height2 = fieldpic ? mb_height>>1 : mb_height; /* for field pictures */

  width = 16*mb_width;

  height = 16*mb_height;



  chrom_width = (chroma_format==CHROMA444) ? width : width>>1;

  chrom_height = (chroma_format!=CHROMA420) ? height : height>>1;



  height2 = fieldpic ? height>>1 : height;

  width2 = fieldpic ? width<<1 : width;

  chrom_width2 = fieldpic ? chrom_width<<1 : chrom_width;

  

  block_count = block_count_tab[chroma_format-1];



  /* clip table */

  if (!(clp = (unsigned char *)malloc(1024)))

    error("malloc failed\n");

  clp+= 384;

  for (i=-384; i<640; i++)

    clp[i] = (i<0) ? 0 : ((i>255) ? 255 : i);



  for (i=0; i<3; i++)

  {

    size = (i==0) ? width*height : chrom_width*chrom_height;



    if (!(newrefframe[i] = (unsigned char *)malloc(size)))

      error("malloc failed\n");

    if (!(oldrefframe[i] = (unsigned char *)malloc(size)))

      error("malloc failed\n");

    if (!(auxframe[i] = (unsigned char *)malloc(size)))

      error("malloc failed\n");

    if (!(neworgframe[i] = (unsigned char *)malloc(size)))

      error("malloc failed\n");

    if (!(oldorgframe[i] = (unsigned char *)malloc(size)))

      error("malloc failed\n");

    if (!(auxorgframe[i] = (unsigned char *)malloc(size)))

      error("malloc failed\n");

    if (!(predframe[i] = (unsigned char *)malloc(size)))

      error("malloc failed\n");

  }



  mbinfo = (struct mbinfo *)malloc(mb_width*mb_height2*sizeof(struct mbinfo));



  if (!mbinfo)

    error("malloc failed\n");



  blocks =

    (short (*)[64])malloc(mb_width*mb_height2*block_count*sizeof(short [64]));



  if (!blocks)

    error("malloc failed\n");



  /* open statistics output file */

  if (statname[0]=='-')

    statfile = stdout;

  else if (!(statfile = fopen(statname,"w")))

  {

    sprintf(errortext,"Couldn't create statistics output file %s",statname);

    error(errortext);

  }



  matlab_file = fopen("stat.dat","w");

}



void error(text)

char *text;

{

  fprintf(stderr,text);

  putc('\n',stderr);

  exit(1);

}



static void readparmfile(fname)

char *fname;

{

  int i;

  int h,m,s,f;

  FILE *fd;

  char line[256];

  static double ratetab[8]=

    {24000.0/1001.0,24.0,25.0,30000.0/1001.0,30.0,50.0,60000.0/1001.0,60.0};

  extern int r,Xi,Xb,Xp,d0i,d0p,d0b; /* rate control */

  extern double avg_act; /* rate control */



  if (!(fd = fopen(fname,"r")))

  {

    sprintf(errortext,"Couldn't open parameter file %s",fname);

    error(errortext);

  }



  fgets(id_string,254,fd);

  fgets(line,254,fd); sscanf(line,"%s",tplorg);

  fgets(line,254,fd); sscanf(line,"%s",tplref);

  fgets(line,254,fd); sscanf(line,"%s",iqname);

  fgets(line,254,fd); sscanf(line,"%s",niqname);

  fgets(line,254,fd); sscanf(line,"%s",statname);

  fgets(line,254,fd); sscanf(line,"%d",&inputtype);

  fgets(line,254,fd); sscanf(line,"%d",&nframes);

  fgets(line,254,fd); sscanf(line,"%d",&frame0);

  fgets(line,254,fd); sscanf(line,"%d:%d:%d:%d",&h,&m,&s,&f);

  fgets(line,254,fd); sscanf(line,"%d",&N);

  fgets(line,254,fd); sscanf(line,"%d",&M);

  fgets(line,254,fd); sscanf(line,"%d",&mpeg1);

  fgets(line,254,fd); sscanf(line,"%d",&fieldpic);

  fgets(line,254,fd); sscanf(line,"%d",&horizontal_size);

  fgets(line,254,fd); sscanf(line,"%d",&vertical_size);

  fgets(line,254,fd); sscanf(line,"%d",&aspectratio);

  fgets(line,254,fd); sscanf(line,"%d",&frame_rate_code);

  fgets(line,254,fd); sscanf(line,"%lf",&bit_rate);

  fgets(line,254,fd); sscanf(line,"%d",&vbv_buffer_size);   

  fgets(line,254,fd); sscanf(line,"%d",&low_delay);     

  fgets(line,254,fd); sscanf(line,"%d",&constrparms);

  fgets(line,254,fd); sscanf(line,"%d",&profile);

  fgets(line,254,fd); sscanf(line,"%d",&level);

  fgets(line,254,fd); sscanf(line,"%d",&prog_seq);

  fgets(line,254,fd); sscanf(line,"%d",&chroma_format);

  fgets(line,254,fd); sscanf(line,"%d",&video_format);

  fgets(line,254,fd); sscanf(line,"%d",&color_primaries);

  fgets(line,254,fd); sscanf(line,"%d",&transfer_characteristics);

  fgets(line,254,fd); sscanf(line,"%d",&matrix_coefficients);

  fgets(line,254,fd); sscanf(line,"%d",&display_horizontal_size);

  fgets(line,254,fd); sscanf(line,"%d",&display_vertical_size);

  fgets(line,254,fd); sscanf(line,"%d",&dc_prec);

  fgets(line,254,fd); sscanf(line,"%d",&topfirst);

  fgets(line,254,fd); sscanf(line,"%d %d %d",

    frame_pred_dct_tab,frame_pred_dct_tab+1,frame_pred_dct_tab+2);

  

  fgets(line,254,fd); sscanf(line,"%d %d %d",

    conceal_tab,conceal_tab+1,conceal_tab+2);

  

  fgets(line,254,fd); sscanf(line,"%d %d %d",

    qscale_tab,qscale_tab+1,qscale_tab+2);



  fgets(line,254,fd); sscanf(line,"%d %d %d",

    intravlc_tab,intravlc_tab+1,intravlc_tab+2);

  fgets(line,254,fd); sscanf(line,"%d %d %d",

    altscan_tab,altscan_tab+1,altscan_tab+2);

  fgets(line,254,fd); sscanf(line,"%d",&repeatfirst);

  fgets(line,254,fd); sscanf(line,"%d",&prog_frame);

/* intra slice interval refresh period */  

  fgets(line,254,fd); sscanf(line,"%d",&P);

  fgets(line,254,fd); sscanf(line,"%d",&r);

  fgets(line,254,fd); sscanf(line,"%lf",&avg_act);

  fgets(line,254,fd); sscanf(line,"%d",&Xi);

  fgets(line,254,fd); sscanf(line,"%d",&Xp);

  fgets(line,254,fd); sscanf(line,"%d",&Xb);

  fgets(line,254,fd); sscanf(line,"%d",&d0i);

  fgets(line,254,fd); sscanf(line,"%d",&d0p);

  fgets(line,254,fd); sscanf(line,"%d",&d0b);



  if (N<1)

    error("N must be positive");

  if (M<1)

    error("M must be positive");

  if (N%M != 0)

    error("N must be an integer multiple of M");



  motion_data = (struct motion_data *)malloc(M*sizeof(struct motion_data));

  if (!motion_data)

    error("malloc failed\n");



  for (i=0; i<M; i++)

  {

    fgets(line,254,fd);

    sscanf(line,"%d %d %d %d",

      &motion_data[i].forw_hor_f_code, &motion_data[i].forw_vert_f_code,

      &motion_data[i].sxf, &motion_data[i].syf);



    if (i!=0)

    {

      fgets(line,254,fd);

      sscanf(line,"%d %d %d %d",

        &motion_data[i].back_hor_f_code, &motion_data[i].back_vert_f_code,

        &motion_data[i].sxb, &motion_data[i].syb);

    }

  }



  fclose(fd);



  /* make flags boolean (x!=0 -> x=1) */

  mpeg1 = !!mpeg1;

  fieldpic = !!fieldpic;

  low_delay = !!low_delay;

  constrparms = !!constrparms;

  prog_seq = !!prog_seq;

  topfirst = !!topfirst;



  for (i=0; i<3; i++)

  {

    frame_pred_dct_tab[i] = !!frame_pred_dct_tab[i];

    conceal_tab[i] = !!conceal_tab[i];

    qscale_tab[i] = !!qscale_tab[i];

    intravlc_tab[i] = !!intravlc_tab[i];

    altscan_tab[i] = !!altscan_tab[i];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -