📄 qt_snc.s
字号:
;;;
;;; Test external interrupts
;;;
.nolist
#include "regdef.h"
#include "user.h"
#include "sync.h"
.globl SUB_check_PTS
.globl SUB_consume_data
.extern Debug_Dump_Ptr // xxxxxxxxx
.list
.text
.set noreorder
/***************************************************************************************
This routine updates STC with audio PTS and consumes one PTS, if
1. PTS fifo is not empty;
2. (internal bytecount) >= (A_PTS bytecount).
***************************************************************************************/
SUB_check_PTS:
movw r23,LWbytecount
#ifdef WS_DEBUG
// dlw r21,PTS_FIFO_Rd_Ptr // point to PTS
// dlw r20,PTS_FIFO_Wr_Ptr
LdPTSRdPtr r21
LdPTSWrPtr r20
rlwi r2,STC // xxxxxx debug
// dsw r23,0xff40 // internal bytecount
// dsw r2,0xff44 // STC
tst r20,r21
beq Lcheck_PTS_done // branch if PTS fifo empty
update_data_to_r3k:
dlwr r0,r21 // load A_PTS
addi r1,r21,4
dlwr r4,r1 // load A_PTS bytecount
dsw r23,0xff40 // internal bytecount
dsw r2,0xff44 // STC
dsw r0,0xff48 // A_PTS
shl r0,1
dsw r0,0xff58 // A_PTS
dsw r4,0xff4c // A_PTS bytecount
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r5,Debug_Dump_Ptr
nop
movi DcacheBase,0x12
nop
nop
dswr r23,r5 // LWbytecount
addi r5,4
dswr r2,r5 // STC
addi r5,4
dswr r0,r5 // A_PTS
addi r5,4
dswr r4,r5 // A_PTSbytecount
addi r5,4
li r1,0x130000
tst r5,r1
bne update_r3k_done_1
li r5,0x120000
update_r3k_done_1:
li r0,0xdeadbeef
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
subi r5,0xc
movi DcacheBase,MEM_SEG
nop
nop
dsw r5,Debug_Dump_Ptr
#endif // DUMP_PAGE12
//xxxxxxxxxxxxxx end
#endif // WS_DEBUG
LPTS1:
addi r24,r21,4 // point to byte count
tst r20,r21
beq Lcheck_PTS_done // branch if PTS fifo empty
dlwr r22,r24 // get byte count
dlwr r2,r21 // get PTS
tst r23,r22
blt Lcheck_PTS_done // branch if
// (internal bytecount) < (A_PTS bytecount)
shl r2,1 // PTS passed is bit 32..1
#if LS388
movh r0,LIMpegAttr
andi r0,0x00b0 //STEP or FF/FB or fast/slow play mode
tsti r0,0
bne update_STC_done // not update STC in trick modes
#if 1 //yyyy
rswi r2,STC // load STC only in normal mode
#endif
update_STC_done:
#else // LS388
rswi r2,AUDIO_PTS // load audio PTS
#endif // LS388
Lno_update:
mupi r0,MEM_SEG
addi r0,PTS_FIFO_END
addi r21,8 // two element per entry
tst r21,r0
blt Lupdate_rd_ptr
mupi r21,MEM_SEG
addi r21,PTS_FIFO_START // wrap around
Lupdate_rd_ptr:
// dsw r21,PTS_FIFO_Rd_Ptr // update read pointer
SvPTSRdPtr r21
LdPTSWrPtr r20
j LPTS1 // keep consuming A_PTS and its bytecount until
// either PTS fifo empty or
// (internal bytecount) < (A_PTS bytecount)
Lcheck_PTS_done:
j r28
/***************************************************************************************
This routine consumes data in trick modes.
Consume one audio frame and update internal bytecount.
Consume one PTS, if PTS fifo is not empty and (internal bytecount) > (A_PTS bytecount).
There must be at least one audio frame in IBUF when enter this routine.
***************************************************************************************/
SUB_consume_data:
movw r3,LWbytecount
#ifdef WS_DEBUG
// dlw r6,PTS_FIFO_Wr_Ptr
// dlw r7,PTS_FIFO_Rd_Ptr
LdPTSWrPtr r6
LdPTSRdPtr r7
rlwi r2,STC
tst r6,r7
#if 0
beq update_r3k_done
#else // 1
bne update_r3k
li r2,0xdeadbeef
dsw r3,0xff40 // LWbytecount
dsw r2,0xff44 // STC - update STC even PTS fifo empty
// dsw r2,0xff48 // A_PTS
// j update_r3k_done
j check_video_fifo_empty // check video fifo if PTS fifo empty
#endif // 1
update_r3k:
dlwr r0,r7
addi r1,r7,4
dlwr r4,r1
dsw r3,0xff40 // LWbytecount
dsw r2,0xff44 // STC
dsw r0,0xff48 // A_PTS
shl r0,1
dsw r0,0xff58 // A_PTS
dsw r4,0xff4c // A_PTSbytecount
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r5,Debug_Dump_Ptr
nop
movi DcacheBase,0x12
nop
nop
dswr r3,r5 // LWbytecount
addi r5,4
dswr r2,r5 // STC
addi r5,4
dswr r0,r5 // A_PTS
addi r5,4
dswr r4,r5 // A_PTSbytecount
addi r5,4
li r1,0x130000
tst r5,r1
bne update_r3k_done_2
li r5,0x120000
update_r3k_done_2:
li r0,0xdeadbeef
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
subi r5,0xc
movi DcacheBase,MEM_SEG
nop
nop
dsw r5,Debug_Dump_Ptr
#endif // DUMP_PAGE12
//xxxxxxxxxxxxxx end
update_r3k_done:
#endif // WS_DEBUG
// dlw r1,PTS_FIFO_Rd_Ptr // point to PTS
// dlw r0,PTS_FIFO_Wr_Ptr
addi r4,r7,4 // point to byte count
dlwr r2,r4 // get byte count
dlwr r5,r7 // get A_PTS
rlwi r4,STC // get STC
shl r5,1
tst r4,r5
movh r4,LIfrmsize
// blt end_consume_data // branch if STC < A_PTS
blt check_video_fifo_empty
add r3,r4 // consume one frame, bytecount
movw LWbytecount,r3
tst r3,r2
blt update_pts_rd_ptr_done // branch if bytecount < A_PTSbytecount
tst r6,r7
beq update_pts_rd_ptr_done // branch if PTS fifo empty
addi r7,8
andi r0,r7,0xffff
tsti r0,PTS_FIFO_END
blt update_pts_rd_ptr
subi r0,PTS_FIFO_SIZE
update_pts_rd_ptr:
mupi r1,MEM_SEG
or r1,r0
// dsw r1,PTS_FIFO_Rd_Ptr
SvPTSRdPtr r1
consume_one_more_PTS:
tst r1,r6
beq update_pts_rd_ptr_done // branch if PTS fifo empty
addi r1,4 // point to next A_PTSbytecount
dlwr r5,r1 // next A_PTSbytecount
nop
tst r3,r5
blt update_pts_rd_ptr_done // branch if (bytecount < A_PTSbytecount)
addi r1,4 // point to 2nd next PTS
andi r1,0xffff
tsti r1,PTS_FIFO_END
blt save_one_more_PTS
subi r1,PTS_FIFO_SIZE
save_one_more_PTS:
mupi r0,MEM_SEG
or r1,r0
SvPTSRdPtr r1
j consume_one_more_PTS // until (bytecount < A_PTSbytecount) or PTS fifo empty
update_pts_rd_ptr_done:
// movh r4,LIfrmsize
movw r5,LWibufRdPtr
andi r5,0xffff
add r5,r4 // consume one frame, ibuf_rd_ptr
tsti r5,IBUF_END
blt 5f
subi r5,IBUF_SIZE
5:
mupi r0,MEM_SEG // prefix w/ segment number
or r5,r0
movw LWibufRdPtr,r5 // update read pointer
// dsw r5,Stream_Rd_Ptr
SvStrRdPtr r5
// dsw r5,OLD_Stream_Rd_Ptr
movh LIold_rd_ptr,r5
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
// dlw r6,Stream_Wr_Ptr
LdStrWrPtr r6
mov r7,r5
movw r0,LWbytecount
dlw r5,Debug_Dump_Ptr
nop
movi DcacheBase,0x12
nop
li r3,0xffffff03
dswr r0,r5 // LWbytecount
addi r5,4
dswr r3,r5 // signature
addi r5,4
dswr r7,r5 // Stream_Rd_Ptr
addi r5,4
dswr r6,r5 // Stream_Wr_Ptr
addi r5,4
li r1,0x130000
tst r5,r1
bne consume_data_dump
li r5,0x120000
consume_data_dump:
li r0,0xdeadbeef
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
subi r5,0xc
movi DcacheBase,MEM_SEG
nop
nop
dsw r5,Debug_Dump_Ptr
#endif // DUMP_PAGE12
//xxxxxxxxxxxxxx end
end_consume_data:
movi r0,128
1:
nop
loop 16,delay_loop1
nop
nop
nop
nop
delay_loop1:
subi r0,1
tsti r0,0
bne 1b
j r31
check_video_fifo_empty:
rlwi r4,MPEG_VID_FIFO_CUR_BYTE
tsti r4,0
bne end_consume_data
movh r4,LIfrmsize
add r3,r4 // consume one frame, bytecount
movw LWbytecount,r3
j update_pts_rd_ptr_done
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -