View Issue Details

IDProjectCategoryView StatusLast Update
0000345JVT JM H.264/AVC reference softwaredecoderpublic2015-04-13 15:46
ReporterSimon Assigned ToKarsten Suehring  
PriorityhighSeveritymajorReproducibilityalways
Status resolvedResolutionfixed 
PlatformPCOSWin7 
Product VersionJM 18.6 
Fixed in VersionJM 19.0 
Summary0000345: MBAFF loopfilter mismatch with standard
DescriptionIn function edge_loop_luma_ver_MBAff, all filter process is disable by
if(MbQ->DFDisableIdc ==0)
when MbQ->DFDisableIdc equals to 2.
TagsNo tags attached.

Activities

Karsten Suehring

2014-08-07 14:55

administrator   ~0000615

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.

Simon

2014-08-07 15:34

reporter   ~0000617

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.

Ohji Nakagami

2014-12-17 02:08

reporter  

test.264 (114,700 bytes)

Ohji Nakagami

2014-12-17 02:08

reporter   ~0000618

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))

Karsten Suehring

2015-02-14 17:17

administrator   ~0000619

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.

Karsten Suehring

2015-04-13 15:46

administrator   ~0000622

setting status to resolved

Issue History

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