comparison libmpdemux/demux_ts.c @ 20478:c8bc7d300bb3

in ts_parse() centralized stream_read()+stream_skip(); smaller and cleaner
author nicodvb
date Sat, 28 Oct 2006 17:42:25 +0000
parents e7474c33f072
children d8dc67f94d5e
comparison
equal deleted inserted replaced
20477:de4a66d99f41 20478:c8bc7d300bb3
2859 2859
2860 mp_msg(MSGT_DEMUX, MSGL_DBG2, "NOW PACKET_SIZE = %d, DP_OFFSET = %d\n", *buffer_size, *dp_offset); 2860 mp_msg(MSGT_DEMUX, MSGL_DBG2, "NOW PACKET_SIZE = %d, DP_OFFSET = %d\n", *buffer_size, *dp_offset);
2861 } 2861 }
2862 2862
2863 2863
2864 if(probe)
2865 {
2866 p = &packet[base];
2867 }
2868 else //feeding
2869 {
2870 if(*dp_offset + buf_size > *buffer_size)
2871 {
2872 *buffer_size = *dp_offset + buf_size + TS_FEC_PACKET_SIZE;
2873 resize_demux_packet(*dp, *buffer_size);
2874 }
2875 p = &((*dp)->buffer[*dp_offset]);
2876 }
2877
2878 buf_size = stream_read(stream, p, buf_size);
2879 if(buf_size==-1)
2880 {
2881 mp_msg(MSGT_DEMUX, MSGL_DBG2, "\r\nts_parse() couldn't read data\r\n");
2882 continue;
2883 }
2884 stream_skip(stream, junk);
2864 2885
2865 if(is_start) 2886 if(is_start)
2866 { 2887 {
2867 uint8_t *lang = NULL; 2888 uint8_t *lang = NULL;
2868 2889
2869 mp_msg(MSGT_DEMUX, MSGL_DBG2, "IS_START\n"); 2890 mp_msg(MSGT_DEMUX, MSGL_DBG2, "IS_START\n");
2870
2871 p = &packet[base];
2872 stream_read(stream, p, buf_size);
2873 stream_skip(stream, junk);
2874 2891
2875 len = pes_parse2(p, buf_size, es, pid_type, pmt, pid); 2892 len = pes_parse2(p, buf_size, es, pid_type, pmt, pid);
2876 if(! len) 2893 if(! len)
2877 { 2894 {
2878 tss->is_synced = 0; 2895 tss->is_synced = 0;
2910 mp_msg(MSGT_DEMUX, MSGL_DBG2, "ts_parse, NEW pid=%d, PSIZE: %u, type=%X, start=%p, len=%d\n", 2927 mp_msg(MSGT_DEMUX, MSGL_DBG2, "ts_parse, NEW pid=%d, PSIZE: %u, type=%X, start=%p, len=%d\n",
2911 es->pid, es->payload_size, es->type, es->start, es->size); 2928 es->pid, es->payload_size, es->type, es->start, es->size);
2912 2929
2913 demuxer->filepos = stream_tell(demuxer->stream) - es->size; 2930 demuxer->filepos = stream_tell(demuxer->stream) - es->size;
2914 2931
2915 if(*dp_offset + es->size > *buffer_size) 2932 memmove(p, es->start, es->size);
2916 {
2917 *buffer_size = *dp_offset + es->size + TS_FEC_PACKET_SIZE;
2918 resize_demux_packet(*dp, *buffer_size);
2919 //we'll skip at least one RESIZE() in the next iteration of ts_parse()
2920 mp_msg(MSGT_DEMUX, MSGL_DBG2, "RESIZE DP TO %d\n", *buffer_size);
2921 }
2922 memcpy(&((*dp)->buffer[*dp_offset]), es->start, es->size);
2923 *dp_offset += es->size; 2933 *dp_offset += es->size;
2924 (*dp)->flags = 0; 2934 (*dp)->flags = 0;
2925 (*dp)->pos = stream_tell(demuxer->stream); 2935 (*dp)->pos = stream_tell(demuxer->stream);
2926 (*dp)->pts = es->pts; 2936 (*dp)->pts = es->pts;
2927 2937
2960 { 2970 {
2961 sz = es->size = buf_size; 2971 sz = es->size = buf_size;
2962 } 2972 }
2963 else 2973 else
2964 { 2974 {
2965 stream_skip(stream, buf_size+junk);
2966 continue; 2975 continue;
2967 } 2976 }
2968 } 2977 }
2969 2978
2970 2979
2971 if(! probe) 2980 if(! probe)
2972 { 2981 {
2973 if(*dp_offset + sz > *buffer_size)
2974 {
2975 *buffer_size = *dp_offset + sz + TS_FEC_PACKET_SIZE;
2976 resize_demux_packet(*dp, *buffer_size);
2977 //we'll skip at least one RESIZE() in the next iteration of ts_parse()
2978 mp_msg(MSGT_DEMUX, MSGL_DBG2, "RESIZE DP TO %d\n", *buffer_size);
2979 }
2980
2981 stream_read(stream, &((*dp)->buffer[*dp_offset]), sz);
2982 *dp_offset += sz; 2982 *dp_offset += sz;
2983
2984 if(buf_size - sz > 0)
2985 {
2986 stream_skip(stream, buf_size - sz);
2987 }
2988 stream_skip(stream, junk);
2989 2983
2990 if(*dp_offset >= MAX_PACK_BYTES) 2984 if(*dp_offset >= MAX_PACK_BYTES)
2991 { 2985 {
2992 (*dp)->pts = tss->last_pts; 2986 (*dp)->pts = tss->last_pts;
2993 retv = fill_packet(demuxer, ds, dp, dp_offset, si); 2987 retv = fill_packet(demuxer, ds, dp, dp_offset, si);
2996 2990
2997 continue; 2991 continue;
2998 } 2992 }
2999 else 2993 else
3000 { 2994 {
3001 stream_read(stream, es->start, sz); 2995 memcpy(es->start, p, sz);
3002 if(buf_size - sz) stream_skip(stream, buf_size-sz);
3003 stream_skip(stream, junk);
3004 2996
3005 if(es->size) 2997 if(es->size)
3006 return es->size; 2998 return es->size;
3007 else 2999 else
3008 continue; 3000 continue;