Files
bluray/tools.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"
}
}