251 lines
5.8 KiB
Go
251 lines
5.8 KiB
Go
package bluray
|
|
|
|
/*
|
|
#cgo pkg-config: libbluray
|
|
#include <libbluray/bluray.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
*/
|
|
import "C"
|
|
import "unsafe"
|
|
|
|
func cStringToGoString(cStr *C.char) *string {
|
|
if cStr == nil {
|
|
return nil
|
|
}
|
|
str := C.GoString(cStr)
|
|
return &str
|
|
}
|
|
|
|
func getLanguageCode(langField [4]C.uint8_t) string {
|
|
isEmpty := true
|
|
for _, b := range langField {
|
|
if b != 0 {
|
|
isEmpty = false
|
|
break
|
|
}
|
|
}
|
|
if isEmpty {
|
|
return "und"
|
|
}
|
|
return C.GoStringN((*C.char)(unsafe.Pointer(&langField[0])), 3)
|
|
}
|
|
|
|
// getCodingStrings 获取编码类型
|
|
// 输出: 编码类型, AUDIO/VIDEO/SUB
|
|
func getCodingStrings(codingField C.uint8_t) (string, string) {
|
|
switch codingField {
|
|
case C.BLURAY_STREAM_TYPE_VIDEO_MPEG1:
|
|
return "MPEG1", "VIDEO"
|
|
case C.BLURAY_STREAM_TYPE_VIDEO_MPEG2:
|
|
return "MPEG2", "VIDEO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_MPEG1:
|
|
return "MPEG1", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_MPEG2:
|
|
return "MPEG2", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_LPCM:
|
|
return "LPCM", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_AC3:
|
|
return "AC3", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_DTS:
|
|
return "DTS", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_TRUHD:
|
|
return "TrueHD", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_AC3PLUS:
|
|
return "AC3+", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_DTSHD:
|
|
return "DTS-HD", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_DTSHD_MASTER:
|
|
return "DTS-HD Master", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_VIDEO_VC1:
|
|
return "VC1", "VIDEO"
|
|
case C.BLURAY_STREAM_TYPE_VIDEO_H264:
|
|
return "H264", "VIDEO"
|
|
case C.BLURAY_STREAM_TYPE_VIDEO_HEVC:
|
|
return "HEVC", "VIDEO"
|
|
case C.BLURAY_STREAM_TYPE_SUB_PG:
|
|
return "PG", "SUB"
|
|
case C.BLURAY_STREAM_TYPE_SUB_IG:
|
|
return "IG", "SUB"
|
|
case C.BLURAY_STREAM_TYPE_SUB_TEXT:
|
|
return "TEXT", "SUB"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_AC3PLUS_SECONDARY:
|
|
return "AC3+ Secondary", "AUDIO"
|
|
case C.BLURAY_STREAM_TYPE_AUDIO_DTSHD_SECONDARY:
|
|
return "DTS-HD Secondary", "AUDIO"
|
|
default:
|
|
return "UNKNOWN", "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// getCodingString 获取编码类型
|
|
// 输出: 编码类型
|
|
func getCodingString(codingField C.uint8_t) string {
|
|
coding, _ := getCodingStrings(codingField)
|
|
return coding
|
|
}
|
|
|
|
// getVideoFormatString 获取视频格式
|
|
func getVideoFormatString(formatField C.uint8_t) string {
|
|
switch formatField {
|
|
case C.BLURAY_VIDEO_FORMAT_480I:
|
|
return "480i"
|
|
case C.BLURAY_VIDEO_FORMAT_576I:
|
|
return "576i"
|
|
case C.BLURAY_VIDEO_FORMAT_480P:
|
|
return "480p"
|
|
case C.BLURAY_VIDEO_FORMAT_1080I:
|
|
return "1080i"
|
|
case C.BLURAY_VIDEO_FORMAT_720P:
|
|
return "720p"
|
|
case C.BLURAY_VIDEO_FORMAT_1080P:
|
|
return "1080p"
|
|
case C.BLURAY_VIDEO_FORMAT_576P:
|
|
return "576p"
|
|
case C.BLURAY_VIDEO_FORMAT_2160P:
|
|
return "2160p"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// getAudioFormatString 获取音频格式
|
|
func getAudioFormatString(formatField C.uint8_t) string {
|
|
switch formatField {
|
|
case C.BLURAY_AUDIO_FORMAT_MONO:
|
|
return "Mono"
|
|
case C.BLURAY_AUDIO_FORMAT_STEREO:
|
|
return "Stereo"
|
|
case C.BLURAY_AUDIO_FORMAT_MULTI_CHAN:
|
|
return "Multi-channel"
|
|
case C.BLURAY_AUDIO_FORMAT_COMBO:
|
|
return "Combo" // Stereo ac3/dts,
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// getAudioRateString 获取视频帧率
|
|
func getVideoRateString(rateField C.uint8_t) string {
|
|
switch rateField {
|
|
case C.BLURAY_VIDEO_RATE_24000_1001:
|
|
return "23.976 Hz"
|
|
case C.BLURAY_VIDEO_RATE_24:
|
|
return "24 Hz"
|
|
case C.BLURAY_VIDEO_RATE_25:
|
|
return "25 Hz"
|
|
case C.BLURAY_VIDEO_RATE_30000_1001:
|
|
return "29.97 Hz"
|
|
case C.BLURAY_VIDEO_RATE_50:
|
|
return "50 Hz"
|
|
case C.BLURAY_VIDEO_RATE_60000_1001:
|
|
return "59.94 Hz"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// getVideoRateFloat 获取视频帧率(浮点数)
|
|
func getVideoRateFloat(rateField C.uint8_t) float64 {
|
|
switch rateField {
|
|
case C.BLURAY_VIDEO_RATE_24000_1001:
|
|
return 23.976
|
|
case C.BLURAY_VIDEO_RATE_24:
|
|
return 24
|
|
case C.BLURAY_VIDEO_RATE_25:
|
|
return 25
|
|
case C.BLURAY_VIDEO_RATE_30000_1001:
|
|
return 29.97
|
|
case C.BLURAY_VIDEO_RATE_50:
|
|
return 50
|
|
case C.BLURAY_VIDEO_RATE_60000_1001:
|
|
return 59.94
|
|
default:
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// getAudioRateString 获取音频采样率
|
|
func getAudioRateString(rateField C.uint8_t) string {
|
|
switch rateField {
|
|
case C.BLURAY_AUDIO_RATE_48:
|
|
return "48 kHz"
|
|
case C.BLURAY_AUDIO_RATE_96:
|
|
return "96 kHz"
|
|
case C.BLURAY_AUDIO_RATE_192:
|
|
return "192 kHz"
|
|
case C.BLURAY_AUDIO_RATE_192_COMBO:
|
|
return "192 kHz Combo"
|
|
case C.BLURAY_AUDIO_RATE_96_COMBO:
|
|
return "96 kHz Combo"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// getAudioRateFloat 获取音频采样率(浮点数)
|
|
func getAudioRateFloat(rateField C.uint8_t) int {
|
|
switch rateField {
|
|
case C.BLURAY_AUDIO_RATE_48:
|
|
return 48
|
|
case C.BLURAY_AUDIO_RATE_96:
|
|
return 96
|
|
case C.BLURAY_AUDIO_RATE_192:
|
|
return 192
|
|
case C.BLURAY_AUDIO_RATE_192_COMBO:
|
|
return 192
|
|
case C.BLURAY_AUDIO_RATE_96_COMBO:
|
|
return 96
|
|
default:
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// getCharCodeString 获取字符编码
|
|
func getCharCodeString(charCode C.uint8_t) string {
|
|
switch charCode {
|
|
case C.BLURAY_TEXT_CHAR_CODE_UTF8:
|
|
return "UTF-8"
|
|
case C.BLURAY_TEXT_CHAR_CODE_UTF16BE:
|
|
return "UTF-16BE"
|
|
case C.BLURAY_TEXT_CHAR_CODE_SHIFT_JIS:
|
|
return "Shift-JIS"
|
|
case C.BLURAY_TEXT_CHAR_CODE_EUC_KR:
|
|
return "EUC-KR"
|
|
case C.BLURAY_TEXT_CHAR_CODE_GB18030_20001:
|
|
return "GB18030-2001"
|
|
case C.BLURAY_TEXT_CHAR_CODE_CN_GB:
|
|
return "CN-GB"
|
|
case C.BLURAY_TEXT_CHAR_CODE_BIG5:
|
|
return "BIG5"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// getAspectRatioString 获取视频宽高比
|
|
func getAspectRatioString(aspectField C.uint8_t) string {
|
|
switch aspectField {
|
|
case C.BLURAY_ASPECT_RATIO_4_3:
|
|
return "4:3"
|
|
case C.BLURAY_ASPECT_RATIO_16_9:
|
|
return "16:9"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|
|
|
|
// getStillModeString Clip still mode type
|
|
func getStillModeString(stillMode C.uint8_t) string {
|
|
switch stillMode {
|
|
case C.BLURAY_STILL_NONE:
|
|
return "None"
|
|
case C.BLURAY_STILL_TIME:
|
|
return "Time"
|
|
case C.BLURAY_STILL_INFINITE:
|
|
return "Infinite"
|
|
default:
|
|
return "UNKNOWN"
|
|
}
|
|
}
|