summaryrefslogtreecommitdiff
path: root/dlna/profiles/mpeg2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dlna/profiles/mpeg2.cpp')
-rw-r--r--dlna/profiles/mpeg2.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/dlna/profiles/mpeg2.cpp b/dlna/profiles/mpeg2.cpp
new file mode 100644
index 0000000..2816095
--- /dev/null
+++ b/dlna/profiles/mpeg2.cpp
@@ -0,0 +1,216 @@
+/*
+ * File: profiles_mpeg2.cpp
+ * Author: savop
+ *
+ * Created on 7. Dezember 2009, 13:35
+ */
+
+#include "profiles/mpeg2.h"
+#include "profiles/container.h"
+#include "util.h"
+#include "profiles/ac3.h"
+#include "avdetector.h"
+
+AcceptedBitrates DLNA_VIDEOBITRATES_MPEG2_TS_NA_SYSTEM = { true, {1, Mbps(19.3927)}};
+AcceptedBitrates DLNA_VIDEOBITRATES_MPEG2_TS_EU = { true, {1, Mbps(15)}};
+AcceptedBitrates DLNA_VIDEOBITRATES_MPEG2_PS = { true, {1, Mbps(9.80)}};
+
+AcceptedResolution DLNA_RESOLUTIONS_MPEG2_PAL[] = { { 720, 576, 25, 1 },
+ { 704, 576, 25, 1 }, ///< compatibility mode for PAL
+ { 544, 576, 25, 1 },
+ { 480, 576, 25, 1 },
+ { 352, 576, 25, 1 },
+ { 352, 288, 25, 1 } };
+AcceptedResolution DLNA_RESOLUTIONS_MPEG2_NTSC_SD[] = { { 720, 480, 30, 1001},
+ { 704, 480, 30, 1001},
+ { 704, 480, 30, 1},
+ { 704, 480, 24, 1001},
+ { 704, 480, 24, 1},
+ { 640, 480, 30, 1001},
+ { 640, 480, 30, 1},
+ { 640, 480, 24, 1001},
+ { 640, 480, 24, 1},
+ { 544, 480, 30, 1001},
+ { 480, 480, 30, 1001},
+ { 352, 480, 30, 1001} };
+AcceptedResolution DLNA_RESOLUTIONS_MPEG2_NTSC_HD[] = { { 1920, 1080, 30, 1001},
+ { 1920, 1080, 30, 1},
+ { 1920, 1080, 24, 1001},
+ { 1920, 1080, 24, 1},
+ { 1280, 720, 30, 1001},
+ { 1280, 720, 30, 1},
+ { 1280, 720, 24, 1001},
+ { 1280, 720, 24, 1},
+ { 1440, 1080, 30, 1001},
+ { 1440, 1080, 30, 1},
+ { 1440, 1080, 24, 1001},
+ { 1440, 1080, 24, 1},
+ { 1280, 1080, 30, 1001},
+ { 1280, 1080, 30, 1},
+ { 1280, 1080, 24, 1001},
+ { 1280, 1080, 24, 1} };
+
+DLNAProfile DLNA_PROFILE_MPEG_PS_NTSC = { "MPEG_PS_NTSC", "video/mpeg" };
+DLNAProfile DLNA_PROFILE_MPEG_PS_NTSC_XAC3 = { "MPEG_PS_NTSC_XAC3", "video/mpeg" };
+DLNAProfile DLNA_PROFILE_MPEG_PS_PAL = { "MPEG_PS_PAL", "video/mpeg" };
+DLNAProfile DLNA_PROFILE_MPEG_PS_PAL_XAC3 = { "MPEG_PS_PAL_XAC3", "video/mpeg"};
+
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_NA = { "MPEG_TS_SD_NA", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_NA_T = { "MPEG_TS_SD_NA_T", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_NA_ISO = { "MPEG_TS_SD_NA_ISO", "video/mpeg"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_HD_NA = { "MPEG_TS_HD_NA", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_HD_NA_T = { "MPEG_TS_HD_NA_T", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_HD_NA_ISO = { "MPEG_TS_HD_NA_ISO", "video/mpeg"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_NA_XAC3 = { "MPEG_TS_SD_NA_XAC3", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_NA_XAC3_T = { "MPEG_TS_SD_NA_XAC3_T", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_NA_XAC3_ISO = { "MPEG_TS_SD_NA_XAC3_ISO", "video/mpeg"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_HD_NA_XAC3 = { "MPEG_TS_HD_NA_XAC3", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_HD_NA_XAC3_T = { "MPEG_TS_HD_NA_XAC3_T", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_HD_NA_XAC3_ISO = { "MPEG_TS_HD_NA_XAC3_ISO", "video/mpeg"};
+
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_EU = { "MPEG_TS_SD_EU", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_EU_T = { "MPEG_TS_SD_EU_T", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_SD_EU_ISO = { "MPEG_TS_SD_EU_ISO", "video/mpeg"};
+
+// The Korean profiles are almost identical to the north american profiles.
+//DLNAProfile DLNA_PROFILE_MPEG_TS_SD_KO = { "MPEG_TS_SD_KO", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_SD_KO_T = { "MPEG_TS_SD_KO_T", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_SD_KO_ISO = { "MPEG_TS_SD_KO_ISO", "video/mpeg"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_HD_KO = { "MPEG_TS_HD_KO", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_HD_KO_T = { "MPEG_TS_HD_KO_T", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_HD_KO_ISO = { "MPEG_TS_HD_KO_ISO", "video/mpeg"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_SD_KO_XAC3 = { "MPEG_TS_SD_KO_XAC3", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_SD_KO_XAC3_T = { "MPEG_TS_SD_KO_XAC3_T", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_SD_KO_XAC3_ISO = { "MPEG_TS_SD_KO_XAC3_ISO", "video/mpeg"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_HD_KO_XAC3 = { "MPEG_TS_HD_KO_XAC3", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_HD_KO_XAC3_T = { "MPEG_TS_HD_KO_XAC3_T", "video/vnd.dlna.mpeg-tts"};
+//DLNAProfile DLNA_PROFILE_MPEG_TS_HD_KO_XAC3_ISO = { "MPEG_TS_HD_KO_XAC3_ISO", "video/mpeg"};
+
+DLNAProfile DLNA_PROFILE_MPEG_TS_MP_LL_AAC = { "MPEG_TS_MP_LL_AAC", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_MP_LL_AAC_T = { "MPEG_TS_MP_LL_AAC_T", "video/vnd.dlna.mpeg-tts"};
+DLNAProfile DLNA_PROFILE_MPEG_TS_MP_LL_AAC_ISO = { "MPEG_TS_MP_LL_AAC_ISO", "video/mpeg"};
+
+// The Elementary Stream profiles are currently not supported as they are only supported within RTP streaming
+//DLNAProfile DLNA_PROFILE_MPEG_ES_PAL = { "MPEG_ES_PAL", "video/mpeg"};
+//DLNAProfile DLNA_PROFILE_MPEG_ES_NTSC = { "MPEG_ES_NTSC", "video/mpeg"};
+//DLNAProfile DLNA_PROFILE_MPEG_ES_PAL_XAC3 = { "MPEG_ES_PAL_XAC3", "video/mpeg"};
+//DLNAProfile DLNA_PROFILE_MPEG_ES_NTSC_XAC3 = { "MPEG_ES_NTSC_XAC3", "video/mpeg"};
+
+DLNAVideoMapping MPEG2_VIDEO_MAP[] = {
+ { &DLNA_PROFILE_MPEG_PS_NTSC, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_LPCM},
+ { &DLNA_PROFILE_MPEG_PS_NTSC, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_MPEG1_L2},
+ { &DLNA_PROFILE_MPEG_PS_NTSC, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_MPEG2_L2},
+ { &DLNA_PROFILE_MPEG_PS_NTSC, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_PS_NTSC_XAC3, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_PS_PAL, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_LPCM},
+ { &DLNA_PROFILE_MPEG_PS_PAL, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG1_L2},
+ { &DLNA_PROFILE_MPEG_PS_PAL, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG2_L2},
+ { &DLNA_PROFILE_MPEG_PS_PAL, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_PS_PAL_XAC3, DLNA_VCP_MPEG2_PS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_NA, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_NA_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_NA_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_NA_XAC3, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_NA_XAC3_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_NA_XAC3_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_NTSC_SD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_TS_HD_NA, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_NTSC_HD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_HD_NA_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_NTSC_HD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_HD_NA_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_NTSC_HD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_HD_NA_XAC3, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_NTSC_HD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_TS_HD_NA_XAC3_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_NTSC_HD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_TS_HD_NA_XAC3_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_NTSC_HD, DLNA_APP_XAC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG1_L1},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG1_L2},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG2_L2},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG1_L1},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG1_L2},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG2_L2},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG1_L1},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG1_L2},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_MPEG2_L2},
+ { &DLNA_PROFILE_MPEG_TS_SD_EU_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_PAL_SD, DLNA_APP_AC3},
+ { &DLNA_PROFILE_MPEG_TS_MP_LL_AAC, DLNA_VCP_MPEG2_TS, DLNA_VPP_MPEG2_MP_LL, DLNA_APP_AAC},
+ { &DLNA_PROFILE_MPEG_TS_MP_LL_AAC_T, DLNA_VCP_MPEG2_TS_T, DLNA_VPP_MPEG2_MP_LL, DLNA_APP_AAC},
+ { &DLNA_PROFILE_MPEG_TS_MP_LL_AAC_ISO, DLNA_VCP_MPEG2_TS_ISO, DLNA_VPP_MPEG2_MP_LL, DLNA_APP_AAC},
+
+};
+
+DLNAProfile* cMPEG2Profiler::probeDLNAProfile(AVFormatContext* FormatCtx){
+ VideoContainerProfile VCP = MPEG2Profiler.probeContainerProfile(FormatCtx);
+ VideoPortionProfile VPP = MPEG2Profiler.probeVideoProfile(FormatCtx);
+ AudioPortionProfile APP = MPEG2Profiler.probeAudioProfile(FormatCtx);
+
+ MESSAGE(VERBOSE_METADATA, "VCP: %d, VPP: %d, APP: %d", VCP, VPP, APP);
+
+ for(int i=0; i < (int) (sizeof(MPEG2_VIDEO_MAP)/sizeof(DLNAVideoMapping)); i++){
+ if( MPEG2_VIDEO_MAP[i].VideoContainer == VCP &&
+ MPEG2_VIDEO_MAP[i].VideoProfile == VPP &&
+ MPEG2_VIDEO_MAP[i].AudioProfile == APP){
+ return MPEG2_VIDEO_MAP[i].Profile;
+ }
+ }
+
+ return NULL;
+}
+
+VideoPortionProfile cMPEG2Profiler::probeVideoProfile(AVFormatContext* FormatCtx){
+ AVCodecContext* VideoCodec = cCodecToolKit::getFirstCodecContext(FormatCtx, CODEC_TYPE_VIDEO);
+ AVStream* VideoStream = cCodecToolKit::getFirstStream(FormatCtx, CODEC_TYPE_VIDEO);
+
+ MESSAGE(VERBOSE_METADATA, "Codec-ID: %d", VideoCodec->codec_id);
+ MESSAGE(VERBOSE_METADATA, "Codec-Name: %s", VideoCodec->codec_name);
+ MESSAGE(VERBOSE_METADATA, "Codec Bitrate: %d", VideoCodec->bit_rate);
+ MESSAGE(VERBOSE_METADATA, "Codec width: %d", VideoCodec->coded_width);
+ MESSAGE(VERBOSE_METADATA, "Codec height: %d", VideoCodec->coded_height);
+ MESSAGE(VERBOSE_METADATA, "Codec Profile: %d", VideoCodec->profile);
+ MESSAGE(VERBOSE_METADATA, "Codec Level: %d", VideoCodec->level);
+ MESSAGE(VERBOSE_METADATA, "Codec Chroma: %d", VideoCodec->pix_fmt);
+ MESSAGE(VERBOSE_METADATA, "Stream aspect ratio %d:%d", VideoStream->sample_aspect_ratio.num, VideoStream->sample_aspect_ratio.den);
+ MESSAGE(VERBOSE_METADATA, "Stream fps %2.3f", av_q2d(VideoStream->r_frame_rate));
+
+ if(VideoCodec->codec_id == CODEC_ID_MPEG2VIDEO){
+ if(cCodecToolKit::matchesAcceptedResolutions(DLNA_RESOLUTIONS_MPEG2_PAL,
+ (int) (sizeof(DLNA_RESOLUTIONS_MPEG2_PAL)/sizeof(AcceptedResolution)) , VideoStream) &&
+ (cCodecToolKit::matchesAcceptedBitrates(DLNA_VIDEOBITRATES_MPEG2_TS_EU, VideoCodec) ||
+ cCodecToolKit::matchesAcceptedBitrates(DLNA_VIDEOBITRATES_MPEG2_PS, VideoCodec))){
+ return DLNA_VPP_MPEG2_PAL_SD;
+ }
+ else if(cCodecToolKit::matchesAcceptedResolutions(DLNA_RESOLUTIONS_MPEG2_NTSC_SD,
+ (int) (sizeof(DLNA_RESOLUTIONS_MPEG2_NTSC_SD)/sizeof(AcceptedResolution)), VideoStream) &&
+ (cCodecToolKit::matchesAcceptedSystemBitrate(DLNA_VIDEOBITRATES_MPEG2_TS_NA_SYSTEM, FormatCtx) ||
+ cCodecToolKit::matchesAcceptedBitrates(DLNA_VIDEOBITRATES_MPEG2_PS, VideoCodec))) {
+ return DLNA_VPP_MPEG2_NTSC_SD;
+ }
+ else if(cCodecToolKit::matchesAcceptedResolutions(DLNA_RESOLUTIONS_MPEG2_NTSC_HD,
+ (int) (sizeof(DLNA_RESOLUTIONS_MPEG2_NTSC_HD)/sizeof(AcceptedResolution)), VideoStream) &&
+ cCodecToolKit::matchesAcceptedSystemBitrate(DLNA_VIDEOBITRATES_MPEG2_TS_NA_SYSTEM, FormatCtx)) {
+ return DLNA_VPP_MPEG2_NTSC_HD;
+ }
+ }
+
+ return DLNA_VPP_UNKNOWN;
+}
+
+AudioPortionProfile cMPEG2Profiler::probeAudioProfile(AVFormatContext* FormatCtx){
+ AudioPortionProfile Profile;
+ if((Profile = AC3Profiler.probeAudioProfile(FormatCtx)) != DLNA_APP_UNKNOWN){
+ MESSAGE(VERBOSE_METADATA, "AC3: %d", Profile);
+ return Profile;
+ }
+ // First codec is not AC3... trying other codecs
+ else if((Profile = MPEGAudioProfiler.probeAudioProfile(FormatCtx)) != DLNA_APP_UNKNOWN){
+ MESSAGE(VERBOSE_METADATA, "MPA: %d", Profile);
+ return Profile;
+ }
+ else {
+ return DLNA_APP_UNKNOWN;
+ }
+}
+
+VideoContainerProfile cMPEG2Profiler::probeContainerProfile(AVFormatContext* FormatCtx){
+ return cContainerDetector::detect(FormatCtx);
+}
+
+cMPEG2Profiler MPEG2Profiler; \ No newline at end of file