From 40780c2c4b0711a9bc15d248a5a8dd5fdd1ddec8 Mon Sep 17 00:00:00 2001 From: Matthew Gregan Date: Tue, 15 Sep 2009 17:53:49 +1200 Subject: [PATCH] Bug 504613 - Handle zero-byte first-frame packets in Theora. p=tterribe@vt.edu, r=chris.double --HG-- extra : rebase_source : d2b18e88ddec3836e30b448f949657206a33f3fa --- content/media/test/Makefile.in | 1 + content/media/test/bug504613.ogv | Bin 0 -> 35000 bytes content/media/test/manifest.js | 2 + media/libtheora/README_MOZILLA | 1 + media/libtheora/bug504613.patch | 119 +++++++++++++++++++++++++++++++ media/libtheora/lib/dec/decode.c | 58 +++++++++------ media/libtheora/update.sh | 1 + 7 files changed, 161 insertions(+), 21 deletions(-) create mode 100644 content/media/test/bug504613.ogv create mode 100644 media/libtheora/bug504613.patch diff --git a/content/media/test/Makefile.in b/content/media/test/Makefile.in index b441bfd97a8d..8d1657b84d36 100644 --- a/content/media/test/Makefile.in +++ b/content/media/test/Makefile.in @@ -125,6 +125,7 @@ _TEST_FILES += \ bug500311.ogv \ bug500311.ogv^headers^ \ bug501279.ogg \ + bug504613.ogv \ bug504644.ogv \ bug506094.ogv \ seek.ogv \ diff --git a/content/media/test/bug504613.ogv b/content/media/test/bug504613.ogv new file mode 100644 index 0000000000000000000000000000000000000000..5c7fd015e9ed37923a642ca14d7fe7cbeea860ca GIT binary patch literal 35000 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 +# Date 1252993590 -43200 +# Node ID 2fce745981185aecebad0366b4c2ff45e9f93e95 +# Parent 8dbe8de92cb46f64f8ff80d79f38961eb02e9cbd +imported patch bug504613 + +diff --git a/media/libtheora/lib/dec/decode.c b/media/libtheora/lib/dec/decode.c +--- a/media/libtheora/lib/dec/decode.c ++++ b/media/libtheora/lib/dec/decode.c +@@ -1846,16 +1846,40 @@ int th_decode_ctl(th_dec_ctx *_dec,int _ + _dec->stripe_cb.ctx=cb->ctx; + _dec->stripe_cb.stripe_decoded=cb->stripe_decoded; + return 0; + }break; + default:return TH_EIMPL; + } + } + ++/*We're decoding an INTER frame, but have no initialized reference ++ buffers (i.e., decoding did not start on a key frame). ++ We initialize them to a solid gray here.*/ ++static void oc_dec_init_dummy_frame(th_dec_ctx *_dec){ ++ th_info *info; ++ size_t yplane_sz; ++ size_t cplane_sz; ++ int yhstride; ++ int yvstride; ++ int chstride; ++ int cvstride; ++ _dec->state.ref_frame_idx[OC_FRAME_GOLD]=0; ++ _dec->state.ref_frame_idx[OC_FRAME_PREV]=0; ++ _dec->state.ref_frame_idx[OC_FRAME_SELF]=1; ++ info=&_dec->state.info; ++ yhstride=info->frame_width+2*OC_UMV_PADDING; ++ yvstride=info->frame_height+2*OC_UMV_PADDING; ++ chstride=yhstride>>!(info->pixel_fmt&1); ++ cvstride=yvstride>>!(info->pixel_fmt&2); ++ yplane_sz=(size_t)yhstride*yvstride; ++ cplane_sz=(size_t)chstride*cvstride; ++ memset(_dec->state.ref_frame_data,0x80,yplane_sz+2*cplane_sz); ++} ++ + int th_decode_packetin(th_dec_ctx *_dec,const ogg_packet *_op, + ogg_int64_t *_granpos){ + int ret; + if(_dec==NULL||_op==NULL)return TH_EFAULT; + /*A completely empty packet indicates a dropped frame and is treated exactly + like an inter frame with no coded blocks. + Only proceed if we have a non-empty packet.*/ + if(_op->bytes!=0){ +@@ -1869,37 +1893,19 @@ int th_decode_packetin(th_dec_ctx *_dec, + theorapackB_readinit(&_dec->opb,_op->packet,_op->bytes); + ret=oc_dec_frame_header_unpack(_dec); + if(ret<0)return ret; + /*Select a free buffer to use for the reconstructed version of this + frame.*/ + if(_dec->state.frame_type!=OC_INTRA_FRAME&& + (_dec->state.ref_frame_idx[OC_FRAME_GOLD]<0|| + _dec->state.ref_frame_idx[OC_FRAME_PREV]<0)){ +- th_info *info; +- size_t yplane_sz; +- size_t cplane_sz; +- int yhstride; +- int yvstride; +- int chstride; +- int cvstride; +- /*We're decoding an INTER frame, but have no initialized reference +- buffers (i.e., decoding did not start on a key frame). +- We initialize them to a solid gray here.*/ +- _dec->state.ref_frame_idx[OC_FRAME_GOLD]=0; +- _dec->state.ref_frame_idx[OC_FRAME_PREV]=0; +- _dec->state.ref_frame_idx[OC_FRAME_SELF]=refi=1; +- info=&_dec->state.info; +- yhstride=info->frame_width+2*OC_UMV_PADDING; +- yvstride=info->frame_height+2*OC_UMV_PADDING; +- chstride=yhstride>>!(info->pixel_fmt&1); +- cvstride=yvstride>>!(info->pixel_fmt&2); +- yplane_sz=(size_t)yhstride*yvstride; +- cplane_sz=(size_t)chstride*cvstride; +- memset(_dec->state.ref_frame_data,0x80,yplane_sz+2*cplane_sz); ++ /*No reference frames yet!*/ ++ oc_dec_init_dummy_frame(_dec); ++ refi=_dec->state.ref_frame_idx[OC_FRAME_SELF]; + } + else{ + for(refi=0;refi==_dec->state.ref_frame_idx[OC_FRAME_GOLD]|| + refi==_dec->state.ref_frame_idx[OC_FRAME_PREV];refi++); + _dec->state.ref_frame_idx[OC_FRAME_SELF]=refi; + } + if(_dec->state.frame_type==OC_INTRA_FRAME){ + oc_dec_mark_all_intra(_dec); +@@ -2036,16 +2042,26 @@ int th_decode_packetin(th_dec_ctx *_dec, + } + #if defined(OC_DUMP_IMAGES) + /*Don't dump images for dropped frames.*/ + oc_state_dump_frame(&_dec->state,OC_FRAME_SELF,"dec"); + #endif + return 0; + } + else{ ++ if(_dec->state.ref_frame_idx[OC_FRAME_GOLD]<0|| ++ _dec->state.ref_frame_idx[OC_FRAME_PREV]<0){ ++ int refi; ++ /*No reference frames yet!*/ ++ oc_dec_init_dummy_frame(_dec); ++ refi=_dec->state.ref_frame_idx[OC_FRAME_PREV]; ++ _dec->state.ref_frame_idx[OC_FRAME_SELF]=refi; ++ memcpy(_dec->pp_frame_buf,_dec->state.ref_frame_bufs[refi], ++ sizeof(_dec->pp_frame_buf[0])*3); ++ } + /*Just update the granule position and return.*/ + _dec->state.granpos= + (_dec->state.keyframe_num<<_dec->state.info.keyframe_granule_shift)+ + (_dec->state.curframe_num-_dec->state.keyframe_num); + _dec->state.curframe_num++; + if(_granpos!=NULL)*_granpos=_dec->state.granpos; + return TH_DUPFRAME; + } diff --git a/media/libtheora/lib/dec/decode.c b/media/libtheora/lib/dec/decode.c index bedacd15a03d..7fa8dd96a1a8 100644 --- a/media/libtheora/lib/dec/decode.c +++ b/media/libtheora/lib/dec/decode.c @@ -1851,6 +1851,30 @@ int th_decode_ctl(th_dec_ctx *_dec,int _req,void *_buf, } } +/*We're decoding an INTER frame, but have no initialized reference + buffers (i.e., decoding did not start on a key frame). + We initialize them to a solid gray here.*/ +static void oc_dec_init_dummy_frame(th_dec_ctx *_dec){ + th_info *info; + size_t yplane_sz; + size_t cplane_sz; + int yhstride; + int yvstride; + int chstride; + int cvstride; + _dec->state.ref_frame_idx[OC_FRAME_GOLD]=0; + _dec->state.ref_frame_idx[OC_FRAME_PREV]=0; + _dec->state.ref_frame_idx[OC_FRAME_SELF]=1; + info=&_dec->state.info; + yhstride=info->frame_width+2*OC_UMV_PADDING; + yvstride=info->frame_height+2*OC_UMV_PADDING; + chstride=yhstride>>!(info->pixel_fmt&1); + cvstride=yvstride>>!(info->pixel_fmt&2); + yplane_sz=(size_t)yhstride*yvstride; + cplane_sz=(size_t)chstride*cvstride; + memset(_dec->state.ref_frame_data,0x80,yplane_sz+2*cplane_sz); +} + int th_decode_packetin(th_dec_ctx *_dec,const ogg_packet *_op, ogg_int64_t *_granpos){ int ret; @@ -1874,27 +1898,9 @@ int th_decode_packetin(th_dec_ctx *_dec,const ogg_packet *_op, if(_dec->state.frame_type!=OC_INTRA_FRAME&& (_dec->state.ref_frame_idx[OC_FRAME_GOLD]<0|| _dec->state.ref_frame_idx[OC_FRAME_PREV]<0)){ - th_info *info; - size_t yplane_sz; - size_t cplane_sz; - int yhstride; - int yvstride; - int chstride; - int cvstride; - /*We're decoding an INTER frame, but have no initialized reference - buffers (i.e., decoding did not start on a key frame). - We initialize them to a solid gray here.*/ - _dec->state.ref_frame_idx[OC_FRAME_GOLD]=0; - _dec->state.ref_frame_idx[OC_FRAME_PREV]=0; - _dec->state.ref_frame_idx[OC_FRAME_SELF]=refi=1; - info=&_dec->state.info; - yhstride=info->frame_width+2*OC_UMV_PADDING; - yvstride=info->frame_height+2*OC_UMV_PADDING; - chstride=yhstride>>!(info->pixel_fmt&1); - cvstride=yvstride>>!(info->pixel_fmt&2); - yplane_sz=(size_t)yhstride*yvstride; - cplane_sz=(size_t)chstride*cvstride; - memset(_dec->state.ref_frame_data,0x80,yplane_sz+2*cplane_sz); + /*No reference frames yet!*/ + oc_dec_init_dummy_frame(_dec); + refi=_dec->state.ref_frame_idx[OC_FRAME_SELF]; } else{ for(refi=0;refi==_dec->state.ref_frame_idx[OC_FRAME_GOLD]|| @@ -2041,6 +2047,16 @@ int th_decode_packetin(th_dec_ctx *_dec,const ogg_packet *_op, return 0; } else{ + if(_dec->state.ref_frame_idx[OC_FRAME_GOLD]<0|| + _dec->state.ref_frame_idx[OC_FRAME_PREV]<0){ + int refi; + /*No reference frames yet!*/ + oc_dec_init_dummy_frame(_dec); + refi=_dec->state.ref_frame_idx[OC_FRAME_PREV]; + _dec->state.ref_frame_idx[OC_FRAME_SELF]=refi; + memcpy(_dec->pp_frame_buf,_dec->state.ref_frame_bufs[refi], + sizeof(_dec->pp_frame_buf[0])*3); + } /*Just update the granule position and return.*/ _dec->state.granpos= (_dec->state.keyframe_num<<_dec->state.info.keyframe_granule_shift)+ diff --git a/media/libtheora/update.sh b/media/libtheora/update.sh index a50172c38154..a959acc00e59 100644 --- a/media/libtheora/update.sh +++ b/media/libtheora/update.sh @@ -56,3 +56,4 @@ patch -p3 <455357_wince_local_variable_macro_clash_patch patch -p3