libeplayer3/h264: replace malloc/memcpy/write with writev

Origin commit data
------------------
Branch: master
Commit: 8d8aa01f98
Author: martii <m4rtii@gmx.de>
Date: 2013-06-08 (Sat, 08 Jun 2013)


------------------
No further description and justification available within origin commit message!

------------------
This commit was generated by Migit
This commit is contained in:
martii
2013-06-08 10:19:40 +02:00
parent 185987f0da
commit 050ca539ba

View File

@@ -31,12 +31,14 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/uio.h>
#include <linux/dvb/video.h> #include <linux/dvb/video.h>
#include <linux/dvb/audio.h> #include <linux/dvb/audio.h>
#include <memory.h> #include <memory.h>
#include <asm/types.h> #include <asm/types.h>
#include <pthread.h> #include <pthread.h>
#include <errno.h> #include <errno.h>
#include <assert.h>
#include "common.h" #include "common.h"
#include "output.h" #include "output.h"
@@ -112,13 +114,14 @@ static int writeData(void* _call)
unsigned char* PacketStart = NULL; unsigned char* PacketStart = NULL;
unsigned int PacketStartSIZE = 0; unsigned int PacketStartSIZE = 0;
unsigned int HeaderLength;
unsigned char PesHeader[PES_MAX_HEADER_SIZE]; unsigned char PesHeader[PES_MAX_HEADER_SIZE];
unsigned long long int VideoPts; unsigned long long int VideoPts;
unsigned int TimeDelta; unsigned int TimeDelta;
unsigned int TimeScale; unsigned int TimeScale;
int len = 0; int len = 0;
static int NoOtherBeginningFound = 1; static int NoOtherBeginningFound = 1;
int ic = 0;
struct iovec iov[128];
h264_printf(10, "\n"); h264_printf(10, "\n");
if (call == NULL) if (call == NULL)
@@ -149,34 +152,30 @@ static int writeData(void* _call)
(call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x01 && NoOtherBeginningFound) || (call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x01 && NoOtherBeginningFound) ||
(call->data[0] == 0xff && call->data[1] == 0xff && call->data[2] == 0xff && call->data[3] == 0xff)) (call->data[0] == 0xff && call->data[1] == 0xff && call->data[2] == 0xff && call->data[3] == 0xff))
{ {
unsigned int PacketLength = 0;
unsigned int FakeStartCode = (call->Version << 8) | PES_VERSION_FAKE_START_CODE; unsigned int FakeStartCode = (call->Version << 8) | PES_VERSION_FAKE_START_CODE;
unsigned int PrivateLength=0; iov[ic++].iov_base = PesHeader;
if(initialHeader)PrivateLength = call->private_size; if (initialHeader) {
HeaderLength = InsertPesHeader(PesHeader, call->len, initialHeader = 0;
MPEG_VIDEO_PES_START_CODE, call->Pts, FakeStartCode); iov[ic].iov_base = call->private_data;
iov[ic++].iov_len = call->private_size;
PacketLength += call->private_size;
}
iov[ic].iov_base = call->data;
iov[ic++].iov_len = call->len;
PacketLength += call->len;
/*Hellmaster1024: some packets will only be accepted by the player if we send one byte more than /*Hellmaster1024: some packets will only be accepted by the player if we send one byte more than
data is available. The content of this byte does not matter. It will be ignored data is available. The content of this byte does not matter. It will be ignored
by the player */ by the player */
unsigned char *PacketData = malloc(HeaderLength + call->len + PrivateLength + 1); iov[ic].iov_base = "";
iov[ic++].iov_len = 1;
memcpy(PacketData, PesHeader, HeaderLength); iov[0].iov_len = InsertPesHeader(PesHeader, PacketLength, MPEG_VIDEO_PES_START_CODE, call->Pts, FakeStartCode);
if(initialHeader){ return writev(call->fd, iov, ic);
memcpy (PacketData + HeaderLength, call->private_data, PrivateLength);
initialHeader=0;
}
memcpy (PacketData + HeaderLength + PrivateLength, call->data, call->len);
len = write(call->fd, PacketData, call->len + HeaderLength + PrivateLength + 1);
free(PacketData);
return len;
} }
NoOtherBeginningFound = 0; NoOtherBeginningFound = 0;
if (initialHeader) if (initialHeader)
{ {
unsigned char* HeaderData = malloc(BUFFER_SIZE+PADDING_LENGTH);
avcC_t* avcCHeader = (avcC_t*)call->private_data; avcC_t* avcCHeader = (avcC_t*)call->private_data;
int i; int i;
unsigned int ParamSets; unsigned int ParamSets;
@@ -184,10 +183,8 @@ static int writeData(void* _call)
unsigned int InitialHeaderLength = 0; unsigned int InitialHeaderLength = 0;
unsigned int ParametersLength; unsigned int ParametersLength;
if (avcCHeader == NULL) if (avcCHeader == NULL) {
{
h264_err("private_data NULL\n"); h264_err("private_data NULL\n");
free(HeaderData);
return -1; return -1;
} }
@@ -196,6 +193,7 @@ static int writeData(void* _call)
ParametersLength = 0; ParametersLength = 0;
unsigned char HeaderData[19];
HeaderData[ParametersLength++] = 0x00; // Start code HeaderData[ParametersLength++] = 0x00; // Start code
HeaderData[ParametersLength++] = 0x00; HeaderData[ParametersLength++] = 0x00;
HeaderData[ParametersLength++] = 0x01; HeaderData[ParametersLength++] = 0x01;
@@ -222,13 +220,16 @@ static int writeData(void* _call)
HeaderData[ParametersLength++] = 0xff; HeaderData[ParametersLength++] = 0xff;
HeaderData[ParametersLength++] = 0x80; // Rsbp trailing bits HeaderData[ParametersLength++] = 0x80; // Rsbp trailing bits
HeaderLength = InsertPesHeader (PesHeader, ParametersLength, MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0); assert(ParametersLength <= sizeof(HeaderData));
PacketStart = malloc(HeaderLength + ParametersLength); ic = 0;
PacketStartSIZE = HeaderLength + ParametersLength; iov[ic].iov_base = PesHeader;
memcpy (PacketStart, PesHeader, HeaderLength); iov[ic++].iov_len = InsertPesHeader (PesHeader, ParametersLength, MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0);
memcpy (PacketStart + HeaderLength, HeaderData, ParametersLength); iov[ic].iov_base = HeaderData;
len += write (call->fd, PacketStart, HeaderLength + ParametersLength); iov[ic++].iov_len = ParametersLength;
len = writev(call->fd, iov, ic);
if (len < 0)
return len;
NalLengthBytes = (avcCHeader->NalLengthMinusOne & 0x03) + 1; NalLengthBytes = (avcCHeader->NalLengthMinusOne & 0x03) + 1;
ParamSets = avcCHeader->NumParamSets & 0x1f; ParamSets = avcCHeader->NumParamSets & 0x1f;
@@ -242,26 +243,18 @@ static int writeData(void* _call)
h264_printf(20, " number of sequence param sets: %d\n", ParamSets); h264_printf(20, " number of sequence param sets: %d\n", ParamSets);
ParamOffset = 0; ParamOffset = 0;
ic = 0;
iov[ic++].iov_base = PesHeader;
for (i = 0; i < ParamSets; i++) { for (i = 0; i < ParamSets; i++) {
unsigned int PsLength = (avcCHeader->Params[ParamOffset] << 8) + avcCHeader->Params[ParamOffset+1]; unsigned int PsLength = (avcCHeader->Params[ParamOffset] << 8) + avcCHeader->Params[ParamOffset+1];
h264_printf(20, " sps %d has length %d\n", i, PsLength); h264_printf(20, " sps %d has length %d\n", i, PsLength);
if (HeaderLength + InitialHeaderLength + sizeof(Head) > PacketStartSIZE) { iov[ic].iov_base = (char *)Head;
PacketStart = realloc(PacketStart, HeaderLength + InitialHeaderLength + sizeof(Head)); iov[ic++].iov_len = sizeof(Head);
PacketStartSIZE = HeaderLength + InitialHeaderLength + sizeof(Head);
}
memcpy (PacketStart + HeaderLength + InitialHeaderLength, Head, sizeof(Head));
InitialHeaderLength += sizeof(Head); InitialHeaderLength += sizeof(Head);
iov[ic].iov_base = &avcCHeader->Params[ParamOffset+2];
if (HeaderLength + InitialHeaderLength + PsLength > PacketStartSIZE) { iov[ic++].iov_len = PsLength;
PacketStart = realloc(PacketStart, HeaderLength + InitialHeaderLength + PsLength);
PacketStartSIZE = HeaderLength + InitialHeaderLength + PsLength;
}
memcpy (PacketStart + HeaderLength + InitialHeaderLength, &avcCHeader->Params[ParamOffset+2], PsLength);
InitialHeaderLength += PsLength; InitialHeaderLength += PsLength;
ParamOffset += PsLength+2; ParamOffset += PsLength+2;
} }
@@ -276,39 +269,29 @@ static int writeData(void* _call)
h264_printf (20, " pps %d has length %d\n", i, PsLength); h264_printf (20, " pps %d has length %d\n", i, PsLength);
if (HeaderLength + InitialHeaderLength + sizeof(Head) > PacketStartSIZE) { iov[ic].iov_base = (char *) Head;
PacketStart = realloc(PacketStart, HeaderLength + InitialHeaderLength + sizeof(Head)); iov[ic++].iov_len = sizeof(Head);
PacketStartSIZE = HeaderLength + InitialHeaderLength + sizeof(Head);
}
memcpy (PacketStart + HeaderLength + InitialHeaderLength, Head, sizeof(Head));
InitialHeaderLength += sizeof(Head); InitialHeaderLength += sizeof(Head);
iov[ic].iov_base = &avcCHeader->Params[ParamOffset+2];
if (HeaderLength + InitialHeaderLength + PsLength > PacketStartSIZE) { iov[ic++].iov_len = PsLength;
PacketStart = realloc(PacketStart, HeaderLength + InitialHeaderLength + PsLength);
PacketStartSIZE = HeaderLength + InitialHeaderLength + PsLength;
}
memcpy (PacketStart + HeaderLength + InitialHeaderLength, &avcCHeader->Params[ParamOffset+2], PsLength);
InitialHeaderLength += PsLength; InitialHeaderLength += PsLength;
ParamOffset += PsLength+2; ParamOffset += PsLength+2;
} }
HeaderLength = InsertPesHeader (PesHeader, InitialHeaderLength, MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0); iov[0].iov_len = InsertPesHeader (PesHeader, InitialHeaderLength, MPEG_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0);
memcpy (PacketStart, PesHeader, HeaderLength); ssize_t l = writev(call->fd, iov, ic);
if (l < 0)
len += write (call->fd, PacketStart, HeaderLength + InitialHeaderLength); return l;
len += l;
initialHeader = 0; initialHeader = 0;
free(PacketStart);
free(HeaderData);
} }
unsigned int SampleSize = call->len; unsigned int SampleSize = call->len;
unsigned int NalStart = 0; unsigned int NalStart = 0;
unsigned int VideoPosition = 0; unsigned int VideoPosition = 0;
ic = 0;
do { do {
unsigned int NalLength; unsigned int NalLength;
unsigned char NalData[4]; unsigned char NalData[4];
@@ -316,10 +299,13 @@ static int writeData(void* _call)
memcpy (NalData, call->data + VideoPosition, NalLengthBytes); memcpy (NalData, call->data + VideoPosition, NalLengthBytes);
VideoPosition += NalLengthBytes; VideoPosition += NalLengthBytes;
NalLength = (NalLengthBytes == 1) ? NalData[0] : NalStart += NalLengthBytes;
(NalLengthBytes == 2) ? (NalData[0] << 8) | NalData[1] : switch(NalLength) {
(NalLengthBytes == 3) ? (NalData[0] << 16) | (NalData[1] << 8) | NalData[2] : case 1: NalLength = (NalData[0]); break;
(NalData[0] << 24) | (NalData[1] << 16) | (NalData[2] << 8) | NalData[3]; case 2: NalLength = (NalData[0] << 8) | (NalData[1]); break;
case 3: NalLength = (NalData[0] << 16) | (NalData[1] << 8) | (NalData[2]); break;
default: NalLength = (NalData[0] << 24) | (NalData[1] << 16) | (NalData[2] << 8) | (NalData[3]); break;
}
h264_printf(20, "NalStart = %u + NalLength = %u > SampleSize = %u\n", NalStart, NalLength, SampleSize); h264_printf(20, "NalStart = %u + NalLength = %u > SampleSize = %u\n", NalStart, NalLength, SampleSize);
@@ -330,45 +316,35 @@ static int writeData(void* _call)
NalStart = SampleSize; NalStart = SampleSize;
} else { } else {
NalStart += NalLength + NalLengthBytes; NalStart += NalLength;
while (NalLength > 0) { while (NalLength > 0) {
unsigned int PacketLength = (NalLength < BUFFER_SIZE) ? NalLength : BUFFER_SIZE; unsigned int PacketLength = (NalLength < BUFFER_SIZE) ? NalLength : BUFFER_SIZE;
int ExtraLength = 0; int ExtraLength = 0;
#ifndef MARTII
unsigned char* PacketStart;
#endif
NalLength -= PacketLength; NalLength -= PacketLength;
if (NalPresent) { ic = 0;
PacketStart = malloc(sizeof(Head) + PacketLength); iov[ic++].iov_base = PesHeader;
memcpy (PacketStart + sizeof(Head), call->data + VideoPosition, PacketLength);
VideoPosition += PacketLength;
memcpy (PacketStart, Head, sizeof(Head)); if (NalPresent) {
ExtraLength = sizeof(Head); NalPresent = 0;
} else { iov[ic].iov_base = (char *)Head;
PacketStart = malloc(PacketLength); iov[ic++].iov_len = sizeof(Head);
memcpy (PacketStart, call->data + VideoPosition, PacketLength); PacketLength += sizeof(Head);
VideoPosition += PacketLength;
} }
PacketLength += ExtraLength; iov[ic].iov_base = call->data + VideoPosition;
iov[ic++].iov_len = PacketLength;
VideoPosition += PacketLength;
h264_printf (20, " pts=%llu\n", VideoPts); h264_printf (20, " pts=%llu\n", VideoPts);
HeaderLength = InsertPesHeader (PesHeader, PacketLength, MPEG_VIDEO_PES_START_CODE, VideoPts, 0); iov[0].iov_len = InsertPesHeader (PesHeader, PacketLength, MPEG_VIDEO_PES_START_CODE, VideoPts, 0);
ssize_t l = writev(call->fd, iov, ic);
if (l < 0)
return l;
len += l;
unsigned char* WritePacketStart = malloc(HeaderLength + PacketLength);
memcpy (WritePacketStart, PesHeader, HeaderLength);
memcpy (WritePacketStart+HeaderLength, PacketStart, PacketLength);
free(PacketStart);
PacketLength += HeaderLength;
len += write (call->fd, WritePacketStart, PacketLength);
free(WritePacketStart);
NalPresent = 0;
VideoPts = INVALID_PTS_VALUE; VideoPts = INVALID_PTS_VALUE;
} }
} }