[MPlayer-dev-eng] [PATCH] dvdnav part 2 - still frames

Ötvös Attila oattila at chello.hu
Mon Jul 30 14:40:49 CEST 2007


2007. július 29. 20.50 dátummal Reimar Döffinger ezt írta:
Hello Reimar Döffinger!

Thanks your answer.

> Hello,
>
> On Sun, Jul 29, 2007 at 12:07:21AM +0200, ?tv?s Attila wrote:
> > +//
> > +// convert dvd time to millisec
> > +//
> > +static int dvdtimetomsec(dvd_time_t *dt)
> > +{
> > +  static int framerates[4] = {0, 2500, 0, 2997};
> > +  int framerate = framerates[(dt->frame_u & 0xc0) >> 6];
> > +  int msec = (((dt->hour & 0xf0) >> 3) * 5 + (dt->hour & 0x0f)) *
> > 3600000;
>
> This is awfully obfuscated, and for no good reason. >> 3 * 5 is actually
> most likely slower than >> 4 * 10, and the later means that
> 1) the & 0xf0 is not needed.
> 2) it is obvious that this is just bcd.
>
I corrected.

> And actually IMO you should factor that out into a
>
> > static int bcd2int_8(uint8_t in) {
> >   return (in >> 4) * 10 + (in & 0x0f);
> > }
>
> or similar.
>
> > -          dvdnav_still_skip(priv->dvdnav); // don't let dvdnav stall on
> > this image -
> > +//          dvdnav_still_skip(priv->dvdnav); // don't let dvdnav stall
> > on this image
>
> That is confusing because it is unclear if the comment explains why it
> is there or why it is commented out. Unless you think it will be needed
> again in the future just remove it.
I removed.

>
> > +    priv->still_length=still_event->length;
> > +    if (priv->still_length!=255)    // set still frame duration
> > +        priv->duration = priv->still_length * 1000;
> > +        else
> > +        priv->duration = 0;
> > +        if (priv->still_length==0x01) {     // FIXME: TIME HACK
> > +        pci_t* pnavpci = dvdnav_get_current_nav_pci( priv->dvdnav );
> > +        priv->duration = dvdtimetomsec(&(pnavpci->pci_gi.e_eltm));
> > +        }
>
> The indentation here is a complete mess.
I corrected.

>
> >        case DVDNAV_CELL_CHANGE: {
> > +        priv->status.wait_skip=0;
> > +        priv->status.audio_change = 1;
> > +        priv->status.spu_change = 1;
> > +        priv->status.stream_change = 1;
> >          dvdnav_cell_change_event_t *ev = 
> > (dvdnav_cell_change_event_t*)buf; if(ev->pgc_length)
> >            priv->duration = ev->pgc_length/90;
> > +        priv->status.vts_domain=dvdnav_is_domain_vts(priv->dvdnav);   
> > // is vts +
> > +        uint32_t nextstill = dvdnav_get_next_still_flag(priv->dvdnav);
>
> declarations must be at start of block.
I corrected.

> > +        if(nextstill) {
> > +            if(nextstill==0xff) priv->duration=0; else
> > priv->duration=nextstill * 1000; +           
> > priv->still_length=nextstill;
> > +            }
>
> closing } is not aligned properly.
>
> >          break;
> > +        }
I corrected.

> same here
>
> > +      case DVDNAV_AUDIO_STREAM_CHANGE: {
> > +        priv->status.stream_change = 1;
> > +        priv->status.audio_change = 1;
> > +        break;
> > +        }
I removed.

> and here
>
> > -      case DVDNAV_WAIT:
> > -        dvdnav_wait_skip(priv->dvdnav);
> > +      case DVDNAV_WAIT: {
> > +//        dvdnav_wait_skip(priv->dvdnav);
> > +        // if don't open demuxer then suspend read in dvdnav stream else
> > wait skip +        if(priv->status.wait_skip && !priv->status.wait)
> > +            dvdnav_wait_skip(priv->dvdnav);
> > +            else
> > +            priv->status.wait=1;
> >          break;
> > +        }
>
> weird indentation.
I corrected.

> > +      case DVDNAV_VTS_CHANGE: {
> > +            priv->status.wait_skip=0;
> > +            priv->status.audio_change = 1;
> > +            priv->status.spu_change = 1;
> > +            priv->status.stream_change = 1;
> > +        break;
> > +        }
>
> break is indented weirdly here as well.
I corrected.

