diff --git a/main/translate.c b/main/translate.c
index 96019f1c7d991fd1ab24258516ebf8bba8a04b4f..df2754d1123142232cb06ea004ddffd79cc9ee5d 100644
--- a/main/translate.c
+++ b/main/translate.c
@@ -518,41 +518,40 @@ struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f,
 		}
 		out = p->t->frameout(p);
 	}
-	if (consume) {
-		ast_frfree(f);
-	}
-	if (out == NULL) {
-		return NULL;
-	}
-	/* we have a frame, play with times */
-	if (!ast_tvzero(delivery)) {
-		/* Regenerate prediction after a discontinuity */
-		if (ast_tvzero(path->nextout)) {
-			path->nextout = ast_tvnow();
-		}
+	if (out) {
+		/* we have a frame, play with times */
+		if (!ast_tvzero(delivery)) {
+			/* Regenerate prediction after a discontinuity */
+			if (ast_tvzero(path->nextout)) {
+				path->nextout = ast_tvnow();
+			}
 
-		/* Use next predicted outgoing timestamp */
-		out->delivery = path->nextout;
+			/* Use next predicted outgoing timestamp */
+			out->delivery = path->nextout;
 
-		/* Predict next outgoing timestamp from samples in this
-		   frame. */
-		path->nextout = ast_tvadd(path->nextout, ast_samp2tv(out->samples, ast_format_rate(&out->subclass.format)));
-		if (f->samples != out->samples && ast_test_flag(out, AST_FRFLAG_HAS_TIMING_INFO)) {
-			ast_debug(4, "Sample size different %u vs %u\n", f->samples, out->samples);
-			ast_clear_flag(out, AST_FRFLAG_HAS_TIMING_INFO);
+			/* Predict next outgoing timestamp from samples in this
+			   frame. */
+			path->nextout = ast_tvadd(path->nextout, ast_samp2tv(out->samples, ast_format_rate(&out->subclass.format)));
+			if (f->samples != out->samples && ast_test_flag(out, AST_FRFLAG_HAS_TIMING_INFO)) {
+				ast_debug(4, "Sample size different %u vs %u\n", f->samples, out->samples);
+				ast_clear_flag(out, AST_FRFLAG_HAS_TIMING_INFO);
+			}
+		} else {
+			out->delivery = ast_tv(0, 0);
+			ast_set2_flag(out, has_timing_info, AST_FRFLAG_HAS_TIMING_INFO);
+			if (has_timing_info) {
+				out->ts = ts;
+				out->len = len;
+				out->seqno = seqno;
+			}
 		}
-	} else {
-		out->delivery = ast_tv(0, 0);
-		ast_set2_flag(out, has_timing_info, AST_FRFLAG_HAS_TIMING_INFO);
-		if (has_timing_info) {
-			out->ts = ts;
-			out->len = len;
-			out->seqno = seqno;
+		/* Invalidate prediction if we're entering a silence period */
+		if (out->frametype == AST_FRAME_CNG) {
+			path->nextout = ast_tv(0, 0);
 		}
 	}
-	/* Invalidate prediction if we're entering a silence period */
-	if (out->frametype == AST_FRAME_CNG) {
-		path->nextout = ast_tv(0, 0);
+	if (consume) {
+		ast_frfree(f);
 	}
 	return out;
 }