📄 decoder.cpp
字号:
/*
This software module was originally developed by
Hang-Seop Lee (hslee@etri.re.kr), ETRI
Jung-Chul Lee (jclee@etri.re.kr), ETRI
and edited by Hang-Seop Lee, Jung-Chul Lee of ETRI,
in the course of development of the MPEG-4.
This software module is an implementation of a part of one or
more MPEG-4 tools as specified by the MPEG-4.
ISO/IEC gives users of the MPEG-4 free license to this
software module or modifications thereof for use in hardware
or software products claiming conformance to the MPEG-4.
Those intending to use this software module in hardware or software
products are advised that its use may infringe existing patents.
The original developer of this software module and his/her company,
the subsequent editors and their companies, and ISO/IEC have no
liability for use of this software module or modifications thereof
in an implementation.
Copyright is not released for non MPEG-4 conforming
products. ETRI retains full right to use the code for his/her own
purpose, assign or donate the code to a third party and to
inhibit third parties from using the code for non
MPEG-4 conforming products.
This copyright notice must be included in all copies or
derivative works. Copyright (c) 1997.
*/
#include "stdafx.h"
#include "Modeless.h"
#include "ModelessDlg.h"
#include "ModelessOptDlg.h"
#include "LipSyncDlg.h"
#include "ModelessTextDlg.h"
#include "tts-structure.h"
#include "tts-bitstream.h"
#define TEXT_SYNC (int)0
#define VIDEO_SYNC (int)1
extern class CLipSyncDlg* pCLip;
extern class CModelessDlg* ppp;
extern class CModelessOptDlg* pOpt;
extern class CModelessTextDlg* pText;
extern int nFILE; // for Caption On/Off
extern int nS_MAX; // defined in ModelessOptDlg.cpp
extern float f_CURPOS_F, f_SPCHRATE;
extern int nFLAG_TRICK;
/******************** TTS Bit-Stream ********************/
extern int TTS_seq, TTS_sent;
extern short TTSinputType;
extern char TTSCmmd, Silence, Gender, Age, Speech_Rate, Niframe;
extern char Text[500], Phone[1000], Ptch[1000][3], Energy[1000][3], Lshape[1000];
extern short Sdur, Nphone, Dur[1000], SntDur, PinSnt, Offset, LinSnt[1000];
extern int v_st,v_ed,sp_st, sp_ed;
/* Bit assignment */
extern int BL_code, BP_en, BV_en, BL_en, BT_en;
extern int BSilence, BSdur;
extern int BTTSCmmd, BGender, BAge, BSpeech_Rate;
extern int BNtext, BText;
extern int BNphone, BPhone, BDur, BPtch, BEnergy;
extern int BSntDur, BPinSnt, BOffset;
extern int BNlip, BLinSnt, BLshape;
/******************** TTS Bit-Stream ********************/
extern BOOL SoundOutInit();
extern BOOL SoundOutUninit();
extern void VSayOneParagraph(TTS_Data *Tts, FRAME_Data *Frame, int *T_Sync);
extern void play(int nsp);
extern union SYN { short iwave[1024*32]; unsigned char buf[1024*64]; } syn;
FILE *Open_File();
void Init_Data();
void InitSliderBar(int nKind_Slider);
void Set_start_time(FILE *fp, int nPOS_MOV);
int rd_txt(FILE *fp, TTS_Data *Tts, FRAME_Data *Frame);
char **cmatrix(int nrh, int nch);
void free_cmatrix(char **m, int nrh, int nch);
void Idata_read(int *A, int n, int nbits, unsigned char *B, FILE *fp);
void Sdata_read(short *A, int n, int nbits, unsigned char *B, FILE *fp);
void Cdata_read(char *A, int n, int nbits, unsigned char *B, FILE *fp);
void CMdata_read(char **A, int n1, int n2, int nbits, unsigned char *B, FILE *fp);
void free_Data(FRAME_Data *Frame);
void Set_Slider_Pos(int *T_Sync);
int ChangeLip( FRAME_Data *Frame );
int IsVideo;
int T_Sync[3];
// T_Sync[0] == current time
// T_Sync[1] == total time
// T_Sync[2] == start time of Sentence
TTS_Data *Tts;
FRAME_Data *Frame;
SENTENCE_Data *Snt;
Prosody_Data *Prosody;
Video_Data *Video;
Lip_Data *Lip;
unsigned char YY[2];
FILE *Open_File()
{
int i; char c;
FILE *fp;
YY[0]=0; YY[1]=0;
if((fp=fopen("mpeg_tts.dat","rb"))==NULL) exit(1);
Idata_read(&i,1,32,YY,fp);
if(i!=TTS_seq) {
AfxMessageBox("Err in TTS_seq"); exit(1); }
Cdata_read(&(Tts->TTS_seq_id),1,BTTS_seq_id,YY,fp);
Sdata_read(&(Tts->L_code),1,BL_code,YY,fp);
Cdata_read(&(Tts->G_en),1,BG_en,YY,fp);
Cdata_read(&(Tts->A_en),1,BA_en,YY,fp);
Cdata_read(&(Tts->R_en),1,BR_en,YY,fp);
Cdata_read(&(Tts->P_en),1,BP_en,YY,fp);
Cdata_read(&(Tts->V_en),1,BV_en,YY,fp);
Cdata_read(&(Tts->L_en),1,BL_en,YY,fp);
Cdata_read(&(Tts->T_en),1,BT_en,YY,fp);
if(YY[1]!=0) { c=0; i=YY[1]; Cdata_read(&c,i,1,YY,fp); YY[1]=0; }
return(fp);
}
void Init_Data()
{
Tts=(TTS_Data *) malloc(sizeof(TTS_Data));
Frame=(FRAME_Data *) malloc(sizeof(FRAME_Data));
Frame->Sentence=NULL;
}
/* ------ InitSliderBar() ------ */
//
// MPEG-4 TTS Bit Stream狼 备炼俊 嘎霸 main control dialog狼 阿辆 滚瓢苞
// slider bar甫 檬扁拳 茄促.
//
// * MPEG4_Init() call this function.
//
void InitSliderBar(int nKind_Slider)
{
if (nKind_Slider == TEXT_SYNC)
{
// clear VideoSync Bar
ppp->m_slider_position.SetPos(0);
ppp->m_slider_position.ClearTics();
ppp->m_slider_position.SetRange(0, 0);
// initiate TextSync Slider Bar
ppp->m_slider_position_F.SetRange(0, nS_MAX-1);
ppp->m_slider_position_F.SetTicFreq(1);
ppp->m_slider_position_F.SetPos(0);
}
else // for Moving Picture
{
// clear TextSync Bar
ppp->m_slider_position_F.SetPos(0);
ppp->m_slider_position_F.ClearTics();
ppp->m_slider_position_F.SetRange(0, 0);
// initiate VideoSync Slider Bar
ppp->m_slider_position.SetRange(0, nS_MAX-1);
ppp->m_slider_position.SetTicFreq(1);
ppp->m_slider_position.SetPos(0);
}
// active play, backward, forward button
if( Tts->T_en )
{
ppp->m_editPlay.EnableWindow( TRUE );
ppp->m_editBackward.EnableWindow( TRUE );
ppp->m_editForward.EnableWindow( TRUE );
}
else
{
ppp->m_editStop.EnableWindow( TRUE );
ppp->m_editBackward.EnableWindow( FALSE );
ppp->m_editForward.EnableWindow( FALSE );
}
}
void Set_start_time(FILE *fp, int nPOS_MOV)
{
int i;
for(i=0; i<nPOS_MOV; i++) { rd_txt(fp,Tts,Frame); free_Data(Frame); }
v_st=nPOS_MOV*500;
}
int rd_txt(FILE *fp, TTS_Data *Tts, FRAME_Data *Frame)
{
int i, TTS_sent=0x012121212;
short Ntext, Sdur, Nphone, Nlip;
YY[0]=YY[1]=0;
Idata_read(&i,1,32,YY,fp);
if(i!=TTS_sent) return(0);
Sdata_read(&(Frame->TTS_id),1,BTTS_id,YY,fp);
Cdata_read(&Frame->Silence,1,BSilence,YY,fp);
if(Frame->Silence) {
Sdata_read(&Sdur,1,BSdur,YY,fp);
Frame->Silence=Sdur; Frame->Sentence=NULL;
YY[0]=YY[1]=0;
}
else {
Frame->Silence=0;
Frame->Sentence=Snt=(SENTENCE_Data *)malloc(sizeof(SENTENCE_Data));
Snt->Prosody=NULL; Snt->Video=NULL; Snt->Lip_shape=NULL;
if(Tts->G_en) {
Cdata_read(&Snt->Gender,1,BGender,YY,fp);
}
else Snt->Gender = 0; // default gender is female
if(Tts->A_en) {
Cdata_read(&Snt->Age,1,BAge,YY,fp);
}
else Snt->Age = 4;
if(!Tts->V_en && Tts->R_en) {
Cdata_read(&Snt->Speech_Rate,1,BSpeech_Rate,YY,fp);
// Speech Rate Slider Bar Control
if(pOpt->m_check_default.GetCheck() || !Tts->T_en)
pOpt->m_slider_SpchRate.SetPos(Snt->Speech_Rate);
}
else Snt->Speech_Rate = 3;
Sdata_read(&Ntext,1,BNtext,YY,fp); Snt->Ntext=Ntext;
Snt->Text=(char *)malloc(Ntext+2);
Cdata_read(Snt->Text,Ntext,BText,YY,fp); Snt->Text[Ntext]=0;
if(Tts->P_en) {
Snt->Prosody=Prosody=(Prosody_Data *)malloc(sizeof(Prosody_Data));
Cdata_read(&(Prosody->Dur_en),1,BDur_en,YY,fp);
Cdata_read(&(Prosody->F0_en),1,BF0_en,YY,fp);
Cdata_read(&(Prosody->En_en),1,BEn_en,YY,fp);
Sdata_read(&Nphone,1,BNphone,YY,fp); Prosody->Nphone=Nphone;
Sdata_read(&(Prosody->Sphone),1,BSphone,YY,fp);
i=Prosody->Sphone;
Prosody->Phone=(char *)malloc((i+2));
Cdata_read(Prosody->Phone,i,BPhone,YY,fp);
if(Prosody->Dur_en) {
Prosody->Dur=(short *)malloc((Nphone+2)*2);
Sdata_read(Prosody->Dur,Nphone,BDur,YY,fp);
}
else Prosody->Dur=NULL;
if(Prosody->F0_en) {
Prosody->Ptch=cmatrix(Nphone+2,3);
CMdata_read(Prosody->Ptch,Nphone,3,BPtch,YY,fp);
}
else Prosody->Ptch=NULL;
if(Prosody->En_en) {
Prosody->Energy=cmatrix(Nphone+2,3);
CMdata_read(Prosody->Energy,Nphone,3,BEnergy,YY,fp);
}
else Prosody->Energy=NULL;
}
if(Tts->V_en) {
Snt->Video=Video=(Video_Data *) malloc(sizeof(Video_Data));
Sdata_read(&Video->SntDur,1,BSntDur,YY,fp);
Sdata_read(&Video->PinSnt,1,BPinSnt,YY,fp);
Sdata_read(&Video->Offset,1,BOffset,YY,fp);
}
if(Tts->L_en) {
Snt->Lip_shape=Lip=(Lip_Data *)malloc(sizeof(Lip_Data));
Sdata_read(&Nlip,1,BNlip,YY,fp); Lip->Nlip=Nlip;
Lip->LinSnt=(short *)malloc((Nlip+2)*2);
Sdata_read(Lip->LinSnt,Nlip,BLinSnt,YY,fp);
Lip->Lshape=(char *)malloc(Nlip+2);
Cdata_read(Lip->Lshape,Nlip,BLshape,YY,fp);
}
YY[0]=0; YY[1]=0;
}
return(1);
}
/* ------ MPEG4_Init() ------ */
//
// MPEG4-TTS Bit Stream阑 佬绢甸咯 绢恫 规侥栏肺 encoding 登菌绰啊甫
// 魄窜窍哥, 阿 版快俊 蝶扼 鞘夸茄 檬扁拳 累诀阑 秦霖促.
//
// * 寇何 橇肺弊伐苞 流立 牢磐其捞胶窃
//
int MPEG4_Init()
{
int i, j=0;
FILE *fp;
Init_Data();
fp=Open_File();
while( (i=rd_txt(fp,Tts,Frame)) != 0 ) {
j++; free_Data(Frame);
}
v_ed=500*j; fclose( fp );
if( Tts->T_en ) nFLAG_TRICK = TRUE;
else nFLAG_TRICK = FALSE;
IsVideo = Tts->V_en; // ModelessDlg.cpp 俊辑 荤侩
MessageBox(NULL, "MPEG-4 TTS Data Decoding O.K", "MPEG4_TTS", MB_OK);
nS_MAX=0;
pOpt->m_check_default.SetCheck(1);
if(Tts->V_en) // for Moving Picture
{
nS_MAX = (int)(v_ed/500);
// Init VideoSync Bar
InitSliderBar(1);
T_Sync[1] = v_ed * 16;
}
else // for Text Only
{
nS_MAX = j;
// Init TextSync Bar
InitSliderBar(0);
}
return(nFLAG_TRICK);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -