avifdec: Return proper exit code in "info" mode

When running avifdec with --info, the exit code must not be 0 when
there is an error in decoding the frames.

Also, log the error messages in stderr.
diff --git a/apps/avifdec.c b/apps/avifdec.c
index 98c341d..055a919 100644
--- a/apps/avifdec.c
+++ b/apps/avifdec.c
@@ -236,8 +236,7 @@
             }
 
             int currIndex = 0;
-            avifResult nextImageResult;
-            while ((nextImageResult = avifDecoderNextImage(decoder)) == AVIF_RESULT_OK) {
+            while ((result = avifDecoderNextImage(decoder)) == AVIF_RESULT_OK) {
                 printf("   * Decoded frame [%d] [pts %2.2f (%" PRIu64 " timescales)] [duration %2.2f (%" PRIu64 " timescales)] [%ux%u]\n",
                        currIndex,
                        decoder->imageTiming.pts,
@@ -248,17 +247,19 @@
                        decoder->image->height);
                 ++currIndex;
             }
-            if (nextImageResult != AVIF_RESULT_NO_IMAGES_REMAINING) {
-                printf("ERROR: Failed to decode frame: %s\n", avifResultToString(nextImageResult));
+            if (result == AVIF_RESULT_NO_IMAGES_REMAINING) {
+                result = AVIF_RESULT_OK;
+            } else {
+                fprintf(stderr, "ERROR: Failed to decode frame: %s\n", avifResultToString(result));
                 avifDumpDiagnostics(&decoder->diag);
             }
         } else {
-            printf("ERROR: Failed to decode image: %s\n", avifResultToString(result));
+            fprintf(stderr, "ERROR: Failed to parse image: %s\n", avifResultToString(result));
             avifDumpDiagnostics(&decoder->diag);
         }
 
         avifDecoderDestroy(decoder);
-        return 0;
+        return result != AVIF_RESULT_OK;
     } else {
         if (!inputFilename || !outputFilename) {
             syntax();