package netmanager.lib.playmanager;

import java.util.Arrays;
import java.util.List;

import com.sun.jna.Pointer;
import com.sun.jna.Structure;

import netmanager.lib.LLONG;

public class PlayStructs {

    //////////////////////////////////////////////////////////////////////////////////////
    public static class SYSTEMTIME extends Structure {
        public short wYear;
        public short wMonth;
        public short wDayOfWeek;
        public short wDay;
        public short wHour;
        public short wMinute;
        public short wSecond;
        public short wMilliseconds;

        @Override
		protected List<String> getFieldOrder() {
            return Arrays.asList(new String[]{"wYear", "wMonth", "wDayOfWeek", "wDay",
                    "wHour", "wMinute", "wSecond", "wMilliseconds"});
        }

        public static class ByReference extends SYSTEMTIME implements Structure.ByReference {
        }

        public static class ByValue extends SYSTEMTIME implements Structure.ByValue {
        }
    }

    ;

    // 帧定位信息
    public static class FRAME_POS_INFO extends Structure {
        public LLONG nFilePos;                // 帧在文件中的偏移位置
        public int nFrameLen;                // 帧长度
        public int nFrameNum;                // 帧序号
        public int nFrameTime;                // 帧时间
        public int nErrorFrameNum;            // 未启用
        public Pointer pErrorTime;                // 未启用，SYSTEMTIME
        public int nErrorLostFrameNum;        // 未启用
        public int nErrorFrameSize;        // 未启用

        @Override
		protected List<String> getFieldOrder() {
            return Arrays.asList(new String[]{"nFilePos", "nFrameLen", "nFrameNum", "nFrameTime",
                    "nErrorFrameNum", "pErrorTime", "nErrorLostFrameNum", "nErrorFrameSize"});
        }

        public static class ByReference extends FRAME_POS_INFO implements Structure.ByReference {
        }

        public static class ByValue extends FRAME_POS_INFO implements Structure.ByValue {
        }
    }

    ;

    // 解码帧属性信息
    public static class FRAME_ATTRI_INFO extends Structure {
        public int nWidth;                    // 画面宽,单位像素
        public int nHeight;                // 画面高,单位像素
        public int nStamp;                    // 时标信息,单位毫秒
        public int nType;                    // 视频帧类型,TYPE_IYUV,TYPE_AUDIODATA_16,TYPE_RGB32
        public int nFrameRate;                // 图像帧率

        @Override
		protected List<String> getFieldOrder() {
            return Arrays.asList(new String[]{"nWidth", "nHeight", "nStamp", "nType", "nFrameRate"});
        }

        public static class ByReference extends FRAME_POS_INFO implements Structure.ByReference {
        }

        public static class ByValue extends FRAME_POS_INFO implements Structure.ByValue {
        }
    }

    ;

    // 解码帧属性信息
    public static class FRAME_ATTRI_INFO_EX extends Structure {
        public int nFrameType;                    // 帧类型
        // 1 - MEDIA_FRAME_TYPE_VIDEO（视频帧）
        // 2 - MEDIA_FRAME_TYPE_AUDIO（音频帧）
        public int nSubFrameType;                // 帧子类型（参见 ENUM_SUB_FRAME_TYPE 枚举值）
        public int nEncodeType;                // 解码类型（参见 ENUM_VIDEO_ENCODE_TYPE 枚举值）
        public int nStreamType;                // 码流封装类型（参见 ENUM_STREAM_PACKAGE_TYPE 枚举值）

        public Pointer pFrameData;                    // 帧数据
        public int nFrameDataLen;                // 帧数据长度
        public Pointer pFrameBodyData;                // 帧裸数据
        public int nFrameBodyLen;                // 帧裸数据长度

        public int nFrameSeq;                    // 帧序号
        public int nStamp;                        // 时标信息(单位:ms)
        public int nWidth;                        // 面宽(单位:像素)
        public int nHeight;                    // 画面高(单位:像素)
        public int nFrameRate;                    // 图像帧率
        public int nChannels;                    // 音频通道数
        public int nBitPerSample;                // 音频采样位数
        public int nSamplesPerSec;                // 音频采样频率
        public int nRemainData;                // 缓冲剩余数据量
        public SYSTEMTIME nDataTime;                    // 时间
        public int[] nReserved = new int[48];    // 保留位

        @Override
		protected List<String> getFieldOrder() {
            return Arrays.asList(new String[]{"nFrameType", "nSubFrameType", "nEncodeType", "nStreamType",
                    "pFrameData", "nFrameDataLen", "pFrameBodyData", "nFrameBodyLen", "nFrameSeq", "nStamp",
                    "nWidth", "nHeight", "nFrameRate", "nChannels", "nBitPerSample", "nSamplesPerSec",
                    "nRemainData", "nDataTime", "nReserved"});
        }

        public static class ByReference extends FRAME_POS_INFO implements Structure.ByReference {
        }

        public static class ByValue extends FRAME_POS_INFO implements Structure.ByValue {
        }
    }

    ;

    // 解码帧内容
    public static class FRAME_DEC_INFO extends Structure {
        public int nFrameType;                            // 帧类型
        // 1 - MEDIA_FRAME_TYPE_VIDEO（视频帧）
        // 2 - MEDIA_FRAME_TYPE_AUDIO（音频帧）
        public int nSubFrameType;                        // 帧子类型（参见 ENUM_SUB_FRAME_TYPE 枚举值）

        public Pointer pAudioData;                            // 音频数据（音频帧有效）
        public int nAudioDataLen;                        // 音频数据长度

        public Pointer[] pVideoData = new Pointer[3];        // 分别表示视频的YUV三个分量（视频帧有效）
        public int[] nStride = new int[3];                // 分别表示YUV三个分量的跨距（视频帧有效）
        public int[] nWidth = new int[3];                // 分别表示YUV三个分量的宽度（视频帧有效）
        public int[] nHeight = new int[3];                // 分别表示YUV三个分量的高度（视频帧有效）
        public int[] nReserved = new int[64];            // 保留位

        @Override
		protected List<String> getFieldOrder() {
            return Arrays.asList(new String[]{"nFrameType", "nSubFrameType", "pAudioData",
                    "nAudioDataLen", "pVideoData", "nStride", "nWidth", "nHeight", "nReserved"});
        }

        public static class ByReference extends FRAME_DEC_INFO implements Structure.ByReference {
        }

        public static class ByValue extends FRAME_DEC_INFO implements Structure.ByValue {
        }
    }

    ;
}
