summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2012-03-30 18:30:00 +0000
committerjstebbins <[email protected]>2012-03-30 18:30:00 +0000
commit53ac2667e27811f96e3d82da706c3371405125e9 (patch)
treebcf3cf1602b265c93fd635693bce0a8953e4f429
parent98e391e23b53f93a9460ce895d7a4b04a43f36b9 (diff)
libhb: Fix problem with TS streams that have no PAT or PMT
Fall back to using libav in this case. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4560 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/stream.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/libhb/stream.c b/libhb/stream.c
index 9f1bba283..3f5680ef2 100644
--- a/libhb/stream.c
+++ b/libhb/stream.c
@@ -250,10 +250,10 @@ static void hb_stream_duration(hb_stream_t *stream, hb_title_t *inTitle);
static off_t align_to_next_packet(hb_stream_t *stream);
static int64_t pes_timestamp( const uint8_t *pes );
-static void hb_ts_stream_init(hb_stream_t *stream);
+static int hb_ts_stream_init(hb_stream_t *stream);
static hb_buffer_t * hb_ts_stream_decode(hb_stream_t *stream);
static void hb_init_audio_list(hb_stream_t *stream, hb_title_t *title);
-static void hb_ts_stream_find_pids(hb_stream_t *stream);
+static int hb_ts_stream_find_pids(hb_stream_t *stream);
static void hb_ps_stream_init(hb_stream_t *stream);
static hb_buffer_t * hb_ps_stream_decode(hb_stream_t *stream);
@@ -614,10 +614,10 @@ static int hb_stream_get_type(hb_stream_t *stream)
" offset %d bytes", psize, offset);
stream->packetsize = psize;
stream->hb_stream_type = transport;
- hb_ts_stream_init(stream);
- return 1;
+ if (hb_ts_stream_init(stream) == 0)
+ return 1;
}
- if ( hb_stream_check_for_ps(stream) != 0 )
+ else if ( hb_stream_check_for_ps(stream) != 0 )
{
hb_log("file is MPEG Program Stream");
stream->hb_stream_type = program;
@@ -2132,7 +2132,7 @@ static void hb_init_audio_list(hb_stream_t *stream, hb_title_t *title)
*
**********************************************************************/
-static void hb_ts_stream_init(hb_stream_t *stream)
+static int hb_ts_stream_init(hb_stream_t *stream)
{
int i;
@@ -2160,7 +2160,10 @@ static void hb_ts_stream_init(hb_stream_t *stream)
stream->ts.packet = malloc( stream->packetsize );
// Find the audio and video pids in the stream
- hb_ts_stream_find_pids(stream);
+ if (hb_ts_stream_find_pids(stream) < 0)
+ {
+ return -1;
+ }
// hb_ts_resolve_pid_types reads some data, so the TS buffers
// are needed here.
@@ -2228,6 +2231,7 @@ static void hb_ts_stream_init(hb_stream_t *stream)
hb_stream_delete_ts_entry(stream, i);
}
}
+ return 0;
}
static void hb_ps_stream_init(hb_stream_t *stream)
@@ -3830,7 +3834,6 @@ static void hb_ps_stream_find_streams(hb_stream_t *stream)
}
hb_stream_seek( stream, 0.2 );
}
-done:
hb_buffer_close( &buf );
}
@@ -4259,7 +4262,7 @@ static void hb_ps_resolve_stream_types(hb_stream_t *stream)
}
-static void hb_ts_stream_find_pids(hb_stream_t *stream)
+static int hb_ts_stream_find_pids(hb_stream_t *stream)
{
// To be different from every other broadcaster in the world, New Zealand TV
// changes PMTs (and thus video & audio PIDs) when 'programs' change. Since
@@ -4288,8 +4291,8 @@ static void hb_ts_stream_find_pids(hb_stream_t *stream)
if ((pid == 0x0000) && (stream->ts_number_pat_entries == 0))
{
- decode_PAT(buf, stream);
- continue;
+ decode_PAT(buf, stream);
+ continue;
}
int pat_index = 0;
@@ -4314,16 +4317,21 @@ static void hb_ts_stream_find_pids(hb_stream_t *stream)
if (stream->pat_info[pat_index].program_number != 0 &&
pid == stream->pat_info[pat_index].program_map_PID)
{
- if (build_program_map(buf, stream) > 0)
- break;
+ if (build_program_map(buf, stream) > 0)
+ {
+ break;
+ }
}
}
// Keep going until we have a complete set of PIDs
if ( ts_index_of_video( stream ) >= 0 )
break;
}
+ if ( ts_index_of_video( stream ) < 0 )
+ return -1;
update_ts_streams( stream, stream->pmt_info.PCR_PID, 0, -1, P, NULL );
- }
+ return 0;
+}
// convert a PES PTS or DTS to an int64