231 lines
6.6 KiB
C
Executable File
231 lines
6.6 KiB
C
Executable File
/*
|
|
* Copyright (c) 2008-2016 Allwinner Technology Co. Ltd.
|
|
* All rights reserved.
|
|
*
|
|
* File : sdecoder.h
|
|
* Description :
|
|
* History :
|
|
* Author : xyliu <xyliu@allwinnertech.com>
|
|
* Date : 2016/04/13
|
|
* Comment :
|
|
*
|
|
*
|
|
*/
|
|
|
|
#ifndef SDECODER_H
|
|
#define SDECODER_H
|
|
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct PALETTEINFO
|
|
{
|
|
int bValid;
|
|
int nEntryCount;
|
|
int entry[32];
|
|
}PaletteInfo;
|
|
|
|
typedef enum SUBTITLECODEC
|
|
{
|
|
SUBTITLE_CODEC_UNKNOWN = 0,
|
|
SUBTITLE_CODEC_DVDSUB = 0x100,
|
|
SUBTITLE_CODEC_IDXSUB,
|
|
SUBTITLE_CODEC_PGS,
|
|
SUBTITLE_CODEC_DIVX,
|
|
SUBTITLE_CODEC_DVBSUB,
|
|
|
|
SUBTITLE_CODEC_TXT = 0x200,
|
|
SUBTITLE_CODEC_TIMEDTEXT,
|
|
SUBTITLE_CODEC_SSA,
|
|
SUBTITLE_CODEC_SMI,
|
|
SUBTITLE_CODEC_SRT,
|
|
|
|
}ESubtitleCodec;
|
|
|
|
typedef enum SUBTITLETEXTFORMAT
|
|
{
|
|
SUBTITLE_TEXT_FORMAT_UNKNOWN = 0,
|
|
SUBTITLE_TEXT_FORMAT_UTF8,
|
|
SUBTITLE_TEXT_FORMAT_GB2312,
|
|
SUBTITLE_TEXT_FORMAT_UTF16LE,
|
|
SUBTITLE_TEXT_FORMAT_UTF16BE,
|
|
SUBTITLE_TEXT_FORMAT_UTF32LE,
|
|
SUBTITLE_TEXT_FORMAT_UTF32BE,
|
|
SUBTITLE_TEXT_FORMAT_BIG5,
|
|
SUBTITLE_TEXT_FORMAT_GBK,
|
|
SUBTITLE_TEXT_FORMAT_ANSI,
|
|
//* TO BE ADD.
|
|
|
|
}ESubtitleTextFormat;
|
|
|
|
typedef enum SUBTITLEPIXELFORMAT
|
|
{
|
|
SUBTITLE_PIXEL_FORMAT_ARGB,
|
|
SUBTITLE_PIXEL_FORMAT_YUV,
|
|
|
|
}ESubtitlePixelFormat;
|
|
|
|
//*TimedText.java, public final class TimedText will copy the following definitions,
|
|
// so don't change value, if change, must modify TimedText.java to match.
|
|
typedef enum SUBTITLE_ALIGNMENT
|
|
{
|
|
SUBTITLE_ALIGNMENT_UNKNOWN = 0x0,
|
|
SUBTITLE_ALIGNMENT_TOP_LEFT = 0x11,
|
|
SUBTITLE_ALIGNMENT_TOP_MIDDLE = 0x12,
|
|
SUBTITLE_ALIGNMENT_TOP_RIGHT = 0x13,
|
|
SUBTITLE_ALIGNMENT_MIDDLE_LEFT = 0x21,
|
|
SUBTITLE_ALIGNMENT_MIDDLE_MIDDLE = 0x22,
|
|
SUBTITLE_ALIGNMENT_MIDDLE_RIGHT = 0x23,
|
|
SUBTITLE_ALIGNMENT_BOTTOM_LEFT = 0x31,
|
|
SUBTITLE_ALIGNMENT_BOTTOM_MIDDLE = 0x32,
|
|
SUBTITLE_ALIGNMENT_BOTTOM_RIGHT = 0x33,
|
|
}ESubtitleAlignment;
|
|
|
|
#define SUBTITLE_FONT_NAME_EPILOG "epilog"
|
|
#define SUBTITLE_FONT_NAME_VERDANA "verdana"
|
|
#define SUBTITLE_FONT_NAME_GEORGIA "georgia"
|
|
#define SUBTITLE_FONT_NAME_ARIAL "arial"
|
|
#define SUBTITLE_FONT_NAME_TIMES_NEW_ROMAN "times new roman"
|
|
|
|
//* subtitle stream information.
|
|
#define SUBBITLE_DECODER_MAX_LANG_CHAR_SIZE 64
|
|
typedef struct SUBTITLESTREAMINFO
|
|
{
|
|
int nStreamIndex;
|
|
unsigned char strLang[SUBBITLE_DECODER_MAX_LANG_CHAR_SIZE]; //* codec in ANSI
|
|
|
|
//* stream source.
|
|
int bExternal;
|
|
char* pUrl;
|
|
int fd;
|
|
int nFdOffset;
|
|
int nFdLength;
|
|
int fdSub; //* for index+sub subtitle stream's .sub file.
|
|
int nLanguageIndex; //* select a stream in a multi stream text file,
|
|
|
|
//* CODEC format.
|
|
ESubtitleCodec eCodecFormat; //* how is the subtitle stream coded.
|
|
ESubtitleTextFormat eTextFormat; //* how is the text in subtitle stream coded.
|
|
|
|
int nReferenceVideoWidth;
|
|
int nReferenceVideoHeight;
|
|
int nReferenceVideoFrameRate;
|
|
PaletteInfo sPaletteInfo;
|
|
|
|
int nCodecSpecificDataLen;
|
|
char* pCodecSpecificData;
|
|
}SubtitleStreamInfo;
|
|
|
|
//* subtitle item for render.
|
|
typedef struct SUBTITLEITEM SubtitleItem;
|
|
struct SUBTITLEITEM
|
|
{
|
|
int nItemId; //* item id for buffer management.
|
|
|
|
//* time control.
|
|
int64_t nPts;
|
|
int64_t nDuration;
|
|
|
|
//* position control.
|
|
int nReferenceVideoWidth;
|
|
int nReferenceVideoHeight;
|
|
ESubtitleAlignment eAlignment;
|
|
int nMarginL;
|
|
int nMarginR;
|
|
int nMarginV;
|
|
int nStartX; //* if eAlignment == SUBTITLE_ALIGNMENT_UNKNOWN,
|
|
int nStartY; //* use nStartX/nStartY/nEndX/nEndY to control
|
|
int nEndX; //* subtitle position.
|
|
int nEndY;
|
|
|
|
//* font style.
|
|
int nFontSize;
|
|
//* 0 means don't care.
|
|
int bBold;
|
|
//* -1 means don't care.
|
|
int bItalic;
|
|
//* -1 means don't care.
|
|
int bUnderlined;
|
|
//* -1 means don't care.
|
|
unsigned int nPrimaryColor;
|
|
//* ARGB, 0 means don't care.
|
|
unsigned int nSecondaryColor;
|
|
//* ARGB, 0 means don't care.
|
|
char strFontName[SUBBITLE_DECODER_MAX_LANG_CHAR_SIZE];
|
|
//* SUBTITLE_FONT_NAME_X,
|
|
|
|
//* subtitle content.
|
|
int bText;
|
|
//* 0 means bitmap, 1 means text.
|
|
char* pText;
|
|
int nTextLength;
|
|
//* in unit of bytes.
|
|
ESubtitleTextFormat eTextFormat;
|
|
char* pBitmapData;
|
|
int nBitmapWidth;
|
|
//* for bitmap subtitle item.
|
|
int nBitmapHeight;
|
|
//* for bitmap subtitle item.
|
|
ESubtitlePixelFormat ePixelFormat;
|
|
//* currently output ARGB only.
|
|
};
|
|
|
|
typedef struct SUBTITLESTREAMDATAINFO
|
|
{
|
|
char* pData;
|
|
int nLength;
|
|
int64_t nPts;
|
|
int64_t nPcr;
|
|
int64_t nDuration;
|
|
}SubtitleStreamDataInfo;
|
|
|
|
typedef void* SubtitleDecoder;
|
|
|
|
//* memory for stream info is allocated inside, user should free it.
|
|
int ProbeSubtitleStream(const char* strFilePath,
|
|
SubtitleStreamInfo** ppStreamInfo,
|
|
int* pStreamCount);
|
|
|
|
int ProbeSubtitleStreamFd(int fd,int offet,
|
|
int len,
|
|
SubtitleStreamInfo** ppStreamInfo,
|
|
int* pStreamCount);
|
|
|
|
//* create a subtitle decoder for a subtitle stream.
|
|
SubtitleDecoder* CreateSubtitleDecoder(SubtitleStreamInfo* pStreamInfo);
|
|
|
|
//* destroy a subtitle decoder.
|
|
void DestroySubtitleDecoder(SubtitleDecoder* p);
|
|
|
|
//* reset a decoder, for seek operation.
|
|
void ResetSubtitleDecoder(SubtitleDecoder* p, int64_t nSeekTime);
|
|
|
|
typedef enum ESUBTITLERESULT
|
|
{
|
|
SDECODE_RESULT_UNSUPPORTED = -2,
|
|
SDECODE_RESULT_FAIL = -1,
|
|
SDECODE_RESULT_OK = 0,
|
|
SDECODE_RESULT_FRAME_DECODED = 1,
|
|
SDECODE_RESULT_NO_FRAME_BUFFER = 4,
|
|
}ESubtResult;
|
|
|
|
int DecodeSubtitleStream(SubtitleDecoder* p,
|
|
SubtitleStreamDataInfo* pStreamData);
|
|
|
|
SubtitleItem* NextSubtitleItem(SubtitleDecoder* p);
|
|
|
|
SubtitleItem* RequestSubtitleItem(SubtitleDecoder* p);
|
|
|
|
void FlushSubtitleItem(SubtitleDecoder* p, SubtitleItem* pItem);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|