[libbluray-devel] Implement part of 3D HDMV instructions
hpi1
git at videolan.org
Wed Aug 29 14:27:37 CEST 2012
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Wed Aug 29 15:19:33 2012 +0300| [d8dc303d2aa7b584cbf59ced3a76f1e0f75a0369] | committer: hpi1
Implement part of 3D HDMV instructions
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=d8dc303d2aa7b584cbf59ced3a76f1e0f75a0369
---
src/libbluray/hdmv/hdmv_vm.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/src/libbluray/hdmv/hdmv_vm.c b/src/libbluray/hdmv/hdmv_vm.c
index 715ed3a..9f88942 100644
--- a/src/libbluray/hdmv/hdmv_vm.c
+++ b/src/libbluray/hdmv/hdmv_vm.c
@@ -651,6 +651,18 @@ static void _set_sec_stream(HDMV_VM *p, uint32_t dst, uint32_t src)
bd_psr_unlock(p->regs);
}
+static void _set_stream_ss(HDMV_VM *p, uint32_t dst, uint32_t src)
+{
+ BD_DEBUG(DBG_HDMV, "_set_stream_ss(0x%x, 0x%x)\n", dst, src);
+
+ if (!(bd_psr_read(p->regs, PSR_3D_STATUS) & 1)) {
+ BD_DEBUG(DBG_HDMV, "_set_stream_ss ignored (PSR22 indicates 2D mode)\n");
+ return;
+ }
+
+ BD_DEBUG(DBG_HDMV, "_set_stream_ss(0x%x, 0x%x) unimplemented\n", dst, src);
+}
+
/*
* SET/SYSTEM navigation control
*/
@@ -712,6 +724,33 @@ static void _popup_off(HDMV_VM *p)
}
/*
+ * SET/SYSTEM 3D mode
+ */
+
+static void _set_output_mode(HDMV_VM *p, uint32_t dst)
+{
+ if ((bd_psr_read(p->regs, PSR_PROFILE_VERSION) & 0x130240) != 0x130240) {
+ BD_DEBUG(DBG_HDMV, "_set_output_mode ignored (not running as profile 5 player)\n");
+ return;
+ }
+
+ bd_psr_lock(p->regs);
+
+ uint32_t psr22 = bd_psr_read(p->regs, PSR_3D_STATUS);
+
+ /* update output mode (bit 0). PSR22 bits 1 and 2 are subtitle alignment (_set_stream_ss()) */
+ if (dst & 1) {
+ psr22 |= 1;
+ } else {
+ psr22 &= ~1;
+ }
+
+ bd_psr_write(p->regs, PSR_3D_STATUS, psr22);
+
+ bd_psr_unlock(p->regs);
+}
+
+/*
* navigation timer
*/
@@ -978,6 +1017,8 @@ static int _hdmv_step(HDMV_VM *p)
case INSN_POPUP_OFF: _popup_off (p); break;
case INSN_STILL_ON: _set_still_mode (p, 1); break;
case INSN_STILL_OFF: _set_still_mode (p, 0); break;
+ case INSN_SET_OUTPUT_MODE: _set_output_mode(p, dst); break;
+ case INSN_SET_STREAM_SS: _set_stream_ss (p, dst, src); break;
default:
BD_DEBUG(DBG_HDMV|DBG_CRIT, "[unknown SETSYSTEM option in opcode 0x%08x] ", *(uint32_t*)insn);
break;
More information about the libbluray-devel
mailing list