Skip to content

Commit

Permalink
Merge pull request #5712 from ant-media/logfix
Browse files Browse the repository at this point in the history
Fix logs from avutils had trailing garbage - Thank you for the contributon @jantekb
  • Loading branch information
mekya committed Oct 22, 2023
2 parents ad6261d + 91ea2ff commit 343d8b4
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 14 deletions.
20 changes: 20 additions & 0 deletions src/main/java/io/antmedia/FFmpegUtilities.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import org.bytedeco.javacpp.BytePointer;

import java.nio.charset.StandardCharsets;


public class FFmpegUtilities {

Expand All @@ -16,4 +18,22 @@ public static String getBuildConfiguration() {
}
return buildConfiguration;
}

/**
* Turns a C-style null terminated string in a byte array as
* a String object, assuming UTF8 encoding of the original data
*
* @param nullTerminatedChars byte buffer that contains a null terminated string
* @return the trimmed string
*/
public static String byteArrayToString(byte[] nullTerminatedChars) {
if(nullTerminatedChars == null) {
return "";
}
int termin = 0;
while(termin < nullTerminatedChars.length && nullTerminatedChars[termin] != 0) {
termin++;
}
return new String(nullTerminatedChars, 0, termin, StandardCharsets.UTF_8);
}
}
5 changes: 2 additions & 3 deletions src/main/java/io/antmedia/muxer/Mp4Muxer.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import java.io.IOException;
import java.nio.file.Files;

