Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM format demux.

2019-03-20 Thread Carl Eugen Hoyos
2019-03-20 23:20 GMT+01:00, Aidan R :
> From: ffmpeg-devel  on behalf of Michael
> Niedermayer 
> Sent: 20 March 2019 19:08
> To: FFmpeg development discussions and patches
> Subject: Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM
> format demux.
>
>> fails probetest:
>>
>>
>> tools/probetest 256 4096
>> testing size=1
>> testing size=2
>> testing size=4
>> testing size=8
>> testing size=16
>> testing size=32
>> Failure of wsaud probing code with score=50 type=3 p=2D8 size=32
>> testing size=64
>> testing size=128
>> testing size=256
>> testing size=512
>> testing size=1024
>> testing size=2048
>
> What is the appropriate way to resolve this if the format doesn't
> provide enough information to identify it uniquely? Return
> AVPROBE_SCORE_RETRY when we know we can't identify
> a file with a high enough confidence?

Another possibility would be to commit the patch without
the change to the probe function (you can still force the
format) and then think about the probe function independently.

Carl Eugen
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM format demux.

2019-03-20 Thread Aidan R
From: ffmpeg-devel  on behalf of Michael 
Niedermayer 
Sent: 20 March 2019 19:08
To: FFmpeg development discussions and patches
Subject: Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM format 
demux.

> fails probetest:
> 
> 
> tools/probetest 256 4096
> testing size=1
> testing size=2
> testing size=4
> testing size=8
> testing size=16
> testing size=32
> Failure of wsaud probing code with score=50 type=3 p=2D8 size=32
> testing size=64
> testing size=128
> testing size=256
> testing size=512
> testing size=1024
> testing size=2048

What is the appropriate way to resolve this if the format doesn't provide 
enough information to identify it uniquely? Return AVPROBE_SCORE_RETRY when we 
know we can't identify a file with a high enough confidence?

-- 
Aidan Richmond
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM format demux.

2019-03-20 Thread Michael Niedermayer
On Tue, Mar 19, 2019 at 10:53:11PM +, Aidan R wrote:
> PCM format AUD files are found in Westwood's Blade Runner game.
> ---
>  libavformat/westwood_aud.c | 83 
> --
>  1 file changed, 66 insertions(+), 17 deletions(-)
> 
> diff --git a/libavformat/westwood_aud.c b/libavformat/westwood_aud.c
> index 9c2d35cb8a..b25d299bf0 100644
> --- a/libavformat/westwood_aud.c
> +++ b/libavformat/westwood_aud.c
> @@ -41,6 +41,12 @@
>  #define AUD_HEADER_SIZE 12
>  #define AUD_CHUNK_PREAMBLE_SIZE 8
>  #define AUD_CHUNK_SIGNATURE 0xDEAF
> +#define AUD_PCM_CHUNK_SIZE 2048 /* arbitrary size to pull out of PCM data*/
> +
> +typedef struct AUDDemuxContext {
> +int size;
> +int pos;
> +} AUDDemuxContext;
>  
>  static int wsaud_probe(AVProbeData *p)
>  {
> @@ -50,10 +56,10 @@ static int wsaud_probe(AVProbeData *p)
>   * so perform sanity checks on various header parameters:
>   *   8000 <= sample rate (16 bits) <= 48000  ==> 40001 acceptable numbers
>   *   flags <= 0x03 (2 LSBs are used) ==> 4 acceptable numbers
> - *   compression type (8 bits) = 1 or 99 ==> 2 acceptable numbers
> + *   compression type (8 bits) = 0, 1 or 99  ==> 3 acceptable numbers
>   *   first audio chunk signature (32 bits)   ==> 1 acceptable number
> - * The number space contains 2^64 numbers. There are 40001 * 4 * 2 * 1 =
> - * 320008 acceptable number combinations.
> + * The number space contains 2^64 numbers. There are 40001 * 4 * 3 * 1 =
> + * 480012 acceptable number combinations.
>   */
>  
>  if (p->buf_size < AUD_HEADER_SIZE + AUD_CHUNK_PREAMBLE_SIZE)
> @@ -69,13 +75,25 @@ static int wsaud_probe(AVProbeData *p)
>  if (p->buf[10] & 0xFC)
>  return 0;
>  
> -if (p->buf[11] != 99 && p->buf[11] != 1)
> +/* valid format values are 99 == adpcm, 1 == snd1 and 0 == pcm */
> +if (p->buf[11] != 99 && p->buf[11] != 1 && p->buf[11] != 0)
>  return 0;
>  
> -/* read ahead to the first audio chunk and validate the first header 
> signature */
> -if (AV_RL32(>buf[16]) != AUD_CHUNK_SIGNATURE)
> +/* read ahead to the first audio chunk and validate the first header
> + * signature pcm format does not use a chunk format, so don't check
> + * for that codec */
> +if (p->buf[11] != 0 && AV_RL32(>buf[16]) != AUD_CHUNK_SIGNATURE)
>  return 0;
>  
> +/* if we have pcm format then compressed size should equal
> + * uncompressed size */
> +if (p->buf[11] == 0)  {
> +if (AV_RL32(>buf[2]) != AV_RL32(>buf[6]))
> +return 0;
> +if (AV_RL32(>buf[2]) + AUD_HEADER_SIZE < p->buf_size)
> +return 0;
> +}
> +
>  /* return 1/2 certainty since this file check is a little sketchy */
>  return AVPROBE_SCORE_EXTENSION;
>  }

