Do not transmit MediaCodec flags

Since PTS handling has been fixed, the recorder do not associate a PTS
to a wrong frame anymore, so PTS of "configuration packets" (which never
produce a frame), are never read by the recorder. Therefore, there is no
need to ignore them explicitly, so we can remove the MediaCodec flags
completely.
This commit is contained in:
Romain Vimont 2018-11-11 00:35:53 +01:00
parent 27e8a9a79d
commit 475912a39c
3 changed files with 11 additions and 20 deletions

View file

@ -15,7 +15,6 @@
#include "recorder.h" #include "recorder.h"
#define BUFSIZE 0x10000 #define BUFSIZE 0x10000
#define MEDIA_CODEC_FLAG_CONFIG 2 // MediaCodec.BUFFER_FLAG_CODEC_CONFIG
static inline uint64_t from_be(uint8_t *b, int size) static inline uint64_t from_be(uint8_t *b, int size)
{ {
@ -30,7 +29,7 @@ static inline uint64_t from_be(uint8_t *b, int size)
return x; return x;
} }
#define HEADER_SIZE 16 #define HEADER_SIZE 12
static int read_packet(void *opaque, uint8_t *buf, int buf_size) { static int read_packet(void *opaque, uint8_t *buf, int buf_size) {
struct decoder *decoder = opaque; struct decoder *decoder = opaque;
@ -50,8 +49,7 @@ static int read_packet(void *opaque, uint8_t *buf, int buf_size) {
// read the PTS for the next frame // read the PTS for the next frame
decoder->next_pts = from_be(header, 8); decoder->next_pts = from_be(header, 8);
decoder->buffer_info_flags = from_be(header + 8, 4); remaining = from_be(header + 8, 4);
remaining = from_be(header + 12, 4);
} }
if (buf_size > remaining) if (buf_size > remaining)
@ -181,20 +179,15 @@ static int run_decoder(void *data) {
#endif #endif
if (decoder->recorder) { if (decoder->recorder) {
// do not record configuration packets packet.pts = decoder->pts;
// (they contain no media data and have no PTS/DTS) packet.dts = decoder->pts;
// FIXME do not use MediaCodec specific flags
if (!(decoder->buffer_info_flags & MEDIA_CODEC_FLAG_CONFIG)) {
packet.pts = decoder->pts;
packet.dts = decoder->pts;
// no need to rescale with av_packet_rescale_ts(), the timestamps // no need to rescale with av_packet_rescale_ts(), the timestamps
// are in microseconds both in input and output // are in microseconds both in input and output
if (!recorder_write(decoder->recorder, &packet)) { if (!recorder_write(decoder->recorder, &packet)) {
LOGE("Could not write frame to output file"); LOGE("Could not write frame to output file");
av_packet_unref(&packet); av_packet_unref(&packet);
goto run_quit; goto run_quit;
}
} }
} }

View file

@ -17,7 +17,6 @@ struct decoder {
struct recorder *recorder; struct recorder *recorder;
uint64_t next_pts; uint64_t next_pts;
uint64_t pts; uint64_t pts;
uint32_t buffer_info_flags;
int remaining; int remaining;
}; };

View file

@ -82,7 +82,7 @@ public class ScreenEncoder implements Device.RotationListener {
private boolean encode(MediaCodec codec, FileDescriptor fd) throws IOException { private boolean encode(MediaCodec codec, FileDescriptor fd) throws IOException {
boolean eof = false; boolean eof = false;
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
ByteBuffer bBuffer = ByteBuffer.allocate(16); ByteBuffer bBuffer = ByteBuffer.allocate(12);
while (!consumeRotationChange() && !eof) { while (!consumeRotationChange() && !eof) {
int outputBufferId = codec.dequeueOutputBuffer(bufferInfo, -1); int outputBufferId = codec.dequeueOutputBuffer(bufferInfo, -1);
@ -107,7 +107,6 @@ public class ScreenEncoder implements Device.RotationListener {
} }
bBuffer.putLong(pts); bBuffer.putLong(pts);
bBuffer.putInt(bufferInfo.flags);
bBuffer.putInt(codecBuffer.remaining()); bBuffer.putInt(codecBuffer.remaining());
bBuffer.flip(); bBuffer.flip();
IO.writeFully(fd, bBuffer); IO.writeFully(fd, bBuffer);