mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 13:36:53 +02:00
Changed H.264 parser to show display aspect ratio.
This commit is contained in:
parent
4e87693de6
commit
ba133f15f8
4
HISTORY
4
HISTORY
@ -376,3 +376,7 @@ VDR Plugin 'femon' Revision History
|
|||||||
- Fixed H.264 bitstream parser.
|
- Fixed H.264 bitstream parser.
|
||||||
- Added a mutex to receiver class.
|
- Added a mutex to receiver class.
|
||||||
- Added 1080/720/576/480 format symbols into status window.
|
- Added 1080/720/576/480 format symbols into status window.
|
||||||
|
|
||||||
|
2009-xx-xx: Version 1.7.5
|
||||||
|
|
||||||
|
- Changed H.264 parser to show display aspect ratio.
|
||||||
|
2
femon.c
2
femon.c
@ -18,7 +18,7 @@
|
|||||||
#error "VDR-1.7.0 API version or greater is required!"
|
#error "VDR-1.7.0 API version or greater is required!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char VERSION[] = "1.7.4";
|
static const char VERSION[] = "1.7.5";
|
||||||
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
|
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
|
||||||
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
|
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
|
||||||
|
|
||||||
|
90
femonh264.c
90
femonh264.c
@ -8,25 +8,47 @@
|
|||||||
#include "femontools.h"
|
#include "femontools.h"
|
||||||
#include "femonh264.h"
|
#include "femonh264.h"
|
||||||
|
|
||||||
const eVideoAspectRatio cFemonH264::s_AspectRatios[] =
|
const cFemonH264::t_DAR cFemonH264::s_DAR[] =
|
||||||
{
|
{
|
||||||
VIDEO_ASPECT_RATIO_INVALID,
|
{ VIDEO_ASPECT_RATIO_1_1, 100 },
|
||||||
VIDEO_ASPECT_RATIO_1_1,
|
{ VIDEO_ASPECT_RATIO_4_3, 133 },
|
||||||
VIDEO_ASPECT_RATIO_12_11,
|
{ VIDEO_ASPECT_RATIO_16_9, 177 },
|
||||||
VIDEO_ASPECT_RATIO_10_11,
|
{ VIDEO_ASPECT_RATIO_2_21_1, 221 },
|
||||||
VIDEO_ASPECT_RATIO_16_11,
|
{ VIDEO_ASPECT_RATIO_12_11, 109 },
|
||||||
VIDEO_ASPECT_RATIO_40_33,
|
{ VIDEO_ASPECT_RATIO_10_11, 90 },
|
||||||
VIDEO_ASPECT_RATIO_24_11,
|
{ VIDEO_ASPECT_RATIO_16_11, 145 },
|
||||||
VIDEO_ASPECT_RATIO_20_11,
|
{ VIDEO_ASPECT_RATIO_40_33, 121 },
|
||||||
VIDEO_ASPECT_RATIO_32_11,
|
{ VIDEO_ASPECT_RATIO_24_11, 218 },
|
||||||
VIDEO_ASPECT_RATIO_80_33,
|
{ VIDEO_ASPECT_RATIO_20_11, 181 },
|
||||||
VIDEO_ASPECT_RATIO_18_11,
|
{ VIDEO_ASPECT_RATIO_32_11, 290 },
|
||||||
VIDEO_ASPECT_RATIO_15_11,
|
{ VIDEO_ASPECT_RATIO_80_33, 242 },
|
||||||
VIDEO_ASPECT_RATIO_64_33,
|
{ VIDEO_ASPECT_RATIO_18_11, 163 },
|
||||||
VIDEO_ASPECT_RATIO_160_99,
|
{ VIDEO_ASPECT_RATIO_15_11, 136 },
|
||||||
VIDEO_ASPECT_RATIO_4_3,
|
{ VIDEO_ASPECT_RATIO_64_33, 193 },
|
||||||
VIDEO_ASPECT_RATIO_3_2,
|
{ VIDEO_ASPECT_RATIO_160_99, 161 },
|
||||||
VIDEO_ASPECT_RATIO_2_1
|
{ VIDEO_ASPECT_RATIO_3_2, 150 },
|
||||||
|
{ VIDEO_ASPECT_RATIO_2_1, 200 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const cFemonH264::t_SAR cFemonH264::s_SAR[] =
|
||||||
|
{
|
||||||
|
{ 0, 0 }, // VIDEO_ASPECT_RATIO_INVALID
|
||||||
|
{ 1, 1 }, // VIDEO_ASPECT_RATIO_1_1
|
||||||
|
{ 12, 11 }, // VIDEO_ASPECT_RATIO_12_11
|
||||||
|
{ 10, 11 }, // VIDEO_ASPECT_RATIO_10_11
|
||||||
|
{ 16, 11 }, // VIDEO_ASPECT_RATIO_16_11
|
||||||
|
{ 40, 33 }, // VIDEO_ASPECT_RATIO_40_33
|
||||||
|
{ 24, 11 }, // VIDEO_ASPECT_RATIO_24_11
|
||||||
|
{ 20, 11 }, // VIDEO_ASPECT_RATIO_20_11
|
||||||
|
{ 32, 11 }, // VIDEO_ASPECT_RATIO_32_11
|
||||||
|
{ 80, 33 }, // VIDEO_ASPECT_RATIO_80_33
|
||||||
|
{ 18, 11 }, // VIDEO_ASPECT_RATIO_18_11
|
||||||
|
{ 15, 11 }, // VIDEO_ASPECT_RATIO_15_11
|
||||||
|
{ 64, 33 }, // VIDEO_ASPECT_RATIO_64_33
|
||||||
|
{ 160, 99 }, // VIDEO_ASPECT_RATIO_160_99
|
||||||
|
{ 4, 3 }, // VIDEO_ASPECT_RATIO_4_3
|
||||||
|
{ 3, 2 }, // VIDEO_ASPECT_RATIO_3_2
|
||||||
|
{ 2, 1 } // VIDEO_ASPECT_RATIO_2_1
|
||||||
};
|
};
|
||||||
|
|
||||||
const eVideoFormat cFemonH264::s_VideoFormats[] =
|
const eVideoFormat cFemonH264::s_VideoFormats[] =
|
||||||
@ -494,18 +516,34 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
|
|||||||
// VUI parameters
|
// VUI parameters
|
||||||
if (bs.getBit()) { // vui_parameters_present_flag
|
if (bs.getBit()) { // vui_parameters_present_flag
|
||||||
if (bs.getBit()) { // aspect_ratio_info_present
|
if (bs.getBit()) { // aspect_ratio_info_present
|
||||||
uint32_t aspect_ratio_idc;
|
uint32_t aspect_ratio_idc, sar_width = 0, sar_height = 0;
|
||||||
aspect_ratio_idc = bs.getU8(); // aspect_ratio_idc
|
aspect_ratio_idc = bs.getU8(); // aspect_ratio_idc
|
||||||
//Dprintf("H.264 SPS: aspect_ratio_idc %d", aspect_ratio_idc);
|
//Dprintf("H.264 SPS: aspect_ratio_idc %d", aspect_ratio_idc);
|
||||||
if (aspect_ratio_idc == 255) { // extended sar
|
if (aspect_ratio_idc == 255) { // extended sar
|
||||||
bs.skipBits(16); // sar_width
|
sar_width = bs.getU16(); // sar_width
|
||||||
bs.skipBits(16); // sar_height
|
sar_height = bs.getU16(); // sar_height
|
||||||
aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED;
|
|
||||||
//Dprintf("H.264 SPS: aspect ratio extended");
|
|
||||||
}
|
}
|
||||||
else if (aspect_ratio_idc < sizeof(s_AspectRatios) / sizeof(s_AspectRatios[0])) {
|
else if (aspect_ratio_idc < ELEMENTS(s_SAR)) {
|
||||||
aspect_ratio = s_AspectRatios[aspect_ratio_idc];
|
sar_width = s_SAR[aspect_ratio_idc].w;
|
||||||
//Dprintf("H.264 SPS: aspect ratio %d", aspect_ratio);
|
sar_height = s_SAR[aspect_ratio_idc].h;
|
||||||
|
}
|
||||||
|
if (sar_width && sar_height) {
|
||||||
|
int index = -1, ratio = 100.0L * sar_width * width / sar_height / height;
|
||||||
|
for (unsigned int i = 0; i < ELEMENTS(s_DAR); ++i) {
|
||||||
|
if (s_DAR[i].ratio == ratio) {
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (index < 0) {
|
||||||
|
if (aspect_ratio_idc == 255)
|
||||||
|
aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED;
|
||||||
|
else
|
||||||
|
aspect_ratio = VIDEO_ASPECT_RATIO_INVALID;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
aspect_ratio = s_DAR[index].dar;
|
||||||
|
//Dprintf("H.264 SPS: DAR %dx%d (%d)", sar_width, sar_height, aspect_ratio);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bs.getBit()) // overscan_info_present_flag
|
if (bs.getBit()) // overscan_info_present_flag
|
||||||
|
13
femonh264.h
13
femonh264.h
@ -19,6 +19,16 @@ private:
|
|||||||
NAL_END_SEQ = 0x0A // End of Sequence
|
NAL_END_SEQ = 0x0A // End of Sequence
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct DAR {
|
||||||
|
eVideoAspectRatio dar;
|
||||||
|
int ratio;
|
||||||
|
} t_DAR;
|
||||||
|
|
||||||
|
typedef struct SAR {
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
} t_SAR;
|
||||||
|
|
||||||
cFemonVideoIf *m_VideoHandler;
|
cFemonVideoIf *m_VideoHandler;
|
||||||
uint32_t m_Width;
|
uint32_t m_Width;
|
||||||
uint32_t m_Height;
|
uint32_t m_Height;
|
||||||
@ -39,7 +49,8 @@ private:
|
|||||||
int parseSPS(const uint8_t *buf, int len);
|
int parseSPS(const uint8_t *buf, int len);
|
||||||
int parseSEI(const uint8_t *buf, int len);
|
int parseSEI(const uint8_t *buf, int len);
|
||||||
|
|
||||||
static const eVideoAspectRatio s_AspectRatios[];
|
static const t_SAR s_SAR[];
|
||||||
|
static const t_DAR s_DAR[];
|
||||||
static const eVideoFormat s_VideoFormats[];
|
static const eVideoFormat s_VideoFormats[];
|
||||||
static const uint8_t s_SeiNumClockTsTable[9];
|
static const uint8_t s_SeiNumClockTsTable[9];
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user