Reject th_info structs with a zero in the frame rate rational.
authorRalph Giles <giles@xiph.org>
Thu, 16 Dec 2010 18:57:36 +0000 (18:57 +0000)
committerRalph Giles <giles@xiph.org>
Thu, 16 Dec 2010 18:57:36 +0000 (18:57 +0000)
The specification says that the frame rate numerator and
denominator MUST both be greater than zero. This wasn't
checked as part of the structure validation code, and in
fact passing a zero value here caused a segfault.

The code now checks for this in oc_state_init() and returns
TH_EINVAL, which is causes th_encode_alloc() and oc_decode_alloc()
to return NULL.

A check for that NULL return is also added to encoder_example.c
to show that it may fail when an invalid th_info parameter is
passed.

svn path=/trunk/theora/; revision=17760

examples/encoder_example.c
lib/state.c

index aa864da..09e1994 100644 (file)
@@ -1577,6 +1577,11 @@ int main(int argc,char *argv[]){
     else ti.pixel_fmt=TH_PF_444;
     td=th_encode_alloc(&ti);
     th_info_clear(&ti);
+    if(td==NULL){
+      fprintf(stderr,"Error: Could not create an encoder instance.\n");
+      fprintf(stderr,"Check that video parameters are valid.\n");
+      exit(1);
+    }
     /* setting just the granule shift only allows power-of-two keyframe
        spacing.  Set the actual requested spacing. */
     ret=th_encode_ctl(td,TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE,
index 6501202..723649c 100644 (file)
@@ -702,7 +702,8 @@ int oc_state_init(oc_theora_state *_state,const th_info *_info,int _nrefs){
      how it is specified in the bitstream, because the Y axis is flipped in
      the bitstream.
     The displayable frame must fit inside the encoded frame.
-    The color space must be one known by the encoder.*/
+    The color space must be one known by the encoder.
+    The framerate ratio must not contain a zero value.*/
   if((_info->frame_width&0xF)||(_info->frame_height&0xF)||
    _info->frame_width<=0||_info->frame_width>=0x100000||
    _info->frame_height<=0||_info->frame_height>=0x100000||
@@ -715,7 +716,8 @@ int oc_state_init(oc_theora_state *_state,const th_info *_info,int _nrefs){
       but there are a number of compilers which will mis-optimize this.
      It's better to live with the spurious warnings.*/
    _info->colorspace<0||_info->colorspace>=TH_CS_NSPACES||
-   _info->pixel_fmt<0||_info->pixel_fmt>=TH_PF_NFORMATS){
+   _info->pixel_fmt<0||_info->pixel_fmt>=TH_PF_NFORMATS||
+   _info->fps_numerator<1||_info->fps_denominator<1){
     return TH_EINVAL;
   }
   memset(_state,0,sizeof(*_state));