> > @@ -255,25 +313,36 @@
> >          return 0;
> >        }
> >        switch (event) {
> > -        case DVDNAV_STOP:
> > +        case DVDNAV_STOP: { priv->status.eofstream=1; return len; }
> >          case DVDNAV_BLOCK_OK:
> >          case DVDNAV_NAV_PACKET:
> >            return len;
> > +        case DVDNAV_STILL_FRAME: return len;
> > +        case DVDNAV_WAIT: { if(priv->status.wait) return len; break; }
>
> There is no need for the {}, but please put the code into new lines.
I corrected.

> >              dvdnav_get_highlight (priv, 0);
> > -            if(priv->title > 0 && tit != priv->title)
> > +            if(priv->title > 0 && tit != priv->title) {
> >                return 0;
> > +            }
>
> Cosmetics? (only adding unneeded {})
I removed.

> > @@ -383,12 +452,12 @@
> >      }
> >      if(dvd_chapter > 0)
> >        dvdnav_part_play(priv->dvdnav, p->track, dvd_chapter);
> > -  } else if(p->track == -1)
> > +  } else if(p->track == 0)
> >      dvdnav_menu_call(priv->dvdnav, DVD_MENU_Root);
> > -  else {
> > +  /*else {      // **FIXME** disable to test still frame with
> > still_length mp_msg(MSGT_OPEN,MSGL_INFO,"dvdnav_stream, you didn't
> > specify a track number (as in dvdnav://1), playing whole disc\n");
> > dvdnav_menu_call(priv->dvdnav, DVD_MENU_Title);
> > -  }
> > +  }*/
>
> IMO better use #if 0 / #endif to comment out even small blocks of code.
I corrected.

> > @@ -401,9 +470,8 @@
> >    stream->type = STREAMTYPE_DVDNAV;
> >    stream->priv=(void*)priv;
> >    *file_format = DEMUXER_TYPE_MPEG_PS;
> > -
> >    update_title_len(stream);
>
> cosmetics.
I removed

> I'll apply these in a few moments.
Thaks.

> > +/**
> > + * \brief mp_dvdnav_isreallyeof() query is really dvd stream eof
> > + * \param stream: - stream pointer
> > + * \return 1 if really eof
> > + */
> > +int mp_dvdnav_isreallyeof(stream_t *stream) {
> > +    dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv;
>
> I know, the other code uses it as well, but that (dvdnav_priv_t*) is
> really useless.
I corrected.

> > +    return (priv->status.eofstream==1);
>
> And the () here are not really needed either.
>
> > +    if (mode>=0) priv->status.wait_read=(mode!=0);
> > +    if (automode>=0) priv->status.wait_read_automode=(automode!=0);
>
> IMO write "!mode" and "!automode" instead of != 0.
I corrected.

> >  typedef struct {
> > +  unsigned int     eofstream          : 1;  /* stream eof flag */
> > +  unsigned int     wait               : 1;  /* wait event */
> > +  unsigned int     wait_skip          : 1;  /* wait skip disable */
> > +  unsigned int     cell_change        : 1;  /* cell change event */
> > +  unsigned int     audio_change       : 1;  /* audio change event */
> > +  unsigned int     spu_change         : 1;  /* spu change event */
> > +  unsigned int     wait_read_automode : 1;  /* wait read auto mode (if
> > opening demuxer then off else on) */ +  unsigned int     wait_read       
> >   : 1;  /* wait read flag (suspend read from dvdnav stream */ +  unsigned
> > int     stream_change      : 1;  /* stream change flag: title, part,
> > audio or spu */ +  unsigned int     vts_domain         : 1;  /* is vts */
> > +} nav_status_t;
>
> bitfield crap ;-). I'd take a normal int with flag-defines over that any
> day. But no, I certainly don't expect you to change it, just couldn't
> stand not saying anything ;-)
I replace to bit mask.

>
> >    dvdnav_highlight_event_t hlev;
> > +  int              still_length;        /* still frame duration */
> > +  nav_status_t     status;
> >  } dvdnav_priv_t;
> >
> > -
> >  int dvdnav_number_of_subs(stream_t *stream);
>
> Cosmetics.
I removed.