import io.antmedia.FFmpegUtilities;
import org.bytedeco.ffmpeg.avcodec.AVBSFContext;
import org.bytedeco.ffmpeg.avcodec.AVBitStreamFilter;
import org.bytedeco.ffmpeg.avcodec.AVCodecParameters;
Expand Down Expand Up @@ -327,9 +328,7 @@ protected void writeAudioFrame(AVPacket pkt, AVRational inputTimebase, AVRationa

ret = av_write_frame(context, getTmpPacket());
if (ret < 0 && logger.isInfoEnabled()) {
byte[] data = new byte[2048];
av_strerror(ret, data, data.length);
logger.info("cannot write audio frame to muxer({}) av_bsf_receive_packet. Error is {} ", file.getName(), new String(data, 0, data.length));
logger.info("cannot write audio frame to muxer({}) av_bsf_receive_packet. Error is {} ", file.getName(), getErrorDefinition(ret));
logger.info("input timebase num/den {}/{}"
+ "output timebase num/den {}/{}", inputTimebase.num(), inputTimebase.den(),
outputTimebase.num(), outputTimebase.den());
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/io/antmedia/muxer/Muxer.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

import io.antmedia.FFmpegUtilities;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.bytedeco.ffmpeg.avcodec.AVBSFContext;
import org.bytedeco.ffmpeg.avcodec.AVBitStreamFilter;
Expand Down Expand Up @@ -1112,7 +1113,7 @@ public static long getDurationInMs(File f, String streamId) {
public static String getErrorDefinition(int errorCode) {
byte[] data = new byte[128];
av_strerror(errorCode, data, data.length);
return new String(data, 0, data.length);
return FFmpegUtilities.byteArrayToString(data);
}

/**
Expand Down
8 changes: 3 additions & 5 deletions src/main/java/io/antmedia/streamsource/StreamFetcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;

import io.antmedia.FFmpegUtilities;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.avformat.AVFormatContext;
Expand All @@ -34,6 +35,7 @@
import io.antmedia.datastore.db.types.Broadcast;
import io.antmedia.muxer.IAntMediaStreamHandler;
import io.antmedia.muxer.MuxAdaptor;
import io.antmedia.muxer.Muxer;
import io.antmedia.rest.model.Result;
import io.vertx.core.Vertx;

Expand Down Expand Up @@ -170,11 +172,7 @@ public Result prepareInput(AVFormatContext inputFormatContext) {

if ((ret = avformat_open_input(inputFormatContext, streamUrl, null, optionsDictionary)) < 0) {

byte[] data = new byte[100];
avutil.av_strerror(ret, data, data.length);

String errorStr=new String(data, 0, data.length);

String errorStr = Muxer.getErrorDefinition(ret);
result.setMessage(errorStr);

logger.error("cannot open stream: {} with error:: {}", streamUrl, result.getMessage());
Expand Down
33 changes: 33 additions & 0 deletions src/test/java/io/antmedia/FFmpegUtilitiesTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.antmedia;

import org.bytedeco.ffmpeg.global.avutil;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class FFmpegUtilitiesTest {

@Test
public void testByteArrayToString() {
byte[] input = new byte[] { 'h', 'e', 'l', 'l', 'o', 0, '@'};
assertEquals("hello", FFmpegUtilities.byteArrayToString(input));
}

@Test
public void testZeroLengthInput() {
assertEquals("", FFmpegUtilities.byteArrayToString(new byte[]{}));
assertEquals("", FFmpegUtilities.byteArrayToString(null));
}

@Test
public void testNonTerminatedArray() {
assertEquals("x", FFmpegUtilities.byteArrayToString(new byte[] { 'x' }));
}

@Test
public void testAvStrErrorUsage() {
byte[] buffer = new byte[128];
avutil.av_strerror(-22, buffer, 128);
assertEquals("Invalid argument", FFmpegUtilities.byteArrayToString(buffer));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1123,6 +1123,12 @@ public void testAllowOnlyStreamsInDataStore() {
});

AppFunctionalV2Test.destroyProcess();

Awaitility.await().atMost(10, TimeUnit.SECONDS).pollInterval(1, TimeUnit.SECONDS)
.until(() -> {
Broadcast broadcast2 = RestServiceV2Test.callGetBroadcast(broadcastCreated.getStreamId());
return broadcast2 != null && broadcast2.getStatus().equals(AntMediaApplicationAdapter.BROADCAST_STATUS_FINISHED);
});
}

{
Expand Down
3 changes: 0 additions & 3 deletions src/test/java/io/antmedia/integration/MuxingTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@
import static org.bytedeco.ffmpeg.global.avformat.avformat_find_stream_info;
import static org.bytedeco.ffmpeg.global.avformat.avformat_network_init;
import static org.bytedeco.ffmpeg.global.avformat.avformat_open_input;
import static org.bytedeco.ffmpeg.global.avformat.av_dump_format;
import static org.bytedeco.ffmpeg.global.avutil.av_dict_set;
import static org.bytedeco.ffmpeg.global.avutil.av_strerror;
import static org.bytedeco.ffmpeg.global.avutil.AVMEDIA_TYPE_AUDIO;
import static org.bytedeco.ffmpeg.global.avutil.AVMEDIA_TYPE_VIDEO;
import static org.bytedeco.ffmpeg.global.avutil.AV_NOPTS_VALUE;
Expand Down
6 changes: 4 additions & 2 deletions src/test/java/io/antmedia/test/StreamSchedularUnitTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.List;
import java.util.concurrent.TimeUnit;

import io.antmedia.FFmpegUtilities;
import org.apache.commons.lang3.RandomUtils;
import org.awaitility.Awaitility;
import org.bytedeco.ffmpeg.avcodec.AVPacket;
Expand Down Expand Up @@ -738,7 +739,8 @@ public void testIPTVStream() {

byte[] data = new byte[1024];
avutil.av_strerror(ret, data, data.length);
logger.error("cannot open input context with error: " + new String(data, 0, data.length) + "ret value = "+ String.valueOf(ret));
logger.error("cannot open input context with error: {} ret value = {}",
FFmpegUtilities.byteArrayToString(data), ret);
return;
}

Expand All @@ -759,7 +761,7 @@ public void testIPTVStream() {
byte[] data = new byte[1024];
avutil.av_strerror(ret, data, data.length);

logger.error("cannot read frame from input context: " + new String(data, 0, data.length));
logger.error("cannot read frame from input context: {}", FFmpegUtilities.byteArrayToString(data));
}

av_packet_unref(pkt);
Expand Down

0 comments on commit 343d8b4

Please sign in to comment.