Thread: [Redbutton-devel] SF.net SVN: redbutton: [40] redbutton-browser/trunk/mpegts.c
Brought to you by:
skilvington
|
From: <ski...@us...> - 2006-05-02 13:00:31
|
Revision: 40 Author: skilvington Date: 2006-05-02 06:00:11 -0700 (Tue, 02 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=40&view=rev Log Message: ----------- change printf() to error() Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-02 12:53:37 UTC (rev 39) +++ redbutton-browser/trunk/mpegts.c 2006-05-02 13:00:11 UTC (rev 40) @@ -216,7 +216,7 @@ nread += fread(buf + nread, 1, TS_PACKET_SIZE - nread, ts); if(*buf != TS_SYNC_BYTE && !feof(ts)) { - printf("Bad sync byte: 0x%02x\n", *buf); + error("MPEG TS demux: bad sync byte: 0x%02x\n", *buf); memmove(buf, buf + 1, TS_PACKET_SIZE - 1); nread = TS_PACKET_SIZE - 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-02 13:02:24
|
Revision: 41 Author: skilvington Date: 2006-05-02 06:02:15 -0700 (Tue, 02 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=41&view=rev Log Message: ----------- remove \n Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-02 13:00:11 UTC (rev 40) +++ redbutton-browser/trunk/mpegts.c 2006-05-02 13:02:15 UTC (rev 41) @@ -216,7 +216,7 @@ nread += fread(buf + nread, 1, TS_PACKET_SIZE - nread, ts); if(*buf != TS_SYNC_BYTE && !feof(ts)) { - error("MPEG TS demux: bad sync byte: 0x%02x\n", *buf); + error("MPEG TS demux: bad sync byte: 0x%02x", *buf); memmove(buf, buf + 1, TS_PACKET_SIZE - 1); nread = TS_PACKET_SIZE - 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-02 15:02:17
|
Revision: 42 Author: skilvington Date: 2006-05-02 08:02:06 -0700 (Tue, 02 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=42&view=rev Log Message: ----------- return the correct PTS Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-02 13:02:15 UTC (rev 41) +++ redbutton-browser/trunk/mpegts.c 2006-05-02 15:02:06 UTC (rev 42) @@ -116,20 +116,8 @@ if((pes = add_pes_stream(ctx, packet.stream_index)) == NULL) fatal("mpegts_demux_frame: internal error"); /* is it the first packet of the next frame */ - if(ctx->is_start != 0) + if(ctx->is_start == 0) { - /* a new frame, remember its PTS (or calc from the previous one) */ - if(packet.pts == AV_NOPTS_VALUE && pes->frame_pts != AV_NOPTS_VALUE) - pes->frame_pts += 3600; - else - pes->frame_pts = packet.pts; - if(packet.dts == AV_NOPTS_VALUE && pes->frame_dts != AV_NOPTS_VALUE) - pes->frame_dts += 3600; - else - pes->frame_dts = packet.dts; - } - else - { /* not a new frame, add data to the exisiting one */ pes->frame_data = safe_realloc(pes->frame_data, pes->frame_size + packet.size); memcpy(pes->frame_data + pes->frame_size, packet.data, packet.size); @@ -141,7 +129,9 @@ /* * pes->frame_data contains the last frame + * copy it into the output packet * packet contains the first packet of the next frame + * copy it into the PES context for the stream */ if(av_new_packet(frame, pes->frame_size) != 0) return -1; @@ -156,6 +146,16 @@ pes->frame_size = packet.size; memcpy(pes->frame_data, packet.data, packet.size); + /* remember the new frame's PTS (or calc from the previous one) */ + if(packet.pts == AV_NOPTS_VALUE && pes->frame_pts != AV_NOPTS_VALUE) + pes->frame_pts += 3600; + else + pes->frame_pts = packet.pts; + if(packet.dts == AV_NOPTS_VALUE && pes->frame_dts != AV_NOPTS_VALUE) + pes->frame_dts += 3600; + else + pes->frame_dts = packet.dts; + av_free_packet(&packet); return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-02 15:41:35
|
Revision: 43 Author: skilvington Date: 2006-05-02 08:41:28 -0700 (Tue, 02 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=43&view=rev Log Message: ----------- free packet on error Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-02 15:02:06 UTC (rev 42) +++ redbutton-browser/trunk/mpegts.c 2006-05-02 15:41:28 UTC (rev 43) @@ -134,7 +134,10 @@ * copy it into the PES context for the stream */ if(av_new_packet(frame, pes->frame_size) != 0) + { + av_free_packet(&packet); return -1; + } memcpy(frame->data, pes->frame_data, pes->frame_size); frame->stream_index = pes->pid; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-06 08:27:11
|
Revision: 44 Author: skilvington Date: 2006-05-06 01:27:03 -0700 (Sat, 06 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=44&view=rev Log Message: ----------- only realloc when needed Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-02 15:41:28 UTC (rev 43) +++ redbutton-browser/trunk/mpegts.c 2006-05-06 08:27:03 UTC (rev 44) @@ -37,6 +37,8 @@ #define TS_PACKET_SIZE 188 #define NB_PID_MAX 2 +/* expands as necessary */ +#define INIT_FRAME_BUFF_SIZE (128 * 1024) typedef struct PESContext PESContext; @@ -77,7 +79,8 @@ int64_t frame_pts; int64_t frame_dts; uint8_t *frame_data; - unsigned int frame_size; + unsigned int frame_size; /* number of bytes of valid data in frame_data */ + unsigned int alloc_size; /* number of bytes malloc'ed to frame_data */ }; static int read_packet(FILE *, uint8_t *); @@ -108,6 +111,7 @@ { AVPacket packet; PESContext *pes; + uint8_t *frame_data; do { @@ -119,7 +123,12 @@ if(ctx->is_start == 0) { /* not a new frame, add data to the exisiting one */ - pes->frame_data = safe_realloc(pes->frame_data, pes->frame_size + packet.size); + if((frame_data = av_fast_realloc(pes->frame_data, &pes->alloc_size, pes->frame_size + packet.size)) == NULL) + { + av_free_packet(&packet); + return -1; + } + pes->frame_data = frame_data; memcpy(pes->frame_data + pes->frame_size, packet.data, packet.size); pes->frame_size += packet.size; av_free_packet(&packet); @@ -145,7 +154,13 @@ frame->dts = pes->frame_dts; /* copy the first packet of the next frame into PES context */ - pes->frame_data = safe_realloc(pes->frame_data, packet.size); + if((frame_data = av_fast_realloc(pes->frame_data, &pes->alloc_size, packet.size)) == NULL) + { + av_free_packet(&packet); + av_free_packet(frame); + return -1; + } + pes->frame_data = frame_data; pes->frame_size = packet.size; memcpy(pes->frame_data, packet.data, packet.size); @@ -192,7 +207,7 @@ for(i=0; i<NB_PID_MAX; i++) { - safe_free(ctx->pids[i]->frame_data); + av_free(ctx->pids[i]->frame_data); av_free(ctx->pids[i]); } av_free(ctx); @@ -293,6 +308,13 @@ pes->ts = ctx; pes->pid = pid; + pes->alloc_size = INIT_FRAME_BUFF_SIZE; + if((pes->frame_data = av_malloc(pes->alloc_size)) == NULL) + { + av_free(pes); + return NULL; + } + pes->frame_pts = AV_NOPTS_VALUE; pes->frame_dts = AV_NOPTS_VALUE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-06 19:32:13
|
Revision: 45 Author: skilvington Date: 2006-05-06 12:31:53 -0700 (Sat, 06 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=45&view=rev Log Message: ----------- don't like ffmpeg coding style Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-06 08:27:03 UTC (rev 44) +++ redbutton-browser/trunk/mpegts.c 2006-05-06 19:31:53 UTC (rev 45) @@ -188,14 +188,13 @@ ctx->pkt = pkt; ctx->stop_parse = 0; - for(;;) + do { - if(ctx->stop_parse) - break; if((ret = read_packet(ctx->ts_stream, packet)) != 0) return ret; handle_packet(ctx, packet); } + while(ctx->stop_parse == 0); return 0; } @@ -365,7 +364,7 @@ pes->state = MPEGTS_PESHEADER_FILL; pes->total_size = (pes->header[4] << 8) | pes->header[5]; /* NOTE: a zero total size means the PES size is unbounded */ - if (pes->total_size) + if(pes->total_size) pes->total_size += 6; pes->pes_header_size = pes->header[8] + 9; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-08 15:55:58
|
Revision: 46 Author: skilvington Date: 2006-05-08 08:55:52 -0700 (Mon, 08 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=46&view=rev Log Message: ----------- don't block when input closes Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-06 19:31:53 UTC (rev 45) +++ redbutton-browser/trunk/mpegts.c 2006-05-08 15:55:52 UTC (rev 46) @@ -115,7 +115,11 @@ do { - mpegts_demux_packet(ctx, &packet); + if(mpegts_demux_packet(ctx, &packet) < 0) + { + av_free_packet(&packet); + return -1; + } /* find the stream */ if((pes = add_pes_stream(ctx, packet.stream_index)) == NULL) fatal("mpegts_demux_frame: internal error"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-10 11:07:19
|
Revision: 47 Author: skilvington Date: 2006-05-10 04:07:12 -0700 (Wed, 10 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=47&view=rev Log Message: ----------- avoid NULL ptr dereference Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-08 15:55:52 UTC (rev 46) +++ redbutton-browser/trunk/mpegts.c 2006-05-10 11:07:12 UTC (rev 47) @@ -210,8 +210,11 @@ for(i=0; i<NB_PID_MAX; i++) { - av_free(ctx->pids[i]->frame_data); - av_free(ctx->pids[i]); + if(ctx->pids[i]) + { + av_free(ctx->pids[i]->frame_data); + av_free(ctx->pids[i]); + } } av_free(ctx); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-05-19 16:14:05
|
Revision: 70 Author: skilvington Date: 2006-05-19 09:13:56 -0700 (Fri, 19 May 2006) ViewCVS: http://svn.sourceforge.net/redbutton/?rev=70&view=rev Log Message: ----------- be less verbose on TS sync errors Modified Paths: -------------- redbutton-browser/trunk/mpegts.c Modified: redbutton-browser/trunk/mpegts.c =================================================================== --- redbutton-browser/trunk/mpegts.c 2006-05-18 18:14:23 UTC (rev 69) +++ redbutton-browser/trunk/mpegts.c 2006-05-19 16:13:56 UTC (rev 70) @@ -34,6 +34,7 @@ #include "mpegts.h" #include "utils.h" +#include "MHEGEngine.h" #define TS_PACKET_SIZE 188 #define NB_PID_MAX 2 @@ -230,8 +231,10 @@ read_packet(FILE *ts, uint8_t *buf) { size_t nread; + unsigned int resync; /* find the next sync byte */ + resync = 0; nread = 0; do { @@ -240,7 +243,7 @@ nread += fread(buf + nread, 1, TS_PACKET_SIZE - nread, ts); if(*buf != TS_SYNC_BYTE && !feof(ts)) { - error("MPEG TS demux: bad sync byte: 0x%02x", *buf); + resync ++; memmove(buf, buf + 1, TS_PACKET_SIZE - 1); nread = TS_PACKET_SIZE - 1; } @@ -250,6 +253,9 @@ if(feof(ts)) return -1; + if(resync > 0) + verbose("MPEG TS demux: lost sync; skipped %u bytes", resync); + return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
|
From: <ski...@us...> - 2006-12-18 16:09:26
|
Revision: 161
http://svn.sourceforge.net/redbutton/?rev=161&view=rev
Author: skilvington
Date: 2006-12-18 08:09:23 -0800 (Mon, 18 Dec 2006)
Log Message:
-----------
allow reading less than TS_PACKET_SIZE bytes in one go
Modified Paths:
--------------
redbutton-browser/trunk/mpegts.c
Modified: redbutton-browser/trunk/mpegts.c
===================================================================
--- redbutton-browser/trunk/mpegts.c 2006-12-15 17:11:53 UTC (rev 160)
+++ redbutton-browser/trunk/mpegts.c 2006-12-18 16:09:23 UTC (rev 161)
@@ -236,19 +236,21 @@
/* find the next sync byte */
resync = 0;
nread = 0;
+ *buf = 0;
do
{
/* read the whole of the next packet */
while(nread != TS_PACKET_SIZE && !feof(ts))
nread += fread(buf + nread, 1, TS_PACKET_SIZE - nread, ts);
- if(*buf != TS_SYNC_BYTE && !feof(ts))
+ if(nread > 0 && *buf != TS_SYNC_BYTE && !feof(ts))
{
resync ++;
- memmove(buf, buf + 1, TS_PACKET_SIZE - 1);
- nread = TS_PACKET_SIZE - 1;
+ memmove(buf, buf + 1, nread - 1);
+ buf[nread - 1] = 0;
+ nread --;
}
}
- while(*buf != TS_SYNC_BYTE && !feof(ts));
+ while(nread < TS_PACKET_SIZE && *buf != TS_SYNC_BYTE && !feof(ts));
if(feof(ts))
return -1;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ski...@us...> - 2006-12-18 16:23:16
|
Revision: 162
http://svn.sourceforge.net/redbutton/?rev=162&view=rev
Author: skilvington
Date: 2006-12-18 08:23:09 -0800 (Mon, 18 Dec 2006)
Log Message:
-----------
how we would do CC checking
Modified Paths:
--------------
redbutton-browser/trunk/mpegts.c
Modified: redbutton-browser/trunk/mpegts.c
===================================================================
--- redbutton-browser/trunk/mpegts.c 2006-12-18 16:09:23 UTC (rev 161)
+++ redbutton-browser/trunk/mpegts.c 2006-12-18 16:23:09 UTC (rev 162)
@@ -50,6 +50,7 @@
int stop_parse; /* stop parsing loop */
PESContext *pids[NB_PID_MAX]; /* PIDs we are demuxing */
int is_start; /* is the current packet the first of a frame */
+ int last_cc; /* last Continuity Check value we saw (<0 => none seen yet) */
};
/* TS stream handling */
@@ -104,6 +105,9 @@
ctx->is_start = 0;
+ /* last continuity check value (-1 => CC always passes) */
+ ctx->last_cc = -1;
+
return ctx;
}
@@ -266,6 +270,7 @@
handle_packet(MpegTSContext *ctx, const uint8_t *packet)
{
PESContext *pes;
+ int cc, cc_ok;
int pid, afc;
const uint8_t *p, *p_end;
@@ -276,11 +281,14 @@
ctx->is_start = packet[1] & 0x40;
+ /* continuity check */
+ cc = (packet[3] & 0xf);
+ cc_ok = (ctx->last_cc < 0) || (((ctx->last_cc + 1) & 0x0f) == cc);
+ ctx->last_cc = cc;
#if 0
- /* continuity check (currently not used) */
- cc = (packet[3] & 0xf);
- cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc));
- tss->last_cc = cc;
+ /* skip until we find the next start packet */
+ if(!cc_ok && !ctx->is_start)
+ pes->state = MPEGTS_SKIP;
#endif
/* skip adaptation field */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|