>
> >  int dvdnav_aid_from_lang(stream_t *stream, unsigned char *language);
> >  int dvdnav_lang_from_aid(stream_t *stream, int id, unsigned char *buf);
> > @@ -38,5 +52,9 @@
> >  void mp_dvdnav_update_mouse_pos(stream_t *stream, int32_t x, int32_t y,
> > int* button); void mp_dvdnav_get_highlight (stream_t *stream,
> > nav_highlight_t *hl); unsigned int *mp_dvdnav_get_spu_clut(stream_t
> > *stream);
> > -
> > +int mp_dvdnav_isreallyeof(stream_t *stream);
> > +int mp_dvdnav_still_skip(stream_t *stream);
> > +int mp_dvdnav_wait_skip(stream_t *stream);
> > +int mp_dvdnav_iscellchage(stream_t *stream, int clear);
> > +void mp_dvdnav_wait_read(stream_t *stream, int mode, int automode);
> >  #endif
>
> And leave that empty line before the #endif there as well.
I corrected.

>
> [...]
>
> > @@ -1014,6 +1028,7 @@
> >    if (vo_spudec==NULL && mpctx->stream->type==STREAMTYPE_DVDNAV) {
> >      unsigned int *palette = mp_dvdnav_get_spu_clut(mpctx->stream);
> >      current_module="spudec_init_dvdnav";
> > +    palette=NULL;
> >      vo_spudec=spudec_new_scaled(palette, mpctx->sh_video->disp_w,
> > mpctx->sh_video->disp_h); }
> >  #endif
>
> unrelated?
I removed.

> > +mp_image_t* mp_dvdnav_copympi(mp_image_t* tompi, mp_image_t* frommpi) {
> > +    mp_image_t* mpi;
> > +
> > +    if(!frommpi) return NULL;
> > +    if(frommpi->pict_type==3) return tompi;     // B-frame don't store
> > +    if(tompi && tompi->w==frommpi->w && tompi->h==frommpi->h &&
> > tompi->imgfmt==frommpi->imgfmt) { +    mpi=tompi;
> > +    } else {
> > +    if(tompi) free_mp_image(tompi);
> > +    if(frommpi->w==0 || frommpi->h==0) return NULL;
> > +    mpi=alloc_mpi(frommpi->w,frommpi->h,frommpi->imgfmt);
> > +    }
>
> horrible indentation.
I corrected.
> > +        if (!mpctx->libmpeg2_count) {               // is first call
> > +            mpctx->libmpeg2_count=5;                // repeat number = 5
> > +            }
>
> useless {}. And placing the } like this seems to be your style, but
> given that none of the other code and no other developer I know of
> places it like this, could you kindly ignore your own preferences in
> this case?
I corrected.

> > @@ -2000,7 +2146,7 @@
> >      *blit_frame = 0; // Don't blit if we hit EOF
> >      if (!correct_pts) {
> >  	unsigned char* start=NULL;
> > -	void *decoded_frame;
> > +    void *decoded_frame=NULL;
>
> Old code used a tab to indent, please leave it that way.
I changed to tab.

> > @@ -3404,7 +3575,6 @@
> >  	  time_frame += frame_time / playback_speed;  // for nosound
> >        }
> >    }
> > -
> >  //
> > =========================================================================
> >=
> >
> >  //    current_module="draw_osd";
>
> Cosmetics.
I removed.

> > Index: command.c
> > ===================================================================
> > --- command.c	(revision 23887)
> > +++ command.c	(working copy)
> > @@ -2655,9 +2655,11 @@
> >
> >  		if (mp_dvdnav_handle_input
> >  		    (mpctx->stream, cmd->args[0].v.i, &button)) {
> > +#if 0
> >  		    uninit_player(INITED_ALL - (INITED_STREAM | INITED_INPUT |
> >  				   (fixed_vo ? INITED_VO : 0)));
> >  		    brk_cmd = 2;
> > +#endif
>
> Hmm.. looks suspicious. Needs at least a comment.
I add to comment.

Best regards.
Attila
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dvdnav-2-still.patch
Type: text/x-diff
Size: 22295 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/attachments/20070730/fbac1c45/attachment.patch>


More information about the MPlayer-dev-eng mailing list