[MPlayer-dev-eng] [PATCH] vf_screenshot, output filename corresponding to the played file

Ruslan Savchenko ruslan.savchenko at gmail.com
Sat Nov 15 00:28:03 CET 2008


On Sat, Nov 15, 2008 at 1:16 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Fri, Nov 14, 2008 at 10:24:47PM +0300, Ruslan Savchenko wrote:
>> Any comments? (sorry if I didn't wait long enough)
>> Attached patch also updates man page, but the code part is the same.
>
>> +    size_t n;
>> +
>> +    if (priv->fnametype == 0) {
>> +        /* allocate space to handle "shotXXXX.png" filenames */
>> +        priv->fname = malloc(SHOT_FNAME_LENGTH);
>>      do {
>>       snprintf (priv->fname, 100, "shot%04d.png", ++priv->frameno);
>                              ^^^
> should be replaced by SHOT_FNAME_LENGTH, and actually ideally
> the 102->SHOT_FNAME_LENGTH could be a seperate patch

What should i use instead svn diff to create a patch? I did one with
diff -Naur and attached, is it ok?

>
> also does this code work when there are several files on the command line?
> or does it always end up using the first filename?

It works with several files. You can even specify different options as in here:
mplayer video1.mkv -vf screenshot=1 video2.mkv video3.mkv -vf screenshot
I entered 's' once in each file, this produced:
*** screenshot 'video1.mkv.[00:00:00.46].png' ***
*** screenshot 'video2.mkv.[00:02:30.38].png' ***
*** screenshot 'shot0002.png' ***

(shot0002.png is because i've already had shot0001.png in my directory)

>> +        /* 8 is length of ".[].png" plus '\0' */
>> +        n = strlen(priv->fnamebase) + strlen(tstamp) + 8;
>
>> +        priv->fname = malloc(n);
>> +        snprintf(priv->fname, n, "%s.[%s].png", priv->fnamebase, tstamp);
>
> did i miss the free() or is this a memleak?

I believe i do free() in uninit():

@@ -288,18 +346,33 @@
     av_freep(&vf->priv->avctx);
     if(vf->priv->ctx) sws_freeContext(vf->priv->ctx);
     if (vf->priv->buffer) free(vf->priv->buffer);
+    if (vf->priv->fname) free(vf->priv->fname);
+    if (vf->priv->fnamebase) free(vf->priv->fnamebase);
     free(vf->priv->outbuffer);
     free(vf->priv);

>
>
> [...]
>> Index: mencoder.c
>> ===================================================================
>> --- mencoder.c        (revision 27909)
>> +++ mencoder.c        (working copy)
>> @@ -115,6 +115,7 @@
>>  char* audio_lang=NULL;
>>  char* dvdsub_lang=NULL;
>>  static char* spudec_ifo=NULL;
>> +char* filename=NULL;
>>
>>  static char** audio_codec_list=NULL;  // override audio codec
>>  static char** video_codec_list=NULL;  // override video codec
>> @@ -397,7 +398,6 @@
>>  double v_timer_corr=0;
>>
>>  m_entry_t* filelist = NULL;
>> -char* filename=NULL;
>>
>>  int decoded_frameno=0;
>>  int next_frameno=-1;
>
> why?

Because in mencoder.c "filename" is declared inside main(). In
mplayer.c "filename" is global and I moved it to global in mencoder.c.
It is needed, because vf_screenshot is linked with mencoder.
In the thread opening message there was a separate patch for
mencoder.c doing this slip. Sorry if i distracted you by sending
incomplete patch (only for vf_screenshot.c file) in the middle of
discussion. I don't quite understand if i should split them or no (but
i see now i should always send all parts).


Thanks again for comments, fixed patch attached.

-- 
Regards,
savrus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vf_screenshot-filename.patch
Type: application/octet-stream
Size: 6669 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/attachments/20081115/a8639b58/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vf_screenshot-shotfnamelength.patch
Type: application/octet-stream
Size: 555 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/attachments/20081115/a8639b58/attachment-0001.obj>


More information about the MPlayer-dev-eng mailing list