Web lists-archives.com

[MPlayer-dev-eng] SPDIF and ticket #2277




Hi,
 I'm looking into ticket #2277.
The file was already fixed for normal playback, but it still fails
with -ao null. In this case the ad_spdif decoder is invoked, and
crashes int lavf.

Tha attached patch fixes it, but I have no way to test this.

By looking at the change, I don't see any relation between my fix and
the fuzzed file; I suspect that spdif was just broken by some changes
in ffmpeg and nobody noticed.


Can anybody with spdif check if playback is broken with and without my
patch?
Bonus points if you also check the 1.2 branch.


Ciao,
 Roberto
Index: libmpcodecs/ad_spdif.c
===================================================================
--- libmpcodecs/ad_spdif.c	(revisione 37599)
+++ libmpcodecs/ad_spdif.c	(copia locale)
@@ -45,6 +45,7 @@
     int              out_buffer_size;
     uint8_t         *out_buffer;
     uint8_t          pb_buffer[OUTBUF_SIZE];
+    int              header_written;
 };
 
 static int read_packet(void *p, uint8_t *buf, int buf_size)
@@ -78,7 +79,7 @@
 
 static int init(sh_audio_t *sh)
 {
-    int i, x, in_size, srate, bps, *dtshd_rate;
+    int i, x, in_size, srate, bps, *dtshd_rate, res;
     unsigned char *start;
     double pts;
     static const struct {
@@ -129,11 +130,13 @@
             break;
         }
     }
-    if (AVERROR_PATCHWELCOME == lavf_ctx->oformat->write_header(lavf_ctx)) {
-        mp_msg(MSGT_DECAUDIO,MSGL_INFO,
+    if ((res = avformat_write_header(lavf_ctx, NULL)) < 0) {
+        if (res == AVERROR_PATCHWELCOME)
+            mp_msg(MSGT_DECAUDIO,MSGL_INFO,
                "This codec is not supported by spdifenc.\n");
         goto fail;
     }
+    spdif_ctx->header_written = 1;
 
     // get sample_rate & bitrate from parser
     x = ds_get_packet_pts(sh->ds, &start, &pts);
@@ -292,8 +295,8 @@
     AVFormatContext     *lavf_ctx  = spdif_ctx->lavf_ctx;
 
     if (lavf_ctx) {
-        if (lavf_ctx->oformat)
-            lavf_ctx->oformat->write_trailer(lavf_ctx);
+        if (spdif_ctx->header_written)
+            av_write_trailer(lavf_ctx);
         av_freep(&lavf_ctx->pb);
         if (lavf_ctx->streams) {
             av_freep(&lavf_ctx->streams[0]->codec);
_______________________________________________
MPlayer-dev-eng mailing list
MPlayer-dev-eng@xxxxxxxxxxxx
https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng