View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000345 | JVT JM H.264/AVC reference software | decoder | public | 2014-08-07 09:22 | 2015-04-13 15:46 |
Reporter | Simon | Assigned To | Karsten Suehring | ||
Priority | high | Severity | major | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Platform | PC | OS | Win7 | ||
Product Version | JM 18.6 | ||||
Fixed in Version | JM 19.0 | ||||
Summary | 0000345: MBAFF loopfilter mismatch with standard | ||||
Description | In function edge_loop_luma_ver_MBAff, all filter process is disable by if(MbQ->DFDisableIdc ==0) when MbQ->DFDisableIdc equals to 2. | ||||
Tags | No tags attached. | ||||
|
I think the case that MbQ->DFDisableIdc equals 2 is already handled in DeblockMb(), where the filter process is not called, if the macroblock is in another slice. |
|
The problem is that the internal edges which should not be effected by DFDisableidc equals 2 are not processed neither . I tested a conformance bitstream from allegro, the output of 18.6 is different from that of 14.2. By deleting the if line, the two output can be the same. |
|
|
|
A sample bitstream generated by JM16.2 is attached. The decoded result is different between JM16.2 and JM18.6. 2a75113eb89a5e1cf10da3b47bc44b73 test_dec.yuv //JM16.2 cde01132324bcff694b22e342bf5e089 test_dec.yuv //JM18.6 Below is a suggested fix for JM18.6. edge_loop_luma_ver_MBAff() @ ldecod/loop_filter_mbaff.c L. 437~ [JM18.6] Macroblock *MbP; imgpel *SrcPtrP, *SrcPtrQ; if (MbQ->DFDisableIdc == 0) { for( pel = 0 ; pel < MB_BLOCK_SIZE ; ++pel ) { getAffNeighbour(MbQ, edge - 1, pel, p_Vid->mb_size[IS_LUMA], &pixP); if (pixP.available) { [Suggested fix] Macroblock *MbP; imgpel *SrcPtrP, *SrcPtrQ; for( pel = 0 ; pel < MB_BLOCK_SIZE ; ++pel ) { getAffNeighbour(MbQ, edge - 1, pel, p_Vid->mb_size[IS_LUMA], &pixP); if ( pixP.available || (MbQ->DFDisableIdc == 0)) { I believe this fix aligns with JM16.2 that can handle deblocking filter process at the slice boundary in MBAff & DFDisableIdc==2 case as the spec. Below is the corresponding code in JM16.2 for your convenience. [JM16.2] EdgeLoopLumaMBAff() @ ldecod/loopFilter.c L. 657- Macroblock *MbP; imgpel *SrcPtrP, *SrcPtrQ; for( pel = 0 ; pel < PelNum ; ++pel ) { (snip) if (pixP.available || (MbQ->DFDisableIdc== 0)) |
|
That looks like a mistake, also considering that the function at the encoder is still structured as in the suggested fix. I'm putting the fix in my development branch and will do some more testing. |
|
setting status to resolved |
Date Modified | Username | Field | Change |
---|---|---|---|
2014-08-07 09:22 | Simon | New Issue | |
2014-08-07 14:55 | Karsten Suehring | Note Added: 0000615 | |
2014-08-07 14:55 | Karsten Suehring | Assigned To | => Karsten Suehring |
2014-08-07 14:55 | Karsten Suehring | Status | new => feedback |
2014-08-07 15:34 | Simon | Note Added: 0000617 | |
2014-08-07 15:34 | Simon | Status | feedback => assigned |
2014-12-17 02:08 | Ohji Nakagami | File Added: test.264 | |
2014-12-17 02:08 | Ohji Nakagami | Note Added: 0000618 | |
2015-02-14 17:17 | Karsten Suehring | Note Added: 0000619 | |
2015-04-13 15:46 | Karsten Suehring | Note Added: 0000622 | |
2015-04-13 15:46 | Karsten Suehring | Status | assigned => resolved |
2015-04-13 15:46 | Karsten Suehring | Fixed in Version | => JM 19.0 |
2015-04-13 15:46 | Karsten Suehring | Resolution | open => fixed |