summaryrefslogtreecommitdiff
path: root/src/liana/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/liana/handlers')
-rw-r--r--src/liana/handlers/codec_client.c44
-rw-r--r--src/liana/handlers/codec_server.c18
2 files changed, 54 insertions, 8 deletions
diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c
index 3722197..2492533 100644
--- a/src/liana/handlers/codec_client.c
+++ b/src/liana/handlers/codec_client.c
@@ -1,8 +1,11 @@
#include "../../codec/codec.h"
+#include "../../server/common.h"
+
#ifdef CAMU_HAVE_FFMPEG
#include "../../codec/ffmpeg/decoder.h"
#include "../../codec/ffmpeg/packet_ext.h"
#endif
+
#include "../../codec/stb_image/decoder.h"
#include "../../codec/spng/decoder.h"
#include "../../codec/wuffs/decoder.h"
@@ -37,9 +40,7 @@ static bool codec_client_init(struct lia_client_handler *handler, struct camu_re
#ifdef CAMU_HAVE_FFMPEG
static bool push_av_packet(struct lia_codec_client *codec, AVPacket *pkt)
{
- struct camu_codec_packet packet;
- packet.av.pkt = pkt;
- s32 ret = codec->dec->push(codec->dec, &packet);
+ s32 ret = codec->dec->push_av_packet(codec->dec, pkt);
return ret == CAMU_OK;
}
#endif
@@ -60,7 +61,14 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc
if (!packet) {
if (codec->dec) {
// Flush always returns success.
- codec->dec->push(codec->dec, NULL);
+ switch (codec->dec->mode) {
+ case CAMU_NORMAL:
+ codec->dec->push(codec->dec, NULL);
+ break;
+ case CAMU_FFMPEG_COMPAT:
+ codec->dec->push_av_packet(codec->dec, NULL);
+ break;
+ }
// process() could still error.
s32 ret = codec->dec->process(codec->dec);
codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_EOF, codec->handler.stream, NULL);
@@ -71,14 +79,19 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc
}
// Push packet.
+ u32 rindex = packet->rindex;
bool success;
- u8 type = nn_packet_read_u8(packet);
- switch (type) {
+ u8 mode = nn_packet_read_u8(packet);
+ switch (mode) {
case CAMU_NORMAL: {
if (codec->dec) {
+#ifdef CAMU_DIRECT_MODE
+ success = push_packet(codec, (struct nn_buffer *)packet->opaque);
+#else
struct nn_buffer buffer;
nn_packet_read_buffer(packet, &buffer);
success = push_packet(codec, &buffer);
+#endif
} else {
success = true;
}
@@ -86,15 +99,27 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc
}
#ifdef CAMU_HAVE_FFMPEG
case CAMU_FFMPEG_COMPAT: {
- AVPacket *pkt = nn_packet_read_av_packet(packet);
+ AVPacket *pkt;
+ if (packet->opaque) {
+ pkt = (AVPacket *)packet->opaque;
+ } else {
+ pkt = av_packet_alloc();
+ nn_packet_read_av_packet(packet, pkt);
+ packet->opaque = pkt;
+ }
+ struct camu_codec_stream *stream = codec->handler.stream;
if (codec->dec) {
success = push_av_packet(codec, pkt);
} else {
- codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_SUBTITLE, codec->handler.stream, pkt);
+ codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_SUBTITLE, stream, pkt);
success = true;
}
+#ifdef VCR_BUFFER_WHOLE_FILE
+ pkt->pts += av_rescale_q(stream->duration, AV_TIME_BASE_Q, stream->av.stream->time_base);
+#else
av_packet_unref(pkt);
av_packet_free(&pkt);
+#endif
break;
}
default:
@@ -102,6 +127,9 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc
#endif
}
+ // Restore packet rindex in case we resue it.
+ packet->rindex = rindex;
+
if (!success) {
// Forcing in EOF on an error is not necessary but should exhibit less erratic behavior sink-side.
codec->handler.callback(codec->handler.userdata, LIANA_CLIENT_EOF, codec->handler.stream, NULL);
diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c
index 7167f97..24552bb 100644
--- a/src/liana/handlers/codec_server.c
+++ b/src/liana/handlers/codec_server.c
@@ -1,8 +1,11 @@
#include "../../codec/codec.h"
+#include "../../server/common.h"
+
#ifdef CAMU_HAVE_FFMPEG
#include "../../codec/ffmpeg/demuxer.h"
#include "../../codec/ffmpeg/packet_ext.h"
#endif
+
#include "../../codec/stb_image/demuxer.h"
#include "../../codec/spng/demuxer.h"
#include "../../codec/wuffs/demuxer.h"
@@ -26,7 +29,9 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han
break;
#ifdef CAMU_HAVE_FFMPEG
case CAMU_FFMPEG_COMPAT:
+#ifndef CAMU_DIRECT_MODE
codec->packet.av.pkt = av_packet_alloc();
+#endif
break;
#endif
}
@@ -84,6 +89,9 @@ static bool codec_server_seek(struct lia_server_handler *handler, u64 pos)
static void codec_server_step(struct lia_server_handler *handler)
{
struct lia_codec_server *codec = (struct lia_codec_server *)handler;
+#ifdef CAMU_DIRECT_MODE
+ codec->packet.av.pkt = av_packet_alloc();
+#endif
codec->handler.status = codec->demux->get_packet(codec->demux, &codec->packet);
}
@@ -96,7 +104,11 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct
case CAMU_NORMAL: {
nn_packet_write_s32(packet, 0);
nn_packet_write_u8(packet, codec->packet.mode);
+#ifdef CAMU_DIRECT_MODE
+ packet->opaque = codec->packet.buffer;
+#else
nn_packet_write_buffer(packet, codec->packet.buffer);
+#endif
break;
}
#ifdef CAMU_HAVE_FFMPEG
@@ -104,8 +116,12 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct
AVPacket *pkt = codec->packet.av.pkt;
nn_packet_write_s32(packet, pkt->stream_index);
nn_packet_write_u8(packet, codec->packet.mode);
+#ifdef CAMU_DIRECT_MODE
+ packet->opaque = pkt;
+#else
nn_packet_write_av_packet(packet, pkt);
av_packet_unref(pkt);
+#endif
break;
}
#endif
@@ -125,7 +141,9 @@ static void codec_server_free(struct lia_server_handler **handler)
break;
#ifdef CAMU_HAVE_FFMPEG
case CAMU_FFMPEG_COMPAT:
+#ifndef CAMU_DIRECT_MODE
av_packet_free(&codec->packet.av.pkt);
+#endif
break;
#endif
}