On 24.11.2014 03:07, Michael Niedermayer wrote:
On Mon, Nov 24, 2014 at 01:17:29AM +0100, Lukasz Marek wrote:
Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com>
---
  libavcodec/libxvid.c | 4 ++++
  1 file changed, 4 insertions(+)

diff --git a/libavcodec/libxvid.c b/libavcodec/libxvid.c
index 020af32..70d52b9 100644
--- a/libavcodec/libxvid.c
+++ b/libavcodec/libxvid.c
@@ -488,6 +488,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)
          if (!x->twopassbuffer || !x->old_twopassbuffer) {
              av_log(avctx, AV_LOG_ERROR,
                     "Xvid: Cannot allocate 2-pass log buffers\n");
+            ret = AVERROR(ENOMEM);
              goto fail;
          }
          x->twopassbuffer[0]     =
@@ -503,6 +504,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)
          fd = av_tempfile("xvidff.", &x->twopassfile, 0, avctx);
          if (fd == -1) {

unrelated to your patch but this should by fd < 0

and fd would be the error code

changed. There is a bug in av_tempfile doc btw.



              av_log(avctx, AV_LOG_ERROR, "Xvid: Cannot write 2-pass pipe\n");
+            ret = AVERROR(EIO);
              goto fail;
          }
          x->twopassfd = fd;
@@ -510,12 +512,14 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)
          if (!avctx->stats_in) {
              av_log(avctx, AV_LOG_ERROR,
                     "Xvid: No 2-pass information loaded for second pass\n");
+            ret = AVERROR(EINVAL);
              goto fail;
          }

          if (strlen(avctx->stats_in) >
              write(fd, avctx->stats_in, strlen(avctx->stats_in))) {
              av_log(avctx, AV_LOG_ERROR, "Xvid: Cannot write to 2-pass 
pipe\n");
+            ret = AVERROR(EIO);

strictly, this should be errno when write returns -1, also av_log()
might change errno so it has to be read before
but EIO as it is, is fine too

Changed. Patch attached.

>From f4481a7af950a1d6ed9f83fd5fdf0ca39fc29b25 Mon Sep 17 00:00:00 2001
From: Lukasz Marek <lukasz.m.lu...@gmail.com>
Date: Mon, 24 Nov 2014 01:11:45 +0100
Subject: [PATCH] lavc/libxvid: return meaningful error codes

Signed-off-by: Lukasz Marek <lukasz.m.lu...@gmail.com>
---
 libavcodec/libxvid.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/libavcodec/libxvid.c b/libavcodec/libxvid.c
index 020af32..046d2f7 100644
--- a/libavcodec/libxvid.c
+++ b/libavcodec/libxvid.c
@@ -488,6 +488,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)
         if (!x->twopassbuffer || !x->old_twopassbuffer) {
             av_log(avctx, AV_LOG_ERROR,
                    "Xvid: Cannot allocate 2-pass log buffers\n");
+            ret = AVERROR(ENOMEM);
             goto fail;
         }
         x->twopassbuffer[0]     =
@@ -501,8 +502,9 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)
         rc2pass2.bitrate = avctx->bit_rate;
 
         fd = av_tempfile("xvidff.", &x->twopassfile, 0, avctx);
-        if (fd == -1) {
+        if (fd < 0) {
             av_log(avctx, AV_LOG_ERROR, "Xvid: Cannot write 2-pass pipe\n");
+            ret = fd;
             goto fail;
         }
         x->twopassfd = fd;
@@ -510,14 +512,19 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)
         if (!avctx->stats_in) {
             av_log(avctx, AV_LOG_ERROR,
                    "Xvid: No 2-pass information loaded for second pass\n");
+            ret = AVERROR(EINVAL);
             goto fail;
         }
 
-        if (strlen(avctx->stats_in) >
-            write(fd, avctx->stats_in, strlen(avctx->stats_in))) {
+        ret = write(fd, avctx->stats_in, strlen(avctx->stats_in));
+        if (ret == -1)
+            ret = AVERROR(errno);
+        else if (strlen(avctx->stats_in) > ret) {
             av_log(avctx, AV_LOG_ERROR, "Xvid: Cannot write to 2-pass pipe\n");
-            goto fail;
+            ret = AVERROR(EIO);
         }
+        if (ret < 0)
+            goto fail;
 
         rc2pass2.filename                          = x->twopassfile;
         plugins[xvid_enc_create.num_plugins].func  = xvid_plugin_2pass2;
-- 
1.9.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to