fails probetest:


tools/probetest 256 4096
testing size=1
testing size=2
testing size=4
testing size=8
testing size=16
testing size=32
Failure of wsaud probing code with score=50 type=3 p=2D8 size=32
testing size=64
testing size=128
testing size=256
testing size=512
testing size=1024
testing size=2048

[...]
-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Observe your enemies, for they first find out your faults. -- Antisthenes


signature.asc
Description: PGP signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM format demux.

2019-03-20 Thread Tomas Härdin
ons 2019-03-20 klockan 15:56 + skrev Aidan R:
> tis 2019-03-19 klockan 22:53 + skrev Aidan R:
> > > @@ -130,20 +161,24 @@ static int wsaud_read_packet(AVFormatContext *s,
> > >   AVPacket *pkt)
> > >  {
> > >  AVIOContext *pb = s->pb;
> > > +AUDDemuxContext *aud = s->priv_data;
> > >  unsigned char preamble[AUD_CHUNK_PREAMBLE_SIZE];
> > > -unsigned int chunk_size;
> > > +unsigned int chunk_size, bytes_per_sample;
> > >  int ret = 0;
> > >  AVStream *st = s->streams[0];
> > >  
> > > -if (avio_read(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE) !=
> > > -AUD_CHUNK_PREAMBLE_SIZE)
> > > -return AVERROR(EIO);
> > > +/* AUD files don't store PCM audio in chunks */
> > > +if (st->codecpar->codec_id != AV_CODEC_ID_PCM_S16LE) {
> > 
> > What about AV_CODEC_ID_PCM_U8?
> 
> Good catch, I don't think any actually exist in the wild, but I have supported
> the possibility in wsaud_read_header and from looking at the audio engine it
> looks to support it in theory.

Given the recent 24-bit ZMBV discussion on this list, I think we should
not implement support for things which we don't have samples for. Using
it in the probe function is probably fine, but we should error out in
wsaud_read_header() until we have an 8-bit sample. The U8
implementation in this patch can be dummied out with #ifdefs until
then, for convenient un-#ifdefing

> > 
> > A sample + FATE test for this would be nice
> 
> Some guidance on where to start for that would be most welcome. I have short
> examples from Blade Runner that could be used but wouldn't distributing them
> violate copyright?

Cutting them down to a second or two should be fine I think. If we want
to be paranoid we could zero out the sample data as well, but I doubt
anyone cares. There's plenty of such samples in FATE. We could do this
in a separate thread, it doesn't have to hold up this patch

/Tomas
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM format demux.

2019-03-20 Thread Aidan R
tis 2019-03-19 klockan 22:53 + skrev Aidan R:
> @@ -69,13 +75,25 @@ static int wsaud_probe(AVProbeData *p)
>>  if (p->buf[10] & 0xFC)
>>  return 0;
>>  
>> -if (p->buf[11] != 99 && p->buf[11] != 1)
>> +/* valid format values are 99 == adpcm, 1 == snd1 and 0 == pcm */
>> +if (p->buf[11] != 99 && p->buf[11] != 1 && p->buf[11] != 0)
>>  return 0;
>>  
>> -/* read ahead to the first audio chunk and validate the first header 
>> signature */
>> -if (AV_RL32(>buf[16]) != AUD_CHUNK_SIGNATURE)
>> +/* read ahead to the first audio chunk and validate the first header
>> + * signature pcm format does not use a chunk format, so don't check
>
> Missing a period between "pcm" and "format"?

Missing after signature after re-reading it myself.

>
>> @@ -130,20 +161,24 @@ static int wsaud_read_packet(AVFormatContext *s,
>>   AVPacket *pkt)
>>  {
>>  AVIOContext *pb = s->pb;
>> +AUDDemuxContext *aud = s->priv_data;
>>  unsigned char preamble[AUD_CHUNK_PREAMBLE_SIZE];
>> -unsigned int chunk_size;
>> +unsigned int chunk_size, bytes_per_sample;
>>  int ret = 0;
>>  AVStream *st = s->streams[0];
>>  
>> -if (avio_read(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE) !=
>> -AUD_CHUNK_PREAMBLE_SIZE)
>> -return AVERROR(EIO);
>> +/* AUD files don't store PCM audio in chunks */
>> +if (st->codecpar->codec_id != AV_CODEC_ID_PCM_S16LE) {
>
>What about AV_CODEC_ID_PCM_U8?

Good catch, I don't think any actually exist in the wild, but I have supported
the possibility in wsaud_read_header and from looking at the audio engine it
looks to support it in theory.

>
>A sample + FATE test for this would be nice

Some guidance on where to start for that would be most welcome. I have short
examples from Blade Runner that could be used but wouldn't distributing them
violate copyright?

-- 
Aidan Richmond
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH v2] avformat/westwood_aud: Adds PCM format demux.

2019-03-20 Thread Tomas Härdin
tis 2019-03-19 klockan 22:53 + skrev Aidan R:
> @@ -69,13 +75,25 @@ static int wsaud_probe(AVProbeData *p)
>  if (p->buf[10] & 0xFC)
>  return 0;
>  
> -if (p->buf[11] != 99 && p->buf[11] != 1)
> +/* valid format values are 99 == adpcm, 1 == snd1 and 0 == pcm */
> +if (p->buf[11] != 99 && p->buf[11] != 1 && p->buf[11] != 0)
>  return 0;
>  
> -/* read ahead to the first audio chunk and validate the first header 
> signature */
> -if (AV_RL32(>buf[16]) != AUD_CHUNK_SIGNATURE)
> +/* read ahead to the first audio chunk and validate the first header
> + * signature pcm format does not use a chunk format, so don't check

Missing a period between "pcm" and "format"?

> @@ -130,20 +161,24 @@ static int wsaud_read_packet(AVFormatContext *s,
>   AVPacket *pkt)
>  {
>  AVIOContext *pb = s->pb;
> +AUDDemuxContext *aud = s->priv_data;
>  unsigned char preamble[AUD_CHUNK_PREAMBLE_SIZE];
> -unsigned int chunk_size;
> +unsigned int chunk_size, bytes_per_sample;
>  int ret = 0;
>  AVStream *st = s->streams[0];
>  
> -if (avio_read(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE) !=
> -AUD_CHUNK_PREAMBLE_SIZE)
> -return AVERROR(EIO);
> +/* AUD files don't store PCM audio in chunks */
> +if (st->codecpar->codec_id != AV_CODEC_ID_PCM_S16LE) {

What about AV_CODEC_ID_PCM_U8?

A sample + FATE test for this would be nice

/Tomas
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel